{
    "version": "https://jsonfeed.org/version/1",
    "title": "Florian Eckerstorfer",
    "home_page_url": "https://florian.ec",
    "feed_url": "https://florian.ec/feed.json",
    "description": "Website and blog of Florian Eckerstorfer, a web developer living and working in Vienna, Europe. He likes long walks, music and books.",
    "icon": "https://florian.ec/image.png",
    "author": {
        "name": "Florian Eckerstorfer",
        "url": "https://florian.ec"
    },
    "items": [
        {
            "id": "/blog/php-background-processes/",
            "content_html": "<p>PHP can, by default, not create processes that continue to run in the background even after the parent process terminates. This article explain how you can trick PHP into doing it anyway. I also created a library to simplify the process and explain how it works in the end.</p>\n<p>I often have long running tasks, for example, generating a report or performing an analysis of large amounts of data, that run minutes or even hours. Today I encountered a situation where I needed to start such task from a button in a browser window. Since the task takes three to five hours it was impossible to invoke the task directly.</p>\n<p>My Internet research on this topic revelead a wide range of different solutions, from hacky to weird. The best I could find was the <a href=\"http://stackoverflow.com/a/45966/776654\">answer of Mark Biek to a question on Stack Overflow</a>.</p>\n<p>In PHP there are several functions to execute a command, for example, <code class=\"language-text\">exec</code> and <code class=\"language-text\">shell_exec</code>. However, there are several things to consider when a command should run in the background. But let's first take a look at the most simple example:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token function\">shell_exec</span><span class=\"token punctuation\">(</span><span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'%s > /dev/null 2>&#x26;amp;1 &#x26;amp;'</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$command</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>There three important things in this snippet:</p>\n<ul>\n<li>The output (<code class=\"language-text\">STDOUT</code>) of the script must be directed to a file. In this case <code class=\"language-text\">> /dev/null</code> indicates that I'm not interested in the output.</li>\n<li>The errors (<code class=\"language-text\">STDERR</code>) also must be directed to a file. <code class=\"language-text\">2>&#x26;1</code> means that <code class=\"language-text\">STDERR</code> is redirected into <code class=\"language-text\">STDOUT</code> and therefore into the nirvana.</li>\n<li>The final <code class=\"language-text\">&#x26;</code> tells the command to execute in the background.</li>\n</ul>\n<p>Of course it would also be possible to redirect <code class=\"language-text\">STDOUT</code> and <code class=\"language-text\">STDERR</code> to a file. In my situation this was not necessary since the command is part of an application with an internal log system.</p>\n<p>Since the command will run multiple hours I'm also interested in the current status, that is, is the process still running. We can check if a process is running by using <code class=\"language-text\">ps</code>, for example:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">ps</span> <span class=\"token punctuation\">\\</span><span class=\"token variable\">$PID</span></code></pre></div>\n<p>In order to be able to look this up, we need the PID of the process. In a shell the PID of the last process is stored in the variable <code class=\"language-text\">$!</code> and we can pass it to PHP by echoing it.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$pid</span> <span class=\"token operator\">=</span> <span class=\"token function\">shell_exec</span><span class=\"token punctuation\">(</span><span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'%s > /dev/null 2>&#x26;amp;1 &#x26;amp; echo $!'</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$command</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>It is now relatively easy to retrieve the status of the process. <em>The following code is taken directly from the already mentioned Stack Overflow question.</em></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">function</span> <span class=\"token function-definition function\">isRunning</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$pid</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$result</span> <span class=\"token operator\">=</span> <span class=\"token function\">shell_exec</span><span class=\"token punctuation\">(</span><span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'ps %d'</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$pid</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">count</span><span class=\"token punctuation\">(</span><span class=\"token function\">preg_split</span><span class=\"token punctuation\">(</span><span class=\"token string double-quoted-string\">\"/\\n/\"</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$result</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token constant boolean\">true</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> <span class=\"token variable\">$e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token constant boolean\">false</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>At this point I have everything I need and the only thing left to do is pack the code in a class with an easy-to-use interface:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">namespace</span> <span class=\"token package\">Bc<span class=\"token punctuation\">\\</span>BackgroundProcess</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">BackgroundProcess</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token variable\">$command</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token variable\">$pid</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">__construct</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$command</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">command</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$command</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">run</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$outputFile</span> <span class=\"token operator\">=</span> <span class=\"token string single-quoted-string\">'/dev/null'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">pid</span> <span class=\"token operator\">=</span> <span class=\"token function\">shell_exec</span><span class=\"token punctuation\">(</span><span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string single-quoted-string\">'%s > %s 2>&#x26;amp;1 &#x26;amp; echo $!'</span><span class=\"token punctuation\">,</span>\n            <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">command</span><span class=\"token punctuation\">,</span>\n            <span class=\"token variable\">$outputFile</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">isRunning</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token variable\">$result</span> <span class=\"token operator\">=</span> <span class=\"token function\">shell_exec</span><span class=\"token punctuation\">(</span><span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'ps %d'</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">pid</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">count</span><span class=\"token punctuation\">(</span><span class=\"token function\">preg_split</span><span class=\"token punctuation\">(</span><span class=\"token string double-quoted-string\">\"/\\n/\"</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$result</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">return</span> <span class=\"token constant boolean\">true</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> <span class=\"token variable\">$e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token constant boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">getPid</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">pid</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It's now relatively easy to execute a command in a background process:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">use</span> <span class=\"token package\">Bc<span class=\"token punctuation\">\\</span>BackgroundProcess<span class=\"token punctuation\">\\</span>BackgroundProcess</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token variable\">$process</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BackgroundProcess</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'sleep 5'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$process</span><span class=\"token operator\">-></span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">echo</span> <span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'Crunching numbers in process %d'</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$process</span><span class=\"token operator\">-></span><span class=\"token function\">getPid</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$process</span><span class=\"token operator\">-></span><span class=\"token function\">isRunning</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">echo</span> <span class=\"token string single-quoted-string\">'.'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">echo</span> <span class=\"token string double-quoted-string\">\"\\nDone.\\n\"</span></code></pre></div>\n<p>In this example the command <code class=\"language-text\">sleep 5</code> is executed in the background. As long as the process is running a dot is printed every second.</p>\n<p><em>Please note: If the parent process continues to run while the child process(es) run(s) in the background you should use a more robust solution, for example, the <a href=\"https://github.com/symfony/Process\">Symfony Process</a> component.</em></p>\n<p><strong>Update:</strong> I created a library using the code above. You can find it on Github: <a href=\"https://github.com/braincrafted/background-process\">BcBackgroundProcess</a>.</p>\n<p>It is also possible to install the package through composer:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token punctuation\">{</span> <span class=\"token key atrule\">'require'</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token key atrule\">'braincrafted/background-process'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'dev-master'</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span></code></pre></div>",
            "url": "/blog/php-background-processes/",
            "title": "Running background processes in PHP",
            "date_modified": "2013-03-27T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/php-asynchronous-message-queue/",
            "content_html": "<p>A fun exercise in programming. Implementing a asynchronous, non-blocking message queue in PHP.</p>\n<p>Unlike most other programming and scripting languages PHP does not support threads (there is a third-party library called <a href=\"http://docs.php.net/manual/en/book.pthreads.php\">pthreads</a>) and threads would be required to implement a truly asynchronous, non-blocking message queue. Challenge accepted.</p>\n<p>In this article I am going to explain how you can implement a message queue in PHP. I do this mostly for fun and pleasure, because in most production scenarios you probably want to use a real message queue like <a href=\"http://www.rabbitmq.com\">RabbitMQ</a>.</p>\n<p>The message queue typically consists of a server that accepts messages. These messages are sent by a producer and are received by a consumer.</p>\n<h3>The server</h3>\n<p>The server is a program that runs in the background and listens to a specific port. Whenever a message arrives at the given port it invokes a consumer with the given message.</p>\n<p>Running in the background, listening to a port, reacting when a message arrives. That sounds like a job for <a href=\"http://reactphp.org\">ReactPHP</a>. In our case we only need the socket server of React and fortunately there is a subtree split of <a href=\"https://github.com/reactphp/socket\">reacts socket component</a>.</p>\n<p>If you are using <a href=\"http://getcomposer.org\">Composer</a> (if not you really should) you can add <code class=\"language-text\">react/socket</code> to your project.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token comment\">// composer.json</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"require\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"react/socket\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"0.3.*\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>With React we can implement a simple server that listens to a socket and executes code whenever new data arrives at the socket.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// server.php</span>\n\n<span class=\"token keyword\">require_once</span> <span class=\"token constant\">__DIR__</span><span class=\"token operator\">.</span><span class=\"token string single-quoted-string\">'/vendor/autoload.php'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Create loop and socket</span>\n<span class=\"token variable\">$loop</span>   <span class=\"token operator\">=</span> <span class=\"token class-name class-name-fully-qualified static-context\">React<span class=\"token punctuation\">\\</span>EventLoop<span class=\"token punctuation\">\\</span>Factory</span><span class=\"token operator\">::</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$socket</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\">React<span class=\"token punctuation\">\\</span>Socket<span class=\"token punctuation\">\\</span>Server</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$loop</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// New connection is established</span>\n<span class=\"token variable\">$socket</span><span class=\"token operator\">-></span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'connection'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token class-name class-name-fully-qualified type-declaration\"><span class=\"token punctuation\">\\</span>React<span class=\"token punctuation\">\\</span>Socket<span class=\"token punctuation\">\\</span>ConnectionInterface</span> <span class=\"token variable\">$conn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// New data arrives at the socket</span>\n    <span class=\"token variable\">$conn</span><span class=\"token operator\">-></span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'data'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$data</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">use</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$conn</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// TODO: Handle message</span>\n        <span class=\"token keyword\">echo</span> <span class=\"token string double-quoted-string\">\"<span class=\"token interpolation\"><span class=\"token variable\">$data</span></span>\"</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// Close the connection when we consumed the message</span>\n        <span class=\"token variable\">$conn</span><span class=\"token operator\">-></span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// The socket should listen to port 4000</span>\n<span class=\"token variable\">$socket</span><span class=\"token operator\">-></span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">4000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$loop</span><span class=\"token operator\">-></span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In the above script I added a simple <code class=\"language-text\">echo</code> to output the received data. We could now run <code class=\"language-text\">php server.php</code>to start our server and send messages to it by connecting to it via <code class=\"language-text\">telnet localhost 4000</code>.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 60.3125%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACPUlEQVR4nK2S227aQBCG96qvEHPIDeaKu+YJqLhrIkwwYAyYUwJJcKEqiZSG0ppKlBR6y7vkgFopHN6gD+GXCH9n13WANiRqhaVP/8zszOx4tGw4HEjrsAaWZFln0hlhCayV88FgSDokHTzAxnczezye2ZOxowum9uj2h311NSJu7Zub7/b19cge300fcibTqT2ZjO0p6Ww2E7BGMwazEcNxLYZaw7FPTKJOvNlH/Z0TqwnfwalRUChoqJTewsiWEI/vQ1VVML9fmvu3Cf/f+Nb52w4+n3fu9/nnXq937vF4BGzn5Q4CARmyHPxngkGuslAXJssB/C+BQEA05OrClp1NwJbH3QRMkrbgID3CFmjRAu57pIXtni/UsVk2ayDHyS2xFEulUtC0FPRMBul0mtApnoNBZ9lsfpHLbYqx/rcLXPYv0LtskTr0vrZErPulhfaHDj63O+i+/4jW+Tk67VN8arfQ7bXQH1ws5TswRXkNJbaLqLIr1PH3ECMUZQ/RqAItqeMgfwA9rSGX0aDraZpcxUrtb5iuZ8SopWIZhkFaKonfUtUEksmkeP2FQgGNRh3VahWHhxUUi0WUy2WRZxh5UcO1XCqDJajA2ZMmGriaSCQE8XhcNDhtNmGaJmq1ExwfHSFPl/Nzd8cpXks244t2iznqku025NOYZg2VSkU05BfwixN/5HJ4w3v6rSeh4ntqvMqaXDGhrutPwp9Jhp4Nh/uuPgYLh8M/nyMSiTyb48Loe7VRQqHQi03yC7y6re/OPGZuAAAAAElFTkSuQmCC); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/php-asynchronous-message-queue/react-server-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/php-asynchronous-message-queue/react-server-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/php-asynchronous-message-queue/react-server-320.png, /blog/php-asynchronous-message-queue/react-server-640.png 2x, /blog/php-asynchronous-message-queue/react-server-960.png 3x\" src=\"/blog/php-asynchronous-message-queue/react-server-320.png\" alt=\"React server that echoes messages\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Let's assume that our message queue receives messages and needs to perform some time-consuming task with them. We will simulate this with the following code.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">function</span> <span class=\"token function-definition function\">consume</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$data</span><span class=\"token punctuation\">,</span> <span class=\"token class-name class-name-fully-qualified type-declaration\"><span class=\"token punctuation\">\\</span>React<span class=\"token punctuation\">\\</span>Socket<span class=\"token punctuation\">\\</span>ConnectionInterface</span> <span class=\"token variable\">$conn</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$i</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token variable\">$i</span> <span class=\"token operator\">&#x3C;</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span> <span class=\"token variable\">$i</span><span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">echo</span> <span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string double-quoted-string\">\"%s: Do something with %s\\n\"</span><span class=\"token punctuation\">,</span> <span class=\"token function\">date</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'H:i:s'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$data</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>When we run two <code class=\"language-text\">telnet</code> simultaneously we will receive the following output:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">19:18:07: Do something with foo\n19:18:08: Do something with foo\n19:18:09: Do something with foo\n19:18:10: Do something with foo\n19:18:11: Do something with foo\n19:18:12: Do something with bar\n19:18:13: Do something with bar\n19:18:14: Do something with bar\n19:18:15: Do something with bar\n19:18:16: Do something with bar</code></pre></div>\n<p>Client 1 has an open connection to the server for five seconds and client 2 has an open connection to the server for ten seconds. We want that the clients transfer a message to the server and immediately close the connection while the server accepts new messages and works on those tasks in the background.</p>\n<p>Now is a good time to remember the last posting I wrote here: <a href=\"http://braincrafted.com/php-background-processes/\">Running background processes in PHP</a>.</p>\n<p>We can use <a href=\"https://github.com/braincrafted/background-process\">BcBackgroundProcess</a> to create a background process and consume the message there.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// composer.json\n{\n    \"require\": {\n        \"react/socket\":                     \"0.3.*\",\n        \"braincrafted/background-process\":  \"dev-master\"\n    }\n}</code></pre></div>\n<p>When using the factory provided by BcBackgroundProcess it is quite easy to create a new process and execute it in the background.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// server.php\n...\n$processFactory = new \\Bc\\BackgroundProcess\\Factory('\\Bc\\BackgroundProcess\\BackgroundProcess');\n\n$socket->on('connection', function (\\React\\Socket\\ConnectionInterface $conn) use ($processFactory) {\n    $conn->on('data', function ($data) use ($conn, $processFactory) {\n        $command = sprintf('php consumer.php \"%s\"', addslashes($data));\n        $processFactory->newProcess($command)->run();\n\n        $conn->close();\n    });\n});\n...</code></pre></div>\n<p>The command executed in the above code is <code class=\"language-text\">php consumer.php</code> with the message as first (and only) argument.</p>\n<h3>The consumer</h3>\n<p>The consumer is another script which is executed by the server as background process. Its first and only argument is the message. The biggest disadvantage of executing the code in a background process (compared to what we could do if PHP would support threads) is that we can no longer communicate with the server and thus can't output anything there. Instead we will write log messages to a file.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// consumer.php\n\nfunction consume($message, $filename)\n{\n    for ($i = 0; $i &#x3C; 5; $i++) {\n        $data = sprintf(\"%s: Do something with %s\\n\", date('H:i:s'), $message);\n        file_put_contents($filename, $data, FILE_APPEND);\n        sleep(1);\n    }\n}\n\n$message = stripslashes($_SERVER['argv'][1]);\nconsume($message, \"message.log\");</code></pre></div>\n<p>Ok, let's try this out. In my experiment I will open four Terminal windows in parallel. The first one will run the server, the second one will watch the <code class=\"language-text\">message.log</code> log (with <code class=\"language-text\">tail -f</code>) and the third and forth will be used to write to the message server.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 60.3125%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADc0lEQVR4nK2S3U/bVhjGfbV/gUxqVkhR1bEUdURa12pr0lI6RBzHThw7sTH+wEn4DKTQ8ZHQbGMjYLZJk3LPfW/R2rW7aeiGoNf8Efkn7GdvHBpALdpNI/30nHPyPs/xOedlGg0n0Gg0TnEuUKvVAo7jBBzShtNZe/asEdjbc7q0fXvnvMzh4dvW0dGxz/HR2w7HHT1ovmm9/OtV6/mLl639P1+09veft179/brVbP5DHLaarwmqaTYPWgcH//owv/+xgt1fq9jdrWHbWSdWUd9eQ32HdGcNm1vLWC5NYVYSoMqjmNSisMwEFp9wWF5jsVDOolzWMFsSMFPiwUjZuCemRU8Ssx7Pc14ymejCcazHC7w3MvKt992jW94IwQt3PY7/yvsmFvJuRYLejes3vM+vh71g8FPvypWAx6RFCaIo+mQymQ+S5Hgk+TQejYyC41LISio4VkB8jEM4HMbVq5/h2rV+HyaTaQd1EN8hnoPmSY6jIBYP7keRSLCQ/DUWLDtGgV+gr6+PwkI+zAXzJXQCOTx8OEwhLGRa4yg4Ho/7gb29vQiFQj7MZcc8TzssnU5hbGwUqVQa2rgKkeaCwGNwcNAP6u/v92ESiQT+D45L4O6dO7h5M4xIJIKvb99GZGgIQ0NfIhgMoqenB4FAwIepVJ6iWt045ekZtN7+b+X7NSwsLEKSs3R8yac9zmZVZGUVqqpBHdcwTjpOymw7T7BFfbdVr5Cu4pc6sXWmP/68hFqVerJSQW1jBZs/LGHzp3XUqV+d31axvVMlNqhn1/2+ZabncrAsHaZu0p0kwPPsGUKHXC6NmWkFti2hUCCmJMwvKJiazcE0DBgTRtfDaJoOSZL9yxfF90nTI+iGicePl5C3ixQ8CztfgKFbdESdfNIFL8PzPL3Y5S2TSqVgmibm5+dQLBaQz9uYtEz66ix9UfK9eqa9q6qqSFEbXBZomRZmZ+agaRMo5IuwjEkKpnC7AEVRqEY4CyyVJdcuyK5tK65hpVzdFFzdIEy+M7Z4d1JX3KWi6dqW7M5Py26xkHPnFmW3VM6Qr+PVLcE1qJ6Z0CVM0M7tO2nvlsvloBC+Kh01LY0eRIFhynSfMs3bkM/36vQoVreWiUYfnERjUeLeSSwW+yDDw8Mnft077p1C41jbG412axn63f+oDAwMfPIx+Q/sQ/A7SipNHAAAAABJRU5ErkJggg==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/php-asynchronous-message-queue/mq-server-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/php-asynchronous-message-queue/mq-server-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/php-asynchronous-message-queue/mq-server-320.png, /blog/php-asynchronous-message-queue/mq-server-640.png 2x, /blog/php-asynchronous-message-queue/mq-server-960.png 3x\" src=\"/blog/php-asynchronous-message-queue/mq-server-320.png\" alt=\"Screenshot of a Terminal window running server.php, reading the log file and running two clients\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>You can see that both messages are consumed in parallel and that the client is started and closes within a second.</p>\n<h3>The producer</h3>\n<p>In reality you will probably never send messages to a MQ server using the <code class=\"language-text\">telnet</code> command line utility, but rather send messages from another script.</p>\n<p>When you are using PHP it is extremely simple to write a message to a socket.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">// produce.php\n\nfunction produce($message)\n{\n    $fp = @stream_socket_client('tcp://localhost:4000', $errno, $errstr, 30);\n    if ($fp) {\n        fwrite($fp, $message);\n        fclose($fp);\n    }\n}\n\nproduce(\"Hello World!\");</code></pre></div>\n<h3>Use Cases</h3>\n<p>As mentioned above this code is not really useful in a production environment. However, I use such a message queue to send real time notifications from a task that runs once a week for a few hours. The task is used only internal and not critical and therefore it would be a huge overkill to install and maintain a real message queue.</p>\n<h3>BcMq</h3>\n<p>I created a library from the code described in this article. The principles are the same, but it has a nicer architecture and is tested. You can find it on Github: <a href=\"https://github.com/braincrafted/mq\">BcMq</a>.</p>\n<h3>BcMqBundle</h3>\n<p>If you want to use the code in a Symfony2 application I made things even easier by creating a bundle that encapsulates BcMq. The bundle uses services to consume messages which makes it quite easy and elegant. Detailed instructions on how to install and use the bundle can be found on Github: <a href=\"https://github.com/braincrafted/mq-bundle\">BcMqBundle</a>.</p>",
            "url": "/blog/php-asynchronous-message-queue/",
            "title": "Implementing an asynchronous message queue in PHP with React",
            "date_modified": "2013-05-01T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/symfony2-gaufrette-s3/",
            "content_html": "<p>Gaufrette, a PHP library, abstracts reading and writing files and allows us to write code independent of the underlying filesystem. In this article we want to store photos on Amazon S3 in a way that we can change the filesystem without changing our code.</p>\n<p>Often it can be a little bit tricky to upload files to a web server and things become even more complicated when you want to store the uploaded files on Amazon S3. In this article I am going to explain how you can use Gaufrette to upload photos to S3 from a Symfony2 application.</p>\n<p>I will use three different libraries in this article: <a href=\"https://github.com/knplabs/Gaufrette\">Gaufrette</a>, <a href=\"https://github.com/KnpLabs/KnpGaufretteBundle\">KnpGaufretteBundle</a> and <a href=\"https://github.com/aws/aws-sdk-php\">AWS SDK for PHP</a>. Gaufrette is an abstraction layer for filesystems. That is, it offers a transparent interface to various types of filesystems, like a local filesystem, FTP, Dropbox, S3 and many others. The library is integrated into Symfony2 by KnpGaufretteBundle which makes it easy to setup and configure Gaufrette. Gaufrette requires the AWS SDK for communication with the S3 service.</p>\n<hr>\n<p><strong>Heads up:</strong> I have written this tutorial in 2013, since then some of the libraries had major updates, including <a href=\"https://github.com/aws/aws-sdk-php\">AWS SDK</a>.</p>\n<hr>\n<h3>Installation</h3>\n<p>Installation is easy if you use <a href=\"http://getcomposer.org\">Composer</a>, we have to add <code class=\"language-text\">knplabs/gaufrette</code>, <code class=\"language-text\">knplabs/knp-gaufrette-bundle</code> and <code class=\"language-text\">amazonwebservices/aws-sdk-for-php</code> to <code class=\"language-text\">composer.json</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"require\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"knplabs/gaufrette\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dev-master\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"knplabs/knp-gaufrette-bundle\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dev-master\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"amazonwebservices/aws-sdk-for-php\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dev-master\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Using Composer's command line utitility we download the dependencies:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">$ <span class=\"token function\">composer</span> update</code></pre></div>\n<p>As a last step we need to add KnpGaufretteBundle to our applications <code class=\"language-text\">app/AppKernel.php</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">new</span> <span class=\"token function\">Knp<span class=\"token punctuation\">\\</span>Bundle<span class=\"token punctuation\">\\</span>GaufretteBundle<span class=\"token punctuation\">\\</span>KnpGaufretteBundle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>Setup Amazon S3</h3>\n<p>Before we can upload files to S3 we first have to setup S3 accordingly. This is possible in the <a href=\"https://console.aws.amazon.com\">AWS Management Console</a>. We want to store all files uploaded from our application in a bucket we first have to create a new bucket for our application. After creating a new bucket we select the <code class=\"language-text\">Properties</code> tab in the top right. Since our files should be accessible for everyone we add a <em>Bucket Policy</em>. We select <em>Permissions</em> in the right view and click <em>Add bucket policy</em>. The following policy allows everyone to view the files in the bucket. You need to change the name of your bucket (I called mine <code class=\"language-text\">braincrafted.com</code>).</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"Version\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2008-10-17\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"Statement\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"Sid\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"AddPerm\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Effect\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Allow\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Principal\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"AWS\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"*\"</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Action\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"s3:GetObject\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Resource\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"arn:aws:s3:::braincrafted.com/*\"</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We also need to activate <em>Static Website Hosting</em>. To activate this we select <em>Enable website hosting</em> and enter the name of an index and an error document. The documents don't have to exist, but the fields are required.</p>\n<p>You can test if your bucket works by using the AWS Console to upload an file to your bucket. The public URL of your bucket can also be found in the <em>Static Website Hosting</em> section of the <em>Properties</em> tab. It should look like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">http://BUCKET_NAME.s3-website-us-east-1.amazonaws.com</code></pre></div>\n<p>If you have created your bucket in a different region the URL will be slightly different.</p>\n<p>When you click your name in the very top you will find a link to <em>Security Credentials</em>. On this page you find your <em>Access Keys</em> and you will need those in a second.</p>\n<h3>Configure Gaufrette</h3>\n<p>We can now start by configuring Gaufrette. First we need to setup an adapter to communicate with S3 and then we need to setup a filesystem that uses the adapter performs actions on the filesystem.</p>\n<p>Because Gaufrette has two levels we could use, for example, different adapters for different environments. If you have functional tests you probably don't want to upload files to S3 in those but rather use the local filesystem.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config.yml</span>\n\n<span class=\"token key atrule\">knp_gaufrette</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">adapters</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">photo_storage</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">amazon_s3</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">amazon_s3_id</span><span class=\"token punctuation\">:</span> acme_storage.amazon_s3\n        <span class=\"token key atrule\">bucket_name</span><span class=\"token punctuation\">:</span> %amazon_s3_bucket_name%\n        <span class=\"token key atrule\">create</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">false</span>\n        <span class=\"token key atrule\">options</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">create</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n  <span class=\"token key atrule\">filesystems</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">photo_storage</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">adapter</span><span class=\"token punctuation\">:</span> photo_storage\n      <span class=\"token key atrule\">alias</span><span class=\"token punctuation\">:</span> photo_storage_filesystem</code></pre></div>\n<p>The previous code creates one adapter <code class=\"language-text\">photo_storage</code> of the type <code class=\"language-text\">amazon_s3</code> and a filesystem <code class=\"language-text\">photo_storage</code> that uses the <code class=\"language-text\">photo_storage</code> adapter. Before we continue lets look at the <code class=\"language-text\">amazon_s3_id</code> option. This option has to refer to a service of class <code class=\"language-text\">AmazonS3</code>.</p>\n<p>We also need to define the bucket name and I like to define such options in my applications <code class=\"language-text\">parameters.yml</code>.</p>\n<h3>Configure AWS</h3>\n<p>I created a bundle for the code concerned with uploading and storing file and called it <code class=\"language-text\">AcmeStorageBundle</code>. Inside this bundle we need to create a new service for the <code class=\"language-text\">AmazonS3</code> class.</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"># src/Acme/StorageBundle/Resources/config/services.xml\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>parameters</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>parameter</span> <span class=\"token attr-name\">key</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>acme_storage.amazon_s3.class<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>AmazonS3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>parameter</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>parameters</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>services</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>service</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>acme_storage.amazon_s3<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>%acme_storage.amazon_s3.class%<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>argument</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>collection<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>argument</span> <span class=\"token attr-name\">key</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>key<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>%acme_storage.amazon_s3.aws_key%<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>argument</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>argument</span> <span class=\"token attr-name\">key</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>secret<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>%acme_storage.amazon_s3.aws_secret_key%<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>argument</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>argument</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>service</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>services</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>There are two parameters defined, one for the key and one for the secret key, so we quickly have to define a configuration for AcmeStorageBundle. We also add an option to configure the base URL of the bucket.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/StorageBundle/DependencyInjection/Configuration.php</span>\n\n<span class=\"token comment\">// ...</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">getConfigTreeBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n    <span class=\"token variable\">$rootNode</span>\n        <span class=\"token operator\">-></span><span class=\"token function\">children</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token operator\">-></span><span class=\"token function\">arrayNode</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">)</span>\n                <span class=\"token operator\">-></span><span class=\"token function\">children</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token operator\">-></span><span class=\"token function\">scalarNode</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'aws_key'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token operator\">-></span><span class=\"token function\">scalarNode</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'aws_secret_key'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token operator\">-></span><span class=\"token function\">scalarNode</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'base_url'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                <span class=\"token operator\">-></span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token operator\">-></span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token operator\">-></span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token variable\">$treeBuilder</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ...</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/StorageBundle/DependencyInjection/AcmeStorageExtension.php</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">load</span><span class=\"token punctuation\">(</span><span class=\"token keyword type-hint\">array</span> <span class=\"token variable\">$configs</span><span class=\"token punctuation\">,</span> <span class=\"token class-name type-declaration\">ContainerBuilder</span> <span class=\"token variable\">$container</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">isset</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$config</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'aws_key'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\"><span class=\"token punctuation\">\\</span>InvalidArgumentException</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string single-quoted-string\">'The option \"acme_storage.amazon_s3.aws_key\" must be set.'</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token variable\">$container</span><span class=\"token operator\">-></span><span class=\"token function\">setParameter</span><span class=\"token punctuation\">(</span>\n        <span class=\"token string single-quoted-string\">'acme_storage.amazon_s3.aws_key'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$config</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'aws_key'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">isset</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$config</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'aws_secret_key'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\"><span class=\"token punctuation\">\\</span>InvalidArgumentException</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string single-quoted-string\">'The option \"acme_storage.amazon_s3.aws_secret_key\" must be set.'</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token variable\">$container</span><span class=\"token operator\">-></span><span class=\"token function\">setParameter</span><span class=\"token punctuation\">(</span>\n        <span class=\"token string single-quoted-string\">'acme_storage.amazon_s3.aws_secret_key'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$config</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'aws_secret_key'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">isset</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$config</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'base_url'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\"><span class=\"token punctuation\">\\</span>InvalidArgumentException</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string single-quoted-string\">'The option \"acme_storage.amazon_s3.base_url\" must be set.'</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token variable\">$container</span><span class=\"token operator\">-></span><span class=\"token function\">setParameter</span><span class=\"token punctuation\">(</span>\n        <span class=\"token string single-quoted-string\">'acme_storage.amazon_s3.base_url'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$config</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'amazon_s3'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'base_url'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ...</span></code></pre></div>\n<p>We can now configure these options in our applications configuration.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config.yml</span>\n\n<span class=\"token key atrule\">acme_storage</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">amazon_s3</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">aws_key</span><span class=\"token punctuation\">:</span> %amazon_aws_key%\n    <span class=\"token key atrule\">aws_secret_key</span><span class=\"token punctuation\">:</span> %amazon_aws_secret_key%\n    <span class=\"token key atrule\">base_url</span><span class=\"token punctuation\">:</span> %amazon_s3_base_url%</code></pre></div>\n<p>We should keep our AWS credentials secret and therefore define them in <code class=\"language-text\">parameters.yml</code> (which should not be committed to a VCS server).</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/parameters.yml</span>\n\n<span class=\"token key atrule\">parameters</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">amazon_aws_key</span><span class=\"token punctuation\">:</span> <span class=\"token null important\">~</span>\n  <span class=\"token key atrule\">amazon_aws_secret_key</span><span class=\"token punctuation\">:</span> <span class=\"token null important\">~</span>\n  <span class=\"token key atrule\">amazon_s3_base_url</span><span class=\"token punctuation\">:</span> <span class=\"token null important\">~</span>\n  <span class=\"token key atrule\">amazon_s3_bucket_name</span><span class=\"token punctuation\">:</span> <span class=\"token null important\">~</span></code></pre></div>\n<p>In the <code class=\"language-text\">parameters.yml</code> file I also defined <code class=\"language-text\">amazon_s3_bucket_name</code>, which is used in the Gaufrette configuration to set the bucket name.</p>\n<h3>Implementing an uploader</h3>\n<p>Now we have everything configured and we can start writing code. Let's create a class <code class=\"language-text\">PhotoUploader</code> in <code class=\"language-text\">AcmeStorageBundle</code> to keep our controllers free of the details on how to upload files.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/StorageBundle/Upload/PhotoUploader.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>Bundle<span class=\"token punctuation\">\\</span>StorageBundle<span class=\"token punctuation\">\\</span>Upload</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>HttpFoundation<span class=\"token punctuation\">\\</span>File<span class=\"token punctuation\">\\</span>UploadedFile</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Gaufrette<span class=\"token punctuation\">\\</span>Filesystem</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">PhotoUploader</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token variable\">$allowedMimeTypes</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span>\n        <span class=\"token string single-quoted-string\">'image/jpeg'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string single-quoted-string\">'image/png'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string single-quoted-string\">'image/gif'</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token variable\">$filesystem</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">__construct</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">Filesystem</span> <span class=\"token variable\">$filesystem</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">filesystem</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$filesystem</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">upload</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">UploadedFile</span> <span class=\"token variable\">$file</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Check if the file's mime type is in the list of allowed mime types.</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">in_array</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$file</span><span class=\"token operator\">-></span><span class=\"token function\">getClientMimeType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword static-context\">self</span><span class=\"token operator\">::</span><span class=\"token variable\">$allowedMimeTypes</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\"><span class=\"token punctuation\">\\</span>InvalidArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'Files of type %s are not allowed.'</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$file</span><span class=\"token operator\">-></span><span class=\"token function\">getClientMimeType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// Generate a unique filename based on the date and add file extension of the uploaded file</span>\n        <span class=\"token variable\">$filename</span> <span class=\"token operator\">=</span> <span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'%s/%s/%s/%s.%s'</span><span class=\"token punctuation\">,</span> <span class=\"token function\">date</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'Y'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">date</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'m'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">date</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'d'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">uniqid</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$file</span><span class=\"token operator\">-></span><span class=\"token function\">getClientOriginalExtension</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token variable\">$adapter</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">filesystem</span><span class=\"token operator\">-></span><span class=\"token function\">getAdapter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token variable\">$adapter</span><span class=\"token operator\">-></span><span class=\"token function\">setMetadata</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$filename</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'contentType'</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$file</span><span class=\"token operator\">-></span><span class=\"token function\">getClientMimeType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token variable\">$adapter</span><span class=\"token operator\">-></span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$filename</span><span class=\"token punctuation\">,</span> <span class=\"token function\">file_get_contents</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$file</span><span class=\"token operator\">-></span><span class=\"token function\">getPathname</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$filename</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The only thing that is a little bit tricky and took me a while to figure out is setting the content type. When we don't set the correct content type manually S3 will assume <code class=\"language-text\">application/octet-stream</code> and therefore will offer the file as download to the user. If we want to host files that a user can view in a browser (like images) we need to set the correct mime type. Sadly this is not possible on the <code class=\"language-text\">Filesystem</code> object. However, if you only upload files that should be downloaded you can directly work on the <code class=\"language-text\">Filesystem</code> object:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">filesystem</span><span class=\"token operator\">-></span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$filename</span><span class=\"token punctuation\">,</span> <span class=\"token function\">file_get_contents</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$file</span><span class=\"token operator\">-></span><span class=\"token function\">getPathname</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>We create a service for <code class=\"language-text\">PhotoUploader</code> to access the class in our controllers.</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>parameters</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>parameter</span> <span class=\"token attr-name\">key</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>acme_storage.photo_uploader.class<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Acme\\StorageBundle\\Upload\\PhotoUploader<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>parameter</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>parameters</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>services</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>service</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>acme_storage.photo_uploader<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>%acme_storage.photo_uploader.class%<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>argument</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>service<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>photo_storage_filesystem<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>service</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>services</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h3>Setting up the controller and the form</h3>\n<p>We create an upload form and connect the form with our <code class=\"language-text\">PhotoUploader</code> class in the controller. In this example we will only create one form field for the uploaded file but it is easily possible to add other fiels (for example, a description).</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/PhotoBundle/Form/Type/PhotoType.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>PhotoBundle<span class=\"token punctuation\">\\</span>Form<span class=\"token punctuation\">\\</span>Type</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>Form<span class=\"token punctuation\">\\</span>AbstractType</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>Form<span class=\"token punctuation\">\\</span>FormBuilderInterface</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">PhotoType</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AbstractType</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">buildForm</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">FormBuilderInterface</span> <span class=\"token variable\">$builder</span><span class=\"token punctuation\">,</span> <span class=\"token keyword type-hint\">array</span> <span class=\"token variable\">$options</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$builder</span><span class=\"token operator\">-></span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'photo'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'file'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string single-quoted-string\">'label'</span> <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'Photo'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string single-quoted-string\">'photo'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The only thing special in the controller code is the code to call <code class=\"language-text\">PhotoUploader::upload()</code>. It expects an <code class=\"language-text\">UploadedFile</code> object which is automically returned by the form.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/PhotoBundle/Controller/PhotoController.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>PhotoBundle<span class=\"token punctuation\">\\</span>Controller</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Bundle<span class=\"token punctuation\">\\</span>FrameworkBundle<span class=\"token punctuation\">\\</span>Controller<span class=\"token punctuation\">\\</span>Controller</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>HttpFoundation<span class=\"token punctuation\">\\</span>Request</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>PhotoBundle<span class=\"token punctuation\">\\</span>Form<span class=\"token punctuation\">\\</span>Type<span class=\"token punctuation\">\\</span>PhotoType</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">PhotoController</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Controller</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">addAction</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">Request</span> <span class=\"token variable\">$request</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$form</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">createForm</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">PhotoType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$request</span><span class=\"token operator\">-></span><span class=\"token function\">isMethod</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'POST'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token variable\">$form</span><span class=\"token operator\">-></span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$request</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$form</span><span class=\"token operator\">-></span><span class=\"token function\">isValid</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token variable\">$data</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$form</span><span class=\"token operator\">-></span><span class=\"token function\">getData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token variable\">$url</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">getPhotoUploader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">upload</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$data</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'photo'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// display a response or redirect</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string single-quoted-string\">'AcmePhotoBundle:Photo:add.html.twig'</span><span class=\"token punctuation\">,</span>\n            <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'form'</span>  <span class=\"token operator\">=></span> <span class=\"token variable\">$form</span><span class=\"token operator\">-></span><span class=\"token function\">createView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">/**\n     * @return Acme\\StorageBundle\\Uploader\\PhotoUploader\n     */</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">getPhotoUploader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'acme_storage.photo_uploader'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>If we now want to get the full URL to the uploaded file we can use the parameter we defined earlier in the configuration of <code class=\"language-text\">AcmeStorageBundle</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$url</span> <span class=\"token operator\">=</span> <span class=\"token function\">sprintf</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string single-quoted-string\">'%s/%s'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">container</span><span class=\"token operator\">-></span><span class=\"token function\">getParameter</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'acme_storage.amazon_s3.base_url'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">getPhotoUploader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">upload</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$data</span><span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'photo'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The only thing left to do is create a route for the action and probably add some logic to store the URL returned by the <code class=\"language-text\">upload()</code> method in a database. However, that is not really the topic of this article and is explained elsewhere.</p>",
            "url": "/blog/symfony2-gaufrette-s3/",
            "title": "Upload files to Amazon S3 with Symfony2 and Gaufrette",
            "date_modified": "2013-05-29T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/symfony2-functional-test-translation-key/",
            "content_html": "<p>One of the best practices in testing code is to use a less information that is context to change in the test code. When writing functional tests we often have to check for the existance of certain strings on a page. However, text and translations change, so let's use the translation keys in our tests instead.</p>\n<p>Whenever writing functional tests I think it is a good idea to use translation keys in the assertions instead of the real text. The translation keys are less likely to change over time and it is often much simpler, because they don't contain dynamic content.</p>\n<p>However, Symfony 2 automatically translates all text even in the test environment and I could not find an easy solution on how to deactivate translation in the test environment.</p>\n<p>The simplest way to disable translation in functional tests is to create a new translator that returns the message ID instead of the translated message.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/DemoBundle/Translator/NoTranslator.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>DemoBundle<span class=\"token punctuation\">\\</span>Translator</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>Translation<span class=\"token punctuation\">\\</span>TranslatorInterface</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">NoTranslator</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">TranslatorInterface</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">trans</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$id</span><span class=\"token punctuation\">,</span> <span class=\"token keyword type-hint\">array</span> <span class=\"token variable\">$parameters</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$domain</span> <span class=\"token operator\">=</span> <span class=\"token constant\">null</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$locale</span> <span class=\"token operator\">=</span> <span class=\"token constant\">null</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$id</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">transChoice</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$id</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$number</span><span class=\"token punctuation\">,</span> <span class=\"token keyword type-hint\">array</span> <span class=\"token variable\">$parameters</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$domain</span> <span class=\"token operator\">=</span> <span class=\"token constant\">null</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$locale</span> <span class=\"token operator\">=</span> <span class=\"token constant\">null</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$id</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">setLocale</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$locale</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">getLocale</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string single-quoted-string\">'--'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">setFallbackLocale</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$locale</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">addResource</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$resource</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now we need a way to switch the default translator to our <code class=\"language-text\">NoTranslator</code>. The easiest way to do this is override the <code class=\"language-text\">translator.class</code> variable, however, this changes the translation for all environments and I want to change the translator only in the test environment.</p>\n<p>Another way to override a service is to write a compiler pass.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/DemoBundle/DependencyInjection/Compiler/TranslatorCompilerPass.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>DemoBundle<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>Compiler</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>Compiler<span class=\"token punctuation\">\\</span>CompilerPassInterface</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>ContainerBuilder</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>HttpKernel<span class=\"token punctuation\">\\</span>KernelInterface</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">TranslatorCompilerPass</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CompilerPassInterface</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">ContainerBuilder</span> <span class=\"token variable\">$container</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$definition</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$container</span><span class=\"token operator\">-></span><span class=\"token function\">getDefinition</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'translator.default'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token variable\">$definition</span><span class=\"token operator\">-></span><span class=\"token function\">setClass</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'Acme\\DemoBundle\\Translator\\NoTranslator'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This would, again, override the translator in all environments. We need an instance of <code class=\"language-text\">AppKernel</code> to check the environment. At this stage of the boot process of the Symfony 2 kernel we don't have access to the kernel via the dependency injection container. The only place where we have access to the kernel at that early stage is the <code class=\"language-text\">AppKernel</code> itself and therefore we need to pass it through to our compiler from there.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># app/AppKernel.php</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">AppKernel</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Kernel</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">registerBundles</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// ...</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">in_array</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">getEnvironment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'dev'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'test'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token variable\">$bundles</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\">Acme<span class=\"token punctuation\">\\</span>DemoBundle<span class=\"token punctuation\">\\</span>AcmeDemoBundle</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token comment\">// ...</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// ...</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This is absolutely ok to do. You would have to add your bundle anyways in the <code class=\"language-text\">AppKernel.php</code> and this is also done by one of the default bundles (<code class=\"language-text\">JMSDiExtraBundle</code>). Now we passed the kernel to <code class=\"language-text\">AcmeDemoBundle</code>. There we need to initialise the compiler pass with the kernel.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/DemoBundle/AcmeDemoBundle.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>DemoBundle</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>ContainerBuilder</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>HttpKernel<span class=\"token punctuation\">\\</span>Bundle<span class=\"token punctuation\">\\</span>Bundle</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>HttpKernel<span class=\"token punctuation\">\\</span>KernelInterface</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>DemoBundle<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>Compiler<span class=\"token punctuation\">\\</span>TranslatorCompilerPass</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">AcmeDemoBundle</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Bundle</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token variable\">$kernel</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">__construct</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">KernelInterface</span> <span class=\"token variable\">$kernel</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">kernel</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$kernel</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">build</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">ContainerBuilder</span> <span class=\"token variable\">$container</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword static-context\">parent</span><span class=\"token operator\">::</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$container</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token variable\">$container</span><span class=\"token operator\">-></span><span class=\"token function\">addCompilerPass</span><span class=\"token punctuation\">(</span>\n            <span class=\"token keyword\">new</span> <span class=\"token class-name\">TranslatorCompilerPass</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">kernel</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The last thing we have to do is to adapt <code class=\"language-text\">TranslatorCompilerPass</code> to accept the kernel and check the environment.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\"># src/Acme/DemoBundle/DependencyInjection/Compiler/TranslatorCompilerPass.php</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Acme<span class=\"token punctuation\">\\</span>TestingBundle<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>Compiler</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>Compiler<span class=\"token punctuation\">\\</span>CompilerPassInterface</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>DependencyInjection<span class=\"token punctuation\">\\</span>ContainerBuilder</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>HttpKernel<span class=\"token punctuation\">\\</span>KernelInterface</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">TranslatorCompilerPass</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CompilerPassInterface</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token variable\">$kernel</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">__construct</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">KernelInterface</span> <span class=\"token variable\">$kernel</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">kernel</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$kernel</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name type-declaration\">ContainerBuilder</span> <span class=\"token variable\">$container</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'test'</span> <span class=\"token operator\">===</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">kernel</span><span class=\"token operator\">-></span><span class=\"token function\">getEnvironment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token variable\">$definition</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$container</span><span class=\"token operator\">-></span><span class=\"token function\">getDefinition</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'translator.default'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token variable\">$definition</span><span class=\"token operator\">-></span><span class=\"token function\">setClass</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'Acme\\DemoBundle\\Translator\\NoTranslator'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Done. We can now write our assertions in functional tests for translation keys instead of translated messages.</p>\n<p>I added the code required to disable translation to my <a href=\"https://github.com/braincrafted/testing-bundle\">BraincraftedTestingBundle</a>, but I wanted to explain what I did. If there is a more convenient solution please let me know.</p>\n<p><em>Update March 19, 2014:</em> Reader Gilles Doge emailed me to add that you can override the <code class=\"language-text\">translator.class</code> variable only in the <code class=\"language-text\">test</code> environment:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config_test.yml</span>\n<span class=\"token key atrule\">parameters</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">translator.class</span><span class=\"token punctuation\">:</span> Acme\\DemoBundle\\Translation\\Translator\\NoTranslator</code></pre></div>\n<p>In this case you don't need to create an additional compiler pass. However, my solution has the advantage that you can place it in my TestingBundle and have this functionality automatically in all my projects.</p>\n<p>Symfony2 Cookbook: How to Override any Part of a Bundle - <a href=\"http://symfony.com/doc/2.2/cookbook/bundles/override.html#services-configuration\">Services &#x26; Configuration</a>\nSymfony2 Cookbook: <a href=\"http://symfony.com/doc/2.2/cookbook/service_container/compiler_passes.html\">How to work with Compiler Passes in Bundles</a></p>",
            "url": "/blog/symfony2-functional-test-translation-key/",
            "title": "Use translation keys in Symfony2 functional tests",
            "date_modified": "2013-06-02T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/rebuild-jekyll-compass/",
            "content_html": "<p>Guard is a ruby tool to execute commands when file changes and can be used to rebuild a Jekyll site whenever its content changes and Compass whenever the stylesheets change.</p>\n<p>This blog uses Jekyll to build the HTML code, Compass for the stylesheets and JavaScript is concatenated and minified. Lately I have written more articles and every time I changed the layout or the text I had to manually recompiled using my <a href=\"https://github.com/braincrafted/braincrafted.com/blob/148b44472bb39a3ad10dfc7f24b6c0e8c7c4699b/Makefile\">Makefile</a>. Every time those extra keystrokes hurt me on the inside.</p>\n<p>Jekyll and Compass each have a watch command built in and there are tools for the JavaScript part, but I don't want to start three different watchers every time I work on braincrafted.com. Another problem is that after Compass build the CSS files, Jekyll needs to run to put CSS files into the correct directory.</p>\n<p>There are numerous tools and libraries available to watch for files changes, but I decided to use <a href=\"https://github.com/guard/guard\">Guard</a> pretty quickly because it fulfils all of my requirements:</p>\n<ol>\n<li>Exclude files and directories</li>\n<li>Define multiple groups of files</li>\n<li>Execute a Makefile</li>\n</ol>\n<p>Requirement number 1 is important because the builders will place the generated HTML, CSS and JavaScript files in a subdirectory of the watched directory. The second requirement allows me to only execute the builders necessary for a specific file. For example, if a HTML file is changed I only want to run Jekyll. Executing <code class=\"language-text\">Makefile</code>s allows me to reuse my existing build scripts and saves me some work.</p>\n<p>Installation of Guard was pretty easy, at least after I reinstalled my messed up Ruby installation and the syntax for the <code class=\"language-text\">Guardfile</code> is straight forward.</p>\n<div class=\"gatsby-highlight\" data-language=\"ruby\"><pre class=\"language-ruby\"><code class=\"language-ruby\"><span class=\"token comment\"># ./Guardfile</span>\n\n<span class=\"token comment\"># Notification via Growl when files change</span>\nnotification <span class=\"token symbol\">:growl</span>\n\n<span class=\"token comment\"># Ignore the following diretories and files</span>\nignore <span class=\"token regex-literal\"><span class=\"token regex\">%r{^_site/}</span></span><span class=\"token punctuation\">,</span> <span class=\"token regex-literal\"><span class=\"token regex\">%r{/Guardfile/}</span></span><span class=\"token punctuation\">,</span> <span class=\"token regex-literal\"><span class=\"token regex\">%r{/config.rb/}</span></span><span class=\"token punctuation\">,</span> <span class=\"token regex-literal\"><span class=\"token regex\">%r{/code/}</span></span><span class=\"token punctuation\">,</span> <span class=\"token regex-literal\"><span class=\"token regex\">%r{/css(-dev)?/}</span></span><span class=\"token punctuation\">,</span> <span class=\"token regex-literal\"><span class=\"token regex\">%r{/js/}</span></span>\n\nguard <span class=\"token symbol\">:shell</span> <span class=\"token keyword\">do</span>\n\n    <span class=\"token comment\"># When HTML and Markdown files are modified run Jekyll</span>\n    watch<span class=\"token punctuation\">(</span><span class=\"token regex-literal\"><span class=\"token regex\">/^.*\\.(md|htm|html|xml)/</span></span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token operator\">|</span>m<span class=\"token operator\">|</span>\n        <span class=\"token command-literal\"><span class=\"token command string\">`make build-jekyll run-dev`</span></span>\n        n <span class=\"token string-literal\"><span class=\"token string\">\"Built HTML for braincrafted.com\"</span></span>\n        m<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">end</span>\n\n    <span class=\"token comment\"># When JavaScript is modified build JS and Jekyll</span>\n    watch<span class=\"token punctuation\">(</span><span class=\"token regex-literal\"><span class=\"token regex\">/^js-dev\\/.*\\.js/</span></span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token operator\">|</span>m<span class=\"token operator\">|</span>\n        <span class=\"token command-literal\"><span class=\"token command string\">`make build-js build-jekyll run-dev`</span></span>\n        n <span class=\"token string-literal\"><span class=\"token string\">\"Built HTML and JavaScript for braincrafted.com\"</span></span>\n        m<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">end</span>\n\n    <span class=\"token comment\"># When Sass is modified build CSS and Jekyll</span>\n    watch<span class=\"token punctuation\">(</span><span class=\"token regex-literal\"><span class=\"token regex\">/^sass\\/(.*)\\.s[ac]ss/</span></span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token operator\">|</span>m<span class=\"token operator\">|</span>\n        <span class=\"token command-literal\"><span class=\"token command string\">`make build-css build-jekyll run-dev`</span></span>\n        n <span class=\"token string-literal\"><span class=\"token string\">\"Built HTML and CSS for braincrafted.com\"</span></span>\n        m<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">end</span>\n\n<span class=\"token keyword\">end</span></code></pre></div>\n<p>I added a target to my <code class=\"language-text\">Makefile</code> to make things even more intuitive.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># ./Makefile</span>\n\nwatch:\n    @echo <span class=\"token string\">\"Watching for changes...\"</span>\n    @bundle <span class=\"token builtin class-name\">exec</span> guard</code></pre></div>\n<p>Since I was already at it, I also wanted Safari to automatically reload the page (or open it in a new tab if it is not already open). I inlined some lines of AppleScript in my <code class=\"language-text\">Makefile</code> to accomplish this.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># ./Makefile</span>\n\nDEV_URL         <span class=\"token operator\">=</span> http:<span class=\"token punctuation\">\\</span>/<span class=\"token punctuation\">\\</span>/braincrafted.com.dev\nPROD_URL        <span class=\"token operator\">=</span> http:<span class=\"token punctuation\">\\</span>/<span class=\"token punctuation\">\\</span>/braincrafted.com\n\ndefine OPEN_SCRIPT\ntell application <span class=\"token string\">\"Safari\"</span>\n    <span class=\"token builtin class-name\">set</span> alreadyOpen to <span class=\"token boolean\">false</span>\n    <span class=\"token builtin class-name\">set</span> reloadURL to <span class=\"token string\">\"__OPEN_URL__\"</span>\n\n    repeat with x from <span class=\"token number\">1</span> to number of windows\n        repeat with y from <span class=\"token number\">1</span> to number of tabs <span class=\"token keyword\">in</span> window x\n            <span class=\"token builtin class-name\">set</span> tabURL to URL of tab y of window x\n            <span class=\"token keyword\">if</span> tabURL starts with reloadURL <span class=\"token keyword\">then</span>\n                <span class=\"token builtin class-name\">set</span> URL of tab y of window x to tabURL\n                <span class=\"token builtin class-name\">set</span> alreadyOpen to <span class=\"token boolean\">true</span>\n                <span class=\"token builtin class-name\">set</span> current tab of window x to <span class=\"token punctuation\">(</span>tab y of window x<span class=\"token punctuation\">)</span>\n            end <span class=\"token keyword\">if</span>\n        end repeat\n    end repeat\n\n    <span class=\"token keyword\">if</span> alreadyOpen is <span class=\"token boolean\">false</span> <span class=\"token keyword\">then</span>\n        tell front window\n            <span class=\"token builtin class-name\">set</span> current tab to <span class=\"token punctuation\">(</span>make new tab with properties <span class=\"token punctuation\">{</span>URL:reloadURL<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        end tell\n    end <span class=\"token keyword\">if</span>\n\nend tell\nendef\n\n<span class=\"token comment\"># Required because by default $OPEN_SCRIPT is interpretated as a command</span>\n<span class=\"token builtin class-name\">export</span> OPEN_SCRIPT\n\nrun-dev:\n    @echo <span class=\"token string\">\"Open site in development environment... <span class=\"token entity\" title=\"\\c\">\\c</span>\"</span>\n    @echo <span class=\"token string\">\"<span class=\"token variable\">$$</span>OPEN_SCRIPT\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">sed</span> <span class=\"token string\">\"s/__OPEN_URL__/<span class=\"token variable\">${DEV_URL}</span>/\"</span> <span class=\"token operator\">|</span> osascript\n    @echo <span class=\"token string\">\"<span class=\"token variable\">${CHECK}</span> Done\"</span>\n\nrun:\n    @echo <span class=\"token string\">\"Open site in production environment...  <span class=\"token entity\" title=\"\\c\">\\c</span>\"</span>\n    @echo <span class=\"token string\">\"<span class=\"token variable\">$$</span>OPEN_SCRIPT\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">sed</span> <span class=\"token string\">\"s/__OPEN_URL__/<span class=\"token variable\">${PROD_URL}</span>/\"</span> <span class=\"token operator\">|</span> osascript\n    @echo <span class=\"token string\">\"<span class=\"token variable\">${CHECK}</span> Done\"</span></code></pre></div>\n<p>When I now change something in the project, the updated page is already loaded when I switch to Safari.</p>\n<h3>Resources</h3>\n<ul>\n<li><a href=\"https://github.com/guard/guard/blob/master/README.md\">Guard README</a></li>\n<li><a href=\"https://github.com/guard/guard-shell\">Guard::Shell</a></li>\n<li><a href=\"http://mac.tutsplus.com/tutorials/automation/create-a-list-of-open-safari-tabs-with-applescript/\">Generate a List of Open Safari Tabs with AppleScript</a></li>\n<li><a href=\"http://hints.macworld.com/article.php?story=20090526225003768\">Reload Safari tabs in the background via AppleScript</a></li>\n<li><a href=\"http://hints.macworld.com/article.\">AppleScript To open a collection of Safari tabs</a>php?story=20110415065236737</li>\n<li><a href=\"http://stackoverflow.com/questions/649246/is-it-possible-to-create-a-multi-line-string-variable-in-a-makefile\">Is it possible to create a multi-line string variable in a Makefile</a></li>\n</ul>",
            "url": "/blog/rebuild-jekyll-compass/",
            "title": "Rebuild Jekyll and Compass when a file changes",
            "date_modified": "2013-06-05T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/spotify-queue-keyboard-shortcut/",
            "content_html": "<p>Sadly Spotify misses a lot of useful keyboard shortcuts, but fortunately we can use AppleScript and BetterTouchTool to create a shortcut to add a song to the queue.</p>\n<p>I spent the last hour trying to set the easiest and most reliable way to create a keyboard shortcut for Spotifys <em>Add to Queue</em> functionality on OS X. Since I found no solution for this I decided to post it here.</p>\n<p><em>Update June 14, 2013: In the last update Spotify moved <strong>Queue</strong> in the context menu from the second position to the 6th. I updated the article accordingly (but not the screenshot).</em></p>\n<p>There is no menu bar entry for this functionality in Spotify and therefore no way to use an ApplyScript. I had to simulate mouse clicks to get this done. There exists a range of different tools to set keyboard shortcuts, but I personally prefer <a href=\"http://www.bettertouchtool.net\">BetterTouchToul</a> from Andreas Hegenberg.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 76.25%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADUklEQVR4nK1UaW8aSRCdT/tfYhlZ/lPJ38pKmzibZL0fIOHwcB8DznKfA4bBxsA6gAFz9DAz3W+rJ7aDrZVWlralp+p6Vbyu6RZPyefzrxLZxEGhUDio1WoH2WzWRSKReDGq1eorpVarW+12m5dKJU7inEjebDa5ruuPaLVaLva555D1SqViKYFAwEkmkzg9PcXJyQd4fV+ghiPIZDSkUmlCBum0hoyWRZq45D33PMYTSfxx+idX9JbuGD0D4/EI38dXuDJa6LQq6Hd1XPZa6LXrKBdIKBZC8Vsa3XYV7WbZrTVrRfQ6dXzLxFA8T0ueK7PZzBGCY3G3hTczxO/RAT5Gr/A+qONT7Aqf40O8O+vh1686fgt18TE2wInax9svDbz11d39O+Lfqwb1GVxZrTaObVlY3m3wl76E1loj115Da8wRLowRPB8i21rhvLMlfoOsTnV9g0h+jEjhbzc/Jz5HUWutSPDuzjFNE4vFAo7j4GHtTIbl7RS3kxtwzvF8cerl/KFfQAjh0kqnYzjD4RDT6RSrNYNpcbCdg++TOSazuXsVW9N2uQfInuntAtPZ4rF/K2umzRXbth2pvl6vsWE77BwBi7DaMMxul5hM52CWg53Nn4CZlhR4zE03Olzh93OvVits9wQ3W5ME5RRzmuJfBHc2zJ39hKO+p4JSxJJFKUCfYt2L/8j/G3TAT8HlcvlE0NzDiwRHo5EjH+SaHkbei2ULd3zrhbgX5cp8Pncmkwn9U8b0KObDST9h/YhsR49A+y31yC+RucvLx6G9/B29AVdIyDEMA6PRGP1+H71eD33KJXdxcYFOp4NutwcyEBe1ahWlYgmNRgNkIqjX6xQbaOs6yuUKVwaDgX19fS0uLy8FOY0oFosiHouJGIFsTJCtiVg87uZkUW5MJhNCVc9EKBQS/q9+4fV6hc/nE36/31G63a5j0AQ3NzfuNNIk5HRyGrpf9+RIOIxqtY5avYFCPk9T1hCJRBGNxsiJ0girKjRNIzdKc6XRaK7L5TIjc2W5XI5RA8tkMi7I1lgqlWLZrMbiiQQLhVQWCgYZTUL7ECHIAgGJAFNVlZ2dqRvF4zl4fXR09Obw8PCNjMfHx27cx35tH897PB7Pa4XWL/8n/gHbVB0kqOA0IAAAAABJRU5ErkJggg==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/spotify-queue-keyboard-shortcut/bettertouchtool-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/spotify-queue-keyboard-shortcut/bettertouchtool-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/spotify-queue-keyboard-shortcut/bettertouchtool-320.png, /blog/spotify-queue-keyboard-shortcut/bettertouchtool-640.png 2x, /blog/spotify-queue-keyboard-shortcut/bettertouchtool-960.png 3x\" src=\"/blog/spotify-queue-keyboard-shortcut/bettertouchtool-320.png\" alt=\"BetterTouchTool\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>In the main BetterTouchTool window you first need to add <em>Spotify</em> to the list of applications. Just press the small plus button in the bottom of the list. I created two shortcuts. One for adding all tracks in the current view to the queue and another one for adding all currently selected tracks to the queue.</p>\n<p>Let's first create the shortcut for adding all tracks in the current view to the queue. Manually we would first press <strong>Cmd+A</strong> to select all tracks, then click the right mouse button and select the second entry from the context menu. We need to create a new shortcut by pressing the <em>Add New Shortcut</em> button in the lower right corner. Define your favourite shortcut to it (I mapped the CAPSLOCK key to Crtl+Option+Shift+Command and used <strong>CL+Q</strong>) and set <em>Trigger Other Keyboard Shortcut</em> to <strong>Cmd+A</strong>. Click <em>Attach Another Action</em> and set <em>Trigger Predefined Action</em> to <em>Rightclick</em>. Next we need to attach <strike>two</strike> six more actions that <strike>both</strike> all should trigger the <em>Down</em> key. The last action we need to attach is the <em>Enter</em> key.</p>\n<p>The shortcut to add only the selected songs to the queue is very similar, just set the shortcut to trigger <em>Right-click</em> instead of <em>Cmd+A</em>.</p>\n<p><em>Please note that the mouse has to be hovered over the selected songs when triggered the shortcut.</em></p>\n<p><a href=\"http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/\">A useful Caps Lock key - BrettTerpstra.com</a></p>",
            "url": "/blog/spotify-queue-keyboard-shortcut/",
            "title": "Create a keyboard shortcut to queue songs in Spotify on OS X",
            "date_modified": "2013-06-07T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/kinda-like-the-opposite-of-regexp/",
            "content_html": "<p>Regular expressions can match a pattern in a text and return the matches. However, what if we want find all texts that would match a given pattern. I created ExpExp, a PHP library, that allows you to do this.</p>\n<p>Two years ago I have written a library for a project to generate strings based on a given pattern called ExpExp. ExpExp takes a pattern (a subset of regular expressions) and returns all strings that would match the pattern. For example, the pattern <code class=\"language-text\">foo(bar|baz)</code> would expand to <code class=\"language-text\">foobar</code> and <code class=\"language-text\">foobaz</code>.</p>\n<p>Last week I found the library again and I decided, mostly for fun and pleasure, to add new features and to rewrite the whole code. I also moved to code to the Braincrafted namespace. You can find it on <a href=\"http://github.com/braincrafted/expexp\">Github</a>.</p>\n<p>While my goal is to support as many patterns supported by regular expressions as possible, it will ever be only a subset. For example, the star operator in regular expressions matches an infinite amount of infinite long strings. ExpExp can never support such things. Let's stop talking about what's not possible, but about the features that work right now.</p>\n<h3>Features</h3>\n<p>ExpExp currently supports the following operators:</p>\n<ul>\n<li>Parentheses</li>\n<li>Disjunction</li>\n<li>Repetition</li>\n<li>Alternation</li>\n<li>Character classes</li>\n<li>Dot operator</li>\n<li>Optional operator</li>\n</ul>\n<p>I am now going to discuss these operators in more detail.</p>\n<h4>Parentheses</h4>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>foo(bar)</code></td>\n            <td><code>['foobar']</code></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Disjunction</h4>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>foo[abc]</code></td>\n            <td><code>['fooa', 'foob', 'fooc']</code></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Repetition</h4>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n            <th></th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>foo{3}</code></td>\n            <td><code>foo</code></td>\n            <td></td>\n        </tr>\n        <tr>\n            <td><code>foo{1,3}</code></td>\n            <td><code>['foo', 'foofoo', 'foofoofoo']</code></td>\n            <td></td>\n        </tr>\n        <tr>\n            <td><code>foo{,3}</code></td>\n            <td><code>['', 'foo', 'foofoo', 'foofoofoo']</code></td>\n            <td>Alias for <code>foo{0,3}</code></td>\n        </tr>\n        <tr>\n            <td><code>foo(bar){2}</code></td>\n            <td><code>foobarbar</code></td>\n            <td></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Alternation</h4>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>foo|bar</code></td>\n            <td><code>['foo', 'bar']</code></td>\n        </tr>\n        <tr>\n            <td><code>foo(bar|baz)</code></td>\n            <td><code>['foobar', 'foobaz']</code></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Character classes</h4>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>[[:lower:]]</code></td>\n            <td><code>['a', 'b', 'c', ..., 'z']</code></td>\n        </tr>\n        <tr>\n            <td><code>[[:lower:][:upper:]]</code></td>\n            <td><code>['a', ..., 'z', 'A', ..., 'Z']</code></td>\n        </tr>\n    </tbody>\n</table>\n<p>Other character classes are</p>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Character class</th>\n            <th>Description</th>\n            <th>Regular expression</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>upper</code></td>\n            <td>Uppercase characters</td>\n            <td><code>[A-Z]</code></td>\n        </tr>\n        <tr>\n            <td><code>lower</code></td>\n            <td>Lowercase characters</td>\n            <td><code>[a-z]</code></td>\n        </tr>\n        <tr>\n            <td><code>digit</code></td>\n            <td>Digits</td>\n            <td><code>[0-9]</code></td>\n        </tr>\n        <tr>\n            <td><code>word</code></td>\n            <td>Alphanumeric characters and underscore</td>\n            <td><code>[A-Za-z0-9_]</code></td>\n        </tr>\n        <tr>\n            <td><code>space</code></td>\n            <td>Space characters</td>\n            <td><code>[\\t\\n\\r ]</code></td>\n        </tr>\n        <tr>\n            <td><code>vspace</code></td>\n            <td>Vertical space characters</td>\n            <td><code>[\\n\\r]</code></td>\n        </tr>\n        <tr>\n            <td><code>hspace</code></td>\n            <td>Horizontal space characters</td>\n            <td><code>[\\t ]</code></td>\n        </tr>\n        <tr>\n            <td><code>punct</code></td>\n            <td>Punctuation characters</td>\n            <td><code>[!\"#$%&#x26;'()*+,-./:;&#x3C;=>?@[]^_{|}~`]</code></td>\n        </tr>\n    </tbody>\n</table>\n<p>There are also multiple shortcuts available:</p>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Shortcut</th>\n            <th>Character classes</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>\\d</code></td>\n            <td><code>digit</code></td>\n        </tr>\n        <tr>\n            <td><code>\\w</code></td>\n            <td><code>word</code></td>\n        </tr>\n        <tr>\n            <td><code>\\s</code></td>\n            <td><code>space</code></td>\n        </tr>\n        <tr>\n            <td><code>\\v</code></td>\n            <td><code>vspace</code></td>\n        </tr>\n        <tr>\n            <td><code>\\h</code></td>\n            <td><code>hspace</code></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Dot operator</h4>\n<p>The dot operator is replaced by all characters from the <code class=\"language-text\">word</code> character class.</p>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>foo.</code></td>\n            <td><code>['fooa', 'foob', ..., 'foo_']</code></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Optional operator</h4>\n<p>The optional operator allows you to make a character or the content inside a parentheses optional.</p>\n<table class=\"border\">\n    <thead>\n        <tr>\n            <th>Pattern</th>\n            <th>Expansions</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><code>abc?</code></td>\n            <td><code>['abc', 'ab']</code></td>\n        </tr>\n        <tr>\n            <td><code>foo(bar)?</code></td>\n            <td><code>['foobar', 'foo']</code></td>\n        </tr>\n    </tbody>\n</table>\n<h4>Combination</h4>\n<p>Of course you can combine all of these operators. For example,</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">ab(cde|[xyz])</code></pre></div>\n<p>will expand to</p>\n<ul>\n<li><code class=\"language-text\">abcde</code></li>\n<li><code class=\"language-text\">abx</code></li>\n<li><code class=\"language-text\">aby</code></li>\n<li><code class=\"language-text\">abz</code></li>\n</ul>\n<h3>Use Cases</h3>\n<p>I don't think there are many use cases in real life for this library, but it was fun and challenging project.</p>\n<h3>Installation</h3>\n<p>If you want to play around with ExpExp or find a use cases in one of your project you can use <a href=\"http://getcomposer.org\">Composer</a> to install it:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"require\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"braincrafted/expexp\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dev-master\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I already have tagged some versions, so you can use, for example, <code class=\"language-text\">0.2.*</code> to get a (relative) stable release.</p>\n<h3>Usage</h3>\n<p>Pass the pattern to the <code class=\"language-text\">expand()</code> method and ExpExp will return an array with all expansions:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">use</span> <span class=\"token package\">Bc<span class=\"token punctuation\">\\</span>ExpExp<span class=\"token punctuation\">\\</span>ExpExp</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token variable\">$e</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ExpExp</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$result</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$e</span><span class=\"token operator\">-></span><span class=\"token function\">expand</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'abc|xyz'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>That's it.</p>",
            "url": "/blog/kinda-like-the-opposite-of-regexp/",
            "title": "Kinda like the opposite of regular expressions",
            "date_modified": "2013-10-20T18:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/symfony-bower-bootstrap/",
            "content_html": "<p>There exist a lot of different ways to get third party assets into your project and one such way is Bower. Bower is an asset management tool from Twitter and you can use it to get Bootstrap into your Symfony project. I will explain how you can use it in combination with BraincraftedBootstrapBundle, my bundle that integrates Bootstrap into Symfony.</p>\n<p>First I will assume that we have a fresh installation of <a href=\"http://symfony.com/download\">Symfony Framwork standard edition</a> and that you have <a href=\"http://bower.io\">Bower</a> installed. If you don't, do it now:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-g</span> bower\n$ <span class=\"token function\">composer</span> create-project symfony/framework-standard-edition symfony-bower-bootstrap/ <span class=\"token number\">2.4</span>.5\n$ <span class=\"token builtin class-name\">cd</span> symfony-bower-bootstrap</code></pre></div>\n<p>We can now add <a href=\"http://bootstrap.braincrafted.com\">BraincraftedBootstrapBundle</a> to the project and use Bower to download the Bootstrap assets:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">composer</span> require braincrafted/bootstrap-bundle:@stable\n$ bower init\n$ bower <span class=\"token function\">install</span> bootstrap <span class=\"token parameter variable\">--save</span></code></pre></div>\n<p>Add the bundle class to <code class=\"language-text\">app/AppKernel.php</code></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// app/AppKernel.php</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">AppKernel</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Kernel</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">registerBundles</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$bundles</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span>\n            <span class=\"token comment\">// ...</span>\n            <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\">Braincrafted<span class=\"token punctuation\">\\</span>Bundle<span class=\"token punctuation\">\\</span>BootstrapBundle<span class=\"token punctuation\">\\</span>BraincraftedBootstrapBundle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// ...</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In this article I am going to use Assetic to configure and compile the Bootstrap assets. BootstrapBundle comes with a handy auto configure functionality that configures Assetic for you. However, this functionality only works if you install Bootstrap using Composer and therefore we need to disable it.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config.yml</span>\n\n<span class=\"token key atrule\">braincrafted_bootstrap</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">auto_configure</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">assetic</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">false</span></code></pre></div>\n<p>The current stable release of BootstrapBundle supports only the <a href=\"http://lesscss.org\">Less</a> version of Bootstrap, but BootstrapBundle v2.1 adds support for the <a href=\"https://github.com/twbs/bootstrap-sass\">official Sass port of Bootstrap</a>. In this article I am going to use the Less version, but it works pretty similar if for bootstrap-sass.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config.yml</span>\n\n<span class=\"token key atrule\">assetic</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">filters</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">less</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">node</span><span class=\"token punctuation\">:</span> /usr/local/bin/node\n            <span class=\"token key atrule\">node_paths</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>/usr/local/lib/node_modules<span class=\"token punctuation\">]</span>\n            <span class=\"token key atrule\">apply_to</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\\.less$\"</span>\n        <span class=\"token key atrule\">cssrewrite</span><span class=\"token punctuation\">:</span> <span class=\"token null important\">~</span></code></pre></div>\n<p>We also need to tell Assetic where it finds the assets. By default Bower installs assets in the <code class=\"language-text\">bower_components</code> directory. If you have modified the location you also need to change it in the following snippet:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config.yml</span>\n\n<span class=\"token key atrule\">assetic</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">...</span>\n    <span class=\"token key atrule\">assets</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">bootstrap_css</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/less/bootstrap.less\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../vendor/braincrafted/bootstrap<span class=\"token punctuation\">-</span>bundle/Braincrafted/Bundle/BootstrapBundle/Resources/less/form.less\n            <span class=\"token key atrule\">filters</span><span class=\"token punctuation\">:</span>\n                <span class=\"token punctuation\">-</span> less\n                <span class=\"token punctuation\">-</span> cssrewrite\n            <span class=\"token key atrule\">output</span><span class=\"token punctuation\">:</span> css/bootstrap.css\n        <span class=\"token key atrule\">bootstrap_js</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/transition.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/alert.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/button.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/carousel.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/collapse.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/dropdown.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/modal.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/tooltip.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/popover.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/scrollspy.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/tab.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/bootstrap/js/affix.js\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../vendor/braincrafted/bootstrap<span class=\"token punctuation\">-</span>bundle/Braincrafted/Bundle/BootstrapBundle/Resources/js/bc<span class=\"token punctuation\">-</span>bootstrap<span class=\"token punctuation\">-</span>collection.js\n            <span class=\"token key atrule\">output</span><span class=\"token punctuation\">:</span> js/bootstrap.js\n        <span class=\"token key atrule\">jquery</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n                <span class=\"token punctuation\">-</span> %kernel.root_dir%/../bower_components/jquery/dist/jquery.js\n            <span class=\"token key atrule\">output</span><span class=\"token punctuation\">:</span> js/jquery.js</code></pre></div>\n<p><em>Note that BootstrapBundle includes a <code class=\"language-text\">less</code> and a <code class=\"language-text\">js</code> file to provide additional fixes and functionality when using Bootstrap in a Symfony application. You need to include those from the installed bundle.</em></p>\n<p>If you now dump the assets you should three files: <code class=\"language-text\">css/bootstrap.css</code>, <code class=\"language-text\">js/bootstrap.js</code> and <code class=\"language-text\">js/jquery.js</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ php app/console assetic:dump</code></pre></div>\n<p><em>Note that Assetic will also create the intermediate files when run in the <code class=\"language-text\">dev</code> environment.</em></p>\n<p>You can now create a basic layout and include the Bootstrap CSS and JavaScript assets and start building your application.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&#x3C;!-- src/Acme/DemoBundle/Resources/views/layout.html.twig --></span>\n\n<span class=\"token doctype\"><span class=\"token punctuation\">&#x3C;!</span><span class=\"token doctype-tag\">DOCTYPE</span> <span class=\"token name\">html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>head</span><span class=\"token punctuation\">></span></span>\n\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>title</span><span class=\"token punctuation\">></span></span>Bootstrap 101 Template<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>title</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>viewport<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>width=device-width, initial-scale=1.0<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token comment\">&#x3C;!-- Bootstrap --></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>{{ asset(<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>css/bootstrap.css<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>) }}<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>screen<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n\n    <span class=\"token comment\">&#x3C;!-- HTML5 Shim and Respond.js add IE8 support of HTML5 elements and media queries --></span>\n    {% include <span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>BraincraftedBootstrapBundle::ie8-support.html.twig<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span> %}\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>head</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>body</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>page-header<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>h1</span><span class=\"token punctuation\">></span></span>Hello, world!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>h1</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>div</span><span class=\"token punctuation\">></span></span>\n\n    <span class=\"token comment\">&#x3C;!-- jQuery (necessary for Bootstraps JavaScript plugins) --></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>{{ asset(<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>js/jquery.js<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>) }}<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>script</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token comment\">&#x3C;!-- Include all JavaScripts, compiled by Assetic --></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>{{ asset(<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>js/bootstrap.js<span class=\"token entity\" title=\"&#x27;\">&#x26;#39;</span>) }}<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>_Please note that the BootstrapBundle includes a basic layout template you can use. However, there has been a bug in <code class=\"language-text\">v2.0._</code>that caused<code class=\"language-text\">bootstrap.js</code>not to load. We fixed the bug in<code class=\"language-text\">v2.1.0-alpha1</code>.*</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 44.99999999999999%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVklEQVR4nK2UYW6DMAyFPWn32al6qJ2n7W7Q9h9lSYC1wAqCAoEknhMGY91UTVMiPj3HOFawngAAePDKfr9fLzkcDrPudrv1dvuy3my2Tqf8Lcs8JEmCURShEBzjOMY4ipFz4XJ5nuP5fMbT6eQ0zzOXuwdwxjTjXNMBLYTQ1FRnaapTIssyTUUzdj/lpvh2D5fLxXXuOolFUWJVVTgMw78B9LzAGIN/Ar9iu35Ti/8b1nWNTdPQDDunUkqnLeG0bR1S9mPN9TrXXCm22NzUA4JjgK+MOctwIZxFGO0Z43gMApez1rK2Sd5Gi6UUkzPoHccwDJ3lguCIEfVwn2w+Wc7kxzLLmnufTDbp+x5Ra3oUGlIz6xhP+VFvY/XtHLyXNdatxLZXXoCyosHKAbvBeAGyosK6U9j0xgtQlKWmWepBKa084N/Yq9Xq2Sf0k4Unr9AtH33yAbhdNp1+xj/oAAAAAElFTkSuQmCC); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/symfony-bower-bootstrap/login-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/symfony-bower-bootstrap/login-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/symfony-bower-bootstrap/login-320.png, /blog/symfony-bower-bootstrap/login-640.png 2x, /blog/symfony-bower-bootstrap/login-960.png 3x\" src=\"/blog/symfony-bower-bootstrap/login-320.png\" alt=\"Screenshot of Login Form\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>In addition to this article I also created a demo project where you can follow the steps in this article in a full Symfony project. The source code of this demo project resides on Github: <code><a href=\"https://github.com/florianeckerstorfer/symfony-bower-bootstrap\">florianeckerstorfer/symfony-bower-bootstrap</a></code>.</p>",
            "url": "/blog/symfony-bower-bootstrap/",
            "title": "Using Bower with Symfony2 and Bootstrap",
            "date_modified": "2014-05-29T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/pixar-movie-situation/",
            "content_html": "<p>Last Saturday I finished reading <a href=\"http://www.amazon.de/gp/product/0593070100/ref=as_li_ss_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=0593070100&#x26;linkCode=as2&#x26;tag=fecom-21\">Creativity, Inc.</a> by Ed Catmull, the president of Pixar Animation and Disney Animation. He writes about how to build and run a creative company and how Pixar's management fosters creativity and innovation.</p>\n<p>I really enjoyed reading the book and I think most of the principles do not only apply to movie companies but to all companies that employ creative people. That includes software companies. It also made me want to watch Pixar movies. Last weekend I already saw Toy Story 3 and Brave. Seven more movies to go.</p>\n<ul>\n<li><strike>Toy Story</strike></li>\n<li><strike>A Bug's Life</strike></li>\n<li>Toy Story 2</li>\n<li><strike>Monsters, Inc.</strike></li>\n<li><strike>Finding Nemo</strike></li>\n<li><strike>The Incredibles</strike></li>\n<li>Cars</li>\n<li><strike>Ratatouille</strike></li>\n<li><strike>WALL-E</strike></li>\n<li><strike>Up</strike></li>\n<li><strike>Toy Story 3</strike></li>\n<li>Cars 2</li>\n<li><strike>Brave</strike></li>\n<li><strike>Monsters University</strike></li>\n</ul>",
            "url": "/blog/pixar-movie-situation/",
            "title": "The Pixar Movie Situation",
            "date_modified": "2014-06-05T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/graphicsmagick-resize/",
            "content_html": "<p>I just searched 15 minutes to find out how to resize a image using <a href=\"http://www.graphicsmagick.org\">GraphicsMagick</a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">gm convert <span class=\"token parameter variable\">-resize</span> 150x100 in.jpg out.jpg</code></pre></div>\n<p>This will resize the image <code class=\"language-text\">in.jpg</code> to 150x100 and saves the result in <code class=\"language-text\">out.jpg</code>. You can resize the image by either providing the width or the height:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">gm convert <span class=\"token parameter variable\">-resize</span> <span class=\"token number\">150</span> in.jpg out.jpg\ngm convert <span class=\"token parameter variable\">-resize</span> x100 in.jpg out.jpg</code></pre></div>",
            "url": "/blog/graphicsmagick-resize/",
            "title": "Resize images with GraphicsMagick",
            "date_modified": "2014-06-06T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/swift-getting-started/",
            "content_html": "<p>Last Monday Apple released a new programming language for the iOS and Mac platforms: <a href=\"https://developer.apple.com/swift/\">Swift</a>. Currently I am about half way through the <a href=\"https://itunes.apple.com/at/book/swift-programming-language/id881256329?l=en&#x26;mt=11\">The Swift Programming Language</a> (iBook Store) book from Apple and I want to help you getting started to write some code in Swift. This is not a exhaustive guide, it introduces you to some of the basic concepts of Swift.</p>\n<hr>\n<p><strong>Note:</strong> While I don't intend to write an exhaustive guide to Swift the article in its current form still misses some crucial pieces.</p>\n<hr>\n<h2>Table of Contents</h2>\n<ol>\n<li><a href=\"#getting-started\">Getting Started</a></li>\n<li><a href=\"#constants-and-variables\">Constants &#x26; Variables</a></li>\n<li><a href=\"#arrays\">Arrays</a></li>\n<li><a href=\"#collections\">Collections</a></li>\n<li><a href=\"#loops\">Loops</a></li>\n<li><a href=\"#conditional-statements\">Conditional Statements</a></li>\n<li><a href=\"#optional-variables\">Optional Variables</a></li>\n<li><a href=\"#updates\">Updates</a></li>\n</ol>\n<h2>Getting Started</h2>\n<p>To get started with Swift you need the new Xcode 6 Beta. You can download it from Apples <a href=\"https://developer.apple.com/xcode/downloads/\">Developer area</a> after you have logged in with your developer account. You need enroll either in the iOS or Mac developer program for $100 per year.</p>\n<p>Open Xcode and create a new file (File > New > File) and select the <strong>Playground</strong> template in iOS > Source:</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 46.25%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACUUlEQVR4nK1U246iQBDt/9/P2Ee/Yp90kvUy2Rl2xlFBhcELQnMXBM9WFcK4ZpONiZUcuk7TNHWqqluVZQnG6XQilIIvfj/U8/MzGJPJBNf+aDTCeDwWsH/N27l/cTWhx9PgichEJobDoWxomiYWi4WA/eXS6rhFfHXF+b1lNVylaYosy5DnObI0Q5Ik0FEIP/BFQlVViOMEu92+4wdfw1q7KItCeJIm8LVuJO93OxzzI+q6xvl8ljHNcvrIB84QC3WEN+MdVV0J/2ms8O37D7QWpTlcLxRfGa8Ghb/CqWoWc0EOhwM2mw1FnQnf7bbEXYRhKBHN5wv8ejEQBIF8w+s/XZfeUYSLhYmCQmfjCDls3oTnOFoG+0XZzPMaTlOapcLbIIriKO8U56/drJFdI44SmLN1Jykm+c7HR8cTyunacjoe6hgr075INl6lQrbjwCFkJFP7Ecx3WzZn0/s93NkM1blJahQmsC232zA4RFjNPynlFOGb8VvKnl8KUxQl1vYay5Ul8jlyj3LE4JyyHY9HyWdr3CG6rbJpWtQ2eSebky7y25F+Qs7FJ1z8v4HOV57ndROSD/ozV9jzDqhOX5s2ON/wWgJojx37CjcW0Yb22pFGDqgYoQ4JmiQ1I4PXsEQd6K7Sranb8LlFSmmRU9MuRXkzFnJCSuI81pfCtQoVNyXLbMF/jqKYEP0XvN4nFdzg/B2nT83pQHPO7sV2u4Vt23Rq5nRxLOUkTadTuhzoMuALQbr/Tlx/F8exjGowGOBR6Pf7UL1eD4+E4i5/JP4A3jbeJfpPIDgAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/swift-getting-started/xcode-new-file-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/swift-getting-started/xcode-new-file-640.png, /blog/swift-getting-started/xcode-new-file-1280.png 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/swift-getting-started/xcode-new-file-320.png, /blog/swift-getting-started/xcode-new-file-640.png 2x, /blog/swift-getting-started/xcode-new-file-960.png 3x\" src=\"/blog/swift-getting-started/xcode-new-file-320.png\" alt=\"Xcode 6 Beta New File Dialog\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Next you need to select a folder where to save your playground file and enter a filename. If you have done that you should see a new window where you can start to write some Swift code.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 69.6875%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmklEQVR4nO2U226CQBCGN32Wvlrfq9lLmxgb40XvIJI+gkELVdQWMF3ktCA6y3SASqyaxib2rj/5mFnC/rszHBi7tjRd48/PBjcMgw+NITco7w2eeKfzwLvdLu8PBjXdXo/3iP5jn2uaznVdp6jVVPnX+J553grNsY2vlo3T1xk6MwcnYwsn5ks9tiYWjscmLhYLFEKg+BAYx/FZoigCZn1MYSlciGQIbuBCmATgrT3wQx9EKsCLfHDX7xDlEYCCWrvdruVQNN4yP/AxkQmWiKjo3BxNrhSgKlXLdrvFoihq9nme5y1SSsXidYxi5aHKJKpNgSAzVDLFkiYcK8sydF0XV75P0aO4wiRJWqhkxfJiQ0YbBLqgpMRdFNYoWv1YkhZyHAfn8zn1d4pvy3cMw7AlCALFmlvLk8nnRD2qS62gdtVxQ5vZQxWQ4d6rjWWTl6eLVAYZtaQqfc9JDy/a2qHhkcm/4R8YlvQ0L6X6MmjSt6d8SJqmv9theeZVOpQiMdu2l5dimuZyNBr9xLz6Jd5dGXZ7ZdjNNfkEn7jNq5ySJ1AAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/swift-getting-started/xcode-new-swift-file-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/swift-getting-started/xcode-new-swift-file-320.png, /blog/swift-getting-started/xcode-new-swift-file-640.png 2x\" src=\"/blog/swift-getting-started/xcode-new-swift-file-320.png\" alt=\"New Swift Playground in Xcode 6 Beta\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Constants &#x26; Variables</h2>\n<p>Constants and variables can be used to hold a value. The difference between constants and variables is that constants have a constant value, once you assign a value to a constant you cannot change that value. Variables on the other hand have a variable value, you can change the value of a variable any time you want. You can define constants with the <code class=\"language-text\">let</code> keyword and variables using the <code class=\"language-text\">var</code> keyword.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token comment\">// Define a constant</span>\n<span class=\"token keyword\">let</span> myFirstConstant <span class=\"token operator\">=</span> <span class=\"token string-literal\"><span class=\"token string\">\"Hello Constant\"</span></span>\n\n<span class=\"token comment\">// Define a variable</span>\n<span class=\"token keyword\">var</span> myFirstVariable <span class=\"token operator\">=</span> <span class=\"token string-literal\"><span class=\"token string\">\"Hello Variable\"</span></span>\n\n<span class=\"token comment\">// Change the value of the variable</span>\nmyFirstVariable <span class=\"token operator\">=</span> <span class=\"token string-literal\"><span class=\"token string\">\"Another value\"</span></span>\n\n<span class=\"token comment\">// This will raise an error</span>\n<span class=\"token comment\">// myFirstConstant = \"Another value\"</span></code></pre></div>\n<hr>\n<p><strong>Note:</strong> Maybe you have noticed that the semicolon at the end of each line is missing. In Swift you don't need to add a semicolon at the end of a statement if each statement is on its own line. If you want two write two statements on a single line you have to separate them with a semicolon.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> one <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">var</span> two <span class=\"token operator\">=</span> <span class=\"token number\">2</span></code></pre></div>\n<hr>\n<p>Now that we have defined a variable and a constant we need to learn a little bit about types. Swift is a strongly typed language, each variable and constant needs to have a type. It supports all major types like strings, integers, floats, booleans and so own. In a strongly typed language you normally have to define the type everytime you define a variable or constant. As you have seen in the previous example we didn't define a type for <code class=\"language-text\">myFirstConstant</code> and <code class=\"language-text\">myFirstVariable</code>. We can omit the type when Swift can infer the type. In the example above Swift was able to infer that the type of <code class=\"language-text\">myFirstConstant</code> and <code class=\"language-text\">myFirstVariable</code> is <code class=\"language-text\">String</code> because we set the value immediately to a string value. However, we could have also provided the type explicetely.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> myFirstConstant<span class=\"token punctuation\">:</span> <span class=\"token class-name\">String</span> <span class=\"token operator\">=</span> <span class=\"token string-literal\"><span class=\"token string\">\"Hello Constant\"</span></span>\n<span class=\"token keyword\">var</span> myFirstVariable<span class=\"token punctuation\">:</span> <span class=\"token class-name\">String</span> <span class=\"token operator\">=</span> <span class=\"token string-literal\"><span class=\"token string\">\"Hello Variable\"</span></span></code></pre></div>\n<p>In this example we can omit the type because Swift can infer it based on the value. If you define a variable and don't immediately assign a value you have to define the type.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> one<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span>\n<span class=\"token keyword\">var</span> two<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span></code></pre></div>\n<p>Here are a few more example with other types supported by Swift.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> anInteger<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n<span class=\"token keyword\">var</span> anBoolean<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Bool</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n<span class=\"token keyword\">var</span> aString<span class=\"token punctuation\">:</span> <span class=\"token class-name\">String</span> <span class=\"token operator\">=</span> <span class=\"token string-literal\"><span class=\"token string\">\"Hello\"</span></span>\n<span class=\"token keyword\">var</span> aDouble<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Double</span> <span class=\"token operator\">=</span> <span class=\"token number\">4.2</span>\n<span class=\"token keyword\">var</span> aFloat<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Float</span> <span class=\"token operator\">=</span> <span class=\"token number\">9.9</span></code></pre></div>\n<p>In general variables also have to have a value. However, Swifts has the concept of <a href=\"#optional-variables\">Optional Variables</a> that I will cover in a later chapter.</p>\n<h2>Arrays</h2>\n<p>Array is a type that can contain multiple values of the same type. For example, if you want to create a list of the houses in Game of Thrones.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> houses <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token string-literal\"><span class=\"token string\">\"Stark\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"Lannister\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"Baratheon\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"Greyjoy\"</span></span> <span class=\"token punctuation\">]</span></code></pre></div>\n<p>Swift can infer the type of <code class=\"language-text\">houses</code> based on the value. We could also explicetly state the type of the array.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> houses<span class=\"token punctuation\">:</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token string-literal\"><span class=\"token string\">\"Stark\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"Lannister\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"Baratheon\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"Greyjoy\"</span></span> <span class=\"token punctuation\">]</span></code></pre></div>\n<p>Of course we can also create an array of integers.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> favNumbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">42</span><span class=\"token punctuation\">,</span> <span class=\"token number\">69</span> <span class=\"token punctuation\">]</span></code></pre></div>\n<p>We can access the element of an array by using the index syntax. Like in most other programming languages the first index of an array is <code class=\"language-text\">0</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\">houses<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n<span class=\"token comment\">// \"Stark\"</span>\n\nhouses<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n<span class=\"token comment\">// \"Lannister\"</span></code></pre></div>\n<p>Unlike in more low-level languages like Objective C or C types in Swift have methods and operations. For example, we can count the elements in an array</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\">houses<span class=\"token punctuation\">.</span>count\n<span class=\"token comment\">// 4</span></code></pre></div>\n<p>Arrays are ordered, therefore each element has an index (must be unique) and there are no gaps in the list of indeces. If you have an array with 5 elements and you remove the element with index 2, the element at index 3 will be moved to index 2 and the element at index 4 will be moved to index 3.</p>\n<h2>Collections</h2>\n<p>Collections are somewhat similar to arrays, but while arrays are ordered (each element has an index and the array is orderd by this index) collections are unordered. The index of an collection does not have to be an integer, but can be a string or a double.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> lords <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token string-literal\"><span class=\"token string\">\"stark\"</span></span><span class=\"token punctuation\">:</span> <span class=\"token string-literal\"><span class=\"token string\">\"ned\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"lannister\"</span></span><span class=\"token punctuation\">:</span> <span class=\"token string-literal\"><span class=\"token string\">\"tywin\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token string-literal\"><span class=\"token string\">\"baratheon\"</span></span><span class=\"token punctuation\">:</span> <span class=\"token string-literal\"><span class=\"token string\">\"robert\"</span></span> <span class=\"token punctuation\">]</span></code></pre></div>\n<p>Just like arrays you can access elements in a collections using their index.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\">lords<span class=\"token punctuation\">[</span><span class=\"token string-literal\"><span class=\"token string\">\"stark\"</span></span><span class=\"token punctuation\">]</span>\n<span class=\"token comment\">// \"ned\"</span></code></pre></div>\n<h2>Loops</h2>\n<p>One of the most common things you want to do with an array or a collection is that you want to step through each element. Swift offers a number of different types of loops. The probably easiest one to understand is the <strong>for-in</strong> loop.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">for</span> house <span class=\"token keyword\">in</span> houses <span class=\"token punctuation\">{</span>\n    house\n<span class=\"token punctuation\">}</span></code></pre></div>\n<hr>\n<p><strong>Note:</strong> If you type this code in a playground in Xcode you will see the number of times the body of the loop is executed. In the example above this would be four times. You can click on the circle icon right to this to view the value of the variable <code>house</code> in each iteration.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 64.99999999999999%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByklEQVR4nK2UXU7CQBDHN9HjeB2uYTSEhNvw7qsaAyEhBmLLcgdNsGArAra7290Wt+PMYn3QFnjokl9m2878Ox9bGGPs7C83rdZZ64f9vdY/n1q8J4/7ns89z+Mzf8onY4/f3j7w+7t7PugP+XA44P1+nw8GQz4eT/jj44hPJk98Npvx6XTKfd//hTRYsFwAsXxbwHwxh3AVwesygJf5M8QihizLQGsNxhi3L8nzHHa7HaRpCuv1GpRSEMcxMJNnVhpp01xZkQkrM2kV7mUurfnKLApZFHRgsAODndXp/h49y9BPSWmZTnJQUrs3Vq3tZgNhGEKEhGHk9kEQwMfqw9nt9tNVQNlS5sxs1r/BBf7gzxWVqnXqgqqgUqWULiHaM7v7qsysXORY9rEK6iEhhHQvZ0obUPjAWlspGMcJvEeRC6oSpEGQTZJkn+HB9HAlQsBq9X5UMP0p/ajgKSU74c/YDeioIPWlLrtyKGRFItBPnyZYJ1YKloNxQ2lCkKC2NCpYXjcriGWTYHEIdCywP7XgUSnwGy60MUWKvicfmzpclpiZxG/e4Jll3W63d4hOp3OQdrvda5O9vOp1rq57+CfLLhplNBqdN8k3W5Ut0x9S1ZQAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/swift-getting-started/xcode-for-in-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/swift-getting-started/xcode-for-in-320.png, /blog/swift-getting-started/xcode-for-in-640.png 2x\" src=\"/blog/swift-getting-started/xcode-for-in-320.png\" alt=\"Value of variable in for-in loop in Xcode\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>If you don't want to iterate through an array or collection but rather iterate to a range of values you can use the range operator. In fact, in Swift there are two range operators. The <strong>closed range operator</strong> is <code class=\"language-text\">a...b</code> and returns all numbers between <code class=\"language-text\">a</code> and <code class=\"language-text\">b</code> including <code class=\"language-text\">a</code> and <code class=\"language-text\">b</code>. The <strong>half-closed range operator</strong> is <code class=\"language-text\">a..b</code> and returns the numbers between <code class=\"language-text\">a</code> and <code class=\"language-text\">b</code> including <code class=\"language-text\">a</code> but excluding <code class=\"language-text\">b</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token number\">1</span><span class=\"token operator\">...</span><span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    i\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// 1</span>\n<span class=\"token comment\">// 2</span>\n<span class=\"token comment\">// 3</span>\n<span class=\"token comment\">// 4</span>\n<span class=\"token comment\">// 5</span>\n\n<span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token number\">1</span><span class=\"token operator\">..</span><span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    j\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// 1</span>\n<span class=\"token comment\">// 2</span>\n<span class=\"token comment\">// 3</span>\n<span class=\"token comment\">// 4</span></code></pre></div>\n<p>Swift also supports \"normal\" for loops, while and do while loops.</p>\n<hr>\n<p><strong>Note:</strong> If you have already experience in another programming language you might be wondering if I forgot the parentheses in the <code class=\"language-text\">for</code> statement. I didn't. In Swift you don't use parenthesis when writing <em>Control Flow</em> (<code class=\"language-text\">for</code>, <code class=\"language-text\">while</code>,<code class=\"language-text\">if</code>,<code class=\"language-text\">switch</code>, …) statements.</p>\n<hr>\n<h2>Conditional Statements</h2>\n<p>Conditional statements allow you to execute only when a certain condition is met. The conditional is often also called an <em>expression</em> and we say that an expression <em>is true</em> or <em>is false</em> or <em>is evaluated to true</em> or <em>is evaluated to false</em>.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token number\">5</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">==</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is 5\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Number is 5\"</span></code></pre></div>\n<p>Swift supports all major operators known from other programming languages like <code class=\"language-text\">==</code>, <code class=\"language-text\">!=</code>, <code class=\"language-text\">></code>, <code class=\"language-text\">&#x3C;</code>, <code class=\"language-text\">>=</code>, <code class=\"language-text\">&#x3C;=</code> and so on.</p>\n<p>Often you need to execute code when an expression is valid and another piece of code when the expression is not valid. Like any other programming language, Swift has an <code class=\"language-text\">else</code> statement.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token number\">10</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">==</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is 5\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is not 5\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Number is not 5\"</span></code></pre></div>\n<p>In the above example this is the same as if you would write two <code class=\"language-text\">if</code> statements, one with a positive expression, one with the negated expression.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token number\">10</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">==</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is 5\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">!=</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is not 5\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Number is not 5\"</span></code></pre></div>\n<p>However this will not always work. For example, consider the following piece of code:</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token number\">10</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">></span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is greater than 5\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">></span> <span class=\"token number\">3</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is grater than 3\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Number is greater than 5\"</span>\n<span class=\"token comment\">// \"Number is greater than 3\"</span></code></pre></div>\n<p>If you only want to output one of the two lines you either have to adapt the second conditional to <code class=\"language-text\">num > 3 &#x26;&#x26; num &#x3C;= 5</code> or you need to use <code class=\"language-text\">else</code>. Using <code class=\"language-text\">else</code> is a lot more elegant and readable.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token number\">10</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">></span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is greater than 5\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is grater than 3\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Number is greater than 5\"</span></code></pre></div>\n<p>You can also combine the <code class=\"language-text\">if</code> and <code class=\"language-text\">else</code> statements to implement multiple conditionals.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> <span class=\"token number\">42</span>\n<span class=\"token keyword\">if</span> num <span class=\"token operator\">==</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is 42\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> num <span class=\"token operator\">==</span> <span class=\"token number\">42</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"You've found the answer\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Number is not 5 and not the answer\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"You've found the answer\"</span></code></pre></div>\n<h2>Optional Variables</h2>\n<p>As mentioned in the <a href=\"#constants-variables\">Constants &#x26; Variables</a> chapter Swift requires you to always set a value for a variable for you can read it. In other programming languages variables have a default value (for example, <code class=\"language-text\">null</code> in PHP or <code class=\"language-text\">undefined</code> in JavaScript) when you use a variable before it has a value assigned. When you execute the following code snippet you will get a compiler error.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> foo<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span>\n\n<span class=\"token keyword\">if</span> foo <span class=\"token operator\">==</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"The value is 5\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// Compiler error: \"error: variable 'foo' used before being initialized\"</span>\n</code></pre></div>\n<p>This behaviour helps you catch a lot of errors where you forgot to assign a value or assigned a value to the wrong variable. However, there exist situations where you cannot assign a value to variable because we don't know the value yet. For example, when retrieving data using an HTTP request we may not have a value when the request fails. For such cases you can specifically define a variable as <em>optional</em> and assign <code class=\"language-text\">nil</code> to the variable. If you explicitely state that a variable is optional it is your responsibility to check whether a value has been asigned before using it. You can define an optional variable by adding a question mark <code class=\"language-text\">?</code> to the type definition.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> foo<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span><span class=\"token operator\">?</span>\n\n<span class=\"token keyword\">if</span> foo <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Foo is initialized\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Foo is not initialized\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Foo is not initialized\"</span></code></pre></div>\n<p>In this example the conditional evaluates to <code class=\"language-text\">true</code> if the variable <code class=\"language-text\">foo</code> has a value assigned (is not <code class=\"language-text\">nil</code>) and to <code class=\"language-text\">false</code> otherwise (is <code class=\"language-text\">nil</code>). You can also assign <code class=\"language-text\">nil</code> later to a variable.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> foo<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span><span class=\"token operator\">?</span>\nfoo <span class=\"token operator\">=</span> <span class=\"token number\">5</span>\n\n<span class=\"token keyword\">if</span> foo <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Foo is initialized\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Foo is not initialized\"</span></span>\n<span class=\"token punctuation\">}</span>\n\nfoo <span class=\"token operator\">=</span> <span class=\"token nil constant\">nil</span>\n\n<span class=\"token keyword\">if</span> foo <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Foo is initialized\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Foo is not initialized\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// \"Foo is initialized\"</span>\n<span class=\"token comment\">// \"Foo is not initialized\"</span></code></pre></div>\n<p>It's important to note that only the variable name (<code class=\"language-text\">foo</code> in the examples above) is only a valid <code class=\"language-text\">LogicValue</code> that can be used in a conditional if the variable is optional. The following example will throw a compiler error:</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> bar<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span> <span class=\"token operator\">=</span> <span class=\"token number\">5</span>\n<span class=\"token keyword\">if</span> bar <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"Bar is initialized\"</span></span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// Compiler error: \"type 'Int' does not conform to protocol 'LogicValue'\"</span></code></pre></div>\n<p>It is a common scenario that you have a variable with an optional value and after you check that it has a value it should always have a value. You can use <code class=\"language-text\">var foo = optionalFoo</code> inside the conditional to assign the optional value to a non-optional value.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">var</span> foo<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span><span class=\"token operator\">?</span> <span class=\"token operator\">=</span> <span class=\"token number\">5</span>\n\n<span class=\"token keyword\">if</span> <span class=\"token keyword\">var</span> bar <span class=\"token operator\">=</span> foo <span class=\"token punctuation\">{</span>\n    bar <span class=\"token operator\">=</span> <span class=\"token number\">7</span>\n    bar <span class=\"token operator\">=</span> <span class=\"token nil constant\">nil</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// Compiler error: \"could not find an overload for '__conversion' that accepts the supplied arguments\"</span></code></pre></div>\n<p>The first assignment <code class=\"language-text\">bar = 7</code> goes through, however, the compiler will throw an error when you want to assign <code class=\"language-text\">nil</code> to <code class=\"language-text\">bar</code>.</p>\n<p>It is worth noting that constants can also have an optional type.</p>\n<div class=\"gatsby-highlight\" data-language=\"swift\"><pre class=\"language-swift\"><code class=\"language-swift\"><span class=\"token keyword\">let</span> foo<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Int</span><span class=\"token operator\">?</span>\n\n<span class=\"token keyword\">if</span> foo <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"init\"</span></span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-literal\"><span class=\"token string\">\"not init\"</span></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<hr>\n<p>Please note that this article can be considered as a working draft. At this point it includes some of the basic concepts of the Swift programming language, but there exists a lot of stuff that is not covered. If you are eager to learn more please read <a href=\"https://itunes.apple.com/at/book/swift-programming-language/id881256329?l=en&#x26;mt=11\">The Swift Programming Language</a> (iBook Store) from Apple. You can read the book also <a href=\"https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH3-XID_0\">online</a>. If you want to try things out and don't want to type every example you can download the <a href=\"https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-XID_1\">Swift Tour</a> as a playground file.</p>\n<hr>\n<h2>Updates</h2>\n<ul>\n<li><strong>June 8, 2014</strong>\n<ul>\n<li>Extended and rewritten section on <a href=\"#conditional-statements\">Conditional Statements</a></li>\n<li>Added <a href=\"#table-of-contents\">Table of Contents</a></li>\n</ul>\n</li>\n<li><strong>June 15, 2014</strong>\n<ul>\n<li>Added chapter on <a href=\"#optional-variables\">Optional Variables</a></li>\n</ul>\n</li>\n</ul>",
            "url": "/blog/swift-getting-started/",
            "title": "Getting Started with Swift",
            "date_modified": "2014-06-08T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/prague-may-2014/",
            "content_html": "<p>In the beginning of May I spent a weekend with some friends in Prague, Czech Republic. Due to a late arrival and a thorough exploration of Pragues nightlife I had only half a day to walk around the city. Here are some of the photos I took on this weekend.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMGBwj/xAAjEAACAQQBBAMBAAAAAAAAAAABAgMABAURIQYSMWFxgcGR/8QAFwEBAQEBAAAAAAAAAAAAAAAAAQQABf/EABwRAAICAgMAAAAAAAAAAAAAAAABAhMDERIxUf/aAAwDAQACEQMRAD8A6F3Q1QZOojBMC2RUd2100vAI+uP01GnVN5eWtxNjXkZYWCF5U0rHfOj6903x6CmRoe6VQE6lWTuZr64TnWhG2jSm6JqZFdxHYca0rwwyOLlYwXjBOiPPzTPYGzyljNc3bXBleJSCsrKE86AA4/u6UqBHUyJNvZlmMgntbYrb5G/jV3ZiFmOt71+ClKUuT2Qcn6f/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6523-960.jpg, /blog/prague-may-2014/IMG_6523-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6523-640.jpg, /blog/prague-may-2014/IMG_6523-1280.jpg 2x, /blog/prague-may-2014/IMG_6523-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6523-320.jpg, /blog/prague-may-2014/IMG_6523-640.jpg 2x, /blog/prague-may-2014/IMG_6523-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6523-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcFAf/EACsQAAIBAgUBBgcAAAAAAAAAAAECAwAEBRESITEGBxNBUWGBFBUjUpHB0f/EABgBAAIDAAAAAAAAAAAAAAAAAAADAQIE/8QAGhEAAwEBAQEAAAAAAAAAAAAAAAECEQMhMf/aAAwDAQACEQMRAD8ArHSF4l9YNblx3sG6qTn9Mnbf04/FakUsIge6jmV4kBOqNgePD9VCuiHxoxJY2ccUkYtvh5HaXSFQ5Bjwc/Hat3qiybCbDvL2+QYezBZDCGQ7HMZngZ5ZCpXapnM0K4zVbpQ7zEEuJA93EsUgXLQxBKj1PnueKVKrjtUwmNxH8mt5lRQqvMneNkB9xJJ96VndU/dHKM8wz+l8WurGdIoCmiZ1DalzPPnVIWZmbQ+llOxDDMH2pSmUUr6cvMFwtpQ7YbZszqGJMC/ylKUlgmz/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6436-960.jpg, /blog/prague-may-2014/IMG_6436-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6436-640.jpg, /blog/prague-may-2014/IMG_6436-1280.jpg 2x, /blog/prague-may-2014/IMG_6436-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6436-320.jpg, /blog/prague-may-2014/IMG_6436-640.jpg 2x, /blog/prague-may-2014/IMG_6436-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6436-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwT/xAAnEAACAQQBAwMFAQAAAAAAAAABAgMABBEhBQYSIhMxcRRBQ1Gx0f/EABcBAQEBAQAAAAAAAAAAAAAAAAMEBQb/xAAfEQACAgIBBQAAAAAAAAAAAAABAgARAxIEBTFR8PH/2gAMAwEAAhEDEQA/ANGs70x8op+ojVoYfOMDDNIrYfGtrgGpax6ns7/p1uRtJY3kPh6atkq5zhT+jgZqhwdRWjte3Kx9j2ojyxx+R+3GtgaJ+KpfRfU62PHcjYyIHMl+8qFQcnxx/u6BMrKhoRmxBmFzTriaKCQrI0jsQGLBc5yKVVj1SyEqLMtjXdJKqlsazilTgNXaMQBOCw5VrXiUSO1sykkyqVMesKCR7H+1EW3HRcgLrk3Z4ZJ4mPpQ4WNN48dE+w+5PuaUrP6JkZ8z7G/sbnKABQ9qQlzxCpLiK9vY17R4rIMDXxSlK6HUSLY+Z//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6443-960.jpg, /blog/prague-may-2014/IMG_6443-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6443-640.jpg, /blog/prague-may-2014/IMG_6443-1280.jpg 2x, /blog/prague-may-2014/IMG_6443-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6443-320.jpg, /blog/prague-may-2014/IMG_6443-640.jpg 2x, /blog/prague-may-2014/IMG_6443-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6443-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAQMEBv/EACUQAAEDBAIBBAMAAAAAAAAAAAECAwQABQYREiExEyJBgWGhsf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAD/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIREiEDBDGR/9oADAMBAAIRAxEAPwCxc3Vjz7ci1OOvpdfaUFtxiCvidj2hXW966/NU2/i9ikvFdjy2WieCEojz4wQVciEnSgdeP5Url8FmPnkt+ct1SHztB59oJJOgfoeagr7dZES5sQbbMcbjO7cXxSgFCd70Oh0OyButKrphKOrRB3HHbhbpzsFcthTkc+mo8kkb89E/GiKVhnJG3klcwodd2RyXy2R8eKVO+WCdYP4Urrt7yiekyJIdWlSySVHZP0a5sexyBPjvyJIdU40hzh7+hxSDr9mlKpl4IZtyFtWPz0w7U88xGLYd4cyfcrz5pSlKCXh//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6461-960.jpg, /blog/prague-may-2014/IMG_6461-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6461-640.jpg, /blog/prague-may-2014/IMG_6461-1280.jpg 2x, /blog/prague-may-2014/IMG_6461-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6461-320.jpg, /blog/prague-may-2014/IMG_6461-640.jpg 2x, /blog/prague-may-2014/IMG_6461-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6461-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwIE/8QAJRAAAgEEAQMFAQEAAAAAAAAAAQIDAAQFESEGEjETIkFhkYGh/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEAP/EACARAQACAAYDAQAAAAAAAAAAAAEAAgMREyFRgQQUMVL/2gAMAwEAAhEDEQA/ANqxskT28SHtcjeg/hP7Ubn8kuJvLKSW4hRryY28QQ8A9u+frj9NUSXqTqC0X1b2xx1v6j9kSgM3e2t6Gj9eajcvNlcpixeTGK1mimZ4kKEsFYgbH+eeOKd7FfoPcW+OiVU6mlY7rfF3CTLNLHDJBM8DK0qrsqdbG/g0rH8bgc7aW3oxWFpKqk++VQWP4dUodevELQf1OLmaa66ouBcTyusZCKvdoaAHwK9PXF/cYrp+1ayZUMjPGxKg8DtbXP2KUqam9TOVYm2I5cyx425bI2FvcXYDStGu2DMu/aD4B180pShSYWf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6459-960.jpg, /blog/prague-may-2014/IMG_6459-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6459-640.jpg, /blog/prague-may-2014/IMG_6459-1280.jpg 2x, /blog/prague-may-2014/IMG_6459-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6459-320.jpg, /blog/prague-may-2014/IMG_6459-640.jpg 2x, /blog/prague-may-2014/IMG_6459-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6459-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQHAQIDBv/EACUQAAIBAwMEAgMAAAAAAAAAAAECAwAEEQUSIQYiMVEUkQcTgf/EABYBAQEBAAAAAAAAAAAAAAAAAAQCAf/EABwRAAICAwEBAAAAAAAAAAAAAAABAhESIVHB4f/aAAwDAQACEQMRAD8AtB7rsRrZSXK3JTcQocbu/wCvArjod8bi6skVEWU2hMTclViyMqfR5HB5ry/XOp79EQQfMSVP2SMbN8lNrgBcDnuBPrxT8fzpp0scd9JPFDcRSTt8yTDRlTgBxk7T5wM+6Du00xeCcXosfppnuNHgktw9rEchYTHgqAceD90qD0qy6po6XWqIq3LO4xGCo27jtOMnkjFKRG6+h5qpNeEE9GaJJBJEls8IYAO0UjK0gByNzZyeaw/QWiSxIki3LIrlwpmJ7j5J9/2lKvFcIU5dNrXo+zsIEt7S91BIVzhTKGxk+ypNKUrKKtn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6474-960.jpg, /blog/prague-may-2014/IMG_6474-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6474-640.jpg, /blog/prague-may-2014/IMG_6474-1280.jpg 2x, /blog/prague-may-2014/IMG_6474-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6474-320.jpg, /blog/prague-may-2014/IMG_6474-640.jpg 2x, /blog/prague-may-2014/IMG_6474-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6474-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAwQIBf/EACQQAAEEAgICAgMBAAAAAAAAAAECAwQRAAUSIQYxQWETIjJR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIE/8QAGxEBAAIDAQEAAAAAAAAAAAAAAQACEjFBESH/2gAMAwEAAhEDEQA/AJspYRCLrD9njYBV0elG+J9XQ9VntRZzexbMhMlZJ4o4tL6SA33YPd2D7ys/Jd4huDITs1R9cosBQU2+pa+yOwj9ru6N0fsZg0fl721Qp7VJIKFtocQlqyoBIQBVWCeRIP2cO64gR60FWWhIbW8sETpKQAAACBXz/n3jI03I3r4UUaiXJ4koKmFppJHRSe/YPRxhmbxlY1N2Jz3qn3t3t9dH2Ly3WnF/jIv0Dd1nSvh+ig6/cx5URotvJ1LbZKTXO1f0qvZAAAOMY/Yd9TT8Qky4sWciNMebbMtZCBxIHSR1Yv4xjGFT5UCaLgvrP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6468-960.jpg, /blog/prague-may-2014/IMG_6468-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6468-640.jpg, /blog/prague-may-2014/IMG_6468-1280.jpg 2x, /blog/prague-may-2014/IMG_6468-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6468-320.jpg, /blog/prague-may-2014/IMG_6468-640.jpg 2x, /blog/prague-may-2014/IMG_6468-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6468-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGBP/EACYQAAIBBAEDBAMBAAAAAAAAAAECAwAEBRESBiExEyNBYQciUeH/xAAVAQEBAAAAAAAAAAAAAAAAAAADAv/EABkRAQEBAQEBAAAAAAAAAAAAAAABAhEiYf/aAAwDAQACEQMRAD8A6/x1kLbGZySGZypyHtJvWuSnY7/eyBW1y2WsVu1gF76WTjPtKo2f2HYEfO9Vg7jo63TJxepeSzrE/NmReJZuW9eT27VZu+mosj1nFmLaa5hkmnV5A/EooCkbHg/yis+l1y3q/bpOYgRdOu+5HE+aVVhw4RdC8i+/b/2lV6RblMtFXQbiNk7qtbIjuu1A2filKqD01sMEUMYREUAfXmlKU43/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6487-960.jpg, /blog/prague-may-2014/IMG_6487-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6487-640.jpg, /blog/prague-may-2014/IMG_6487-1280.jpg 2x, /blog/prague-may-2014/IMG_6487-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6487-320.jpg, /blog/prague-may-2014/IMG_6487-640.jpg 2x, /blog/prague-may-2014/IMG_6487-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6487-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGBAf/xAAmEAABAwMDBAIDAAAAAAAAAAABAgMEABESBSExBhNBkTJRFGGB/8QAGAEAAgMAAAAAAAAAAAAAAAAAAgMAAQT/xAAbEQACAwEBAQAAAAAAAAAAAAAAAQIDESESMf/aAAwDAQACEQMRAD8A3XRgfhQexKlfkFJAS6ecSfiT+vut4zKaWhQQQXBtavD9M6hToLiYL7LEeMAVNlbueaU8Dm+V/G9qqs9WvtmdIRGc7aWV4FHBvYDH7G43rPXKdfM+jrIKb0o9RapBOpqOpLY72IASBkEJGwF/fulYKFrMWLFbC5EcqcHcJdSlSySfJI58fylTy2M1Lhw6RpsWClKmGgXLfNZyV7NU57Tb7Tanm0LU2ckFQuUn7FKU0pkiRp8cpYOA3bBt7pSlGAf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6480-960.jpg, /blog/prague-may-2014/IMG_6480-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6480-640.jpg, /blog/prague-may-2014/IMG_6480-1280.jpg 2x, /blog/prague-may-2014/IMG_6480-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6480-320.jpg, /blog/prague-may-2014/IMG_6480-640.jpg 2x, /blog/prague-may-2014/IMG_6480-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6480-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwT/xAAnEAABAgUDBAIDAAAAAAAAAAABAgMABAUREhMhMQYUUWEVQSJScf/EABcBAQEBAQAAAAAAAAAAAAAAAAAEAQP/xAAgEQEAAQMDBQAAAAAAAAAAAAABAAIDIQQREhMxQWHw/9oADAMBAAIRAxEAPwDbexxSpZLSABc8mwimNO68mmZW/WcnBlmgkjfLgZbDbb0PcSlU6p+NnZKnuMtvLnGwA62qwSog3J5/HaMu6jVVF1psa2nJtspSy6ZggWXyoDlW1xaOOr1Bx3i1a6e6y2uVWTbUUCt1Vsp2IxSq/v1/IRQafQlzLbhl2rpQsoNpv75/YefuESUVX0EMfe4bp5myyzaBinBOPFrC1vEdUzSpJDDJEu2dJKW0BQvikHgXhCLEEzB3ka503SnnVudrpqUbkNOKQCfNgbQhCNMQz//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6489-960.jpg, /blog/prague-may-2014/IMG_6489-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6489-640.jpg, /blog/prague-may-2014/IMG_6489-1280.jpg 2x, /blog/prague-may-2014/IMG_6489-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6489-320.jpg, /blog/prague-may-2014/IMG_6489-640.jpg 2x, /blog/prague-may-2014/IMG_6489-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6489-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcCAwYI/8QAJhAAAQMCBgAHAAAAAAAAAAAAAQACAwQhBRESMUFhBhMUUVJx0f/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAH/xAAgEQABBAEEAwAAAAAAAAAAAAABAAIDERQEBRIhMUGR/9oADAMBAAIRAxEAPwD0BmPdZAkc2UHkdiUVUyVtZSyU7wHhjoiwvttYm3fa1yVWNxeZVNlj9M51o2lzgyx2vtblZksR4U3nj0r8HdIoe7GMUZkHvkidpBLQM9x9ohy404bdMRYr6pvN4txYiB5liJiILQYm88Hq2y7ivn1YHRVckUUk1UG6yW5C4zsBkERImaA3oKrSvcZKJSkniMRJoqUkn4H9RESw0H0qHSPBoFf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6520-960.jpg, /blog/prague-may-2014/IMG_6520-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6520-640.jpg, /blog/prague-may-2014/IMG_6520-1280.jpg 2x, /blog/prague-may-2014/IMG_6520-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6520-320.jpg, /blog/prague-may-2014/IMG_6520-640.jpg 2x, /blog/prague-may-2014/IMG_6520-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6520-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMFBgf/xAAmEAABAwIFAwUAAAAAAAAAAAABAAIDBBEFBhITIRQxQRYiMlFh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAMBAv/EABoRAQEAAgMAAAAAAAAAAAAAAAABEmECEUH/2gAMAwEAAhEDEQA/AO/slBHBHHB/FIHg+VyDJ+D49QQapsyzNkdNuS6Y2v3eRcku8kBat1NiUsjXeoa1oBuWtjiAIuePj9WC7nPSdnXrZm57ORYCWgx5xG3m2rYALEdPH3RbmY7UVFWzAD3K4iqpdNy65RFJSxG+rl1dwiIg/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6502-960.jpg, /blog/prague-may-2014/IMG_6502-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6502-640.jpg, /blog/prague-may-2014/IMG_6502-1280.jpg 2x, /blog/prague-may-2014/IMG_6502-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6502-320.jpg, /blog/prague-may-2014/IMG_6502-640.jpg 2x, /blog/prague-may-2014/IMG_6502-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6502-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgcE/8QALRAAAQMCAwYEBwAAAAAAAAAAAQIDBAARBRITBhQhJDFhIkGS0SMyUVJxgaL/xAAYAQADAQEAAAAAAAAAAAAAAAABAgMABP/EABsRAAICAwEAAAAAAAAAAAAAAAABAhITIVGB/9oADAMBAAIRAxEAPwDo4YxLMyAuGTmcQOXWL/1w/FQFvFCUpvFCVNKHBhdwB5/N17VjMBf2jxpETdMXiOOJjPpkjOtPx+OmoAgeG1un7Br3HBtsgwA5PjbzuBFw8bCQD1uBYA8O3aoXiP6X8gYhdtSnIqSpAJAjuEfT7+1KzU3Z7bqUphyFjkGKnRQHG1kLOplGc3V5Xv2pRsja6dACIypJeMGLrKSEleQ3IHQdak1WyDysf0n3pSuFxi9tEyv38G94cT0H3pSlLjjwJ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6490-960.jpg, /blog/prague-may-2014/IMG_6490-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6490-640.jpg, /blog/prague-may-2014/IMG_6490-1280.jpg 2x, /blog/prague-may-2014/IMG_6490-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6490-320.jpg, /blog/prague-may-2014/IMG_6490-640.jpg 2x, /blog/prague-may-2014/IMG_6490-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6490-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwED/8QAKRAAAQMDAgYABwAAAAAAAAAAAQIDBAARIQUxBhITQVFhBxQjMnGx8P/EABYBAQEBAAAAAAAAAAAAAAAAAAMCAf/EABsRAAICAwEAAAAAAAAAAAAAAAABAhEDEjFB/9oADAMBAAIRAxEAPwDaJnFujxT9R9xYABKm2lKAB2P9tUJxDxV83Ij6foa2ZSJTRK1J+4D14Hk2xWXy+PJpbltR9MeS40yXlI5gQMWNvOb2Fu3upL4fauyuDqinz057bpQ44pATzg3sAfAIItRSyzcRY4oplp0/QYM9DypqXXX2nC0ohRSkWthPrO/fNKMssSWkuPRGnFnHNkE/m3elEmq4U976VaI0h9IkOjmecAClX3HivTooakvdMEc2VZ3NKVfhkenLgk4O/ZSh+jSlKikLZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6584-960.jpg, /blog/prague-may-2014/IMG_6584-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6584-640.jpg, /blog/prague-may-2014/IMG_6584-1280.jpg 2x, /blog/prague-may-2014/IMG_6584-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6584-320.jpg, /blog/prague-may-2014/IMG_6584-640.jpg 2x, /blog/prague-may-2014/IMG_6584-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6584-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAwX/xAApEAACAQMDAwEJAAAAAAAAAAABAgMABBEFEiEGMUETFBYiIyUyUWLB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIDBP/EABoRAAMBAQEBAAAAAAAAAAAAAAABAgMxEWH/2gAMAwEAAhEDEQA/ALL73aSmz1bn0y7bUDxsN/OOOOa9HVNTj02y9pnjdl3KgVMZYscADNRiDrjQtKlngxGp3FPhiLBSMfgY755rhrPV089hAlwt0unq29VGEBA7EMefOaD1tdQyyiuMplz1RetKTa2lvHF2xcFg2fPbxmlSaz1rp24tYpHMrPtAYhickDnzSovTT6Oogy6dK6bd2r3GJ4WaSQbYpm2gB8AAHPitdp5+lLav8yOCMIpfkkY80pWhkyOatbJC9uEZ8NFn7v2YfylKUCniP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6588-960.jpg, /blog/prague-may-2014/IMG_6588-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6588-640.jpg, /blog/prague-may-2014/IMG_6588-1280.jpg 2x, /blog/prague-may-2014/IMG_6588-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6588-320.jpg, /blog/prague-may-2014/IMG_6588-640.jpg 2x, /blog/prague-may-2014/IMG_6588-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6588-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUHBgj/xAAoEAACAgIBAgQHAQAAAAAAAAABAgMRAAQFEiETIjFBBgcUUWGBkbH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAH/xAAeEQACAQMFAAAAAAAAAAAAAAAAAQIDERMxUWGx0f/aAAwDAQACEQMRAD8A35ZSqdvMPuDeBsxlyljrFErfcXnnpfikw7ketqzbn1kIsRL1qTIVC0B7dzVH19sqR8vzU+1r8nJPQWU6jKvU1lLJ7rdnzMP1k6rSu0Zi5NzLi/XGY+vKGS3Ee4/UbJXxSP8AMZZo79+GY5ETg1TlPmLvSbSL4mvEJA69i1OKB/AoVVZ1yRBNWPw2aMmdpiyHpPUWsntjGHVFjqWdnjNKed5JdZGkY2xsi/4cYxiA3Z//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6611-960.jpg, /blog/prague-may-2014/IMG_6611-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6611-640.jpg, /blog/prague-may-2014/IMG_6611-1280.jpg 2x, /blog/prague-may-2014/IMG_6611-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6611-320.jpg, /blog/prague-may-2014/IMG_6611-640.jpg 2x, /blog/prague-may-2014/IMG_6611-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6611-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwj/xAAoEAACAQMDAgUFAAAAAAAAAAABAgADBAUGERMSISIjMUGhMlFhcZH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQD/xAAcEQEBAAAHAAAAAAAAAAAAAAABAAIDERMyQVH/2gAMAwEAAhEDEQA/AOgQwA9v7AfczJDqjUasQ11hTTO3iTr6gP13B95Y7TKZxqxNQ4vhP0bcm7fn1iGYMThSvYaJldxnNf8AJ5Vngaa/blZvkxJuHltGrOtcrf29PHJZ3T23NVZahpqpLALvt3B+JM4Go9GxpEMzOw3ZnJJJiIXc7xp5K7lR3EREsd//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/prague-may-2014/IMG_6607-960.jpg, /blog/prague-may-2014/IMG_6607-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/prague-may-2014/IMG_6607-640.jpg, /blog/prague-may-2014/IMG_6607-1280.jpg 2x, /blog/prague-may-2014/IMG_6607-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/prague-may-2014/IMG_6607-320.jpg, /blog/prague-may-2014/IMG_6607-640.jpg 2x, /blog/prague-may-2014/IMG_6607-960.jpg 3x\" src=\"/blog/prague-may-2014/IMG_6607-320.jpg\" alt=\"Prague, May 2014\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>I am already looking forward to my trips to Stockholm and Hamburg in July.</p>",
            "url": "/blog/prague-may-2014/",
            "title": "Prague, May 2014",
            "date_modified": "2014-06-09T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/buliding-symfony2-with-gulp/",
            "content_html": "<p>Today <a href=\"https://twitter.com/webmozart/status/502808064542912512\">Bernhard asked on Twitter</a> where we see asset handling going and I replied that <a href=\"http://gruntjs.com\">Grunt</a> or <a href=\"http://gulpjs.com\">Gulp</a> will take over. I am currently using Grunt in some of my projects (including to build this website) and Gulp for some smaller stuff. However, I wanted to move one of my larger Symfony 2 projects from Grunt to Gulp for a while now and I took the discussion on Twitter as a reason to finally do it. In this article I want to explain some of the aspects of using Gulp (and Bower) in a Symfony 2 project.</p>\n<p>I use Gulp not only for building my assets but also to run my tests, code coverage and checkstyle and I will tackle all these aspects in these article.</p>\n<h2>Table of Contents</h2>\n<ul>\n<li><a href=\"#dependencies\">Dependencies</a></li>\n<li><a href=\"#project-structure\">Project Structure</a></li>\n<li><a href=\"#gulp\">Gulp</a></li>\n<li><a href=\"#stylesheets\">Stylesheets</a>\n<ul>\n<li><a href=\"#stylesheets-with-sass\">Stylesheets with Sass</a></li>\n<li><a href=\"#managing-assets-with-bower\">Managing Assets with Bower</a></li>\n<li><a href=\"#using-bootstrap\">Using Bootstrap</a></li>\n<li><a href=\"#building-stylesheets\">Building Stylesheets</a></li>\n<li><a href=\"#gylphicons\">Gylphicons</a></li>\n</ul>\n</li>\n<li><a href=\"#javascript\">JavaScript</a>\n<ul>\n<li><a href=\"#load-javascript-using-requirejs\">Load JavaScript using RequireJS</a></li>\n<li><a href=\"#building-javascript\">Building JavaScript</a></li>\n</ul>\n</li>\n<li><a href=\"#watching-and-reloading\">Watching &#x26; Reloading</a>\n<ul>\n<li><a href=\"#watching\">Watching</a></li>\n<li><a href=\"#reloading\">Reloading</a></li>\n</ul>\n</li>\n<li><a href=\"#running-php-commands\">Running PHP Commands</a>\n<ul>\n<li><a href=\"#phpunit\">PHPUnit</a></li>\n<li><a href=\"#php-codesniffer\">PHP_CodeSniffer</a></li>\n<li><a href=\"#symfony2-commands\">Symfony2 Commands</a></li>\n</ul>\n</li>\n<li><a href=\"#roadmap\">Roadmap</a></li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n<li><a href=\"#updates\">Updates</a></li>\n</ul>\n<h2>Dependencies</h2>\n<p>First I need to talk about the software and libraries I am using in my project and that are relevant to this article.</p>\n<ul>\n<li><strong><a href=\"http://gulpjs.com\">Gulp</a></strong> to run tasks (along with a bunch of Gulp plugins and other Node.js modules)</li>\n<li><strong><a href=\"http://bower.io\">Bower</a></strong> to install and manage assets</li>\n<li><strong><a href=\"http://sass-lang.com\">Sass</a></strong></li>\n<li><strong><a href=\"http://www.requirejs.org\">RequireJS</a></strong> to dynamically load JavaScript files</li>\n<li><strong><a href=\"http://getbootstrap.com\">Bootstrap</a></strong> as a frontend framework</li>\n<li><strong><a href=\"http://jquery.com\">jQuery</a></strong> because I am familiar with it and Bootstrap requires it anyway</li>\n<li><strong><a href=\"http://phpunit.de\">PHPUnit</a></strong> to run my tests and code coverage</li>\n<li><strong><a href=\"https://github.com/squizlabs/PHP_CodeSniffer\">PHP_CodeSniffer</a></strong> to check the style of my PHP code</li>\n</ul>\n<p><em><strong>Please note</strong> that this article has been updated to reflect the changes in the directory structure in <a href=\"https://github.com/twbs/bootstrap-sass/releases/tag/v3.2.0\">boostrap-sass v3.2</a></em></p>\n<h2>Project Structure</h2>\n<p>Every Symfony2 project (that uses the standard edition) has the same basic structure. However, since it is a backend framework it gives you little guidance on how to organise assets. Per convention Symfonys <code class=\"language-text\">assets:install</code> command will copy everything from a bundles <code class=\"language-text\">Resources/public</code> directory into the <code class=\"language-text\">web/</code> folder of the project. I am using this convention to make dealing with assets path in my Sass, JavaScript and Gulp files easier. Here are the parts of my project structure that are relevant to this article:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">- src/Bundle/\n    - AcmeDemo/\n        - Resources/public/\n            - js/\n            - sass/\n    - AcmeFrontendBundle/\n        - Resources/public/\n            - js/\n            - sass/\n    - AcmeUserBundle/\n        - Resources/public\n            - js/\n            - sass/\nweb/\n    - bundles/\n    - components/\n    - css/\n    - fonts/\n    - js/\nGulpfile.js</code></pre></div>\n<p>If I run the <code class=\"language-text\">assets:install --symlink</code> command, Symfony will create symlinks from the <code class=\"language-text\">web/bundles/</code> directory to the <code class=\"language-text\">public</code> directory in the corresponding bundle for me. With my structure the <code class=\"language-text\">web/bundles/</code> directory looks like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">- web/bundles/\n    - acmedemo/\n    - acmefrontend/\n    - acmeuser/</code></pre></div>\n<p>I think it is obvious that the <code class=\"language-text\">web/css/</code> directory will hold the compiled CSS files, <code class=\"language-text\">web/fonts/</code> the font files and <code class=\"language-text\">web/js/</code> the JavaScript files. The <code class=\"language-text\">web/components/</code> directory stores the assets downloaded by Bower and I will take little bit more about it later.</p>\n<h2>Gulp</h2>\n<p>If you have never worked with Gulp and need to know how to install it and learn more about the basic concepts you can either head to the <a href=\"https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md#getting-started\">Getting Started guide</a> or the <a href=\"http://www.smashingmagazine.com/2014/06/11/building-with-gulp/\">Building with Gulp</a> article on Smashing Magazine. In short, you can install Gulp using <a href=\"https://www.npmjs.org\">NPM</a>.</p>\n<p>You need to install Gulp both globally and locally in your project:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-g</span> gulp\n$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev gulp</code></pre></div>\n<p>Now you can create a <code class=\"language-text\">Gulpfile.js</code> and require the <code class=\"language-text\">gulp</code> module:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> gulp <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'default'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Stylesheets</h2>\n<p>First I want to talk about managing and building the stylesheets for my project.</p>\n<h3>Stylesheets with Sass</h3>\n<p>Sass has great features that make it superior to plain CSS and one of them is the ability to define variables. However, if I compile the different Sass files separately and concatenate them later I can't reference variables from different source files. Because I want a single Sass file anyway I use the <code class=\"language-text\">import</code> statement to include them into a single master file. I place a <code class=\"language-text\">master.scss</code> in every bundle and import every <code class=\"language-text\">.scss</code> file of the bundle. The <code class=\"language-text\">master.scss</code> of the <em>AcmeFrontendBundle</em> includes the <code class=\"language-text\">master.scss</code> from every other bundle. It looks like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// src/Acme/Bundle/FrontendBundle/Resources/public/sass/master.scss</span>\n\n<span class=\"token keyword\">@import</span> <span class=\"token string\">'../../acmeuser/sass/master'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">@import</span> <span class=\"token string\">'../../acmeother/sass/master'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Managing Assets with Bower</h3>\n<p>Before I can talk about how I use Bootstrap I need to talk about Bower. The first thing with Bower I did was changing the default download directory by creating a <code class=\"language-text\">.bowerrc</code> file.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"directory\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"web/components\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Then I downloaded <code class=\"language-text\">bootstrap-sass-official</code> (as the name says the official Sass port of Bootstrap) using <code class=\"language-text\">bower install --save bootstrap-sass-official</code>.</p>\n<h3>Using Bootstrap</h3>\n<p>I use my <a href=\"http://bootstrap.braincrafted.com\">BraincraftedBootstrapBundle</a> to integrate Bootstrap into Symfony. However, I disabled the auto configuration feature for Assetic because I want to configure it myself using Bower and Gulp and therefore it's not relevant if you use the bundle or not. Bower downloads the Sass files into <code class=\"language-text\">components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap/</code> and I just import it from my <code class=\"language-text\">master.scss</code> in <em>AcmeFrontendBundle</em>. Remember that the <code class=\"language-text\">assets:install</code> commands copies the files into <code class=\"language-text\">web/bundles/</code> and the compilation takes place there.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// src/Acme/Bundle/FrontendBundle/Resources/public/sass/master.scss</span>\n\n<span class=\"token keyword\">@import</span> <span class=\"token string\">'../../../components/bootstrap-sass-official/assets/stylesheets/_bootstrap'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">@import</span> <span class=\"token string\">'../../acmeuser/sass/master'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">@import</span> <span class=\"token string\">'../../acmeother/sass/master'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Building Stylesheets</h3>\n<p>Finally I have reached a point where we can talk about building the stylesheets, that is, compiling Sass into CSS code. To actually compile Sass I use <a href=\"https://github.com/dlmanning/gulp-sass\">gulp-sass</a> and the Node.js port of Sass (it's faster).</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev gulp-sass</code></pre></div>\n<p>Because of the way how I import everything I need into my master Sass file the code for the Gulp task remains small and simple.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\n<span class=\"token keyword\">var</span> sass <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>sass <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-sass'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'sass'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./web/bundles/acmefrontend/sass/master.scss'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">sass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">sourceComments</span><span class=\"token operator\">:</span> <span class=\"token string\">'map'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>gulp<span class=\"token punctuation\">.</span><span class=\"token function\">dest</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./web/css/'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>First I need to symlink the assets into <code class=\"language-text\">web/bundles/</code> by running <code class=\"language-text\">php app/console assets:install --symlink</code>. Executing the task with <code class=\"language-text\">gulp sass</code> will compile the stylesheets from all bundles and Bootstrap and saves them in <code class=\"language-text\">web/css/master.css</code>. In my project I have a layout template in my frontend bundle where I can now include this stylesheet.</p>\n<div class=\"gatsby-highlight\" data-language=\"twig\"><pre class=\"language-twig\"><code class=\"language-twig\"><span class=\"token comment\">&#x3C;!-- src/Acme/Bundle/FrontendBundle/Resources/views/layout.html.twig --></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span><span class=\"token twig language-twig\"><span class=\"token delimiter punctuation\">{{</span> asset<span class=\"token punctuation\">(</span>&#x26;#<span class=\"token number\">39</span>;<span class=\"token operator\">/</span>css<span class=\"token operator\">/</span>master<span class=\"token punctuation\">.</span>css&#x26;#<span class=\"token number\">39</span>;<span class=\"token punctuation\">)</span> <span class=\"token delimiter punctuation\">}}</span></span><span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Everything regarding stylesheets should work now; except the Glyphicons provided by Bootstrap.</p>\n<h3>Gylphicons</h3>\n<p>Bootstrap includes Glyphicons, an icon font, in its stylesheets by referencing them with <code class=\"language-text\">bootstrap/</code>. However, the font files are located in <code class=\"language-text\">web/components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/</code> and the CSS code in <code class=\"language-text\">web/css/</code>. I could just change the path to point to <code class=\"language-text\">web/components</code>, but I am picky when it comes to path and how they look (what if somebody checks the source?) and therefore I copy them into the <code class=\"language-text\">web/fonts/</code> directory using a Gulp task. The <a href=\"https://github.com/klaascuvelier/gulp-copy\">gulp-copy</a> plugin provides exactly the functionality I require. It has a <code class=\"language-text\">prefix</code> option that removes the unwanted directories from the beginning of source path.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\n<span class=\"token keyword\">var</span> copy <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>copy <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-copy'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fonts'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./web/components/bootstrap-sass-official/assets/fonts/bootstrap/*'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">copy</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./web/fonts'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">prefix</span><span class=\"token operator\">:</span> <span class=\"token number\">7</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>However, the path is still wrong, instead of <code class=\"language-text\">bootstrap/</code> it should be <code class=\"language-text\">../fonts/</code>. Luckily Bootstrap uses a variable for this path and I can change it by adding the following line before importing Bootstrap into my Sass.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// src/Acme/Bundle/FrontendBundle/Resources/public/sass/master.scss</span>\n\n<span class=\"token property\"><span class=\"token variable\">$icon-font-path</span></span><span class=\"token punctuation\">:</span> <span class=\"token string\">'../fonts/'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Running <code class=\"language-text\">gulp fonts sass</code> will execute both the <code class=\"language-text\">fonts</code> and the <code class=\"language-text\">sass</code> task and now everything should work fine.</p>\n<h2>Javascript</h2>\n<p>I use RequireJS as module and file loader for my project to load only those scripts dynamically that a specific page requires. The entry point of the JavaScript is <code class=\"language-text\">app.js</code> in <em>AcmeFrontendBundle</em>. Each bundle has it's own <code class=\"language-text\">main.js</code> that itself requires the files and modules it needs.</p>\n<h3>Load JavaScript using RequireJS</h3>\n<p>The <code class=\"language-text\">app.js</code> also needs to configure jQuery and the jQuery plugins provided by Bootstrap, because these don't have RequireJS modules defined.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/Acme/Bundle/FrontendBundle/Resources/public/js/app.js</span>\n\nrequire<span class=\"token punctuation\">.</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">paths</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">bootstrap</span><span class=\"token operator\">:</span> <span class=\"token string\">'../../bootstrap'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">jquery</span><span class=\"token operator\">:</span> <span class=\"token string\">'../../jquery'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">shim</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">'bootstrap/affix'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.affix'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/alert'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.alert'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/button'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.button'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/carousel'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.carousel'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/collapse'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.collapse'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/dropdown'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.dropdown'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/modal'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.modal'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/popover'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.popover'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/scrollspy'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.scrollspy'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/tab'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.tab'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/tooltip'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.tooltip'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">'bootstrap/transition'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">exports</span><span class=\"token operator\">:</span> <span class=\"token string\">'$.fn.transition'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'main'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The interesting part in the above code is the last line: it tells RequireJS to load the <code class=\"language-text\">main.js</code> file in the same directory. Currently I don't have a lot of JavaScript code in my project, but the following code from <code class=\"language-text\">main.js</code> enabled Bootstrap alert messages.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/Acme/Bundle/FrontendBundle/Resources/public/js/main.js</span>\n\n<span class=\"token function\">define</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">require</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'bootstrap/alert'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.alert'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>But what about JavaScript code from other bundles you might ask? I added an entry to the <code class=\"language-text\">paths</code> option in <code class=\"language-text\">app.js</code> and then require it at the bottom of the file.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/Acme/Bundle/FrontendBundle/Resources/public/js/app.js</span>\n\nrequire<span class=\"token punctuation\">.</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">paths</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n    <span class=\"token literal-property property\">acmeuser</span><span class=\"token operator\">:</span> <span class=\"token string\">'../../acmeuser/js'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">shim</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'main'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'acmeuser/main'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">main.js</code> of the <em>AcmeUserBundle</em> can now require other modules.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/Acme/Bundle/UserBundle/Resources/public/js/main.js</span>\n\n<span class=\"token function\">define</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">require</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'jquery'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.alert'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">addClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hello-world'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Building JavaScript</h3>\n<p>Actually, in my current setup I don't really build JavaScript files. Because I use RequireJS I don't have to concatenate them; I just copy them into <code class=\"language-text\">web/js/</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'js'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n      <span class=\"token string\">'./web/bundles/*/js/**/*.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./web/components/bootstrap-sass-official/assets/javascripts/bootstrap/*.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./web/components/jquery/dist/jquery.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./web/components/requirejs/require.js'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>gulp<span class=\"token punctuation\">.</span><span class=\"token function\">dest</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./web/js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Watching and Reloading</h2>\n<p>It can become tedious to execute the <code class=\"language-text\">sass</code> and <code class=\"language-text\">js</code> tasks everytime the code of the Sas or JavaScript code changes. Therefore Gulp includes, as most modern build tools do, a watch functionality. In addition I use LiveReload to automatically reload my browser window when the CSS or JavaScript changes.</p>\n<h3>Watching</h3>\n<p>Gulp includes the <code class=\"language-text\">watch()</code> function by default. I use a glob pattern to watch Sass and JavaScript files separately. Of course it would be possible to use only one watcher for both, but then the JavaScript task would run even if only a stylesheets was changed.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'watch'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> <span class=\"token function-variable function\">onChange</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'File '</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>path <span class=\"token operator\">+</span> <span class=\"token string\">' has been '</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">watch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./src/Acme/Bundle/*/Resources/public/sass/**/*.scss'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'sass'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'change'</span><span class=\"token punctuation\">,</span> onChange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">watch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./src/Acme/Bundle/*/Resources/public/js/**/*.js'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'js'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'change'</span><span class=\"token punctuation\">,</span> onChange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Reloading</h3>\n<p>LiveReload is a great tool to reload the browser window when a file changes. First I install the <a href=\"https://github.com/vohof/gulp-livereload\">gulp-livereload</a> plugin and then I include a snippet in my layout. It's also possible to use a browser extension, but I prefer having everything I need in the repository. After installing the plugin I need to adapt the code of the <code class=\"language-text\">watch</code> task to inform LiveReload about the changed files.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\n<span class=\"token keyword\">var</span> livereload <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-livereload'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'watch'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> <span class=\"token function-variable function\">onChange</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'File '</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>path <span class=\"token operator\">+</span> <span class=\"token string\">' has been '</span> <span class=\"token operator\">+</span> event<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Tell LiveReload to reload the window</span>\n    livereload<span class=\"token punctuation\">.</span><span class=\"token function\">changed</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// Starts the server</span>\n  livereload<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">watch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./src/Tvst/Bundle/*/Resources/public/sass/**/*.scss'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'sass'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'change'</span><span class=\"token punctuation\">,</span> onChange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">watch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./src/Tvst/Bundle/*/Resources/public/js/**/*.js'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'js'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'change'</span><span class=\"token punctuation\">,</span> onChange<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In the layout I test if the environment is <code class=\"language-text\">dev</code> and then include the LiveReload snippet.</p>\n<div class=\"gatsby-highlight\" data-language=\"twig\"><pre class=\"language-twig\"><code class=\"language-twig\">// src/Acme/Bundle/FrontendBundle/Resources/views/layout.html.twig\n\n</code></pre></div>\n<h2>Running PHP Commands</h2>\n<p>I use Gulp also to run PHP-specific tasks and PHPUnit and PHP_CodeSniffer are just two of them. Because a <code class=\"language-text\">Gulpfile.js</code> is just a JavaScript file executed using Node.js I can run arbitrary shell commands.</p>\n<h3>PHPUnit</h3>\n<p>I use the <a href=\"https://github.com/mikeerickson/gulp-phpunit\">gulp-phpunit</a> plugin by Mike Erickson to run PHPUnit using Gulp.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev gulp-phpunit</code></pre></div>\n<p>I use the <code class=\"language-text\">task()</code> function to create a new task with the name <code class=\"language-text\">test</code>. The <code class=\"language-text\">src()</code> function allows me to use a glob pattern to select the files I want to test. <em>If you use another directory structure you need to adapt this pattern.</em></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\n<span class=\"token keyword\">var</span> phpunit <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>phpunit <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-phpunit'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'test'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> gulp<span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./src/Acme/Bundle/*/Tests/**/*.php'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">phpunit</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./bin/phpunit'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">debug</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">configurationFile</span><span class=\"token operator\">:</span> <span class=\"token string\">'./app/phpunit.xml'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>I can execute the task using <code class=\"language-text\">gulp test</code>. The <code class=\"language-text\">gulp-phpunit</code> plugin provides a wide range of options. I also create a code coverage report.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'coverage'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> gulp<span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./src/Tvst/Bundle/*/Tests/**/*.php'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">phpunit</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./bin/phpunit'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">debug</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">configurationFile</span><span class=\"token operator\">:</span> <span class=\"token string\">'./app/phpunit.xml'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">coverageHtml</span><span class=\"token operator\">:</span> <span class=\"token string\">'./build/coverage'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>PHP_CodeSniffer</h3>\n<p>To run PHP_CodeSniffer I use the <a href=\"https://github.com/JustBlackBird/gulp-phpcs\">gulp-phpcs</a> plugin by Dmitriy S. Simushev.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\n<span class=\"token keyword\">var</span> phpcs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-phpcs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'checkstyle'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'src/Tvst/Bundle/**/*.php'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">phpcs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">bin</span><span class=\"token operator\">:</span> <span class=\"token string\">'./bin/phpcs'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">standard</span><span class=\"token operator\">:</span> <span class=\"token string\">'PSR2'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">warningSeverity</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>phpcs<span class=\"token punctuation\">.</span><span class=\"token function\">reporter</span><span class=\"token punctuation\">(</span><span class=\"token string\">'log'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>I also created a shortcut to execute both <code class=\"language-text\">coverage</code> and <code class=\"language-text\">checkstyle</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'verify'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'coverage'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'checkstyle'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Symfony2 Commands</h3>\n<p>During my build process I also need to run Symfony2 commands. Instead of using a plugin I use the <code class=\"language-text\">child_process</code> module that comes with Node.js to execute Shell commands. Because the Gulpfile consists of plain JavaScript code there exists no need to use a specific plugin.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Gulpfile.js</span>\n\n<span class=\"token keyword\">var</span> exec <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'child_process'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>exec<span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'installAssets'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">exec</span><span class=\"token punctuation\">(</span><span class=\"token string\">'php app/console assets:install --symlink'</span><span class=\"token punctuation\">,</span> logStdOutAndErr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Without this function exec() will not show any output</span>\n<span class=\"token keyword\">var</span> <span class=\"token function-variable function\">logStdOutAndErr</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">err<span class=\"token punctuation\">,</span> stdout<span class=\"token punctuation\">,</span> stderr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>stdout <span class=\"token operator\">+</span> stderr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>You can see that I created a Gulp task to run the install assets commands. I can integrate this task into other tasks and thus I will not forget to run it when building my assets. In my Gulpfile I also have tasks to load fixtures and update the database schema.</p>\n<h2>Roadmap</h2>\n<p>The project I am using this build system for is not yet in production and therefore there are still some things missing. First of all I haven't added minification of CSS and JavaScript to the Gulpfile. Another problem I have with the current setup is that the <code class=\"language-text\">components/</code> and <code class=\"language-text\">bundles/</code> directories reside in <code class=\"language-text\">web/</code> and are accessible by users. Before going into production I want to move these two directories somewhere else.</p>\n<p>Another problem that could become relevant when my stylesheets become bigger is that every change in a <code class=\"language-text\">.scss</code> file will cause a compilation of all Sass code (including Bootstrap). I might need to figure out a way to compile, for examples, bundles separately and concatenate them only for production.</p>\n<p>My Gulpfile still misses some other smaller things. For example, I want to use <a href=\"http://csscomb.com\">CSSComb</a> to sort the properties in the stylesheets and I want to integrate <a href=\"https://github.com/postcss/autoprefixer\">Autoprefixer</a> to automatically add vendor prefixes to CSS properties. Linting of Sass and JavaScript code is also missing.</p>\n<h2>Conclusion</h2>\n<p>I'm satisfied with my current Gulp setup. As mentioned above it lacks some features I need to add before going in to production. The build system is fast, flexible and (hopefully) will scale well. It's not fully automatic, I have to add a little bit of configuration when creating a new bundle, but that happens not often and I prefer control over automation in these cases.</p>\n<p>The system is opinionated and it works well in my setup and with my project structure. If you have made different decisions about structure or need some other features there might be problems. Still I am happy about feedback regarding my system. I am new to Gulp and haven't used it in a production project so suggestions are very welcome.</p>\n<h2>Updates</h2>\n<ul>\n<li><em>3 November 2014:</em> Since the end of October I use <a href=\"/articles/frontend-dependencies-npm/\">NPM intead of Bower to manage frontend dependencies</a>.</li>\n<li><em>25 November 2014:</em> I updated the article to reflect the directory structure changes in <a href=\"https://github.com/twbs/bootstrap-sass/releases/tag/v3.2.0\">bootstrap-sass v3.2.0</a>.</li>\n</ul>",
            "url": "/blog/buliding-symfony2-with-gulp/",
            "title": "Building Symfony2 Applications with Gulp",
            "date_modified": "2014-08-22T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/console-import-standard-edition/",
            "content_html": "<p>Quite often I have to write a script that takes data from a source, filter and converts it and stores it some way. Nearly every time I use the great <a href=\"https://github.com/ddeboer/data-import\">data-import</a> library by David de Boer and the <a href=\"https://github.com/symfony/console\">Symfony Console</a> component. It annoyed me that I have to write some boilerplate code every single time and therefore I created <a href=\"https://github.com/florianeckerstorfer/console-import-standard\">Console Import Standard Edition</a>.</p>\n<p>Inspired by the Symfony Standard Edition it contains a basic directory structure, a <code class=\"language-text\">composer.json</code> with <code class=\"language-text\">ddeboer/data-import</code> and <code class=\"language-text\">symfony/console</code> as dependencies and a simple executable.</p>\n<p>You can bootstrap an import script project by using Composer and the following command:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ php composer.phar create-project florianeckerstorfer/console-import-standard-edition path/to/install</code></pre></div>\n<p>Then you only need to change the namespace and adapt the code inside the <code class=\"language-text\">ImportCommand</code> to fit your needs. The projects <a href=\"https://github.com/florianeckerstorfer/console-import-standard/blob/master/README.md\">README.md</a> contains more information on how to setup a project and customise it.</p>",
            "url": "/blog/console-import-standard-edition/",
            "title": "Console Import Standard Edition",
            "date_modified": "2014-08-27T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/inspirational-andy-dwyer-cli/",
            "content_html": "<p>On Friday I was procrastinating by reading some command line tricks articles and I encountered three commands I haven't noticed before: <a href=\"http://en.wikipedia.org/wiki/Fortune_(Unix)\"><code class=\"language-text\">fortune</code></a>, <a href=\"https://en.wikipedia.org/wiki/Cowsay\"><code class=\"language-text\">cowsay</code></a> and <a href=\"https://github.com/busyloop/lolcat\"><code class=\"language-text\">lolcat</code></a>. A little bit earlier someone also posted this <a href=\"http://www.buzzfeed.com/mrloganrhoades/if-andy-dwyer-quotes-were-motivational-posters#4hjk6yw\">Buzzfeed article with inspirational Andy Dwyer quotes</a> and one thing let to another.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 39.0625%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABlUlEQVR4nK2S207CQBCG9xV8Ba090QWlVTxQYEE8QOIBTxdeeMEDm4ix24I3xqYJ4RXK79QWJeqNrU2+zOw/u39mtsuiMBpOo+kwiVGU5RRns9kwDF+H02m6XhCGIWmLvZm2VGeelPD9AKPREx5Hj5C+j/F4gvAthPfsIQjGCKguiUSXnoSUPjwvPSdlgMnk5WOv5/lgXTGID8Rl3BbncVfcxB1xETdEL26Kfkqr/5Uva9/1TGN14w62fgrXuMeWdoZy6RiK7mBdtaHkgDm8hwpvI4m85KKy2YVVrsO0asTOn2GqWYVqOkiiZtjgFUGFPejmFrH9Z9jyIjXskOE+dCOnoVHawSdmjcYVlO/m75BvHMCqJLTBN7owuUudOrnMPgyTwxqNl5Lmec2yO6zhJwUMi4z3+0+h96aXakjigmIdKjY0ld4hRXWN8vViHTP79gTVwSGq10dw7nqoXh3D4NSlkdOQuw3wuotypwXeasKqNwqNzWjEOY081xQiy6m7ORVzwUy+ix9Y+WGrSvnhP2H0rfwn7xjlkXotnVx0AAAAAElFTkSuQmCC); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/inspirational-andy-dwyer-cli/login-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/inspirational-andy-dwyer-cli/login-320.png, /blog/inspirational-andy-dwyer-cli/login-640.png 2x\" src=\"/blog/inspirational-andy-dwyer-cli/login-320.png\" alt=\"Inspirational Andy Dwyer Quotes\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>To get inspirational Andy Dwyer quotes into your terminal you need four things: <code class=\"language-text\">fortune</code> (to display a quote), <code class=\"language-text\">cowsay</code> (to make a cow say the quote), <code class=\"language-text\">lolcat</code> (for the rainbow colouring) and, of course, the quotes. On a Mac you can use Homebrew to install <code class=\"language-text\">fortune</code> and <code class=\"language-text\">cowsay</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ brew install fortune cowsay</code></pre></div>\n<p><code class=\"language-text\">lolcat</code> is a Ruby program and can you can install it using RubyGems:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ sudo gem install lolcat</code></pre></div>\n<h2>Lolcat</h2>\n<p>Let's try these three programs out. <code class=\"language-text\">lolcat</code> is first.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 34.06249999999999%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACgUlEQVR4nK2TS08aURiGT5Mm/Q9dtAKKMGfOXBjkKhaKGKBWkYoX7mBBaWy0Xbhq0h/lhsRUNmqN7uzOpLT4D7qexduPU7Vqu2SSJ+/7XXPOSYYBePyQXq9H2ruOe3dy/+u7n2Mj/w4ODqrdbveW/f19qcO8pHujw/rd3vtzN7B+/zsGgwF+9Pu4uLjA+dkZTr+e4oy09+UQh4c9mTs5Oab6N1xeXlL9GEdHx9RzLueurga046eE7e7u2Y1Gx67VN+1KtWVXa227WHlrl4hiqWmvF+t2qdykeMOu1Fp2vblll4f18obsr9NsvbH1h2bHZul0Hs8cAk6HiQmXBafThNs1hXGXHy6Kx8f9cLpM6Yc1h8OHMZcOBzHm1PHcod2DpXgeNXMTMT2NV0YBGX0ZK3oLaaMGv5bCG/Mj+TLmjAqm9UUkjQ2YWgKKCEHVIv/AVrUq5tQlrIoG8oKGyGdEDS/FOsJqFpOKHx7CrVjSe3mAvA9uL8Ven8Tt8d169lpdQZqY4fN4oS4QBUTVHJa0HeS1bZg8iYC6CD/VNZ6ApWRgiSwMYxaGNQ/dNyQDzZiDbmbAsrRgXbQQ4lmEaFFW1MF5BCk65aLWQVyUkNE+IEE3CIgcUsY2Zq0OAv4FWME1hGNbiMTaCIRLiMTfg+VEmwapSayhoO9hQdukUyVoYQsGTyEqqsjpnzHNi5gxqpiN78CKFMC1JC1qyVNGZt7BP7UMK9kG03hMLlCUkFSuROAlL3hcekUJE5FrwlQL0juGJVzESCmvRmWsiGkwDz3yJJ+iRFDqMPby0LUGb/E8UOmVm56/yiYmzV+jZPg7fxoxrD5iWHTEsKcjhj0ZMezRKPkN80UZKTNv6vMAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/inspirational-andy-dwyer-cli/lolcat-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/inspirational-andy-dwyer-cli/lolcat-320.png, /blog/inspirational-andy-dwyer-cli/lolcat-640.png 2x\" src=\"/blog/inspirational-andy-dwyer-cli/lolcat-320.png\" alt=\"Output of the command lolcat in Terminal.app on Mac OS\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Cowsay</h2>\n<p>You can pipe input to <code class=\"language-text\">cowsay</code> to make it appear in a speak bubble on top of a cow. <code class=\"language-text\">cowsay</code> has some options to change the eyes and the tongue and even use a different animal, for example, a dragon.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ echo \"Hello World!\" | cowsay\n _____________\n&#x3C; Hello World >\n -------------\n        \\   ^__^\n         \\  (oo)\\_______\n            (__)\\       )\\/\\\n                ||----w |\n                ||     ||</code></pre></div>\n<h2>Fortune</h2>\n<p>If you call <code class=\"language-text\">fortune</code> without any arguments it will print a random quote.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ fortune\nFelson's Law:\n    To steal ideas from one person is plagiarism; to steal from\n    many is research.</code></pre></div>\n<p>The default database contains some pretty sexist quotes, as you sadly can expect from something written by white males. But I want to use my own database anyway. The format of a quotes file is pretty simple. You separate the quotes by a single <code class=\"language-text\">%</code> on a newline.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">My whole life is a giant mess and I love it\n-- Andy Dwyer\n%\nI know what things are.\n-- Andy Dwyer\n%\nYou're like an angel with no wings.\n-- Andy Dwyer</code></pre></div>\n<p>However, the <code class=\"language-text\">fortune</code> program reads compiled data files and we can use <code class=\"language-text\">strfile</code> to create these:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ strfile andy andy.dat</code></pre></div>\n<p>I can now call <code class=\"language-text\">fortune</code> with this quote file and it will only show quotes from the given file:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ fortune andy</code></pre></div>\n<p>You can also find these files in my <a href=\"https://github.com/florianeckerstorfer/dotfiles/tree/master/fortune\">dotfiles repository</a>. There is also a file with Tyrion Lannister quotes.</p>\n<h2>Piping it All Together</h2>\n<p>If I now call <code class=\"language-text\">fortune</code>, pipe the output into <code class=\"language-text\">cowsay</code> and then pipe its output into <code class=\"language-text\">lolcat</code> I get the result displayed in the first screenshot.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ fortune ~/dotfiles/fortune/andy | cowsay -s | lolcat</code></pre></div>\n<p>I placed this line in my <code class=\"language-text\">.bash_profile</code> file and now every time I open a terminal window I get an inspirational Andy Dwyer quote.</p>",
            "url": "/blog/inspirational-andy-dwyer-cli/",
            "title": "Inspirational Andy Dwyer Quotes For My Command Line",
            "date_modified": "2014-09-07T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/programming/",
            "content_html": "<p>When I first dabbled into writing software 15 years ago the world of programming was an easy place. When you would write on the internet that PHP is a programming language, someone would remind you that PHP is a scripting language because the computer interprets it instead of compiling it. You had scripting languages, like PHP, JavaScript or Python and programming languages like C, C++ or Java. It's not that easy anymore. Facebook created HipHop to compile PHP into C++ code (technically that's a <a href=\"http://en.wikipedia.org/wiki/Source-to-source_compiler\">transpiler</a>) and later switched to a <a href=\"http://en.wikipedia.org/wiki/Just-in-time_compilation\">Just-in-Time (JIT) compiler</a> called <a href=\"http://hhvm.com\">HHVM</a>. Google, Apple, Mozilla and Microsoft doing <a href=\"http://arstechnica.com/information-technology/2014/05/apple-integrates-llvm-compiler-to-boost-webkit-javascript-performance/\">crazy optimizations</a> to make JavaScript execution to run nearly as fast as native code.</p>\n<p>One of the consequences of these developments is that, for example, PHP does no longer mean the full stack of the programming language. You can write code in PHP syntax and interpret it with the official PHP interpreter or you can HHVM`s Just-in-Time compiler. Another example is <a href=\"https://www.dartlang.org\">Dart</a>, a language developed by Google that can run in a VM or you can transpile it to JavaScript to run in a browser. We need to separate the writing of the code (a human using the syntax of a language to create a program) from the execution of the code (a machine reading the code and converting it into a form understood by the hardware). The choice of programming language (or syntax) no longer gives us any indication how and where the code runs.</p>\n<p>If you write code in JavaScript you should be aware that this code might execute in a browser, or on a <a href=\"http://nginx.org\">server</a>, or on a <a href=\"https://github.com/rogerwang/node-webkit\">desktop computer</a> or in a <a href=\"https://cordova.apache.org\">native phone app</a>.</p>\n<p>Yesterday <a href=\"https://twitter.com/alicetragedy\">@alicetragedy</a> <a href=\"https://twitter.com/alicetragedy/status/510427598850363392\">tweeted</a> the following quote from <a href=\"https://twitter.com/patio11\">@patio11</a> from <a href=\"http://2014.frozenrails.eu\">Frozen Rails</a>.</p>\n<blockquote>\n<p>Ruby's just a tool. You'll never hear a lawyer say: I'm a Microsoft Word lawyer. Check out this contract! Copy, paste, nailed it!</p>\n</blockquote>\n<p>Exactly for this reason you don't see me describing myself as a <em>PHP Developer</em> but as a <em>Web Developer</em> or just <em>Developer</em>. I write most of my code in PHP and JavaScript and I have written code in Ruby, Python, Java, C and other languages before and I am quite confident that I can write any program in any <a href=\"http://en.wikipedia.org/wiki/Imperative_programming\">imperative programming</a> language (preferable with C-style syntax). I also did some <a href=\"http://en.wikipedia.org/wiki/Functional_programming\">functional programming</a>, but never enough that I could fully wrap my head around it. The concepts in all these programming languages are basically the same: functions, loops, conditionals and variables.</p>\n<p>I find the hard part of learning a new programming language is not the language itself, but the ecosystem. When I write software in PHP and have a specific task I often know the frameworks and libraries to help me, I know exactly where to look for them and if a library is good or bad. The boom of package repositories such as <a href=\"https://packagist.org\">Packagist</a>, <a href=\"https://www.npmjs.org\">NPM</a>, <a href=\"https://rubygems.org\">RubyGems</a>, <a href=\"http://cocoapods.org\">CocoaPod</a> and so on make it easier to find new packages but you need experience with the community, the language and the conventions of the language to judge if a package is useful, well written and well maintained. Connected to this is the fact that knowing a programming language does not enable you to write a \"big\" application in it. Often it's more effort to learn a new framework than a new language. Full-stack frameworks like <a href=\"http://symfony.com\">Symfony</a>, <a href=\"http://rubyonrails.org\">Rails</a> or <a href=\"https://www.djangoproject.com\">Django</a> are monsters with hundreds of APIs, conventions and configuration formats.</p>\n<p>Above I said that I am confident that I can write any program in any language. What I didn't say is that I can write any program in the best possible way in any language. You still need years of experience to master the nitty gritty details of a programming language. And often execution environment matters in addition to the syntax of the language. Let me give you a quick example in PHP:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// Merge the following two arrays</span>\n<span class=\"token variable\">$array1</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'PHP'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'Ruby'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'Python'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'JavaScript'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$array2</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'Java'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'C'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'C++'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Method 1</span>\n<span class=\"token variable\">$fullArray</span> <span class=\"token operator\">=</span> <span class=\"token function\">array_merge</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$array1</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$array2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Method 2</span>\n<span class=\"token variable\">$fullArray</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$array1</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$array2</span> <span class=\"token operator\">=></span> <span class=\"token variable\">$value</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token variable\">$fullArray</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$value</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Which of the two methods executes faster? Well. It depends.</p>\n<ul>\n<li>In PHP 5.3 when the arrays have 100,000 or more elements <strong>Method 2</strong> runs faster.</li>\n<li>In PHP 5.5 <strong>Method 2</strong> only runs faster when the arrays have more than 10,000,000 elements.</li>\n</ul>\n<p>Clearly there have been some optimisations to the <code class=\"language-text\">array_merge</code> method over the years. I don't have an installation of HHVM ready but the results there may be different again. I don't know such specific performance implications when writing Ruby oder Python code. Years and years of experience, debugging and frustrations gave me such a deep knowledge about PHP. As we can see in the differences between PHP 5.3 and 5.5 the behaviour of the platforms changes in addition to the syntax; if I once knew every optimisation doesn't mean I know them in the next version.</p>\n<p>I believe that a programmer becomes a professional programmer by being able to generalise specific solutions in a specific programming language on a specific platform to programming in general. If you can systematically identify problems and solve them systematically (and reproducible) you have become a professional programmer.</p>",
            "url": "/blog/programming/",
            "title": "What Does it Mean to be a Programmer",
            "date_modified": "2014-09-13T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/php-pad/",
            "content_html": "<p>When writing an article or code I often need to try something out or create a small benchmark. Typically I create a PHP file, open it in Sublime Text and run it in the terminal whenever I change something. Easy enough, but it happens regularly so I thought about automating this process.</p>\n<p>I added a Bash function to my Dotfiles that creates an empty PHP file, opens it in Sublime Text and uses <a href=\"https://facebook.github.io/watchman/\">Watchman</a> to run the file whenever it changes. At first I thought this should be trivial, but it I had some problems. But let's go through it step-by-step. Creating and opening a file is easy, I just used the <code class=\"language-text\">subl</code> command. However, to execute the script when it changes I needed to use Watchman and there is no obvious way to display the output of the executed script in the terminal. Therefore I create a wrapper bash script and write the output to a log file that I display using <code class=\"language-text\">tail -f</code>.</p>\n<p>I added some clean-up functionality, the script deletes the watch and trigger from Watchman and removes the wrapper script and log file after quitting <code class=\"language-text\">tail</code> with <code class=\"language-text\">Ctrl-C</code>. You can use the script below by adding it to your <code class=\"language-text\">.bash_profile</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"token keyword\">function</span> <span class=\"token function-name function\">phppad</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token assign-left variable\">TMPNAME</span><span class=\"token operator\">=</span><span class=\"token string\">\"phppad-<span class=\"token environment constant\">$RANDOM</span>\"</span>\n    <span class=\"token function\">touch</span> <span class=\"token string\">\"<span class=\"token variable\">$@</span>\"</span>\n    subl <span class=\"token string\">\"<span class=\"token variable\">$@</span>\"</span>\n    <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"(echo '<span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">date</span> +%n%H:%M:%S<span class=\"token variable\">)</span></span> $ php <span class=\"token variable\">$@</span>';php <span class=\"token variable\">$@</span>) >> <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.log\"</span> <span class=\"token operator\">></span> <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.sh\n    <span class=\"token function\">chmod</span> +x <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.sh\n    <span class=\"token function\">touch</span> <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.log\n    watchman <span class=\"token function\">watch</span> <span class=\"token variable\"><span class=\"token variable\">`</span><span class=\"token builtin class-name\">pwd</span><span class=\"token variable\">`</span></span> <span class=\"token operator\">></span> /dev/null\n    watchman -- trigger <span class=\"token variable\"><span class=\"token variable\">`</span><span class=\"token builtin class-name\">pwd</span><span class=\"token variable\">`</span></span> run <span class=\"token string\">\"<span class=\"token variable\">$@</span>\"</span> -- <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.sh <span class=\"token operator\">></span> /dev/null\n    <span class=\"token function\">tail</span> <span class=\"token parameter variable\">-f</span> <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.log\n\n    watchman trigger-del <span class=\"token variable\"><span class=\"token variable\">`</span><span class=\"token builtin class-name\">pwd</span><span class=\"token variable\">`</span></span> run <span class=\"token operator\">></span> /dev/null\n    watchman watch-del <span class=\"token variable\"><span class=\"token variable\">`</span><span class=\"token builtin class-name\">pwd</span><span class=\"token variable\">`</span></span> <span class=\"token operator\">></span> /dev/null\n    <span class=\"token function\">rm</span> <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.log\n    <span class=\"token function\">rm</span> <span class=\"token variable\">$TMPDIR</span>/<span class=\"token variable\">$TMPNAME</span>.sh\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I know there exists at least one REPL, <a href=\"https://github.com/facebookarchive/phpsh\">PHPSH</a>, but it's no longer maintained and I want to use Sublime Text to write the code and I want to persist the code, even when quitting the command.</p>",
            "url": "/blog/php-pad/",
            "title": "PHP Pad",
            "date_modified": "2014-09-14T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/keyboard-maestro-peak/",
            "content_html": "<p>Most of the time I have too many applications and windows open on my Mac. Even on my 24 inch external display there is not much space left when I have PHPStorm or Sublime Text open and there is less space when I am not at home and only have 13 inches. When I write code or text I regularly look things up in another window, specifications for a feature, an API documentation or some other stuff and therefore I press <code class=\"language-text\">Cmd+Tab</code> very very often. If the information I need to get my work done is in more than one other window this system starts to fail completely.</p>\n<p>Recently I caught myself pressing <code class=\"language-text\">Cmd+Tab</code> to get to Safari, then <code class=\"language-text\">Ctrl+Tab</code> to get to the next tab, <code class=\"language-text\">Cmd+Tab</code> to get back into PHPStorm and after a few minutes this process starts again. What I needed was a way to temporarily hide the current top-most window to peak into the background.</p>\n<p>In this article I am going to create a <strong>Peak</strong> keyboard shortcut using <a href=\"http://www.keyboardmaestro.com\">Keyboard Maestro</a> to do exactly this. When the shortcut is pressed the current top-most window is hidden, pressing the shortcut a second time shows the window again. I am going to share not only the code for the shortcut, but also the process on how to create it.</p>\n<p>There exist many different applications to manage keyboard shortcuts, but Keyboard Maestro is probably the most powerful one. Compared to the many free alternatives the price point of €30 for KM looks quite hefty, but it has many unique features, such as variables, loops and conditionals. This means that you can add states to your shortcuts, which is a lot more powerful than it sounds at first glance. Without support for these features, and the great AppleScript support, I would not be able to implement the <strong>Peak</strong> shortcut.</p>\n<p>But let's get started.</p>\n<p>The main problem I encountered when I started working on the shortcut was that the first invocation hides the window and I don't have a way to retrieve the previously active window when activating the shortcut the next time. Therefore I need two states, either I am currently \"peaking\", that is, a window is currently hidden or I am not peaking and no window is hidden. Since the macro editor in Keyboard Maestro is in part visual I am going to post pseudo code for now.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">if peakStatus is not \"hidden\" then\n    PeakAppName = name of topmost application\n    PeakWindowName = name of topmost window of application PeakAppName\n    hide window PeakWindowName of application PeakAppName\n    PeakStatus = \"hidden\"\nelse\n    show window PeakWindowName of application PeakAppName\n    PeakStatus = \"\"\nend if</code></pre></div>\n<p>In Keyboard Maestro there exists no way to determine the name of the top-most application or the name of the first window of an application. But I can use AppleScript to get these values and Keyboard Maestro allows me to assign the return value of an AppleScript to a variable and that's what I am going to do.</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"System Events\"</span>\n    <span class=\"token keyword\">set</span> frontApp <span class=\"token keyword\">to</span> <span class=\"token keyword\">first</span> <span class=\"token class-name\">application</span> process <span class=\"token keyword\">whose</span> frontmost <span class=\"token keyword\">is</span> <span class=\"token keyword\">true</span>\n    name <span class=\"token keyword\">of</span> frontApp\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span></code></pre></div>\n<p>Getting the name of the first window of the top-most application is a little bit more complicated. First I get the name of the application and then I tell that application to give me the name of first window.</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"System Events\"</span>\n    <span class=\"token keyword\">set</span> frontApp <span class=\"token keyword\">to</span> <span class=\"token keyword\">first</span> <span class=\"token class-name\">application</span> process <span class=\"token keyword\">whose</span> frontmost <span class=\"token keyword\">is</span> <span class=\"token keyword\">true</span>\n    <span class=\"token keyword\">set</span> frontAppName <span class=\"token keyword\">to</span> name <span class=\"token keyword\">of</span> frontApp\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n\n<span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> frontAppName\n    name <span class=\"token keyword\">of</span> window <span class=\"token number\">1</span>\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span></code></pre></div>\n<p>However, there are some application that don't return a list of windows (inclding Sublime Text and Spotify) and don't allow to set the visibility of a single window. In this case I am going to hide the complete application instead of just a single window. Therefore I need to replace the <code class=\"language-text\">name of window 1</code> to include a fallback. When I can't the name of the window I store an empty string and later will decide between the two cases.</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">try</span>\n    name <span class=\"token keyword\">of</span> window <span class=\"token number\">1</span>\n<span class=\"token keyword\">on</span> <span class=\"token keyword\">error</span> errMsg\n    <span class=\"token string\">\"\"</span>\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">try</span></code></pre></div>\n<p>I now have the name of the application and window and using the <em>save results to variable</em> option in Keyboard Maestro these values are safely stored in a variable. Currently I am still in the <em>not hidden</em> part of the pseudo code and the last piece still missing is the code to actually hide the window. First I retrieve the names of the application and window from KM and then there is a case distinction wether I have the window name. If I have the name of the window I tell the application to hide the window. Otherwise I use <em>System Events</em> to hide the complete application.</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"Keyboard Maestro Engine\"</span>\n    <span class=\"token keyword\">set</span> frontAppNameVar <span class=\"token keyword\">to</span> make variable <span class=\"token keyword\">with</span> properties <span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span><span class=\"token string\">\"PeakAppName\"</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">set</span> frontAppName <span class=\"token keyword\">to</span> value <span class=\"token keyword\">of</span> frontAppNameVar\n    <span class=\"token keyword\">set</span> windowNameVar <span class=\"token keyword\">to</span> make variable <span class=\"token keyword\">with</span> properties <span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span><span class=\"token string\">\"PeakWindowName\"</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">set</span> windowName <span class=\"token keyword\">to</span> value <span class=\"token keyword\">of</span> windowNameVar\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n\n<span class=\"token keyword\">if</span> windowName <span class=\"token operator\">is not equal to</span> <span class=\"token string\">\"\"</span> <span class=\"token keyword\">then</span>\n    <span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> frontAppName\n        <span class=\"token keyword\">set</span> visible <span class=\"token keyword\">of</span> window windowName <span class=\"token keyword\">to</span> <span class=\"token keyword\">false</span>\n    <span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n<span class=\"token keyword\">else</span>\n    <span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"System Events\"</span>\n        <span class=\"token keyword\">set</span> visible <span class=\"token keyword\">of</span> process frontAppName <span class=\"token keyword\">to</span> <span class=\"token keyword\">false</span>\n    <span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">if</span></code></pre></div>\n<p>The code in the <em>hidden</em> part of the pseudo code is a little bit easier. The name of the application and window are already stored in a variable and I only have to retrieve these values and show the application. Once again I need to make distinction wether I have the name of the window. If I have the window name I tell the application to show the window, otherwise I use <em>System Events</em> to show the application and then activate it.</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"Keyboard Maestro Engine\"</span>\n    <span class=\"token keyword\">set</span> frontAppNameVar <span class=\"token keyword\">to</span> make variable <span class=\"token keyword\">with</span> properties <span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span><span class=\"token string\">\"PeakAppName\"</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">set</span> frontAppName <span class=\"token keyword\">to</span> value <span class=\"token keyword\">of</span> frontAppNameVar\n    <span class=\"token keyword\">set</span> windowNameVar <span class=\"token keyword\">to</span> make variable <span class=\"token keyword\">with</span> properties <span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">:</span><span class=\"token string\">\"PeakWindowName\"</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">set</span> windowName <span class=\"token keyword\">to</span> value <span class=\"token keyword\">of</span> windowNameVar\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n\n<span class=\"token keyword\">if</span> windowName <span class=\"token operator\">is not equal to</span> <span class=\"token string\">\"\"</span> <span class=\"token keyword\">then</span>\n    <span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> frontAppName\n        <span class=\"token keyword\">set</span> visible <span class=\"token keyword\">of</span> window windowName <span class=\"token keyword\">to</span> <span class=\"token keyword\">true</span>\n    <span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n<span class=\"token keyword\">else</span>\n    <span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"System Events\"</span>\n        <span class=\"token keyword\">set</span> visible <span class=\"token keyword\">of</span> process frontAppName <span class=\"token keyword\">to</span> <span class=\"token keyword\">true</span>\n    <span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n    <span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> frontAppName <span class=\"token keyword\">to</span> activate\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">if</span></code></pre></div>\n<p>Creating the macro in Keyboard Maestro now is just a matter of arranging several pre-defined actions. You can find the text version of the macro below or take a look at the <a href=\"http://cdn.florian.ec/DcLAATTF6p5v9w.png\">screenshot</a> of how it should look like in KM.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">If All Conditions Met\n    The variable ‘PeakStatus’ is not ‘hidden’\n    Execute the Following Actions:\n        Execute AppleScript\n            tell application \"System Events\"\n                set frontApp to first application process whose frontmost is true\n                name of frontApp\n            end tell\n        Save trimmed to variable ‘PeakAppName’.\n        Execute AppleScript\n            tell application \"System Events\"\n                set frontApp to first application process whose frontmost is true\n                set frontAppName to name of frontApp\n            end tell\n\n            tell application frontAppName\n                try\n                    name of window 1\n                on error errMsg\n                    \"\"\n                end try\n            end tell\n        Save trimmed to variable ‘PeakWindowName’.\n        Set Variable ‘PeakStatus’ to Text\n            hidden\n        Execute AppleScript\n            tell application \"Keyboard Maestro Engine\"\n                set frontAppNameVar to make variable with properties {name:\"PeakAppName\"}\n                set frontAppName to value of frontAppNameVar\n                set windowNameVar to make variable with properties {name:\"PeakWindowName\"}\n                set windowName to value of windowNameVar\n            end tell\n            if windowName is not equal to \"\" then\n                tell application frontAppName\n                    set visible of window windowName to false\n                end tell\n            else\n                tell application \"System Events\"\n                    set visible of process frontAppName to false\n                end tell\n            end if\n            Display results in a window.\n        Otherwise, Execute the Following Actions:\n            Set Variable ‘PeakStatus’ to Text\n            Execute AppleScript\n                tell application \"Keyboard Maestro Engine\"\n                    set frontAppNameVar to make variable with properties {name:\"PeakAppName\"}\n                    set frontAppName to value of frontAppNameVar\n                    set windowNameVar to make variable with properties {name:\"PeakWindowName\"}\n                    set windowName to value of windowNameVar\n                end tell\n\n                if windowName is not equal to \"\" then\n                    tell application frontAppName\n                        set visible of window windowName to true\n                    end tell\n                else\n                    tell application \"System Events\"\n                        set visible of process frontAppName to true\n                    end tell\n                    tell application frontAppName to activate\n                end if\n            Display results in a window.</code></pre></div>\n<p>As I am writing this I realise that it would have been a lot easier to just write one long AppleScript instead of using the pre-defined actions to compose several smaller ones. But since I sunk enough time in writing this macro I leaving it this way for now.</p>\n<p>If you don't want to retype everything from this article, you can download the macro and import it into Keyboard Maestro: <a href=\"http://tyrion.florian.ec/peak.kmmacros\">peak.kmmacros</a>.</p>",
            "url": "/blog/keyboard-maestro-peak/",
            "title": "Keyboard Maestro Nerdery: Peak",
            "date_modified": "2014-09-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/doctrine-custom-hydration/",
            "content_html": "<p>If you are using Doctrine for a project that is bigger than very small you probably have encountered performance problems with hydration. Hydration is the layer of the ORM that transforms the data that is returned by the database into a form that is comfortable for the developer to work with.</p>\n<p>Object hydration is the default one and it returns the data as objects. This provides the greatest convenience for the developer, but requires a complex and memory intensive hydration process. In most projects for 95 to 100% of the queries this is a reasonable trade-off, but then there is this single import or export script that deals with 100,000 of objects and object hydration takes too much time or consumes too much memory. For these cases Doctrine supports array hydration which creates arrays instead of objects.</p>\n<p>And then there exist ultra-rare cases where you don't import a few hundred thousand rows, but something like 50 million and even array hydration is too slow. In these cases I have fallen back to native SQL queries in the past.</p>\n<p>Native SQL queries are considerable faster because no hydration is involved, but since I want to use Doctrine and hydration for the other 99% of my application I have to duplicate code and deal with different ways to invoke queries and so on. Therefore I looked into a feature of Doctrine I haven't really considered before: <a href=\"http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes\">Custom Hydrators</a>.</p>\n<h3>Custom Hydration</h3>\n<p>Custom Hydrators are pretty straight forward, you sub-class the <code class=\"language-text\">AbstractHydrator</code> class provided by Doctrine and implement the <code class=\"language-text\">hydrateAllData()</code> method, obtain a reference to a <code class=\"language-text\">PDOStatement</code> object and returns the result. You can hydrate to whatever you want, array, object or scalar values. Before implementing my first hydrator I looked at the source code of the <code class=\"language-text\">ObjectHydrator</code> and <code class=\"language-text\">ArrayHydrator</code> and was a little bit overwhelmed. There was so much code and more loops than I expected. If you know that thousands or even millions of elements will go through this code you get suspicious whenever you see a loop. In retrospect the amount of code makes sense: the hydrator needs to map the column names to the field names used in the code, convert the values into their PHP type, resolve references and so on. Still, too many loops.</p>\n<h3>Simple Array Hydration</h3>\n<p>My first idea to speed up the hydration process was to return the row I retrieved from PDO and return it; no mapping or conversion. I loose a lot of convenience compared to object or even array hydration, but when the alternative is to use PDO it makes sense. The result is in the same format as it would be when using PDO directly, but I can continue to use most other features of Doctrine, such as the entity manager, DQL or repositories.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">use</span> <span class=\"token package\">Doctrine<span class=\"token punctuation\">\\</span>ORM<span class=\"token punctuation\">\\</span>Internal<span class=\"token punctuation\">\\</span>Hydration<span class=\"token punctuation\">\\</span>AbstractHydrator</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">SimpleArrayHydrator</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AbstractHydrator</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">hydrateAllData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token variable\">$result</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">foreach</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">_stmt</span><span class=\"token operator\">-></span><span class=\"token function\">fetchAll</span><span class=\"token punctuation\">(</span><span class=\"token class-name class-name-fully-qualified static-context\"><span class=\"token punctuation\">\\</span>PDO</span><span class=\"token operator\">::</span><span class=\"token constant\">FETCH_ASSOC</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token variable\">$row</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token variable\">$result</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$row</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$result</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>Benchmarks</h3>\n<p>I tested my <code class=\"language-text\">SimpleArrayHydrator</code> with a simple dataset (one table with three columns: a primary key, a string and an integer and about 6,500 rows) and compared the performance to object and array hydration as well as using PDO directly. The results below indicate average values over 1,000 iterations and are measured using <a href=\"https://github.com/polyfractal/athletic\">Athletic</a>.</p>\n<table>\n    <thead>\n        <tr>\n            <th>Hydration</th>\n            <th>Iterations</th>\n            <th>Average Time</th>\n            <th>Ops/second</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Object hydration</td>\n            <td>1,000</td>\n            <td>0.4062044150829</td>\n            <td>2.46181</td>\n        </tr>\n        <tr>\n            <td>Array hydration</td>\n            <td>1,000</td>\n            <td>0.3309864323139</td>\n            <td>3.02127</td>\n        </tr>\n        <tr>\n            <td>PDO-style hydration</td>\n            <td>1,000</td>\n            <td>0.0245044710636</td>\n            <td>40.80888</td>\n        </tr>\n        <tr>\n            <td>No hydration (PDO)</td>\n            <td>1,000</td>\n            <td>0.0248321378231</td>\n            <td>40.27040</td>\n        </tr>\n    </tbody>\n</table>\n<p>We can see in these results that my custom PDO-style hydration is practically as fast as directly using PDO. Object and array hydration can process equally many rows per second for this data set. Side note: the difference between object and array hydration will be bigger for more complex data sets (for examples, references).</p>\n<h3>Custom Custom Hydrators</h3>\n<p>While my <code class=\"language-text\">SimpleArrayHydrator</code> is very fast it does not provide a lot of conveniences for developers. There is definitely room in the middle for a hydrator that is faster than default object and array hydration and provides certain conveniences for the developer. Remember that Doctrine is an extremely popular project and that the default hydrators need to work in a lot of different scenarios. If you develop a custom hydrator for your project you can make certain assumptions to improve the performance while maintaining a certain level of convenience. For example, if your project has a convention that the name of a column in the database and the name of the corresponding property in the object must be equal, you can skip the key mapping during hydration.</p>\n<p>Of course, you can also create a hydrator specifically for an entity or even a specific query that causes you performance problems. Please don't create a specific hydrator for every table in your project, that defeats the purpose of using an ORM, but if for a specific entity or query the alternative is switching to PDO code it certainly makes sense to consider it.</p>\n<p>Think of it that way, if you use PDO directly you iterate through the result set and save the rows in some data structure you are basically hydrating the result set. In fact, if you use PDO directly you are most likely writing a custom hydrator for every query you execute. Thus it makes sense to consider a custom hydrator.</p>",
            "url": "/blog/doctrine-custom-hydration/",
            "title": "Improving Doctrine Performance with Custom Hydration",
            "date_modified": "2014-10-01T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/password-please-0.2/",
            "content_html": "<p>Since a few years I generate a new password for every service I sign up and I use <a href=\"https://agilebits.com/onepassword\">1Password</a> to manage them for me. But one thing that bothered me for a while was the generation of new passwords. It involves a lot of mouse usage and I like to use the keyboard as much as possible. Also changing the password receipt is quite cumbersome and I wanted to have a faster way to generate passwords of different length and complexity.</p>\n<p>Therefore I created a small PHP library and CLI script as well as an Alfred workflow to invoke it. I am using it for a few weeks now and it works great for my purposes.</p>\n<p><img src=\"/blog/2014-10-04-password-please-0.2/password-please-alfred.gif\" alt=\"Password, Please! Alfred Workflow\"></p>\n<p>I have set up a page with more information, <a href=\"http://passwordplea.se\">passwordplea.se</a> (pretty sweet, right?), and the source code of both the <a href=\"https://github.com/florianeckerstorfer/passwordplease-alfred\">Alfred workflow</a> and the <a href=\"https://github.com/florianeckerstorfer/passwordplease-php\">PHP library and CLI</a> are on Github.</p>",
            "url": "/blog/password-please-0.2/",
            "title": "Password, Please!",
            "date_modified": "2014-10-04T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/weekly-recommender-2014-41/",
            "content_html": "<p>It's easy to press star, like, favorite or bookmark in an app while consuming content. I do this regularly in Feedbin, <a href=\"https://www.instapaper.com/p/florianec\">Instapaper</a> or <a href=\"https://pinboard.in/u:florian.eckerstorfer\">Pinboard</a>, but once I pressed the button I never revisit the saved stuff. There are many great articles, libraries and tools out there that I saved for keeping because they could be useful to me at some point in the future, but when I would need them I don't think about looking in my archives because I forgot that I encountered and saved them.</p>\n<p>The Weekly Recommender is a new weekly series that I plan to write for two purposes, giving myself a reason to revisit the content I encountered the past week, collect them in one place and make the highlights accessible to my readers.</p>\n<h3>Development</h3>\n<ul>\n<li><a href=\"http://www.airpair.com/angularjs\">AngularJS Tutorial: A Comprehensive 10,000 Word Guide</a></li>\n<li><a href=\"http://knpuniversity.com/blog/symfony-debugging-form-errors\">Accessing and Debugging Symfony Form Errors</a></li>\n<li><a href=\"http://csstriggers.com\">CSS Triggers</a></li>\n<li><a href=\"https://github.com/ddmnet/wgrep\">wgrep</a> is a command line utility for running selector queries against URLs</li>\n<li><a href=\"http://briangonzalez.github.io/jquery.adaptive-backgrounds.js/\">Adaptive Backgrounds</a>: A jQuery plugin for extracting dominant colors from images and applying it to its parent.</li>\n<li><a href=\"https://dribbble.com/shots/1702947-iTerm-Replacement-Icon\">iTerm Replacement Icon</a></li>\n</ul>\n<h3>Podcasts</h3>\n<ul>\n<li><a href=\"http://relay.fm/inquisitive/8\">Inquisitive #8: A Little More Playful, with Shawn Blanc</a></li>\n<li><a href=\"http://99percentinvisible.org/episode/the-straight-line-is-a-godless-line/\">99% Invisible #134: The Straight Line Is A Godless Line</a></li>\n<li><a href=\"http://5by5.tv/webahead/86\">The Web Ahead #86: Componentizing the Web with Rob Dodson</a></li>\n<li><a href=\"http://www.imore.com/debug-44-brianna-wu-amanda-warner-and-revolution-60\">Debug #44: Brianna Wu, Amanda Warner, and Revolution 60</a></li>\n</ul>\n<h3>Everything Else</h3>\n<ul>\n<li><a href=\"http://petewarden.com/2014/10/05/why-nerd-culture-must-die/\">Pete Warden: Why nerd culture must die</a></li>\n<li><a href=\"http://gawker.com/what-is-gamergate-and-why-an-explainer-for-non-geeks-1642909080\">Kinja: What Is Gamegate, and Why? An Explainer for Non-Geeks</a></li>\n<li><a href=\"http://www.elle.com/news/culture/lessons-from-grimes-on-how-to-be-a-boss\">Elle: Lessons From Grimes on How To Be a Boss</a></li>\n<li><a href=\"http://www.jofreeman.com/joreen/tyranny.htm\">Jo Freeman: The Tyranny of Structurelessness</a></li>\n<li><a href=\"http://laurie-penny.com/why-were-winning-social-justice-warriors-and-the-new-culture-war/\">Laurie Penny: Why We’re Winning: Social Justice Warriors and the New Culture War</a></li>\n<li><a href=\"http://www.buzzfeed.com/juliapugachevsky/if-ron-swanson-quotes-were-motivational-posters#4hjk6yw\">If Ron Swanson Quotes Were Motivational Posters</a></li>\n</ul>",
            "url": "/blog/weekly-recommender-2014-41/",
            "title": "The Weekly Recommender, 2014/41",
            "date_modified": "2014-10-12T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/mysql-doctrine-utf8/",
            "content_html": "<p>When dealing with character encodings in MySQL you soon realise that <code class=\"language-text\">utf8</code> is not really <a href=\"http://en.wikipedia.org/wiki/UTF-8\">UTF-8</a>. UTF-8 is a variable-length encoding, that means ASCII characters require only one byte while it also supports more characters by requiring more bytes.</p>\n<p>The MySQL character encoding <code class=\"language-text\">utf8</code> has a maximum of 3 bytes, which contains most characters widely used in the western world. However, Chinese, Japanese or Korean alphabets require 4 bytes and therefore cannot be stored in a MySQL column that is encoded with <code class=\"language-text\">utf8</code>. MySQL provides an additional character encoding <code class=\"language-text\">utf8mb4</code> to support those characters. By the way, Emojis also require 4 bytes and <code class=\"language-text\">utf8mb4</code>.</p>\n<p>In this article I am explaining how to create <code class=\"language-text\">utf8mb4</code> databases, tables and columns with plain SQL and with <a href=\"http://www.doctrine-project.org\">Doctrine ORM</a>.</p>\n<p><strong>Update 25th of July 2016</strong> Starting with MySQL 5.7.7 this is no longer a problem. More information can be found <a href=\"https://github.com/doctrine/dbal/pull/851#issuecomment-104269536\">here</a>.</p>\n<h3>MySQL</h3>\n<p>MySQL lets you set the character encoding and collation on multiple different level. You can set the default encoding for a database, for a table and you can specify the encoding of an indiviual column.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">/* Create database */</span>\n<span class=\"token keyword\">create</span> <span class=\"token keyword\">database</span> utf8mb4test\n    <span class=\"token keyword\">character</span> <span class=\"token keyword\">set</span> utf8mb4\n    <span class=\"token keyword\">collate</span> utf8mb4_unicode_ci<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">/* Create table */</span>\n<span class=\"token keyword\">create</span> <span class=\"token keyword\">table</span> unicode_names\n    <span class=\"token punctuation\">(</span>\n        name <span class=\"token keyword\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">255</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">character</span> <span class=\"token keyword\">set</span> utf8mb4\n    <span class=\"token keyword\">collate</span> utf8mb4_unicode_ci<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">/* Create table with mixed encodings */</span>\n<span class=\"token keyword\">create</span> <span class=\"token keyword\">table</span> mixed_encoding\n    <span class=\"token punctuation\">(</span>\n        name <span class=\"token keyword\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">255</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">character</span> <span class=\"token keyword\">set</span> utf8mb4\n            <span class=\"token keyword\">collate</span> utf8mb4_unicode_ci<span class=\"token punctuation\">,</span>\n        email <span class=\"token keyword\">varchar</span><span class=\"token punctuation\">(</span><span class=\"token number\">255</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">character</span> <span class=\"token keyword\">set</span> utf8\n    <span class=\"token keyword\">collate</span> utf8_unicode_ci<span class=\"token punctuation\">;</span></code></pre></div>\n<p><em>When you design your database and decide on encodings for specific columns, please remember that there are TLDs in many languages that require 4 bytes now. IANA has a <a href=\"http://www.iana.org/domains/root/db\">list with all top-level domains</a>.</em></p>\n<p>If you use pure SQL and create a table without a specific character encoding and collation the table will be created using the default character encoding of the database. The same applies for columns, adding a column without a specific character encoding and collation will use the tables.</p>\n<p>Matthias Bynens has a <a href=\"https://mathiasbynens.be/notes/mysql-utf8mb4\">pretty nice overview</a> how to migrate <code class=\"language-text\">utf8</code> tables to <code class=\"language-text\">utf8mb4</code> and how to set things up correctly on the MySQL side of things.</p>\n<h3>Doctrine</h3>\n<p>Most likely you are not creating your schema by hand, but generate it using an ORM. I use Doctrine and the documentation and available resources on this topic are outdated in many places. First of all, the behaviour of Doctrine must have changed recently, because if you Google something like <em>doctrine utf8mb4</em> you will find resources saying that you have to configure this at a database level.</p>\n<p>In fact, the reference included with the source code (as of v2.4.6) says the following</p>\n<blockquote>\n<p>You can't set these values inside the annotations, yml or xml mapping files. To make a database work with the default charset and collation you should configure MySQL to use it as default charset, or create the database with charset and collation details. This way they get inherited to all newly created database tables and columns.</p>\n</blockquote>\n<p>However, it seems that Doctrine now specifically defines the encoding and collation when creating a new table. You can see this if you dump the schema SQL:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ php app/console doctrine:schema:update --dump-sql</code></pre></div>\n<p>The result is something like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> <span class=\"token keyword\">user</span>\n    <span class=\"token punctuation\">(</span>\n        id <span class=\"token keyword\">INT</span> <span class=\"token keyword\">AUTO_INCREMENT</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n        username <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">255</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n        <span class=\"token comment\">/* ... */</span>\n    <span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CHARACTER</span> <span class=\"token keyword\">SET</span> utf8\n    <span class=\"token keyword\">COLLATE</span> utf8_unicode_ci\n    <span class=\"token keyword\">ENGINE</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">InnoDB</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Therefore the settings on the database-level are overwritten by the table-specific configurations set by Doctrine. Unfortunately we need to set the charset and collation for every table since there is no global option and Doctrine doesn't respect the setting defined in MySQL.</p>\n<p>The related options are called <code class=\"language-text\">charset</code> and <code class=\"language-text\">collate</code> and can be set using all configuration formats, for example, when using annotations:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">/**\n * @ORM\\Entity()\n * @ORM\\Table(name=\"users\", options={\"collate\"=\"utf8mb4_unicode_ci\", \"charset\"=\"utf8mb4\"})\n */</span></code></pre></div>\n<p>Or when using XML:</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>entity</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Acme\\DemoBundle\\Entity\\User<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">table</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>users<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>options</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>option</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>charset<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>utf8mb4<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>option</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>option</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>collate<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>utf8mb4_unicode_ci<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>option</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>options</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>entity</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>If you now dump the SQL to create the schema you should get something like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> <span class=\"token keyword\">user</span>\n    <span class=\"token punctuation\">(</span>\n        id <span class=\"token keyword\">INT</span> <span class=\"token keyword\">AUTO_INCREMENT</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n        username <span class=\"token keyword\">VARCHAR</span><span class=\"token punctuation\">(</span><span class=\"token number\">255</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">NOT</span> <span class=\"token boolean\">NULL</span><span class=\"token punctuation\">,</span>\n        <span class=\"token comment\">/* ... */</span>\n    <span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CHARACTER</span> <span class=\"token keyword\">SET</span> utf8mb4\n    <span class=\"token keyword\">COLLATE</span> utf8mb4_unicode_ci\n    <span class=\"token keyword\">ENGINE</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">InnoDB</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Doctrine currently doesn't seem to support setting the charset and collation on the column-level. If you want to change the encoding on a per-column basis you need to do this using SQL.</p>\n<h3>Indexes</h3>\n<p>When converting your tables from <code class=\"language-text\">utf8</code> to <code class=\"language-text\">utf8mb4</code> there is one more thing you need to consider. An index in InnoDB always has a maximum size of 767, bytes regardless of the number of bytes used for a single character. Consider a column with a maximum of 255 characters, this would result in 765 bytes when using <code class=\"language-text\">utf8</code> but in 1020 bytes when using <code class=\"language-text\">utf8mb4</code>. If you need an index on a <code class=\"language-text\">utf8mb4</code> column the maximum number of characters is 191 instead of 255.</p>\n<h3>Encoding of the Connection</h3>\n<p>One last thing you need to take care of is the encoding of the connection. If you are using Doctrine in combination with Symfony you can set this in your <code class=\"language-text\">config.yml</code></p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># app/config/config.yml</span>\n<span class=\"token key atrule\">doctrine</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">dbal</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">charset</span><span class=\"token punctuation\">:</span> utf8mb4</code></pre></div>\n<p>Or if you don't use Symfony:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$config</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name class-name-fully-qualified\"><span class=\"token punctuation\">\\</span>Doctrine<span class=\"token punctuation\">\\</span>DBAL<span class=\"token punctuation\">\\</span>Configuration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// ...</span>\n<span class=\"token variable\">$connectionParams</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span>\n    <span class=\"token string single-quoted-string\">'driver'</span>   <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'pdo_mysql'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string single-quoted-string\">'host'</span>     <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'localhost'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string single-quoted-string\">'user'</span>     <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'user'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string single-quoted-string\">'password'</span> <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'secret'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string single-quoted-string\">'dbname'</span>   <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'mydb'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string single-quoted-string\">'charset'</span>  <span class=\"token operator\">=></span> <span class=\"token string single-quoted-string\">'utf8mb4'</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$conn</span> <span class=\"token operator\">=</span> <span class=\"token class-name class-name-fully-qualified static-context\"><span class=\"token punctuation\">\\</span>Doctrine<span class=\"token punctuation\">\\</span>DBAL<span class=\"token punctuation\">\\</span>DriverManager</span><span class=\"token operator\">::</span><span class=\"token function\">getConnection</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$connectionParams</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$config</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In SQL you would use</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SET</span> NAMES<span class=\"token operator\">=</span><span class=\"token string\">'utf8mb4'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3>Handling Multi-byte Strings in PHP</h3>\n<p>This has nothing really to do with databases, but just don't forget that when you deal with multi-byte strings (such as Emoji or CJK characters) you need to use the <code class=\"language-text\">mb_*</code> methods, such as <code class=\"language-text\">mb_substr()</code> or <code class=\"language-text\">mb_strlen()</code>.</p>\n<h3>Conclusion</h3>\n<p>Considering that full UTF8 support is pretty important these days it's probably worth converting tables to <code class=\"language-text\">utf8mb4</code> or at least use <code class=\"language-text\">utf8mb4</code> in new projects. I heard some evidence that <code class=\"language-text\">utf8mb4</code> is slower than <code class=\"language-text\">utf8</code>, but I couldn't find some definitive performance measurements. Michael Simmons found that joining string columns with different encodings <a href=\"http://info.michael-simons.eu/2013/01/21/java-mysql-and-multi-byte-utf-8-support/\">is extremely slower</a> then joining columns with the same encoding (which makes sense). In my opinion this should not keep you from using <code class=\"language-text\">utf8mb4</code> now.</p>\n<p>And don't forget to treat yourself with a  after dealing with all this encoding stuff.</p>",
            "url": "/blog/mysql-doctrine-utf8/",
            "title": "MySQL, Doctrine and UTF-8",
            "date_modified": "2014-10-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/weekly-recommender-2014-43/",
            "content_html": "<p>The Weekly Recommender is a weekly series that I plan to write for two purposes, giving myself a reason to revisit the content I encountered the past week, collect them in one place and make the highlights accessible to my readers. They don't necesarily have been published last week, I just found them during the past seven days. You can also checkout my profiles on <a href=\"https://pinboard.in/u:florian.eckerstorfer\">Pinboard</a> and <a href=\"https://www.instapaper.com/p/florianec\">Instapaper</a>.</p>\n<h3>Development</h3>\n<ul>\n<li><a href=\"https://onlywei.github.io/explain-git-with-d3/\">Visuzalizing Git Concepts with D3</a></li>\n<li><a href=\"https://github.com/nelmio/alice\">Alice</a> is a fixtures generator written in PHP. There exists also a <a href=\"https://github.com/hautelook/AliceBundle\">bundle</a> to integrate Alice into Symfony.</li>\n<li><a href=\"https://github.com/lastguest/pixeler\">Pixeler</a> can render images in CLI using UTF-8 characters (written in PHP)</li>\n<li><a href=\"http://elrumordelaluz.github.io/csshake/\">CSShake</a> provides some pure CSS shake effects</li>\n<li><a href=\"http://prismjs.com\">Prism</a> is a syntax highlighter written in JavaScript</li>\n</ul>\n<h3>Mac OS X</h3>\n<ul>\n<li><a href=\"http://airmailapp.com\">Airmail</a> 2.0 has been relased and its great.</li>\n</ul>\n<h3>Podcasts</h3>\n<ul>\n<li><a href=\"http://daringfireball.net/thetalkshow/2014/10/25/ep-098\">The Talk Show #98: ‘Far Less Eloquent As You’, With John Siracusa</a></li>\n<li><a href=\"http://toe.prx.org/2014/10/enchanted-by-numbers/\">Theory of Everything: Enchanting By Numbers</a></li>\n<li><a href=\"http://www.storycentral.org/falling-slowly/\">Strangers: Falling Slowly</a></li>\n</ul>\n<h3>Feminism and Gamergate</h3>\n<ul>\n<li><a href=\"http://feliciaday.com/blog/crossing-the-street/\">Felicia Day: Crossing the Street</a></li>\n<li><a href=\"http://nymag.com/scienceofus/2014/10/gamergate-should-stop-lying-to-itself.html\">Jesse Singal: Gamergate Should Stop Lying to Journalists – and Itself</a></li>\n<li><a href=\"http://www.theguardian.com/commentisfree/2014/oct/21/gamergate-angry-men-harassing-women\">Jessica Valenti: Gamergate is loud, dangerous and a last grasp at cultural dominance by angry white men</a></li>\n<li><a href=\"http://msmagazine.com/blog/2013/09/06/a-guy-is-a-man-is-a-guy/\">Allan G. Johnson: A Guy Is A Man Is A Guy</a></li>\n</ul>",
            "url": "/blog/weekly-recommender-2014-43/",
            "title": "The Weekly Recommender, 2014/43",
            "date_modified": "2014-10-26T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/frontend-dependencies-npm/",
            "content_html": "<p>Until recently I used <a href=\"http://bower.io\">Bower</a> to manage the frontend dependencies, JavaScript and Sass/CSS libraries and <a href=\"https://www.npmjs.org\">NPM</a> to manage <a href=\"http://gulpjs.com\">Gulp</a>/<a href=\"http://gruntjs.com\">Grunt</a> and plugins required for my build process. Since all packages I use in Bower are on NPM I removed Bower from the list of tools I use and manage my packages exclusively with NPM.</p>\n<p>Using one instead of two package managers makes it easier keeping the packages up-to-date and removes clutter from the repositories. I think it is a good idea to keep the dependencies out of the document root and to use a Gulp task to copy only the files that are required into a publicly accessible directory. My task looks like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> _ <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'lodash'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  gulp <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'copy-assets'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> assets <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">js</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">'./node_modules/html5shiv/dist/html5shiv-printshiv.min.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./node_modules/angular/angular.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./node_modules/angular-resource/angular-resource.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./node_modules/angular-route/angular-route.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'./node_modules/picturefill/picturefill.js'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">css</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'./node_modules/normalize.css/normalize.css'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">_</span><span class=\"token punctuation\">(</span>assets<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">assets<span class=\"token punctuation\">,</span> type</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    gulp<span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span>assets<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>gulp<span class=\"token punctuation\">.</span><span class=\"token function\">dest</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./web/'</span> <span class=\"token operator\">+</span> type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now I seriously don't know why I ever used Bower.</p>",
            "url": "/blog/frontend-dependencies-npm/",
            "title": "Manage Frontend Dependencies with NPM",
            "date_modified": "2014-11-03T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/hp-color-laserjet-cp1215-mac-os-x-10-10/",
            "content_html": "<p>In 2009 I got a HP Color LaserJet CP1215. Unfortunately this printer is not compatible with OS X. Six years ago I managed to install the printer by using open source tools and drivers. In 2012 I got a new MacBook Pro and needed to install the printer again and I <a href=\"http://webadventures.at/2012/06/10/hp-cp1215-osx/\">wrote about the process on my old blog</a>. Now three more years have passed and when OS X 10.10 Yosemite came out I decided to do a clean install, but I didn't install the printer because I didn't need it. A few month have passed since then and now I needed to use the printer again and thus I had to install it again.</p>\n<p>This is part tutorial, part reminder for myself on how to install this fucking printer.</p>\n<p>You need GCC to compile C code. In my opinion the best way to get GCC is to install <a href=\"http://itunes.apple.com/at/app/xcode/id497799835?mt=12\">Xcode</a> from the Mac App Store. In Xcode you have to install the Command Line Tools (Preferences > Downloads > Components).\nYou also need <a href=\"http://mxcl.github.com/homebrew/\">Homebrew</a> to install some libraries.\nOpen a Terminal window and install <code class=\"language-text\">wget</code> and <code class=\"language-text\">gnu-sed</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ brew <span class=\"token function\">install</span> <span class=\"token function\">wget</span>\n$ brew <span class=\"token function\">install</span> gnu-sed\n$ brew <span class=\"token function\">install</span> ghostscript</code></pre></div>\n<p><a href=\"http://www.linuxfoundation.org/collaborate/workgroups/openprinting/macosx/hpijs\">Download</a> and install Foomatic RIP and HIPJS for Mac OS X. The page also includes a download for Ghostscript, but I used Homebrew to install it. The links state that Foomatic RIP and HIPJS are for OS X 10.8, but for me they work fine on 10.10 Yosemite.</p>\n<p>Next you need to install <code class=\"language-text\">foo2zjs</code>. Terminal:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">$ <span class=\"token function\">wget</span> <span class=\"token parameter variable\">-O</span> foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz\n$ <span class=\"token function\">tar</span> zxf foo2zjs.tar.gz\n$ <span class=\"token builtin class-name\">cd</span> foo2zjs\n$ <span class=\"token function\">make</span>\n$ ./getweb <span class=\"token number\">1215</span>\n$ <span class=\"token function\">sudo</span> <span class=\"token function\">make</span> <span class=\"token function\">install</span>\n$ <span class=\"token function\">sudo</span> <span class=\"token function\">make</span> cups\n$ cupsctl <span class=\"token assign-left variable\">WebInterface</span><span class=\"token operator\">=</span>yes</code></pre></div>\n<p>Open the CUPS web interface: <a href=\"http://localhost:631\">http://localhost:631</a></p>\n<ol>\n<li>Add a printer by clicking on <em>Adding Printers and Classes</em> and then <em>Add Printer</em>. Enter your Mac OS X user name (must be an administrator) and your password.</li>\n<li>Select the printer (I connected the printer to my AirPort Express and it showed up in the list automatically) and click the submit button.</li>\n<li>Enter a name and description and submit the form again.</li>\n<li>Select <em>HP</em></li>\n<li>Select <em>HP Color LaserJet CP1215 Foomatic/foo2hp (en)</em></li>\n<li>Click on <em>Add Printer</em></li>\n<li>Set <em>Color Mode</em> to <em>Color</em> and <em>Bits Per Plane</em> to <em>2 Bits Per Plane</em>. <strong>Submit</strong>.</li>\n</ol>\n<p>Done.</p>\n<p><em>Please note that I cannot give support on installing this fucking printer on OS X. If you send me emails about this printer I will ignore them.</em></p>",
            "url": "/blog/hp-color-laserjet-cp1215-mac-os-x-10-10/",
            "title": "Installing HP Color LaserJet CP1215 on Mac OS X 10.10 Yosemite",
            "date_modified": "2015-03-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/gulp-js-streams/",
            "content_html": "<p>Gulp is different than other build systems or task runners (like <a href=\"https://www.gnu.org/software/make/\">Make</a>, <a href=\"https://ant.apache.org\">Ant</a>, <a href=\"http://www.phing.info\">Phing</a>, <a href=\"http://rake.rubyforge.org\">Rake</a>, or <a href=\"http://gruntjs.com\">Grunt</a>) in two major ways. First, you define tasks using code instead of configuration, which gives you a lot of flexibility when it comes to building and reusing tasks. The second difference, and the one I want to focus on in this article, is that it uses Node streams.</p>\n<p>Gulp did not invent streams, they are part of Node, but it standardises them for build systems in a way that code from different authors can work together without knowing about each other.</p>\n<p><a href=\"https://nodejs.org/api/stream.html\">Streams in Node.js</a> work a lot like streams work on YouTube. You can start consuming data while the data is not fully loaded, but every chunk of loaded data is given to you immediately after it is loaded and you are not currently processing the previous chunk. Loading does not necessarily mean downloading from the internet, it could also mean reading data from disk or from a database.</p>\n<p>Let us consider the following scenario: you have your source code written in CoffeeScript and stored in a bunch of <code class=\"language-text\">.coffee</code> files. To deploy to production you need to compile CoffeeScript to JavaScript, concatenate them into one big file, minify the source code, and move the file to a <code class=\"language-text\">dist/</code> directory.</p>\n<p>In a traditional task runner (that would be something like Make or Grunt) each of these steps would need to read the corresponding files from disk at the beginning and write them back to disk when it has done its work.</p>\n<ol>\n<li>Read <code class=\"language-text\">src/*.coffee</code> ➞ Compile CoffeeScript ➞ Write <code class=\"language-text\">tmp/*.js</code></li>\n<li>Read <code class=\"language-text\">tmp/*.js</code> ➞ Concatenate ➞ Write <code class=\"language-text\">tmp/all.js</code></li>\n<li>Read <code class=\"language-text\">tmp/all.js</code> ➞ Minify ➞ Write <code class=\"language-text\">tmp/all.min.js</code></li>\n<li>Copy <code class=\"language-text\">tmp/all.min.js</code> to <code class=\"language-text\">dist/</code></li>\n</ol>\n<p>Streams in Gulp provide us with a way to convert files into object that can flow through the pipeline without having to be written to disk after each step. The same workflow would look like this in Gulp:</p>\n<ol>\n<li>Start reading <code class=\"language-text\">src/*.coffee</code></li>\n<li>Pipe output from <em>1</em> into CoffeeScript</li>\n<li>Pipe output from <em>2</em> into a concatenate function</li>\n<li>Pipe output from <em>3</em> into Minify</li>\n<li>Write output from <em>4</em> to <code class=\"language-text\">dist/</code></li>\n</ol>\n<p>In code it would look something like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// gulpfile.js</span>\n<span class=\"token keyword\">var</span> gulp <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  coffee <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-coffee'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  concat <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-concat'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  uglify <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'gulp-uglify'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'default'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token string\">'src/*.coffee'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">coffee</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'all.min.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">uglify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>gulp<span class=\"token punctuation\">.</span><span class=\"token function\">dest</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dist'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><em>(The code above uses, in addition to Gulp, the <a href=\"https://www.npmjs.com/package/gulp-coffee\">gulp-coffee</a>, <a href=\"https://www.npmjs.com/package/gulp-concat\">gulp-concat</a>, and <a href=\"https://www.npmjs.com/package/gulp-uglify\">gulp-uglify</a> plugins. You can install them using NPM.</em></p>\n<p>I want to show you how these aforementioned file objects flow through the workflow, but to do so we need to take a look at <a href=\"https://www.npmjs.com/package/vinyl\">Vinyl</a>. Vinyl is a virtual file format, that is, an abstraction of the filesystem. By abstracting the file system Gulp, and Gulp plugins, doesn't need to know about the underlying filesystem, which in most cases is the local filesystem, but could also be on <a href=\"https://www.npmjs.com/package/vinyl-github\">Github</a> or <a href=\"https://www.npmjs.com/package/vinyl-s3\">S3</a>. The other thing Vinyl does is that it provides us with the <a href=\"https://github.com/wearefractal/vinyl/blob/master/index.js#L12\">File object</a> that is passed through the workflow.</p>\n<p>As a side note: the <code class=\"language-text\">src()</code>, <code class=\"language-text\">dest()</code> and <code class=\"language-text\">watch()</code> methods implemented by Gulp are barely more than wrapper functions of the corresponding method in the Vinyl adapter.</p>\n<p>Ok, let us write a Gulp plugin that visualises the flow of the <code class=\"language-text\">File</code> object through the pipeline. That way we do not only see how files are processed internally in Gulp, but we also learn how to write a Gulp plugin on our own.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// lib/log.js</span>\n<span class=\"token keyword\">var</span> through <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'through2'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">exports</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">label</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">file<span class=\"token punctuation\">,</span> enc<span class=\"token punctuation\">,</span> cb</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>label<span class=\"token punctuation\">,</span> <span class=\"token string\">':'</span><span class=\"token punctuation\">,</span> file<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">cb</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> through<span class=\"token punctuation\">.</span><span class=\"token function\">obj</span><span class=\"token punctuation\">(</span>log<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This code is pretty simple and straight-forward. We use the <a href=\"https://www.npmjs.com/package/through2\">through2</a> library as a wrapper for Node streams and create a <code class=\"language-text\">log()</code> function which outputs the filename of each processed file to the console. <code class=\"language-text\">log()</code> is called by Gulp for each file that it processes with three parameters. The first is a <code class=\"language-text\">File</code> object created by Vinyl and the third is a callback function. When we are done with our work we pass the file to the callback and through this move it further along in the workflow.</p>\n<p>Of course, we don't have to pass the file along, a plugin like <code class=\"language-text\">concat</code> consumes all files and removes them from the stream. When it has processed the very last file it creates a new <code class=\"language-text\">File</code> object for the concatenated file and emits it to the workflow.</p>\n<p>Now we can use the log plugin in our Gulpfile to display the filename of each processed file alongside a label. We will add the <em>log</em> plugin before every plugin in our workflow to display the plugin name as label. This way we can see which plugin processes which files.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// gulpfile.js</span>\n<span class=\"token comment\">// ...</span>\n<span class=\"token keyword\">var</span> log <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./lib/log'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\ngulp<span class=\"token punctuation\">.</span><span class=\"token function\">task</span><span class=\"token punctuation\">(</span><span class=\"token string\">'log'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  gulp\n    <span class=\"token punctuation\">.</span><span class=\"token function\">src</span><span class=\"token punctuation\">(</span><span class=\"token string\">'src/*.coffee'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'coffee'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">coffee</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'concat'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'all.min.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'uglify'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">uglify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>gulp<span class=\"token punctuation\">.</span><span class=\"token function\">dest</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dist'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>If our <code class=\"language-text\">src/</code> directory contains three files, <code class=\"language-text\">foo.coffee</code>, <code class=\"language-text\">bar.coffee</code> and <code class=\"language-text\">qoo.coffee</code> the output will look like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">coffee <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/bar.coffee\nconcat <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/bar.js\ncoffee <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/foo.coffee\nconcat <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/foo.js\ncoffee <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/qoo.coffee\nconcat <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/qoo.js\nuglify <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/all.min.js\ndest <span class=\"token builtin class-name\">:</span> /Users/florian/Projects/slides/gulpjs-streams/src/all.min.js</code></pre></div>\n<p>We can see that <code class=\"language-text\">bar.coffee</code> is read and pipe through <code class=\"language-text\">coffee</code> and <code class=\"language-text\">concat</code>, but is not passed further along because <code class=\"language-text\">concat</code> consumes the stream. When <code class=\"language-text\">concat</code> finished consuming all files it emits a new file <code class=\"language-text\">all.min.js</code> and this one is passed to <code class=\"language-text\">uglify</code> and <code class=\"language-text\">dest</code>.</p>\n<h2>Resources</h2>\n<p>If you want to learn more about streams in Node and Gulp, take a look at the following resources:</p>\n<ul>\n<li><a href=\"https://github.com/substack/stream-handbook\">Stream Handbook</a> by substack</li>\n<li><a href=\"https://medium.com/@contrahacks/gulp-3828e8126466\">Gulp</a> (The vision, history, and future of the project)</li>\n</ul>\n<p>These have already been linked in the article, but you still might want to take a closer look ant</p>\n<ul>\n<li><a href=\"https://nodejs.org/api/stream.html\">Node Stream API</a></li>\n<li><a href=\"https://www.npmjs.com/package/vinyl\">vinyl</a></li>\n<li><a href=\"https://www.npmjs.com/package/vinyl-fs\">vinyl-fs</a></li>\n<li><a href=\"https://www.npmjs.com/package/through2\">through2</a></li>\n</ul>\n<h2>Slides</h2>\n<p>This article is the novelisation of my talk at the ViennaJS meet-up on 24 June 2015. The <a href=\"https://speakerdeck.com/florianeckerstorfer/streams-in-gulp-dot-js\">slides</a> are already online. <strike>The event was filmed and I plan to update this article when the video is online.</strike> The <a href=\"https://www.youtube.com/watch?v=hRe7_xsQBUQ\">video is now online</a>.</p>",
            "url": "/blog/gulp-js-streams/",
            "title": "Streams in Gulp.js",
            "date_modified": "2015-06-24T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/save-safari-session/",
            "content_html": "<p>John Gruber was guest at the latest episode of <a href=\"http://www.relay.fm/mpu/264\">Mac Power Users</a> and towards the end he talked with hosts Katie and David about his workflow and some of the scripts, AppleScript and otherwise, he uses. John posted one of these, an AppleScript allows him to retrieve all open URLs from Safari, present them in a list and insert one of them in the current text field to <a href=\"https://gist.github.com/gruber/90bb418dcab16ded7630\">Gist</a>.</p>\n<p>In addition John uses an AppleScript to save the URLs of all pages open in Safari into a text file, grouped by window. He did not post this one, but it was easy enough for me to recreate it.</p>\n<p>The script needs to do two things, first gather all the URLs and format them in a string and then save this string to a file named with the current date and time. As you can see working with dates is a little bit messy in AppleScript, but the result works quite well.</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token comment\">--- Gather the URLs of all open tabs</span>\n<span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"Safari\"</span>\n    <span class=\"token keyword\">set</span> _urls <span class=\"token keyword\">to</span> URL <span class=\"token keyword\">of</span> <span class=\"token keyword\">every</span> tab <span class=\"token keyword\">of</span> <span class=\"token keyword\">every</span> window\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n\n<span class=\"token comment\">--- Create a string that contains all URLs, grouped by window</span>\n<span class=\"token keyword\">set</span> _content <span class=\"token keyword\">to</span> <span class=\"token string\">\"\"</span>\n<span class=\"token keyword\">repeat</span> <span class=\"token keyword\">with</span> _window_urls <span class=\"token keyword\">in</span> _urls\n    <span class=\"token keyword\">repeat</span> <span class=\"token keyword\">with</span> _url <span class=\"token keyword\">in</span> _window_urls\n        <span class=\"token keyword\">set</span> _content <span class=\"token keyword\">to</span> _content <span class=\"token operator\">&#x26;</span> \"\n<span class=\"token operator\">-</span> \" <span class=\"token operator\">&#x26;</span> _url\n    <span class=\"token keyword\">end</span> <span class=\"token keyword\">repeat</span>\n    <span class=\"token keyword\">set</span> _content <span class=\"token keyword\">to</span> _content <span class=\"token operator\">&#x26;</span> \"\n\"\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">repeat</span>\n\n<span class=\"token comment\">--- Create a string with the current date and time</span>\n<span class=\"token keyword\">set</span> the_mon <span class=\"token keyword\">to</span> month <span class=\"token keyword\">of</span> <span class=\"token punctuation\">(</span>current <span class=\"token class-name\">date</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">as</span> <span class=\"token class-name\">integer</span> <span class=\"token operator\">as</span> string\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>count characters <span class=\"token keyword\">in</span> the_mon<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token keyword\">then</span> <span class=\"token keyword\">set</span> the_mon <span class=\"token keyword\">to</span> <span class=\"token string\">\"0\"</span> <span class=\"token operator\">&#x26;</span> the_mon\n<span class=\"token keyword\">set</span> the_day <span class=\"token keyword\">to</span> day <span class=\"token keyword\">of</span> <span class=\"token punctuation\">(</span>current <span class=\"token class-name\">date</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">as</span> string\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>count characters <span class=\"token keyword\">in</span> the_day<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token keyword\">then</span> <span class=\"token keyword\">set</span> the_day <span class=\"token keyword\">to</span> <span class=\"token string\">\"0\"</span> <span class=\"token operator\">&#x26;</span> the_day\n<span class=\"token keyword\">set</span> the_hour <span class=\"token keyword\">to</span> time string <span class=\"token keyword\">of</span> <span class=\"token punctuation\">(</span>current <span class=\"token class-name\">date</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">as</span> string\n<span class=\"token keyword\">set</span> the_date <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>year <span class=\"token keyword\">of</span> <span class=\"token punctuation\">(</span>current <span class=\"token class-name\">date</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">as</span> string<span class=\"token punctuation\">)</span> <span class=\"token operator\">&#x26;</span> <span class=\"token string\">\"-\"</span> <span class=\"token operator\">&#x26;</span> the_mon <span class=\"token operator\">&#x26;</span> <span class=\"token string\">\"-\"</span> <span class=\"token operator\">&#x26;</span> the_day <span class=\"token operator\">&#x26;</span> <span class=\"token string\">\" \"</span> <span class=\"token operator\">&#x26;</span> the_hour\n\n<span class=\"token comment\">--- Save the string to a folder in Dropbox</span>\n<span class=\"token keyword\">set</span> _filename <span class=\"token keyword\">to</span> the_date <span class=\"token operator\">&#x26;</span> <span class=\"token string\">\".md\"</span>\ndo shell <span class=\"token class-name\">script</span> <span class=\"token string\">\"/bin/echo -n \"</span> <span class=\"token operator\">&#x26;</span> quoted form <span class=\"token keyword\">of</span> _content <span class=\"token operator\">&#x26;</span> <span class=\"token string\">\" > $HOME/Dropbox/Documents/Tabs/\"</span> <span class=\"token operator\">&#x26;</span> quoted form <span class=\"token keyword\">of</span> _filename</code></pre></div>\n<p>I use <a href=\"http://www.keyboardmaestro.com/main/\">Keyboard Maestro</a> to assign a hotkey to the script and invoke it whenever I want to save all currently open URLs.</p>",
            "url": "/blog/save-safari-session/",
            "title": "Save Current Safari Session with AppleScript",
            "date_modified": "2015-07-02T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/apple-music-last-fm-scrobbling/",
            "content_html": "<p>Ever since Apple announced <a href=\"https://www.apple.com/music/\">Apple Music</a> at WWDC I was wondering whether it was possible to scrobble played tracks to <a href=\"http://last.fm\">Last.fm</a>. As expected, iTunes on OS X and the Music app on iOS do not directly support scrobbling, but I wanted to see if there are other ways.</p>\n<p>In this post I am going to explore third-party apps that allow scrobbling on OS X and iOS and explain when and what will be scrobbled.</p>\n<p><strong>Update (March 20, 2021):</strong> <a href=\"/blog/last-fm-apple-music-2021/\">Last.fm and Apple Music in 2021</a></p>\n<h2>iTunes on OS X</h2>\n<p>Scrobbling played songs from iTunes always required a third-party application. There is the <a href=\"http://www.last.fm/download\">official Last.fm Mac app</a>, but for the last couple of years I used <a href=\"https://geo.itunes.apple.com/us/app/simplify-for-spotify-rdio/id448003584?mt=12&#x26;uo=4&#x26;partnerId=11&#x26;at=11lSjE\">Simplify</a>. Simplify can scrobble from iTunes, Rdio, Spotify and others and can also display the currently playing song in the menu bar. But does Simplify work with Apple Music? It depends.</p>\n<p>It depends whether iTunes reports the currently playing track via AppleScript or not. We can test whether scrobbling works using a small AppleScript</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"iTunes\"</span>\n    <span class=\"token keyword\">tell</span> current track <span class=\"token keyword\">to</span> artist <span class=\"token operator\">&#x26;</span> <span class=\"token string\">\" - \"</span> <span class=\"token operator\">&#x26;</span> name\n<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span></code></pre></div>\n<p>First of all, scrobbling works for everything that is in <em>My Music</em> (that is, your library). It does not matter if the song is stored locally, streamed from iTunes Match, streamed from Apple Music, or a song from Apple Music that was <em>made available offline</em>. The same is true for playlists, scrobbling works for you local playlists, as well as <em>Apple Music Playlists</em>. But now things get complicated.</p>\n<p>Let's take a look at the <em>For You</em> and <em>New</em> sections.</p>\n<ul>\n<li>If you play a song, album, or playlist directly in the <em>For You</em> section it will <strong>not scrobble.</strong></li>\n<li>If you play from the detail view of a playlist that you previously added to <em>My Music</em> it <strong>scrobbles.</strong></li>\n<li>If you play a playlist directly from the <em>For You</em> section it will <strong>not scrobble.</strong></li>\n<li>If you play a song, or album that you previously added to <em>My Music</em> from the detail view it will <strong>not scrobble.</strong></li>\n<li>If you search for a song, album, or artist and play from the search results it will <strong>not scrobble.</strong></li>\n<li>Everything in <em>Radio</em>, including <em>Beats 1</em> will <strong>not scrobble.</strong></li>\n</ul>\n<p>Basically, only music in <em>My Music</em> and <em>Playlists</em> will scrobble, with the one exception of <em>saved playlists</em>.</p>\n<h2>Music on iOS</h2>\n<p>Scrobbling on iOS is a little bit trickier. Again, you need a third-party software. <a href=\"https://geo.itunes.apple.com/us/app/cloudscrob-for-last.fm/id467016532?mt=8&#x26;uo=4&#x26;partnerId=11&#x26;at=11lSjE\">CloudScrob</a> (€0,99) and <a href=\"https://geo.itunes.apple.com/us/app/quietscrob-background-last.fm/id741599377?mt=8&#x26;uo=4&#x26;partnerId=11&#x26;at=11lSjE\">QuietScrob</a> (free, with €0,99 In-App purchase), both worked in principal for me, but QuietScrob can run in the background, while you have to open CloudScrob to scrobble to Last.fm. Unlike Simplify on OS X, scrobbling with QuietScrob is not immediate but happens in bulk every 30 minutes (or so).</p>\n<p>It looks like the same restrictions as for scrobbling with iTunes and Simplify on OS X apply. However, in addition scrobbling <strong>does not work</strong> when playing an <em>Apple Music Playlist</em>.</p>\n<p>CloudScrob has not been updated since November 2013, but QuietScrob latest update is from May 20, so there is hope that developers will find ways to scrobble additional methods of listening on Apple Music.</p>\n<p>I am <a href=\"http://www.last.fm/user/feredir\">feredir</a> on Last.fm.</p>\n<h2>Updates</h2>\n<ul>\n<li><em>July 8, 2015, 18:15:</em> Add note about background scrobbling in QuietScrob</li>\n<li><em>March 20, 2021, 17:54:</em> Add link to new article on this topic: <a href=\"/blog/last-fm-apple-music-2021/\">Last.fm and Apple Music in 2021</a></li>\n</ul>",
            "url": "/blog/apple-music-last-fm-scrobbling/",
            "title": "Apple Music and Last.fm: Does it Scrobble?",
            "date_modified": "2015-07-08T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/thoughts-on-apple-music/",
            "content_html": "<p>When I open Spotify I am presented with its <em>Overview</em> view. The music presented there is utterly useless, after using Spotify for two years I have never clicked anything there. Apple Music starts in the <em>For You</em> tab, which includes playlists, artists, albums, and songs I might like. In comparison Spotifys <em>Overview</em> is generic, it's something you would show a user that starts the app for the first time, but after hundred or even thousands of hours of listening to music on Spotify it still tries to shove <em>Top Dance Tunes</em> up my ass. After listening with Apple Music for a view days, after adding some of my favourite albums to my library, liking songs the recommendations are pretty good. It is a mixture of songs I know (but have not added to Apple Music) and like and songs I do not know and also like. That's the one thing about Apple Music, <strong>human curation wins</strong>. Playlists on Spotify often contain hundred of songs and run for hours, the longest playlist I found on Apple Music runs for two hours. They are better.</p>\n<p>The other thing about Apple Music is the software. iTunes is a mess, but I argue that it's a better mess than Spotify on OS X. Spotify doesn't have a lot of keyboard shortcuts, you can't configure additional shortcuts and it doesn't support Apple Script. That might be ok for most users, but for power users iTunes is better. The <em>Music</em> app on iOS is a lot better than iTunes, because it is less cluttered. Spotifys iOS app is also better than their OS X app, but is also has plenty of weird UX. In 2015 I kinda expect that the mobile app is better than desktop version.</p>\n<p>When it comes to music, the main advantage of Apple Music is that it combines local and cloud music into one library. I can create playlists, even smart playlists, that can contain songs from both. Spotify has support for local files, but it is primitive and I never used it. However, one thing that Apple has to work on is discovery in <em>My Music</em>. Currently you can only view either <em>Recently Added</em> or <em>All</em>. You can sort that view, but the current options are useless for streaming-size libraries. I am not going to rate hundreds of albums. I don't know what <em>Most Played</em> means in Spotify (because the list definitely does not contain my most played stuff), but Apple Music needs something like this. Not an all time most played/best rated, but more like most played/best rated in the last couple of weeks.</p>\n<p>Sometimes I like a song from an album that has not yet been released yet and Apple Music let me add unreleased albums to my library. They become playable once released, until then I can play the single. That is a pretty great feature. (<em>Update:</em> However, currently this feature is buggy. For me, it worked for two albums, but for most albums it does not and I have to remove and read the album to get all tracks into my library.)</p>\n<p>I like Beats 1 more than expected. Based on the Beats brand I figured that it will be heavy on rap and beat-based music, but I already found one or two artists that I enjoy. It will not become my primary method of music listening, but I will tune in from time to time.</p>\n<p>Scrobbling to Last.fm works. <a href=\"https://florian.ec/articles/apple-music-last-fm-scrobbling/\">Sometimes</a>. Connect is useless, but you can <a href=\"http://www.macworld.com/article/2943254/turning-off-connect-makes-apple-music-better.html\">turn it off</a>.</p>\n<p><em>I have updated the article to reflect that automatically adding music once it is released does currently not work as I described it.</em></p>",
            "url": "/blog/thoughts-on-apple-music/",
            "title": "Thoughts on Apple Music",
            "date_modified": "2015-07-09T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/alfred-iterm2-tabs/",
            "content_html": "<p>I often have lots of tabs and panes open in <a href=\"http://iterm2.com\">iTerm2</a> (the best terminal app for OS X) and it takes a while to find the correct one. Therefore I created a workflow for <a href=\"http://www.alfredapp.com\">Alfred</a> to search through all open tabs and switch to it.</p>\n<p><img src=\"/blog/2015-07-23-alfred-iterm2-tabs/alfred-iterm2-tabs.gif\" alt=\"Search iTerm2 Tabs in Alfred\"></p>\n<p>Install it by <a href=\"https://github.com/florianeckerstorfer/alfred-iterm2-tabs/releases/latest\">downloading the latest version</a> and double-clicking the <code class=\"language-text\">alfred-iterm2-tabs.workflow</code> file. Activate it by using the <code class=\"language-text\">itt</code> keyword.</p>",
            "url": "/blog/alfred-iterm2-tabs/",
            "title": "Alfred Workflow to Search and Switch iTerm2 Tabs",
            "date_modified": "2015-07-23T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favorite-albums-2015-so-far/",
            "content_html": "<p>I really love smart playlists in Apple Music. When I first switched to streaming services I really missed this feature in Spotify and Rdio, but now I finally can stream music and create smart playlists. One of the things I did was that I created a smart playlist for <em>loved</em> tracks as well as smart playlists for <em>loved</em> tracks that have been released in a specific year. And I noticed that 2015 have been a really good year for music so far. Without further ado, here are my favourite albums of 2015 so far.</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/adna-run-lucifer.jpg\" alt=\"Album cover of Run, Lucifer by Adna\"></p>\n<p><strong>Run, Lucifer</strong> by Adna (<a href=\"https://geo.itunes.apple.com/us/album/run-lucifer/id972016418?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/run-lucifer/id972016418?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/4AJgbaJ3XbU2u9d9vivxcg\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00T9R1DZ6/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00T9R1DZ6&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=4MWCVR7GEHNSDFZG\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far//girlpool-before-the-world-was-big.jpg\" alt=\"Album cover of Before The World Was Big by Girlpool\"></p>\n<p><strong>Before The World Was Big</strong> by Girlpool (<a href=\"https://geo.itunes.apple.com/us/album/before-the-world-was-big/id971178450?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/before-the-world-was-big/id971178450?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/3D2wYF44eicjhLTASW86R1\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00U0RAVZM/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00U0RAVZM&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=Y26UVS4EJSKM32HM\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/2015-07-24-favorite-albums-2015-so-far/jenny-hval-apocalypse-girl.jpg\" alt=\"Album cover of Apocalypse, Girl by Jenny Hval\"></p>\n<p><strong>Apocalypse, Girl</strong> by Jenny Hval (<a href=\"https://geo.itunes.apple.com/us/album/apocalypse-girl/id968903924?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/apocalypse-girl/id968903924?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/3AeAZfwBgnhmbNEowNFvcB\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00UART29S/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00UART29S&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=EZE7SQUTF6SAR2PF\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/2015-07-24-favorite-albums-2015-so-far/laura-marling-short-movie.jpg\" alt=\"Album cover of Short Movie by Laura Marling\"></p>\n<p><strong>Short Movie</strong> by Laura Marling (<a href=\"https://geo.itunes.apple.com/us/album/short-movie/id948039984?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/short-movie/id948039984?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/3RkJlZjE0oBkkV3aKoGUjb\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00R6YFV2U/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00R6YFV2U&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=74GPKWGJ4ONSCOSZ\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/marriages-salome.jpg\" alt=\"Album cover of Salome by Marriages\"></p>\n<p><strong>Salome</strong> by Marriages (<a href=\"https://geo.itunes.apple.com/us/album/salome/id969263672?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/salome/id969263672?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/0Abaj1a9EzxXGULZD798HK\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00U25DDHA/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00U25DDHA&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=IOM4HZ6MTVDSHEVH\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/2015-07-24-favorite-albums-2015-so-far/natalie-prass-natalie-prass.jpg\" alt=\"Album cover of Natalie Prass by Natalie Prass\"></p>\n<p><strong>Natalie Prass</strong> by Natalie Prass (<a href=\"https://geo.itunes.apple.com/us/album/natalie-prass/id958344368?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/natalie-prass/id958344368?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/1rRFEJvwq1Bdutw6q3Nz9e\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00PA3DV1M/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00PA3DV1M&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=5G5BI24LJWBMIFDM\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/of-monders-and-men-beneath-the-skin.jpg\" alt=\"Album cover of Beneath The Skin by Of Monsters And Men\"></p>\n<p><strong>Beneath The Skin</strong> by Of Monsters And Men (<a href=\"https://geo.itunes.apple.com/us/album/beneath-the-skin/id976392033?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/beneath-the-skin/id976392033?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/4PAyBqzCYoIIjjPFszeqgT\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00US7XARU/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00US7XARU&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=L76QLVECHBFKXK7H\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/pale-honey-pale-honey.jpg\" alt=\"Album cover of Pale Honey by Pale Honey\"></p>\n<p><strong>Pale Honey</strong> by Pale Honey (<a href=\"https://geo.itunes.apple.com/us/album/pale-honey/id981210406?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/pale-honey/id981210406?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/2Xip3YrY7JUyoFrb8finUD\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00UH8V8L0/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00UH8V8L0&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=VPJRDVMJHIGE6ZJK\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/pins-wild-nights.jpg\" alt=\"Album cover of Wild Nights by PINS\"></p>\n<p><strong>Wild Nights</strong> by PINS (<a href=\"https://geo.itunes.apple.com/us/album/wild-nights/id969888894?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/wild-nights/id969888894?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/1TgJ9hBe9II1DzgKe5BGNQ\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00U396FXO/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00U396FXO&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=UKWS43LWBWRJGCEG\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/tame-impala-currents.jpg\" alt=\"Album cover of Currents by Tame Impala\"></p>\n<p><strong>Currents</strong> by Tame Impala (<a href=\"https://geo.itunes.apple.com/us/album/currents/id989492285?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/currents/id989492285?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/0rxKf57PZvWEoU8v3m5W2q\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00XBWBWBK/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00XBWBWBK&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=EK3NL45TPS6QQR5T\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/team-me-blind-as-night.jpg\" alt=\"Album cover of Blind As Night by Team Me\"></p>\n<p><strong>Blind As Night</strong> by Team Me (<a href=\"https://geo.itunes.apple.com/us/album/blind-as-night/id932758897?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/blind-as-night/id932758897?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/79OeDxygTUSDl22XESHwhX\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00MNYIBNE/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00MNYIBNE&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=OXU5FWF7QRMD2SRP\">Amazon</a>)</p>\n<p><img src=\"/blog/2015-07-24-favourite-albums-2015-so-far/torres-sprinter.jpg\" alt=\"Album cover of Sprinter by Torres\"></p>\n<p><strong>Sprinter</strong> by Torres (<a href=\"https://geo.itunes.apple.com/us/album/sprinter/id960473152?uo=4&#x26;partnerId=11&#x26;at=11lSjE\">iTunes</a>, <a href=\"https://geo.itunes.apple.com/us/album/sprinter/id960473152?uo=4&#x26;partnerId=11&#x26;at=11lSjE&#x26;app=music\">Apple Music</a>, <a href=\"https://open.spotify.com/album/4Uq7Rw4cUuSWrdQgfksMOl\">Spotify</a>, <a href=\"http://www.amazon.de/gp/product/B00SM3M29O/ref=as_li_tl?ie=UTF8&#x26;camp=1638&#x26;creative=19454&#x26;creativeASIN=B00SM3M29O&#x26;linkCode=as2&#x26;tag=fecom-21&#x26;linkId=DGDGOHVBNF6TRLYM\">Amazon</a>)</p>\n<blockquote>\n<p>I am afraid to see my heroes age</p>\n</blockquote>\n<p><em>— The Exchange by Torres</em></p>",
            "url": "/blog/favorite-albums-2015-so-far/",
            "title": "My Favourite Albums of 2015 (so far)",
            "date_modified": "2015-07-24T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/hiking-loosbuehelalm-draugstein/",
            "content_html": "<p>Two weeks ago I was hiking in Großarl, slept at Loosbühelalm and climbed Draugstein (2359m). Here are some pictures.</p>\n<p><img src=\"/2015-07-25-hiking-loosbuehelalm-draugstein/\" alt=\"0797.jpg&#x22;, &#x22;Ascent to Loosbühelalm\"></p>\n<p>Ascent to Loosbühelalm from Großarl.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMGBwL/xAAnEAABAwMCBQUBAAAAAAAAAAABAAIDBAURITEGBxIUYRNBUXGBkf/EABcBAQEBAQAAAAAAAAAAAAAAAAMBAgT/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQIEAxRCMf/aAAwDAQACEQMRAD8A1Wt4aDs4Zn8VV4gorXYoH1F4q4KSNo6sSOw4jw3c/ixW68x+MLhIRU3+4RgjGGP9MfxgCqVbHUT1HVUPmnqJB1markJJzroNyn3XFHOqafpdrnzQl7tws1rh7NujXVGXPd50Ix7aa/aLN32+VrsOfCT5KI9ub6FVbGuSQzyBoAcdlGZZAS4PcHHc53RFiKQrOWkOGXNaT8oiKkP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0801-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0801-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0801-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0801-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0801-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0801-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0801-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0801-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0801-320.jpg\" alt=\"Sundown at Loosbühelalm\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Sundown at Loosbühelalm.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBwMG/8QAIhAAAgEEAgIDAQAAAAAAAAAAAQIDAAQREiExBVEGIqFB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQMFBv/EACARAAIABAcAAAAAAAAAAAAAAAABAgMUMQQFERVRUqH/2gAMAwEAAhEDEQA/AKuKxYHqrWytCMcV429+UX7uzQvDbRg/VVj2/T3+VHPn/LvJHcCURusZiMygLlSduvfA5Aq9FnOHVkyPQzXdo1K1jEiMIyH0bRtecH1Ssqj8tfq80i3lyGlcyPi5KZbrrj0KUje5fV+DKCLk7yQIssBXOzLyx5P86z1Ue7jEc/B23Uu2wBycUpWZRTJsfjLUIpKbFhsS1KUperCf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0802-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0802-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0802-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0802-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0802-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0802-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0802-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0802-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0802-320.jpg\" alt=\"On the way from Loosbühelalm to Draugstein\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>In the morning just after we left Loosbühelalm for Draugstein.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUHCAb/xAAlEAABBAEEAQQDAAAAAAAAAAABAAIDEQQFEiExBwYWMkFRcXP/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAdEQADAAAHAAAAAAAAAAAAAAAAAQIDBBESIkFR/9oADAMBAAIRAxEAPwC+WT5I5LmXXddqq3+YIcTPjkbFjuxXvO/eQJC26PF2DwatQsfqR8MgMUNvb8nudTW/r7K4LU5dPzsybNwMaF5Eu7JdGwEbuTuJJ+ueQni2umDLrc2qRq4aoHgEMhI/oEWaI/I2E9tvMpI4skNsfmkVdZ8JcyB1rMl9tZ5adpDQ2x3R7VcWQDRIBRFngtARETGf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0805-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0805-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0805-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0805-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0805-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0805-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0805-320.jpg\" alt=\"Selfie at Draugstein\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Selfie at Draugstein</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAqEAACAQMBBgUFAAAAAAAAAAABAgMABBEFBxIhIjFhBhMUQXEWF1FSsf/EABgBAAIDAAAAAAAAAAAAAAAAAAIFAQMG/8QAIhEAAgEDAgcAAAAAAAAAAAAAAAERAhTwBIESITFRkdHx/9oADAMBAAIRAxEAPwCbcWz3i28Bdo44l3Y0kAVRk9eHbqffFWn0ReAI8N1p8oIycThd046ENisFtE2vyeINOfTNJtRb2jnnmdAJXX9QBndGe5PxWd0DaDqOnwrDNDHcquAgkBbA7+9NXr0nC5Lz6Ftq4nrm50n0LMTl1Ujhg0qB95fISNE0y4Xl4hXijGewxnHzSrL+jus2Atas+nN9H0G0urUTStKW/AYAfyl0kNlII7e3iXlB3jknr3NKVnK2+KBoVBtoF6RJx4nNKUopZB//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0807-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0807-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0807-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0807-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0807-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0807-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0807-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0807-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0807-320.jpg\" alt=\"Draugstein, taken at Filzmoossattel\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Draugstein front and center and Filzmoossattel at the right</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAEGBwj/xAAnEAABAwMCBAcAAAAAAAAAAAABAAIDBAURBzEGEyEiElFxcpGhwf/EABYBAQEBAAAAAAAAAAAAAAAAAAMAAf/EABoRAQABBQAAAAAAAAAAAAAAAAABERIhYYH/2gAMAwEAAhEDEQA/ANhslPHTxNIDuozjG6stLyHxdzAM7HC5y4Y10p2RNiv1vmjcNpaXvbn2nqPkq0z6x2Y0b32yq50jRkRuYWHHoQlnI4i1rc1HAZCQ36Rc0V2t15dUOMUTQzYYkx+IrrKaYsVG2MEhERmT4j5oiLU//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0810-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0810-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0810-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0810-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0810-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0810-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0810-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0810-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0810-320.jpg\" alt=\"Foggy view from Loosbühelalm\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>After we came back to Loosbühelalm it rained for a while and was foggy, but then the sky started clearing again.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAIGAQMIB//EACkQAAEDAwQABAcAAAAAAAAAAAECAwQABREGEiExIiNBgQcTFFFSccH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQT/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQISAxFRMv/aAAwDAQACEQMRAD8AhatSXuKiK9aH0LguIStTEZzeWznnaFcAHnAP8q/wdYm5KDTNxSXUBJLL3lKRz1+JNc3aRkOM3uITIcioLiUrcaVtIGezzg+9e1akv8SxNfUW1tpcmO3hUgbVhfPW7GDz3gYzQylPH5CqXty+Tozim3lymlZzjsEfcYOKVz9O+Jt4W9uYdLaCM4WlKjn17FKVTycRKMz8uOyFqRDj8kjG3it8d4TY5ZkMtLZPi2FPhz+valKwbYpExIJWoG3wzg4Hl+lKUqWfSH//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0812-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0812-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0812-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0812-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0812-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0812-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0812-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0812-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0812-320.jpg\" alt=\"Loosbühelalm from above\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Looking back at Loosbühelalm after we left on the second morning.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAEFAAAAAAAAAAAAAAAAAAgCAwQFB//EACYQAAEDBAAEBwAAAAAAAAAAAAEAAgMEBREhBhJBYRMiMUJRotH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAQD/xAAaEQACAgMAAAAAAAAAAAAAAAAAAQIREiFR/9oADAMBAAIRAxEAPwDrVt4k4bjkkcy5QepzzB7ck/Gtq5fL5Y6mjdG6vp4ZZTuSOoEYPfJ/FGWnvcBADZm66ZwSVgXW+OknczxPK3WjlNcYrdhFk9USHF5sdI1sTeKJyAPbO7H1GEUaXXhpO+c90WuPS4S4aQ9eydERFYkpREUKf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0815-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0815-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0815-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0815-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0815-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0815-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0815-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0815-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0815-320.jpg\" alt=\"View from Gründegg\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>We climbed Gründegg (2168m) and got some pretty light and shadow play.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFBgT/xAAmEAABBAIBAwMFAAAAAAAAAAABAgMEEQASBQYHIRMi0SMxobHw/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQF/8QAHBEAAgIDAQEAAAAAAAAAAAAAAAECERMxUQNh/9oADAMBAAIRAxEAPwDvJ/W/GvdSxUT48tqI3FccQmbDcQtDm6ACFa+BW1n7ZvLficrCW9DfbLTo2bcH1EV482KIyGTO6cw8w1yTcdptaY6owFXQ3Cif1noT3cnOkexgGvO7fwctivpJK+FIW7yaFqS0iK+gGg4EqAP5xk6Hdjk27CmI4N3QScY2RcQOOXWTvi4LM2AS/sdEqUmjVH+GZcdkOzSzstDe2tJPzjGZ7bply2dGvpyAki/WWSAbU4bxjGZr9JXsakf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0819-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0819-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0819-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0819-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0819-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0819-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0819-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0819-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0819-320.jpg\" alt=\"Summit cross at Gründegg\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Summit cross at Gründegg</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcDBAUG/8QAJRAAAgEEAQMEAwAAAAAAAAAAAQIDAAQRIQUSEzEGQVFhMoHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIDAf/EABwRAAIBBQEAAAAAAAAAAAAAAAABAgMREhMhUf/aAAwDAQACEQMRAD8AjljeS9lkjJGWXfxXSvoZxKqwpJKkajGEbZI81Q/Q3oZuInYXvIWkUkowZu27dHwB4H7NeqNksbMBeNOCBiWM6P2KlKtZ8JS9RGLLg+VvYO5BYBwD0sWIU587B37ilV6bj3kkZ1vpQCc7UfylJukLkdERJOmZVBycVgtLeK2jKwJ0J1fjkkDf3SlSZjNyaNQ41nQ879qUpQxj/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0829-960.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0829-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0829-640.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0829-1280.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0829-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0829-320.jpg, /blog/hiking-loosbuehelalm-draugstein/IMG_0829-640.jpg 2x, /blog/hiking-loosbuehelalm-draugstein/IMG_0829-960.jpg 3x\" src=\"/blog/hiking-loosbuehelalm-draugstein/IMG_0829-320.jpg\" alt=\"Cows on the way down\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>We made some friends on our way down.</p>",
            "url": "/blog/hiking-loosbuehelalm-draugstein/",
            "title": "Hiking at Loosbühelalm and Draugstein",
            "date_modified": "2015-07-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/ios-search-bar-ionic/",
            "content_html": "<p>In iOS there is a very specific interaction when using a search bar in a list view. When the user focuses the input field, the field moves into the header and the cancel button slides in from the right. The interaction looks like this in Contacts, but it is also used in Mail and apps like Tweetbot.</p>\n<p><img src=\"/blog/2015-07-25-ios-search-bar-ionic/ios-search-bar.gif\" alt=\"iOS Search Bar Interaction\"></p>\n<p>I wanted to replicate the functionality in <a href=\"http://ionicframework.com\">Ionic</a>, a HTML5 framework to create mobile apps using <a href=\"http://cordova.apache.org\">Cordova</a>.</p>\n<p>I am going to show you how to create a <code class=\"language-text\">ion-search-bar</code> directive as well as the required CSS to replicate this functionality with Ionic. Lets first take a look at the markup that describes our interface</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>ion-nav-bar</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token comment\">&#x3C;!-- Nav Bar Stuff --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>ion-nav-bar</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>ion-search-bar</span> <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Search Books<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>ion-search-bar</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>ion-content</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>has-header has-search-bar<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token comment\">&#x3C;!-- Content Stuff --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>ion-content</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>This is pretty simple. Please note that I added a <code class=\"language-text\">has-search-bar</code> class to the <code class=\"language-text\">ion-content</code> element. Now we need a directive to actually create the search bar. The code pretty straight forward (as straight forward as Angular can be), the important stuff happens in the event handler for <code class=\"language-text\">focus</code> and <code class=\"language-text\">blur</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">angular\n  <span class=\"token punctuation\">.</span><span class=\"token function\">module</span><span class=\"token punctuation\">(</span><span class=\"token string\">'florian.directives'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// Create a `ion-search-bar` directive</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">directive</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ionSearchBar'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">$timeout</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">restrict</span><span class=\"token operator\">:</span> <span class=\"token string\">'E'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">replace</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">scope</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">search</span><span class=\"token operator\">:</span> <span class=\"token string\">'=?filter'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token function-variable function\">link</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">scope<span class=\"token punctuation\">,</span> element<span class=\"token punctuation\">,</span> attrs</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        scope<span class=\"token punctuation\">.</span>placeholder <span class=\"token operator\">=</span> attrs<span class=\"token punctuation\">.</span>placeholder <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n        scope<span class=\"token punctuation\">.</span>search <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">focus</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>attrs<span class=\"token punctuation\">.</span>class<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          element<span class=\"token punctuation\">.</span><span class=\"token function\">addClass</span><span class=\"token punctuation\">(</span>attrs<span class=\"token punctuation\">.</span>class<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// We need the actual input field to detect focus and blur</span>\n        <span class=\"token keyword\">var</span> inputElement <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// This function is triggered when the user presses the `Cancel` button</span>\n        scope<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">cancelSearch</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// Manually trigger blur</span>\n          inputElement<span class=\"token punctuation\">.</span><span class=\"token function\">blur</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          scope<span class=\"token punctuation\">.</span>search<span class=\"token punctuation\">.</span>value <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// When the user focuses the search bar</span>\n        angular<span class=\"token punctuation\">.</span><span class=\"token function\">element</span><span class=\"token punctuation\">(</span>inputElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">'focus'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// We store the focus status in the model to show/hide the Cancel button</span>\n          scope<span class=\"token punctuation\">.</span>search<span class=\"token punctuation\">.</span>focus <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n          <span class=\"token comment\">// Add a class to indicate focus to the search bar and the content area</span>\n          element<span class=\"token punctuation\">.</span><span class=\"token function\">addClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'search-bar-focused'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          angular\n            <span class=\"token punctuation\">.</span><span class=\"token function\">element</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.has-search-bar'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">addClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'search-bar-focused'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token comment\">// We need to call `$digest()` because we manually changed the model</span>\n          scope<span class=\"token punctuation\">.</span><span class=\"token function\">$digest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// When the user leaves the search bar</span>\n        angular<span class=\"token punctuation\">.</span><span class=\"token function\">element</span><span class=\"token punctuation\">(</span>inputElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token string\">'blur'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          scope<span class=\"token punctuation\">.</span>search<span class=\"token punctuation\">.</span>focus <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n          element<span class=\"token punctuation\">.</span><span class=\"token function\">removeClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'search-bar-focused'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          angular\n            <span class=\"token punctuation\">.</span><span class=\"token function\">element</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.has-search-bar'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">removeClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'search-bar-focused'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">template</span><span class=\"token operator\">:</span>\n        <span class=\"token string\">'&#x3C;div class=\"search-bar bar bar-header item-input-inset\">'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;label class=\"item-input-wrapper\">'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;i class=\"icon ion-ios-search placeholder-icon\">&#x3C;/i>'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;input type=\"search\" placeholder=\"\" ng-model=\"search.value\">'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;/label>'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;button class=\"button button-clear button-positive\" ng-show=\"search.focus\" ng-click=\"cancelSearch()\">'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'Cancel'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;/button>'</span> <span class=\"token operator\">+</span>\n        <span class=\"token string\">'&#x3C;/div>'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>All the styling and animation is defined in CSS, or in my case in Sass. If you look at the template code in the directive above you can see that I am (misusing) the <code class=\"language-text\">bar-header</code> to position the search bar. Therefore we need to move the search bar and the content area a few pixels down in the unfocused state and back up in the focused state. One thing in the code below is still bothering me but I couldn't figure out a nicer solution and that is the <code class=\"language-text\">margin-right</code> right in <code class=\"language-text\">button.ng-hide</code>. What happens is that Angular hides the cancel button using <code class=\"language-text\">display: none</code> but this cannot be animated and I could not figure out another way to move the <em>Cancel</em> button off screen in an animatable way. If you have any suggestions please contact me.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.search-bar</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 44px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> all ease-in-out 250ms<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">z-index</span><span class=\"token punctuation\">:</span> 15<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">button,\n  input</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> all ease-in-out 250ms<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">button.ng-hide</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">margin-right</span><span class=\"token punctuation\">:</span> -67px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">&#x26;.search-bar-focused</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.has-search-bar</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin-top</span><span class=\"token punctuation\">:</span> -2px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 88px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> top ease-in-out 250ms<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">&#x26;.search-bar-focused</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 44px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This code works great in the browser (I tested it in Safari, Chrome and Firefox), but on iOS we need to consider the status bar at the top. We need to add <code class=\"language-text\">20px</code> to all the <code class=\"language-text\">top</code> values and remove the top margin of the input field when the search bar is not focused. As you can see in the very first selector, that code is not required if your app runs in fullscreen.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.platform-ios.platform-cordova:not(.fullscreen)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.search-bar.bar-header</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 44px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 64px<span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\">&#x26;.search-bar-focused</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 64px<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">.search-bar.bar-header.item-input-inset</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token selector\">.item-input-wrapper</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> all ease-in-out 250ms<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">margin-top</span><span class=\"token punctuation\">:</span> 0 <span class=\"token important\">!important</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">.search-bar.search-bar-focused.bar-header.item-input-inset</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token selector\">.item-input-wrapper</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">margin-top</span><span class=\"token punctuation\">:</span> 19px <span class=\"token important\">!important</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">.has-search-bar</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 108px<span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\">&#x26;.search-bar-focused</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 64px<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In iOS simulator the interaction looks like this:</p>\n<p><img src=\"/blog/2015-07-25-ios-search-bar-ionic/ionic-search-bar.gif\" alt=\"iOS Search Bar Interaction\"></p>\n<p>If you look closely at the animation and the one above with the original iOS behaviour you can see that I am not using a grey background for the search bar. Personally I like the white background better.</p>",
            "url": "/blog/ios-search-bar-ionic/",
            "title": "Replicating the iOS Search Bar with Ionic",
            "date_modified": "2015-07-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/the-problem-with-online-advertisment/",
            "content_html": "<p>On Wednesday Apple released iOS 9 and one of its features is the <a href=\"https://www.webkit.org/blog/3476/content-blockers-first-look/\">WebKit Content Blocker API</a> which allows developers to create ad and tracker blockers for iOS. Apple did not create an ad blocker themselves, but they gave developers the possibility to create one and many have done so. I use <del>Peace</del> (<a href=\"http://www.marco.org/2015/09/18/just-doesnt-feel-good\">has been pulled from the App Store</a>) by <a href=\"http://marco.org\">Marco Arment</a>, but I have also heard good things about <del>Crystal</del> (<a href=\"http://www.wsj.com/articles/propelled-by-apple-ad-blocking-cottage-industry-emerges-1443115929\">Crystal now whitelists ads from companies that pay</a>). While many people want to use this apps to get rid of ads, I want to reduce the amount of tracking I am exposed to. In this article I am going to explain how you can be tracked on the internet and why it is a problem.</p>\n<p>There are many ways to track users across the web, and I want to begin with the most basic one. When you open a website in a browser or when an app you are using is talking to a server the data is most likely transferred over the HTTP protocol (or HTTPS if it is a secure connection). If you are reading this article right now in a web browser you leave something like this on my server:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">42.42.42.42 - - [17/Sep/2015:18:10:29 -0400] \"GET /articles/thoughts-on-apple-music/ HTTP/1.1\" 200 3190 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/8.0.8 Safari/600.8.9\"</code></pre></div>\n<p>The interesting parts, from a privacy perspective are the IP address (the first part) and the user agent (the last part). In the example above the IP address is <code class=\"language-text\">42.42.42.42</code> (obviously not my real one), which is the internet address of my computer (or of my home network). The user agent is an identifier of my browser, each browser and each version has its own user agent. There is a <a href=\"http://useragentstring.com/pages/useragentstring.php\">massive amount of different user agents</a>. Because user agents are different based on the operating system you are using, the browser, the version of the browser and sometimes even the plugins you have installed it is possibly to identify people solely on their user agent. The Electronic Frontier Foundation (EFF) has done some research on <a href=\"https://www.eff.org/deeplinks/2010/01/tracking-by-user-agent\">user agent tracking</a> in 2010.</p>\n<p>At this point I should mention that by identifying I don't mean that they know your name, it just means that if you access the site a few days or weeks later they can recognise that you are the same person.</p>\n<p>Additionally if you are running JavaScript on a site you can extract even more information. For example, the <code class=\"language-text\">Screen</code> object in JavaScript contains information about your display, which includes the size of your screen and the pixel density. You can also retrieve the width and the height of the browser window. Combining all these types of information, IP address, user agent, screen sizes and so on you can be identified within a pretty large group of people already and we haven't even started with cookies yet.</p>\n<p>Cookies are key-value pairs that a site can leave in your browser. When you visit the same site later it can read the value from the cookie it had written before. This is pretty useful, without the concept of logging into a website would not work. But this technique can also be used to track users across a long time span.</p>\n<p>All these techniques described above are useful to develop websites, a web server can't send us the page we requested if it does not know our IP address, without cookies it would not be possible to create websites that require a login and the information about our screen and browser are useful to developers to create a better user experience. But the thing is, a website can include arbitrary resources from other servers. This can be either images, styles, or JavaScript code. And these scripts get access to the same information then the main websites you visited.</p>\n<p>Well, expect cookies, because for a few years now most browsers block so called <em>third party cookies</em>, which means that now only the website you are visiting can set a cookie, not images, stylesheets, and scripts that are loaded from a different server. However, advertising is a shady business and advertisers and tracking companies always try to find bugs and tricks to circumvent this. Not only the shady ones, even Google does it. Examples <a href=\"http://9to5mac.com/2012/02/17/google-reportedly-forcing-advertising-cookies-upon-iphone-users-regardless-of-safari-privacy-settings/\">here</a> and <a href=\"http://www.rimmkaufman.com/blog/how-redirectors-solve-the-third-party-cookie-problem/24032011/\">here</a>.</p>\n<p>The problem I have with advertisement and tracking companies is that they are everywhere. I can absolutely live with the fact the website I am visiting is knowing which pages I access, but the problem is that the same ad servers and trackers are included everywhere and if these companies can get enough identifying data from your browser they can track your browsing history quit accurately. They could know which food you like, if you have financial problems, if you are looking for a partner, and, of course, what kind of porn you like. I am also a little bit scared that some governments have deals with these companies and got a backdoor for this information. Ever since Snowden you can never know. Some may just have some pretty weak security and hackers can get into their servers.</p>\n<p>Nowadays we rarely type an URL into the address bar of our browser. Instead we click on links on Facebook or Google and thus we often don't know the site we are browsing to and we don't know which type of trackers they include. And most publishers of content include dozens of them. If you look at news sites or blogs you will often find over twenty different third party resources. <a href=\"http://theverge.com\">The Verge</a>, for example, includes 116 resources from 65 different serves on a single page. Not all of these are trackers or advertisement, but still my information is sent to another server.</p>\n<p>Using content blockers does not fully solve this problem, but at least it gives users more control over our data. Currently it looks like that whenever an advertiser is coming to a publisher and saying include this JavaScript on your page the publisher says <em>yes, of course.</em> If more people are starting to use ad blockers publishers will need to think about different ways of monetising their content or about different ways to display advertisement.</p>\n<p><strong>Update September 24, 2015:</strong>\nRemoved the links to both Peace and Crystal from the article. Peace <a href=\"http://www.marco.org/2015/09/18/just-doesnt-feel-good\">has been pulled from the App Store</a> and Crystal now <a href=\"http://www.wsj.com/articles/propelled-by-apple-ad-blocking-cottage-industry-emerges-1443115929\">accepts payments from advertises to whitelists</a> ads. Doesn't feel good to recommend Crystal anymore.</p>",
            "url": "/blog/the-problem-with-online-advertisment/",
            "title": "The Problem with Online Advertisement",
            "date_modified": "2015-09-18T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/chain-better-arrays-in-php/",
            "content_html": "<p>The array functions in PHP are, like many other things in PHP, a mess. One problem is the inconsistency in the API, for example, <code class=\"language-text\">array_map()</code> accepts a callback as first parameter and the array as second; on the other hand, <code class=\"language-text\">array_filter()</code> accepts the array as first parameter and a callback as second. In general, wrapping the function around the array produces code that is hard to read and is not very nice to look at.</p>\n<p>In the following example we generate an array with <code class=\"language-text\">10</code> elements with a value of <code class=\"language-text\">20</code>, then we assign to each element a random number between <code class=\"language-text\">0</code> and the elements value (that is, <code class=\"language-text\">20</code>) and then filter the array to only contain <em>odd</em> values.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$arr</span> <span class=\"token operator\">=</span> <span class=\"token function\">array_filter</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">array_map</span><span class=\"token punctuation\">(</span>\n        <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token function\">rand</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token function\">array_fill</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token variable\">$v</span> <span class=\"token operator\">&#x26;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>How long do you need to look at the following piece of code to understand it?</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">echo</span> <span class=\"token function\">array_sum</span><span class=\"token punctuation\">(</span><span class=\"token function\">array_intersect</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">array_diff</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">array_filter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token operator\">!</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span> <span class=\"token operator\">&#x26;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>I use the kind of array operations frequently in other languages, but only very seldom in PHP. Today while taking a walk I thought about this problem and a possible solution. What I came up with is <a href=\"https://github.com/cocur/chain\">Chain</a>, an object-oriented wrapper for arrays that allow chaining of array manipulations.</p>\n<p>First let us take a look at what the above examples look like with Chain. The first one is pretty straight forward, create a filled array, map and filter.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$chain</span> <span class=\"token operator\">=</span> <span class=\"token class-name static-context\">Chain</span><span class=\"token operator\">::</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span>\n    <span class=\"token operator\">-></span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token function\">rand</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token operator\">-></span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token variable\">$v</span> <span class=\"token operator\">&#x26;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The second example is also pretty straight forward I believe</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">echo</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Chain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token operator\">-></span><span class=\"token function\">diff</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token operator\">-></span><span class=\"token function\">intersect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Chain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token operator\">!</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$v</span> <span class=\"token operator\">&#x26;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token operator\">-></span><span class=\"token function\">sum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>By using Chain the information is defined in the order we need to understand it. First we define an array, then we create a diff and intersect it with another chain, which is filtered. Lastly we build the sum of the resulting array.</p>\n<p>There exist three kind of methods:</p>\n<ol>\n<li>methods to create the array,</li>\n<li>methods to manipulate the array,</li>\n<li>and methods to retrieve the array, a property of the array or reduce the array to a single value.</li>\n</ol>\n<p>Currently you can create a <code class=\"language-text\">Chain</code> by passing an array to the constructor or by using the static <code class=\"language-text\">::fill()</code> method which\nworks exactly like <code class=\"language-text\">array_fill()</code>.</p>\n<p>Methods that manipulate an array always modify the internal representation of the array and return an instance to the <code class=\"language-text\">Chain</code> object (that is, they are chainable). When a method accepts an array as parameter it also accepts an <code class=\"language-text\">Chain</code> object instead.</p>\n<p>The last kind of method are those that return some kind of value, not the object. This includes <code class=\"language-text\">->count()</code>, <code class=\"language-text\">->sum()</code> and <code class=\"language-text\">->reduce()</code>. If you want to retrieve the underlaying array you can use the public property <code class=\"language-text\">->array</code>.</p>\n<p>Take a look at the <a href=\"https://github.com/cocur/chain\">Chain</a> project on Github; I started with a very basic implementation this evening and implemented some methods. There are still many array functions missing but I hope I to add them very soon.</p>\n<p>If you want to help out I would appreciate pull requests very much. You will see that implementing new methods is very easy. I decided to use traits for this project, mostly because the amount of array functions in PHP would make the <code class=\"language-text\">Chain</code> class and the associated test class huge. By using traits we have a lot of small classes and a lot of small and simple test classes.</p>",
            "url": "/blog/chain-better-arrays-in-php/",
            "title": "Chain: Better Arrays in PHP",
            "date_modified": "2015-09-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/testing-traits-with-mocks-in-phpunit/",
            "content_html": "<p>If you looked at <a href=\"https://github.com/cocur/chain\">Chain</a>, the library I <a href=\"https://florian.ec/articles/chain-better-arrays-in-php/\">released yesterday</a> you may have noticed that most of the functionality is implemented in <a href=\"http://php.net/manual/en/language.oop5.traits.php\">traits</a> to keep single classes small and clean. I also want to keep the tests clean and was delighted to find out that you can mock a class that <em>uses</em> a trait.</p>\n<p>Creating a mock is pretty straight forward with PHPUnit:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$mock</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">getMockForTrait</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'TraitUnderTest'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token variable\">$mock</span><span class=\"token operator\">-></span><span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In addition you can mock methods of the <em>using</em> object that are called by the mock.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$mock</span><span class=\"token operator\">-></span><span class=\"token function\">expects</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">any</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n     <span class=\"token operator\">-></span><span class=\"token function\">method</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'isBar'</span><span class=\"token punctuation\">)</span>\n     <span class=\"token operator\">-></span><span class=\"token function\">will</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token function\">returnValue</span><span class=\"token punctuation\">(</span><span class=\"token constant boolean\">TRUE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Source:</strong></p>\n<ul>\n<li><a href=\"https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mocking-traits-and-abstract-classes\">PHPUnit: Mocking Traits and Abstract Classes</a></li>\n</ul>",
            "url": "/blog/testing-traits-with-mocks-in-phpunit/",
            "title": "Testing Traits with Mocks in PHPUnit",
            "date_modified": "2015-09-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/video-streams-in-gulp-js/",
            "content_html": "<p>Back in June I talked about <a href=\"/gulp-js-streams/\">Streams in Gulp.js</a> at the Vienna.js meetup and Roland Schütz filmed and edited the video and it's now available on YouTube: <a href=\"https://www.youtube.com/watch?v=hRe7_xsQBUQ\">Streams in Gulp.js (Video)</a></p>\n<p>There are things I could have done better, especially in the question and answer part, but I am actually pretty proud of it.</p>",
            "url": "/blog/video-streams-in-gulp-js/",
            "title": "Streams in Gulp.js",
            "date_modified": "2015-10-13T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/united-kingdom-august-2015/",
            "content_html": "<p>For the last couple days the weather in Vienna was cold, wet, and windy. This reminded me of my trip to Scotland in the summer and the fact that I still have not posted any pictures here. Many of these I have already put on <a href=\"https://www.instagram.com/florian_/\">Instagram</a> or <a href=\"http://42reasons.com\">Tumblr</a>, but I wanted to all have them here on my on server.</p>\n<p>Together with my friend Karin we bought Interrail tickets and on the first day we started from Linz to Cologne.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcDBAYF/8QAKRAAAgEEAQEGBwAAAAAAAAAAAQIDAAQFESESBhMxYZGhBxQXIkFicf/EABcBAAMBAAAAAAAAAAAAAAAAAAQFBgP/xAAeEQACAgICAwAAAAAAAAAAAAABAgADBBEUMUJRUv/aAAwDAQACEQMRAD8A5PN5dY7pbeBg8rMA5ALdH5O9eW6wk96odQR1Dej4jyrwbQRPkbZWm7qYSoFcEsHZiV2f4AfWqZ8LuyKdq7iWN79Io4WYsOgl2UtxoHw5OuaeY2eWdjYdDUTX4IRFFY2dziWU75pVX+lN3k5JrnEXtgLFpHWNXmLMoViNMQut7FKPGbR9Qbj2jxkEtIw+WLcqYnLLr9dAe1bpyF7js8PlLuaNmeHbBtE6AYe4HpSlTEoBKlie1mWfGW0ouCryr1vrf3Ns88mlKUKXYHuahR6n/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0194-960.jpg, /blog/united-kingdom-august-2015/IMG_0194-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0194-640.jpg, /blog/united-kingdom-august-2015/IMG_0194-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0194-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0194-320.jpg, /blog/united-kingdom-august-2015/IMG_0194-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0194-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0194-320.jpg\" alt=\"Dome in Cologne\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>On the second day we took a train to Rotterdam and then a ferry to Harwich in England and spent a night in London.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMEBwj/xAAmEAACAQQABQQDAAAAAAAAAAABAgMABAURBhITITEHMmGRQaHw/8QAFgEBAQEAAAAAAAAAAAAAAAAABAIF/8QAGREAAwEBAQAAAAAAAAAAAAAAAAECEiFB/9oADAMBAAIRAxEAPwDUIZpV52mRGbXYKgC/QqjksvFhMfdZXKyCK0gXtHGoDOx9qLoeSf7tVK49QeG7PIRwXGRtJEdCS8Tc/TYfhtb81Rz/ABb6f5y3S3vru3lkUnoPLG/LG57b3rX3Wg6Tl5QBRapaZi+fvc9xZlZ8rJC7LIeWNUJ5Y0HhR8D9ndK3fGWvDzW5a2v7FoC7FOlOhABO9efmlH6J0cuKxA7dqFifJpSneEkRVd+0fVKUqSj/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0183-960.jpg, /blog/united-kingdom-august-2015/IMG_0183-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0183-640.jpg, /blog/united-kingdom-august-2015/IMG_0183-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0183-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0183-320.jpg, /blog/united-kingdom-august-2015/IMG_0183-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0183-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0183-320.jpg\" alt=\"On deck of the ferry from Rotterdam to Harwich\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcEBgj/xAAnEAACAQMCBQQDAAAAAAAAAAABAgMABAURIQYHEiJhExQxQSNxgv/EABgBAAIDAAAAAAAAAAAAAAAAAAQFAgMG/8QAJREAAQMCAwkAAAAAAAAAAAAAAQACAwQRBRKhExQiUWGBgrHB/9oADAMBAAIRAxEAPwC0+zMY0I11rBmM1i+HoYpMtOlvHIxRXf41AJ+vArTxVmJcFw7e38MHuZoU/FFuS7kgKNvJrztkMbmM1fyX/FV+LRpu4xsvqSkFdO2MHRdth1EVe+UNF3GyhDTvmdljBJ6KwNzIxryyra2d3OkbdBftj30B+GIP2KVKTHg4yQcZPdn7muL2RGb+Y9FA8b/ulC7/AAc9E0GBVhF8uoVX5o3UsHD8SwsUEk3SxUkEgKTpXCcw2dc90GR3QW8RQN8ICgPSPAJOlKUJXHiPb6muBAbNvl7auTLHWlKUrWkX/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0186-960.jpg, /blog/united-kingdom-august-2015/IMG_0186-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0186-640.jpg, /blog/united-kingdom-august-2015/IMG_0186-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0186-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0186-320.jpg, /blog/united-kingdom-august-2015/IMG_0186-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0186-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0186-320.jpg\" alt=\"Ferry from Rotterdam to Harwich\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAECBAYI/8QAKRAAAQQBAgQFBQAAAAAAAAAAAQACAxEEBSESFCIxEyRBUXFSYYGR0f/EABcBAAMBAAAAAAAAAAAAAAAAAAEEBQL/xAAfEQACAQIHAAAAAAAAAAAAAAAAAQIUUQMEESExkbH/2gAMAwEAAhEDEQA/ANyk0Jjhbv6keiRsNtofITHzdRka3w8vFfV8XTfd1igHb0Kb++yudTzYJzHkclKAT0tsOIrb7b/KpvOLh+Eylb3WnZaPTIWtqQtLr+i6RZEeqY7W+bdhQyHfgM+4Hp6IhUxuFYMrI5mZnZDBTZCAfZUmzZ3PJc8kn3REoOojm5T3IP4REWgH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0189-960.jpg, /blog/united-kingdom-august-2015/IMG_0189-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0189-640.jpg, /blog/united-kingdom-august-2015/IMG_0189-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0189-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0189-320.jpg, /blog/united-kingdom-august-2015/IMG_0189-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0189-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0189-320.jpg\" alt=\"Container ship in the port of Harwich\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwgD/8QAKBAAAgEDAgQGAwAAAAAAAAAAAQIDAAQRBRIGFCExEyJBUWGBQqGx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIDAP/EAB4RAAIBBAMBAAAAAAAAAAAAAAABAhESIWEDMZGx/9oADAMBAAIRAxEAPwDeXvY/WSP7NeD39uDjmoAe+NwrnyfUJ2mQrcuY3DSRwCNfMV/Lf3ChsD5PQeuKw+q6nLqml8xb2kNrAI4L2SGPc0y7ssz5B8xUkdParOSrgjGLaqdNPrmmq7K2qWYYHBBnQY/dKgrfhPgDlYHfSrRg6B1cR7g6nscrgUrX6DZswXSbqW+CXsxHjXFwyttGFVIwoRFHoo3Hp91MXMScxqPlHcf3FKVKHXv0fkwysPx3rfD2NNsJomtYifDWaPeUBY9AfbOTj5pSlBDn/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0192-960.jpg, /blog/united-kingdom-august-2015/IMG_0192-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0192-640.jpg, /blog/united-kingdom-august-2015/IMG_0192-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0192-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0192-320.jpg, /blog/united-kingdom-august-2015/IMG_0192-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0192-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0192-320.jpg\" alt=\"On board of the ferry from Rotterdam to Harwich\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>After a few drinks in Hackney and a good nights sleep we continued to Newcastle-upon-Thyne in the north of England.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAIE/8QAKBAAAgEDAgUDBQAAAAAAAAAAAQMCAAQRBQYSITFRgQcTQRQiM4KR/8QAGQEAAQUAAAAAAAAAAAAAAAAABAABAgMF/8QAGhEAAwEBAQEAAAAAAAAAAAAAAAECAxJSEf/aAAwDAQACEQMRAD8AmG3N+6dYXzTDX9Mctox7Lr4RAOc5BNSPUtxKcqL22Tri3mfzWrltWP2iayS20tAvmp6xIxIBTnl3r27d12+2pqarnRrpqwDwtRKJEGR+RKPTzRb2VV1UoGWLU8y2a/sZ6P8ATRKXQMDz++QEvIPzSqcs9/7blbQN2toceZEYjxSp85eipVr4LvWBKPt8MRDGOERGMdsVzc6faztpKmlc1EY4JQiRjt0pSs8NITfem22rq5m02jVE9YqdKMf5mlKUvrHP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0180-960.jpg, /blog/united-kingdom-august-2015/IMG_0180-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0180-640.jpg, /blog/united-kingdom-august-2015/IMG_0180-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0180-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0180-320.jpg, /blog/united-kingdom-august-2015/IMG_0180-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0180-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0180-320.jpg\" alt=\"Gatehead building in Newcastle-upon-Thyne\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHBP/EACYQAAIBBAICAQQDAAAAAAAAAAECAwAEBREGITFBEhMVcaFRgZH/xAAXAQEAAwAAAAAAAAAAAAAAAAADAAEF/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAEDEQISUTH/2gAMAwEAAhEDEQA/AILkXHQMJPOQAY9MGPrsVJ4BIfusEN5B9eCVxC6ggMAxA2pPQYeieq2tMlHhRbzXKNPbFgUdmSeKT+BvXf6qfvLbjNzzfEZWBoLKylLT3FuukQyI3QUEEAHY67HRqY8LfSJ5lxWfjedlsHczoAHjlQdOp9/6CP6pWwcpv8VkMkLh75fk8Y7WJSD572Ts/r8UpaD3M7yefyOreyjnEVvMqROqIvY0CfI8n2fdU+JvDJLw+zmgt5bZJbm2+Dxghk2o0fxSlDA2/RpktUd3LeEYWTMNIkDQB0B+ERCqPPgapSlK0rM2z//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0193-960.jpg, /blog/united-kingdom-august-2015/IMG_0193-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0193-640.jpg, /blog/united-kingdom-august-2015/IMG_0193-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0193-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0193-320.jpg, /blog/united-kingdom-august-2015/IMG_0193-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0193-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0193-320.jpg\" alt=\"Inside Gatehead building in Newcastle-upon-Thyne\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>On the next morning we finally made our way to Scotland and for the first couple of nights we stayed in Edinburgh.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAgMH/8QAJRAAAQQBAgUFAAAAAAAAAAAAAgABBREDBAcSEyFBUWKBkbLB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAQF/8QAGhEBAAIDAQAAAAAAAAAAAAAAAGKhARQVUv/aAAwDAQACEQMRAD8AocodaWA4nd6pRj3c0zG5Y4eSJ+3MmC/AWod28PHZwmrfzUxlt/kVq9OFotCdLYNKTtbC7+yKDj3bjxGnhpi/TNHX1ROpnxZoTpyFERZi4REQf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0197-960.jpg, /blog/united-kingdom-august-2015/IMG_0197-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0197-640.jpg, /blog/united-kingdom-august-2015/IMG_0197-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0197-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0197-320.jpg, /blog/united-kingdom-august-2015/IMG_0197-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0197-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0197-320.jpg\" alt=\"North bridge in Edinburgh\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAgEAwUG/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQIDAAQhBhESBTGRBxNRFUJxobH/xAAZAQACAwEAAAAAAAAAAAAAAAABAwACBAX/xAAgEQACAQIHAQAAAAAAAAAAAAAAAQIDExESFCExQVFS/9oADAMBAAIRAxEAPwCgOm3TuwaYFeWQCc+K0S38Qm488Cpfm0nqkxG2l1PJ7BHDi8k/Fx32/Vc1r0fWdhNEem6sLsgCJEZZiu2NhkEbVTV0X2C1PAqaO4UqDSptfWHqVZMYW+jSkfewTPhh/KVL9H6Qck/D063Li5iiIUooJXfPH8eax9TvZ4phbxyFY+ONu4x80pXARtZ1tjfXTWkZadmO3cgfNKUpcluNjwf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0201-960.jpg, /blog/united-kingdom-august-2015/IMG_0201-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0201-640.jpg, /blog/united-kingdom-august-2015/IMG_0201-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0201-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0201-320.jpg, /blog/united-kingdom-august-2015/IMG_0201-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0201-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0201-320.jpg\" alt=\"On the way to Arthur&#x27;s Seat just outside of Edinburgh\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGB//EACYQAAIBBAEDAwUAAAAAAAAAAAECAwAEBRESEyFRMUFhBiJxkdH/xAAYAQADAQEAAAAAAAAAAAAAAAABAwQCBf/EABsRAAICAwEAAAAAAAAAAAAAAAABERICMUFR/9oADAMBAAIRAxEAPwC22MTJ5u4uXx9s0sigbmHMINei7Gt+TXQ8LNNa2KRm7hVgAOLgDXwP5WDXLXd+3ShsbMyIrAtG3YN7die/fdTUyLxZHjmsRIOLIUYqSO3uBvgD8jzXNdm5bCnXh1eLO27Kedt1HB0xQjW/3Ssvb/XePii4SWt4G2T9sae/4NKYo9M2ZkccRCEkgVYSU2wjGg2vPmrGPylwY+DiNxzKnku9680pU+WpK8tk95UuZJHmtrZn5Eb6Y9AaUpS5YEf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0203-960.jpg, /blog/united-kingdom-august-2015/IMG_0203-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0203-640.jpg, /blog/united-kingdom-august-2015/IMG_0203-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0203-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0203-320.jpg, /blog/united-kingdom-august-2015/IMG_0203-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0203-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0203-320.jpg\" alt=\"On top of Arthur&#x27;s seat outside of Edinburgh\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcEAwUG/8QAJxAAAQMEAQMDBQAAAAAAAAAAAQIDBAAFESEGEhNhByJRCDFBcoH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECEUH/2gAMAwEAAhEDEQA/ALze73EsjSZEyU1FjDS3HlBKQfjyfFeKuXrrxKA2pLLsy5PJyOmIwcZ/ZWBUC5LyCTfrszO5HchLdQs4Y2UMDftQkaTv+/JrAqVbQR0uKGAPahBxmtLZfE5zxa3fqEjKILHHrgU43l1AwaVAp01HfIisrU2ABlWjmlI+RjjRW1W1x89Xc7gTnP4xXXuOK2AcDxSlCo4wSR9zSlKA/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0211-960.jpg, /blog/united-kingdom-august-2015/IMG_0211-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0211-640.jpg, /blog/united-kingdom-august-2015/IMG_0211-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0211-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0211-320.jpg, /blog/united-kingdom-august-2015/IMG_0211-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0211-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0211-320.jpg\" alt=\"Edinburgh castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAIF/8QAJhAAAgEDAwMEAwAAAAAAAAAAAQIDAAQRBRIhByIxBhNBUTKRsf/EABYBAQEBAAAAAAAAAAAAAAAAAAECAP/EABkRAQACAwAAAAAAAAAAAAAAAAABAhNRYf/aAAwDAQACEQMRAD8A0JcahHDbs7FY40BZpGOAoHkk/AqIWXVL0xeak9guobJtyojyIyJIxz4YjGOPJwORiqQ6v9Q5davZNL0aeVdMt+07e0SuPyZsHuH0PHzVULfO8jl5id3Dbudw+qZtoRXbdRvZCeFyP3SsYHWrZzn2ZFxwAJmH8pRl4MfUUkdi3Jr17PTYTC0xaQsqsQM8ZAzSlEqhxYJHJb7pI1ZiTyc0pSoZ/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0212-960.jpg, /blog/united-kingdom-august-2015/IMG_0212-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0212-640.jpg, /blog/united-kingdom-august-2015/IMG_0212-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0212-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0212-320.jpg, /blog/united-kingdom-august-2015/IMG_0212-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0212-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0212-320.jpg\" alt=\"Edinburgh castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQYH/8QAKhAAAgEEAAQEBwEAAAAAAAAAAQIRAAMEBQYSITETIkFRFSRCYXKhsdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIDERIx/9oADAMBAAIRAxEAPwDhtfr9NsdFj6rGyclthbNy/kfKKGtoASVVTDOx7xMiBAMxVvccKvqOEMTJe8iZuYDkhPFYc1oHyhlbyqBEj1MirHEO+1ex4tzdpdx1xzl5QyCoIPKAQsnl9ent2mpcRZOv2zMnxQm2ttkx1uXw1tRI8ir9IEfyoSsx5hRVto85XleXLW7rN1LXpZpj3pWnl6nBw7vh29seUjmEiT1/HpSl2g8M18rU4zWuZzedhEM1wyIED9dKonGsIY8IFFJhCxKgnue/2FKVjrnJ+slBshcx8dnJawhJ69Z/2lKU9YtP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0213-960.jpg, /blog/united-kingdom-august-2015/IMG_0213-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0213-640.jpg, /blog/united-kingdom-august-2015/IMG_0213-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0213-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0213-320.jpg, /blog/united-kingdom-august-2015/IMG_0213-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0213-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0213-320.jpg\" alt=\"Greyfriars Kirk and Kirkyard\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMFBwb/xAAmEAABBAEACgMAAAAAAAAAAAABAAIDBBEFBgcSEyEiI0FRYXHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAECBP/EABoRAAMBAAMAAAAAAAAAAAAAAAABEjERUWH/2gAMAwEAAhEDEQA/AN4dILOWtaWu8EjypoaYbCOIGl/sDkuDq7QaD8GtSutc4ZAmG6VVXdoWlJKokq0nbzhnG+3l8YWmW8MtpaaPNWYZD0PP0EWI2df9ZTKS2vK0EZxkfqKpfYq8OHg0rabL0uA5+lM7StoY7nlEQhcFdNescQ9woiILSP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0216-960.jpg, /blog/united-kingdom-august-2015/IMG_0216-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0216-640.jpg, /blog/united-kingdom-august-2015/IMG_0216-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0216-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0216-320.jpg, /blog/united-kingdom-august-2015/IMG_0216-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0216-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0216-320.jpg\" alt=\"Taking the train Firth of Forth\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>We continued our journey north and stayed for a night in Pitlochery and took a walk to the nearby town of Killicrankie.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 74.6875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGCAT/xAApEAABAwMDAgUFAAAAAAAAAAABAgMEAAURBhIhEyIHIzFBYVFigqHR/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwQBAv/EABsRAAICAwEAAAAAAAAAAAAAAAABAhEDEjFB/9oADAMBAAIRAxEAPwDcaN8UtPammliMZFsng9jLywQ6PtPoT8etUdm8RiB3JLg4x7muE9Nw5F2vMWLGdDL7ishZz2Y53fqq3qpWsHre6lq7RXEbO/oNFpxX5Z/lUQuUbaJpvWVIpmp/GyBZr7LtzcGTLMZXTW60pITuxkgfXGcUrk55Upp1SH+qHATuzyc0orYurPNbnXGpSC04ttZONyTgjPzVmhTpBhICl7vL5KuSePelKfB6Hn8Mndo7a5y14wVcnFKUrH07XD//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0217-960.jpg, /blog/united-kingdom-august-2015/IMG_0217-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0217-640.jpg, /blog/united-kingdom-august-2015/IMG_0217-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0217-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0217-320.jpg, /blog/united-kingdom-august-2015/IMG_0217-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0217-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0217-320.jpg\" alt=\"River Tummel near Pitlochery\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQGCAf/xAAqEAABAwIEBQMFAAAAAAAAAAABAgMEABEFEhMhBzFBUXEGIqEjNWGx0v/EABgBAAMBAQAAAAAAAAAAAAAAAAIDBAAB/8QAHBEAAwACAwEAAAAAAAAAAAAAAAECERMxM0FR/9oADAMBAAIRAxEAPwC9o40wHGkauDz0vbamm42QO9rm5+Krz3F9yT65w5+LHmtYQ1FdbkRllvM6tRulQOa22VPz3riMJiC88UPGMykJ2Kk3ub9gCeVRHXWEBxBZbNri9hy8Cs7wcwjUKuMWEE/bMTPS/wBP+qVkktvyDnQ62gDawTb9ClDvQei/hbvTeWRHmh5CVJ1w1l5C3Pp4qNj8JqJNeVFzNWUQAk9L/mlKijsaFT6QBh7S/cVOAmxNiN9vFKUpqKZuscn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0218-960.jpg, /blog/united-kingdom-august-2015/IMG_0218-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0218-640.jpg, /blog/united-kingdom-august-2015/IMG_0218-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0218-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0218-320.jpg, /blog/united-kingdom-august-2015/IMG_0218-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0218-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0218-320.jpg\" alt=\"House in Pitlochery\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBwP/xAAnEAACAQMDAwMFAAAAAAAAAAABAgMABBEFBiESMUETIlEjcYGhwf/EABgBAAIDAAAAAAAAAAAAAAAAAAIEAAED/8QAHREAAgEEAwAAAAAAAAAAAAAAAAEhAhESMUFCUf/aAAwDAQACEQMRAD8A9tF1NJbfULqNXiiRzG6u3ubgDI8n71v7l1eK/s7Z4I3ZlVFV5Tk8d8H+VH6btqS127qEk15IkiB2CNDwU7AEk8Ejx4xW/r+kKumm5iuUhtw8cKxph3jBYBsDLAEZJ7n9Uu2uGYOiYIHW1hn1i8knExZpOPTZVwuBgHPmlTG9HhtN06jDb38ssKS9KuUOWwAM/HfNKvBubhYP06hOxlsgZCXBQsyknpJGTyPwKm95kz7d6B9GNnWVliHSGY+T896UqUaGutzlLEhmGTwcd6UpTAB//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0220-960.jpg, /blog/united-kingdom-august-2015/IMG_0220-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0220-640.jpg, /blog/united-kingdom-august-2015/IMG_0220-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0220-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0220-320.jpg, /blog/united-kingdom-august-2015/IMG_0220-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0220-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0220-320.jpg\" alt=\"Woods between Pitlochery and Killiecrankie\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUHBP/EACcQAAIBBAAFAwUAAAAAAAAAAAECAwAEBRESEyExQQYiURQWUmGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgMB/8QAGBEBAQEBAQAAAAAAAAAAAAAAAQACESH/2gAMAwEAAhEDEQA/AIPorPHEZWN4oYpkJb2P7SoI10I7a3WgZwYbN32Syt3kru0tY4j9NCvEeJmUEnp2Unx5rKsRhL3KQzxw28kQZmEcrgllIPwP5Vz7ZyiWUaZO8SKOOMBUMjIenyp30qRpyeU9a5Z9k+TFfzpbuXjVtAjzSu28gxlvMYobjmcGwzJFtd7PYnuP3StNEhKvFnclYJGUu5ZTJtm5rFutRM/eXDzOzyuzE8R6kdxvxSlaFPntGaISHid3JI/KlKU53//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0221-960.jpg, /blog/united-kingdom-august-2015/IMG_0221-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0221-640.jpg, /blog/united-kingdom-august-2015/IMG_0221-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0221-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0221-320.jpg, /blog/united-kingdom-august-2015/IMG_0221-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0221-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0221-320.jpg\" alt=\"Woods between Pitlochery and Killiecrankie\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcEAQUG/8QAKBAAAQMDAgUEAwAAAAAAAAAAAQIDBAAFERIxBiEiYXEHExRBUYHw/8QAGAEAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAcEQADAAEFAAAAAAAAAAAAAAAAAQISESEiQVH/2gAMAwEAAhEDEQA/AIa9KdcQ24tClHABcVscchj67VxGt064lXwo6n9G/tj+z4q9M+mNvclA3W/IaQ4gNNtNxAQylIGBqUcAncEAb1sbvlltkVDtrsTUBERWhpbxCypO5B5bkHn996TNdBMog9phiRGK3bW5IOogLDq0DxhII/dKsS7lwtMUXZPDzqXDvoaKUnuAAaVjoMZ9NLDjlzsUCI+4tLQAA0HqHSTuc/ivFzLjJiT/AJyHC46Oel3qSfINKVPO5DryO9tmbmJL0okrDukaekAaUnGB3JpSlOdEf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0222-960.jpg, /blog/united-kingdom-august-2015/IMG_0222-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0222-640.jpg, /blog/united-kingdom-august-2015/IMG_0222-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0222-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0222-320.jpg, /blog/united-kingdom-august-2015/IMG_0222-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0222-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0222-320.jpg\" alt=\"Soldiers Leap between Pitlochery and Killiecrankie\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcCBAb/xAApEAACAQMCBgIBBQAAAAAAAAABAgMABBEFIQYSEyIxQRRRMnKRodHx/8QAFwEBAQEBAAAAAAAAAAAAAAAAAQIDBP/EAB0RAAICAQUAAAAAAAAAAAAAAAABAhFBEhMiMVH/2gAMAwEAAhEDEQA/AObQ9avJoI4LQRXAiI6krMMkkYyQfQx6rrk1af5jtcCQWsQ6Soy9xIGOYMPHupnE5TToFmfk6zGT9KKoGNvtiazHfzdSSSJ3kjBCDmO4Bzt/BqVDKDbRfNA4r1B9OU2kxuIAcIZpWDKMDt2I2/ulReTiPVNJPxhyKPyAdAffo/W2aU8vSNDwVzVeDtCtTarHYI2Zej3sW7Sc+CceSaza8K6ClhfxR6TbLyAyBu4ksucHckf7Slcjk77M7dnktOhg+Ii3NvDdldledAzKvnlGMbDJ/elKUtuws//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0224-960.jpg, /blog/united-kingdom-august-2015/IMG_0224-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0224-640.jpg, /blog/united-kingdom-august-2015/IMG_0224-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0224-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0224-320.jpg, /blog/united-kingdom-august-2015/IMG_0224-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0224-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0224-320.jpg\" alt=\"Woods between Pitlochery and Killiecrankie\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAUGBAcI/8QAKRAAAQMEAQIEBwAAAAAAAAAAAQIDBAAFESEGBxITIjFBIzNRYZGhsf/EABcBAQEBAQAAAAAAAAAAAAAAAAUEAwb/xAAgEQACAgEDBQAAAAAAAAAAAAABEQACIQQFQRIxUYGh/9oADAMBAAIRAxEAPwCJzvhx45cmmI8pE1l/bJSB4h+oKRnBz+agN2aYA465b5imWgCshpSe3Ohkka3Wljci49E6jcdls3Fa40JSnFSClSVPulOgrIHl7vcn0rsHqDy+bP4tNjsSbXmS0fhqlIK+xJAURvGs+xzTh3OwqQA1y0/UKGmyGU+O/wBnnaUgiQ4FtrCgcEH1H9pXOgRmZDBdfu1sZcUokoW4c/oUrn+ixzEMCQb4+8+6kvOKUANAgayd1reOQ7c9Y4LjtrgrdLJUXFNkqUQojJ39qUqfWWNaBHmU0AzKDcC3FtBNrgEkZ+SKUpRhvbzMmZ//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0226-960.jpg, /blog/united-kingdom-august-2015/IMG_0226-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0226-640.jpg, /blog/united-kingdom-august-2015/IMG_0226-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0226-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0226-320.jpg, /blog/united-kingdom-august-2015/IMG_0226-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0226-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0226-320.jpg\" alt=\"Near Edradour destillery in Pitlochery\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAEGBwME/8QALRAAAgEEAQEDDQEAAAAAAAAAAQIDAAQFESESBgcTFCIjJDFBQ1FxgYKSsaH/xAAWAQEBAQAAAAAAAAAAAAAAAAAFBAb/xAAgEQACAQQBBQAAAAAAAAAAAAAAARECAwQFEhMzNHGx/9oADAMBAAIRAxEAPwCsXOTu7uZTNLLKo15pj0o0NDQA9w0KhJuCGZnj+JHJD1I34sNbqIMhk4G6ZsnkW0SoJuG3/a0nufTIZS2yHiX1zN0XMfM/pdDp5A2eN/OprOVTdr4pC2bqrmLZ6tTTgy1sL2cnYyXFl4Up9qwPIifXW+PtSvTP3kdrUuJlXLHpWWRR6vCdAOwH+ClWwDSzplQFvZQBx1n+1qPcIzHG50g6K3MRH6GlKD1/dRud/wCJV7X0u0vZvBSOXfC44s3JPk68k8mlKU9LMJCP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0227-960.jpg, /blog/united-kingdom-august-2015/IMG_0227-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0227-640.jpg, /blog/united-kingdom-august-2015/IMG_0227-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0227-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0227-320.jpg, /blog/united-kingdom-august-2015/IMG_0227-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0227-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0227-320.jpg\" alt=\"Edradour destillery\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAgT/xAAlEAABAwQBBAMBAQAAAAAAAAABAgMEAAUGESEHEiIxQVFhFTT/xAAYAQACAwAAAAAAAAAAAAAAAAACAwABBP/EAB0RAAICAgMBAAAAAAAAAAAAAAABElECEQMTIYH/2gAMAwEAAhEDEQA/ANEcnzRA56dxQBx/oToV0jJc1cG0dPoP3zJRXnxTKb1FyDKZGSs3CNZ4bSnGQ/3rCgHSnw2Bs9ujofdY/IeptzmZcHrYVizNslCYkhPBJ9rIHO9evqjktb2SDlFr36XHF1vTrO0/frTFt09SlBUdHasJG+Of0c0rE2bqbbf57SX7dJZKAEJSyrvT2gADROjSh78LKfDnRPuvNykTMri2t1RENpoqSlJPvy59++KmqLe2CyQt3ydCD5fB3SlOQBVbPiVlXbIynYZWstpJUXl7JIB+FftKUp0VRmnlZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0228-960.jpg, /blog/united-kingdom-august-2015/IMG_0228-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0228-640.jpg, /blog/united-kingdom-august-2015/IMG_0228-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0228-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0228-320.jpg, /blog/united-kingdom-august-2015/IMG_0228-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0228-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0228-320.jpg\" alt=\"Edradour destillery\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUCBgcI/8QAKBAAAQQBAwIGAwEAAAAAAAAAAQIDBBEABQYSITEHExQVIkFhcYGh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwIAAf/EABoRAQEAAgMAAAAAAAAAAAAAAAABAhEDUVL/2gAMAwEAAhEDEQA/AOZTdL24xuNyPHkyHtPaYKlK82vmL6cq/XT85OVB032Z0ttS1z3XFCOVpWCtPL48RVEEd/3nYd27f2hp3gsvUYiY3rXIqHGZnnFT0mQSLQoX1Hex9V9VlFrae0EeFbc1KklA04v+5+oJWHuH0b6fL48f5WFOPL0W5zp5wciPIWUuNhKgaIUQCP8AcZgy6lSbeTaz3s1jE3XNRtO59JZhQIMtDshyQ+CpbjrnI3xSe/8Acj6g46/DQ68+6tSlEG1dDxqjXa8YyYyOkWLOMYxEv//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0229-960.jpg, /blog/united-kingdom-august-2015/IMG_0229-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0229-640.jpg, /blog/united-kingdom-august-2015/IMG_0229-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0229-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0229-320.jpg, /blog/united-kingdom-august-2015/IMG_0229-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0229-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0229-320.jpg\" alt=\"Edradour destillery\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>We had some problems finding a place to sleep, so we were quite happy when we found a hostel in Inverness for three nights.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUIBgf/xAAnEAACAgICAAQHAQAAAAAAAAABAgMEABEFBhITITEHIlFhcYGhsf/EABgBAAMBAQAAAAAAAAAAAAAAAAIDBAAB/8QAGhEBAQACAwAAAAAAAAAAAAAAAQAUQQISIf/aAAwDAQACEQMRAD8A6ODq/WOzbWPr8NNGbUFmvdi0/wByitsjLHX/AIS8VwbCxp57YJIk8TKq/gb/AKcz915eWsyVWbmBWXxgKFd/kP10CBlntHC85KJJV7E1t410Ns6k/ssdZa8nTT9dN7rc4Ksk5Dy10b30zAH/AHGY+t3L4syCzYm84HTeJiTsemM2TcxioUbMqMCrkaOUZuXuOjr5mgvtoYxiiantAtMZJmZ/Vj7nGMYLGX//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0230-960.jpg, /blog/united-kingdom-august-2015/IMG_0230-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0230-640.jpg, /blog/united-kingdom-august-2015/IMG_0230-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0230-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0230-320.jpg, /blog/united-kingdom-august-2015/IMG_0230-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0230-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0230-320.jpg\" alt=\"River Loch in Inverness\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>On the first day we took a a trip to Dunrobin Castle, which is a pretty nice castle at the east cost of Scotland.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwUI/8QAJhAAAgEDAwQCAwEAAAAAAAAAAQIDAAQRBRIhBgcxQRNRImGBQv/EABYBAQEBAAAAAAAAAAAAAAAAAAIBA//EABoRAAIDAQEAAAAAAAAAAAAAAAABAhESISL/2gAMAwEAAhEDEQA/APRUtwzfiuSCOD9VDtZEiup7eW5WW5K/NtxgqhO0fzNYT1X3KsndFtOpL8/E7JvsIdkbqRzz/o+OfWOKpF31nZXM8NzPquqveRxhTKdwZVHIAIYHGecf2ltLgctlu7xdtNW6r62m1bR54TbywxowkbwyjaQP1wKVH0LvENC0yOxtNNTVY1LObmeRlcszFiDkZ9+f3SlcGT0jGjMFjMoihzgcbBtPP14qTfMDBaSCOFWlVmbES+uPqlKyiJHMN3KDhSigelQClKVaKf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0233-960.jpg, /blog/united-kingdom-august-2015/IMG_0233-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0233-640.jpg, /blog/united-kingdom-august-2015/IMG_0233-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0233-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0233-320.jpg, /blog/united-kingdom-august-2015/IMG_0233-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0233-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0233-320.jpg\" alt=\"Dunrobin Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQHAwUGCP/EACcQAAIBAwMDAwUAAAAAAAAAAAECAwAEEQUSIQYxQQcTUSJhcYGR/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwECBf/EABwRAAICAgMAAAAAAAAAAAAAAAABAhExURIhQf/aAAwDAQACEQMRAD8Av0XVwlz7awyPGSO47futjtyjFFIcdg3GaoDp317s7u6W31PTnsYgjETCQyjPgFQM/NdNN6uaVHoj6pFeLKo4FqgKTsc4xtbt3z+Kbp+g21ksSXX0hkaN/pZDggileSep/VDqm+1me5g1W5tIJDuigt22qi+AcefnPNKnOOi1LZEW2hFvIPaXdwobHIBHj+VHijjDovtpjcD2+1KVzLdsSOTDcRrcvvlGWxjjjilKUiZukf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0234-960.jpg, /blog/united-kingdom-august-2015/IMG_0234-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0234-640.jpg, /blog/united-kingdom-august-2015/IMG_0234-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0234-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0234-320.jpg, /blog/united-kingdom-august-2015/IMG_0234-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0234-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0234-320.jpg\" alt=\"Dunrobin Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>One of the places we wanted to visit was the Isle of Skye, because there is absolutely no reliable public transport going to the Isle we had to book a bus tour.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQGCAX/xAAkEAACAQMDBQADAAAAAAAAAAABAgMABBEFEiEGBzFRkRRSgf/EABcBAQEBAQAAAAAAAAAAAAAAAAIDAAH/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQIRAzESE2L/2gAMAwEAAhEDEQA/AO1pff8AsCIhc6BfxyZAcQsrgeyAQD/KtNn3t0G56iOmGK6gtdhYX0wCIWHO3B598+xWdL28H4rhpwGxuUqcYI8EVD0fW55I3SeU7WOQCSWLe/nFSWaTV0GKTg5XTNWy93ujrdzHPrcG8fqjOPqgilZnW4LDKMWHvFK53+SfNldv1GXB8A8fKiiFEdCoxSlaOhLRNQDHjFKUogP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0239-960.jpg, /blog/united-kingdom-august-2015/IMG_0239-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0239-640.jpg, /blog/united-kingdom-august-2015/IMG_0239-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0239-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0239-320.jpg, /blog/united-kingdom-august-2015/IMG_0239-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0239-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0239-320.jpg\" alt=\"Highland Cow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAIIAQQGB//EACcQAAIBAgUDBAMAAAAAAAAAAAECAwARBAUSITEGQWEHExSBIpHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEAP/EABwRAAMAAQUAAAAAAAAAAAAAAAABAhESEyIxYf/aAAwDAQACEQMRAD8A9/GaGWRtLMqje9tiKmMweSWMDSYzsb2sf5VapvWPqxcMyNFl5jdSVZodI25tpIBrn8Z111XmUgeXOJsOVJVIcEywgHm5tz90x1KFci3ysXJ9uPUFNjY8H6pVLRnGYSM8jSZk8rsWkf5En5t3Nwd+1KXuyFj0jHGrYZGlLSbsbOSQL8/utuaOOI2jjRRe2w8UpUWp57LKSMPEAxAZrDzSlKyAZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0241-960.jpg, /blog/united-kingdom-august-2015/IMG_0241-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0241-640.jpg, /blog/united-kingdom-august-2015/IMG_0241-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0241-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0241-320.jpg, /blog/united-kingdom-august-2015/IMG_0241-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0241-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0241-320.jpg\" alt=\"Eilean Donan Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAoEAACAQQBAgQHAAAAAAAAAAABAgMABAURIQYSBxMUImJxcoGSodH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQIE/8QAGBEBAQADAAAAAAAAAAAAAAAAAAECEhP/2gAMAwEAAhEDEQA/AO6z20ZiaNoyVYa4Nc1zXRFzJdSNZL5iE733AEVAxfiVfwyL6i4sjZjQ7kvi7j6u+MA/arq48WcaIlK+kkbfJS9hj3+RNaZlqzXHZn06PdQQ9mzNvks52aVNHivCw4xOPf4jn4QT8/bSn1HOrWUWuPWNbPG4+IKvauoB7RWUzOXmMragtF1wNQL/AClKJE2sw3UV9EexRb9q8AeSvH6pSlJb/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0242-960.jpg, /blog/united-kingdom-august-2015/IMG_0242-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0242-640.jpg, /blog/united-kingdom-august-2015/IMG_0242-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0242-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0242-320.jpg, /blog/united-kingdom-august-2015/IMG_0242-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0242-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0242-320.jpg\" alt=\"Loch Alsh near Eilean Donan Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>After a few stops along the way we finally arrived on the Isle.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAUGBwj/xAAmEAABAwMEAAcBAAAAAAAAAAABAgMEAAURBhIhMQcTFCJBUXGx/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgMEAAH/xAAdEQACAQQDAAAAAAAAAAAAAAAAARECAxIhEyJh/9oADAMBAAIRAxEAPwDO9QOxbtsRpO82yMQkh3y2xJdUCQBtycJ545HJqEi33myyXFW3VynkNNh9LVyjJW28NpWry8EHAA+Djn9qxJ1nbNWWuQ3pxwuXCKkygw63sJ2dHB7GecD6qZqyTb7taZZt85DN0t1ryqO2nKUANpWfd1jCiARkZqhdllIhuHBftKdU3u3MXBVytMVuQne00IQcIbPKcnPZHOKVz6vUlydO9U+WSfp4j+cUqXn8D0RVyHYTrbsRamXkcpcQdqk/hHVbX8OZCrrp6VJmpQuRLX6WUvbj1DY9oSsdcDjgClK1ttaOUoXPQ1hS62puH5e9sKKULITnnofHVKUo4Qw//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0243-960.jpg, /blog/united-kingdom-august-2015/IMG_0243-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0243-640.jpg, /blog/united-kingdom-august-2015/IMG_0243-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0243-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0243-320.jpg, /blog/united-kingdom-august-2015/IMG_0243-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0243-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0243-320.jpg\" alt=\"Vote Yes advertisment on Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQHAgUGCP/EACYQAAIBBAECBgMAAAAAAAAAAAECAwAEBREhBhIHEzFBYZEiseH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAaEQADAAMBAAAAAAAAAAAAAAAAAQIREyFR/9oADAMBAAIRAxEAPwC9cdkWk289wjQb1qP8h/KiX7yN5kltNC8AO+FO1+qoPK+JuQijdcGMZawqeEaKQOzaG2UFiv3XIz9X9SZK7drjqLICQksWilaJPgALr237aFK7SeUCpprp6MnyyNIe6/RSONd+qVQZscl62fVNr5TDu1Pfsrgn1B2v6pVbV4ZrZPv7aFlIMaaY7PArQXVnAjN2oOPgUpRUTJkpbtGnYcUpSpyKf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0244-960.jpg, /blog/united-kingdom-august-2015/IMG_0244-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0244-640.jpg, /blog/united-kingdom-august-2015/IMG_0244-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0244-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0244-320.jpg, /blog/united-kingdom-august-2015/IMG_0244-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0244-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0244-320.jpg\" alt=\"Kyleakin on Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQHCAX/xAAlEAABBAIBAwQDAAAAAAAAAAABAAIDBAUREgYhMRMyYXFBQtH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAZEQEBAQADAAAAAAAAAAAAAAAAARIRMUH/2gAMAwEAAhEDEQA/ALuo9QYuSISNytB0bRvl67SAPk7U2hm6GWY92LyFK4GHTjDKHcT8rEVWpGe7bgaT5D2j+rr4pj61ps9bPipMz2ujjO1e5aLpsSSEucS6aFpP45hFm2t1rmq0QjZnsXKB+8lEFx+ztEuoPhVtMAkkgHyk54nTew89vpEQm9Rw4ne0RFin/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0246-960.jpg, /blog/united-kingdom-august-2015/IMG_0246-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0246-640.jpg, /blog/united-kingdom-august-2015/IMG_0246-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0246-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0246-320.jpg, /blog/united-kingdom-august-2015/IMG_0246-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0246-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0246-320.jpg\" alt=\"On the Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFBgT/xAAmEAACAQQBAwMFAAAAAAAAAAABAgMABAURIQcSMQZhoRMUIjOB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgQD/8QAHBEBAQABBQEAAAAAAAAAAAAAAQARAhIhMUFR/9oADAMBAAIRAxEAPwCpYSe4e6W1ljaG33vuPg1q3zzXRFrZwOIEPLN4P9qR4LqxbMi/eYzIrMBwYgrg/IrtcD1NwcthuW3yltKRuRGtw/cT5/IE7+PNV6vpSh43WhbSIBZmLOByU1oewpUpy3Vue3yM8eH9G3l1Zq2knnkMbSe/aAdClHMttPfS+Ot7fJOsP1VAQn9rHeh7mtnGM08Ezs5DKQQQBxs6NKUjqDy3gylvO8yMuRvY9pyEdQCdnnxSlKDbAYv/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0247-960.jpg, /blog/united-kingdom-august-2015/IMG_0247-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0247-640.jpg, /blog/united-kingdom-august-2015/IMG_0247-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0247-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0247-320.jpg, /blog/united-kingdom-august-2015/IMG_0247-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0247-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0247-320.jpg\" alt=\"Elgol on Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAMF/8QALRAAAgECBAMFCQAAAAAAAAAAAQIDAAQFERIxBiFBEyJRcYEHCBYjMkJSYdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAaEQADAQADAAAAAAAAAAAAAAAAAQIREzFR/9oADAMBAAIRAxEAPwDRDTsrFHClAd1OVZd955rNuPrdrePRcmzja55/UdR0Hz0j15eFXvNxlhLySRQyStMnNozoDDzzbl03qnvabjWDcWXS2mMyYba3sAPY3MUmt4h+DsoIIO+np0/dHOk5tJlG9g0/zAVUHYf2lSL4du1JUSBwPvTMhvAilZuRemjDzriSTE8WuJbuV3ldjrfPvNl1J6+tSaxw22tLZWiQFslObAHfcUpSroJznxO5E8ialyjOhe70ApSlDEI//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0249-960.jpg, /blog/united-kingdom-august-2015/IMG_0249-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0249-640.jpg, /blog/united-kingdom-august-2015/IMG_0249-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0249-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0249-320.jpg, /blog/united-kingdom-august-2015/IMG_0249-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0249-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0249-320.jpg\" alt=\"Elgol on Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFBAb/xAAqEAACAQQBAgILAAAAAAAAAAABAgADBAURIQYHEhMxNEFRYYGSocHC0f/EABYBAQEBAAAAAAAAAAAAAAAAAAMCBP/EABkRAQEAAwEAAAAAAAAAAAAAAAEAAhESIf/aAAwDAQACEQMRAD8AvlGtsjmdq1ONHYkXte+HTTPqol9SGvbbfkEz0GB7sdMZSlVc3y2jJyUvD5RI943wflzHSEamK2h6YktfvZ0orEI2RdRwGW1Oj8RzEnmrdF6XTOI36mPrb+zMz1lj8cyJQx9A+IbJdqh/aIl5gHkeCrYfnU2ZitrQQAkAL4tfcxETMrua/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0250-960.jpg, /blog/united-kingdom-august-2015/IMG_0250-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0250-640.jpg, /blog/united-kingdom-august-2015/IMG_0250-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0250-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0250-320.jpg, /blog/united-kingdom-august-2015/IMG_0250-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0250-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0250-320.jpg\" alt=\"Way back from Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGBwP/xAArEAABAwMCBAQHAAAAAAAAAAABAgMEAAURBiEHEhMxFWFxgSIyQUNRkqH/xAAXAQEBAQEAAAAAAAAAAAAAAAADBAAB/8QAGhEAAgMBAQAAAAAAAAAAAAAAAAECERMhMf/aAAwDAQACEQMRAD8A61HY06pwurlocZI+VRINR71L0zDZV4bIcLu+EpVlIPuK5o3xAtkqM2h+FdG0gbgtJXj32z/KsRb7od2N1ZD04Okbsoj/ABA/uBVvF2yOn5R6Kv7nMcunywB2pUCZxG0XEfLMaz3GWhP3XG22yT6FRpW1icxkYGRcX2DESgpwteFZH0qfdrtJTOW2nphCUqAHL38/WlKKbY0UrM04s9RR/JpSlAOf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0253-960.jpg, /blog/united-kingdom-august-2015/IMG_0253-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0253-640.jpg, /blog/united-kingdom-august-2015/IMG_0253-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0253-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0253-320.jpg, /blog/united-kingdom-august-2015/IMG_0253-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0253-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0253-320.jpg\" alt=\"Isle of Skye\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>On our way to Glasgow we stopped for a few hours in Stirling and visited the old town and, of course, the castle.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgP/xAAmEAACAQMDBAEFAAAAAAAAAAABAgMABBEFEjEhIkGBBhQjYXGx/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgMEAAH/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQIRE1EhMWH/2gAMAwEAAhEDEQA/ANPeaTaWTSQTzWMEsuN8ZUbgccDqcHHgVSj4xc3sy22l6nA6oWZzFAhkAA7dpPg9a1Gm6haOqx6je2t9byO2wPbl/uY6E7gSAD5zUWK4W2IaHVoFSQlgqxPgYOOAOM+sUtSronvRRr8YvVUKt7I+3plraIN7BHNKu5I4WuJmW7tCC2cvAT4HBzx49UruX0K3s4tqk62suUhfYe3cmcY4/lTLeZ/o1lG1W2KO1QB3DcePzSlRSbNBWmYbXJrpL9lgvJ4YwoxGm3av6yDSlKfF8Ao//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0255-960.jpg, /blog/united-kingdom-august-2015/IMG_0255-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0255-640.jpg, /blog/united-kingdom-august-2015/IMG_0255-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0255-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0255-320.jpg, /blog/united-kingdom-august-2015/IMG_0255-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0255-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0255-320.jpg\" alt=\"Graveyard in Stirling\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>In the evening we arrived in Glasgow and went for an ale in Brewdog pub.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGB//EACkQAAIBAwIFAgcAAAAAAAAAAAECAwAEEQUSBgcTITEVURQyQUJhsdL/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgT/xAAhEQEAAQMCBwAAAAAAAAAAAAABAAIREiEiIzEyUXGhsf/aAAwDAQACEQMRAD8A4Y7RhhsjHYjsR5/FVNa1H1JohJp1ja9JFQC3hEZbt5Yjya1Nhyj4okuCfhogsT7XZriPAYHuPm74qrf8reI7udjbizkeNhHKDPGNpxkfcPpU5GZeNjsbM5vbNpscW2e0aZ853dUr+qVuLjk7xkJD0rG1kQ+Ct1F/VKtxdbe2QKaX+TdaJe3CytA8ryJcSyqSzEFctISVIxg9gKlcea1dmK0uI+nE0CvJtjXCuy4wW96UrCPEPMaoGlHtI2n8SXfEcHqGoxQLMx2bYN0aAD2UNSlKavqYNPKf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0260-960.jpg, /blog/united-kingdom-august-2015/IMG_0260-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0260-640.jpg, /blog/united-kingdom-august-2015/IMG_0260-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0260-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0260-320.jpg, /blog/united-kingdom-august-2015/IMG_0260-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0260-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0260-320.jpg\" alt=\"Brewdog Pub in Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 133.4375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYCBAUI/8QAJxAAAQMEAQMEAwEAAAAAAAAAAQIDBAAFERIGITFRB0FxgRMUUtH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQL/xAAZEQEBAQADAAAAAAAAAAAAAAABABECITH/2gAMAwEAAhEDEQA/AL/12eVH9Lbzk6lwtNfOXE/5XnPg8hT9wmsPK2C7c+hI6DskEZOR48/VUsTlF55w4LTKlvSIe5myWpqxopLYBJOMYH2BVLKicYfj/t2y0C23JpK2UCLrpIykpUkJUSFY756Yx3p4Vzps7I867ZoDv5opDjCFDLpGOmP78g0rgcY5dFg2ONEkvTUuMbowy4NcbqI7/NKtMaElS3oUhZiqS0UlSMtoSjKc4IOoGQfFbJcSq8xw60hxplZAaUVakbdjg59/PsKUrB4TcjFuraLhcGG5CYtwlR0F3OjSgkZ1T17fA+qUpW4m/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0262-960.jpg, /blog/united-kingdom-august-2015/IMG_0262-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0262-640.jpg, /blog/united-kingdom-august-2015/IMG_0262-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0262-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0262-320.jpg, /blog/united-kingdom-august-2015/IMG_0262-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0262-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0262-320.jpg\" alt=\"Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcCBAYI/8QAKRAAAgEDAwMBCQAAAAAAAAAAAQIDAAQhERIxBQYUBxMXIiNBUZGSof/EABgBAAMBAQAAAAAAAAAAAAAAAAEDBAIF/8QAGhEAAwADAQAAAAAAAAAAAAAAAAECERIxQf/aAAwDAQACEQMRAD8AoDdSW3dfGlYoTlFyV/Fdn6K+6Az3D/JT4zvOah0Xfvb0KRzx+V7aQssiB9zKRwTrjQ/cVzYvVHpULy27zXBt2jOhMBbSXOm4E5XiraqX6RTNp8LdLPBM+9ZCynghwaVNPfV2xaloYumXd3GhIWaIqisPphiD/KUvdIdpR51MzhQd1ZFzLxuxSlc/Bow1zJryv6ilKUcBP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0263-960.jpg, /blog/united-kingdom-august-2015/IMG_0263-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0263-640.jpg, /blog/united-kingdom-august-2015/IMG_0263-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0263-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0263-320.jpg, /blog/united-kingdom-august-2015/IMG_0263-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0263-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0263-320.jpg\" alt=\"Graveyeard in Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgMIBP/EACQQAAIBBAEEAwEBAAAAAAAAAAECAwAEBRESBiExQQcTYXGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIE/8QAGBEBAQEBAQAAAAAAAAAAAAAAAQARAiH/2gAMAwEAAhEDEQA/AJxlvlx4cm8OFsYL2wAjRLmdmjLu7hey67gb/N1lh/lmF5J7LqGGO0dH+oXUIJRydEcl78Bo+dkdvVU5DncJBLtslCupYXJS0mY8UkdmGyvkhl1/DXivMti7yad7XJwbknEoEkckTa4Be5K63sVXu05dGXORmWU8EJXyCPf7Sq86M+VrDCdN2eNu0muJLcMgkiVZVK8job5b8ejSnOyF4bnia5mlk5SyM7Bdcj5Pb2fdaYSQ3YkbpShtBTjpXD4+7xf23Vqk0hkYcmJ3/tKUpwMs/S7f/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0265-960.jpg, /blog/united-kingdom-august-2015/IMG_0265-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0265-640.jpg, /blog/united-kingdom-august-2015/IMG_0265-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0265-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0265-320.jpg, /blog/united-kingdom-august-2015/IMG_0265-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0265-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0265-320.jpg\" alt=\"Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGBAj/xAApEAABAwMEAAUFAQAAAAAAAAABAgMEAAURBhIhMQciQVFhEyMygZHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABoRAQEAAgMAAAAAAAAAAAAAAAABAhESE0L/2gAMAwEAAhEDEQA/AOad4gPx7eq2InMxpjbmxUmOrydDjGCD7Z/ytZpvSs4qeVfb+82uSgpUuP8Ak6gpBACz0OTwkCvPi2IM27tlJklhRy6lKklRJPm2k4HPz71QrprG5yJVqMW4tWy0sJSkQ29rmAlSk4IHqUBPxzxTc4nYt7GkbAy0lNvhpS1gZJTuKjjGSSrJ6HdKmEXXhjJcbjvpVHCz9L7GTt9Ae+aUvbiXdRB91YeaSFEbgMn91ufDjTtuvD8w3JpT+zG3cojBPZ49aUo8tUjUTtAWpEght6YlOOBvScf1JNKUqSr/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0266-960.jpg, /blog/united-kingdom-august-2015/IMG_0266-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0266-640.jpg, /blog/united-kingdom-august-2015/IMG_0266-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0266-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0266-320.jpg, /blog/united-kingdom-august-2015/IMG_0266-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0266-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0266-320.jpg\" alt=\"People&#x27;s Palace in Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMGCAIE/8QAKhAAAQMEAAMHBQAAAAAAAAAAAQIDBAAFESEGEkETFCIxMmFxFWJygaH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgMF/8QAHBEAAgIDAQEAAAAAAAAAAAAAAAECEQMSURMh/9oADAMBAAIRAxEAPwChwYzUMCQpxppAUW0gpwSd9Q0kHX3fqopUgqMdiKtQccGUBtSsqB0ccuznHlXVxjWyTZWbdBu0l99C+ZxT7agkfinOOvzXiYiWLtmHVTZrfd+XnQsBQcx6inWgeg+aWUG8l8LRzOOKq+OzUXBXEVotHA/Dka73piFJ+ntHsX3MKCdgaUM9Ou6Vke/IjOTudhMplKkAlI8YzvYyBge39pTbMl5lmdhMZ9Hl71A/DabAKAQaUrMjKXRLZI1xBeY6AyxdZrbSPClKXSABSlKts+gf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0267-960.jpg, /blog/united-kingdom-august-2015/IMG_0267-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0267-640.jpg, /blog/united-kingdom-august-2015/IMG_0267-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0267-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0267-320.jpg, /blog/united-kingdom-august-2015/IMG_0267-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0267-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0267-320.jpg\" alt=\"Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUGAwQH/8QAKBAAAgEDAwMEAgMAAAAAAAAAAQIDAAQRBRIxBiFRE0FhgSJScqHB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEAf/EAB0RAAMAAgIDAAAAAAAAAAAAAAABAgNRERMUIVL/2gAMAwEAAhEDEQA/AJ2KdyFxpFiQR2BdOM/y81y/qJIxql/I4SBvWc7AFYLyMDntke1Zta1K+iint7uU2OoPLIJ2M3Y5OccYA5xt81q9OX8RmtDfTQ3NvHNFIN75WJQ+SHUjjA+fHvSVhpFCySvaI+JbeXeS6jDYH5Bf6xSrld2/QOpXctzO0VjM23fCJiFDbVyVA4Hx5zSndD2B5K+SoS6VbCO0mf1JWcsCHbI+qlz09pbWqyC0VWY7ezNjA+6UqbJVbDmVoruo6RZJdMI4di/qCf8AaUpTJp8Ixpcn/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0268-960.jpg, /blog/united-kingdom-august-2015/IMG_0268-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0268-640.jpg, /blog/united-kingdom-august-2015/IMG_0268-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0268-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0268-320.jpg, /blog/united-kingdom-august-2015/IMG_0268-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0268-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0268-320.jpg\" alt=\"Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGCAT/xAAqEAABAwMDAgQHAAAAAAAAAAABAgMEAAURBhIhBzEiQlGSYXFygZGx0v/EABcBAQEBAQAAAAAAAAAAAAAAAAMAAQL/xAAbEQEAAgIDAAAAAAAAAAAAAAAAARECEiFBUf/aAAwDAQACEQMRAD8AtUnq9pBt0iO5dXAD3bhKAPuIqUt3WHTC9qFKujIPdbkJRx7Sayy7MAWrAcSk452kdvtXZCurCFne8U548Waa77HrTYUbWWlrg0JDeooO08YcfDSh8CleCPxSs5WlxudDDrLkVaQdpK1pyD6c/MUrYxcTksVt0HbrjJdlyJtzDg8qHwEnA9NtR960rDiLCWn5RBHnUlX7TSlHHJEa3pmEtO4rdz9KP5pSlWseJ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0269-960.jpg, /blog/united-kingdom-august-2015/IMG_0269-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0269-640.jpg, /blog/united-kingdom-august-2015/IMG_0269-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0269-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0269-320.jpg, /blog/united-kingdom-august-2015/IMG_0269-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0269-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0269-320.jpg\" alt=\"SSE Hydro in Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcCAwYF/8QAKxAAAQIEBQMCBwAAAAAAAAAAAQIDAAQFEQYSEyExIkFRB4EUMjNSYXGR/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwIAAf/EABsRAQEAAgMBAAAAAAAAAAAAAAEAAhESEyEx/9oADAMBAAIRAxEAPwC4y1Up2cN5ZtN0KWpxYAQi3YqvsbbxyuMcW0en1STl3Kghpb6SpGxIV7jb2iL4mxQ8qqWlq81W5HTIytdOo0SeU2BCx3BjlJyZa+DTLFWpTl/Rublo/b+vHjiFctPkRgppq9MeqlHl3ltO0+qgpJAtLpII8/NCIe5VX5ZWk4vUyjZdr5h2v+YRubd6i2YwdQqtuaEtLSqAlKQhhvKkbcx4hX1ZbC0IRLJh8LFw2VwP5CEIiS//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0270-960.jpg, /blog/united-kingdom-august-2015/IMG_0270-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0270-640.jpg, /blog/united-kingdom-august-2015/IMG_0270-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0270-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0270-320.jpg, /blog/united-kingdom-august-2015/IMG_0270-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0270-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0270-320.jpg\" alt=\"Clyde Auditorium in Glasgow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>After two nights in Glasgow we left Scotland and went to Liverpool for a night.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAwQFCP/EACgQAAEDAwIFBAMAAAAAAAAAAAECAwQABRESIQYTIjFRFUFxgWGhsf/EABUBAQEAAAAAAAAAAAAAAAAAAAME/8QAHREAAgICAwEAAAAAAAAAAAAAAAECESExAwQUof/aAAwDAQACEQMRAD8As0WV5ISnU7y87gY8+KxXp2CzIDHqkKO8oYbbkPoSRtvsT3xVHyePrx62HnLlPjLS6omO2zywTrJ0HYkjJIxnzUDfiWcSnX27hIL6nFL6o4IGc7Hqz3/lW+rNpEvmxTZ6XEVE5bjtlujD8UKKdTTg0hXuM5OfnNKoOx8WXKzQjEtkkLj6yvUY+SSfP6pTLvSrQL6ed/SRJv0svJWURytasEloE98+/wAmtN3gy0LlxXdDyQ651oDh0nOfsfRpSl5Ixa0HCTUsM5Lttatkl+NGW7y0ryNRBPYfilKVLSKrP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0271-960.jpg, /blog/united-kingdom-august-2015/IMG_0271-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0271-640.jpg, /blog/united-kingdom-august-2015/IMG_0271-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0271-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0271-320.jpg, /blog/united-kingdom-august-2015/IMG_0271-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0271-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0271-320.jpg\" alt=\"Port of Liverpool\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwb/xAAmEAABBAEEAQQDAQAAAAAAAAABAgMEEQAFBhIhMRMiMoEkQVGh/8QAFwEBAAMAAAAAAAAAAAAAAAAAAwACBP/EABwRAQACAgMBAAAAAAAAAAAAAAEAAhIhESIxUf/aAAwDAQACEQMRAD8AxbbkWJqKp51R99sMxVutqbSFe8fFJvwD4vLPb+llej65IkRlpU1HbWy4oFNHnRI+jkPZZQZL0dwJ/I9Nuz5rnZGajuOG6zsnWtRbm+u0+8YzcINgLY4uD3UO6IB7r+YOXZI+PU+TFkTW02HorbqwflyKf8GMjvNKDquj2bxmgWA1JZ6UmpySk0Qro0DRH7zrpL70qMpuS4HEns8mkWfusYyuI74kbJ4ysdhMkg8R2B4AxjGJXwhWds//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0273-960.jpg, /blog/united-kingdom-august-2015/IMG_0273-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0273-640.jpg, /blog/united-kingdom-august-2015/IMG_0273-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0273-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0273-320.jpg, /blog/united-kingdom-august-2015/IMG_0273-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0273-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0273-320.jpg\" alt=\"Cathedral in Liverpool\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>The last two nights we spent in Cardiff in Wales.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgL/xAAnEAABAwMEAQMFAAAAAAAAAAABAgMEAAURBhIhMRMHUYEVIjJCYf/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/EABoRAAMAAwEAAAAAAAAAAAAAAAABAiExQhL/2gAMAwEAAhEDEQA/AMwxbnvTzX1slkKk2t1wpYlK/F5s8ckEgkZBwO+6m+p2pTdbdFtaWUkrluyV4QoKP3HCdp7BPzxWcZmRnkyIqjNl2bB8bRSFKYV+qkrGEoPvgYPtU/UTbEh2O74/pszxbFPPu7m1nJGRjO1XfZxxkVZ0Wlkq4dugMsAXC5vRnyclpK0jaPk5pXR0mZuHkXCG+rG1TjtzjpJI4HBOesd0pFUrlGPLfRWy5jsmdGgKIRFMhI2I4HYFbbUUZuJebUI42pfSpDicApUOex1SlGspjaqSqkMNOMQnvG2lT0dK1AIGAeRxkfylKVgVXSwmf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0276-960.jpg, /blog/united-kingdom-august-2015/IMG_0276-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0276-640.jpg, /blog/united-kingdom-august-2015/IMG_0276-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0276-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0276-320.jpg, /blog/united-kingdom-august-2015/IMG_0276-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0276-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0276-320.jpg\" alt=\"Market in Cardiff\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEBQf/xAAmEAABBAIBAwMFAAAAAAAAAAABAAIDEQQFEgchMRNBcSJRgZGy/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEBf/EABwRAAICAgMAAAAAAAAAAAAAAAABAgQSFAMxQf/aAAwDAQACEQMRAD8A9X3GPd8I3D4Cht1gTPLrjP5XVZ1Z1uRjmXJ1ksDeJfTpAXVyoWA33/fwpnadUsJ0rnY+pjdDyIa585a4gVZI49vK0uOxj4QTr5dM5MumlLzy+k/arRaB1EwZRzdiYzb9nZdH+UT9xC9aRFbLbZgDj6zj3PklTOXssmR55SX3RFI2VRRifkyudZebREQjD//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0279-960.jpg, /blog/united-kingdom-august-2015/IMG_0279-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0279-640.jpg, /blog/united-kingdom-august-2015/IMG_0279-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0279-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0279-320.jpg, /blog/united-kingdom-august-2015/IMG_0279-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0279-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0279-320.jpg\" alt=\"Mouth of the Seven in Cardiff\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQb/xAAsEAACAQMDAQQLAAAAAAAAAAABAgMABBEFEiEHBhRBYRMVIjEyUWKBkaGx/8QAGAEAAgMAAAAAAAAAAAAAAAAAAwUAAgb/xAAdEQEBAAEEAwAAAAAAAAAAAAABAAQCAxEhEjHB/9oADAMBAAIRAxEAPwDpdL0mxsp1lvNNa9j2fA0pVd3z4/hqhcaAtxdSyQW/doGYlE5YL9OfeawU6n6mSR6rgcEZA9G4wfEedXU6oTpdbG0uN4AeGEbgnzxmnpmI+X2SuIvVu2vZJHhDSnDZ5BYLj80qpb9TbV0JmsHRgSMLGcY+5pVXN3IhiaTq51pZFR2Dtx4Zqfe5lt9wbk/rkUpWDA4nT7pm5lGPbNKUoXFL/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0280-960.jpg, /blog/united-kingdom-august-2015/IMG_0280-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0280-640.jpg, /blog/united-kingdom-august-2015/IMG_0280-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0280-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0280-320.jpg, /blog/united-kingdom-august-2015/IMG_0280-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0280-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0280-320.jpg\" alt=\"Mouth of the Seven in Cardiff\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMEBgf/xAAnEAABAwMEAQMFAAAAAAAAAAACAQMEAAURBhIhMQcTImEyQVFx8P/EABgBAAIDAAAAAAAAAAAAAAAAAAMEAAIF/8QAHREAAwABBQEAAAAAAAAAAAAAAAECIQMRMTKRQf/aAAwDAQACEQMRAD8A5mzovWUaQAjbJSOnyIKyuePjHxW3tmndbEMK2yGI8MbiRNtzPVQtqCO4sIKqvSL+KoN+X7rMmJJn3Jhs2gXYgQS9y4VMZQsp2vNSxvKvotQCMHpL8V51UVpwm96EONyZTIrz9++eqHczXzISXaN9pXxPazgSBmwmZz7Up5on3S5PaajnvhOKVk7Z5ghR2XEdlXuO446bqgIiSJuJV7pT83KSwvBKovd5r04KlWYK7XHDT6gbIh/f8tKUlXDNLR7olEyQURFpSlQof//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0281-960.jpg, /blog/united-kingdom-august-2015/IMG_0281-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0281-640.jpg, /blog/united-kingdom-august-2015/IMG_0281-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0281-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0281-320.jpg, /blog/united-kingdom-august-2015/IMG_0281-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0281-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0281-320.jpg\" alt=\"Taking a water taxi in Cardiff\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcEBv/EACcQAAEEAQQABQUAAAAAAAAAAAECAwQRAAUGEiETIkFRoSMxY3HB/8QAFwEBAQEBAAAAAAAAAAAAAAAABAMBAv/EAB0RAAIBBAMAAAAAAAAAAAAAAAABAgQRFCExUWH/2gAMAwEAAhEDEQA/AKUqHDaLQQ0hClmvqHsmr+36GZZOleM7zU+HPbsHrJ9rW5taf0+K/HZhQlBYWiSJ7ZB5DiKB979c6DRNSem7accl7ojl91mlIMc8mLsXyChZFGvTrFxqt6dwcqZNbVjqW4MtKQGnfKPyAf3GT4y2GQlCt7vLUALUqI5fwcZzmeG4a7IVMtqG2EqtJIJBAzMZjvN4ggchRGMYWSQxcG1mcoNpBZYNCrKSSfnGMZArY//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0282-960.jpg, /blog/united-kingdom-august-2015/IMG_0282-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0282-640.jpg, /blog/united-kingdom-august-2015/IMG_0282-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0282-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0282-320.jpg, /blog/united-kingdom-august-2015/IMG_0282-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0282-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0282-320.jpg\" alt=\"Beer brewery in Cardiff\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBwj/xAApEAACAQQBAwMDBQAAAAAAAAABAgMABAURBhITQRQhMQdRkSJxgaGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQF/8QAHREAAQMFAQAAAAAAAAAAAAAAAAEDEQIEFCExUf/aAAwDAQACEQMRAD8AqLLhjDRkTanzWnacRtPWxWsjxLNIpkVO5+ooDokDzrY/NSXKuY+gkjscVkjDGoDMxkIdWDa6B7b6dH+qnM9zfK2eds7qwy3duhHNaxyuokCKxUkga1o6Gv281oVX7lXDPSxbp7s7K/G8RBI0MmQt0dNBldlUjYB+CfsRSvMucgv+QZObJZe+ee8l6Q8hHTvpAUewA8D7Uo8l70bGZ8Ohjh2DvBbPLZAGRGZgrEbP5rOH07wsq9SNeQlWIHblHx/INKVDKyWxoj7zFLbTdtLu7ZQN7dwT/lKUp5UOEP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0283-960.jpg, /blog/united-kingdom-august-2015/IMG_0283-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0283-640.jpg, /blog/united-kingdom-august-2015/IMG_0283-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0283-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0283-320.jpg, /blog/united-kingdom-august-2015/IMG_0283-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0283-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0283-320.jpg\" alt=\"View from Cardiff Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBwj/xAApEAABAwMDAgUFAAAAAAAAAAABAgMEABESBQYhEzEHFTJB0VFhgZGx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAwQFAv/EACARAAIBAwQDAAAAAAAAAAAAAAABAhEUIQMFEvAiMVH/2gAMAwEAAhEDEQA/AKHVWjt+GubL6rLSbBVkZGxNhx9L+9ULDUvHB2Nmi1sSg4q+PxXJtybxjapC1uM3AMdWoIaR1i7mEdMk9rdj9u1781ZaX4tQdG29G0uVpE3zGDDS0lCinpvLSkAAKF+FDm9v3T0dyc23JE6xjFeEjfVAihagrTrG/YOWtSs3S/Grar8Fpc8uQJXZyOW8sFA24IHIpRr5dbB2b6jzo3qbq14qQ2QTz6vmrjbU9xcFQKGiCoetOZ4Fhyq5HAHvSlQdXCwP1oUsd5K28nI0RaieSthJP8pSlJuTr7Mcn9P/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0285-960.jpg, /blog/united-kingdom-august-2015/IMG_0285-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0285-640.jpg, /blog/united-kingdom-august-2015/IMG_0285-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0285-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0285-320.jpg, /blog/united-kingdom-august-2015/IMG_0285-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0285-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0285-320.jpg\" alt=\"Cardiff Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>We travelled back to Austria with a short stop in Brighton and spend a few hours on the beach.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMGAQQHCP/EACYQAAICAQIFBAMAAAAAAAAAAAECAAMEESEFBhJRkQcTMnEzYdH/xAAWAQEBAQAAAAAAAAAAAAAAAAAABAH/xAAXEQEBAQEAAAAAAAAAAAAAAAAAERJh/9oADAMBAAIRAxEAPwDuzP7a9QBZuwmFzbCwU1sv7IlMv5+or00wLXJO/Tcu3kCauV6ihLClPBc20a/IW09P3u2spTXq/wBmSpbcsPoRK3RzVw6ylHsyGqdlBas1alT21G0RDTz9bn5Ww95vAkDcRyg35Ade6j+REMiUcUytPkviIiKR/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0286-960.jpg, /blog/united-kingdom-august-2015/IMG_0286-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/united-kingdom-august-2015/IMG_0286-640.jpg, /blog/united-kingdom-august-2015/IMG_0286-1280.jpg 2x, /blog/united-kingdom-august-2015/IMG_0286-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/united-kingdom-august-2015/IMG_0286-320.jpg, /blog/united-kingdom-august-2015/IMG_0286-640.jpg 2x, /blog/united-kingdom-august-2015/IMG_0286-960.jpg 3x\" src=\"/blog/united-kingdom-august-2015/IMG_0286-320.jpg\" alt=\"Beach in Brighton\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/united-kingdom-august-2015/",
            "title": "United Kingdom, August 2015",
            "date_modified": "2015-11-03T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/oslo-bylarm-march-2016/",
            "content_html": "<p>Oslo has been on my list of cities I wanted to visit for some time now and when I saw the lineup of <a href=\"http://bylarm.no\">By:Larm festival</a> I knew that I needed to go to Oslo in March. Once again my friend Karin decided to join me and here we are, after five days in the capital of Norway in which we saw amazing bands, drank the most expensive beers of our lives, used the subway to get to Oslos skiing area and had a really great time.</p>\n<p>I arrived in the late afternoon and after a delicious burger we saw Léonne (Photo), Whitney (Photo), Oscar Blesson and Bea1991 at Pokalen.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2916.jpg\" alt=\"Léonne at Pokalen, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2923.jpg\" alt=\"Whitney at Pokalen, By:Larm Festival 2016, Oslo\"></p>\n<p>On the second day snow from the previous night was still covered the ground of Oslo and we walked around the city. Along Karl johann gate through Slottsparken and around the new waterfront area. We also visited the Astrup Fearnley Museum of Modern Art, drank coffee and ate Kanelbulle. On the way back to our apartment we walked through the old fortress, Akershus festning.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2979.jpg\" alt=\"Oslo Slottsparken\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2980.jpg\" alt=\"Oslo Slottsparken\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2981.jpg\" alt=\"Olso Castle\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2983.jpg\" alt=\"Akershus festning, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_2984.jpg\" alt=\"Akers Brygge, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3662.jpg\" alt=\"Akershus festning, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3665.jpg\" alt=\"Akershus festning, Oslo\"></p>\n<p>In the evening we attended so many shows. I started with Siv Jakobsen (photo) and Karin later joined me at Café Mono for Pale Honey (photo), Ida Stein (photo) at Sentrum Scene, Charlotte Dos Santos at Gamla, Abra (photo) at Internasjonalen, Little Jinder at Drømmelteltet and Dolores Haze (photo) at Verkstedet.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3666.jpg\" alt=\"Siv Jakobsen at Café Mono, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3671.jpg\" alt=\"Pale Honey at Café Mono, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3673.jpg\" alt=\"Ida Stein at Sentrum Scene, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3676.jpg\" alt=\"Abra at Internasjonalen, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3663.jpg\" alt=\"Dolores Haze at Verkstedet, By:Larm Festival 2016, Oslo\"></p>\n<p>On Friday we went to the Munch Museum where there was an amazing Munch+Mapplethorpe exhibition and later we took a ferry trip around the islands in the Oslo Fjörd. We had more coffee and kanelbulle and ate another great burger and Illegal Burgers.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3678.jpg\" alt=\"Oslo Fjörd\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_3680.jpg\" alt=\"Oslo Fjörd\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4035.jpg\" alt=\"Illegal Burgers\"></p>\n<p>We saw Sea Lion (photo) and Alice Boman (photo) at St. Edwards Church, Kwamie Liv (photo) at Sentrum Scene and then again at St. Edwards Church Pixx (photo).</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4036.jpg\" alt=\"Sea Lion at St. Edwards Church, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4037.jpg\" alt=\"Alice Boman at St. Edwards Church, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4038.jpg\" alt=\"Kwamie Liv at Sentrume Scene, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4039.jpg\" alt=\"Pixx at St. Edwards Church, By:Larm Festival 2016, Oslo\"></p>\n<p>The next day we took the subway (T-banen) to Holmenkolmmen, visited the Ski Museum and took the elevator to the top of the ski jump tower (Holmenkollbakken). The biathlon world championship was while we were there, so there was a lot of action going on. On our way home we stopped at Fram musueum to learn about the history of polar expeditions and visit the boats that took the Norwegians to the poles.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4254.jpg\" alt=\"Holmenkollbakken, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4255.jpg\" alt=\"Biathlon World Championship at Holmenkolmmen, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4256.jpg\" alt=\"Holmenkollbakken, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4259.jpg\" alt=\"View from Holmenkollbakken, Oslo\"></p>\n<p>In the evening we saw The Prettiots at Café Mono (photo), Holly Macvie at St. Edwards Church, Lafawndah at Internasjonalen (photo), Bright at Verkstedet, Palace Winter at Rockefeller (photo) and Skinny Girl Diet (photo) at Revolver.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4261.jpg\" alt=\"The Prettiots at Café Mono, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4268.jpg\" alt=\"Lafawndah at Internasjonalen, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4408.jpg\" alt=\"Palace Winter at Rockefeller, By:Larm Festival 2016, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4409.jpg\" alt=\"Skinny Girl Diet at Revolver, By:Larm Festival 2016, Oslo\"></p>\n<p>On Sunday morning we visited the Opera and then Karin had to fly home, but since my flight was on Monday morning I spent the rest of the day wandering around Oslo, visiting Vigelandsparken and the national gallery.</p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4410.jpg\" alt=\"Oslo Operahuset\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4411.jpg\" alt=\"On top of Oslo Operahuset\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4413.jpg\" alt=\"Vigelandsparken, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4414.jpg\" alt=\"Vigelandsparken, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4415.jpg\" alt=\"Vigelandsparken, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4416.jpg\" alt=\"Vigelandsparken, Oslo\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4448.jpg\" alt=\"Oslo at night\"></p>\n<p><img src=\"/blog/2016-03-11-oslo-bylarm-mach-2016/IMG_4450.jpg\" alt=\"Akershus festning, Oslo at night\"></p>\n<p>Thanks Oslo for an amazing time. And the next time we will be going way up to the north.</p>\n<video src=\"/video/oslo-bylarm-march-2016/IMG_4475.m4v\" autoplay loop muted>\n</video>",
            "url": "/blog/oslo-bylarm-march-2016/",
            "title": "Oslo and By:Larm Festival, March 2016",
            "date_modified": "2016-03-11T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/zagreb-croatia-june-2016/",
            "content_html": "<p>After one too many after work beers back in May I decided to go to Zagreb, Croatia in June. It was just for two nights over the weekend, but it was wonderful and here are some pictures.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgID/8QAJRAAAgICAgICAQUAAAAAAAAAAQIDBAURACESEwYxQSIyYZHw/8QAGAEAAgMAAAAAAAAAAAAAAAAAAgMABAX/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQIRAwQhMf/aAAwDAQACEQMRAD8AhVvhmRmWtNcuQzJIEYwyyPsA9/4822Uimv14619Fs4yIeTV528xsAhSAAOgSCByq+SyJ8XTL2AuUvpRRfV7HT0zl0JOyEBAU6+t/n65PrVocxjMLkI5slDBlo3eWNJE8aoWMsAf070SNA9ffGTzznxsFY4R8RmM9Ua1lJvK21SGI+qvH6HYeoftII/H2O++uOe1lJkMUSfG4Lrxxqsk7xv5O2t96bo6IB/v88cdHcaVUJesm7svslkbeQovVvTvPXkHi8ch2rD+Rzmlk7dWiKdaUxVUUosS9KF1rXHHM8sFXb+T5lbUoTITIoIAA1roAccccJIln/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5467-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5467-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5467-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5467-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5467-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5467-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5467-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5467-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5467-320.jpg\" alt=\"Crkva sv. Marka, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Crkva sv. Marka</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAEFBgf/xAAmEAABBAECBgIDAAAAAAAAAAABAAIDEQQFMQYHEhQhURMyQmGR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIEBf/EAB4RAAECBwEAAAAAAAAAAAAAAAABAwUUISJRoeEC/9oADAMBAAIRAxEAPwC0bo4kBMRa8XVtNqI9Ec/yGE+a2XMM/jCeOOSLSc7JxYy4OHbNMJeQR9j1H97elqouZ2lnNgmzMXKnYypHtoW59G/zqtloLEHaW74QJD/Fb9dNe3h2WvMTv4ip4Oceij5O40kkl1t6MNm1De5N7tEs+9hB5JrKnAuo+1BN7oilKiLREQB//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5460-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5460-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5460-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5460-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5460-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5460-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5460-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5460-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5460-320.jpg\" alt=\"Square in front of Zagrebačka katedrala, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Square in front of Zagrebačka katedrala</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMGAgUIB//EAC0QAAEDAwICCAcAAAAAAAAAAAECAwQABREGEjFBExQhIiMyYbFCUVJigZHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGhEAAgMBAQAAAAAAAAAAAAAAAAECESEDMf/aAAwDAQACEQMRAD8A21mhOx9GRorTvisROkCkDIJB+7GePP8Alef6aK06l0hIffLiIrLktMYZOVIK1BOOZJ96zga1unVxFXBukjDfRq2IyvaTwyQfTtxVNRe5Ft1dHltb4zkZewI2gFOPhxyrJJ2NtHTEW1vW2FGjqK1yNhckLSPO6pRUs/sn8AUqO3ajtlwhMyJslhl1SR5zjcPqHp7HI5UpKdYRxvSeO+WiC0lKOxOcZyc8cnOa5f1Oet6xntu8BLeGRxPiq4mlKHP0sy4Rru/aWUxGG2HWkDul9G9QHyyeVKUphP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5461-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5461-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5461-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5461-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5461-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5461-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5461-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5461-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5461-320.jpg\" alt=\"Stairs in Gornji Grad, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Stairs in Gornji Grad</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgMH/8QAKxAAAgEDAwEGBwEAAAAAAAAAAQIDAAQRBRIhMQYHE1FhgRQiIzJBcaHB/8QAFwEBAQEBAAAAAAAAAAAAAAAABQMAAf/EACARAAEDAgcAAAAAAAAAAAAAAAABAhEDFQQUITEyQVH/2gAMAwEAAhEDEQA/ANM2jRJCisJ1ui+MFBtC+fmTXU6XHHx9SV+h3jbtNUN73n6sFBew0+aTcwCmJm5B6fdx7n2qQnejGtl4t5Y6aCWwoSORS3GfPgD/AGkLg3sPdgXTGhZtbpGdrnBpXn/aztXe6lq3xFoILeMxqu22lLoSPzkrnPpSuXBDZL1Sk7ZXtxeatd+NJ8gJZUAACnAH9wM5rNXCBpLRmLEG33hCxIHXgenFKUUzZBKpzUglnmdmZ2HTAU7QOAeg/dKUqhM//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5462-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5462-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5462-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5462-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5462-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5462-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5462-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5462-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5462-320.jpg\" alt=\"View over the city in Gornji Grad, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View over the city in Gornji Grad</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUHCAT/xAAqEAABAgUDAgUFAAAAAAAAAAABAgMABAUREgYhMROxFRciQWEzUXFyof/EABgBAAIDAAAAAAAAAAAAAAAAAAEEAgMF/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAECBAMRQSL/2gAMAwEAAhEDEQA/ALtUpi3iyaXMIZI2WMLpPzaxN4tGRYNPwRkHcLdRIGRPa8c9t6v1CyLeJO/hYSe4j2yuvK7KttNyrzYShtKCHB1SojlRJ3uftxGZGjkS9NDLsR4bLTaQ+9LZT03OsPZEYZp49jsDCMk8xtR2AzlhYW+gN/7CDKnNva0BZopdOqX1tukdWVlV/u0Fd4nVCj0idTabo1MeBJV6pVHJ9+IQh9lSIDuitKqWSdO02/w2R2MIQgEj/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5464-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5464-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5464-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5464-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5464-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5464-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5464-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5464-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5464-320.jpg\" alt=\"Gornji Grad, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Gornji Grad</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGAv/EACgQAAEDAwMDAwUAAAAAAAAAAAECAwQABREGEiExQWEHE1EiI1Jikf/EABcBAQEBAQAAAAAAAAAAAAAAAAQDBQb/xAAfEQACAQQCAwAAAAAAAAAAAAAAAgEDBRRRIXESMUH/2gAMAwEAAhEDEQA/AOovp9dHg5uZbYS2du55e0KP6kZzWjs+kbLFtjyrsuVJkJbytlv7aW89Pgk+Tx4qXaL5qtyc2zMkadG/qEqXuUPgAYHTOO1XLlf59uYErZFluNgNojNlwHZjJUvIPIGOnyaZNwh44kNguk8wZJUKXFUphp9Cm0HCSDwR4yBSrTvqu0kpW9bGSpwb8lxRz2/DwaVWLgmiWC+yRcHnFsqkFR95ADiVjghQ6VD1PKeuN4s8mQ4oOSQ6hwIO1OPpPA7c0pWBS+9HQV/a9mh0TaYd4sgeuDfuONuKaRzjakYOP6TSlKNLtsX4Lo//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5494-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5494-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5494-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5494-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5494-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5494-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5494-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5494-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5494-320.jpg\" alt=\"View from Kula Lotrščak of Crkva sv. Marka, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View from Kula Lotrščak of Crkva sv. Marka</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwIE/8QAJhAAAgAGAQQCAwEAAAAAAAAAAQIAAwQFESESBhMxUQciFnGhsf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/8QAHxEAAgEEAgMAAAAAAAAAAAAAAAEDBBEUMSGhAmHw/9oADAMBAAIRAxEAPwCdHyLZKqSqSrLXdlgSrrIQDGdkHO9x23XdjmFUPTlxRhoHhLUEfvn/ALHl/HbdcSy09HyQquBKbty1bxo+z735imV9LM6ZFVTVL1s4S6sKZzSmVVTOiSy417ziCGpk83fSLnpYo1bb+9F5r+uLZb5wk1nTl0luVDLxSWwZT4OQ2IRB0N/Sot9M0mfZ6gKnEvWVokvpjgBQvjGP7CHLkXDa7DDifKT6NCrawyrTbqqXIpxPnVyS1PDIlfd8MinXIcdEg4yYx75ju1UaJqFJhSmed3nUMx5sGwMkk62Tj3CEQtg9GQH7nLbPjcIQiiT/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5466-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5466-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5466-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5466-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5466-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5466-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5466-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5466-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5466-320.jpg\" alt=\"View from Kula Lotrščak, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View from Kula Lotrščak</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgMEB//EACcQAAIBAwIFBAMAAAAAAAAAAAECAwAEEQUhBhIxQWETFCIjUbHR/8QAGAEAAgMAAAAAAAAAAAAAAAAAAwQBAgX/xAAdEQACAQQDAAAAAAAAAAAAAAAAAQIDBCExBRFR/9oADAMBAAIRAxEAPwCRFpLHKgz9hzyg98df2KlNJuYVleNgjyYDOgG4B7ivJoYdd4g4klubi2urYXU4fEgkESLzZYZ7DAA81cJdP1T3dq9u0yLGHDBSxMe+RgnOdwDjpT1TkpPChgQhYrbkW2aKJpWKQIB3HmlVePVuN4cpDpWmzxjAWW4lxI3xG7bjfPilHV/HrTBOzn6jguNTu/UwZnOfyx/tZ20kkzoHlfBOOtKVnDpsLcryL1CsQMk0pSoLH//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5468-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5468-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5468-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5468-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5468-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5468-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5468-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5468-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5468-320.jpg\" alt=\"Croatian National Theater, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Croatian National Theater</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAUGB//EACgQAAEDAwIFBAMAAAAAAAAAAAECAwQABREGEhMhMVFxBxRBgSIz0f/EABgBAAMBAQAAAAAAAAAAAAAAAAECAwAE/8QAHREAAgEEAwAAAAAAAAAAAAAAAAEDAhIhQRETMf/aAAwDAQACEQMRAD8AidI+uc23R0M3+2i5p3HMkObHcdumDj6qj3m8rvWonrnJWppb+9ZBJISMfjz8YHblVriaJjTTwmL9xF9ExvbFHPsSU7RUxO9OJL6VSLrcZIaSj9ziEL4ZPLoDnFCqS5ZZO3aRm79/VNfckXB1Tspw5W6GUq3nGMnJ6/ylSUrR8Jh9bfvVyEgna60hICh3wTkeDSl7UDBadGRjFvUN9MiQtx5zhK3ryNpBPIfHQVtN6YbkWUNOJGwtk4HilK53stH4YgvT0FS1FQdUc/Ks/VKUrJvgQ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5469-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5469-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5469-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5469-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5469-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5469-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5469-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5469-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5469-320.jpg\" alt=\"Botanical Garden, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Botanical Garden</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBQgH/8QAJRAAAgEEAQQCAwEAAAAAAAAAAQIDAAQFERIGITFRQWEHExRS/8QAGAEAAgMAAAAAAAAAAAAAAAAAAQQAAgP/xAAcEQACAgMBAQAAAAAAAAAAAAAAAQIRA1KhBBP/2gAMAwEAAhEDEQA/AKLMdRXuFxjXLxw3IVgCqyDx77b9VP8ATn5NyV7lEtZLa3ZZpRwKjh+tCR2+9ch3NQUeD6glkJbHOzMvFF48Rs/68aFbDG4PMQ3ok/ghmSJNmS1YtpiBoedeVII+qZyehydpUKwwKKpuzoS3zymIc2jZvYlUClc0ZXI3tjevBdxKsoAOoow47jfn39Uqfda9CsEtuHpj3c8gIEjJv5Q6NYLFXsYpBazTIrkErz2N7Pwe3yaUpU2RO5YQ2l9JCtvFIAeXJy2yT3PggeTSlKsA/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5470-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5470-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5470-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5470-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5470-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5470-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5470-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5470-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5470-320.jpg\" alt=\"Zagreb glavni kolodvor, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Zagreb glavni kolodvor (Zagreb main station)</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwIF/8QAKRAAAgEDAwIEBwAAAAAAAAAAAQIDAAQFBhEhEjEHEyJRQVJhcYKRof/EABcBAQEBAQAAAAAAAAAAAAAAAAQAAQL/xAAcEQACAQUBAAAAAAAAAAAAAAAAAREDBBQxQSH/2gAMAwEAAhEDEQA/ANJyGlbyZwRNBOg+bdCo/Go9lBJjLiY2KvJPBIYX8qQP5bgAkdJHfZh+6z3Da28QVSGG7xdjcqBtv0iORvoQpAJ+HausRrHUdhkMhA2FikmvZXvIY5ZQjIuyqV9POwO3HfmlZXGEdDqL1f47IXty07NfuW7ndU/lKpt3rXX5kXysdZRL0j0xoWA+5Y96V0ryPEix52xjBvmbROdmmRTz7sBXk30CxaktSGdjEtwilm339Q5PueaUoK0JJxmf3pSlYR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5471-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5471-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5471-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5471-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5471-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5471-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5471-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5471-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5471-320.jpg\" alt=\"Park Josipa Jurja Strossmayera, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Park Josipa Jurja Strossmayera</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUCAwYH/8QAKBAAAgEDAwMCBwAAAAAAAAAAAQIDAAQRBRIhBjFhFUEiMjNRcYHw/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/8QAGhEBAAEFAAAAAAAAAAAAAAAAAAIBERITMf/aAAwDAQACEQMRAD8A4NUXT3dDbwzwLCGLqxHxEcNj7DnjzWi81ITSQx3UaiHYNoQkdjxnPHnt71Vh0vqqPafRL2RSipta2PAXtzn+xWOoaJ1JcxyKOnLuJWIP0ySDkE8k+KzrFdFu7SSKRRGkl1GUDKyR42gj5Tn3FK77TdGv7mzja+0+7tp1G1kaDOfIODxzSrgr1K5keOJ2VjlWIB/dX9E06C8srea4DM8mQ2DgfkYpSmlVI9XobaG3jEaRqVXtlQTSlKIr/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5472-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5472-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5472-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5472-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5472-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5472-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5472-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5472-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5472-320.jpg\" alt=\"Park Josipa Jurja Strossmayera, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Park Josipa Jurja Strossmayera</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcGCP/EACgQAAEDAwMDAwUAAAAAAAAAAAECAwQABREGEiETMVEUQXEHCCJhkf/EABgBAAIDAAAAAAAAAAAAAAAAAAEDAAIE/8QAGhEBAAIDAQAAAAAAAAAAAAAAAAERAiExQf/aAAwDAQACEQMRAD8A0Ni+4CwzCkXa2y7c6VAEtkPNhPurPB48YqyrmQ0wDLektIjbOr1VKwnbjO7PjFcKRtMXiWFqgQJT6EgbltoJ25Hv4qo6rla6n6VtlmVZnFW1uMELbjtkqJAASVY54x2/fxRtVW531V0wzKW2yuVKQk46rLY2K+MkE/NK5djKvUBroN+tQEk/j6dXB/lKFymlfYSlgrUhIyrg5HfFba52iExZUymmiHtiTncT3HilKzYckyfGFS0gZASAMntxSlKWL//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5527-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5527-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5527-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5527-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5527-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5527-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5527-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5527-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5527-320.jpg\" alt=\"Zagrebačka katedrala from Meštrović Pavilion, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Zagrebačka katedrala from Meštrović Pavilion</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFBv/EAC8QAAEDBAACBQ0AAAAAAAAAAAEAAgMEBQYREjEHEyKRoRQhJjJBQlFhgYOTsdH/xAAXAQEBAQEAAAAAAAAAAAAAAAADAQAC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oADAMBAAIRAxEAPwDmosnslR2mXKJhPuzNc0+IRt/tLHOLrnRtby7J2ddy0qjokIYTDa5nu4eINa4t2fhsnmp2dElYXjdkkDfaTUgkfTauNzpY8uX2iOVzfLZpRvzOZCdeIRW1+EUFuqn0tTaaoys1xdXC6QDY3zB5orjbSlly/Jo/UyG5j7u/2FM/NsqG/SK5fkH8REASrc5ccjvMlZLLLc6mSWQ8T3vdsuPz7kREwoRoX//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5528-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5528-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5528-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5528-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5528-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5528-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5528-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5528-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5528-320.jpg\" alt=\"Meštrović Pavilion, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Meštrović Pavilion</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwj/xAAnEAABAwMCBgIDAAAAAAAAAAABAgMEAAUREjEGEyFBUXEUIgcjkf/EABgBAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAGREAAwEBAQAAAAAAAAAAAAAAAAECETEy/9oADAMBAAIRAxEAPwC1/jG+ybff53DVzlvuxwo/BW8SpTekdWyT20jI9YrQX76LRdHDcZURi3pjFZdW4E/bWAD/ADpjzXO8e7yo/FjtwccdC230q1tfYbaUgHvnbHupriS+QZDnzLu0lYEgrDUhR/XqIGdOMEjAqkW8xk0lpeWZLE5b8uzJUzBfcLjaCS3v1zgZ339k0qqIvEaSpa2pkflhRSkNqISMeKUm6reBkkY9YjzJ6ZKxl0KBHgHzipbiR9b8NQewsKUCQe/WlK0Z4J16Il9htThOnGewOKUpQwiP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5529-960.jpg, /blog/zagreb-croatia-june-2016/IMG_5529-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/zagreb-croatia-june-2016/IMG_5529-640.jpg, /blog/zagreb-croatia-june-2016/IMG_5529-1280.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5529-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/zagreb-croatia-june-2016/IMG_5529-320.jpg, /blog/zagreb-croatia-june-2016/IMG_5529-640.jpg 2x, /blog/zagreb-croatia-june-2016/IMG_5529-960.jpg 3x\" src=\"/blog/zagreb-croatia-june-2016/IMG_5529-320.jpg\" alt=\"Gornji Grad, Zagreb, Croatia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Gornji Grad</figcaption></figure><p></p>",
            "url": "/blog/zagreb-croatia-june-2016/",
            "title": "Zagreb, Crotia, June 2016",
            "date_modified": "2016-06-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/wien-9-november-2016/",
            "content_html": "<p>Ich laufe durch die Straßen Wiens und weiß nicht so genau wohin. Letzte Nacht habe ich wenig und schlecht geschlafen. Als um 5 Uhr Morgens die Wahrscheinlichkeit eines Sieges Trumps auf über 90% gestiegen ist, bin ich ins Bett. Jedes Mal wenn ich aufgewacht bin hatte er mehr Stimmen im Electoral College. Irgendwann war er Präsident.</p>\n<hr>\n<p>Trump ist ein Egoist; er nimmt sich was er will ohne sich um die Konsequenzen zu kümmern. Seine Taten haben keine Konsequenzen für ihn weil er Macht hat und kein Schamgefühl. Bislang kam seine Macht aus seinem Reichtum und seiner Bekanntheit, ab 20. Jänner 2017 hat er tatsächliche politische Macht.</p>\n<hr>\n<p>Die Zeit wird zeigen ob er wirklich eine Mauer zu Mexiko bauen wird, ob er wirklich Clinton versucht einzusperren, aber es geht nicht nur um Donald Trump. Mike Pence wird Vizepräsident sein, ein Typ der Leuten die Homosexualität mit Elektroschocks austreiben will, der verlangt, dass Frauen ein Begräbnis für totgeborene Föten abhalten müssen. Es geht um den Senat und das die Republikaner jetzt das Weiße Haus, den Senat und das Repräsentantenhaus kontrollieren. Es geht um den freien Sitz im Supreme Court, den Trump besetzen kann. Damit müssen die Amerikaner nicht nur vier Jahre leben sondern eine Generation.</p>\n<hr>\n<p>Die USA sind weit vielleicht geographisch weit weg, aber der Hass ist ganz nah. Präsident Trump ist der größte Sieg für die Neue Rechte bisher, aber nicht der Letzte. Am 4. Dezember hat Norbert Hofer gute Chancen der österreichische Bundespräsident zu werden. 2017 Le Pen in Frankreich? Pegida und die AfD in Deutschland. Die Rechten erstarken überall in Europa und die traditionellen, konservativen Volksparteien ziehen mit und verschieben die Mitte nach rechts. Was gestern noch unsagbar war ist heute das neue normal.</p>\n<hr>\n<p>Ich will nicht das Rassismus, Sexismus und Homophobie wieder zur Normalität wird. Hass soll nicht wieder der Standard sein. Wir haben in den letzten Jahrzehnten so viel erreicht und ich will nicht wahrhaben, dass wir Schritt für Schritt zurück gehen. Es hat angefangen mit der französischen Revolution, aber wir sollten nicht wieder zu einem Stand kommen bei dem Freiheit, Gleichheit und Brüderlichkeit nur für weiße, heterosexuelle Männer gelten.</p>\n<hr>\n<p>Zum Ende die Worte einer Kommentatorin im US Fernsehen:</p>\n<blockquote>\n<p><a href=\"https://twitter.com/meakoopa/status/796205077761576960\">I have nothing left to lose so I will say it: This is white supremacy's last stand.</a></p>\n</blockquote>",
            "url": "/blog/wien-9-november-2016/",
            "title": "Wien, 9. November 2016",
            "date_modified": "2016-11-09T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/new-job-web-developer/",
            "content_html": "<p><strong>TL;DR</strong> Recently I quit my job and I am now looking for a company that wants to hire a frontend and/or backend web developer (you might call it full stack). I create websites since I was 12 and worked for the past 8 years in companies creating websites and apps. My master thesis on Machine Learning is currently in the submission process. I am looking for a full time position in Vienna or remote.</p>\n<p>When I started creating websites in 1998 I was 12 and I built layouts with tables and styled content using HTML tags. Nowadays I use sophisticated frameworks, Sass and SVG to create usable web sites and applications that work on any device. After 18 years I still love this shit.</p>\n<p>Currently I hold a Bachelor of Science degree, but my master thesis is currently in the submission process and it should not take much longer until I receive my Master of Science degree. In my thesis I write about Web Data Extraction using Machine Learining. I also did a curriculum supplement on Innovation.</p>\n<p>For me the most important part is working with a great team. I am not looking for a job where I have to work alone on a product. I value people over process. No matter what software development methodology you are using, I believe that it should not limit people in creating great products.</p>\n<p>I deeply care about building great products, but I don't really care which technologies your company is using. Due to my long experience I can learn new frameworks, tools and languages quite easily. However, in case you are wondering, here are some technologies I have used in the past and that are as of November 2016 not yet irrelevant: JavaScript, PHP, Java, TypeScript, Ionic Framework, AngularJS, Bootstrap, MySQL/MariaSQL, SQLite, Vue.js, Gulp, Grunt, Webpack, CSS, Sass, Less, Stylus, Ruby, Wordpress, Symfony, Laravel, Git.</p>\n<p>I also have a <a href=\"/cv/\">CV</a>.</p>\n<p>If you believe that I might be right for your team and you have a job offer in Vienna or remote, please contact me and we can talk further.</p>",
            "url": "/blog/new-job-web-developer/",
            "title": "I'm Looking For a New Job As Full Time Web Developer",
            "date_modified": "2016-11-22T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2016/",
            "content_html": "<p>In 2016 I managed for the first time to read 52 books, that is, one book per week on average. In reality I read a lot at the beginning of the year and at the end of the year. During the summer I read very little, which is the fault of Pokémon Go and I read a lot in November and December when I was unemployed. For 2017 I set my goal to 60 books, it will take less than 365 days to see how this goes.</p>\n<p>Without further ado here is the list of books I have read in 2016. I include links to Amazon, but I recommend that you do as I do and buy them at your local book store. At least some of the books on that list, I have found while browsing the store waiting to pick up my order.</p>\n<ul>\n<li><a href=\"http://amzn.to/2issel7\">The Shock Doctrine: The Rise of Disaster Capitalism</a> by Naomi Klein ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2iSlcsH\">The Information: A History, a Theory, a Flood</a> by James Gleick ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i3Tp9R\">Under the Udala Trees</a> by Chinelo Okparanta ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i63w93\">Fates and Furies</a> by Lauren Groff ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i7VLTv\">Aftermath: Star Wars</a> by Chuck Wendig ✭✭✭✩✩</li>\n<li><a href=\"http://amzn.to/2isrXyJ\">Dark Matter and the Dinosaur</a> by Lisa Randall ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2jrKA9Z\">The Invention of Nature: Alexander von Humboldt's New World</a> by Andrea Wulf ✭✭✭✭✩</li>\n<li>Europa Erleben: Oslo by Lothar Schneider ✭✭✩✩✩</li>\n<li><a href=\"http://amzn.to/2jijRZq\">Die Erettung der modernen Seele</a> by Eva Illouz ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2jrJtam\">On Revolution</a> by Hannah Arendt ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i3HMzB\">The Sellout</a> by Paul Beatty ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i5PDb4\">Designing for Performance</a> by Lara Callender Hogan ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i7ZgJz\">Fight Club</a> by Chuck Palahniuk ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i3LBos\">Moral Blindness</a> by Zygmunt Bauman and Leonidas Donskis ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2isvhcU\">Eileen</a> by Otessa Moshfegh ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i7QRpB\">Authority (Southern Reach, #2)</a> by Jeff VanderMeer ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2iSqViz\">Acceptance (Southern Reach, #3)</a> by Jeff VanderMeer ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i3LWY1\">Complete Stories</a> by Clarice Lispector ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2iSuXan\">Cleopatra: A life</a> by Stacy Schiff ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2isqN6l\">Vienna</a> by Eva Menasse ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2jipJln\">Seven Brief Lessons on Physics</a> by Carlo Rovelli ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i619mP\">Mensch Nummer Datensatz: Unsere Lust an totaler Kontrolle</a> by Hans Zeger ✭✭✭✩✩</li>\n<li><a href=\"http://amzn.to/2i3KEMJ\">Unheilpraktiker: Wie Heilpraktiker mit unserer Gesundheit spielen</a> by Anousch Mueller ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2jirizH\">Aberland</a> by Gertraud Klemm ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i5Ufhn\">Modern Lovers</a> by Emma Straub ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2jil3f7\">A Manual for Cleaning Woman: Selected Stories</a> by Lucia Berlin ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i3JIrX\">Das Urteil</a> by Franz Kafka ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i3JDo9\">PostCapitalism: A Guide to Our Future</a> by Paul Mason ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2jinbDW\">Trouble in Paradise: From the End of History to the End of Capitalism</a> by Slavoj Žižek ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i7TuYi\">Geronimo</a> by Leon de Winter ✭✭✩✩✩</li>\n<li><a href=\"http://amzn.to/2jiluWX\">Sex Object: A Memoir</a> by Jessica Valenti ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i5VahN\">Untenrum Frei</a> by Margarete Stokowski ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2iSeUtm\">The Utopia of Rules: On Technology, Stupidity, and the Secret Joys of Bureaucracy</a> by David Graeber ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i65zdd\">Gegen den Hass</a> by Carolin Emcke ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2jieMAr\">Was Linke Denken</a> by Robert Misik ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2jrDimK\">H is for Hawk</a> by Helen Mcdonald ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i7Gwdg\">Feminism Is for Everybody: Passionate Politics</a> by bell hooks ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2iSjzLD\">Anleitung für eine Revolution</a> by Nadya Tolokonnikova ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2iS8TNb\">Der Unfisch</a> by Michael Köhlmair ✭✭✩✩✩</li>\n<li><a href=\"http://amzn.to/2iScSt6\">Everyting Belongs to the Future</a> by Laurie Penny ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2jikPEX\">Eichmann in Jerusalem: ein Bericht von der Banalität des Bösen</a> by Hannah Arendt ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i3JmRT\">Rules for Revolutionaries: How Big Organizing Can Change Everything</a> by Becky Bond and Zack Exley ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i3L5GZ\">Hitlers Wien: Lehrjahres eines Diktators</a> by Brigitte Hamann ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2isnWu9\">Ach, Österreich</a> by Armin Thurnher ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2iSclY8\">Between the World and Me</a> by Ta-Nehisi Coates ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2ispyUx\">Winter is Coming: Why Vladimir Putin and the Enemies of the Free World Must Be Stopped</a> by Garry Kasparov ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2i664Em\">Herzmilch</a> by Gertraud Klemm ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2jigOAv\">Private Citizens</a> by Tony Tulathimutte ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2jincaM\">Inventing the Future: Postcapitalism and a World Without Work</a> by Nick Srnicek and Alex Williams ✭✭✭✭✭</li>\n<li><a href=\"http://amzn.to/2i7KCC0\">Die Maschine steht still</a> by E. M. Forster ✭✭✭✩✩</li>\n<li><a href=\"http://amzn.to/2i5SkJH\">Der Mond</a> by Jiří Mahen ✭✭✭✭✩</li>\n<li><a href=\"http://amzn.to/2isn4Fv\">Was uns treibt</a> by Amy Hempel ✭✭✭✭✭</li>\n</ul>",
            "url": "/blog/books-2016/",
            "title": "Books I Have Read in 2016",
            "date_modified": "2017-01-08T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/new-albums-2018-04-27/",
            "content_html": "<p>You know the drill by now: another Friday, another list of great new albums.</p>\n<h2>Lavender by Half Waif</h2>\n<p>After the brilliant <em>Form/a</em> EP from last year Half Waif have released their second album Lavender today. This is the finest synth pop.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIDBQj/xAAjEAACAgIABQUAAAAAAAAAAAABAgADBBEFIUFRcQYSEzFh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAD/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEh/9oADAMBAAIRAxEAPwDn4DZA7y26iylUNiModQy+5dbB6iXcMopvzqqsi34q2PN+g8/k0fVF+LlZlQ4ftqK6lrUk7PLf3NhMrDiTKEREGh23LlbloKo8CIkgkxEQT//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-27/half-waif-lavender-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-27/half-waif-lavender-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-27/half-waif-lavender-320.jpg, /blog/new-albums-2018-04-27/half-waif-lavender-640.jpg 2x, /blog/new-albums-2018-04-27/half-waif-lavender-960.jpg 3x\" src=\"/blog/new-albums-2018-04-27/half-waif-lavender-320.jpg\" alt=\"Album cover of Lavender by Half Waif\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Check out the beautiful <a href=\"https://www.youtube.com/watch?v=2bmoRHL4YFY\">Back in Brooklyn</a>.</p>\n<p><a href=\"https://itunes.apple.com/at/album/lavender/1340063646?l=en\">Bandcamp</a>\n<a href=\"https://itunes.apple.com/at/album/lavender/1340063646?l=en\">Apple Music</a>\n<a href=\"https://open.spotify.com/album/532amYK3U0iIoxSw9awdz9\">Spotify</a></p>\n<h2>Dirty Computer by Janelle Monáe</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUGBAcI/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQMCAAQRBQYSEyExQXGRBxRhgcH/xAAYAQACAwAAAAAAAAAAAAAAAAAEBQEDBv/EACIRAAIBBAIBBQAAAAAAAAAAAAECIQADBBESEzFRcZHB8P/aAAwDAQACEQMRAD8Aum/d9O0XQ/vbeAYznFSImRiJTlnHL8AAk4ql7c+oe5U6/pqNWdZvttQb0lTRgFcj4yAe8cnHf5qF1zV0ajorEviZsUyL1xn3HKIIPuCCRUBte5sV67ZXD1QzakPjKPkEZwB+z3z/AGgelw1wMsjeviNU2QqMdGBnY397/eK6PVunCx1YDn6+/rStKu3EybZSHUkCcg0o9MU8RyE0muXW5ngY3HtVDub5zWugeIiM9gPNRzGS6I4yMSYZzHsQeQ8GlKh2PaZrUG0gxregJrKdqN1bMKoNMgPWYBPzSlKIRm4iatycayLrAIPPoK//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-27/janelle-monae-dirty-computer-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-27/janelle-monae-dirty-computer-640.jpg, /blog/new-albums-2018-04-27/janelle-monae-dirty-computer-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-27/janelle-monae-dirty-computer-320.jpg, /blog/new-albums-2018-04-27/janelle-monae-dirty-computer-640.jpg 2x, /blog/new-albums-2018-04-27/janelle-monae-dirty-computer-960.jpg 3x\" src=\"/blog/new-albums-2018-04-27/janelle-monae-dirty-computer-320.jpg\" alt=\"Dirty Computer by Janelle Monáe\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Please watch the video for <a href=\"https://www.youtube.com/watch?v=PaYvlVR_BEc\">PYNK</a>, which features Grimes.</p>\n<p><a href=\"https://exitmusic.bandcamp.com/album/the-recognitions\">Bandcamp</a>\n<a href=\"https://itunes.apple.com/at/album/dirty-computer/1350021308?l=en\">Apple Music</a>\n<a href=\"https://open.spotify.com/album/2PjlaxlMunGOUvcRzlTbtE\">Spotify</a></p>\n<h2>Twerp Verse by Speedy Ortiz</h2>\n<p>I love this kind of indie rock. <span role=\"img\" aria-label=\"guitar\">🎸</span></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYDAQf/xAAkEAACAQQCAgEFAAAAAAAAAAABAgMABAUREiEGMUETI1GB0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQADAQEBAAAAAAAAAAAAAAAAAQIRAyH/2gAMAwEAAhEDEQA/APZ8lmbfFzQwXsgWe4YCFVRip2wUbIHXZrdrh5AjcUjjYglmbl1vWhx63/RWGdtMfcQpd5UAJbDnzLlVXRB2de+wKl8r5347FDPcRTS3Dxgc4okKsVPRI2QP189Ul3KaW+jymVs0YMjch3Suc41CgEqOI0G3vWvmlHGA0ydnFf2E9pcAmGVSrAe6jl8FxEF4jJ9f7RV1BZdfnXr1SlQ6yqpaikPE8KeYBpDvulKVpJH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-27/speedy-ortiz-twerp-verse-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-27/speedy-ortiz-twerp-verse-320.jpg, /blog/new-albums-2018-04-27/speedy-ortiz-twerp-verse-640.jpg 2x\" src=\"/blog/new-albums-2018-04-27/speedy-ortiz-twerp-verse-320.jpg\" alt=\"Album cover of Twerp Verse by Speedy Ortiz\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Watch the music video for <a href=\"https://www.youtube.com/watch?v=f76rghmg1jI\">Lucky 88</a>.</p>\n<p><a href=\"https://speedyortiz.bandcamp.com/album/twerp-verse\">Bandcamp</a>\n<a href=\"https://itunes.apple.com/at/album/twerp-verse/1346045295?l=en\">Apple Music</a>\n<a href=\"https://open.spotify.com/album/3OintNAVsJFmqhDNtIlqd9\">Spotify</a></p>\n<h2>In the Rainbow Rain by Okkervil River</h2>\n<p>This is Okkervil River ninth official full length album since 2002. That's a lot of output and I still like their version of folk rock.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBgUH/8QAJxAAAgIBAwMCBwAAAAAAAAAAAQIDBAAFERITITFRcQYUI0FjoeH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEBgX/xAAgEQACAwABBAMAAAAAAAAAAAABAgADESEEBRJBFFFx/9oADAMBAAIRAxEAPwDSaNFplxIYSsfWCAuWAHftnWv/AA/p1eB5VtVGKpy4RqCSfT9HPIFXUK9i21UNPFJMxfivMoN+w28j1yzBb1NLKWKkUtjdTuOBIX3J8f3HWXY2aZKpciKEFQPA9D6/JodQaBpwaw+nxH2274yjBI8iEy8A4OxCNyAOM16TqCSPcc+U/iMGyuNIhFhrEc1mKRm5nhJsCcn8q00XSkt2ig/J598YwxVdPE3a7rCgJY8Ae5KnSjoxGOJpGVmLkudzucYxiqxigCT3WMXvZmOnZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-27/okkervil-river-in-the-rainbow-rain-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-27/okkervil-river-in-the-rainbow-rain-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-27/okkervil-river-in-the-rainbow-rain-320.jpg, /blog/new-albums-2018-04-27/okkervil-river-in-the-rainbow-rain-640.jpg 2x, /blog/new-albums-2018-04-27/okkervil-river-in-the-rainbow-rain-960.jpg 3x\" src=\"/blog/new-albums-2018-04-27/okkervil-river-in-the-rainbow-rain-320.jpg\" alt=\"In the Rainbow Rain by Okkervil River\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <a href=\"https://www.youtube.com/watch?v=YiOJBGjnV04\">Don't Move Back To LA</a>.</p>\n<p><a href=\"https://okkervilriver.bandcamp.com/album/in-the-rainbow-rain\">Bandcamp</a>\n<a href=\"https://itunes.apple.com/at/album/in-the-rainbow-rain/1346153001?l=en\">Apple Music</a>\n<a href=\"https://open.spotify.com/album/6OvgNPOobLBiiXctTcN5bc\">Spotify</a></p>",
            "url": "/blog/new-albums-2018-04-27/",
            "title": "New Albums on April 27, 2018",
            "date_modified": "2017-04-27T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/summer-2017-playlist/",
            "content_html": "<p>A collection of songs I like to listen to this summer. When I walk through the streets in the blistering heat, when I sit in the shade, when I sit beside the open window while a storm is raging outside.</p>\n<h2>Summer 2017</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUCAwcI/8QAJhAAAgEDAwMEAwAAAAAAAAAAAQIDAAQRBSExBhJhIjJBUQcTgf/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwD/xAAZEQEAAwEBAAAAAAAAAAAAAAAAAQIRAyH/2gAMAwEAAhEDEQA/AIGh3lzFq9nZXneqHVlYnPqRCVXYfJ9SgA7c12D8m9S6fr3QIdYosSlLnFwQTAyuce07PscZ234rz0nWWt3c9pduI5pIcOhICsDkEb+CBW3XbjVHaOO51BJ4W7jN+sE9uDsMH7z9UKc5zxrXTNT6iktNQnWPsMbEMhlJY9uABjHA245pU/VrMu1tIJXJaEZ42wzD48AUpsJqtosSCQDHtGRWcEaLbyhFCgBeP7SlVhNOdELHKKT5FKUpsB//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/summer-2017-playlist/summer-2017-playlist-960.jpg, /blog/summer-2017-playlist/summer-2017-playlist-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/summer-2017-playlist/summer-2017-playlist-640.jpg, /blog/summer-2017-playlist/summer-2017-playlist-1280.jpg 2x, /blog/summer-2017-playlist/summer-2017-playlist-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/summer-2017-playlist/summer-2017-playlist-320.jpg, /blog/summer-2017-playlist/summer-2017-playlist-640.jpg 2x, /blog/summer-2017-playlist/summer-2017-playlist-960.jpg 3x\" src=\"/blog/summer-2017-playlist/summer-2017-playlist-320.jpg\" alt=\"Summer 2017 Paylist\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li><strong>No Coffee</strong> by Amber Coffman</li>\n<li><strong>Candy May</strong> by Alex Cameron</li>\n<li><strong>This Year</strong> by Beach Fossils</li>\n<li><strong>Heaven</strong> by liv</li>\n<li><strong>I Dare You</strong> by The xx</li>\n<li><strong>Bombo Fabrika</strong> by Gabriel Garzón-Montano</li>\n<li><strong>Drew Barrymore</strong> by SZA</li>\n<li><strong>Moonshire Freeze</strong> by This Is the Kit</li>\n<li><strong>Never Been Wrong</strong> by Waxahatchee</li>\n<li><strong>Grip</strong> by Pixx</li>\n<li><strong>Radio</strong> by Sylvan Esso</li>\n<li><strong>Skim</strong> by Torres</li>\n</ul>\n<p>Playlist on <a href=\"https://itunes.apple.com/at/playlist/summer-2017/idpl.e00ebd2e4fb544d5b1494f50dc76a4d6?l=en\">Apple Music</a>, <a href=\"https://open.spotify.com/user/116566668/playlist/6Mjboeq1eaPmgY66n2qsAr\">Spotify</a> and <a href=\"https://www.youtube.com/playlist?list=PLCf6Lw03kOwdBJT_gYrSD7EsFSrcKI9RN\">YouTube</a>.</p>",
            "url": "/blog/summer-2017-playlist/",
            "title": "Summer 2017 Playlist",
            "date_modified": "2017-07-12T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/demokratie-verkaufen/",
            "content_html": "<p>Wir müssen aufpassen in Österreich, dass die Spenden von der Industrie an die Politik nicht aus dem Ruder laufen. Verhältnisse wie in den USA wo Politiker_innen den Großteil ihrer Zeit mit Spenden sammeln verbringen brauchen wir nicht.</p>\n<p>Transparenz alleine wird da nicht reichen. In dem aktuellen Wahlkampf haben die sechs größten Spender_innen der ÖVP 561.463 Euro an die Partei überwiesen, die Kleinspender_innen (unter 100 Euro) nur ungefähr 132.000 Euro. Wenn KTM-Chef Pierer 436.463 Euro an die ÖVP überweist dann will er etwas dafür. Wenn ich an die Wiener Tafel spende will ich das niemand in Wien verhungern muss. Wenn ich an Ärzte ohne Grenzen spende will ich das niemand im Mittelmeer ertrinken muss. Was Pierer will hat er in Interviews offen gesagt: Arbeitszeitflexibilisierung, also einen 12-Stundentag ohne Lohnausgleich.</p>\n<p>Eine Obergrenze für Spenden, zum Beispiel 1.000 Euro pro Person und Firma pro Jahr, würde dagegen helfen. Stattdessen erhöhen wir die Parteifinanzierung. Demokratie ist nicht gratis und wir als Gesellschaft sollten diese Demokratie finanzieren und damit sicherstellen das sie auch im Interesse von uns allen arbeitet. Natürlich, das kostet Geld, aber auch wenn Parteien von der Industrie finanziert werden kostet uns das Geld. Pierer hat sein Vermögen ja nicht hergezaubert, Kund_innen von KTM haben Pierer zu seinem Vermögen verholfen und seine Spende an die ÖVP ermöglicht. Wenn die ÖVP die von ihm geforderte Arbeitsflexibilisierung bestimmt zahlen alle Arbeitnehmer_innen in Österreich noch einmal in Form von nicht bezahlten Überstunden.</p>\n<p>Leistung ohne Gegenleistung macht die Reichen noch ein wenig reicher und dann bleibt vielleicht auch noch ein bisschen mehr Geld für die ÖVP übrig.</p>\n<ul>\n<li><a href=\"https://kontrast-blog.at/in-der-oevp-spi/\">Kontrast Blog: Konflikte in der ÖVP: Kurz setzt auf Großspender und verdrängt ArbeitnehmerInnen</a></li>\n<li><a href=\"http://derstandard.at/2000062296787/OeVP-hat-mit-neuen-Grossspendern-Millionengrenze-ueberschritten\">derStandard.at: Neue Großspender: ÖVP hat Millionengrenze überschritten</a></li>\n<li><a href=\"http://derstandard.at/2000062091942/KTM-Chef-Pierer-spendet-der-OeVP-436-563-Euro\">derStandard.at: KTM-Chef Pierer spendet der ÖVP 436.563 Euro</a></li>\n</ul>",
            "url": "/blog/demokratie-verkaufen/",
            "title": "Lassen wir uns die Demokratie nicht von der Industrie abkaufen",
            "date_modified": "2017-08-05T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/ireland-photos/",
            "content_html": "<h2>Belfast, Northern Ireland</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgQHCP/EACgQAAIBAwMCBQUAAAAAAAAAAAECAwAEEQUGIRITByIxUXEUMkJhkf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/xAAYEQADAQEAAAAAAAAAAAAAAAAAAQIRIf/aAAwDAQACEQMRAD8A7dZ6/pd5n6PULa4wcHtSBscA8+3BFSEsyxqGeREX3Y15B29darpGoJd2QaCRRkq5Bjcj0BH5ZyeDVm3hvDc2tW1rD3Y0WMeZbU9suxXHm5+fTilpThkx4ieKOoPuHp2zezxWEcQTK46ZGycuP0QRj4pXIAskLOkwnicN9vbzSobreGyUZ0tcI6lyeazYYBxSlMRqOT1ep/tKUoA//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/7-960.jpg, /blog/ireland-photos/7-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/7-640.jpg, /blog/ireland-photos/7-1280.jpg 2x, /blog/ireland-photos/7-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/7-320.jpg, /blog/ireland-photos/7-640.jpg 2x, /blog/ireland-photos/7-960.jpg 3x\" src=\"/blog/ireland-photos/7-320.jpg\" alt=\"Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAMAAwAAAAAAAAAAAAAAAAQFBgMHCP/EACYQAAEDAwQCAQUAAAAAAAAAAAECAwQABREGEiFBMVEiBwgTcYH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQMC/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAESIQIxQVH/2gAMAwEAAhEDEQA/APQq73bG4cWWufGTFlEJYdKxtcJ8AGqXVWrBZYFwkMRjJMRCiUDPyUOs9D2a6wjfUizPq/EnTyWEIysb1HaD+sAZzXFI163emFR32IDMThZbkunasJIJRj2es8ZFZkvRNrhV2f7gr0qMsTrLDkPJcUCppSkAD1jJ5FKx7TNlmLkPutLhKcfdUGmCCkArJHXQIH8pSkFES6sBUp1W9zOST8uDWeakrOPHnHfs0pUmh5KycypQChngKIpSlRewP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/11-960.jpg, /blog/ireland-photos/11-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/11-640.jpg, /blog/ireland-photos/11-1280.jpg 2x, /blog/ireland-photos/11-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/11-320.jpg, /blog/ireland-photos/11-640.jpg 2x, /blog/ireland-photos/11-960.jpg 3x\" src=\"/blog/ireland-photos/11-320.jpg\" alt=\"Botanical Gardens in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAcDBQb/xAAnEAABAwMEAQMFAAAAAAAAAAABAgMEAAURBhIhMUEHIlEUgZGx0f/EABYBAQEBAAAAAAAAAAAAAAAAAAMEBf/EAB4RAAICAgIDAAAAAAAAAAAAAAECAAMRIQQSMUFR/9oADAMBAAIRAxEAPwCnWu7RYlrSstbEtPqUknHIJGf3Ut17r6QrVxYZWYUZILXsbJCyoAhavPwOKo13t6pNuAaSA7u9pHOMeCBxUmvumbpO1JIcRGSUhaQXFjISM899/b+1kcO5w/Ww6Al96IU7J5zL1pCa9N0/FlXZxgSHU7wY2FIKT0ehzStfYoEti0RGH0ALabDYDauAAOO/OKVQbrc6EIVp9nJWqfJiWVxSHSsMFx1tK+Qk4P5GR5rL6evvyVK+rfckJksGQsOndhW8Dj4HPVKU5UZOpmcZiQu/UosIJgw2mW0hxIGcuZJ7NKUqkAYjEmf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/13-960.jpg, /blog/ireland-photos/13-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/13-640.jpg, /blog/ireland-photos/13-1280.jpg 2x, /blog/ireland-photos/13-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/13-320.jpg, /blog/ireland-photos/13-640.jpg 2x, /blog/ireland-photos/13-960.jpg 3x\" src=\"/blog/ireland-photos/13-320.jpg\" alt=\"Botanical Gardens in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgP/xAApEAACAQQBAwMDBQAAAAAAAAABAgMABAURIQYSMQcTFCJBUSMyYXHh/8QAFgEBAQEAAAAAAAAAAAAAAAAABAMG/8QAIREAAQMDBAMAAAAAAAAAAAAAAQACAwQRMRITIZFBsfD/2gAMAwEAAhEDEQA/AK71BwYjexS2hK6AQ9oPKgf75qpt8flsfkQmRgnhQov0svHZrtGvt44ra9edTWNvlsdcRxJPbyRPJ9R2GLMgCLrySPxXPqH1GsL+2sbWPHXcAlX3h8gmNVAHATf7t/YeOTQDSSgWymQ18Mg1O4t97Uhp07Y1ETBUQIo/AHgUqHk5299GsmikieNW33NwSPHFKFsSnN+imCeADx2FRYuyjzls2Pvmb4mMhRrZECgqSisedb5JO+d1kbyFxnLQLczotz2q4VgABvQA44pStTHgLGMJLiFpenBJPZzI8836E7wqQ3JUHjf886/oClKVK5VNDTyQv//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/14-960.jpg, /blog/ireland-photos/14-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/14-640.jpg, /blog/ireland-photos/14-1280.jpg 2x, /blog/ireland-photos/14-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/14-320.jpg, /blog/ireland-photos/14-640.jpg 2x, /blog/ireland-photos/14-960.jpg 3x\" src=\"/blog/ireland-photos/14-320.jpg\" alt=\"Botanical Gardens in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBv/EACgQAAEDAwMDAwUAAAAAAAAAAAECAwQABREGEjEhUWEyQWJxgbGywv/EABkBAAEFAAAAAAAAAAAAAAAAAAABAgMEBf/EABsRAQACAgMAAAAAAAAAAAAAAAABAgQREzFB/9oADAMBAAIRAxEAPwDq41p0dNMWRJsdvS2+24AlLQAGFkHOOOhV17HxUk3RGnJdpgiNFgolPkblJTnPq5+p/bwK04za4jzMdJSGACkIcVkJ3Eg4z3yeaxZxHjSITjG1JWkjkke/27VWjIrI3C+1aK0jGaeYuVut7jzbhAUtBztwD+SaUcuCHpUgl5IUFhKiTjJ2jrSl56jblbxNcZcK0pQVBA5HyqWFMeSzDSCMBZ/qlKx/JNETnzJlkqBy4OR8E0pSordh/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/16-960.jpg, /blog/ireland-photos/16-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/16-640.jpg, /blog/ireland-photos/16-1280.jpg 2x, /blog/ireland-photos/16-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/16-320.jpg, /blog/ireland-photos/16-640.jpg 2x, /blog/ireland-photos/16-960.jpg 3x\" src=\"/blog/ireland-photos/16-320.jpg\" alt=\"Botanical Gardens in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcDBQYI/8QAKBAAAQMDAgUEAwAAAAAAAAAAAQIDBAAFERIhBgcxQWETFCJxQlGR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgME/8QAGREBAQEBAQEAAAAAAAAAAAAAAQACERMy/9oADAMBAAIRAxEAPwCmXrmJFt8cLZiLkvK04Qk9yT1PbYE1m/zAYVa2pFrYS4+47pLD+UKKNWNQx5I61D/fLmz0Nq0xm1veklhMjSAkEaclR1Y6bn+1muXPlBUGLIQpguHOVFtDmCSCSo7fXjuaz+mqY6et6otE8T4SZDrfttZJShSgo6exONgfFKifCHG7UGzJjmyyJiULVpXGC1pAO+nptg52/WKVU2SNF1zh2xwJl8gCYwJDb9senLbcJUkuoLyUn6+CTjpmuc5RcJ2viq1XZ67IdK0ONMI9JegJSWxnYd/NKUKz81Qa4TtkZtLMUSY7aPjhl9aNRH5Kwd1HuaUpQQ7Z7//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/17-960.jpg, /blog/ireland-photos/17-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/17-640.jpg, /blog/ireland-photos/17-1280.jpg 2x, /blog/ireland-photos/17-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/17-320.jpg, /blog/ireland-photos/17-640.jpg 2x, /blog/ireland-photos/17-960.jpg 3x\" src=\"/blog/ireland-photos/17-320.jpg\" alt=\"Botanical Gardens in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUGAgMH/8QAJxAAAgEEAQQCAQUAAAAAAAAAAQIDAAQFESEGEjFhE0EHNFFictH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAgP/xAAgEQABAwQCAwAAAAAAAAAAAAABAAIRAwQSQRNRMTOx/9oADAMBAAIRAxEAPwCydVZ2/wAv+PsjdNLFLJBKDFOqhXRAw33Muw37EDtq49PZuO16cx/yLZxXMkBNzK/ZAhcDbBR5bz6Hvdcp6Yu8TDbm0f8AUw26ykxoGWZGXY2w42Ro8jzWE3UKtJvLyQxMUPfG6Fk+Ie22xfX+8ULle1sbTKVuysCc8Y8AqOzvVl6uTmW3lmhiU6VLeOJowP4kgnnz5+6VIYSOwmtHluL+D5HkYna748Lz/UClDLoMEBENIk7VLwN7dXGUy9m8xWCJWjAVFBKjS6J1vWh4rXkb9hdPaywQzwxK3YJe4kaQsOd88/R41SlL7VXHvA1A+qIGQvZkEhunXuLaVVUBQGIAHHqlKVeDeltJX//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/18-960.jpg, /blog/ireland-photos/18-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/18-640.jpg, /blog/ireland-photos/18-1280.jpg 2x, /blog/ireland-photos/18-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/18-320.jpg, /blog/ireland-photos/18-640.jpg 2x, /blog/ireland-photos/18-960.jpg 3x\" src=\"/blog/ireland-photos/18-320.jpg\" alt=\"Botanical Gardens in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 133.4375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAwQIBv/EACoQAAIBBAEDAgUFAAAAAAAAAAECAwAEBREhBhIxQWEHExQiJDJRcYGR/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAMBAv/EABkRAAIDAQAAAAAAAAAAAAAAAAABERIxQf/aAAwDAQACEQMRAD8AvDqrPwdOY36iWGWWR+5Yo1HDOFJ0WP6Rx5rwnSPxRa9yRt8rZSxwzMGR4z3FGZgANE8p7jxqq+6g+Te2M93fXl5PJaXJSA3UrSARhh3OF1xsevsOaw39xjcvf4m1muLa4iKjvSFW3GgG+1jyQw2u/FJEHTbcMQAeKVz9ZyNK1ys2WzESxSmOP8uQh0AGmG/51/VKWQqyGx+UnfGJDIsTxvbSzsGXe2+4f5oeK0sZdCwRLi0trWKY4+S4DLEAQy8jWvSlKk9KcJnMlGulmkiDyTxrK5LMOT+wB9qUpWrDl6f/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/23-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/23-640.jpg, /blog/ireland-photos/23-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/23-320.jpg, /blog/ireland-photos/23-640.jpg 2x, /blog/ireland-photos/23-960.jpg 3x\" src=\"/blog/ireland-photos/23-320.jpg\" alt=\"City Hall in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwT/xAArEAABAwMEAAMJAQAAAAAAAAABAgMEAAURBhITITFRoRQVIjJBYXGBkbH/xAAXAQADAQAAAAAAAAAAAAAAAAABAwQA/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQIAERIyMf/aAAwDAQACEQMRAD8Asjd2UrQlvt6b8fejU8POuc7pPFvJxv25Pw46rr1Nf2JeqrtJi31lVtkWdcZlkOLx7QTlJ48Y/dYRIJfbjEJcZ4hklhazv7zhR8x4elWO4aamp09YLixb33JKp78h9KY21YSvJQSrOSB0fCjMz2Bcba6qfdPvTJkhzmmahiczgBVvjsgnrHn9qVGP2W4uvKWzpi6PtnGFqQME4729/LnJH5pTW5HwZJFJ7drLdjszSjstEHGAMFBI/hNSZtkWS2ElC20pHSWnFIHoaUqPU4xa4cZviaaO0H6rUT/tKUrcY7//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/24-960.jpg, /blog/ireland-photos/24-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/24-640.jpg, /blog/ireland-photos/24-1280.jpg 2x, /blog/ireland-photos/24-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/24-320.jpg, /blog/ireland-photos/24-640.jpg 2x, /blog/ireland-photos/24-960.jpg 3x\" src=\"/blog/ireland-photos/24-320.jpg\" alt=\"Street in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwb/xAAoEAABBAIABQQCAwAAAAAAAAABAgMEEQAFBgcSITETFEFRFXEiYYH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAwL/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIRIRIx/9oADAMBAAIRAxEAPwCv4N44/KytbpYsvZMuFwoS66hhfqdj2KQPirsUf3kp7mOxHccb97PWQoptEeLZo/XX/VZnPLFYHGWlSK9UyCUlVgJNK75dSdHK9uy8zqJy0Kmq9N9KEkKJPgdvmif9zFLqmWcmopl8rifUbc+4lvbUuD+FmOgEjz36F18/vGcvOadgylsSor0N9NdbahSrryR91WMNFNM2rT8qeGtTsY86GiYmTFUlaFKfJskG7FUfOSJfLbRSHlqUvYpC1l3oRMWlKVHv2F0POMZSfpKGhrgHQx+oe3deUs9alvulxRNAeVWfjGMZixP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/25-960.jpg, /blog/ireland-photos/25-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/25-640.jpg, /blog/ireland-photos/25-1280.jpg 2x, /blog/ireland-photos/25-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/25-320.jpg, /blog/ireland-photos/25-640.jpg 2x, /blog/ireland-photos/25-960.jpg 3x\" src=\"/blog/ireland-photos/25-320.jpg\" alt=\"Whiskey shop in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHAgMF/8QAKhAAAQMDAQcDBQAAAAAAAAAAAQIDBAAFESEGEhMUMUFRB2GxIkJSYpH/xAAZAQABBQAAAAAAAAAAAAAAAAACAAMEBQb/xAAgEQACAgEDBQAAAAAAAAAAAAABAgADBBMxcRESIjIz/9oADAMBAAIRAxEAPwCwr7cH2pKItvecblNp31pQ4NArRKlnwNT4yPetEOUu5jmLfKS208MhLisKyVA7xSB0wFg+DXO2jbjm8wW20tplSUBEdkJBWtQOQrsSPyGSAM1D50q22y68C7JZ5yRGdbkNICySvifSpsk7o+4YzpilUgKbQWPkJZuz9jRGtjbTDjchoElLmBqCcj5pWezRTGszDEOFw2mwU8NOF7hHYkHr8ZxSmLFyGYnuhItSqF6bSuPUuU5F9XNnlMYQSlnOP2WoK/vfzUK2+PL3exyUauuMqdUT3UXSr5NKVKo+Y4gWewkousYXOauZJdcDzoBVw8JGcY6Ae1KUq/x2OkvEzuSBqtzP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/28-960.jpg, /blog/ireland-photos/28-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/28-640.jpg, /blog/ireland-photos/28-1280.jpg 2x, /blog/ireland-photos/28-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/28-320.jpg, /blog/ireland-photos/28-640.jpg 2x, /blog/ireland-photos/28-960.jpg 3x\" src=\"/blog/ireland-photos/28-320.jpg\" alt=\"Grafitti in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcGBf/EACkQAAIBBAEDAgYDAAAAAAAAAAECAwAEBREhBhIxIkEHExQyUWFCcYH/xAAXAQEBAQEAAAAAAAAAAAAAAAADAQIE/8QAHhEBAAMAAgIDAAAAAAAAAAAAAQACEQMhBBIxcZH/2gAMAwEAAhEDEQA/AOH1F0dHncfk8/IZZL9gZyqSDe9kt38bbge3I14IqZ2PTWTvJo1FjdW6MwUvMvaq7IHPG/cb4qyXGQSyjsLcoXdhGAgbtLh/yR5PafP+1pM1g5cfbve493vbZ1AeGVvUBx4Pv496lgoHs/JsW2+1q17xyTrHfCyzuLC3kmvrmOdkBkVnAAb8AAHgcDnngnjdK3GOyNzlYWuYoDIhcr6ZVXt1/EjY8UrjfJ4xx5A/JSts7Jiei7ps11Vc3N6kffbH6aFUXSoi7AA/f7NWGOVnt5om+wKDSlYVc+iOHUkWbs4o8nP8syIC2yEkZRv+gaUpRjEwn//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/29-960.jpg, /blog/ireland-photos/29-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/29-640.jpg, /blog/ireland-photos/29-1280.jpg 2x, /blog/ireland-photos/29-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/29-320.jpg, /blog/ireland-photos/29-640.jpg 2x, /blog/ireland-photos/29-960.jpg 3x\" src=\"/blog/ireland-photos/29-320.jpg\" alt=\"Grafitti in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcCBQT/xAAoEAABBAECBQMFAAAAAAAAAAABAAIDBBEFIQYSEyIxB1FhFSSBkaH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQL/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIRIVFx/9oADAMBAAIRAxEAPwC00NSbqNKCxBz9KdgexzhjY+61JDIXbyD9qI8O6jxtqOi/YTtjpQhjIAOwuG+Q0nyBtv8A1e6CT1DZStG1ajZG2MktfJzSP+GYHn8hJ4HXSu4wSOePI2PeEUapavcZDi1YZ189/PG7OflFdM4dBp+lUI69PLY67BHHkkkAbLhz8Sak2XAmHt4RE8EmFJmhrd5+XOlBJPkhERWkS2f/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/30-960.jpg, /blog/ireland-photos/30-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/30-640.jpg, /blog/ireland-photos/30-1280.jpg 2x, /blog/ireland-photos/30-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/30-320.jpg, /blog/ireland-photos/30-640.jpg 2x, /blog/ireland-photos/30-960.jpg 3x\" src=\"/blog/ireland-photos/30-320.jpg\" alt=\"Harbour in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwgC/8QAJRAAAQQCAgEDBQAAAAAAAAAAAQIDBBEABQYSISIxQRNRcZGh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAAAAAAABIBIf/aAAwDAQACEQMRAD8A1XXy4sbkG/WH1ehiMoJIBum1nLHrOQQpMtluPNjvpFqcpQtuqPn95z5u9yN/sthMXpZ0aUhDSACO9AIJs9fub98rXCIMyDOmq2kDZoS86FItpSj0B+K/I8ZqcTrpjhk6IvierKR3poglKbF9lfOMzjjPMYkHjWqjMa7aLS0wElTcS0k2bI84xBSN1izFdfearu7Xbt5HpFD+ZMNz3loF/TBJ9wgA4xlZeIiBDjNxmCQ00OqQfNDGMYH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/31-960.jpg, /blog/ireland-photos/31-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/31-640.jpg, /blog/ireland-photos/31-1280.jpg 2x, /blog/ireland-photos/31-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/31-320.jpg, /blog/ireland-photos/31-640.jpg 2x, /blog/ireland-photos/31-960.jpg 3x\" src=\"/blog/ireland-photos/31-320.jpg\" alt=\"Titanic museum in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBwMI/8QAJxAAAQMEAQMDBQAAAAAAAAAAAQIDBAAFERIGITFRBzJhExUiQXH/xAAXAQADAQAAAAAAAAAAAAAAAAABAwQC/8QAGREAAwADAAAAAAAAAAAAAAAAAAERAxIh/9oADAMBAAIRAxEAPwDXbfGgXfZ+Bco8hke4sOheD4OK7S5tsssJT7rhS2kgKUUlRJPbAFYH6dP81mGULG/aGNMqe3T7j+I7AHwKt+RTeZRbI4u/Tra7F3QktIA22ycHISDVMrhO+I2WBy60ymCqPIVqk6kFtQwe/j5pXn7jNzvLsF0tyojIDpBSsqyTgdeiTSi8aBsybZ729ZpLjNriworSuiktMhO39x3q15APvdpZjzMpbeUFr+mdTlJ6daUpsQuke1cWgw4xQy7KwpW5y5+8D4+KUpQNH//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/37-960.jpg, /blog/ireland-photos/37-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/37-640.jpg, /blog/ireland-photos/37-1280.jpg 2x, /blog/ireland-photos/37-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/37-320.jpg, /blog/ireland-photos/37-640.jpg 2x, /blog/ireland-photos/37-960.jpg 3x\" src=\"/blog/ireland-photos/37-320.jpg\" alt=\"Harbour in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAcBAwQFBv/EACkQAAEDBAEDAgcBAAAAAAAAAAECAxEABAUSMSEiQRNRBgcjMlJxgcH/xAAXAQEBAQEAAAAAAAAAAAAAAAACAwQF/8QAGxEAAwACAwAAAAAAAAAAAAAAAAECAxEhUWH/2gAMAwEAAhEDEQA/AKrk/i7F2FzaNuv/AE3yUbIBXofBVH2pPUSfMVtbz9o+tSbR9hzUA7B1Mdf7UbYwmfa1Uu3wxVEbB9aZnkHt6jr5rnY/HZy2KgqzwS2ddW0eqvsJ5M6+36roOMaXBi1TK0M1+LzKh7h0H/aVAM38us9l8g5dqytmwD2oba2SEpHExEmOT5pU2l0NT6e7Yl5ZStR14gV2TjKbZCfTKu4SZM0pVaJoyBCUweRNKUoCP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/39-960.jpg, /blog/ireland-photos/39-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/39-640.jpg, /blog/ireland-photos/39-1280.jpg 2x, /blog/ireland-photos/39-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/39-320.jpg, /blog/ireland-photos/39-640.jpg 2x, /blog/ireland-photos/39-960.jpg 3x\" src=\"/blog/ireland-photos/39-320.jpg\" alt=\"Fish statue in Belfast, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Derry/Londonderry</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBAcF/8QAJhAAAgEDAgUFAQAAAAAAAAAAAQIDAAQRBRITISIxUQYHMkFh0f/EABcBAQEBAQAAAAAAAAAAAAAAAAIDBAX/xAAbEQEAAwADAQAAAAAAAAAAAAABAAIhAwQRFP/aAAwDAQACEQMRAD8A6rP7i6eXTgWWpTRTSPFDLHaSOjFc9RIHwODgjJ/K8eb3YsIp5Fk0fVhGjGIsLV88QNjtjkv35HisDNPBNotsmsSbIYHZm2RkKQqr45/I9/GalNU1FONfb7lctcTo0nThl3t35cs47/tU0NICtbOMobv3jtbaURrpc8jbQzGWQwEE88bShJwCBnzmlQV1Kl8UaO4twsalOvbnO4k/fbqpVDscNTy1di+a1tGcc0/1Zq1vdxytcGcICeHKzFG5HkRntVpHd3GpXUvGlZEcJJsTsCyBiBnJxn9pSp9dTkyLmBpNW44sczBLiQAnJ6V/lKUroezME//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/42-960.jpg, /blog/ireland-photos/42-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/42-640.jpg, /blog/ireland-photos/42-1280.jpg 2x, /blog/ireland-photos/42-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/42-320.jpg, /blog/ireland-photos/42-640.jpg 2x, /blog/ireland-photos/42-960.jpg 3x\" src=\"/blog/ireland-photos/42-320.jpg\" alt=\"House in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBQcI/8QAKhAAAQMDAwIEBwAAAAAAAAAAAQIDBAAFEQYSITFBExQiURUjM1JhkaH/xAAXAQEBAQEAAAAAAAAAAAAAAAADBAAC/8QAHREAAwAABwAAAAAAAAAAAAAAAAECERIhIjFCcf/aAAwDAQACEQMRAD8ArtNa9uKnvJ3mMhxaeEyY42hWPuSeh78ZFUWs7ytrRslceQGnJDQAW0CopQogHnsSCQDXBLnfBFsTVwt8gJd8wpKeDuX2wP779O1bSXqd3Tlus09tbshMtAL7a1Kwr1+k4PQ4yf0K6U0lizU5zbToOlIqDZ23G5ivDcJKUKSlPhgYG0D2GKVl09cLG5bQuRJircLjh3LSFEjecUqd1qIkzzLcJbtvnBENRbTAwuPyTsKsKJ5/Jqo1HMenaDjOyFZcAyFAYPC+KUq1dvAa5RHfGZ7H0JCmw58xQTwNx6mlKUAh/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/43-960.jpg, /blog/ireland-photos/43-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/43-640.jpg, /blog/ireland-photos/43-1280.jpg 2x, /blog/ireland-photos/43-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/43-320.jpg, /blog/ireland-photos/43-640.jpg 2x, /blog/ireland-photos/43-960.jpg 3x\" src=\"/blog/ireland-photos/43-320.jpg\" alt=\"Street in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIHAwUI/8QAJhAAAgEEAgECBwAAAAAAAAAAAQIDAAQRIQUSYRNBBiMxMpGh4f/EABgBAAIDAAAAAAAAAAAAAAAAAAMEAAEC/8QAGxEAAgMBAQEAAAAAAAAAAAAAAAECAxEhMUH/2gAMAwEAAhEDEQA/ALBmvvhpFU2XJWkj+5adcVCZuNuZB35CzGTjcylh+6oESyyIS6XwZ9lXQAKc+Bv2NZJG+U3oxu3RQ0sgUqRnWM4/vmjK36mLuEJcOhbWHiUhAflrUH64UoR+c0qhJuQ42IRIy3M0oQeoyRa7eCRvWKVl2d9CKuGGkF3NsdzqpG8nC6kOqUpHEJ4iS3s5H3mlKVMRWI//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/44-960.jpg, /blog/ireland-photos/44-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/44-640.jpg, /blog/ireland-photos/44-1280.jpg 2x, /blog/ireland-photos/44-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/44-320.jpg, /blog/ireland-photos/44-640.jpg 2x, /blog/ireland-photos/44-960.jpg 3x\" src=\"/blog/ireland-photos/44-320.jpg\" alt=\"View over Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcEBQgG/8QAJxAAAgEEAQMDBQEAAAAAAAAAAQIDAAQFESEGEjEUQZEHEyRRcaH/xAAWAQEBAQAAAAAAAAAAAAAAAAADBAL/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIDEzIEERIx/9oADAMBAAIRAxEAPwDLx1zl8znIbGefGt3yRSSFI3jKuHDBRs65GvmqrLihFJuUq0m9geNfNchZzqrKZFI/U3aguySj7SgOWU6UkqAdgqD8GrL0P9V77M2y2t9BFJkIIwHd9lpteX49/wBjVUVRnXH6Z5Xi2SaRTnWXuO2nGuAFcACledbq7J6U+gswGUEaSR/9FKTIiTBM5WyB77qaQ6Dd51rwNHQrbdO309jcW1/A/wCQJASTyG2ed/2lKaOw71K9ckNczFwxbuJJWV03vnkKwHv5pSlRdsRH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/45-960.jpg, /blog/ireland-photos/45-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/45-640.jpg, /blog/ireland-photos/45-1280.jpg 2x, /blog/ireland-photos/45-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/45-320.jpg, /blog/ireland-photos/45-640.jpg 2x, /blog/ireland-photos/45-960.jpg 3x\" src=\"/blog/ireland-photos/45-320.jpg\" alt=\"Selfie in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHAQQI/8QAKRAAAgEEAAQFBQEAAAAAAAAAAQIDAAQFERIhMVEGFBVBgRNSYWJx0f/EABcBAAMBAAAAAAAAAAAAAAAAAAEDBAL/xAAdEQABBAMBAQAAAAAAAAAAAAAAAQIDERIxURNh/9oADAMBAAIRAxEAPwC9sx4ktMa8sXC8s0Y2wA0F5b6+/wAVGMf45uPUG81bhraVtIERge3bl81BjNks1FHczZCNzOitIwQSrIe4Oh+vsOlYkxExKGO6ijYKAT5UHbA74utWNhStEbplvZcJzmDcK8uRtIGYb4JpRGw+DSqhu7GecxmWb60irpnKhd8yeg/tKHgnQpN8OdfUr6PlHd3CAfbIRW1aZrJ8B1kLtSO0zf7SlYjct7G0gXxVnUGhlbzX5lJpSlLzd0GKcP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/48-960.jpg, /blog/ireland-photos/48-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/48-640.jpg, /blog/ireland-photos/48-1280.jpg 2x, /blog/ireland-photos/48-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/48-320.jpg, /blog/ireland-photos/48-640.jpg 2x, /blog/ireland-photos/48-960.jpg 3x\" src=\"/blog/ireland-photos/48-320.jpg\" alt=\"You are now entering Free Derry in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwME/8QAJxAAAQMEAgECBwAAAAAAAAAAAQIDBAAFBhESITFxgRUyUVJhscH/xAAYAQACAwAAAAAAAAAAAAAAAAADBAIFBv/EABsRAAIDAQEBAAAAAAAAAAAAAAECAAMRBCHw/9oADAMBAAIRAxEAPwC+ZRY7JbLQ7MZYeeQygcW2OJdWSfO1ED2qo4lkOP3S9fCnMcvTckFIUp99rSArwVAEEendQ0nMpcyHLttwjrjSlNkhTbh5AkgJATr7iK4Wuzqt635N5k3OzrWsNR1LaACRxSejrfzFXf496aPUVXSxiw5lZvFEkM8tVohZE6kxHHEuIStJU4FADxob8DYNKuECxQ7rFbfTezKIAQXC0jZIA3+6UA9qfCGWhgMmdurVCb1F4t8NcTxBI135P9r2TM2us6I6xMTDfYc6W2tgFKh9CKUrNVMc3Y1SSSdmPxMiu8JLjUOc401zUQgJSQPTYJpSlX+AyGz/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/49-960.jpg, /blog/ireland-photos/49-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/49-640.jpg, /blog/ireland-photos/49-1280.jpg 2x, /blog/ireland-photos/49-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/49-320.jpg, /blog/ireland-photos/49-640.jpg 2x, /blog/ireland-photos/49-960.jpg 3x\" src=\"/blog/ireland-photos/49-320.jpg\" alt=\"Grafitti in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGCAQH/8QAJBAAAgEEAQQCAwAAAAAAAAAAAQIDAAQFEQYSITFBFCIHE2H/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwX/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQMRAjIxQVJx/9oADAMBAAIRAxEAPwDRD30PxLmYSaEKsWIGyuh51WcM3zblRunlTN2qqT2gkt4iAN+/r513roi5Hm7fIDHJKJflRv8AtgSQEgEH69RAGxr1VEyOP5OtnLA2LknjcdPVGiufXvz6qsOca2aJS30aHsuTcKCyxz8htY5o5Cjq0vR3HnQ13H9pXgGI/GlxfY6G4N5jFZxso8chZD7U9vIpRci9FFE61JXlPVj+V4a6ikdmmDQsjn6gdRGwBrR71P3AZ4XYSOhRyB0nVKVjycY/BFYlyN67AvdTMdeS1KUp0gps/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/50-960.jpg, /blog/ireland-photos/50-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/50-640.jpg, /blog/ireland-photos/50-1280.jpg 2x, /blog/ireland-photos/50-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/50-320.jpg, /blog/ireland-photos/50-640.jpg 2x, /blog/ireland-photos/50-960.jpg 3x\" src=\"/blog/ireland-photos/50-320.jpg\" alt=\"Grafitti in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 125.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAMF/8QAJRAAAgEEAgICAgMAAAAAAAAAAQIDAAQFEQYSEyExUTJBYYGR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQA/8QAGxEAAwEBAAMAAAAAAAAAAAAAAAECEQMSIUH/2gAMAwEAAhEDEQA/AL3zeWt8NFDLcxXcolcoi28XkbYG/sa9Co6ecAX7s+FyiWSRkkm3UyAj968mta/uojzDniZrJY+2xECXVqzHUbIVkDEde77Ogo2f5qspOW22P5LfZGWBgch3heNX9oDpSffyNrvWv3VPPkqnWBfSlWI1Dd8gwlnL4b3J2NtP1DGKaZUYbG/Y3Ss02nKoYUMeOxM1xbr1HkUIwZuo7EEn73Sg8ShJkKzvezyc0UUspT8T2c7bRBG68i/nkuWQ3DNKUUKpdidD6+aUopusXsm+nKK4lt16wu6KT2IViBv/AGlKVtYqbw//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/51-960.jpg, /blog/ireland-photos/51-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/51-640.jpg, /blog/ireland-photos/51-1280.jpg 2x, /blog/ireland-photos/51-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/51-320.jpg, /blog/ireland-photos/51-640.jpg 2x, /blog/ireland-photos/51-960.jpg 3x\" src=\"/blog/ireland-photos/51-320.jpg\" alt=\"Grafitti in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHBAYI/8QAJhAAAgEDBAEFAAMAAAAAAAAAAQIDAAQRBRIhMQYHExZBUSJhcf/EABcBAQEBAQAAAAAAAAAAAAAAAAMEAQL/xAAgEQACAQMEAwAAAAAAAAAAAAAAARECAwQTITHhQaHR/9oADAMBAAIRAxEAPwCc03098SIC3GhQySoo3hCp/lzzweuqxZPGvTcSKBaaSBnDKbqLd3+bqjBrmqW2swWOjs0r3pkdWFvuVljIyNwHQ5GexkHn7pm4nid40itBHPHK/uybtxky+V46GBxx3T3b9Vuml1Q2+gMbG1p3aS7+HRvwHw1OF8YRweckgUqKt9Vae1hkMDiQriQPaTEhwSCDtUjv+6V3rLwasS7HPoo75ZrDavBerciK5hRvbaFBGF/cKuF5++Occ1rZ1OYnIjgBz2IxmlKhiXuXS1wWXZ+qfmVvbpFDrUiRqAAqxIAOP8pSlGhYR//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/52-960.jpg, /blog/ireland-photos/52-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/52-640.jpg, /blog/ireland-photos/52-1280.jpg 2x, /blog/ireland-photos/52-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/52-320.jpg, /blog/ireland-photos/52-640.jpg 2x, /blog/ireland-photos/52-960.jpg 3x\" src=\"/blog/ireland-photos/52-320.jpg\" alt=\"#derryhappy grafitti in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMEBQb/xAAmEAACAQQBAwUAAwAAAAAAAAABAgMABAURIQYSMRMVIkFRFDJx/8QAFwEBAQEBAAAAAAAAAAAAAAAAAQIEBf/EABsRAAMAAwEBAAAAAAAAAAAAAAABEQIhQRMx/9oADAMBAAIRAxEAPwDL6ZvLvKR5G+tsRHfe4TvK8Vw7DuDMQm21sKv4N78nVXoZeoov4lhHPY4UsyupAafgkdoDN433f1/2svpu/ucdg47a/wAlbYuMpG1s8ilnYgjgKAeNEfL61urAur6XJOkM1hmTGu1kgnMfp/EoN/EKTofW6Fl1/BcmjprjrfO2Cww22PscqhjDG4heeId3gr2LsAgj9pXIPjcy6RL7dEwjTsBNyg42frXHnxSp9UujMeFSW4cIkflVCgAknQ/BzUttdS+nwxAB1oE0pXGlWzOyVrmXfmlKVMQH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/53-960.jpg, /blog/ireland-photos/53-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/53-640.jpg, /blog/ireland-photos/53-1280.jpg 2x, /blog/ireland-photos/53-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/53-320.jpg, /blog/ireland-photos/53-640.jpg 2x, /blog/ireland-photos/53-960.jpg 3x\" src=\"/blog/ireland-photos/53-320.jpg\" alt=\"Street with grafitti in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAcIBAUG/8QAJBAAAgICAQMEAwAAAAAAAAAAAQIDBAARBQYhMRITQVEUMmH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAeEQEAAQIHAAAAAAAAAAAAAAAAARESIVFhkaHh8P/aAAwDAQACEQMRAD8An2OSOaNZYmV0YbBU7GAhY9sr/R60fibKUOFnkRrCOmo5EYKRsg6bsvfvv6zD6i626p4SqtW1zE00dpCpmkIBBPkeoAfH1r5OaWymYTDa694apZlrvHfZ4nKFkr+pSQdHR33GMr5T6k5SKH2xw/5EanSOsjAEaHjXnvvvjCmvtzhlz01Dqoht2gq+9qOsra/VCw3r68nOt62jS1YlrzqHicLtSP55GMZchDliaelPJBWszpGrHQDkYxjM1v/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/54-960.jpg, /blog/ireland-photos/54-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/54-640.jpg, /blog/ireland-photos/54-1280.jpg 2x, /blog/ireland-photos/54-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/54-320.jpg, /blog/ireland-photos/54-640.jpg 2x, /blog/ireland-photos/54-960.jpg 3x\" src=\"/blog/ireland-photos/54-320.jpg\" alt=\"Street in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHCP/EACgQAAEEAQIFAwUAAAAAAAAAAAECAwQRAAUhBhIxQVETYXEHFTKR0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwD/xAAYEQEBAQEBAAAAAAAAAAAAAAAAARECEv/aAAwDAQACEQMRAD8A0rhri6E+6vTZ8xo6oxQWoJKULsWN+gVR3HnplFJmRo7aXJLqU8/4dyr485yvrOtLY4l1WO01b0lxvZtN+nSUpo2LsEfvK+Rrz3DszSZMp9chtDZbcSSVbHfYnYbnpfjtj+A2NlRq77xWpmI2WgohBW7yqI8kUa+MZB6H9SOHRGctyRHtwn03GyVDYdSCR74wYDAIEl6ZxHJnSVlclwBxSvc1/cuddRzxVoKllL0R3mBVYFI5hV9Nx2xjKctWY/cJkJCG4sp9pCgVFKHCBdkdAfbGMYlUj//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/55-960.jpg, /blog/ireland-photos/55-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/55-640.jpg, /blog/ireland-photos/55-1280.jpg 2x, /blog/ireland-photos/55-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/55-320.jpg, /blog/ireland-photos/55-640.jpg 2x, /blog/ireland-photos/55-960.jpg 3x\" src=\"/blog/ireland-photos/55-320.jpg\" alt=\"Street in Derry, Northern Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Game of Thrones Tour</h2>\n<p><img src=\"/blog/2017-11-09-ireland-photos/3-got-tour/56\" alt=\"&#x27;, &#x27;Coast near Ballintoy, Northern Ireland\"></p>\n<p><img src=\"/blog/2017-11-09-ireland-photos/3-got-tour/57\" alt=\"&#x27;, &#x27;Coast near Bushmills, Northern Ireland\"></p>\n<p><img src=\"/blog/2017-11-09-ireland-photos/3-got-tour/60\" alt=\"&#x27;, &#x27;Seflie in Game of Thrones at the coast of Northern Ireland\"></p>\n<p><img src=\"/blog/2017-11-09-ireland-photos/3-got-tour/59\" alt=\"&#x27;, &#x27;Avenue near Ballymoney, Northern Ireland\"></p>\n<h2>Dublin, Ireland</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 125.3125%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgMECP/EACcQAAIBBAECBQUAAAAAAAAAAAECAwAEBREGEiETFDFBcSJhgdHx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQIA/8QAGxEBAAIDAQEAAAAAAAAAAAAAAQACESExA0H/2gAMAwEAAhEDEQA/ALOznLL/ABbwtGbUxOgcloyVUFmA7gj2WuLH8+vJ7loriwinYRq4MTGMLttEHe9/2oBzLm2AOetoLrzEscVvHG7RKrb7HqA0dEg7B+4qNNymyUJcpbTtBcQtFCZG6QzggnWm3oEHf4qvIW+HkL6pk7PQFjy55bKF5Mc3iEEOFdddQYqfUj3FKo7D8u4nLj0XOY1Z7uJnTq6m0B1FtD6u/dj60ps1FI1pdBxNsnE8XcyqzpMrEhgVlOxoe3z61jLwjDMkEfh3ACAqpEzbA7kjfyTSlBpm+YiHhmFiDKtvLre+87/ulKUIMsvYNM//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/1-960.jpg, /blog/ireland-photos/1-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/1-640.jpg, /blog/ireland-photos/1-1280.jpg 2x, /blog/ireland-photos/1-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/1-320.jpg, /blog/ireland-photos/1-640.jpg 2x, /blog/ireland-photos/1-960.jpg 3x\" src=\"/blog/ireland-photos/1-320.jpg\" alt=\"Street in Dublin, Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMGBAX/xAAmEAABAwMDAwUBAAAAAAAAAAABAgMEAAURBhIhE0FRFBUxYXHh/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAMEBf/EACURAQACAQIDCQAAAAAAAAAAAAECAwAEEQVBURITFCEjMUJhgf/aAAwDAQACEQMRAD8Awli0i3IgSJ8mC1O9StUWO2VqSpK8ZLgxxx4NUl6Sk6S1dZZExthCjuW303N/KBjx2yMfyqaV1ULBeJElttclRaS1HbU7hsOOKKSVA98HjAq2qb7Pcu0Bq+Q0tObFBC0rSsqwrHKhz2+Kmop9Xs2LuvvyPzKLYwu0/dnkbO/XPE9zd5PULOSTs5OMmlS9MkklKC6M8FIBx9H7pRKDFRzH8Npz4506b07Cek2uQ+XXFPqBUlShtztJyOOxrdWktyb/ABWZDDLrTjbiFJWnI85/cilK29FEapKdcNRJeH2r95k9RWqNCvk2M0FltpwpTuUc4+e37SlKaRE3TF0yk1xV5Z//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/2-960.jpg, /blog/ireland-photos/2-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/2-640.jpg, /blog/ireland-photos/2-1280.jpg 2x, /blog/ireland-photos/2-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/2-320.jpg, /blog/ireland-photos/2-640.jpg 2x, /blog/ireland-photos/2-960.jpg 3x\" src=\"/blog/ireland-photos/2-320.jpg\" alt=\"Street in Dublin at night\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUBAgYD/8QAKRAAAgEDAwIFBQEAAAAAAAAAAQIDAAQRBRIhMUEHFVFhcQYTIoGhsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIDAf/EABsRAAICAwEAAAAAAAAAAAAAAAABAgMREjFB/9oADAMBAAIRAxEAPwDsR4ka+GUNoakHvscY9+tZHiTrZAPkOPXKtx81x8N8xt9RMNobqZoGjSJZCN5MoGM7TjA/I8e3aqGoaqI5tZe2sY7iVI4Xjjju8vLggEFdnHfHXOOcVPZldYrwtjxK1/aD5B17fbfj+0qJdXqnUL1d6qizsFLAsWHXPHTqR+qUHY0NVxazgs21lbQqzRQomW5CjAJ9fmtz9PaS84newgMqrgNt5HJP+0pWy6ZXw9rm0geUl4Y2PqVBpSlJIk+n/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/3-960.jpg, /blog/ireland-photos/3-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/3-640.jpg, /blog/ireland-photos/3-1280.jpg 2x, /blog/ireland-photos/3-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/3-320.jpg, /blog/ireland-photos/3-640.jpg 2x, /blog/ireland-photos/3-960.jpg 3x\" src=\"/blog/ireland-photos/3-320.jpg\" alt=\"Dublin castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEBQP/xAAoEAACAQQBAwMEAwAAAAAAAAABAgMABAURIQYSMSIjQQcTFEJRkcH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAwH/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIDETETIjJB/9oADAMBAAIRAxEAPwCoxH1ewF7aR22RFxbyune4SIyBl49I0d7O6lOneqckuJykmTW+VZZrgW/5UXrWNh7aDXHAHj41WeS8E0IU9oWQqNFADokfxW3PRW8OAkMxRonnUgMOPJ1Ra75zg3jDReVKjJJkRlRkprvcZ3GqKiEHQKgaBH9Uroptx3R3rIp8ASj/AGlGdr+leBHhFcSCZGBAIkRfG/3A+ap+qJZLfp9XV+4tKnDgEDk+OKUq9XhmWPsjm4lfuWzMCY/cYaj0BwdUpSgvYpaP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/4-960.jpg, /blog/ireland-photos/4-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/4-640.jpg, /blog/ireland-photos/4-1280.jpg 2x, /blog/ireland-photos/4-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/4-320.jpg, /blog/ireland-photos/4-640.jpg 2x, /blog/ireland-photos/4-960.jpg 3x\" src=\"/blog/ireland-photos/4-320.jpg\" alt=\"James Joyce statue in Dublin, Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBAUH/8QAKhAAAgEEAAQEBwEAAAAAAAAAAQIDAAQFEQYSITEUUXGhEyIjJDJBYdH/xAAXAQADAQAAAAAAAAAAAAAAAAACAwQF/8QAHhEAAgICAgMAAAAAAAAAAAAAAAECERMhMZEDQWH/2gAMAwEAAhEDEQA/AKy2u7eLMWM1tdW7SI/y/UChkI0w69hrR9QK0MrxFj87GPCXkM1jDdOsp5tbdT0XR/W+u+xqex/CUMNnPLezgTLFyxs/KOQdySBzD3864eCPD2duclBZSTNawoiAz6VmfQ040CQuwBr/AGkZEouuCpeGTknLnZfvPjRrxWVgikI/EMDoeu6V59Jw1K3L93LvXX4caOu/4SwPtSk5V87Dwz930UZuXu7aSKdUZJEKsNdwR1FcjGYfHYYTSY20jgd15WYEkkeXU0pQXqjXUVd0YXvZgx0RSlKmaQ8//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/5-960.jpg, /blog/ireland-photos/5-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/5-640.jpg, /blog/ireland-photos/5-1280.jpg 2x, /blog/ireland-photos/5-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/5-320.jpg, /blog/ireland-photos/5-640.jpg 2x, /blog/ireland-photos/5-960.jpg 3x\" src=\"/blog/ireland-photos/5-320.jpg\" alt=\"National Gallery of Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMGBwX/xAArEAABAwMDAgQHAQAAAAAAAAACAQMEAAURBhIhMUEHExQVIkJDUVKBg9H/xAAXAQEBAQEAAAAAAAAAAAAAAAACAQAD/8QAGBEBAQADAAAAAAAAAAAAAAAAABEhMUH/2gAMAwEAAhEDEQA/ANuDVFvlWFu7W1wZEJwCIHEXGdq7VTnvnioLdqhmb5G1pQJxVEhJeQVOvPReeM96zHT/ALfZvC2Ta7lD86TGKSbQutiYFl0iBdueipjiryl0sCFGT0b6sNqmwVRFAMLlMJu6p96HaVxpnPiX40ag0vre6WW2261yI0QgEXHkc3rkBJc4JE+alWmHI0tfGSuN804xLuDzjnmPnGDJohkI5+L8UGlNFYKPGxn0cTv9Ef8AKnt0KJIlADkONtVFXhkU6fqlK5m7PsVs7wY6/wA0pSlRn//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/6-960.jpg, /blog/ireland-photos/6-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/6-640.jpg, /blog/ireland-photos/6-1280.jpg 2x, /blog/ireland-photos/6-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/6-320.jpg, /blog/ireland-photos/6-640.jpg 2x, /blog/ireland-photos/6-960.jpg 3x\" src=\"/blog/ireland-photos/6-320.jpg\" alt=\"Street in Ireland\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAwQGCP/EACgQAAEEAgECBAcAAAAAAAAAAAECAwQRAAUxBhIhYYGSFCMyQUKRof/EABcBAQADAAAAAAAAAAAAAAAAAAQBAgX/xAAdEQEAAQUAAwAAAAAAAAAAAAABAAIDBBESMTKR/9oADAMBAAIRAxEAPwC9mpKPycR7xmwlxlXK0e4ZBsNIBFkfrOA696t6m08kpgaREXXCkmc8UuEm6FAGhf2u/PJZQZb3bGPLrfrWM8wtzNjK735s+Q68tRJWTzjCORSOowxak3JuH1nvpb6UqnlpPj4NNoTf8zPuttsdjq3mJs151lf1INAKF8Ghx5Yxg25X15Y8tW+fU+SspbLiZkgfFSTThA+ZVD0xjGNCZzP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/7-960.jpg, /blog/ireland-photos/7-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/7-640.jpg, /blog/ireland-photos/7-1280.jpg 2x, /blog/ireland-photos/7-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/7-320.jpg, /blog/ireland-photos/7-640.jpg 2x, /blog/ireland-photos/7-960.jpg 3x\" src=\"/blog/ireland-photos/7-320.jpg\" alt=\"Hiking at the edge of Dublin\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUCBgcI/8QAJRAAAQMDAwUAAwAAAAAAAAAAAQIDBAAGEQUSIRMxQVFhBzKR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIB/8QAHhEAAQQBBQAAAAAAAAAAAAAAAAECAxExISJBUaH/2gAMAwEAAhEDEQA/AO0sqKvNR75vGBZmkCXNPVku5EaOk8uKA7n0kcZP2qUZwe68+/m229ZXegmCY5qDEobmmiQDGSOyNo52juDjk/a2k5JTXBMnXTd1xSlz1TpPJ2BLRLaEgeAB45pWUa31IjtiTLUwvHCAtR49nA70ollbefBUa7o6TfNyalp06Np0F4MIfb3KdSMuD4CeB/M1oLj761dYvOdVWSpZOVKOSMknJNKUMy2+ioU2khmZ+6no8d9alElbqST69/KUpUjH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/8-960.jpg, /blog/ireland-photos/8-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/8-640.jpg, /blog/ireland-photos/8-1280.jpg 2x, /blog/ireland-photos/8-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/8-320.jpg, /blog/ireland-photos/8-640.jpg 2x, /blog/ireland-photos/8-960.jpg 3x\" src=\"/blog/ireland-photos/8-320.jpg\" alt=\"Hiking at the edge of Dublin\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwT/xAAoEAABBAIABQIHAAAAAAAAAAABAAIDBAUREiExQVEGBxMiMlJxgfD/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAwL/xAAbEQACAgMBAAAAAAAAAAAAAAAAEQEDAgQyEv/aAAwDAQACEQMRAD8Av1P3TikO7+Cv1o/ua9svbwNKyYj1Zics1rqs72Fx0GTxmJxP7WGYO8zIenhabXDZo3Bk0nEQ1gDe43re/wC5qUoZKNldsUUht2ZG/JHEQQ08WtE9gOv46ImF9rUwy+dVacSjehbYBzcUVHp5H4NWKN8pkc1oBcT1ROBejEsldnxktDH03Bla1DuYBo288PUnzyC7sI8wN3HyPlEUaOTe52TzLs/D9aIiQGP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/ireland-photos/9-960.jpg, /blog/ireland-photos/9-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/ireland-photos/9-640.jpg, /blog/ireland-photos/9-1280.jpg 2x, /blog/ireland-photos/9-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/ireland-photos/9-320.jpg, /blog/ireland-photos/9-640.jpg 2x, /blog/ireland-photos/9-960.jpg 3x\" src=\"/blog/ireland-photos/9-320.jpg\" alt=\"Hiking at the edge of Dublin\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/ireland-photos/",
            "title": "Belfast and Dublin in November 2017",
            "date_modified": "2017-11-09T20:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2017/",
            "content_html": "<p>Here are my favourite albums of 2017 in no particular order.</p>\n<h2><em>Three Futures</em> by Torres</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAmEAACAQMEAQQDAQAAAAAAAAABAgMABBEFBhIhMRMjYYEVQVGh/8QAFgEBAQEAAAAAAAAAAAAAAAAABQQD/8QAIhEAAgEDAgcAAAAAAAAAAAAAAAECAwQREjEUISJBcZHh/9oADAMBAAIRAxEAPwDIahBuJJ2sdQBt7lVWQRMoLcGGQev6KhXFrqdlJGZJmUu3t+0XJGMnoA1P2PrrQo8+pwy3NwVIeWSUsFQfosQfA+sCrCTXbrWbdfW0qTTpoMSp6nMF1wVJHQPEHj3RFOEVTep815FZ1ZOosbFb+O3zPFFcQ2cpt5l5xN6SLyXJGcHBHg+RSsLrW6tZfVLkvf31weZw5uH/AMyaVJwty9tPr6Uq4h3bOn7f0m0kuyjIwEnTcXK9fR6z4rW77ihewhdIViKxsntkgENjIPfwCKUpJJYDZPqOOS2FrE5VYEx8jNKUrFt5Kklg/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/torres-three-futures-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/torres-three-futures-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/torres-three-futures-320.jpg, /blog/favourite-albums-2017/torres-three-futures-640.jpg 2x, /blog/favourite-albums-2017/torres-three-futures-960.jpg 3x\" src=\"/blog/favourite-albums-2017/torres-three-futures-320.jpg\" alt=\"Album cover of Three Futures by Torres\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=MmGSNrg6bM0\">Helen in the Woods</a></em> and <em><a href=\"https://www.youtube.com/watch?v=9mSaYRd3iIo\">Skim</a></em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/three-futures/1254465509?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and\n<a href=\"https://open.spotify.com/album/72UTdoI3apw6Hvu5GhAkyp\">Spotify</a>.</p>\n<h2><em>Exoskeletons for Children</em> by Squalloscope</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUHCAb/xAAqEAACAQMCBAQHAAAAAAAAAAABAgMABBEFEgYTIUExUXGBBwgVIkJhof/EABcBAAMBAAAAAAAAAAAAAAAAAAUGBwH/xAAjEQABAwQCAQUAAAAAAAAAAAABAhEhAAMFMQQSQRMUMlGy/9oADAMBAAIRAxEAPwC9xHqM2noqmRQLhykQSMs/h17gDHnnvUK44guNPvbOJ2ulFzKIBLNGWj3sOhI3ZwT1yO1Q/iPr8j8UQ6Ws4iS3KumPtJcgZOfQ14XVtYv7hZFub6eURSKw3tnaVyAcjvjFJONxnHXxQbwPchwzNOvFPtzhX1LQtCh1O3JceYaBEzXR8XMEY52zmflszjP6zSpPCWoS6nwvpd7Pnmz26uxIxk+fv4+9KUbqDbWUHYLVo1FZn8wSpY/Rr63jjFzM7xSMVB3qoBGfSsah1W4uI5xPskDNuIIIH8pSqFgw+PQTuf0aGm9c916fY9Zh4+P1XYGmwpb6daQxDEccKIo8gFApSlTxcqNEhqv/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/squalloscope-exoskeletons-for-children-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/squalloscope-exoskeletons-for-children-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/squalloscope-exoskeletons-for-children-320.jpg, /blog/favourite-albums-2017/squalloscope-exoskeletons-for-children-640.jpg 2x, /blog/favourite-albums-2017/squalloscope-exoskeletons-for-children-960.jpg 3x\" src=\"/blog/favourite-albums-2017/squalloscope-exoskeletons-for-children-320.jpg\" alt=\"Album cover Exoskeletons for Children by Squalloscope\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=GXE05kMWF7w\">Pando</a></em> and <em>Being a Person</em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/exoskeletons-for-children/1274009897?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/5OMnwJbgjgrfEJLfH4Ff84\">Spotify</a></p>\n<h2><em>Out in the Storm</em> by Waxahatchee</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHBf/EACUQAAEEAgEEAQUAAAAAAAAAAAEAAgMRBAUhBhIxQRQTMlFhwf/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMi0sDtns8n5eSMXHLiO80C43yG35KqNBkwSZ4gw2yfl9uB/XpRMOYyHbOgjY1kMxq382f5dBWnSckOv2kskkYd8WN0hawENPFCr58muVplo2m6mkxcFsZe5xBNkIoLX7OOLHInr6jnFxBPhFRje0meJg5ri3t4FerXS0OZOAWmV7ga+4koig60OdM5lkjyfSIiD/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/waxahatchee-out-in-the-storm-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/waxahatchee-out-in-the-storm-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/waxahatchee-out-in-the-storm-320.jpg, /blog/favourite-albums-2017/waxahatchee-out-in-the-storm-640.jpg 2x, /blog/favourite-albums-2017/waxahatchee-out-in-the-storm-960.jpg 3x\" src=\"/blog/favourite-albums-2017/waxahatchee-out-in-the-storm-320.jpg\" alt=\"Album cover of Out in the Storm by Waxahatchee\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=zDiIhwGBIig\">Recite Remorse</a></em> and <em>Brass Beam</em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/out-in-the-storm/1222694400?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/66XOr2J6gjRe5vtAxrPPli\">Spotify</a></p>\n<h2><em>Future Politics</em> by Austra</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBwUG/8QAJRAAAgIBBAEEAwEAAAAAAAAAAQIDBBEABRIhBhNRYYEUIpFi/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgUGAwT/xAAhEQACAQIGAwAAAAAAAAAAAAABAgADEQQSIVFhkRMxof/aAAwDAQACEQMRAD8A6HjtSq2y05PRh9XhPI8kqjJIIKn5A44A/wBaiu0UJopga0kRSvJIvBjzUqiEBx32ORLdfHWs93CPyWPeIdu26gzWUgFoo57ChiOu8DsansVby+xdtWpnu1EpSlDXiIKBumcP32MYz7/WlYw1S1yvyU7Y6kHIpvcnkAd3npPJqkO27s9esT6HBWQk8iehkn7z1pqpWrbrvNWHcPwbEizryVs8hj4PtprDwVDqFPUaJjKCKFaoLjkTaHowNuAvYYWREYOanGU5csH7Gf7qpTowrHbT9ylli8qljhiww39Gmmu/O28jgi39SzUqQ060VaqphgiXikaEhVHsBpppoQ7bwsoOpE//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/austra-future-politics-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/austra-future-politics-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/austra-future-politics-320.jpg, /blog/favourite-albums-2017/austra-future-politics-640.jpg 2x, /blog/favourite-albums-2017/austra-future-politics-960.jpg 3x\" src=\"/blog/favourite-albums-2017/austra-future-politics-320.jpg\" alt=\"Album cover of Three Futures by Austra\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=AE9ePc0OTjs\">I Love You More Than You Love Yourself</a></em> and <em><a href=\"https://www.youtube.com/watch?v=1fiacjVTorc\">Future Politics</a></em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/future-politics/1159392535?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/5Qwuw7s1jPcObpL21OJ6IC\">Spotify</a></p>\n<h2><em>Losing</em> by Bully</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGB//EACkQAAIBBAEBBgcAAAAAAAAAAAECAwAEBREhMQYSFCJBkQcTI1FxgaH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A672izkeKhCI6+KlDGNfXygkn+1kcR2vnw2ZigyV23h7uVYFWeTfdkYbXun9GpfxBvvl5OzmkulW1ZxGFHO256+n29qxk2Qtspk7S3yEJZmv43PJ+mEfSc/kboO9NMJHZwdgmlRbK4YQaOzomlBDmsYr60aKQuqnnyHoddRvej196i9nsBZWhndQ8jqfKZNHu73wNAUpQa6yYrAAOefWlKUH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/bully-losing-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/bully-losing-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/bully-losing-320.jpg, /blog/favourite-albums-2017/bully-losing-640.jpg 2x, /blog/favourite-albums-2017/bully-losing-960.jpg 3x\" src=\"/blog/favourite-albums-2017/bully-losing-320.jpg\" alt=\"Album cover of Losing by Bully\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=cia7HOYxj8w\">Kills to Be Resistant</a></em> and <em><a href=\"https://www.youtube.com/watch?v=Og401wXXmJk\">Blame</a></em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/losing/1258294480?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/0T5W8q4JXryl3iiogSJ0zC\">Spotify</a></p>\n<h2><em>Pleasure</em> by Feist</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAQIEBv/EACYQAAICAQMDAwUAAAAAAAAAAAECAAMEBREhBhMxEhRhI0JxgZH/xAAXAQEBAQEAAAAAAAAAAAAAAAADBAEF/8QAHBEAAgICAwAAAAAAAAAAAAAAAAECEQMxBCFh/9oADAMBAAIRAxEAPwChcHSEsVSQefiTVnTuPVhUXJaj2OWD1ek7oB4JPjmZ01Le0re3u2A2P0zzJzKC1aPXaylSHIO6lSePnk/nxFnmlqzrQwcWMLStnisnCVbTt21B52MTfNyle8kOv6MTKDaxel96BTUMZQEUbCcHU7Eo6faATtESOHcgHoqHU1U5jkov8EREsAbP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/feist-pleasure-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/feist-pleasure-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/feist-pleasure-320.jpg, /blog/favourite-albums-2017/feist-pleasure-640.jpg 2x, /blog/favourite-albums-2017/feist-pleasure-960.jpg 3x\" src=\"/blog/favourite-albums-2017/feist-pleasure-320.jpg\" alt=\"Album cover of Pleasure by Feist\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=9Yw1pih-vNw\">Pleasure</a></em> and <em><a href=\"https://www.youtube.com/watch?v=0xQoem0ApXc\">Century</a></em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/pleasure/1213564870?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/5DLqMDgi1dFGJP6Zxb2sVd\">Spotify</a></p>\n<h2><em>The Age of Anxiety</em> by Pixx</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwUI/8QAJRAAAgEEAQIHAQAAAAAAAAAAAQIFAAMEEQYxQQcSExQhUWEy/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQACAxEhEv/aAAwDAQACEQMRAD8A9Ec55VicPgrknnW7ly2rBQqD+iT030B1s/PXVUbifiFPTvIon3GDiY0NJM62PTYu41th5j+hewA61onJ8KLkYe9iziW3w3HyHOiD2K9/N9aqj8Ej8XBlEt3r1pMbEB9p6hAYg7AB/QNdPuj0vYWniM/Cp7adSlKSzUCSicSRdHylZmQELpiNVEPGIosC+OX12ZzqlKnRIb0HjdlQFUADQA0KUpVjv//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/pixx-the-age-of-anxiety-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/pixx-the-age-of-anxiety-320.jpg, /blog/favourite-albums-2017/pixx-the-age-of-anxiety-640.jpg 2x\" src=\"/blog/favourite-albums-2017/pixx-the-age-of-anxiety-320.jpg\" alt=\"Album cover of The Age of Anxiety by Pixx\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=M4kONnKvqG0\">Grip</a></em> and <em>Toes</em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/the-age-of-anxiety/1199496741?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/3KeqGzQhJKG9I08Wws8KXw\">Spotify</a></p>\n<h2><em>No Shape</em> by Perfume Genius</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgMH/8QAJhAAAgEDAwMEAwAAAAAAAAAAAQIDAAQRBQYhEkFxExYxUSKRof/EABUBAQEAAAAAAAAAAAAAAAAAAAMC/8QAHhEAAgIBBQEAAAAAAAAAAAAAAAECAzERITNBQsH/2gAMAwEAAhEDEQA/AOXtvR7nacklhbrHq9uzkOwAmk6QSyMDyQVzx2K1Rbd2nFcrcG8CPGVBAYDPPOQc8H4rFapqN9e65DuWx9QKUiWZ4zhhKiKZMfYzgnsckVsNq6/cxyWotJ40sZ5S0hAyUOACT9cfHipm35EqVa5Pou9pWqTsIh+PilS9X1pBfSYnaQHnqJpTKuTXQMrKk9jzITvHolpHHhVFqz8dyWbJ/g/VTBPJbxzLExXBI480pRrBMslJc39z6zYkYDzSlKsPQ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/perfume-genius-no-shape-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/perfume-genius-no-shape-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/perfume-genius-no-shape-320.jpg, /blog/favourite-albums-2017/perfume-genius-no-shape-640.jpg 2x, /blog/favourite-albums-2017/perfume-genius-no-shape-960.jpg 3x\" src=\"/blog/favourite-albums-2017/perfume-genius-no-shape-320.jpg\" alt=\"Album cover of No Shape by Perfume Genius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em><a href=\"https://www.youtube.com/watch?v=-EVhFTw4igw\">Slip Away</a></em> and <em>Otherside</em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/no-shape/1210458504?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/7awgq3vvlsIeA7dZduR9x4\">Spotify</a></p>\n<h2><em>Turn Out the Lights</em> by Julien Baker</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIGBwQF/8QAKBAAAgEDAgUDBQAAAAAAAAAAAQIDAAQREiEFIjFBYQYTFFFxkaHx/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAIBA//EABwRAAICAgMAAAAAAAAAAAAAAAABAhEDEiEiMf/aAAwDAQACEQMRAD8Awe2dGCg4yfHf6VYPTttDcxlruO3eKMEya2xkagBj8kH7VW4uVk0rqx2rstLoB1VQpCuNQbc42IB8Airw0u0hJbOkaDxC3+dMtzJFZymRcgsJGIGSAOXb+0qjXPH7wMsdjPJFBGukBurHJJJA2GSTtSkskL8K5PHU5XPc1AKPcY9MAfulK4oxkl6UpSgP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2017/julien-baker-turn-out-the-lights-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2017/julien-baker-turn-out-the-lights-640.jpg, /blog/favourite-albums-2017/julien-baker-turn-out-the-lights-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2017/julien-baker-turn-out-the-lights-320.jpg, /blog/favourite-albums-2017/julien-baker-turn-out-the-lights-640.jpg 2x, /blog/favourite-albums-2017/julien-baker-turn-out-the-lights-960.jpg 3x\" src=\"/blog/favourite-albums-2017/julien-baker-turn-out-the-lights-320.jpg\" alt=\"Album cover of Turn Out the Lights by Julien Baker\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <a href=\"https://www.youtube.com/watch?v=xV1dMqeb4_U\"><em>Turn Out the Lights</em></a> and <em>Even</em>.\nFull album on <a href=\"https://geo.itunes.apple.com/at/album/turn-out-the-lights/1265246504?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> and <a href=\"https://open.spotify.com/album/3uIsEwFYYV4rwRssSEJ8Lb\">Spotify</a></p>",
            "url": "/blog/favourite-albums-2017/",
            "title": "My Favourite Albums of 2017",
            "date_modified": "2017-12-29T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2017/",
            "content_html": "<p>I need to get ready for a New Year's party, but here is the list of books I have read in 2017.</p>\n<ul>\n<li><a href=\"http://amzn.to/2ClEYqX\">All the Birds in the Sky</a> by Charlie Jane Anders</li>\n<li><a href=\"http://amzn.to/2ClFh55\">Politik mit der Angst</a> by Ruth Wodak</li>\n<li><a href=\"http://amzn.to/2lrOFdD\">The Bricks That Built the Houses</a> by Kate Tempest</li>\n<li><a href=\"http://amzn.to/2zTxFBp\">Im Land der Verzweiflung</a> by Nir Baram</li>\n<li><a href=\"http://amzn.to/2Cq4kUv\">Der Meister und Margarita</a> by Michail Bulgakow</li>\n<li><a href=\"http://amzn.to/2ChszoF\">Web Animation Using JavaScript</a> by Julian Shapiro</li>\n<li><a href=\"http://amzn.to/2zTxWEr\">Putins rechte Freunde</a> by Michel Reimon, Eva Zelechowski</li>\n<li><a href=\"http://amzn.to/2CoxJyd\">Das Kapital des Staates</a> by Mariana Mazzucato</li>\n<li><a href=\"http://amzn.to/2Cj6xlu\">The Gene</a> by Siddhartha Mukherjee</li>\n<li><a href=\"http://amzn.to/2Cg7Lhl\">Der Mythos des Sisyphos</a> by Albert Camus</li>\n<li><a href=\"http://amzn.to/2CmxzYu\">The Bell Jar</a> by Sylvia Plath</li>\n<li><a href=\"http://amzn.to/2DDvQLg\">The Power</a> by Naomi Alderman</li>\n<li><a href=\"http://amzn.to/2CoMelK\">The Lonely City</a> by Olivia Laing</li>\n<li><a href=\"http://amzn.to/2lqiOu0\">The Refugees</a> by Viet Thanh Nguyen</li>\n<li><a href=\"http://amzn.to/2CeuoTc\">The Great Leveler</a> by Walter Scheidel</li>\n<li><a href=\"http://amzn.to/2CjlsMg\">Black Holes Blues and Other Songs From Outer Space</a> by Janna Levin</li>\n<li><a href=\"http://amzn.to/2CoM3Hb\">No Is Not Enough</a> by Naomi Klein</li>\n<li><a href=\"http://amzn.to/2CmfA4p\">Angst</a> by Stefan Zweig</li>\n<li><a href=\"http://amzn.to/2lsCuNE\">What Love Is</a> by Carrie Jenkins</li>\n<li><a href=\"http://amzn.to/2zTRokz\">Die Liebhaberinnen</a> by Elfriede Jelinek</li>\n<li><a href=\"http://amzn.to/2ChsaCE\">Kompass</a> by Mathias Enard</li>\n<li><a href=\"http://amzn.to/2Cmgg9X\">A Knight of the Seven Kingdoms</a> by George R. R. Martin</li>\n<li><a href=\"http://amzn.to/2Cq4XgP\">Statusmeldungen</a> by Stefanie Sargnagel</li>\n<li><a href=\"http://amzn.to/2q7qqGx\">Kriegstagebuch</a> by Ingeborg Bachmann</li>\n<li><a href=\"http://amzn.to/2CqGyry\">Twitter and Tear Gas</a> by Zeynep Tufekci</li>\n<li><a href=\"http://amzn.to/2DExlsG\">Populismus für Anfänger</a> by Walter Ötsch, Nina Horaczek</li>\n<li><a href=\"http://amzn.to/2CkdxOT\">Stille Machtergreifung</a> by Hans-Henning Scharsach</li>\n<li><a href=\"http://amzn.to/2q4tDqp\">Binti</a> by Nnedi Okorafor</li>\n<li><a href=\"http://amzn.to/2ChsC3O\">On Tyranny</a> by Tomithy Snyder</li>\n<li><a href=\"http://amzn.to/2CmYNOy\">Difficult Women</a> by Roxanne Gay</li>\n<li><a href=\"http://amzn.to/2DDxPix\">Der geplünderte Staat und seine Profiteure</a> by Ashwien Sankholkar</li>\n<li><a href=\"http://amzn.to/2lsdVAl\">Production-Ready Microservices</a> by Susan J. Fowler</li>\n<li><a href=\"http://amzn.to/2Cl6HIn\">Phasma</a> by Delilah S. Dawson</li>\n<li><a href=\"http://amzn.to/2zVB9DG\">Crash Override</a> by Zoe Quinn</li>\n<li><a href=\"http://amzn.to/2CgjNY5\">Das Digital</a> by Thomas Ramge, Viktor Mayer-Schöngerger</li>\n<li><a href=\"http://amzn.to/2CqpySi\">So You Want to Be a Jedi?</a> by Adam Gidwitz</li>\n<li><a href=\"http://amzn.to/2Cg8Up9\">Das andere Geschlecht: Sitte und Sexus der Frau</a> by Simone de Beauvoir</li>\n<li><a href=\"http://amzn.to/2q5jtFV\">The Golden Compass</a> by Philip Pullman</li>\n<li><a href=\"http://amzn.to/2q5jtFV\">The Subtle Knife</a> by Philip Pullman</li>\n<li><a href=\"http://amzn.to/2q5jtFV\">The Amber Spyglass</a> by Philip Pullman</li>\n<li><a href=\"http://amzn.to/2CmgPR7\">High Performance Browser Networking</a> by Ilya Grigorik</li>\n<li><a href=\"http://amzn.to/2DEPVki\">Sebastian Kurz</a> by Nina Horacezek, Barbara Toth</li>\n<li><a href=\"Reset\">Reset</a> by Ellen Pao</li>\n<li><a href=\"http://amzn.to/2zSdPqm\">Harry Potter and the Philosopher's Stone</a> by J.K. Rowling</li>\n<li><a href=\"http://amzn.to/2CjmurC\">Beware the Power of the Dark Side!</a> by Tom Angleberger</li>\n</ul>",
            "url": "/blog/books-2017/",
            "title": "Books 2017",
            "date_modified": "2017-12-31T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/new-albums-2018-04-06/",
            "content_html": "<p>For a while I am posting my favorite new albums of the week on Friday on Twitter. This week I thought I could also put them on my blog, since that is kind of the point of a blog.</p>\n<h2>I Don't Run by Hinds</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGB//EACkQAAEDAwMDAgcAAAAAAAAAAAIBAwQABREGEiETQVEUMQciMmFykdH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgME/8QAJBEAAgIBAgUFAAAAAAAAAAAAAQIAEQNRcQQSEyKRMWGB0fD/2gAMAwEAAhEDEQA/AOhOzGrLbWGwtrD8ohEQRxemKkWdqEXK84XnFczumupM+b6+1MXBsYzSOyIgmLjLe0sb0X5e+PK5qDYrJqbUJOX2GT7MSHOCOTguERgbiiOADndhD5/JfvVEreVpSazcGX4VtdfVr1JNKikz1F+vHkkJcd8eKXGrZWqwN5sdUVbq9vqWLTeCuET1Vw1DqFp5wyVBbZeUUTPZUBU98/ylaa0XUtPQkhQp8xuMpm62OGnMIRLxnGeFynPjxilR6w0P75lhwrajzM58ONVzLNp+Rao0aG5DB9XxF0CVUcQkJCyhJzlE/SVn9RS5FxcGVJfdVGx6QsIa9JAJDXbt7pn2z5pShjZreCACiPaVHIjriiYz5jSKKLsaIRFMp2RBpSlOuNa9JJ8uTmPcfM//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/hinds-i-dont-run-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/hinds-i-dont-run-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/hinds-i-dont-run-320.jpg, /blog/new-albums-2018-04-06/hinds-i-dont-run-640.jpg 2x, /blog/new-albums-2018-04-06/hinds-i-dont-run-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/hinds-i-dont-run-320.jpg\" alt=\"Album cover of I don&#x27;t Run by Hinds\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Try the music video for <a href=\"https://www.youtube.com/watch?v=3zf9aO2qpn0\">The Club</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/i-dont-run/1326887526?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/5Cx9K3B2kOjSvAC23ADh3X\">Spotify</a></li>\n<li><a href=\"https://hinds.bandcamp.com/album/i-dont-run\">Bandcamp</a></li>\n</ul>\n<h2>The Louder I Call, The Faster It Runs by Wye Oak</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAwQGCP/EACgQAAIBBAECBAcAAAAAAAAAAAECAwAEBREhBhIHExRxMTJBUWGBkf/EABcBAQEBAQAAAAAAAAAAAAAAAAUCAAH/xAAdEQABBAIDAAAAAAAAAAAAAAAAAQIDFBIhFUJR/9oADAMBAAIRAxEAPwCr19amOfHhUW3Zg7ARAMx+hLa3WvHip5mVY4SW+wUkmu68ZLS6wGXxttgsMlzbywFmnuQxVHLEdveCAOF3ondWr0T0VZjH+fkrfVw0heJ42KgxkArwRvY5H51ukr0e0xC6M2lzKaayuZkjMuMiVgoXiMjf61SvR69L40D5G/tKi63wvj3r2MZtLaa5inmt4pJohqN3UMU9t/D3qVi2W5JpSjRUkUQdtKUrHT//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/wye-oak-the-louder-i-call-the-faster-it-runs-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/wye-oak-the-louder-i-call-the-faster-it-runs-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/wye-oak-the-louder-i-call-the-faster-it-runs-320.jpg, /blog/new-albums-2018-04-06/wye-oak-the-louder-i-call-the-faster-it-runs-640.jpg 2x, /blog/new-albums-2018-04-06/wye-oak-the-louder-i-call-the-faster-it-runs-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/wye-oak-the-louder-i-call-the-faster-it-runs-320.jpg\" alt=\"Album cover of The Louder I Call, The Faster It Runs by Wye Oak\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Try <a href=\"https://www.youtube.com/watch?v=ojvwB6u30Ks\">Lifer</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/the-louder-i-call-the-faster-it-runs/1334754325?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/3lSHd2sapKzXk7XkDac2zg\">Spotify</a></li>\n<li><a href=\"https://wyeoak.bandcamp.com/album/the-louder-i-call-the-faster-it-runs\">Bandcamp</a></li>\n</ul>\n<h2>Bark Your Head Off, Dog by Hop Along</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcEBQgG/8QAJxAAAgIBAwMDBQEAAAAAAAAAAQIDBAUABhESIVETMXEHFSIyQUL/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQD/8QAHBEBAAICAwEAAAAAAAAAAAAAAQAhAhEDIjEy/9oADAMBAAIRAxEAPwDwWN3fHhN3U8hHQhksJclEjW2C9MfEg6V8fue/PuAO+qW+67U+bwuVWUvHj8VFblhR16Fb1lQs3+mAUP8Aj286neM25HYaSd71FY6ktlYI7ZQ+j0Ankj3ckjsDyOfnWqoZIYnOzw4us+QrrVfHWKaOS7wyKPyHAPJDMTz5Gp97fZUdBqdU7i3LRW1A8rrJ6kKspaURkDkggj5B01NpN11DDUnwoglrzV4y6TOqPDIqiN0Ibv7pz4PVz/dNPbCOJUmceCx9zGZyzNXHr1MkI43U8HpdgCD54/njWFt3eGS2xm4xjY6ZX7gx4mgV/wBmAPf38e3j55aaTD1g5qDU6Z+mOy9s39k0bN7AYyxZd5+uWWsrM3EzqCSR37Aaaaa3Ak+X0z//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/hop-along-bark-your-head-off-dog-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/hop-along-bark-your-head-off-dog-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/hop-along-bark-your-head-off-dog-320.jpg, /blog/new-albums-2018-04-06/hop-along-bark-your-head-off-dog-640.jpg 2x, /blog/new-albums-2018-04-06/hop-along-bark-your-head-off-dog-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/hop-along-bark-your-head-off-dog-320.jpg\" alt=\"Album cover of Bark Your Head Off, Dog by Hop Along\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Try <a href=\"https://www.youtube.com/watch?v=6IbBU4QXxD4\">Prior Things</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/bark-your-head-off-dog/1334804729?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/7taAuoHvZ4LJzEaB0OzuP3\">Spotify</a></li>\n<li><a href=\"https://hopalong.bandcamp.com/album/bark-your-head-off-dog\">Bandcamp</a></li>\n</ul>\n<h2>Sex &#x26; Food by Unknown Mortal Orchestra</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwQI/8QAJhAAAgIBAgUEAwAAAAAAAAAAAQMCBAAFEQYSEyExB1FhgQgjYv/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAf/EABwRAAIBBQEAAAAAAAAAAAAAAAABEQMSEyExQf/aAAwDAQACEQMRAD8A0yVau+jJF1YYqxEwlCXgxI2O+UrhbgGlo2qOtqt2bHKDBHUG3QWfIHvI+Ob2y4ajqlegpTGtUmbmRQuTe4Mz4A+exyI1HiKtps69e6yNadtvIoMIjN0yfAGUqQFRyKY4S768hP8AWDKBG4OM6FPVGAHW3+sZtzWgMaezEfyCttgzQ0CW6tmt5f7BiAfoE5S/ULVLd3iLTNRsOMrKqlIw9okxEiQPk9zjGY+FC8PQEGykCSe5xjGOSo//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/unknown-mortal-orchestra-sex-and-food-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/unknown-mortal-orchestra-sex-and-food-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/unknown-mortal-orchestra-sex-and-food-320.jpg, /blog/new-albums-2018-04-06/unknown-mortal-orchestra-sex-and-food-640.jpg 2x, /blog/new-albums-2018-04-06/unknown-mortal-orchestra-sex-and-food-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/unknown-mortal-orchestra-sex-and-food-320.jpg\" alt=\"Album cover of Sex &#x26; Food by Unknown Mortal Orchestra\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Try <a href=\"https://www.youtube.com/watch?v=uY82vChor2A\">Not in Love We're Just High</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/sex-food/1334720786?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/7c2Xfq7aQKzs0KdSI3K7Rc\">Spotify</a></li>\n<li><a href=\"https://unknown-mortal-orchestra.bandcamp.com/album/sex-food\">Bandcamp</a></li>\n</ul>\n<h2>Static (EP) by boerd</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAYFAwcI/8QAKRAAAQMDAwIFBQAAAAAAAAAAAgEDBAAFEQYSIQcxExRBUWEiMnGCov/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAX/xAAbEQADAAIDAAAAAAAAAAAAAAAAAQIEMQNBsf/aAAwDAQACEQMRAD8A7yvLs4J0nwp74BvXAoaog/FTtxmXQByl3khj2eLmpPWWvSi3S6g3vFIsg2zLKL9q89/XntUZK18jjbZSvNAj3LZG2m0vbhFymfxVU5ETsz7xbttr09GdOZMiTY3jlynZLiSCFDcNSXGB4zSsLoZLSZpCS6KoqeecT+QpSLtXTpFnFDiFL6OTUfSiwX9+S5OfuKeM6rxC26IpuX9ax4PQjSURtQbdup5TknJAkvf5HCd/SlKlpIemXOhtI2/R9oet9rOSbDj5SCWQaEW4kRF7InH0pSlKbOgXs//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/boerd-static-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/boerd-static-640.jpg, /blog/new-albums-2018-04-06/boerd-static-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/boerd-static-320.jpg, /blog/new-albums-2018-04-06/boerd-static-640.jpg 2x, /blog/new-albums-2018-04-06/boerd-static-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/boerd-static-320.jpg\" alt=\"Album cover of Static (EP) by boerd\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Try <a href=\"https://www.youtube.com/watch?v=Qgv4hQ_C9ds\">Blind</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/static-ep/1346439734?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/70fSTPNjTjkQRXALU9kO1W\">Spotify</a></li>\n</ul>\n<h2>The Deconstruction by Eels</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwQI/8QAKBAAAQIFAwMEAwAAAAAAAAAAAQIDAAQFESEGIjESI0EHYYGRMlFx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAwQFAv/EACIRAAIBAwMFAQAAAAAAAAAAAAECAAMEIRES8BMiMTKxwf/aAAwDAQACEQMRAD8A9D6wryNP0wzBZU64va2LbOr9KPjFz8RX9D6ldq1YnEzanFuvEFltAs200nk3JySo88nETWvqUurafdDCFuTDHdbQgm6iOQPci4B94zz01pr5rpnHG5lpuSWtHQlm5cUNnRkbbAZ4zAWVTT3DzrL9pRt3sajN7805+TT6rQ5SpTIemFTIWEhPbeUgWz4H9hEk2srbSpTamyR+KrXH1iEY6jDAMlrcVkG0McTmrMk3UaY/KvqWltwC5QqxwQefiIaj6Yk6dPy0ww/NkslZQhbt03UmxuLZ8fUIQVD2mMWzsKDgHGfksh5hCEAiE//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/eels-the-deconstruction-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/eels-the-deconstruction-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/eels-the-deconstruction-320.jpg, /blog/new-albums-2018-04-06/eels-the-deconstruction-640.jpg 2x, /blog/new-albums-2018-04-06/eels-the-deconstruction-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/eels-the-deconstruction-320.jpg\" alt=\"The Deconstruction by Eels\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Try <a href=\"https://www.youtube.com/watch?v=qx3sKPoeOis\">Today Is The Day</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/the-deconstruction/1330700343?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/2Vm6H5PPbIIhTWvREsrlTm\">Spotify</a></li>\n</ul>\n<h2>Okovi: Additions by Zola Jesus</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcBAwYF/8QAJxAAAgEEAQMDBQEAAAAAAAAAAQIDAAQFEQYTIUESIjEHFBUyUWH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJkvGshkuO4LIT2VxmscsHRtgt/741Xu6Kg/VQT8eTuuxiwdrx7Mxz4HiefxS9IdHJ9SQyAsO4BHfvsjwR5rxPppa4+XBiKbNx3MkcfpdBDIy24bZCrr9vJbQ3v4I1VG5jj8PLw7GphOU3cIgkCG6ujJI8gA90ZHtPo0f4CP9oqA3v1P51BeTxJzDNuqSMob7pxsA63qla83wWdchJ+HvIL60b3CUI0ej5XWj8UoOKRmRwyMVZe4IOiKquVv2hzGCxqwW72/29uzGSP1u7SAF2Zj3JJNKUGOYcnyFpyK8trToQW8L9OOOKIKqgfwClKUH//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-06/zola-jesus-okovi-additions-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-04-06/zola-jesus-okovi-additions-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-06/zola-jesus-okovi-additions-320.jpg, /blog/new-albums-2018-04-06/zola-jesus-okovi-additions-640.jpg 2x, /blog/new-albums-2018-04-06/zola-jesus-okovi-additions-960.jpg 3x\" src=\"/blog/new-albums-2018-04-06/zola-jesus-okovi-additions-320.jpg\" alt=\"Album cover of Okovi: Additions by Zola Jesus\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/okovi-additions/1346854452?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/6gIClbeFY916nkjAnc2cK9\">Spotify</a></li>\n<li><a href=\"https://zolajesus.bandcamp.com/album/okovi-additions\">Bandcamp</a></li>\n</ul>\n<p><strong>Update April 8, 2018:</strong> I missed that Zola Jesus released <em>Okovi: Additions</em> also on Friday and I added it to the list.</p>",
            "url": "/blog/new-albums-2018-04-06/",
            "title": "New Albums on April 6, 2018",
            "date_modified": "2018-04-06T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/new-albums-2018-04-20/",
            "content_html": "<p>After a break last week because I was graduating from university I have two new albums for you this week.</p>\n<h2>Hippo Lite by DRINKS</h2>\n<p>The first one is Hippo Lite by DRINKS. DRINKS is a collaboration between Cate Le Bon and Tim Presley (White Fence) and Hippo Lite is their second album after Hermits on Holiday from 2015.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAcF/8QAJBAAAQMEAgICAwAAAAAAAAAAAQIDBAAFBhESITFBBxMiUdH/xAAYAQACAwAAAAAAAAAAAAAAAAABAwACBP/EABkRAQEBAAMAAAAAAAAAAAAAAAABEQITIf/aAAwDAQACEQMRAD8Ap2U43DyVqMzPS6pDElSwG9nexog/rxUss8q1Rvky3QIP0twY0xai59SU/kErTwBA5KG+PnZ2DVNy+5Xm3mCxj7cNUmXIcCjKOglKU7JHY3r3WNiOOY5Zb1GbkPxZl/kKExpaE6Q2rvtsjoJPpJ346rNxuT0xSo9zgOtJU1NjrT42HB5HqlQm8ZZBh3GQzAt12KQ4suFT6BtZUSSOj12P5Sh11FqvVltd1+hi62+PMaQsqQHk74lQ71qsxjAsWSQDY4agFDiCjXHv1qlKptFD5MtpmVIbXAhvlLqwFupUVa5HQ6UKUpTwf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-20/drinks-hippo-lite-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-20/drinks-hippo-lite-320.jpg, /blog/new-albums-2018-04-20/drinks-hippo-lite-640.jpg 2x\" src=\"/blog/new-albums-2018-04-20/drinks-hippo-lite-320.jpg\" alt=\"Album cover of Hippo Lite by DRINKS\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>You can also watch the music video for <a href=\"https://www.youtube.com/watch?v=V87KEg_J3hg\">Corner Shops</a>.</p>\n<p><a href=\"https://drinks.bandcamp.com/album/hippo-lite\">Bandcamp</a>\n<a href=\"https://itunes.apple.com/at/album/hippo-lite/1347967254?l=en\">Apple Music</a>\n<a href=\"https://open.spotify.com/album/6V9c46US2xiiS6iFmnj7WV\">Spotify</a></p>\n<h2>The Recognitions by Exitmusic</h2>\n<p>When I read <em>Exitmusic</em> my mind will always wander to <a href=\"https://open.spotify.com/track/4Na0siMtWOW9pJoWJ1Ponv\">Exit Music (For a Film)</a>. Exitmusic (the band), however, are making dream pop since 2003 and their new album The Recognitions is perfect for a nice spring evening.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwP/xAAnEAABAwMDAwQDAAAAAAAAAAABAgMEAAURBhIhMVFhBxNBgRQWkf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8Au7GnpzMRDLCUOy9wUQVAhCSrnOMfHNc98JV4jQDJZS4Bjcgcr7cfBPWptp20MzUxoD0lM50qLobWMshOcrJVxjjGee3Wo+Bo3T6bwpaYslxlA933FuK3rUR1Son+fVBnN+Yubd2kfhsOrjKUS2rbjI+vOaVc9VfrEG7rYduhhuhIU5HfeUVNqVk44T5z9mlQRce7PQNQI2NR3UtbghLqMgEjBPknuapM31K1ILs6oSm/aLZ2slsFCMcDAPPnrSlUZnqq9TZV/mPPulbilkknPelKUH//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-04-20/exitmusic-the-recognitions-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-04-20/exitmusic-the-recognitions-320.jpg, /blog/new-albums-2018-04-20/exitmusic-the-recognitions-640.jpg 2x\" src=\"/blog/new-albums-2018-04-20/exitmusic-the-recognitions-320.jpg\" alt=\"Album cover The Recognitions by Exitmusic\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>I would recommend <a href=\"https://exitmusic.bandcamp.com/track/iowa\">Iowa</a> for a start, which you can stream from Bandcamp.</p>\n<p><a href=\"https://exitmusic.bandcamp.com/album/the-recognitions\">Bandcamp</a>\n<a href=\"https://itunes.apple.com/at/album/the-recognitions/1342808966?l=en\">Apple Music</a>\n<a href=\"https://open.spotify.com/album/6IfJrQ9KPPez2yZAoTNGgT\">Spotify</a></p>",
            "url": "/blog/new-albums-2018-04-20/",
            "title": "New Albums on April 20, 2018",
            "date_modified": "2018-04-20T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/gatsby-remark-a11y-emoji/",
            "content_html": "<p>Everyone loves emoji <span role=\"img\" aria-label=\"hundred points\">💯</span><span role=\"img\" aria-label=\"party popper\">🎉</span><span role=\"img\" aria-label=\"fire\">🔥</span>, but if you use <a href=\"https://github.com/evcohen/eslint-plugin-jsx-a11y\">eslint-plugin-jsx-a11y</a> to check the accessibility of your JSX you probably know that emoji need special handling to become accessible. Instead of just writing the emoji, you need to wrap it in a <code class=\"language-text\">span</code> and add <code class=\"language-text\">role=\"img\"</code> and <code class=\"language-text\">aria-labelledby</code> attributes.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>span</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>img<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-label</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>guitar<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  🎸\n</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>span</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>When writing blog posts in Markdown I don't want to wrap every emoji in a <code class=\"language-text\">&#x3C;span></code> and therefore I created a plugin for Gatsby to automatically wrap emoji with the correct label. The plugin is called <em>gatsby-remark-a11y-emoji</em> and uses <a href=\"https://github.com/wooorm/gemoji\">gemoji</a> to find the label for an emoji.</p>\n<p>You can install the plugin now using NPM or Yarn:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">--save</span> gatsby-remark-a11y-emoji</code></pre></div>\n<p>Then you need to add the plugin to <code class=\"language-text\">gatsby-config.js</code> as a plugin to <code class=\"language-text\">gatsby-transformer-remark</code>. I recommend adding it at the very end of the list, because the plugin transforms Remark <em>text</em> nodes into <em>html</em> nodes.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">resolve</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">gatsby-transformer-remark</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n          <span class=\"token comment\">// ...</span>\n          <span class=\"token string\">'gatsby-remark-a11y-emoji'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>You can also find the project on <a href=\"https://github.com/florianeckerstorfer/gatsby-remark-a11y-emoji\">Github</a> and <a href=\"https://www.npmjs.com/package/gatsby-remark-a11y-emoji\">NPM</a>.</p>",
            "url": "/blog/gatsby-remark-a11y-emoji/",
            "title": "Accessible Emojis with Gatsby",
            "summary": "I made a plugin for Gatsby to add A11y tags to Emojis in Markdown.",
            "date_modified": "2018-05-03T23:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/new-albums-2018-05-04/",
            "content_html": "<p>This one is a few days late, but here are three great albums that were released last Friday.</p>\n<h2>Rebound by Eleanor Friedberger</h2>\n<p><img src=\"/blog/2018-05-07-new-albums-2018-05-04/eleanor-friedberger-rebound.jpeg\" alt=\"Rebound by Eleanor Friedberger\"></p>\n<p>You can listen to the music video for <a href=\"https://www.youtube.com/watch?v=wmjcSz8aV1Y\">Make Me a Song</a> on YouTube.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/rebound/1334965613?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/0oOqcEOKXsr3f6cfIfZqrX\">Spotify</a></li>\n</ul>\n<h2>Lost Friends by Middle Kids</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUCAwYH/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQIDAAQRBRIxBhMhMkGhFHGCkZL/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwH/xAAbEQEBAAIDAQAAAAAAAAAAAAABABIhAgMRUf/aAAwDAQACEQMRAD8AsXPUuvSTzdnqa/Ud6WBUcBNp3ZByT6RuwGPjAx7Gq+j6rr9/rkFrbdQ3wZjEyd6NzGQTuEbe4B43nycYOAa9vMUZ5jQ/iKwuVZYpWhVe4V8eAPP3qb2iaJnM+XJWGh9Rxm6a81YTtLcPKm24lURoTkIBjgcUrswQRkcUqebHKj3SXLT3JTULmJR6VRY8L+1PzWzSkmIk+ou57jgjuBBj+VHzSlJNW+aqlKUqcL//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-04/middle-kids-lost-friends-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-04/middle-kids-lost-friends-320.jpg, /blog/new-albums-2018-05-04/middle-kids-lost-friends-640.jpg 2x\" src=\"/blog/new-albums-2018-05-04/middle-kids-lost-friends-320.jpg\" alt=\"Lost Friends by Middle Kids\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>The music video for <a href=\"https://www.youtube.com/watch?v=yMuDiu1gzdE\">On My Knees</a> is on YouTube.</p>\n<ul>\n<li><a href=\"https://middlekids.bandcamp.com/album/lost-friends\">Bandcamp</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/lost-friends/1339205639?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/0sF684xABPfE5ywOMLNqDq\">Spotify</a></li>\n</ul>\n<h2>DOVE by Belly</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 99.375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcDBv/EACYQAAAGAQQCAQUAAAAAAAAAAAABAgMEEQYFEiExE2EHI0FRcaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAFAP/EACQRAAIBAwMDBQAAAAAAAAAAAAEDAgAEEQUhURITcRQiMUGR/9oADAMBAAIRAxEAPwCt49l0VzTNLNxKd9Uv1x2NlZalDMxtypCjcpFESSMhNsUjk7FZ4uq+46/UI0dTaHGWvGrneXv8/r0HbqyUlwh0kg5348+avXLknrhjNZZNlhlqX0WUGnYXaj75AT/W0GrUHDu/6ARXpKzEUKNVuojGR+Vh8c69NXCTZt2XF7CsViJOekw0eUmzvsybIgAC6myfeG5pm8VBdiswABx9bVHczmOM5DJbbJKUJOiLkAAMpcztx9x+OaNQlclxMognHFf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><img srcset=\"/blog/new-albums-2018-05-04/belly-dove-320.jpg\" src=\"/blog/new-albums-2018-05-04/belly-dove-320.jpg\" alt=\"Album cover of DOVE by Belly\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Belly have a music video for <a href=\"https://www.youtube.com/watch?v=prF1CdzjTZ4\">Shiny One</a>.</p>\n<ul>\n<li><a href=\"https://itunes.apple.com/at/album/dove/1343422246?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/2vS00kkKsWIzCV8YGceoDK\">Spotify</a></li>\n</ul>",
            "url": "/blog/new-albums-2018-05-04/",
            "title": "New Albums on May 5, 2018",
            "date_modified": "2018-05-04T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/new-albums-2018-05-18/",
            "content_html": "<p>I missed last week because I was travelling again, sorry, but this week is a good one. Lots of good music out today.</p>\n<h2>Tell Me How Your Really Feel by Courtney Barnett</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUEBgf/xAAkEAACAgIBBAEFAAAAAAAAAAABAgADBBESBRMhQTEGQlGBkf/EABcBAQEBAQAAAAAAAAAAAAAAAAQFAwb/xAAcEQACAgMBAQAAAAAAAAAAAAABAgADBBEhMQX/2gAMAwEAAhEDEQA/APG6VBVBw343KJosya61FFdfjkWCBd/ub/pOvGuofvcGsRd8WG/XzOooyce5re2VsVADyHkb1+ZPsuKkgTpMT5qXIHdh2cE+N2yFcFG9iJr6vaLc53H3eojU6okLJUJayr4DI2Ll24tiPSQrAStX1rMFajkpGvjR1/IiYOo3HYljqNAmTcnIey3k2gdeoiIhfIC7rmf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/courtney-barnett-tell-me-how-you-really-feel-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/courtney-barnett-tell-me-how-you-really-feel-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/courtney-barnett-tell-me-how-you-really-feel-320.jpg, /blog/new-albums-2018-05-18/courtney-barnett-tell-me-how-you-really-feel-640.jpg 2x, /blog/new-albums-2018-05-18/courtney-barnett-tell-me-how-you-really-feel-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/courtney-barnett-tell-me-how-you-really-feel-320.jpg\" alt=\"Album cover of Tell Me How Your Really Feel by Courtney Barnett\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=TISIPNpRuoY\">Need A Little Time</a></li>\n<li><a href=\"https://courtneybarnett.bandcamp.com/album/tell-me-how-you-really-feel\">Bandcamp</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/tell-me-how-you-really-feel/1336513196?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/3jEJprNMZP5MhTkzPRMOGe\">Spotify</a></li>\n</ul>\n<h2>LoveLaws by TT</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBwMG/8QAJhAAAQMDBAIBBQAAAAAAAAAAAQIDEQAEBRIhIjEGE0FRYYGRof/EABgBAAIDAAAAAAAAAAAAAAAAAAIEAAED/8QAGBEBAQEBAQAAAAAAAAAAAAAAABEBAhL/2gAMAwEAAhEDEQA/APdXDzbJhwxxUuY+EiT/ACq7FZiwyzCHrF4uIcbDolJBCSSBI+DIOx3qCM3gclYoavr2zuXSnmlM8SRvAO47is5sPKcp4pcXuLsLC0v8c3cQw+p0oWoGNz9TBE9dGkM5p31GtqjUYSr9UqlX5PjEkBy4XrjkEoJAP2pVTR3GX3J9wIcAVHRI3H5qF6wl1B1KMq3BPe0UpWxZxaecQgI1lWniCezG1KUokf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/tt-lovelaws-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/tt-lovelaws-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/tt-lovelaws-320.jpg, /blog/new-albums-2018-05-18/tt-lovelaws-640.jpg 2x, /blog/new-albums-2018-05-18/tt-lovelaws-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/tt-lovelaws-320.jpg\" alt=\"Album cover of LoveLaws by TT\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=q1Bs5CXlpkE\">I've Been Fine</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/lovelaws/1353124165?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/3wjgJajGlHY57J075PDGae\">Spotify</a></li>\n</ul>\n<h2>Saved by Now, Now</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAQIHBP/EACcQAAIBAwMDAwUAAAAAAAAAAAECAwAEEQUSIRMxQQZRkQciMoHw/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEBv/EAB8RAAICAQQDAAAAAAAAAAAAAAECAAMEERJBUTEyof/aAAwDAQACEQMRAD8Ax9QvSi3cN3qI6UWyPqSyOfzwDhT7cYArjfp/S1vdVaC4Vumq7jg4rq2nX0mqxCHU0NwGTdGeoVXHYZB4PvmvPqlraWUyNaQpEznDKvOcDGAf7vWdTIepWQczRW462Opbj7KXq2iWaXhW3iHTAA4bbSpSS4juZpWSNiqsUyMEHHkUoRfao0JMI49ROu0SYsSXtYtxJBAIGcAZ8DHitJh9xYFgys4BB8YXHx3pSlD2MefEqM9hAsrjDkBmABc8AEjj4z+zSlKu3N3Igi9T/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/now-now-saved-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/now-now-saved-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/now-now-saved-320.jpg, /blog/new-albums-2018-05-18/now-now-saved-640.jpg 2x, /blog/new-albums-2018-05-18/now-now-saved-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/now-now-saved-320.jpg\" alt=\"Saved by Now, Now\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=ldg_HU4_3RU\">AZ</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/saved/1365088448?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/5f276EbQ82axH4MD9m7UNK\">Spotify</a></li>\n</ul>\n<h2>Everything Matters But No One Is Listening by Quiet Slang (Beach Slang)</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYHBQj/xAApEAACAQQBBAECBwAAAAAAAAABAgMABAURBgcSITEiQVETFSMyYbHB/8QAGAEBAAMBAAAAAAAAAAAAAAAABAECAwX/xAAcEQEAAgIDAQAAAAAAAAAAAAABAAIDESExQVH/2gAMAwEAAhEDEQA/ANc5blDiuOzTK8xkcrCDGCWUM2tjyANffxofWpZsf+SZiyjxzyk37lpoWnZ4+1VPe6o2yuj2gEHzvzUH1j6gXw5Re4HHTCPF28ixSsEHdIw13/LXrex4+1d/r3l7vj0XHrzB3Mtjds8q/iwtr9MqvwI+o3qqpq5Y6iseNaI+y7mlmL/JiDr1qlTfTXmkWb4jazZMwDIQloJ2ZQC7A/u1/IIpSx3yEK0R0zzplpXyF5f3dwxM0szzNr13Ftn+61jrpeyi34vKQjMhIAYbHlFpSh5OmdfBxauvpMht85e4t7iC2ZOwysxLrsk+v8FKUqRZkgs//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/quiet-slang-everything-matters-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/quiet-slang-everything-matters-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/quiet-slang-everything-matters-320.jpg, /blog/new-albums-2018-05-18/quiet-slang-everything-matters-640.jpg 2x, /blog/new-albums-2018-05-18/quiet-slang-everything-matters-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/quiet-slang-everything-matters-320.jpg\" alt=\"Everything Matters But No One Is Listening by Quiet Slang (Beach Slang)\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=YF7gvl6foB8\">Dirty Cigarettes</a></li>\n<li><a href=\"https://beachslang.bandcamp.com/album/everything-matters-but-no-one-is-listening-quiet-slang\">Bandcamp</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/everything-matters-but-no-one-is-listening/1342827090?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/3VdsZWEth5e0kzYzMRvNS7\">Spotify</a></li>\n</ul>\n<h2>Bad Habits by Pema</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQGAwUH/8QAJxAAAgEDAwQABwAAAAAAAAAAAQIDAAQFERIxEyFBUQYiI2GBkcH/xAAXAQEBAQEAAAAAAAAAAAAAAAAFAQID/8QAIBEAAwABAgcAAAAAAAAAAAAAAAECBANhERITITFB8f/aAAwDAQACEQMRAD8AopzE+NtJC8sTRJ8zqkW0MB499+PdXP41trdLGTIYVLi3MUaSPDLH9KRCBr0yTyuoBFc+fEXOWEE8KLLAU6kkRbRmHb91Zslkri9wUOMmnlS1gQxInJK+ifVK9PLqlqJ+/GwcrxJTil9IMGc6kYdQqA+P7StbHj9EASRgo7AKNdKUpxYdyQYraR1wuNeOR45FXs6HQjnz+BUqyvZruBpJyrPu267efvSlRG7S7vckS3LwOY4wu0exSlKpzSR//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/pema-bad-habits-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/pema-bad-habits-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/pema-bad-habits-320.jpg, /blog/new-albums-2018-05-18/pema-bad-habits-640.jpg 2x, /blog/new-albums-2018-05-18/pema-bad-habits-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/pema-bad-habits-320.jpg\" alt=\"Bad Habits by Pema\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=b4Cw2ARZnR0\">Depend</a></li>\n<li><a href=\"https://whoispema.bandcamp.com/album/bad-habits\">Bandcamp</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/bad-habits/1351998056?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/7CDbqmBgq2aWHrJtetwdtI\">Spotify</a></li>\n</ul>\n<h2>Wide Awake! by Parquet Courts</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAgMG/8QAJhAAAgEDBAEDBQAAAAAAAAAAAQIDAAQRBRIhMUETFCIGUYGx0f/EABkBAAIDAQAAAAAAAAAAAAAAAAUGAQIDBP/EACMRAAECBQQDAQAAAAAAAAAAAAECAwAEESFBEjFRYQWBoeH/2gAMAwEAAhEDEQA/AICKryHfjAwMkZx9z+q13Nivqu0rSRsjbABKRu85Cg9c1Ua5PrfsLk6R6CKqhkcYkdyexg4VQPJOeOhWFzrP1DfzxTag9mkURjZRBbcvbsQCQS2QQfBGefxQNpBLo1miL3z1bvbqKTk6FurmGXSFE7Y4HymPyyCLCMR7nU859Vj/AGlSkUc/Ed+BSorDjJMzK5dC3HSCQDsnPqOavLW595Kyapfx5ckKrrgZPQ+PQq9jlkjtIt0hkYoMs4GScd8YpSt3QNIgL5Jltba1qSCeaXiUBgADxSlK54b4/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/parquet-courts-wide-awake-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/parquet-courts-wide-awake-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/parquet-courts-wide-awake-320.jpg, /blog/new-albums-2018-05-18/parquet-courts-wide-awake-640.jpg 2x, /blog/new-albums-2018-05-18/parquet-courts-wide-awake-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/parquet-courts-wide-awake-320.jpg\" alt=\"Wide Awake! by Parquet Courts\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=eZXS8Jpkiac\">Wide Awake</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/wide-awake/1342585603?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/5uTI2HcpAywDP8Vo1DpJta\">Spotify</a></li>\n</ul>\n<h2>Happy Ending by Wax Idols</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAlEAACAQQCAQQDAQAAAAAAAAABAgMABAUREiEGFCIxYRMVUUH/xAAYAQACAwAAAAAAAAAAAAAAAAAEBgIDBf/EACURAAIBAwALAQAAAAAAAAAAAAECAAMFEQYhIjEyUXGBodHw8f/aAAwDAQACEQMRAD8Arc/Ln7nyXIfjzqwwy3bpHDHlQCg5aC8AdjQ74/NX+Kx93bSzWUGXvZbuOeMT+ukLxSkjl7B2dcOR30ehuoq4aHyHyi+V8Z+tkgkE1xcepZXLN8Nr41rvY+u60eYhx3BbeWfIObaxnZJ4QA0hVArcuu3A4j7BNSVjgMu/79h7ptMjcPPvr9SfDiJZk5l1TsgAjfX9pWW8UXNZPErcy38zEsVBZt9DWtUoxryoMzk0ZdlBLDzJmQxtvk9i65kgD3BiCQP8P9H0awPkE94c6mPbIXjWyRaUNLsqN/ApSrLiiqQVGILaarsMMxIBE63hESHF28MShY41CgClKUtVRhz1jvRJKAmf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/new-albums-2018-05-18/wax-idols-happy-ending-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/new-albums-2018-05-18/wax-idols-happy-ending-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/new-albums-2018-05-18/wax-idols-happy-ending-320.jpg, /blog/new-albums-2018-05-18/wax-idols-happy-ending-640.jpg 2x, /blog/new-albums-2018-05-18/wax-idols-happy-ending-960.jpg 3x\" src=\"/blog/new-albums-2018-05-18/wax-idols-happy-ending-320.jpg\" alt=\"Happy Ending by Wax Idols\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<ul>\n<li>Music video for <a href=\"https://www.youtube.com/watch?v=Ps0QOAiXY3M\">Mausoleum</a></li>\n<li><a href=\"https://waxidols.bandcamp.com/album/happy-ending\">Bandcamp</a></li>\n<li><a href=\"https://itunes.apple.com/at/album/happy-ending/1357550546?l=en\">Apple Music</a></li>\n<li><a href=\"https://open.spotify.com/album/46zJq4vNTm2676b86ynOPQ\">Spotify</a></li>\n</ul>",
            "url": "/blog/new-albums-2018-05-18/",
            "title": "New Albums on May 18, 2018",
            "date_modified": "2018-05-18T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/night-owl-itermcolors/",
            "content_html": "<p>When I saw <a href=\"https://twitter.com/sarah_edo\">Sarah Drasners</a> <a href=\"https://github.com/sdras/night-owl-vscode-theme\">Night Owl theme for Visual Studio Code</a> I immediately fell in love with the colours and I created a color scheme for <a href=\"https://www.iterm2.com/\">iTerm2</a>.</p>\n<p>Here is a quick preview:</p>\n<video src=\"/blog/2018-05-22-night-owl-itermcolors/nightowl-itermcolors.mp4\" autoplay loop>\nSorry, your browser doesn't support embedded videos. However, you can <a href=\"/blog/2018-05-22-night-owl-itermcolors/nightowl-itermcolors.mp4\">download the video</a>.\n</video>\n<p>You can download <a href=\"https://files.florian.ec/night-owl.itermcolors\">Night Owl for iTerm2</a> and it is also on <a href=\"https://github.com/florianeckerstorfer/night-owl-itermcolors\">Github</a>.</p>",
            "url": "/blog/night-owl-itermcolors/",
            "title": "Night Owl for iTerm2 🌃",
            "summary": "I made a theme based on Night Owl for iTerm2.",
            "date_modified": "2018-05-22T23:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/rollup-scss-css-modules/",
            "content_html": "<p><a href=\"https://github.com/css-modules/css-modules\">CSS Modules</a> are a great way to locally scope CSS to a specific component. Unlike with some CSS-in-JS solutions you are writing normal CSS and then import it in your component. For example,</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token comment\">/* Button.css */</span>\n<span class=\"token selector\">.button</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> teal<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Button.js</span>\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> css <span class=\"token keyword\">from</span> <span class=\"token string\">'./Button.css'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&#x3C;</span>button className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>css<span class=\"token punctuation\">.</span>button<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>When building your application the generated CSS would look like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.Button_button__3_Ozh</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> coral<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This also works with Sass and SCSS files and there is a lot of documentation on how to set up <a href=\"https://medium.com/@kswanie21/css-modules-sass-in-create-react-app-37c3152de9\">SCSS and CSS Modules with Webpack</a>. However, recently I wanted to use SCSS and CSS Modules in a library project which is bundled using <a href=\"https://rollupjs.org/guide/en\">Rollup</a>.</p>\n<p>I knew that people are using this combination of technologies and I even found some sample projects for this technology stack, but at first I couldn't figure out what they did in their configuration to make it work. The thing that I was missing was that <a href=\"https://www.npmjs.com/package/rollup-plugin-postcss\">rollup-plugin-postcss</a> also supports Sass and I just need to enable both modules and Sass to make everything work.</p>\n<p>Here is my final configuration:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// rollup.config.js</span>\n<span class=\"token keyword\">import</span> babel <span class=\"token keyword\">from</span> <span class=\"token string\">'rollup-plugin-babel'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> resolve <span class=\"token keyword\">from</span> <span class=\"token string\">'rollup-plugin-node-resolve'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> commonjs <span class=\"token keyword\">from</span> <span class=\"token string\">'rollup-plugin-commonjs'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> postcss <span class=\"token keyword\">from</span> <span class=\"token string\">'rollup-plugin-postcss'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> peerDepsExternal <span class=\"token keyword\">from</span> <span class=\"token string\">'rollup-plugin-peer-deps-external'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">input</span><span class=\"token operator\">:</span> <span class=\"token string\">'./src/index.js'</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token literal-property property\">output</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'comlib'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">sourcemap</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">file</span><span class=\"token operator\">:</span> <span class=\"token string\">'./dist/index.js'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">format</span><span class=\"token operator\">:</span> <span class=\"token string\">'umd'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">globals</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">react</span><span class=\"token operator\">:</span> <span class=\"token string\">'React'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token function\">peerDepsExternal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">postcss</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">extract</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">modules</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">use</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'sass'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">babel</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">exclude</span><span class=\"token operator\">:</span> <span class=\"token string\">'node_modules/**'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">commonjs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token literal-property property\">external</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'react'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'react-dom'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Everything in this configuration is pretty standard, except for the PostCSS configuration:</p>\n<ul>\n<li><code class=\"language-text\">modules: true</code> enables CSS modules for the bundle.</li>\n<li><code class=\"language-text\">use: ['sass']</code> tells the plugin to enable Sass support. You also need to install <code class=\"language-text\">node-sass</code> explicitly in the project</li>\n<li><code class=\"language-text\">extract: false</code> keeps the CSS in the JavaScript file. If you want to generate a separate CSS file you can set <code class=\"language-text\">extract</code> to <code class=\"language-text\">true</code> and Rollup would build a <code class=\"language-text\">index.css</code> file which is also put in the projects <code class=\"language-text\">dist/</code> directory.</li>\n</ul>\n<h2>Sources</h2>\n<ul>\n<li><a href=\"https://github.com/css-modules/css-modules\">CSS Modules</a></li>\n<li><a href=\"https://hackernoon.com/making-of-a-component-library-for-react-e6421ea4e6c7\">Making of a component library for React</a></li>\n<li><a href=\"https://medium.com/tech-grandata-com/how-i-set-up-a-react-component-library-with-rollup-be6ccb700333\">How I set-up a React component library with Rollup</a></li>\n<li><a href=\"https://www.npmjs.com/package/rollup-plugin-postcss\">rollup-plugin-postcss</a></li>\n</ul>",
            "url": "/blog/rollup-scss-css-modules/",
            "title": "Bundle Libraries With SCSS and CSS Modules Using Rollup",
            "summary": "In this article I am going to explain how to bundle a library (eg, of React components) with SCSS and CSS Modules using Rollup.",
            "date_modified": "2018-10-14T18:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/alfred-workflow-type-text/",
            "content_html": "<p>Occasionally I encounter a text field I can't paste text into. For example, some websites disable pasting into the <em>email confirmation</em> input field. This Alfred workflow takes the clipboard and types it into the currently focused text field using Apple Script. In addition you can also type the text in the Alfred window.</p>\n<video src=\"https://embed.florian.ec/alfred-workflow-type-text.mov\" autoplay loop>\n    Sorry, your browser doesn't support embedded videos. However, you can <a href=\"https://embed.florian.ec/alfred-workflow-type-text.mov\">download the video</a>.\n</video>\n<p>You can download the latest release from the <a href=\"https://github.com/florianeckerstorfer/alfred-type-text/releases\">releases page</a> on Github.</p>",
            "url": "/blog/alfred-workflow-type-text/",
            "title": "Alfred Workflow to Type the Text From the Clipboard Into an Input",
            "summary": "To circumvent input fields that don't allow pasting this Alfred Workflow types the text from the clipboard into the field.",
            "date_modified": "2018-10-16T20:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/costa-rica-photos/",
            "content_html": "<h2>Monteverde</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGA//EACQQAAECBQQDAQEAAAAAAAAAAAECAwAEBREhBhIxQRMiYZFR/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgMFAQT/xAAfEQACAQQCAwAAAAAAAAAAAAABAgADITEyBDNh0eH/2gAMAwEAAhEDEQA/AM9LM1mhVV0aYlksLIBW1LtBW4hNrDsD1B55MW6zWKxOVKjSs81L08vPNktElIWDfeojngAfCTbuMRS52fZm3WafUQxMFKUK2XCijODzYD+fYVeecTW5afQ4+tTT7ZT5M8k3sexcn9ELKhsxIpOWvj5Mjr1hxvWNWQ4reoPm5BJv+5hFfXMpv1XUSkqV7gEkEEkAA3vmECaoFp3rxmIE6akc8NZn0tJSkrGwqA9gknIi7qRBXSZppxalhptoJUbA48ecdwhBU9BNftYefUnanTatzFySTa5OScCEIRPfYyumon//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/015-960.jpg, /blog/costa-rica-photos/015-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/015-640.jpg, /blog/costa-rica-photos/015-1280.jpg 2x, /blog/costa-rica-photos/015-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/015-320.jpg, /blog/costa-rica-photos/015-640.jpg 2x, /blog/costa-rica-photos/015-960.jpg 3x\" src=\"/blog/costa-rica-photos/015-320.jpg\" alt=\"Porch in Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAwX/xAAqEAACAQMDAwMDBQAAAAAAAAABAgMABBEFEiEGFDEiQXEHE1EVI2GB4f/EABcBAQEBAQAAAAAAAAAAAAAAAAMCAAT/xAAbEQADAAMBAQAAAAAAAAAAAAAAAQIDETFRYf/aAAwDAQACEQMRAD8A2d89jqFv3EV/Ff4AzNaKImTzglffkckeKm+t9YatoUcsbardfbvHkt55FVAy4x+5GcZDZ4/kH881zmFw+uLBZQWrWLvtW4RSJFA9TE+cAeM8DwPNYrVdOue7vIbqUSmKZXi9W4MGbH9eRQRhmadpdDxzvb9Kjpv1VFvp9vDfPI86IFLy3W13HszBRgE/7SooUSOWWJ71rZ45GRkEOQSD5pXTv4Q4rfS59L2EL6fqNnIZJIv03ucs53b5GfPP4G0YHyeTzUt0jE04VlCghYzt99sseD880pUMXD08vqaJYeo9TVRkdw/J+aUpWY6P/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/016-960.jpg, /blog/costa-rica-photos/016-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/016-640.jpg, /blog/costa-rica-photos/016-1280.jpg 2x, /blog/costa-rica-photos/016-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/016-320.jpg, /blog/costa-rica-photos/016-640.jpg 2x, /blog/costa-rica-photos/016-960.jpg 3x\" src=\"/blog/costa-rica-photos/016-320.jpg\" alt=\"Banana tree in Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcFAgYI/8QAKRAAAQMDAwEIAwAAAAAAAAAAAQIDBAAFERIhMQYTFBYyQVFhcSKBkf/EABcBAAMBAAAAAAAAAAAAAAAAAAEDBAL/xAAcEQEAAwACAwAAAAAAAAAAAAABAAIREiEDMVH/2gAMAwEAAhEDEQA/AJzbUSWnm2XYzvc2wlvtEpJGvHJ9sHOfqvRfRM8w7bGQ45lPIT6geg3+KgUJ9biQpDaXHBgDWTpQr354rW6dmXBuS7JuM8uyPI0hCz2bYJ3ASNs5A3NT+Jry16k9L8lZRupZ/VDl0c8PXVuJBSVJDam1K31q32+xSuoSLlIMh3vMoNrz5UPrQMYHolWP3Sttj7C1Xsk4tkt8t6UL0ApBOlI3/orchyHUThHCjoU2F54IOPilKVcMiEycrolLc5wJB/LCjlR5IFKUpZ6lIuT/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/022-960.jpg, /blog/costa-rica-photos/022-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/022-640.jpg, /blog/costa-rica-photos/022-1280.jpg 2x, /blog/costa-rica-photos/022-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/022-320.jpg, /blog/costa-rica-photos/022-640.jpg 2x, /blog/costa-rica-photos/022-960.jpg 3x\" src=\"/blog/costa-rica-photos/022-320.jpg\" alt=\"Jungle in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFBv/EACgQAAIBAwMCBQUAAAAAAAAAAAECAwAEEQUSIQYxByIyUbETFEFxgf/EABcBAQADAAAAAAAAAAAAAAAAAAIAAQP/xAAYEQADAQEAAAAAAAAAAAAAAAAAARExIf/aAAwDAQACEQMRAD8Av8Eet7bTej7PTbq0O0XDxJLHIvLM5xuXuMnAyM1xHjne293q9v8ARt47dlMhYmRnlkdsZLMeMewrj9B1J7XQdQjES7ZpjvB9QOMjb+sfFQ9RSJNdxpDuKxoMkk+ogcnJPPbNBu8DK6Y5ZoCYyCpHcUq+IwlAZJsN7FA+P7SpRU0dEQfZIefNdnjPA7j4qaGKNtTnjZAUEjjBJ/GQPilKDelrGZbL5jhmA9gaUpWoVh//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/024-960.jpg, /blog/costa-rica-photos/024-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/024-640.jpg, /blog/costa-rica-photos/024-1280.jpg 2x, /blog/costa-rica-photos/024-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/024-320.jpg, /blog/costa-rica-photos/024-640.jpg 2x, /blog/costa-rica-photos/024-960.jpg 3x\" src=\"/blog/costa-rica-photos/024-320.jpg\" alt=\"Jungle in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwME/8QAJxAAAQMCBQMFAQAAAAAAAAAAAQIDBAARBRIhMUEUIlEGMmFxgZH/xAAXAQEBAQEAAAAAAAAAAAAAAAACAwAE/8QAIBEAAgEDBAMAAAAAAAAAAAAAAAERAgMSEyEiUTHh8P/aAAwDAQACEQMRAD8AyNlyI20wuIh9p0DPkbOZKVcZgfd9f2rTg/qN2XIRF6x9t0A3RJSTsLm44J8fg4qBwmYwxJf6UqcDTCVEO+4kqAUEq43HmvFiceQuTJxJ2M0ylVirIbAWFri+gJoPJ1xjt2Qdu3p5OrlPj2avhroeihcuLJadue1xrW35Ssza9cTcLT00ZLclgAFtxxJzZSBofkbUrQ+iat1/MpyXV93cdRUhOxebiESM1MfU60yciEHbYanyfmlKcwdLRyU0lR7teNaUpSBJ/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/033-960.jpg, /blog/costa-rica-photos/033-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/033-640.jpg, /blog/costa-rica-photos/033-1280.jpg 2x, /blog/costa-rica-photos/033-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/033-320.jpg, /blog/costa-rica-photos/033-640.jpg 2x, /blog/costa-rica-photos/033-960.jpg 3x\" src=\"/blog/costa-rica-photos/033-320.jpg\" alt=\"Flower in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcGBf/EACkQAAEDAwMDAgcAAAAAAAAAAAECAwQAESEFBhIiQVETYQcUMTJxgbH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/xAAXEQEBAQEAAAAAAAAAAAAAAAAAAREh/9oADAMBAAIRAxEAPwDEbSkw39QaTGkPtQ3nWhIU4OamUoHMpTYZyFEfrvVd+J2laY7sRya0t1UiMlDzPququlHIXABOMWx5HaoDt2a7BhhrkAFLL9lDwhQB9/ure7l3Qt/bBjIkoU642WnkudK04zf39qzuSsbJU0iy4gLxloCnVOqVcDsaVyGnE9fNDSyVHKwSf7Si2ddnQHlfMRUWT9Enla5HWnzWl1yO1M06dIfQC616hSRjIJANh+KUqkT9u4QmxIvnFKUor//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/036-960.jpg, /blog/costa-rica-photos/036-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/036-640.jpg, /blog/costa-rica-photos/036-1280.jpg 2x, /blog/costa-rica-photos/036-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/036-320.jpg, /blog/costa-rica-photos/036-640.jpg 2x, /blog/costa-rica-photos/036-960.jpg 3x\" src=\"/blog/costa-rica-photos/036-320.jpg\" alt=\"Jungle in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAwb/xAAoEAACAQMDAgUFAAAAAAAAAAABAgMABBEFEiExQQYTFGGhIiNRcZH/xAAZAQACAwEAAAAAAAAAAAAAAAACAwABBAX/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQIDERITMUH/2gAMAwEAAhEDEQA/AI+DfWupTidV3ZMZ3/UpPT5rje6TLLOs8MDR2TpuVlO4DB28kkdSD71vaZrUDqJN6+pBP3Sm7aSO4P5rW9ZPBeG4N35UHlBIWjhVwpyCxVTnHfjrzQu19EcdVsydM7QsUuTNvHQK5GBSqQovbp5GlinunVypkSKMA9+c9+aUabwI5okwgkYTuB0JHHxXuPDMskum3JkckqjkexXbg/vk/wBpSk2Gnw0GLSEF5JCQABhyvGPbFKUq0cqxtTeD/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/037-960.jpg, /blog/costa-rica-photos/037-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/037-640.jpg, /blog/costa-rica-photos/037-1280.jpg 2x, /blog/costa-rica-photos/037-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/037-320.jpg, /blog/costa-rica-photos/037-640.jpg 2x, /blog/costa-rica-photos/037-960.jpg 3x\" src=\"/blog/costa-rica-photos/037-320.jpg\" alt=\"Fallen tree in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUEBgf/xAAnEAACAQMDAwQDAQAAAAAAAAABAgMABBEFEiEHMUEGImGBUXGhov/EABcBAQEBAQAAAAAAAAAAAAAAAAQCAQP/xAAfEQACAgIBBQAAAAAAAAAAAAAAAQIDESESIjE0UXH/2gAMAwEAAhEDEQA/APJVlumuotCtoEkiSUYgB9kowCH3YyAe/wCqperNPjs9OcyGNrhiDlECgH4+B4zW3pfFHeTPcS7XuLRDAJAc5QnI/nGfxWLqNdrwiKWDPznsB4H3iiW2yleq12OE1tJHIwo0QZQy5DHO4AnNKpWSRX1sktxp1xeyAbS8IZVXHZfavJ+TzzSm8S9ei70jdkt9ddThhGmP9Vz/AKq1W6OoXtoGQRJJgYUZ4A8/VKUKvyJfDWuokWl9dww7YbmaNck7VcgZpSlMyysI/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/048-960.jpg, /blog/costa-rica-photos/048-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/048-640.jpg, /blog/costa-rica-photos/048-1280.jpg 2x, /blog/costa-rica-photos/048-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/048-320.jpg, /blog/costa-rica-photos/048-640.jpg 2x, /blog/costa-rica-photos/048-960.jpg 3x\" src=\"/blog/costa-rica-photos/048-320.jpg\" alt=\"Leaf in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBwj/xAAsEAABAwIEBQEJAAAAAAAAAAABAgMEABEFBhMhBxIxUWGBFBUiMkFCUnHw/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIE/8QAIxEAAgECBAcAAAAAAAAAAAAAAAEDAhEEEjFBEyEiMlGxwf/aAAwDAQACEQMRAD8AouFWcWIHCN2W6ptSsKYUotEcpV1tv9SVetQuSs5vZlzpOXiqm0KmtFsabf3AAjYbn5AD4FYfC0oxbL2IYHOUtuG4FOuyTuGWwm4ABNh8QBv4PesDIU2PhmcG3JJWV6jjTeiAErKkqQLEkcvW4NA1fXYumTJG1bXf4ej3fd8lWsJMhZWNwh0JCD+Nrf16VzdU98BCorUBbSkgjU5UqG1twb9r/s0oXiF49GTiI5vkWQ/Gi4uqO8tvVhuIWBaxCb2G48VX5ShxXMEjYl7O2mVppKSBcJttsDftelK2xdzJmJeW45LlOvLdcQpRBs2opG4B6etKUoa11MKlcj//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/068-960.jpg, /blog/costa-rica-photos/068-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/068-640.jpg, /blog/costa-rica-photos/068-1280.jpg 2x, /blog/costa-rica-photos/068-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/068-320.jpg, /blog/costa-rica-photos/068-640.jpg 2x, /blog/costa-rica-photos/068-960.jpg 3x\" src=\"/blog/costa-rica-photos/068-320.jpg\" alt=\"Flower in Bosque Eterno de los Niños near Monteverde, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>La Fortuna</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAwX/xAAqEAABAwMDAgQHAAAAAAAAAAABAgMEAAURBhIhE1EHFDFxIjJhkaHB0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECBAP/xAAaEQADAQEBAQAAAAAAAAAAAAAAARECUQQS/9oADAMBAAIRAxEAPwC/x1syWEPRnW3mVjKXG1BSVD6EetdOmaiXg9rVu26HECY6rzkdxxQTIwCEADhCfVWP3Wtha3LlmlXpuDdFttAkIVHIW6AM/Cnt74pa5QGsu2obVZ5CGLlNajvLR1EpWeSnJGfuDSoVrKZM1zdUXVi52+wtIZSwmJcYwLvBJKsk8glRwRxxSh9Lo0Jda5LklRJw2tK1K3t/Nu75Oef4K9rTdmZvF6RDlPy0tPAlZbeKTkc57filKOW23TT0JZeZw0d10NaWp7rTZkbGztTuWFHHuQTSlKpiJqf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/074-960.jpg, /blog/costa-rica-photos/074-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/074-640.jpg, /blog/costa-rica-photos/074-1280.jpg 2x, /blog/costa-rica-photos/074-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/074-320.jpg, /blog/costa-rica-photos/074-640.jpg 2x, /blog/costa-rica-photos/074-960.jpg 3x\" src=\"/blog/costa-rica-photos/074-320.jpg\" alt=\"Arenal Volcano from La Fortuna, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYBAwQFCP/EACcQAAIBAwMCBgMAAAAAAAAAAAECAwAEEQUTMRJSBiEjMkHRUZHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/8QAHBEAAgICAwAAAAAAAAAAAAAAAAECESFRAxIT/9oADAMBAAIRAxEAPwDz5Lc4bEeNvtKgitlrbm8J2QySDzAVSVP0a5+l+HL24dXngZY+0sAW+hVxodibN/XYRxKmFSP28/j+1hvNIKXIo4RKRadfSQxbtvOzKvTlUzmlXb31vGxVyzEfIj5H7pVoH0ejIgRFBUHjPNdNrlxLbYELdOTilKBMkUrIy41m9EzjcBwccUpSmH6rR//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/079-960.jpg, /blog/costa-rica-photos/079-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/079-640.jpg, /blog/costa-rica-photos/079-1280.jpg 2x, /blog/costa-rica-photos/079-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/079-320.jpg, /blog/costa-rica-photos/079-640.jpg 2x, /blog/costa-rica-photos/079-960.jpg 3x\" src=\"/blog/costa-rica-photos/079-320.jpg\" alt=\"Frog near La Fortuna, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcEAwX/xAAoEAABBAIBAwMEAwAAAAAAAAABAgMEEQAFIRITMQYicQcVQYFRkbH/xAAZAQACAwEAAAAAAAAAAAAAAAAEBgECAwX/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIDETEFEyEy/9oADAMBAAIRAxEAPwDfH3USNK7Eh8MlR4KzQV8HPYb30JyUzACkF55QQLWKKaJ6wf1VebyT7eLDRu5Aj7FrsrIHUttw/NhKTxf+5zb0W5ckutwob8ntFFrZSSilcpIuuD/P94vW8Mp+t4ZzqpdX0s+FTkFIdUFu0ocEYycq3GxjKUzOiTFvo4KgAb/d8/OMouLtSBnXNvKRSd/6M0UeOdoxC7UlLhaSG3VoSBfkBJHu48+cT2fsUtUOO49IRKZQ+65LcU8tSr4sk810irvGMY3rIZPRvP0k9LbOpU5iU4+tKepQfKL9o/CaGMYyDZaP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/080-960.jpg, /blog/costa-rica-photos/080-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/080-640.jpg, /blog/costa-rica-photos/080-1280.jpg 2x, /blog/costa-rica-photos/080-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/080-320.jpg, /blog/costa-rica-photos/080-640.jpg 2x, /blog/costa-rica-photos/080-960.jpg 3x\" src=\"/blog/costa-rica-photos/080-320.jpg\" alt=\"Frog near La Fortuna, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIHCAb/xAAmEAABAwMCBQUAAAAAAAAAAAABAAIDBBESBQYHEzFRkRQhIjJh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQMC/8QAGREBAAMBAQAAAAAAAAAAAAAAAAESMRMh/9oADAMBAAIRAxEAPwC/2vBUYqmCXIxSxyBpscHA2PY2Watw8RNw62JYxP6Ojf7cinGNx2LvsfK5ij1Wt06cPo556aW97xuLcvCtz81OzX+bCiznRcWNy01O2KRtPOW9JHwDIj9sQizSTZU755MB8j0UmTyyRlr5HEAoijGspmpmbYZkoiIkv//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/090-960.jpg, /blog/costa-rica-photos/090-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/090-640.jpg, /blog/costa-rica-photos/090-1280.jpg 2x, /blog/costa-rica-photos/090-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/090-320.jpg, /blog/costa-rica-photos/090-640.jpg 2x, /blog/costa-rica-photos/090-960.jpg 3x\" src=\"/blog/costa-rica-photos/090-320.jpg\" alt=\"Arenal Volcano in La Fortuna, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Las Catalinas</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAQMFCP/EACYQAAIBAwMDBAMAAAAAAAAAAAECAwAEEQUSIQYxQRMUFVFCYcH/xAAYAQADAQEAAAAAAAAAAAAAAAABAgQAA//EABoRAAIDAQEAAAAAAAAAAAAAAAARAQJREhP/2gAMAwEAAhEDEQA/ALt+Tt920XEOfreKz8zaK4T3UW763CqB6Rj6j1iT05xcQxmIyLcJGjr+s88eakunPaaKHXqDV7e9d8BIlOGU8n8W7V2VE2SelsLg9znncKVA4bjp+SMOksO09szEf2lZV0buTzKup3dlbOtvO6Iy4ZQxAbxzjv3rRJcyFVYbVJ8KMAUpUIqOha6xfQRmOK4dUB4AJpSlACg//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/094-960.jpg, /blog/costa-rica-photos/094-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/094-640.jpg, /blog/costa-rica-photos/094-1280.jpg 2x, /blog/costa-rica-photos/094-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/094-320.jpg, /blog/costa-rica-photos/094-640.jpg 2x, /blog/costa-rica-photos/094-960.jpg 3x\" src=\"/blog/costa-rica-photos/094-320.jpg\" alt=\"Beach in Las Catalinas, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUHBP/EACYQAAEEAQQCAAcAAAAAAAAAAAEAAgMEEQUGEjEhQRMyUWFxkaH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQP/xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAMAwEAAhEDEQA/ANhq3YZq0dmtNBLA4ZbJHM1zSPzlUI7RPZ4jH0WAs29oQDIL2r3K9t7QDGyRgHfQPHHg/dVqehVKVUMg3VuetEHciIJg5oI9+AlLaGWNgc+YucWSycSfTgEWTHSPiOL2783CQ48si0wfzAx+kVTUeWtGxnMAl2T8xzn17VGvmBwERLQRkgddIiMbV2wwxWI2ySxMLz2cIiJg/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/102-960.jpg, /blog/costa-rica-photos/102-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/102-640.jpg, /blog/costa-rica-photos/102-1280.jpg 2x, /blog/costa-rica-photos/102-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/102-320.jpg, /blog/costa-rica-photos/102-640.jpg 2x, /blog/costa-rica-photos/102-960.jpg 3x\" src=\"/blog/costa-rica-photos/102-320.jpg\" alt=\"Beach in Las Catalinas, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.5625%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwUI/8QAJhAAAgICAAQGAwAAAAAAAAAAAQIDEQAEBhIhIgUTMXGBwRZhYv/EABYBAQEBAAAAAAAAAAAAAAAAAAACAf/EABgRAQADAQAAAAAAAAAAAAAAAAABESEC/9oADAMBAAIRAxEAPwC0eL8DjRg2NiA7jxj05hCvtSgEn5r4zCuITIsuuZdcRz0AOViokUWASD0Bvp0z0RuR7uxCwWVRO3QGZQ9X/NjK9+Ga0m/LP4q+rsMwFp5Qh7gbskXf1lRzWpqGFRHX7xsRM0qtysVJIsfuuuM3t+FuH05QfDNdhVgmRj94zaMdLzGbaZeYqFF9pq/fIUWzIzJZB7qxjKYlK5Cj0PvjGMD/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/103-960.jpg, /blog/costa-rica-photos/103-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/103-640.jpg, /blog/costa-rica-photos/103-1280.jpg 2x, /blog/costa-rica-photos/103-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/103-320.jpg, /blog/costa-rica-photos/103-640.jpg 2x, /blog/costa-rica-photos/103-960.jpg 3x\" src=\"/blog/costa-rica-photos/103-320.jpg\" alt=\"Iguana on the beach in Las Catalinas, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcEBQYI/8QAKxAAAgEDAgQDCQAAAAAAAAAAAQIDAAQRBQYSEyExB2GRFCIjQWJygaHB/8QAFgEBAQEAAAAAAAAAAAAAAAAABQQG/8QAHREAAgMAAgMAAAAAAAAAAAAAAAECAxIRIjEyUf/aAAwDAQACEQMRAD8Aq1luC6Eqxj2CSLGAzK0ePM981tnmUoxF5aDmLj4cQXB8j1PqKl1hqt1JgrFD+TWJuneer6Da8Vnoc187ITxRIeWn3HGfQUXqLllCs6OFooMr3AkI5CHHTJm7/qleeX8Ztxg4bRrEN8/dkH9pVqrnx4JXZAoOi3bNgGOLp9NdPNIXsXDBcFT2FKVnr/ca+Eb1ONFvZQFAANKUrR1t5QZNdmf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/108-960.jpg, /blog/costa-rica-photos/108-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/108-640.jpg, /blog/costa-rica-photos/108-1280.jpg 2x, /blog/costa-rica-photos/108-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/108-320.jpg, /blog/costa-rica-photos/108-640.jpg 2x, /blog/costa-rica-photos/108-960.jpg 3x\" src=\"/blog/costa-rica-photos/108-320.jpg\" alt=\"Sunset at Las Catalinas, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwIE/8QALBAAAQMCBAMHBQAAAAAAAAAAAQACAxESBAUGISIxYQcTFBYjUdFBYoGxwf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBQH/xAAfEQABAwQDAQAAAAAAAAAAAAABAAIDERITMRQiUZH/2gAMAwEAAhEDEQA/ANDkyFwPCCuG5EJH2yi37gFBy6/x4a4M8IJKbXNNP2oB+udZSvaIZ8tYKc2RfX81VNwnaNKO3ATtXvy8BtY89QR/UWb4ntK1thZnRSZXgpSOUjWVuHvs4BEnNL4U/FF6PoVOnnmdNJ6rgA63anT5XiObYvDvkEbxwEAEj3NERA6R/GBqdBEI2mUCikZ89xkQjp3ZuZcat6n4RESYpX2DsVr4mXHqF//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/109-960.jpg, /blog/costa-rica-photos/109-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/109-640.jpg, /blog/costa-rica-photos/109-1280.jpg 2x, /blog/costa-rica-photos/109-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/109-320.jpg, /blog/costa-rica-photos/109-640.jpg 2x, /blog/costa-rica-photos/109-960.jpg 3x\" src=\"/blog/costa-rica-photos/109-320.jpg\" alt=\"Beach in Las Catalinas, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Nosara</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgED/8QAKhAAAgECAgcJAAAAAAAAAAAAAQIAAwQRIQUSIjJBUWETFTRxkaHS4eL/xAAYAQACAwAAAAAAAAAAAAAAAAADBQABBP/EABgRAAMBAQAAAAAAAAAAAAAAAAABAgQU/9oADAMBAAIRAxEAPwDd3Nna3SL2WjxR1CNx83HL7lPd6PoopQW5LcWcnLywkxbS4ZEPel62AyJWl8J00KyHxL1F5VAAfYQkakgF5mzNvosljsxLutSudfZKkdH/ADE0d8gOGz2sqrap4YSVUcnDrERKhwyOz57q+kREoh//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/114-960.jpg, /blog/costa-rica-photos/114-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/114-640.jpg, /blog/costa-rica-photos/114-1280.jpg 2x, /blog/costa-rica-photos/114-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/114-320.jpg, /blog/costa-rica-photos/114-640.jpg 2x, /blog/costa-rica-photos/114-960.jpg 3x\" src=\"/blog/costa-rica-photos/114-320.jpg\" alt=\"Beach in Nosara, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIGBwEF/8QAKRAAAQQAAwYHAQAAAAAAAAAAAQACAwQRITEFBhIiQVEHEyNCcXOBwf/EABYBAQEBAAAAAAAAAAAAAAAAAAACA//EABkRAQEAAwEAAAAAAAAAAAAAAAABEhNR8P/aAAwDAQACEQMRAD8A3PyS0jib+HqpuBcwtETGjvhmsGi2N4h2ZK8kjbkdiu4mF77bTwcQwPuOWGWiu+79ff2oZXWWUpi8DOe05w1JxAGhOPxko3TiMa0ExaenGMupRVsTb3Ec1PY5P3yD+Im6elMa98EjQldJIw5iiLJuiXHuUREH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/115-960.jpg, /blog/costa-rica-photos/115-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/115-640.jpg, /blog/costa-rica-photos/115-1280.jpg 2x, /blog/costa-rica-photos/115-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/115-320.jpg, /blog/costa-rica-photos/115-640.jpg 2x, /blog/costa-rica-photos/115-960.jpg 3x\" src=\"/blog/costa-rica-photos/115-320.jpg\" alt=\"Beach in Nosara, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAEFAAAAAAAAAAAAAAAAAAYBAwQFB//EACYQAAEEAgECBgMAAAAAAAAAAAEAAgMRBAUSIVEGExYxgZEiQWL/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAT/xAAaEQADAAMBAAAAAAAAAAAAAAAAAQIDERIi/9oADAMBAAIRAxEAPwDqOx3Wu10U0mTlgCIAvawF7hZr2Cv6TZ4m5whlYEpfFZaQ5tOBH6IUL9MbLHYWMw4pIgSWDnZbffr1+Vk+G8XbaZs8bNePLleH1HyIb397+EUZqdelpFWFJbTJ1xP8/SKONyN3ycXR9L/GsVwofZRN2g+Gb5A911aIs45Xm7uURFEf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/116-960.jpg, /blog/costa-rica-photos/116-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/116-640.jpg, /blog/costa-rica-photos/116-1280.jpg 2x, /blog/costa-rica-photos/116-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/116-320.jpg, /blog/costa-rica-photos/116-640.jpg 2x, /blog/costa-rica-photos/116-960.jpg 3x\" src=\"/blog/costa-rica-photos/116-320.jpg\" alt=\"Beach in Nosara, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBAf/xAAlEAACAQMCBgMBAAAAAAAAAAABAgMABBEFIQYSIjFBUQdhkRP/xAAYAQACAwAAAAAAAAAAAAAAAAABAwACBP/EAB0RAAICAQUAAAAAAAAAAAAAAAABAhEhEhQxQVH/2gAMAwEAAhEDEQA/AKPWflNbnQFisoTHqbkJIXTMaAjJxvn0PomvLLniXV1VrdNTvIJYyTFl2URncHP2cn9FcC6nbzxSw2aMZpjlTvnAGGDZ8g+akr+6uI76dnBH8wCFbc9x39jvWSOubywV6W1xqyXLLJcXqNMVAbLcpBHggmlREUr3TSSxw9LNnqZV3wPHqlL26XYKKnjOSSKKERyMnPEHJG25INZOr24i0+3nZ3le4dg4kORt6/KUp0MQVEfBgTTPDIUhJjTvyqTilKU9LBZH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/119-960.jpg, /blog/costa-rica-photos/119-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/119-640.jpg, /blog/costa-rica-photos/119-1280.jpg 2x, /blog/costa-rica-photos/119-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/119-320.jpg, /blog/costa-rica-photos/119-640.jpg 2x, /blog/costa-rica-photos/119-960.jpg 3x\" src=\"/blog/costa-rica-photos/119-320.jpg\" alt=\"Beach in Nosara, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHAQMG/8QAJhAAAQMDAgUFAAAAAAAAAAAAAQACAwQFERIhBjFBUdEUFSKh4f/EABYBAQEBAAAAAAAAAAAAAAAAAAIAA//EABcRAQEBAQAAAAAAAAAAAAAAAAEAAhH/2gAMAwEAAhEDEQA/ALibEFvZEMbhRF5uNbBRPNniopqwkBolqG6AOpOCuU9x4/Jc4ixxgnIaw68Dsd/tN02JmshjIw0DQHHvqRVrHdePdPzhtGrPQfqI9ZU/S2eklcGva7k7fO+ykKGxW/18kD4dbWMa4Fx33z4REtLWQsV1qoIagsbSRkADmXeUREOtcL//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/121-960.jpg, /blog/costa-rica-photos/121-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/121-640.jpg, /blog/costa-rica-photos/121-1280.jpg 2x, /blog/costa-rica-photos/121-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/121-320.jpg, /blog/costa-rica-photos/121-640.jpg 2x, /blog/costa-rica-photos/121-960.jpg 3x\" src=\"/blog/costa-rica-photos/121-320.jpg\" alt=\"Beach in Nosara, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 149.6875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgMFCP/EACgQAAECBQQBAwUAAAAAAAAAAAECAwAEBREhBhIxQWEHFFEkMnGB0f/EABYBAQEBAAAAAAAAAAAAAAAAAAMCBP/EABsRAAICAwEAAAAAAAAAAAAAAAABAxECElEx/9oADAMBAAIRAxEAPwCxdRagNEp4dmn1sNqJSlMs0FrOM7RwLc3OB5jTp/WMjWGxIyU5NpnU2KfcN7isfG5OD3g2jPVsmyKQ66+QVJ+xJNysd2HZAzj4iO6CkGJ958sutqCE7Sptsp54Ge/5BSZtSKh448XC2/SwFJml7fqA3YAbQ2kj9QjlK0nKFRJ2EnJuiEJu+GbU8l1bVdcqVaRVZypTK51pRU0vebN+EjgDx33E+9PdRVWsCYcqM668W1gIF9oTjkWtnzCEMkrLt1RYNH1dWTTmVKmt6lAklaQTzbv8QhCK1XCT/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/124-960.jpg, /blog/costa-rica-photos/124-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/124-640.jpg, /blog/costa-rica-photos/124-1280.jpg 2x, /blog/costa-rica-photos/124-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/124-320.jpg, /blog/costa-rica-photos/124-640.jpg 2x, /blog/costa-rica-photos/124-960.jpg 3x\" src=\"/blog/costa-rica-photos/124-320.jpg\" alt=\"Selfie on the beach in Nosara, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Montezuma</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.5625%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAMAAwAAAAAAAAAAAAAAAAIDBAUGB//EACgQAAICAQQBBAAHAAAAAAAAAAECAwQRAAUhMQYSFEFREyIjM0Jhcf/EABkBAAIDAQAAAAAAAAAAAAAAAAEEAAIDBf/EABwRAAICAgMAAAAAAAAAAAAAAAABAhEDURMhMf/aAAwDAQACEQMRAD8A6pu5l3z220bVFZlgN2SSWaeJmdh16vQuCR2cj7HWsvlEMkdezUmryQe2CSqhiELO5/LllHHI6x9dkk69M8StVqN17ssoaOfKySKMR5BAyGIBK9fGNW+VWqDeU7RY3IU1jWKeQSswIZB+2cfyIY5x/p0VVC+KlC0vDGlSWjSo069yKua9dEkjIyQ+Mno8d9aaqSeagvppvYmWUmd5ihYys3JY46PQx/Wmha0W5dIlW2ao5YSB3Vo1yruWUjPC4PGB2B8ahc26tYqsksan8CP9I+kAxgNwqnHAGSQPvTTUHEkcvsvj20Wtsha1t9eZ1BUMy84z8477OmmmsZPs58m7P//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/127-960.jpg, /blog/costa-rica-photos/127-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/127-640.jpg, /blog/costa-rica-photos/127-1280.jpg 2x, /blog/costa-rica-photos/127-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/127-320.jpg, /blog/costa-rica-photos/127-640.jpg 2x, /blog/costa-rica-photos/127-960.jpg 3x\" src=\"/blog/costa-rica-photos/127-320.jpg\" alt=\"Armadillo near Montezuma, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAwj/xAAlEAACAQQBAwQDAAAAAAAAAAABAgMABAURMQYSIQcVIkFCkcH/xAAWAQEBAQAAAAAAAAAAAAAAAAADBAL/xAAYEQEBAQEBAAAAAAAAAAAAAAAAAQISEf/aAAwDAQACEQMRAD8AoWf6lGEtcfLd28im5cI4YgCEa2zE8eNVq+5bjBU7UjYI+xXkfLZjI3+XmvJpLiQSSNKYpHZ1AY7K+fr+VSukPUDM5DL2tveWtuLF1COFXsECj8tnkcVuUdlizG/JPNKxBdRsAyyJojYO+aUnMH1U1itUmjXZZdEj4+K729lFDNG697FOO5tj9UpU2Vemg0770NAClKU4vH//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/129-960.jpg, /blog/costa-rica-photos/129-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/129-640.jpg, /blog/costa-rica-photos/129-1280.jpg 2x, /blog/costa-rica-photos/129-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/129-320.jpg, /blog/costa-rica-photos/129-640.jpg 2x, /blog/costa-rica-photos/129-960.jpg 3x\" src=\"/blog/costa-rica-photos/129-320.jpg\" alt=\"Montezuma, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAYHCAX/xAAoEAABAwQBAgUFAAAAAAAAAAABAgMEAAUREgYhQQcTIjGBFVFxodH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAZEQEBAAMBAAAAAAAAAAAAAAABAAIRITH/2gAMAwEAAhEDEQA/AKgn3l1+U3MkOpKljX0JGEAYAx8Vorwq5yxfXPpbLIZajRm9N15WtWPWfx9h2rNcizTnCylLKtO5HbOMCra8ILVG4lcFXnkNzgsLksmO0wFFSkKJHUkZGNR/aOKejFxdWg/NFK40C9W64Rw/CmMPNE43SsYz80q3IdoG5xi3ut6EyACnXo6c9O+T3qIczt7VlEZEJa/L1XlDmFBRJ9ySM/ulKiBaN8omXTDddZQhpxKVZCnW0rV1APuRSlKrC//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/134-960.jpg, /blog/costa-rica-photos/134-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/134-640.jpg, /blog/costa-rica-photos/134-1280.jpg 2x, /blog/costa-rica-photos/134-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/134-320.jpg, /blog/costa-rica-photos/134-640.jpg 2x, /blog/costa-rica-photos/134-960.jpg 3x\" src=\"/blog/costa-rica-photos/134-320.jpg\" alt=\"Beach in Montezuma, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 133.4375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGCAUH/8QAJBAAAgEEAgEFAQEAAAAAAAAAAQIDAAQFEQYSYRMhIjFBofD/xAAYAQACAwAAAAAAAAAAAAAAAAABAwACBP/EABkRAAMBAQEAAAAAAAAAAAAAAAABEWEiI//aAAwDAQACEQMRAD8Ar+E5NYWXMMHcG6lLJ2juHA7Lr1WKhRv90v8AtVauC5Pidnmc8QzJZyypdPNOWOyJH6qV/Nff7WfIZWhug0p9z8ho7qachOSzJIyqSASm9ed+aFYDSHGEwVrh0EWXggjklmdFubaNnK+qwB+Q3rQH3Ss1XE0LsCHl9hokHezv7+6UUyx1OH28LvkbyaJJpLOFZIkkG07FwNkfteo8AzF5l481b3LokUXXoIkC9fH8pSl30Swk4b0k5HiuDvbj1rnGwNKVAZlHTt5IXQ35pSlPM1Z//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/135-960.jpg, /blog/costa-rica-photos/135-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/135-640.jpg, /blog/costa-rica-photos/135-1280.jpg 2x, /blog/costa-rica-photos/135-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/135-320.jpg, /blog/costa-rica-photos/135-640.jpg 2x, /blog/costa-rica-photos/135-960.jpg 3x\" src=\"/blog/costa-rica-photos/135-320.jpg\" alt=\"Drinking beer in Montezuma, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwgC/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQIDAAQRBQcSBhMhCFFxIjEyYYH/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/8QAFxEBAQEBAAAAAAAAAAAAAAAAAAFBMf/aAAwDAQACEQMRAD8AybozTX1HWrRHUKGcMwJweIOTj+Cr36gLG9lsNMv5nQwRHtqvHiQG+2P14qK2bHe65gDqWRYXYF/Y4Aq+b4zwx9K3Nq/1jKlDj8fIpsHNVK9yLxcg0qq3vZ/SoGne6Ly9w4wOQwPgYqT3h06KTRr4u8pIZB5I9/ilKzML1z12VLyA5OGIpSldEf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/136-960.jpg, /blog/costa-rica-photos/136-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/136-640.jpg, /blog/costa-rica-photos/136-1280.jpg 2x, /blog/costa-rica-photos/136-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/136-320.jpg, /blog/costa-rica-photos/136-640.jpg 2x, /blog/costa-rica-photos/136-960.jpg 3x\" src=\"/blog/costa-rica-photos/136-320.jpg\" alt=\"Waterfall near Montezuma, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Cabo Blanco Absolute Natural Reserve</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcDBQj/xAAqEAABAwMCAgsBAAAAAAAAAAABAAIDBAURMUEHEhMVISIjJFFhcZKTof/EABgBAAMBAQAAAAAAAAAAAAAAAAACAwEE/8QAGhEBAAIDAQAAAAAAAAAAAAAAAAIRATFRIf/aAAwDAQACEQMRAD8A6XCPiha4aKK1XmeRkzn92pceZmTs7cbeytLblRFoIrKcg6eIF4+t3D+8PBlj6KPBOY5i5hHb8Ef1VWw2Opp4oI57vTtkAAeAHOC2PuyVLGsLR1pRnPmoPuEU9bY8jJu8X5lFSo9LcuObHmOQ8r36DGTpot4Khz2MD2xuyMnLc7oig6GzOR7A4xsyfTKIiA//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/147-960.jpg, /blog/costa-rica-photos/147-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/147-640.jpg, /blog/costa-rica-photos/147-1280.jpg 2x, /blog/costa-rica-photos/147-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/147-320.jpg, /blog/costa-rica-photos/147-640.jpg 2x, /blog/costa-rica-photos/147-960.jpg 3x\" src=\"/blog/costa-rica-photos/147-320.jpg\" alt=\"Beach in Cabo Blanco Absolute Natural Reserve, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwT/xAAkEAACAQMDBQADAAAAAAAAAAABAgMABBEFITEGEiJBcRQkQv/EABgBAAMBAQAAAAAAAAAAAAAAAAECBAAD/8QAGxEAAwACAwAAAAAAAAAAAAAAAAECESEDBCL/2gAMAwEAAhEDEQA/AMA40tBeN0ubmCWSExMpJYFy48wW4BUbjnK+s1Ku4Zpb2ytIk/XUL2RAFQ7HHczH7uc852FRdO119PuYQ6ERxAxzRg4LjPIz/VbLqa6sx0rZ39hfGSRrkI5hbtZfAnyHonA2PsVHd3PNM480FSmtnKG3/IvNQSSB5WguDCTG4KDCqcL4HbelQNH157NbsNO4Mtw0p7hknIAySflKtXWjG0NlGaWWS8nuJbmRpJWBdnbliMc169QsIraeNIy5V07jk+6UrI5snpEGGSWz9pSlOkE//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/158-960.jpg, /blog/costa-rica-photos/158-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/158-640.jpg, /blog/costa-rica-photos/158-1280.jpg 2x, /blog/costa-rica-photos/158-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/158-320.jpg, /blog/costa-rica-photos/158-640.jpg 2x, /blog/costa-rica-photos/158-960.jpg 3x\" src=\"/blog/costa-rica-photos/158-320.jpg\" alt=\"Leaf in Cabo Blanco Absolute Natural Reserve\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAQFBgf/xAAnEAACAQMDAwMFAAAAAAAAAAABAgMABBEFEiEUMUEGE5EjUWHh8P/EABgBAAIDAAAAAAAAAAAAAAAAAAQFAAED/8QAIhEAAQMDAwUAAAAAAAAAAAAAAQACAxEhURIzoTJhkdHw/9oADAMBAAIRAxEAPwDkE+kGe2hcQwLZRbBdSxPzyRnaD5H9mppdFurHUo0iXqI3kOC6ELIqn7ZzjGPml9eQRXV49s++5lT24YlUTIxY4OWPkA8Yqq/fU7547qC0ezkgiaO9cFYSx43HnABwcY7nml7S+lzY5Tp4j1WBqMfeVDdaTpQuZo7m/Szljco0aIXHB7g55/VKwNwqtcS9MkvsbjsEnLBfGccZpRIidTrPCBdM0nbHPtV7yVinT6cqojq0fBB3HkfArZfShbV+si1B3nM6tKXZjkMoOCPGTgZyDSlYTbZPdGQbzRkKT1TM2masUsgscc0Uc5TuAzKM4/FKUq42NLQSFJJpGvIDjSuV/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/159-960.jpg, /blog/costa-rica-photos/159-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/159-640.jpg, /blog/costa-rica-photos/159-1280.jpg 2x, /blog/costa-rica-photos/159-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/159-320.jpg, /blog/costa-rica-photos/159-640.jpg 2x, /blog/costa-rica-photos/159-960.jpg 3x\" src=\"/blog/costa-rica-photos/159-320.jpg\" alt=\"Flowers in Cabo Blanco Absolute Natural Reserve\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Parque Nactional Manuel Antonio</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcFAgYI/8QAJxAAAgEEAQQCAQUAAAAAAAAAAQIDAAQFEQYSITFBE1EUFTJhkbH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAT/xAAfEQACAQMFAQAAAAAAAAAAAAAAAQIRIjEDBCFBUbH/2gAMAwEAAhEDEQA/AK1b8luQ6i9gsoEJ11C8B/1RutGxz9nMSPzYHfrcKPlU+GPqopmslhrKaAR3kl8Q5iVUIdmckDZGgo8ej9/VZ8fKLBchZQyQzxfJLsSLGh0VbbftJPb3T2PAKjNZPQn6vD6mj/sUqWWk4vIzJaZBEQHRVwoIPnw5BHYg6NKqQ9K/wnuUxmPl5NDHJYwdDOrAKCoXcjb0AR9a2dn+a5cz4zjsbhpsrixLY3NovVGIH0pPUO7A735pSssXcx9xxHSp2n9Z1vkvMMllMn8mSisLuSGJIUea0RmCBQQCSNnye52aUpSkf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/161-960.jpg, /blog/costa-rica-photos/161-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/161-640.jpg, /blog/costa-rica-photos/161-1280.jpg 2x, /blog/costa-rica-photos/161-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/161-320.jpg, /blog/costa-rica-photos/161-640.jpg 2x, /blog/costa-rica-photos/161-960.jpg 3x\" src=\"/blog/costa-rica-photos/161-320.jpg\" alt=\"Ferry to Punta Arenas, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHCP/EACkQAAIBBAECAwkAAAAAAAAAAAECAwAEBREhEjEGB2EIIlFxcqGx0fD/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwH/xAAYEQEBAQEBAAAAAAAAAAAAAAAAAQISMf/aAAwDAQACEQMRAD8A3/IX9rjbCe9v50t7WBS8krnhR8azvxV5zYDEwKcVvKTdRDBeqNEGuDsjnnXA9amvaHv8ogs7bGXs81ldxES2kC8DpYHqYjuCfxXP2TE9v7kiMraGyy9gT/c00bb5FlkvMfO5K7a5ORlj6uyh2IHy3Ss9XpYbZlH1Uo2s5dqZMCSBgw4qdu8ZaOjl4Y2Ou7Ip39qUq2Q0npMRZdR1BEPQRp+qUpTSf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/167-960.jpg, /blog/costa-rica-photos/167-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/167-640.jpg, /blog/costa-rica-photos/167-1280.jpg 2x, /blog/costa-rica-photos/167-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/167-320.jpg, /blog/costa-rica-photos/167-640.jpg 2x, /blog/costa-rica-photos/167-960.jpg 3x\" src=\"/blog/costa-rica-photos/167-320.jpg\" alt=\"Coast in Parque Nactional Manuel Antonio, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgcI/8QAKRAAAgEDAwMDBAMAAAAAAAAAAQIDAAQRBRIhBjFhEyJBBxRxgTNRkf/EABkBAAEFAAAAAAAAAAAAAAAAAAQAAQIDBf/EAB4RAAICAgIDAAAAAAAAAAAAAAABAhEDEiGBIjFx/9oADAMBAAIRAxEAPwDIWkb3kate25juDGA0ICjuO4BOTkHOfNV2nySRbrWOMoY3eZBIv8ic7TkfgirKS/SOJmUiK7KZErjKOFHfaMgsSTx8fPas7pv3Oj6oLi1uXkE0TJJ6ilWOfbgf2fx8Hms/G3K2+gRRu0zVx2t/HBElzZrNMF97pjkkk8+ef8xSpkGpdPmztmOq3EUpjHqxQxCVUbJGNxOScAH90qOud8uhUic2m20PRVvcRx7Zxcsm8cEhuMfrHFc26juZLnWxaybAka43IgDNk4JPnilKtwpb9D4l5r4ehfo/omlSdC2bHS7DeXfczW6OznPclgTnt4pSlGw5irCY+j//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/170-960.jpg, /blog/costa-rica-photos/170-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/170-640.jpg, /blog/costa-rica-photos/170-1280.jpg 2x, /blog/costa-rica-photos/170-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/170-320.jpg, /blog/costa-rica-photos/170-640.jpg 2x, /blog/costa-rica-photos/170-960.jpg 3x\" src=\"/blog/costa-rica-photos/170-320.jpg\" alt=\"Capuchin monkey in Parque Nactional Manuel Antonio, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGBAf/xAAoEAACAQMDAwMFAQAAAAAAAAABAgMABBEFEiExQWEUIlEGEzJCcZH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQT/xAAaEQADAQADAAAAAAAAAAAAAAAAAQIRAyFB/9oADAMBAAIRAxEAPwDIs1rc6i9quxxAWUyqcqwB529j3PnNd0tz6pYYtLiihRXDtcON+APGcdunzWLt/VNFHFORDtUqymLbgfwcdu1V7fXjZaVtuZfUxr7Ym2fbIUfoCPPOTk80XKwyTxb2zQPrhsGMcMtvhjvZpvzdj1J/ztxxSvLLu+F9dS3F0ZBI7Zwu3AHxzSqpZoUMqNdSi4YFtwRyo3ZPGcdTUi9YiV4wcRr0Xtk9T/aUpPwqLP09ottqNk8s7SqyyFfYwAxgH480pSmI/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/172-960.jpg, /blog/costa-rica-photos/172-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/172-640.jpg, /blog/costa-rica-photos/172-1280.jpg 2x, /blog/costa-rica-photos/172-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/172-320.jpg, /blog/costa-rica-photos/172-640.jpg 2x, /blog/costa-rica-photos/172-960.jpg 3x\" src=\"/blog/costa-rica-photos/172-320.jpg\" alt=\"Capuchin monkey in Parque Nactional Manuel Antonio, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEAwX/xAAqEAABBAECBAQHAAAAAAAAAAABAgMEEQAhMQUSIkETFFGRBhUjMlJhcf/EABYBAQEBAAAAAAAAAAAAAAAAAAQDAf/EAB4RAQACAgEFAAAAAAAAAAAAAAEAAhESIRMxQWGh/9oADAMBAAIRAxEAPwCUaU2JbroUtDCUh5Kd1G08gSoVpRB309LzdMV5NlUOOQ6CoEBSesWkEq22FKHtkwxOktyWmfC6loaKTooEcxNEep5ts9qI8/ClOrU4HUc5ZWo1XX1BOg7VX7vDrisNtg5nPi3w5xZ2apcSAqU2R9wcKQk/iNRfb3xmx/5UtwmbIlpeofTaNJbHZOoP9374yPU9fJm1PLJOHPlOy3j4qkgx+YhOllLdjXcUT2yp4VKXE83B5UPxzFal06myHOS7sUe3tjGMr2JSoFSZRwyNLKn5KVOOOdRJUQBY2AFaYxjJ2UWGtZy8z//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/175-960.jpg, /blog/costa-rica-photos/175-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/175-640.jpg, /blog/costa-rica-photos/175-1280.jpg 2x, /blog/costa-rica-photos/175-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/175-320.jpg, /blog/costa-rica-photos/175-640.jpg 2x, /blog/costa-rica-photos/175-960.jpg 3x\" src=\"/blog/costa-rica-photos/175-320.jpg\" alt=\"Sloth in Parque Nactional Manuel Antonio, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAQf/xAAoEAACAQMDAgUFAAAAAAAAAAABAgMABBEFEiEGEyJRcZGhFBUxQsH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAERAiH/2gAMAwEAAhEDEQA/APAY7VHuXiEsbICDuzkEkefvW56U0HR4p5PuqG9Ih7mxR2lQZwSzk5UjnAwSawc4UXkgj8QBCrtbOeK2/VaxaXplhoVratPcQjuXk6r+Z2UEpu8l4HqDTzZqajalrGjC/nWx6dtfp1cqjTXEzMw8z4h7UqElpG43TSujn9dgP9pS8PYtC0hsdekaBcCELKityA3PxxXNVmcybn8bSHvMWycsxJPzSlHTOoUkrdx/WlKULf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/176-960.jpg, /blog/costa-rica-photos/176-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/176-640.jpg, /blog/costa-rica-photos/176-1280.jpg 2x, /blog/costa-rica-photos/176-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/176-320.jpg, /blog/costa-rica-photos/176-640.jpg 2x, /blog/costa-rica-photos/176-960.jpg 3x\" src=\"/blog/costa-rica-photos/176-320.jpg\" alt=\"Waterfal in Parque Nactional Manuel Antonio, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>San Jose</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQHAgMF/8QAKBAAAgICAQMDAwUAAAAAAAAAAQIDEQQFABIhMQYTQRUWIlFxkaGx/8QAGQEAAgMBAAAAAAAAAAAAAAAAAwUAAQIE/8QAGxEAAwEAAwEAAAAAAAAAAAAAAAECERIhQVH/2gAMAwEAAhEDEQA/ALJi9b6HF1kWJA+LBGq+2IRbKq+PCj55G1+71kfp6XXa2XGixWVkQBXQKW71ZFd+VbvdVi/ar5Ry8iPNOLjFoQzqigubbsbVr7EV45lrtNJFspicyZVfChWP28t1puiK381d2L/f9eV4TDfJtkhkeOVoi6sQaQN/dG/8449QYGyG3yRrMSJsfrNMJkNm7+e98cBiNI6Bh+iYEUmvlnV1QxgtIWPSxs3fnxyNBtsp8IM5R1Kv+DL1J/B7fPHHE83Tlts5XT+kvTbeZ9fGyxxR2TYi6kB71dA1xxxxnF1xXYeW8R//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/178-960.jpg, /blog/costa-rica-photos/178-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/178-640.jpg, /blog/costa-rica-photos/178-1280.jpg 2x, /blog/costa-rica-photos/178-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/178-320.jpg, /blog/costa-rica-photos/178-640.jpg 2x, /blog/costa-rica-photos/178-960.jpg 3x\" src=\"/blog/costa-rica-photos/178-320.jpg\" alt=\"Templo de la musica in San Jose, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcGAv/EACgQAAEDAwIFBAMAAAAAAAAAAAECAxEABAUGIRITMVFxBxRBYVKBof/EABgBAAIDAAAAAAAAAAAAAAAAAAAEAQID/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAECIQMRExL/2gAMAwEAAhEDEQA/AKuc7b2pCFO80/iy0tSo7kAE/uuV6uxSWEvKvW0IUYAWFJM9iIkdO1Y1nS9xaWgY9k5eOKRC3jeOKJJABO8R02jYVjtVaayuOtXHHLm/SyJWRyi4EREAGdh5PzUPIg5spr/qNg2l8PvG3dp4mQpY8SPn6pUOx+m8y5apXb47KvNqJIWLEgHxJFKOiDwyoenuZvdQ4lacs6XuFXLJkpKht1itO3jbNkpeaZKXEEEHmLP8JpSl4WrNCfaq17ncbnrq0s3mW2WlcIBaCifskzSlKXlJ7dlGf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/179-960.jpg, /blog/costa-rica-photos/179-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/179-640.jpg, /blog/costa-rica-photos/179-1280.jpg 2x, /blog/costa-rica-photos/179-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/179-320.jpg, /blog/costa-rica-photos/179-640.jpg 2x, /blog/costa-rica-photos/179-960.jpg 3x\" src=\"/blog/costa-rica-photos/179-320.jpg\" alt=\"View from Museo Nacional de Costa Rica in San Jose, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYHBAX/xAAmEAACAQMDAwQDAAAAAAAAAAABAwIABAUREjETISIGQWGhFFFy/8QAGAEAAwEBAAAAAAAAAAAAAAAAAQMFAAL/xAAfEQEAAgEEAwEAAAAAAAAAAAABAAIRAxIxUZGh0fD/2gAMAwEAAhEDEQA/AK7C+tnWtoUZwOYYRHSeuBl1Pg+5P3+9eapc1nYYv03eZcJnKKbYuX2HkSPE6k6aakVjCb/KPW22iuLQs9ObCT5fz2049+K7ctHPRxtlaMuutYWq9zLaa9N4A1j89qwpnMLUUxMmZjc7lmMvp2rmTfIskxkxAzJOpl5dzqTzStIwd7csxy3pxc7tbyWh3X279TzoQT90pFtWw42/vEeaKnJ6+yvx9mt0ob5T03DsJdua9LNKDb9rDKQMwIkDjQD5pSqFqmeJOrZTmSmET+NirZC5z6ao7IgkdgOKUpXW2vUG+3c//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/181-960.jpg, /blog/costa-rica-photos/181-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/181-640.jpg, /blog/costa-rica-photos/181-1280.jpg 2x, /blog/costa-rica-photos/181-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/181-320.jpg, /blog/costa-rica-photos/181-640.jpg 2x, /blog/costa-rica-photos/181-960.jpg 3x\" src=\"/blog/costa-rica-photos/181-320.jpg\" alt=\"Street in San Jose, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwIF/8QAKBAAAQQBAwMCBwAAAAAAAAAAAQIDBBEABRIhBhNBIrEjMVFhgZLR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIDBP/EABoRAQACAwEAAAAAAAAAAAAAAAABQRESIfD/2gAMAwEAAhEDEQA/AL+x07oziQAZNefioFZOR05pEcb0vSAPNEK9sxqP107IfbMhmKoC0EglFD6qrm8tS5DU3TW3Yj9jcElKXNvFXuTu/PFn7ZGd8dViIpe3IWhKVa5bwPyrtL/mMy1bLCqU5qpbKhuALKrrxdVjJ490zw4hRtQx2mu0ocp28HO4QELWERIo7cZ5n1N2SBzfF4xmiy0nrb3Gytf7X74xjCL/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/costa-rica-photos/185-960.jpg, /blog/costa-rica-photos/185-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/costa-rica-photos/185-640.jpg, /blog/costa-rica-photos/185-1280.jpg 2x, /blog/costa-rica-photos/185-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/costa-rica-photos/185-320.jpg, /blog/costa-rica-photos/185-640.jpg 2x, /blog/costa-rica-photos/185-960.jpg 3x\" src=\"/blog/costa-rica-photos/185-320.jpg\" alt=\"Clouds on the flight from San Jose, Costa Rica\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/costa-rica-photos/",
            "title": "Costa Rica in July 2018",
            "date_modified": "2018-11-20T20:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2018/",
            "content_html": "<p>Here are my favourite albums of 2018 in no particular order.</p>\n<h2>Be the Cowby by Mitski</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUEBgf/xAAnEAABAwMDBAEFAAAAAAAAAAABAgMEAAURBhMxISJBURIHFYGhsf/EABYBAQEBAAAAAAAAAAAAAAAAAAQCA//EAB4RAAICAgIDAAAAAAAAAAAAAAABAgMREgQxIkFR/9oADAMBAAIRAxEAPwD0X6fa3e1k64+xaDBhsAtvLkOkrK89AhITx5JOORzVjWuomNP29LzjkYPKztofdDSVYIz3Hg9RWHWl/wDtCmNpbaHJSw0hSjjGASr844NS4dts8u9wHXmy7McUqSEuuFwApBGACCPh3E4J5x6qJ2+WnsXXU3HfvBdhXpU+GzJhv2kIWnuDkkqIVnjKRj1SqRt0FZKnIUVSjyVMpJP6pVpT+mblBvo56+QI1zuUVia2l1pGXAk++P4TVazQI1rtwbhN7afkfJPnjrSlHis8iRs21QjXurPmlKUwIf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/mitski-be-the-cowboy-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/mitski-be-the-cowboy-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/mitski-be-the-cowboy-320.jpg, /blog/favourite-albums-2018/mitski-be-the-cowboy-640.jpg 2x, /blog/favourite-albums-2018/mitski-be-the-cowboy-960.jpg 3x\" src=\"/blog/favourite-albums-2018/mitski-be-the-cowboy-320.jpg\" alt=\"Album cover of Be the Cowboy by Mitski\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/be-the-cowboy/1373892692?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/653wRjqO0GOZPQPcXpeAXD\">Spotify</a>.</p>\n<h2>Chime by Dessa</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHA//EACYQAAIBAwQBBAMBAAAAAAAAAAECAwAEEQUSITETBhRBoSIjYdH/xAAYAQADAQEAAAAAAAAAAAAAAAACAwUBBP/EAB4RAAICAgIDAAAAAAAAAAAAAAABAiEDERIxQZHw/9oADAMBAAIRAxEAPwDBLWzKyQQP4XDhW/FQpIPIGcd1ey+hLaXTL3UbS4aKK0tTdMrgS552424zjdx2ahIpmmghuniizEBGImGQ+B391oDavrGn+lV0dbaL3bBvDKjbtsWCshYjr4wDnk5FKlvwXowSjSozOfT5JxHMfEgdcqFXAIyR8f0GldorjfEn7YYio2lWjJzj54pRWcjx43evvZwsWZZPGGO1CSPqqWy1C49sCXyRZXfJySev8pStl0x2NvgiGK8KcnkZ7pSlESGf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/dessa-chime-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/dessa-chime-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/dessa-chime-320.jpg, /blog/favourite-albums-2018/dessa-chime-640.jpg 2x, /blog/favourite-albums-2018/dessa-chime-960.jpg 3x\" src=\"/blog/favourite-albums-2018/dessa-chime-320.jpg\" alt=\"Album cover of Chime by Dessa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Albums on <a href=\"https://itunes.apple.com/at/album/chime/1322884136?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/1etfft6WKY1vsqz3apooRv\">Spotify</a></p>\n<h2>Nudes by Lucius</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYBAgQH/8QAJxAAAQIFAwQCAwAAAAAAAAAAAQIDAAQFERIGEzEHIUGBFmEXM6H/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AnOl3TSkakopm6xVHWJh0ZtsNLSnBHAUbg3v6Aisl+hdDlETDlT1A88hIK07eLWKPF+bn74iB0BrahUlTbNZbl1tbCWy4tguEt4WU12B5Pj+xX/lnSky1Mb0mwBjihLsrfNm9wybA8WBtxx3gPHtdUT4zqOYp6XjMS9g4w9b9jau4J+/HqEd+ttUSlcqMrMhnJSZVDagAAEkFRCfQIEICEWY331OgZBIxFhiLQhAYuYQhAf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/lucius-nudes-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/lucius-nudes-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/lucius-nudes-320.jpg, /blog/favourite-albums-2018/lucius-nudes-640.jpg 2x, /blog/favourite-albums-2018/lucius-nudes-960.jpg 3x\" src=\"/blog/favourite-albums-2018/lucius-nudes-320.jpg\" alt=\"Album cover of Nudes by Lucius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/nudes/1325910627?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/4CJOeZrzjHBiLXEusekD5y\">Spotify</a>.</p>\n<h2>Fine but Dying by Liza Anne</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAcDBAUGCP/EACcQAAEDAwMDBAMAAAAAAAAAAAEAAgMEBREGEiEHE2EUMUGRUXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAABAUD/8QAHxEAAgECBwAAAAAAAAAAAAAAAAIDAQQSEzI0UYGx/9oADAMBAAIRAxEAPwC596OCnfNLxHG0vd4AGStCyXuG8Nk2UVTSlmCPUM27s/jk5+PtcX1Gqqug0lUvoWbnPc2OQ4BxGc7jz44/ql/T+/XWTV1tpoZZZo3u7bmvO4Nh93ceMDnwiPLhailyG0zYWk4Lu4Nz8fSLBK4h3KLUEdf6iPI0bcX4GWx7h+1Gum9RJHrm0bCG5eWnA9wQURFm1qV7Hbv34ehJnEPxwiIlEg//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/liza-anne-fine-but-dying-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/liza-anne-fine-but-dying-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/liza-anne-fine-but-dying-320.jpg, /blog/favourite-albums-2018/liza-anne-fine-but-dying-640.jpg 2x, /blog/favourite-albums-2018/liza-anne-fine-but-dying-960.jpg 3x\" src=\"/blog/favourite-albums-2018/liza-anne-fine-but-dying-320.jpg\" alt=\"Album cover of Fine but Dying by Liza Anne\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/fine-but-dying/1311631752?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/6ELuMj5lPWzmvHhi3YeIOp\">Spotify</a>.</p>\n<h2>I Don't Run by Hinds</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGB//EACgQAAEDAwMDAwUAAAAAAAAAAAIBAwQABREGEiETQVEUMTIHYXKR0f/EABcBAAMBAAAAAAAAAAAAAAAAAAACAwT/xAAkEQACAQIFBAMAAAAAAAAAAAABAgADERIhUXGRBBMiYYHR8P/aAAwDAQACEQMRAD8A6C7MasltYbC2x35RCIgji9MVIs7dxcrzhecVzS6a6kz5vrrUxcG0jNI7IiCYust7SxvT498eVzUGxWTU2oScvsMn2YkScEcnBcIjA3FEcAHO7CHz+S/eqJW8rSk1mey/Ctjr6tepJpUUmeovzx5JCXHfHilpq1VsNwN5sdUVb2vt9SxabwVwiequGodQtPOGSoLbLyiiZ7KgKnvn+UrS2i6lp6EkKFPmNxlM3QHDbmEIl4zjPC5Tnx4xSo98aH98yw6VtRzM79OdVzLNp+Rao0aG5DB9XxF0CVUcQkJCyhJzlE/SVntQy5NxcCVJfdVGx6QsIa9JAJDXbt7pn2z5pShjfLeCAAAj1KrsR1xRMZ8xpFFF2NEICnHZEGlKU601sMpJ6tTEfI8z/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/hinds-i-dont-run-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/hinds-i-dont-run-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/hinds-i-dont-run-320.jpg, /blog/favourite-albums-2018/hinds-i-dont-run-640.jpg 2x, /blog/favourite-albums-2018/hinds-i-dont-run-960.jpg 3x\" src=\"/blog/favourite-albums-2018/hinds-i-dont-run-320.jpg\" alt=\"Album cover of I Don&#x27;t Run by Hinds\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/i-dont-run/1326887526?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/5Cx9K3B2kOjSvAC23ADh3X\">Spotify</a>.</p>\n<h2>Twentytwo in Blue by Sunflower Bean</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMHAgQI/8QAJxAAAgEEAQIFBQAAAAAAAAAAAQIRAAMEBRIiYQYTMUFRIUJxgaH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgMA/8QAFxEBAQEBAAAAAAAAAAAAAAAAAgABYf/aAAwDAQACEQMRAD8A520mA+022LhW2VGvuE5sJCj1JI7AVt5mkybFvYuRaK4V1bbFPrzmeodoEn4moNVcGGHzAy+egiyp+fdv0P7+KsK9d0O78FJbwETX7fDwGF1eJi+wInkTEe7TP3QfSi2iuWIOntVtKUq1CyRyhkRPepRlXFlukyCCCJBBpShs2UFKUoy3/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/sunflower-bean-twentytwo-in-blue-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/sunflower-bean-twentytwo-in-blue-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/sunflower-bean-twentytwo-in-blue-320.jpg, /blog/favourite-albums-2018/sunflower-bean-twentytwo-in-blue-640.jpg 2x, /blog/favourite-albums-2018/sunflower-bean-twentytwo-in-blue-960.jpg 3x\" src=\"/blog/favourite-albums-2018/sunflower-bean-twentytwo-in-blue-320.jpg\" alt=\"Album cover of Twentytwo in Blue by Sunflower Bean\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/twentytwo-in-blue/1326887949?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/0Ucku0CR3r5DRYc0KFdNAh\">Spotify</a>.</p>\n<h2>In A Poem Unlimited by U.S. Girls</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBwMG/8QAJhAAAgEDAwMEAwAAAAAAAAAAAQIDAAQRBRIhBxQxEyKRoSOBwf/EABcBAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAkEQABAwIEBwAAAAAAAAAAAAABAAIDETEhM1FxBAUSQWGx8P/aAAwDAQACEQMRAD8A9dB1j06e3Dvpl7bK/gsVfPwKlS9S7GyRJe2uHEhAUB1IP7JwKxZ7KLYskLKUk4JIzt4qztoI720gV39sUm0cjwecfVLi+lKHBUTuXw4mlvJWor1ctGeVBo93+N9pPcRnPAOfulZzdWtrHMyxKCowM5844/lKOi4brYHapLNPDHIWUt9qqLR5XVXQHKkeDUnTrkrqHoLHEFXJDBfd80pSp1yqx/ddJXYyE5NKUqliy27BZ/NmO3Ptf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-640.jpg, /blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-320.jpg, /blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-640.jpg 2x, /blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-960.jpg 3x\" src=\"/blog/favourite-albums-2018/us-girls-in-a-poem-unlimited-320.jpg\" alt=\"Album cover of In A Poem Unlimited by U.S. Girls\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/in-a-poem-unlimited/1311639242?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/5mcuyVRQmrRlfFqDDfJI1q\">Spotify</a>.</p>\n<h2>Historian by Lucy Dacus</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFAQf/xAAmEAACAQMDBAEFAAAAAAAAAAABAgMABBEFITESE1FxBiJBYcHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEBf/EAB4RAAICAgIDAAAAAAAAAAAAAAECACEDERIxE2Fx/9oADAMBAAIRAxEAPwDweW/nE8mJSBkgrgcb1Tq9rNpKoXu5F1AqjhCduh1yDgjwefOayhaz3M05t4ZHEZLOUBJUZ5rY+SpqWp3lvILS5JtrZLeRnTBYoDlsfbbG37zQFRUoGYqW2N7r57ktldzSRMXlZyGxk+hSptOLNCxDqPq8fgUpTC5o4GPjFy+a27MjdqWVAzkkBsZ39VwNOebu4weR1D+UpRjqSuo5mogso2DMWfLHJ3Hj1SlKW3cuwqOAqf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/lucy-dacus-historian-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/lucy-dacus-historian-640.jpg, /blog/favourite-albums-2018/lucy-dacus-historian-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/lucy-dacus-historian-320.jpg, /blog/favourite-albums-2018/lucy-dacus-historian-640.jpg 2x, /blog/favourite-albums-2018/lucy-dacus-historian-960.jpg 3x\" src=\"/blog/favourite-albums-2018/lucy-dacus-historian-320.jpg\" alt=\"Album cover of Historian by Lucy Dacus\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/historian/1316844364?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/01GO03odsNlNLtvNETukWT\">Spotify</a>.</p>\n<h2>Sauna by Leyya</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFBgL/xAAkEAACAgICAgEFAQAAAAAAAAABAgMEABEFIRIxExQiIzJhsf/EABYBAQEBAAAAAAAAAAAAAAAAAAUGBP/EACcRAAIBAgQEBwAAAAAAAAAAAAECAwARBAUSYQYhMbEUMkFCkaHx/9oADAMBAAIRAxEAPwDnq8L2J44YgC8jBF2ddk6yWW8x5mxxstP6eWuvl5L2sgJ1sHOh4OnHLyyozSAxKZfxfsWXsKP7v/Dnm/xs7ySXJ/ulSunyFU0CSzEr16I6xzE5nFHiFTWLDzbVggyuZ4xqSzPYrflf937VjYy6Kr8qB4+1OMWDBhcUPITE5jcWI5EH0NWwSPFwF6aJik01lIWce/Ek7AymhGlPmai1gUSW09WRPIkSIAPez77xjIHCxo+X45mFzqf6UW+KquI2K5uLHpptt06VnI7QS2I4zpRKdDGMY1lrt4SLn7R2q1xeFgeZmZASdhX/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/leyya-sauna-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/leyya-sauna-640.jpg, /blog/favourite-albums-2018/leyya-sauna-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/leyya-sauna-320.jpg, /blog/favourite-albums-2018/leyya-sauna-640.jpg 2x, /blog/favourite-albums-2018/leyya-sauna-960.jpg 3x\" src=\"/blog/favourite-albums-2018/leyya-sauna-320.jpg\" alt=\"Album cover of Sauna by Leyya\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/sauna/1299087134?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/03jizn8UHjDpaHeADxYtPK\">Spotify</a>.</p>\n<h2>Ruins by First Aid Kit</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQFAgMHBv/EACkQAAEDBAAEBQUAAAAAAAAAAAECAwUABAYREiExQQcUUXGhExUiMmH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgH/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAwDAQACEQMRAD8A5zjNmzLQd29EYvFuvRjAcvHr+9WoujpttHEnR3s6G/T03DxbGxmuWfbmW2YdCWj9RbbbjqAsDkSOZHEf7y517DG7JrA8TMjkCGbqymrPjQyhlBdUHEEJTxKPIdFe6d1U+Ed3llq5LyGOQL0y06gN3nVKdD8gAoHmrvoA/NFRzi4aUxcOsr/dtZQr3B1St0tcPXcpd3N1xeZeeW47saPGVEq+aVSVlPZZLTsZGRt+8jyUaylhhttATsJGgVHqo6JHPp21s1ljeZZDjSdQko9apBJCUpSoAnqRsHW9DfrqlKNQsknr7KJd2VllNKvHQA4ppsNhRA1sgdz3NKUox//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2018/first-aid-kit-ruins-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2018/first-aid-kit-ruins-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2018/first-aid-kit-ruins-320.jpg, /blog/favourite-albums-2018/first-aid-kit-ruins-640.jpg 2x, /blog/favourite-albums-2018/first-aid-kit-ruins-960.jpg 3x\" src=\"/blog/favourite-albums-2018/first-aid-kit-ruins-320.jpg\" alt=\"Album cover of Ruins by First Aid Kit\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Full Album on <a href=\"https://itunes.apple.com/at/album/ruins/1298785869?l=en\">Apple Music</a> and <a href=\"https://open.spotify.com/album/5l2Ts5Hd4BN2O28rZksznR\">Spotify</a>.</p>",
            "url": "/blog/favourite-albums-2018/",
            "title": "My Favourite Albums of 2018",
            "date_modified": "2019-01-07T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2018/",
            "content_html": "<p>Well, January is nearly over so I probably should finally post the list of books I have read in 2018.</p>\n<ul>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-19\">Cruel and Inhuman Treatment</a> by Carolyn Edgar</li>\n<li><a href=\"https://amzn.to/2UwDe3g\">Thrawn: Alliances</a> by Timothy Zahn</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-21\">On Running</a> by Megan Baxter</li>\n<li><a href=\"https://amzn.to/2BeStXu\">The Storm Before the Storm: The Beginning of the End of the Roman Republic</a> by Mike Duncan</li>\n<li><a href=\"https://amzn.to/2D0PBgY\">Getting Things Done: The Art of Stress-Free Productivity</a> by David Allen</li>\n<li><a href=\"https://amzn.to/2B7lzbp\">The Left Hand of Darkness</a> by Ursula K. Le Guin</li>\n<li><a href=\"https://amzn.to/2D0f0Yj\">The Checklist Manifesto How to Get Things Right</a> by Atul Gawande</li>\n<li><a href=\"https://amzn.to/2RtlLHp\">Eine Partie Dame</a> by Elfriede Jelinek</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-18\">Search Party</a> by Stewart Lawrence Sinclair</li>\n<li><a href=\"http://creativeselection.io\">Creative Selection: Inside Apple's Design Process During the Golden Age of Steve Jobs</a> by Ken Kocienda</li>\n<li><a href=\"https://amzn.to/2RYfF71\">Orlando</a> by Virginia Woolf</li>\n<li><a href=\"https://amzn.to/2BdCQiW\">Radical Focus</a> by Christina R. Wodtke</li>\n<li><a href=\"https://amzn.to/2HKs6OQ\">Thrawn</a> by Timothy Zahn</li>\n<li><a href=\"https://amzn.to/2BecWfb\">Die Ermordung des Commendatore Band 2: Eine Metapher wandelt sich</a> by Haruki Murakami</li>\n<li><a href=\"https://amzn.to/2UsM7ek\">The Will to Battle</a> by Ada Palmer</li>\n<li><a href=\"https://amzn.to/2CW2lWn\">Der Mann ohne Eigenschaften</a> by Robert Musil</li>\n<li><a href=\"https://amzn.to/2CYzdxr\">Bandwidth</a> by Eliot Peper</li>\n<li><a href=\"https://amzn.to/2RZp8La\">Swing Time</a> by Zadie Smith</li>\n<li><a href=\"https://amzn.to/2CW2w3Z\">Change The Game</a> by Corinna Milborn, Markus Breitenecker</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-17\">Unmolested</a> by Michael Lowenthal</li>\n<li><a href=\"https://amzn.to/2Bd0Ti1\">Seven Surrenders</a> by Ada Palmer</li>\n<li><a href=\"https://amzn.to/2CVXuEy\">Too Like the Lightning</a> by Ada Palmer</li>\n<li>A Brief History of Time by Stephen W. Hawking</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-16\">A Dirge for the Doubly Dead</a> by Fritz Swanson</li>\n<li><a href=\"https://amzn.to/2Bc6rtc\">Die Ermordung des Commendatore Band 1: Eine Idee erscheint</a> by Haruki Murakami</li>\n<li><a href=\"https://amzn.to/2Uz5nqJ\">Optimism Over Despair</a> by Noam Chomsky</li>\n<li><a href=\"https://amzn.to/2BfdGki\">The Barrow Will Send What it May</a> by Margaret Killjoy</li>\n<li><a href=\"https://amzn.to/2S26xhC\">Die Hauptstadt</a> by Robert Menasse</li>\n<li><a href=\"https://amzn.to/2HHLMCV\">The Lamb Will Slaughter the Lion</a> by Margaret Killjoy</li>\n<li><a href=\"https://amzn.to/2BdUZgO\">Norse Mythology</a> by Neil Gaiman</li>\n<li><a href=\"https://amzn.to/2HIoBsj\">The Princess Diarist</a> by Carrie Fisher</li>\n<li><a href=\"https://amzn.to/2Bdxkgx\">Men Explain Things to Me</a> by Rebecca Solnit</li>\n<li>The Hitchhiker’s Guide to the Galaxy by Douglas Adams</li>\n<li><a href=\"https://designsystemsbook.com\">Design Systems</a> by Alla Kholmatova</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-15\">This Is My Oldest Story</a> by Emily Brisse</li>\n<li><a href=\"https://amzn.to/2UAFAOZ\">Triggers</a> by Marshall Goldsmith</li>\n<li>I, Robot by Isaac Asimov</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-14\">The River of No Return</a> by Debra Gwartney</li>\n<li><a href=\"https://amzn.to/2BeTA9C\">Die Welt von Gestern. Erinnerungen eines Europäers</a> by Stefan Zweig</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-13\">Beasts among Us</a> by Erica Berry</li>\n<li><a href=\"https://amzn.to/2CWa1b3\">Harry Potter and the Deathly Hallows</a> by J.K. Rowling</li>\n<li><a href=\"https://amzn.to/2CZDOPU\">Harry Potter and the Half-Blood Prince</a> by J.K. Rowling</li>\n<li><a href=\"https://amzn.to/2CV0KQw\">Harry Potter and the Order of the Phoenix</a> by J.K. Rowling</li>\n<li><a href=\"https://amzn.to/2UqG9L4\">Harry Potter and the Goblet of Fire</a> by J.K. Rowling</li>\n<li><a href=\"https://amzn.to/2CV1F3q\">Briefe an einen jungen Dichter</a> by Rainer Maria Rilke</li>\n<li><a href=\"https://amzn.to/2CX86mw\">Harry Potter and the Prisoner of Azkaban</a> by J.K. Rowling</li>\n<li><a href=\"https://amzn.to/2HHgyfp\">Harry Potter and the Chamber of Secrets</a> by J.K. Rowling</li>\n<li><a href=\"https://amzn.to/2HGMh0k\">Lässliche Todsünden</a> by Eva Menasse</li>\n<li><a href=\"https://amzn.to/2Bc6Zzg\">Malina</a> by Ingeborg Bachmann</li>\n<li><a href=\"https://amzn.to/2HJTOey\">Dark Matter</a> by Blake Crouch</li>\n<li><a href=\"https://amzn.to/2CV3iOA\">Heldenplatz</a> by Thomas Bernhard</li>\n<li><a href=\"https://amzn.to/2CWaxG1\">They Thought They Were Free: The Germans, 1933–45</a> by Milton Mayer</li>\n<li><a href=\"https://amzn.to/2Bc4Gwj\">Never Use Futura</a> by Doug Thomas</li>\n</ul>",
            "url": "/blog/books-2018/",
            "title": "Books 2018",
            "date_modified": "2019-01-31T18:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/mock-gatsby-usestaticquery-jest/",
            "content_html": "<p>When developing this blog I used a React hook for the very first time: <code class=\"language-text\">useStaticQuery()</code> from Gatsby. This hook executes a GraphQL query and returns the data to the component. In my case I use it to query the site metadata in a component and I want to mock the <code class=\"language-text\">useStaticQuery()</code> hook to verify that my components behaves correctly based on the result of the query.</p>\n<p>At first I was a bit confused since I have never mocked a React hook before but then I remembered that this is JavaScript where everything is a function and you can easily create a mock of a function using <code class=\"language-text\">jest.spyOn()</code> and then mock the implementation using <code class=\"language-text\">.mockImplementation()</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> useStaticQuery <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">spyOn</span><span class=\"token punctuation\">(</span>Gatsby<span class=\"token punctuation\">,</span> <span class=\"token string\">'useStaticQuery'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nuseStaticQuery<span class=\"token punctuation\">.</span><span class=\"token function\">mockImplementation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">site</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">siteMetadata</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">author</span><span class=\"token operator\">:</span> <span class=\"token string\">'Florian'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">description</span><span class=\"token operator\">:</span> <span class=\"token string\">'My description'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> <span class=\"token string\">'My Title'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>As far as I know it is not possible in Jest to spy on a single export from a module, you always have to import the module. However, Gatsby does not have a default export that contains <code class=\"language-text\">useStaticQuery</code>, but you can use the <code class=\"language-text\">*</code> to put all exports from Gatsby into a module.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">as</span> Gatsby <span class=\"token keyword\">from</span> <span class=\"token string\">'gatsby'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Update: if you use mocks in your tests don't forgot to clear them before each test. Only then you can make sure that your test does not has side effects on other test cases.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  jest<span class=\"token punctuation\">.</span><span class=\"token function\">clearAllMocks</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>",
            "url": "/blog/mock-gatsby-usestaticquery-jest/",
            "title": "Mock Gatsby's useStaticQuery with Jest",
            "summary": "Explanation how we can mock the useStaticQuery React hook provided by Gatsby in Jest",
            "date_modified": "2019-04-04T16:31:00.284Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/namibia-south-africa-photos/",
            "content_html": "<p>In June Marina and I took a trip to Windhoek in Namibia and then made our way south to Cape Town, South Africa. Here are some pictures:</p>\n<h2>Etosha National Park, Namibia</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGCAT/xAAoEAACAQQBAgQHAAAAAAAAAAABAgMABAURBgchEhNRYRQWIkFxgcH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgME/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAEREwIhMUH/2gAMAwEAAhEDEQA/ANHyhUPXnhZA0PhZgd+zMP5VgijSWJHUfSyhhv3FciZHlGR+cMdkDfzPd2kU4jkkKlwCST2/Z9aqvH+fZC48m1vLxoyUVUcKNbAA0a0rPTZCqYRUsnlMRjbgQ5DI2drMVDhJpVUkeuj+DSuF+rWTvMv1CzVxfzyTypMYVLDWlXsAB9hSi1+BSj15SVjyND22scgFb9XPgHtSlIipL+QSM2fyLMfEzTEknuT2FKUp1wm+n//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/001-windhoek-etosha-960.jpg, /blog/namibia-south-africa-photos/001-windhoek-etosha-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/001-windhoek-etosha-640.jpg, /blog/namibia-south-africa-photos/001-windhoek-etosha-1280.jpg 2x, /blog/namibia-south-africa-photos/001-windhoek-etosha-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/001-windhoek-etosha-320.jpg, /blog/namibia-south-africa-photos/001-windhoek-etosha-640.jpg 2x, /blog/namibia-south-africa-photos/001-windhoek-etosha-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/001-windhoek-etosha-320.jpg\" alt=\"On the road from Windhoek to Etosha National Park\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">On the road from Windhoek to Etosha National Park.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAYEAgUH/8QAKBAAAgEDAgQGAwAAAAAAAAAAAQIDAAQRBSESEzFBBgcUIkJRYaHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQIA/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAExESH/2gAMAwEAAhEDEQA/AIrR551SeR+Jo1HMIB+HY13Fily7MGjkkiXBYqDttnOf1VTbeDpobA2ttcPbxhQgZ7USOQPyG71lh8udThvRPb6/hFdZRE1q6DIOcAg536VpJdq/ZkTlzqhSThIOABjI7Ur0I6Fq7+5/RZP0kn9pRwt2kX082GmfmHHVhVEsz8DHYYpSpU4pIzIrE7kUpSgv/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/002-black-rhino-960.jpg, /blog/namibia-south-africa-photos/002-black-rhino-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/002-black-rhino-640.jpg, /blog/namibia-south-africa-photos/002-black-rhino-1280.jpg 2x, /blog/namibia-south-africa-photos/002-black-rhino-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/002-black-rhino-320.jpg, /blog/namibia-south-africa-photos/002-black-rhino-640.jpg 2x, /blog/namibia-south-africa-photos/002-black-rhino-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/002-black-rhino-320.jpg\" alt=\"Black Rhino resting under the shade of a tree during the afternoon sun in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Black Rhino resting under the shade of a tree during the afternoon sun.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYCBQf/xAAnEAABAwIFAwUBAAAAAAAAAAABAgMEABEFEhMhYQYiMRQyUXGxQf/EABYBAQEBAAAAAAAAAAAAAAAAAAMAAv/EABsRAAMAAgMAAAAAAAAAAAAAAAABAhFRAxIx/9oADAMBAAIRAxEAPwC9EaK9qNPSVIQ4AlJ1SFc2+KkeqY3T+HONOrxKXHC8ylLDgKEADY93gk+LVh6XrTtZiVF1NIJSFpzJTc+4AbftajYdAcf9TLa9Y82glS3lJV543A/nIFHTpvEjz19ZLRusJ7LCU4dGnSop3Q8ts94v5BsLjmlWz+IraUlJRFbRlGRKxmOX7uPylWHs1laPLo856GsFrJY91iNh9ccVXMTHQ6lCcoC2dUkDe/x9UpS8iSBhnZmuvJU1Z5zdtJ80pShFP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/003-springbok-960.jpg, /blog/namibia-south-africa-photos/003-springbok-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/003-springbok-640.jpg, /blog/namibia-south-africa-photos/003-springbok-1280.jpg 2x, /blog/namibia-south-africa-photos/003-springbok-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/003-springbok-320.jpg, /blog/namibia-south-africa-photos/003-springbok-640.jpg 2x, /blog/namibia-south-africa-photos/003-springbok-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/003-springbok-320.jpg\" alt=\"Springbok eating leaves from a bush in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Springbok eating leaves from a bush.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEBf/EACUQAAEEAQQBBAMAAAAAAAAAAAEAAgMREgQTIUFxIiMxUbHR8P/EABYBAQEBAAAAAAAAAAAAAAAAAAAEAf/EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAwDAQACEQMRAD8A3wObMAKPoFU6M8norQx0eoGTjG4gUS2x/BTfLM4iOOTF/Rxy+1q0ulZG/dc4bpFOcG45eQp8UJuhkNbUga2vgAfpFd7ZMvb2w3q7H4RBzo+ddI3o4nxYsrTpdHDp8tppBPJORJREpFw41zyiItH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/004-jackal-960.jpg, /blog/namibia-south-africa-photos/004-jackal-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/004-jackal-640.jpg, /blog/namibia-south-africa-photos/004-jackal-1280.jpg 2x, /blog/namibia-south-africa-photos/004-jackal-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/004-jackal-320.jpg, /blog/namibia-south-africa-photos/004-jackal-640.jpg 2x, /blog/namibia-south-africa-photos/004-jackal-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/004-jackal-320.jpg\" alt=\"Jackal looking into the distance on our way to Okaukuejo Camp in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Jackal looking into the distance on our way to Okaukuejo Camp.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEAgX/xAAoEAACAgECBAYDAQAAAAAAAAABAgMEAAURBgcSIRMxQVFxsSJCYYH/xAAXAQEBAQEAAAAAAAAAAAAAAAABAwIE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAECMUEREjL/2gAMAwEAAhEDEQA/AJi1YOkWStMqonZpWDEnuTmypca5DLHZKOoAcjf2751zV4eh4YsxJY1dbl5JRD4SQFQoI3BLdR7/AMyOivELK4JVgBEdv232O/3kKt6OyEmUNypfWcmjEbFdgGVi6kjt5EnvjN/C1K9qunPLUjmaOOUxEr7gAn7xh3HhFdxrw9pus82q9e7B1R25b1ibpO3U0MRCD4/AH5JyA4NpVrnA2r6hYhR7VTUtL8JyPIM5Vh8EeY9cYw0TWD2+cwOg8ydag0p5K8M7padEcqPEdFLHYH1Pf/cYxmXkrHlH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/005-elephant-960.jpg, /blog/namibia-south-africa-photos/005-elephant-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/005-elephant-640.jpg, /blog/namibia-south-africa-photos/005-elephant-1280.jpg 2x, /blog/namibia-south-africa-photos/005-elephant-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/005-elephant-320.jpg, /blog/namibia-south-africa-photos/005-elephant-640.jpg 2x, /blog/namibia-south-africa-photos/005-elephant-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/005-elephant-320.jpg\" alt=\"Elephant preparing to drink at a waterhole in Okaukuejo Camp in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Elephant preparing to drink at a waterhole in Okaukuejo Camp.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMHAgUGCP/EACgQAAIBAwMBCAMAAAAAAAAAAAECAwAEEQUSIWEGBxMUIjFBUTKBwf/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAP/EABsRAAMAAgMAAAAAAAAAAAAAAAABAgMTESFh/9oADAMBAAIRAxEAPwCS/wBahhUxTrIjMMbVYZwfk49qk0vVkuIVQy7mVfyGPUBx/KrntRBqFrdNe2l2ssMb+I3IZnXAJyOORjHH3Wx7NanbuNs0iZf1IC2SvycdelTVkpMvmE1wWEJw3KkkffBpXMWerr4RBQnDEe9K2/w2ovvvhs7W17rtd8ta28W2ABdkajbl1BxgccE15K06AQanahHcia3MrAnOG3sOP0BSlGw8L6M/PTxqApHPJyOtKUoyk//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/006-elephant-960.jpg, /blog/namibia-south-africa-photos/006-elephant-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/006-elephant-640.jpg, /blog/namibia-south-africa-photos/006-elephant-1280.jpg 2x, /blog/namibia-south-africa-photos/006-elephant-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/006-elephant-320.jpg, /blog/namibia-south-africa-photos/006-elephant-640.jpg 2x, /blog/namibia-south-africa-photos/006-elephant-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/006-elephant-320.jpg\" alt=\"Elephant drinking at the waterhole in Okaukuejo Camp in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Elephant drinking at the waterhole in Okaukuejo Camp.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHAwQG/8QAJxAAAgIBAwMCBwAAAAAAAAAAAQIDBAAFESEHEjFBUQYiQnGRocH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQIE/8QAHBEAAgICAwAAAAAAAAAAAAAAAAECEQMxEiFh/9oADAMBAAIRAxEAPwDfvdU/iS3ZjkhmWGFGDNBFEVG4+knyQfvna1uqlxxCs1GsZZACVUycbj1O2wysls2NR0uUIjQO4O6rs48cc/v0OYJbV/R4GsyEvESBN3OT3MTsGHsfT2y+MU/DVVrssXVepmtx2u2vDpqp2jgh2O/5GMrhNWs2lEsVeMofB7t/5jHWMKkQOkyNGVEfyqY1JAJ2PGSlq5KaxDEMATw3PjGMcdAyLsylJOFXkb+MYxlLRL2f/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/007-giraffes-960.jpg, /blog/namibia-south-africa-photos/007-giraffes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/007-giraffes-640.jpg, /blog/namibia-south-africa-photos/007-giraffes-1280.jpg 2x, /blog/namibia-south-africa-photos/007-giraffes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/007-giraffes-320.jpg, /blog/namibia-south-africa-photos/007-giraffes-640.jpg 2x, /blog/namibia-south-africa-photos/007-giraffes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/007-giraffes-320.jpg\" alt=\"Giraffes at the waterhole in Okaukuejo Camp in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Giraffes at the waterhole in Okaukuejo Camp.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAcBAgMEBQb/xAApEAABAwMDAgUFAAAAAAAAAAABAAIDBBEhBRIxBxMXQZGh0SMzcpPB/8QAGAEAAgMAAAAAAAAAAAAAAAAAAAIBAwT/xAAYEQEBAQEBAAAAAAAAAAAAAAAAEQESMf/aAAwDAQACEQMRAD8A6kXU4uGdIkt+ZH8WXxPjbh2kz35xKPhQ4K3UGQxmi7csgNtr3ZJJ454V9FX1b2SNmMkTzuBdu+26/lfBHrynrTUxN6pUxGdLqf2D4RQk2trKdjY60OdLzuMobuHkcFEUdK10EdJVM7A2iTkX91vQB4qR9aTbcENNiB7IiN9Rj0HajIzGz0CIitK//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/008-hyenas-960.jpg, /blog/namibia-south-africa-photos/008-hyenas-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/008-hyenas-640.jpg, /blog/namibia-south-africa-photos/008-hyenas-1280.jpg 2x, /blog/namibia-south-africa-photos/008-hyenas-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/008-hyenas-320.jpg, /blog/namibia-south-africa-photos/008-hyenas-640.jpg 2x, /blog/namibia-south-africa-photos/008-hyenas-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/008-hyenas-320.jpg\" alt=\"Hyenas in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Hyenas in Etosha National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQFAQYHCP/EACkQAAIBAwIEBQUAAAAAAAAAAAECAwAEEQUGEiEiMRRBgYLRM1FhcZH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAAAAAAAAAAERJhAf/aAAwDAQACEQMRAD8A9IeKIXiZAoHclqxLdOg+ln3VzmDS7S4nRNX3DeXlkmWWIll5+Wf139Ks90X0uoNZwaPrDWaxqxklPLiYYAzgc/P8VXhyvjuSHjdVjBKEqevHP+UrQIdvWV2ZZdZ1u5luy5BeM4BGB9/WlN4soDyOpIBqLJdTBX6847dI+KUpKDJfXIY4lA9i/FKUrN9aj//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/009-zebras-960.jpg, /blog/namibia-south-africa-photos/009-zebras-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/009-zebras-640.jpg, /blog/namibia-south-africa-photos/009-zebras-1280.jpg 2x, /blog/namibia-south-africa-photos/009-zebras-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/009-zebras-320.jpg, /blog/namibia-south-africa-photos/009-zebras-640.jpg 2x, /blog/namibia-south-africa-photos/009-zebras-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/009-zebras-320.jpg\" alt=\"Zebras in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Zebras in Etosha National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAgMEBv/EACkQAAIBAwMCBAcAAAAAAAAAAAECAwAEEQUSISIxBhNBURQyYXKBkdH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQD/8QAGhEBAQADAQEAAAAAAAAAAAAAAQACBBMhMf/aAAwDAQACEQMRAD8Am9K8SNLao7B7gZbc5UKV6jjt6YwM1KWGu2F/IY4ZkEo7KzDq+33qvNPW4spfMFw4lVcjeuUUfitlnB8JqUVzI0MtuqiOZHX5wXLFgewIz+hSmzkPjPxxfpWcSM0rx0viK6ildVELIGO3IIwueBSqTaxseDRmo2sccEqLu6XABJ55+tYRxqNNmHfgLzzke1KVA1ZcUcZl3GSR2IOPT+UpSjC//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/010-giraffes-960.jpg, /blog/namibia-south-africa-photos/010-giraffes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/010-giraffes-640.jpg, /blog/namibia-south-africa-photos/010-giraffes-1280.jpg 2x, /blog/namibia-south-africa-photos/010-giraffes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/010-giraffes-320.jpg, /blog/namibia-south-africa-photos/010-giraffes-640.jpg 2x, /blog/namibia-south-africa-photos/010-giraffes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/010-giraffes-320.jpg\" alt=\"Giraffes in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Giraffes in Etosha National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQMH/8QAKBAAAQMCBAUFAQAAAAAAAAAAAQACAwQhBRESMQYTFCJBFTNRYYHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAMEAf/EABoRAAIDAQEAAAAAAAAAAAAAAAABAhETURL/2gAMAwEAAhEDEQA/AN4YZWmZ7RUt0ADS7lN7j5tmovw6pDe7EY2Em2qAAn81LJhxjBqwARwxvmN8o7kb+M9rK0OIsLpcwBG0s3Abt+o0mxviCLfptYNq4O++nH9RRHEMLGM5gkaXDV7RuPmwRGkum5rh5hDSxEuORBIyJHkfCsuo4+UQC8DLYFEVdIitnDpWm7pZifuQoiJCSHWz/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/011-oryx-960.jpg, /blog/namibia-south-africa-photos/011-oryx-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/011-oryx-640.jpg, /blog/namibia-south-africa-photos/011-oryx-1280.jpg 2x, /blog/namibia-south-africa-photos/011-oryx-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/011-oryx-320.jpg, /blog/namibia-south-africa-photos/011-oryx-640.jpg 2x, /blog/namibia-south-africa-photos/011-oryx-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/011-oryx-320.jpg\" alt=\"Oryx at the waterhole in Okaukuejo Camp in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Oryx at the waterhole in Okaukuejo Camp.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQFAQMGB//EACUQAAEEAgEEAQUAAAAAAAAAAAECAwQRABIFBiFRYTETIkFikf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBQH/xAAbEQADAAMBAQAAAAAAAAAAAAAAAQIDERNRIf/aAAwDAQACEQMRAD8A6Dl+SegNtmMmXLfJASwwlOxuxdkfFisruG6tkyOpxARxL4hLvZ9Q10NWVdhSh3A9XlLyjs+Edp82BGYXrbn0FrBUD5Kuxq+9fnNg5SE87CitSUOy1AJ1DhvcAEn15r1mOLT0OVw0elBxAAtl1z9k9xjOJbgLKAXJkoLPzT6xf8IGMZxyeC+2P0y4A6nV1KVp8KFjIzXFQo6hyDUdsSXHi3tqPtATdjwcYyjSW0T5b+krdXnGMYYB/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/012-kudu-960.jpg, /blog/namibia-south-africa-photos/012-kudu-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/012-kudu-640.jpg, /blog/namibia-south-africa-photos/012-kudu-1280.jpg 2x, /blog/namibia-south-africa-photos/012-kudu-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/012-kudu-320.jpg, /blog/namibia-south-africa-photos/012-kudu-640.jpg 2x, /blog/namibia-south-africa-photos/012-kudu-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/012-kudu-320.jpg\" alt=\"Kudu at the Olifantsbad waterhole in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Kudu at the Olifantsbad waterhole.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAQIDBP/EACoQAAIBAgUCBAcAAAAAAAAAAAEDAgARBAUSISIGQQcTUZExUmFxgaHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAMC/8QAFxEBAQEBAAAAAAAAAAAAAAAAABMBA//aAAwDAQACEQMRAD8Akg8QsrnMeUtxgNpGQ0kGvdLrTJwsTW1zARfio7fSq2xOSZixyJkw0LYGSWuItLiBbb0Iv7+taDKcxKYQlhgtYv5giDy/P77VC3XFZYsfEdbZWppjANYPmiABSq1ZkmO1kqwKRA/AE3I96Ut2J4nElx0Blrkz06SdrfaurkriDIQHHcDt27UpVG2JTjDTZSyZASJN/wC0pSg//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/013-elephants-960.jpg, /blog/namibia-south-africa-photos/013-elephants-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/013-elephants-640.jpg, /blog/namibia-south-africa-photos/013-elephants-1280.jpg 2x, /blog/namibia-south-africa-photos/013-elephants-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/013-elephants-320.jpg, /blog/namibia-south-africa-photos/013-elephants-640.jpg 2x, /blog/namibia-south-africa-photos/013-elephants-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/013-elephants-320.jpg\" alt=\"Family of elephants at the Olifantsbad waterhole in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Family of elephants at the Olifantsbad waterhole.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYDAQL/xAAkEAABBAECBgMAAAAAAAAAAAABAAIDEQQhMRIiQVKRoQUUsf/EABYBAQEBAAAAAAAAAAAAAAAAAAMABP/EABsRAQADAAMBAAAAAAAAAAAAAAEAAgMREyIh/9oADAMBAAIRAxEAPwC5bmRdzfK9fbi7m+VDCe5AwBshq7jiNfq1mIdIBA3HIA5g4m/SM1WM41JZnMi7m+UUOCzUSMga8aECRxr0iuxl01k+7Lk4WaN59Ca206LD5bJOPjiaKOISOoE1ve6Iiq+0i2PAzjJy5gdwsBI6BERZtPlmaMzmpP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/014-saltpans-960.jpg, /blog/namibia-south-africa-photos/014-saltpans-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/014-saltpans-640.jpg, /blog/namibia-south-africa-photos/014-saltpans-1280.jpg 2x, /blog/namibia-south-africa-photos/014-saltpans-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/014-saltpans-320.jpg, /blog/namibia-south-africa-photos/014-saltpans-640.jpg 2x, /blog/namibia-south-africa-photos/014-saltpans-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/014-saltpans-320.jpg\" alt=\"Saltpans in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Saltpans in Etosha National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgP/xAAlEAACAgICAQIHAAAAAAAAAAABAgADBBEhMRIFYQYiQWKBkcH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAT/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAMAwEAAhEDEQA/AIO61cHyB+7c5NlePkS7Dkgnf0l76Ph04+dat4qtV0Uq7aP50Zb24XpYouW3FrsDjpgD+tdTDW+MdXkLYCUscrvW9xNaafhyvStTioRxrr+xLAx2PdYahczEuHK98aEjW5uRZY1ZtYICRpTr3iJFGNAJPzuOSO/eIiIf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/015-lion-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/015-lion-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/015-lion-320.jpg, /blog/namibia-south-africa-photos/015-lion-640.jpg 2x, /blog/namibia-south-africa-photos/015-lion-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/015-lion-320.jpg\" alt=\"Lion in Etosha National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Lion in Etosha National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcBAgUD/8QAJhAAAgECBQIHAAAAAAAAAAAAAQIAAwQFBhESIRMUIkFCYXGBov/EABgBAAIDAAAAAAAAAAAAAAAAAAAFAQME/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAIV/9oADAMBAAIRAxEAPwCjJaiey2o9pCrPFMYtRTW2xbEAqjQIbln0H3OwubMxLSVe/fj1CmhY/JmnQlRn0sHaiJE6mbczByVxm4AJ102U+PzENCU59OfQQdBah5Ynbz5Cb0XapW2sfCo1AiImOWXOxzoBzzERAP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/016-etosha-swakopmund-960.jpg, /blog/namibia-south-africa-photos/016-etosha-swakopmund-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/016-etosha-swakopmund-640.jpg, /blog/namibia-south-africa-photos/016-etosha-swakopmund-1280.jpg 2x, /blog/namibia-south-africa-photos/016-etosha-swakopmund-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/016-etosha-swakopmund-320.jpg, /blog/namibia-south-africa-photos/016-etosha-swakopmund-640.jpg 2x, /blog/namibia-south-africa-photos/016-etosha-swakopmund-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/016-etosha-swakopmund-320.jpg\" alt=\"Road between Etosha National Park and Swakopmund, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Road between Etosha National Park and Swakopmund.</figcaption></figure><p></p>\n<h2>Swakopmund and Skeleton Coast</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwIE/8QAJxAAAQMDAwMEAwAAAAAAAAAAAQACAwQFERIhMQYiQRMVFnFhscH/xAAYAQADAQEAAAAAAAAAAAAAAAAABAUCA//EABwRAAIBBQEAAAAAAAAAAAAAAAABFAIREjFRFf/aAAwDAQACEQMRAD8AvMFsJPCkIbXxxvx+VS575cZBGTVSQAEg6XBhJ/qibt1ZdqVxd7lE0whxgD3hp1kHzjHnyn/QvoUgtbNUba8tyMEIsQp+sb5FE1sXVEUTedLe7c7nf7JRE98CId0VghqKR1VJV1xkcNx6u36XstVgonU7XvD3anAEEgAjPGAERS6mU6USHx60MJIt8I1dxxloz9AgIiLnk+m8Vw//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/017-swakopmund-960.jpg, /blog/namibia-south-africa-photos/017-swakopmund-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/017-swakopmund-640.jpg, /blog/namibia-south-africa-photos/017-swakopmund-1280.jpg 2x, /blog/namibia-south-africa-photos/017-swakopmund-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/017-swakopmund-320.jpg, /blog/namibia-south-africa-photos/017-swakopmund-640.jpg 2x, /blog/namibia-south-africa-photos/017-swakopmund-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/017-swakopmund-320.jpg\" alt=\"Waterfront in Swakopmund, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Waterfront in Swakopmund.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMFAQIGBP/EACcQAAEDAwIEBwAAAAAAAAAAAAEAAgMEBRESURMUITEVIiNBccHR/8QAFwEBAQEBAAAAAAAAAAAAAAAABQABAv/EABoRAAIDAQEAAAAAAAAAAAAAAAABERMhFFH/2gAMAwEAAhEDEQA/ANWU4UzacLkau7XyISOhpoHYAAa7U3IPc7AqW0X+6zS8GahZTxRsHqF3EJ9uwISfTsB9GSdZy6Ko8YlHR88TXbGmf+our16ZSZhsVCQPI7qN17IrNRxAaY8gHIzuiIpiSSLFrtIwGxn5jafpERUsoR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/018-skeleton-coast-960.jpg, /blog/namibia-south-africa-photos/018-skeleton-coast-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/018-skeleton-coast-640.jpg, /blog/namibia-south-africa-photos/018-skeleton-coast-1280.jpg 2x, /blog/namibia-south-africa-photos/018-skeleton-coast-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/018-skeleton-coast-320.jpg, /blog/namibia-south-africa-photos/018-skeleton-coast-640.jpg 2x, /blog/namibia-south-africa-photos/018-skeleton-coast-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/018-skeleton-coast-320.jpg\" alt=\"Shipwreck on the Skeleton Coast north of Swakopmund, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Shipwreck on the Skeleton Coast north of Swakopmund.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAIGAQMFB//EACIQAAICAQMEAwAAAAAAAAAAAAABAgMRBRNSBCEiMTJhcf/EABcBAAMBAAAAAAAAAAAAAAAAAAACBQb/xAAbEQABBQEBAAAAAAAAAAAAAAAAAQMRFFEFFf/aAAwDAQACEQMRAD8A85WkviSWkviW6Kqx3SIdRfVSqnCp2uc1BqHuK5P6KqdBrSfSdwrC0h4+ILgtpr0gHotaFF3DkxhCyPlCOPw2bcMPEcAGagvIpl1RAAkIPJ//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/019-bus-960.jpg, /blog/namibia-south-africa-photos/019-bus-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/019-bus-640.jpg, /blog/namibia-south-africa-photos/019-bus-1280.jpg 2x, /blog/namibia-south-africa-photos/019-bus-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/019-bus-320.jpg, /blog/namibia-south-africa-photos/019-bus-640.jpg 2x, /blog/namibia-south-africa-photos/019-bus-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/019-bus-320.jpg\" alt=\"Bus on the Skeleton Coast north of Swakopmund, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Bus on the Skeleton Coast north of Swakopmund.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAEEBgIH/8QAIhAAAgECBQUAAAAAAAAAAAAAAAECAxEFFCFRYRUiMlJx/8QAGAEAAgMAAAAAAAAAAAAAAAAAAgYAAQX/xAAbEQEAAgIDAAAAAAAAAAAAAAAAAQIRURIhIv/aAAwDAQACEQMRAD8A8byb2Iyb2NasOXBKw66ukmuBgiasb0yOT4Br+mP1BeYTtdq9iTjpd2KlSTWqAE4zuY1JteUl8kwAHF7bDxrp/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/020-beach-skeleton-coast-960.jpg, /blog/namibia-south-africa-photos/020-beach-skeleton-coast-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/020-beach-skeleton-coast-640.jpg, /blog/namibia-south-africa-photos/020-beach-skeleton-coast-1280.jpg 2x, /blog/namibia-south-africa-photos/020-beach-skeleton-coast-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/020-beach-skeleton-coast-320.jpg, /blog/namibia-south-africa-photos/020-beach-skeleton-coast-640.jpg 2x, /blog/namibia-south-africa-photos/020-beach-skeleton-coast-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/020-beach-skeleton-coast-320.jpg\" alt=\"Skeleton Coast north of Swakopmund, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Skeleton Coast north of Swakopmund.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIGBwj/xAAkEAABBAEFAAIDAQAAAAAAAAABAgMEEQAFBhIhMVGRFBVx0f/EABYBAQEBAAAAAAAAAAAAAAAAAAQCA//EABoRAAMBAQEBAAAAAAAAAAAAAAECEQADFBL/2gAMAwEAAhEDEQA/AIbQ39pc6QqB+rlRVkKcKhSkGvkdVfnnZOT2tvx/Vp7jUpmHDjhauISFFQSk0Bd1Z+souquzdKK3drtxpGmup5fntC3QKvg8FGkFPfgAPt95T4OsSEaehTZoqvkUnuz8nDpyD/UEyn6FJTd0u3JhJBCHeAs9GxjOfG9ZlKabLuorQojzmRX1jI8z6vQm2eZs/QtQQ83I09vi9RXwtNkDrzKDvTYOlaOw9JgPTUKbTQQp0KTQHQop8xjMuLsWl19lUCzZ3DKnWApSu/4P8xjGNLHEAG//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/021-seals-960.jpg, /blog/namibia-south-africa-photos/021-seals-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/021-seals-640.jpg, /blog/namibia-south-africa-photos/021-seals-1280.jpg 2x, /blog/namibia-south-africa-photos/021-seals-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/021-seals-320.jpg, /blog/namibia-south-africa-photos/021-seals-640.jpg 2x, /blog/namibia-south-africa-photos/021-seals-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/021-seals-320.jpg\" alt=\"Seals at Cape Cross, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seals at Cape Cross.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGBP/EACYQAAEDBAEDBAMAAAAAAAAAAAECAwQABRESIQYTMRRBYXEiMlH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQIxEiET4fD/2gAMAwEAAhEDEQA/AMXapEFi3KS36oTnUqIitEO9oJA23XwclODqTx7Vy2P0jsRGJb8ZKUlxT8cEuOkqOoIycEZP37VBZuk+83p9u0iMl593YvEdpbrSRw1qPIGSTnzj4rWdJR4sNqfCcW1Fmh5TalDJDKinCTt91hnq7NsdvVEad1UzbJbkWcmel9GM9xYKlAgEE8HnGKVr7ZaX1xtJ8h5uQ0Q2oF9CQcAcjIPHJxSp8kF7ophJ0So9ngot0thEdCUqOmwH5DxhQPkK5PNaPp6NHjx1NR2G2mwoIIQP2GPf+n5pShJtjikSIBNxXMckKVs3JcZToSkapOB4pSlB2JH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/022-seals-960.jpg, /blog/namibia-south-africa-photos/022-seals-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/022-seals-640.jpg, /blog/namibia-south-africa-photos/022-seals-1280.jpg 2x, /blog/namibia-south-africa-photos/022-seals-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/022-seals-320.jpg, /blog/namibia-south-africa-photos/022-seals-640.jpg 2x, /blog/namibia-south-africa-photos/022-seals-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/022-seals-320.jpg\" alt=\"Seals at Cape Cross, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seals at Cape Cross.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFAgT/xAAoEAACAQMDAwMFAQAAAAAAAAABAwIABBEFBiESMVETcYEUIkFEUvD/xAAXAQADAQAAAAAAAAAAAAAAAAACAwQB/8QAHBEAAgEFAQAAAAAAAAAAAAAAAAECAxETISIx/9oADAMBAAIRAxEAPwCd1N0LTTrm5a4JjGBIngZBxxgeam9I3Aba4SjVfUEXfsxjgRJ/of4+a8Wj61e6o4J1K2Lra2PXOZXgCfYCfiut33f1cGrTwWM6wJgdUOBkcd84qJUrcyLZVb9RLkyCMQNxA/kfaex9s0qPudxs0yNvZuVdzcpCxMrUJDJiDySe/IpQYWMyo1dGcbnbDbhq1ZuxKbYCAEZZyT7/ADWbc2qYbltLRUAtRsQ8mPMjInycmlKFamzXuCKoISpax6UGExBMmDqJ+aUpSn6MXh//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/023-seals-960.jpg, /blog/namibia-south-africa-photos/023-seals-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/023-seals-640.jpg, /blog/namibia-south-africa-photos/023-seals-1280.jpg 2x, /blog/namibia-south-africa-photos/023-seals-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/023-seals-320.jpg, /blog/namibia-south-africa-photos/023-seals-640.jpg 2x, /blog/namibia-south-africa-photos/023-seals-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/023-seals-320.jpg\" alt=\"Seals at Cape Cross, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seals at Cape Cross.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgMIB//EACcQAAECBQMDBQEAAAAAAAAAAAEAAgMEBRESBiGREzFBFBUiMvDh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQID/8QAGREBAAMBAQAAAAAAAAAAAAAAAAECEkER/9oADAMBAAIRAxEAPwC9w6vMm14h4C2iqzNvueF4DB1vUepjEqE6MQS4PiMZtv8AzZQ2nNdxqdT4sj6mZxD3Ph9OYLQLuuR3/XV7qMz10z7nOeHnhFzFG1rUjFc5s1OBjjk0GacduUTqo8lWRNOZpvEw4T3GK5mbxdwBA8/u6hQbfEbCyIsatLcYZm538oiJS//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/024-seals-960.jpg, /blog/namibia-south-africa-photos/024-seals-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/024-seals-640.jpg, /blog/namibia-south-africa-photos/024-seals-1280.jpg 2x, /blog/namibia-south-africa-photos/024-seals-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/024-seals-320.jpg, /blog/namibia-south-africa-photos/024-seals-640.jpg 2x, /blog/namibia-south-africa-photos/024-seals-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/024-seals-320.jpg\" alt=\"Seals at Cape Cross, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seals at Cape Cross.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQIBQYH/8QAJxAAAQMCBQIHAAAAAAAAAAAAAQACAwQRBgcSITEFURUXNXKSwdH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwABBP/EABsRAAMAAgMAAAAAAAAAAAAAAAABAgMxERJR/9oADAMBAAIRAxEAPwDtEjG9wokrGd1WTzDxNJuesytvxff6UGfMLE7T61MPbGFmmsg9xBZ17WauQiqs7MDFRcT43U/EfiJnN+gdYNXNRIJ2xtdYF+m4G6hPrJzLKC/ZoNtuERWkRsyldalmEcbQRpBu4km6IiXOg62f/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/025-skeleton-coast-960.jpg, /blog/namibia-south-africa-photos/025-skeleton-coast-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/025-skeleton-coast-640.jpg, /blog/namibia-south-africa-photos/025-skeleton-coast-1280.jpg 2x, /blog/namibia-south-africa-photos/025-skeleton-coast-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/025-skeleton-coast-320.jpg, /blog/namibia-south-africa-photos/025-skeleton-coast-640.jpg 2x, /blog/namibia-south-africa-photos/025-skeleton-coast-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/025-skeleton-coast-320.jpg\" alt=\"Landscape on the Skeleton Coast north of Swakopmund, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Landscape on the Skeleton Coast north of Swakopmund.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQGBwP/xAAjEAABBAEDBAMAAAAAAAAAAAABAAIDESEGEjEEExRxc7HB/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgMEAQX/xAAbEQACAwADAAAAAAAAAAAAAAAAAQIDEjFBUf/aAAwDAQACEQMRAD8AsEkwBg+QfRUnvCuVk8upvKlgMjnPERuqoHFWpzNcGKmS9PYGNwd+KpXQfYvDNEdICUVCGtIHixtHskIj3H0zLM4hc7BBIR7yScoi51fBUzg5xvlERNBP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/026-walvis-bay-960.jpg, /blog/namibia-south-africa-photos/026-walvis-bay-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/026-walvis-bay-640.jpg, /blog/namibia-south-africa-photos/026-walvis-bay-1280.jpg 2x, /blog/namibia-south-africa-photos/026-walvis-bay-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/026-walvis-bay-320.jpg, /blog/namibia-south-africa-photos/026-walvis-bay-640.jpg 2x, /blog/namibia-south-africa-photos/026-walvis-bay-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/026-walvis-bay-320.jpg\" alt=\"Fog in Walvis Bay, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Fog in Walvis Bay.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMHAQQFBv/EACYQAAEDBAECBwEAAAAAAAAAAAEAAgMEBRESITFRBgcVInGRsaH/xAAYAQADAQEAAAAAAAAAAAAAAAABAgUDBP/EABkRAQADAQEAAAAAAAAAAAAAAAABERQxQf/aAAwDAQACEQMRAD8A9Gy3DspBbR2VbT3+8EyCWar3z7RsGj64WIvFV6gg2fVPZH0B2a8fHPK7Nl+ssayvTR2RVW7zAvTXENqNmjgHVvP8RHUGWE1XPIaUODy0kHOOh4z0XKlDKinLJoo3MzjGuPxEUhSnrdZY6TQFplYCAcB3H4iInsr/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/027-moon-landscape-960.jpg, /blog/namibia-south-africa-photos/027-moon-landscape-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/027-moon-landscape-640.jpg, /blog/namibia-south-africa-photos/027-moon-landscape-1280.jpg 2x, /blog/namibia-south-africa-photos/027-moon-landscape-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/027-moon-landscape-320.jpg, /blog/namibia-south-africa-photos/027-moon-landscape-640.jpg 2x, /blog/namibia-south-africa-photos/027-moon-landscape-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/027-moon-landscape-320.jpg\" alt=\"Moon landscapes between Walvis Bay and Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Moon landscapes between Walvis Bay and Namib-Naukluft National Park.</figcaption></figure><p></p>\n<h2>Dune 45 in Namib-Naukluft National Park</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUEAwb/xAAkEAACAgICAAYDAAAAAAAAAAABAgMRAAQFBhIUITFBcTJRYf/EABkBAAIDAQAAAAAAAAAAAAAAAAIGAAEDBP/EAB0RAAICAwADAAAAAAAAAAAAAAACAQMREiEEMVH/2gAMAwEAAhEDEQA/APOyHzTrIgcIPxejR+jkPlel7/M8o2029CVaqLhrUD4Ay92ns04l1+N43inllAp7BUKPivTKnESNrxBthCgIuibAxbWyytd4jA1MiWTrPSVx/RYYNZU2OR2pJPclTQH8A9cZr5ftGnrbjRLsRnwgXR9jjKz5DdJileGxlMsEkRd1UrVq1EZx1dVNqVtd2dIoUXwhT7/d3jGBAUkPZ69xTTMTpRWT6kCrP7xjGdEO2PZjovw//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/028-sand-960.jpg, /blog/namibia-south-africa-photos/028-sand-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/028-sand-640.jpg, /blog/namibia-south-africa-photos/028-sand-1280.jpg 2x, /blog/namibia-south-africa-photos/028-sand-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/028-sand-320.jpg, /blog/namibia-south-africa-photos/028-sand-640.jpg 2x, /blog/namibia-south-africa-photos/028-sand-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/028-sand-320.jpg\" alt=\"Sand on Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sand on Dune 45 in Namib-Naukluft National Park, Namibia.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHAgME/8QAJxAAAQMCAwgDAAAAAAAAAAAAAQACAwQRBSExBgcSE0FRctEUIqH/xAAWAQEBAQAAAAAAAAAAAAAAAAAFAAH/xAAZEQEAAwEBAAAAAAAAAAAAAAAAAQMTFAL/2gAMAwEAAhEDEQA/AIBBiFPC8CSOQE5gcGa7Ycao2kCdwbbUODsj2urgG63BDHZ1dWkeMfpaqPdHgTXVRlqqp7ZZTIG/V3CLAdRlp0RvVVJHH3Co3bSUDTbksPicv0IrhG6XZ9oA+XXadmekW9NKysStsjrLJhz0CIiIIjTyxwxta1vYCyIik//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/029-dune-45-960.jpg, /blog/namibia-south-africa-photos/029-dune-45-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/029-dune-45-640.jpg, /blog/namibia-south-africa-photos/029-dune-45-1280.jpg 2x, /blog/namibia-south-africa-photos/029-dune-45-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/029-dune-45-320.jpg, /blog/namibia-south-africa-photos/029-dune-45-640.jpg 2x, /blog/namibia-south-africa-photos/029-dune-45-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/029-dune-45-320.jpg\" alt=\"Woman running down Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Woman running down Dune 45 in Namib-Naukluft National Park, Namibia.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBgEF/8QAIxAAAgEDAgcBAAAAAAAAAAAAAAECAwQRBWESFSMzQVGB4f/EABcBAQEBAQAAAAAAAAAAAAAAAAIFAQP/xAAeEQACAQMFAAAAAAAAAAAAAAAAAQIDBVERFBUxMv/aAAwDAQACEQMRAD8AsjYQ2OvT4MydPWLxvqXWFtFMjW1CdVpzrzbW/wCneVwkujIW+L9PQ1XL4AxzvVnuy+PADyE8C2FPJ5ngpqyw20AS0UGQ42vX1AAQD//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/030-dunes-960.jpg, /blog/namibia-south-africa-photos/030-dunes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/030-dunes-640.jpg, /blog/namibia-south-africa-photos/030-dunes-1280.jpg 2x, /blog/namibia-south-africa-photos/030-dunes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/030-dunes-320.jpg, /blog/namibia-south-africa-photos/030-dunes-640.jpg 2x, /blog/namibia-south-africa-photos/030-dunes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/030-dunes-320.jpg\" alt=\"Dunes photographed from Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dunes photographed from Dune 45.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAcCAwQFBv/EACcQAAEEAAUBCQAAAAAAAAAAAAEAAgMEBQYRITFREhMyM0FSkaHB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIEAP/EABgRAQADAQAAAAAAAAAAAAAAAAABAgQU/9oADAMBAAIRAxEAPwCwxUx6BchtPoFG6uO149O7xyyzfXyj+LuYs0QyACxj8kgHuieD9Jp12CMdVPFPbhF4Bmaqobtj8oHTsPRL12NyQiTPDyVtaTpyflEUyxkJHIiIM//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/031-dunes-960.jpg, /blog/namibia-south-africa-photos/031-dunes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/031-dunes-640.jpg, /blog/namibia-south-africa-photos/031-dunes-1280.jpg 2x, /blog/namibia-south-africa-photos/031-dunes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/031-dunes-320.jpg, /blog/namibia-south-africa-photos/031-dunes-640.jpg 2x, /blog/namibia-south-africa-photos/031-dunes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/031-dunes-320.jpg\" alt=\"Dunes photographed from Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dunes photographed from Dune 45.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGBwL/xAApEAABBAEDAgQHAAAAAAAAAAABAAIDBAUGERIhUQcjYXETcoGRocHx/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgQFAAP/xAAgEQACAQIHAQAAAAAAAAAAAAAAAQITMgMRFDFRUqGx/9oADAMBAAIRAxEAPwDot/WeciiaYpawI68jB0PuAVk8lqjUd9sj3ahMQBPk1q72H6AN3/Kl1c62ZobJyJ9yP4vMtHGZZ5bNYuwNd0LYZy1u/r3Stecbvg9Qg9jP3c9jxNtka+StW9vMlfY+GXH5SCQisnw1wzzyFu2Ae8jT+kW1kOz9CoS4XhCkc5kYc0ncjr6q9pKjHlMxBWsPkbG4bngdiiLliWsKFx1iGjVrRiKKCMMb3HI/coiKI28ykkj/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/032-dunes-960.jpg, /blog/namibia-south-africa-photos/032-dunes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/032-dunes-640.jpg, /blog/namibia-south-africa-photos/032-dunes-1280.jpg 2x, /blog/namibia-south-africa-photos/032-dunes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/032-dunes-320.jpg, /blog/namibia-south-africa-photos/032-dunes-640.jpg 2x, /blog/namibia-south-africa-photos/032-dunes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/032-dunes-320.jpg\" alt=\"Dunes photographed from Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dunes photographed from Dune 45.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBgcB/8QAIhAAAgIBAwQDAAAAAAAAAAAAAQIAAxEEFEETIVGBMTSx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAF/8QAHBEBAAIBBQAAAAAAAAAAAAAAAAEUAgURQVFh/9oADAMBAAIRAxEAPwDqvSoHIkHGmA7ug9zCWslrAu1xxwHIH7KtTYliBM2Ko4Biv78nGn4w3R23DIfYic0dRn7F4HjESux2qXiO4s8zzcOeYiYjZUtqLM/MREQP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/033-dunes-960.jpg, /blog/namibia-south-africa-photos/033-dunes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/033-dunes-640.jpg, /blog/namibia-south-africa-photos/033-dunes-1280.jpg 2x, /blog/namibia-south-africa-photos/033-dunes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/033-dunes-320.jpg, /blog/namibia-south-africa-photos/033-dunes-640.jpg 2x, /blog/namibia-south-africa-photos/033-dunes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/033-dunes-320.jpg\" alt=\"Dunes photographed from Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dunes photographed from Dune 45.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBwUG/8QAKBAAAgEDAQUJAAAAAAAAAAAAAQIAAwQREgUGMUHRByFRcYGCkaHB/8QAGAEAAgMAAAAAAAAAAAAAAAAAAAIBAwT/xAAYEQEBAQEBAAAAAAAAAAAAAAAAARITQf/aAAwDAQACEQMRAD8A7KvQ5Wy/I6S+Nr3GkANUwBgZbh9TNau+99rJopbovJSuoj1li27QL0DTXtaLjxQlD+yq2+teY0I7ZuM97OfeOkTxib8WrLmpbXKtzCspERd0c4zSiM4JJk6EkkcPKIjURMAMRESA/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/034-dune-45-960.jpg, /blog/namibia-south-africa-photos/034-dune-45-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/034-dune-45-640.jpg, /blog/namibia-south-africa-photos/034-dune-45-1280.jpg 2x, /blog/namibia-south-africa-photos/034-dune-45-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/034-dune-45-320.jpg, /blog/namibia-south-africa-photos/034-dune-45-640.jpg 2x, /blog/namibia-south-africa-photos/034-dune-45-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/034-dune-45-320.jpg\" alt=\"Tourists climbing up Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Tourists climbing up Dune 45.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBAf/xAAlEAABBAEDAgcAAAAAAAAAAAABAAIDBAUREiEiMQYjUXGRsbL/xAAYAQACAwAAAAAAAAAAAAAAAAAEBgACA//EAB0RAAICAgMBAAAAAAAAAAAAAAABAxECBAUUoUH/2gAMAwEAAhEDEQA/AI+LESRuAewg/a2KOIcdOldtC6OA/Qj0KrcPPRLPNicXDtsI5+URrc5HmqlVPwmzw8mDuJ2vTAiwx2DpRVD/ABNgqrzFZrXIZB3a8MB/SI7vYMA6ki+Hl9Z7tBytrHzyNI0ciJHHMpYbMjom7tp92goiKyZnR//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/035-dune-45-960.jpg, /blog/namibia-south-africa-photos/035-dune-45-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/035-dune-45-640.jpg, /blog/namibia-south-africa-photos/035-dune-45-1280.jpg 2x, /blog/namibia-south-africa-photos/035-dune-45-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/035-dune-45-320.jpg, /blog/namibia-south-africa-photos/035-dune-45-640.jpg 2x, /blog/namibia-south-africa-photos/035-dune-45-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/035-dune-45-320.jpg\" alt=\"Man climbing up Dune 45 in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Man climbing up Dune 45.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcBAwQI/8QAKBAAAQMDAgMJAAAAAAAAAAAAAQACAwQRIQcxEhMiFBclUWGRk7HR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQMEAv/EABcRAQEBAQAAAAAAAAAAAAAAAAABEwL/2gAMAwEAAhEDEQA/APR9HRQUMDYKSFkMLdmsFgsytwpI7WynB4eyQE+XMcubvrBkkaaCF+ekB7hYWGPXNyl6Q3OqvI3qRSCTWizj4VD8rvxFrWBl0jRlcSM73HsuaSZ/Ac7C/wBIimiqtUj3AixOyIiIP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/036-sandstorm-960.jpg, /blog/namibia-south-africa-photos/036-sandstorm-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/036-sandstorm-640.jpg, /blog/namibia-south-africa-photos/036-sandstorm-1280.jpg 2x, /blog/namibia-south-africa-photos/036-sandstorm-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/036-sandstorm-320.jpg, /blog/namibia-south-africa-photos/036-sandstorm-640.jpg 2x, /blog/namibia-south-africa-photos/036-sandstorm-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/036-sandstorm-320.jpg\" alt=\"Man in Namib-Naukluft National Park, Namibia with a sandstorm coming up behind him\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Man in Namib-Naukluft National Park.</figcaption></figure><p></p>\n<h2>Deadvlei in Namib-Naukluft National Park</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwEF/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQIEAwURABIhBhMxByJBFBVRUmH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgME/8QAGxEAAwACAwAAAAAAAAAAAAAAAAECAxIxQZH/2gAMAwEAAhEDEQA/AIPVNztPTNnts+uIslbindjJHqCq7p+55wBnjn5yPg6qkH1MtjzqNJ4bRaTNtNZtmE/pwpONWKT0vZ73aOmpdl6fuEqL2GqoKMd2Tt7nY03OTg7mzjOTzqNO6XlVba0NPTe5M1WLu+ojw1pstQ+F8ZBHGefzxpnNU2qyP1hTS4k9mR129plyYL2+vINGqydzuqwODjgjyM5xpq0XOPEjSRQ+1249pFTdXD72wPJx86azaSuy2zNUs6JTibKSJTQVHASmoVQAccAcDxrkSOr0Xeo9V6lV2JZnPt9xACjwAABjTTVRDGp1+lV7tcxWow37UurRUtHUnarEDnHPA0001Mc//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/037-deadvlei-bird-960.jpg, /blog/namibia-south-africa-photos/037-deadvlei-bird-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/037-deadvlei-bird-640.jpg, /blog/namibia-south-africa-photos/037-deadvlei-bird-1280.jpg 2x, /blog/namibia-south-africa-photos/037-deadvlei-bird-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/037-deadvlei-bird-320.jpg, /blog/namibia-south-africa-photos/037-deadvlei-bird-640.jpg 2x, /blog/namibia-south-africa-photos/037-deadvlei-bird-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/037-deadvlei-bird-320.jpg\" alt=\"Bird sitting in a Safari vehicle near Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Bird sitting in a Safari vehicle near Deadvlei.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAQID/8QAIxAAAgIBBAICAwAAAAAAAAAAAQIAAxEEEiExIkFx0TJRwf/EABkBAAIDAQAAAAAAAAAAAAAAAAIEAAEDBf/EABoRAAIDAQEAAAAAAAAAAAAAAABSAhShFQH/2gAMAwEAAhEDEQA/ALS3TBbhW2FpKlyfZIPX9mKdE7VIdSQr4/BeAPuQbNGxavdbkg5A+Afc0qptZnyShVjgMd24fsH1Av8Aq6NUothaHSL6xEq7NLfu8XHXPf3E06cl0HnwbCexU8lEJHXiI3YBACgfEROYOnInnoRESiH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/038-deadvlei-oryx-960.jpg, /blog/namibia-south-africa-photos/038-deadvlei-oryx-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/038-deadvlei-oryx-640.jpg, /blog/namibia-south-africa-photos/038-deadvlei-oryx-1280.jpg 2x, /blog/namibia-south-africa-photos/038-deadvlei-oryx-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/038-deadvlei-oryx-320.jpg, /blog/namibia-south-africa-photos/038-deadvlei-oryx-640.jpg 2x, /blog/namibia-south-africa-photos/038-deadvlei-oryx-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/038-deadvlei-oryx-320.jpg\" alt=\"Oryx near Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Oryx near Deadvlei.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIEA//EACUQAAICAgADCQAAAAAAAAAAAAABAgMFEQQVITEyQVJhYoGRsf/EABcBAQEBAQAAAAAAAAAAAAAAAAIGAwT/xAAdEQABAwUBAAAAAAAAAAAAAAAAAQMVEVFhgZHw/9oADAMBAAIRAxEAPwCOVe0mWKflLWU4pJath81pkWZTiG03c+ngoRS/DsnWrKZwr109ozyxb33QaHnpp6dVT9dMDnGc8BDv46Z9JrsOVkUASBVGKyuLl139gAdQ0P/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/039-deadvlei-dunes-960.jpg, /blog/namibia-south-africa-photos/039-deadvlei-dunes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/039-deadvlei-dunes-640.jpg, /blog/namibia-south-africa-photos/039-deadvlei-dunes-1280.jpg 2x, /blog/namibia-south-africa-photos/039-deadvlei-dunes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/039-deadvlei-dunes-320.jpg, /blog/namibia-south-africa-photos/039-deadvlei-dunes-640.jpg 2x, /blog/namibia-south-africa-photos/039-deadvlei-dunes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/039-deadvlei-dunes-320.jpg\" alt=\"Dunes near Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dunes near Deadvlei.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQCBQH/xAAnEAACAgEBBgcBAAAAAAAAAAABAgADBBEFBiEiQWISEzFRYXGxwf/EABgBAAMBAQAAAAAAAAAAAAAAAAEEBQID/8QAGhEBAAEFAAAAAAAAAAAAAAAAAFIBAgMEFP/aAAwDAQACEQMRAD8Aix8jeituTPUr3orfonSq2lvGp1sux3HbWo/koVkA9ZoX0qOYkk/Em02csliutiiks2tvKGPlnEK9PFXxiVHPRTohYD6ETfTfNz57IOSjtqBqeM0bG94iKGnhJPWIiEH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/040-deadvlei-960.jpg, /blog/namibia-south-africa-photos/040-deadvlei-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/040-deadvlei-640.jpg, /blog/namibia-south-africa-photos/040-deadvlei-1280.jpg 2x, /blog/namibia-south-africa-photos/040-deadvlei-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/040-deadvlei-320.jpg, /blog/namibia-south-africa-photos/040-deadvlei-640.jpg 2x, /blog/namibia-south-africa-photos/040-deadvlei-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/040-deadvlei-320.jpg\" alt=\"Dead tree at Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dead tree at Deadvlei.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMEBQf/xAAnEAACAQMDAgYDAAAAAAAAAAABAgMABBESEzEFQQYhI1FhgTJygv/EABgBAAMBAQAAAAAAAAAAAAAAAAABBQME/8QAHBEAAgEFAQAAAAAAAAAAAAAAAAECAwQUIZFS/9oADAMBAAIRAxEAPwDmtJM34lQP1qe44k29zLadX1W02spz6Ug/k1xITJNf3BGUQHZUsCM4yTj386nZVeW3N9ZXdtQjpRXEbDLIeCp+qVF5IInKPIgYcjVjFKMu49vrFjW/lcR6P4kv57Xod1LA2iURnS/dTjkfNS6EFHRbODQjRJEuFZQ2fk55PfNKVqcpae2t5JMvbwsfcoKUpSA//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/041-deadvlei-960.jpg, /blog/namibia-south-africa-photos/041-deadvlei-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/041-deadvlei-640.jpg, /blog/namibia-south-africa-photos/041-deadvlei-1280.jpg 2x, /blog/namibia-south-africa-photos/041-deadvlei-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/041-deadvlei-320.jpg, /blog/namibia-south-africa-photos/041-deadvlei-640.jpg 2x, /blog/namibia-south-africa-photos/041-deadvlei-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/041-deadvlei-320.jpg\" alt=\"Dead tree at Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dead tree at Deadvlei.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFBv/EACYQAAEDAwMCBwAAAAAAAAAAAAIAAQMEESEFBmFxkRIUIjEzQaH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQQG/8QAGREBAAMBAQAAAAAAAAAAAAAAAAECFFEV/9oADAMBAAIRAxEAPwDsCoeFPLQcLHrN3agQWpaemC2CMgM89FM266+KJhOPzEhZuUPhZu1lftrCXHaWnJp/q9kWI+59SJ3dxphv9NG727uifoU6MF+M05XHAiLdGU0sx2ZmezcYRFm5aCE5HJf5C/EREw//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/042-deadvlei-dunes-960.jpg, /blog/namibia-south-africa-photos/042-deadvlei-dunes-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/042-deadvlei-dunes-640.jpg, /blog/namibia-south-africa-photos/042-deadvlei-dunes-1280.jpg 2x, /blog/namibia-south-africa-photos/042-deadvlei-dunes-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/042-deadvlei-dunes-320.jpg, /blog/namibia-south-africa-photos/042-deadvlei-dunes-640.jpg 2x, /blog/namibia-south-africa-photos/042-deadvlei-dunes-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/042-deadvlei-dunes-320.jpg\" alt=\"Dunes near Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dunes near Deadvlei.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYFA//EACkQAAEDAwIFAwUAAAAAAAAAAAECAwQABRESQQchMVFxBhQyEyKSobH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAgP/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQMSUaECEzH/2gAMAwEAAhEDEQA/AI2HaJrkgNKjuOJbxrUgAjR3Hfz0NaSrC9DRFlkLUl06RhAP089xzrdHEP2ai3DMYpT9qALaUnH5/rpUxI9QXgvPFlbQhOyEv+1UzhOQc7ZUkb4zRVC/RvYi/jz4LEZlmdbnHX0ICStMcYI23pWC1xDupTl2Da3VZ+RadBI2z1pWlZM7JtwxorUJQqS6ktt45n4jJ5iuzjSG1jQNPjxSlDYpEzeJcpme42zJcQgdAMH+ilKVSSIbZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/043-deadvlei-oryx-960.jpg, /blog/namibia-south-africa-photos/043-deadvlei-oryx-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/043-deadvlei-oryx-640.jpg, /blog/namibia-south-africa-photos/043-deadvlei-oryx-1280.jpg 2x, /blog/namibia-south-africa-photos/043-deadvlei-oryx-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/043-deadvlei-oryx-320.jpg, /blog/namibia-south-africa-photos/043-deadvlei-oryx-640.jpg 2x, /blog/namibia-south-africa-photos/043-deadvlei-oryx-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/043-deadvlei-oryx-320.jpg\" alt=\"Oryx near Deadvlei in Namib-Naukluft National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Oryx near Deadvlei.</figcaption></figure><p></p>\n<h2>Aiais National Park</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMFBwT/xAArEAABAwMCBAQHAAAAAAAAAAABAgMEABESBRMHITFBBhUicTJRYXKBkZL/xAAXAQADAQAAAAAAAAAAAAAAAAABAgME/8QAHREAAgEEAwAAAAAAAAAAAAAAAAECBBESMQMhQv/aAAwDAQACEQMRAD8Ax3TtQlxLPsJyYW5glwcrH5e/etJ0XiHq+keHZrUqAiQCpKWYi2iBjY5KzBv2Axtzv2qGLwl15lCW1eWhnc3FpTIVc/aceR6i9q5GfC+pavMEByLI0uWhovIXMWcVo6G1gb/n61GN+OWUWFwyjZoqYPFPXIcCPHhtR2Wm0kYozQPiJ6JUBSrRfBWa4or80T6uZ22iUj9ilWVTbrIR06fk2txbq5gu84ApN7JViBzHS1SxoMZqWiRtBb4YCdxwlRsT09qUrNLZrWiYzXR2R/NKUoin/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/044-aiai-warning-960.jpg, /blog/namibia-south-africa-photos/044-aiai-warning-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/044-aiai-warning-640.jpg, /blog/namibia-south-africa-photos/044-aiai-warning-1280.jpg 2x, /blog/namibia-south-africa-photos/044-aiai-warning-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/044-aiai-warning-320.jpg, /blog/namibia-south-africa-photos/044-aiai-warning-640.jpg 2x, /blog/namibia-south-africa-photos/044-aiai-warning-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/044-aiai-warning-320.jpg\" alt=\"Sign warning from baboons at the camping grounds in Aiais National Park, Namibia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sign warning from baboons at the camping grounds in Aiais National Park.</figcaption></figure><p></p>\n<h2>Orange River</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYCAwQF/8QAKBAAAQQBAwIFBQAAAAAAAAAAAQACAxEEBSExEhUGFEFDYXFzkaHR/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwEEBf/EACARAAIBAwQDAAAAAAAAAAAAAAABAwIUMQQVIVJTkfD/2gAMAwEAAhEDEQA/ALQaAIpS6NnXXLTt+CspdOy5AYoYBE08lrefqfVRpg10OAfmF7qokS1+1yZOFrk20eSS6tj5u63+SuotdI8xsx2lCXFf3sqn+Gn9Rstv5KKS7ZqVC2OJ+8P6iu4y+NksYu54TdUy5sgMdKQDzW1rXlZuRE5xbK62nY2iJVkF4OfuuYfdKIiQM//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/045-orange-river-960.jpg, /blog/namibia-south-africa-photos/045-orange-river-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/045-orange-river-640.jpg, /blog/namibia-south-africa-photos/045-orange-river-1280.jpg 2x, /blog/namibia-south-africa-photos/045-orange-river-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/045-orange-river-320.jpg, /blog/namibia-south-africa-photos/045-orange-river-640.jpg 2x, /blog/namibia-south-africa-photos/045-orange-river-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/045-orange-river-320.jpg\" alt=\"Orange River with Namibia on the left bank and South Africa on the right bank\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Orange River with Namibia on the left bank and South Africa on the right bank.</figcaption></figure><p></p>\n<h2>Cape Town, South Africa</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwP/xAApEAACAgEDAgYBBQAAAAAAAAABAgMEEQAFIQYSBxMiMUFRYRQjM3GB/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwIABP/EACIRAAIBAgUFAAAAAAAAAAAAAAABEQIDEhMhMVEUQYGh0f/aAAwDAQACEQMRAD8AqW3bedyq75FFLU2ytTh/n82SPzkSX0d6g4keTIXn2xnGoaDy4am5LYd6tqFQ6rKnuh9lBJ4IzwPY61jqSXppd4tWt9liq9QlI5LcFeUNE3aO0iVAMI2SrAL3Nkc/WqT4fdVttfiBBNaoQOtlJKyJaIQIzD0El+FHcADn4OuDHm3FbqWkT54gytp0ycNq6U3bc67Wo9r3eJJGyq/pCMjA5yzAtn701s/WXh5P1LusW5X97mgsvXRXipMrRKQMEL5kgI5zwAB/udNP065fr4HDMR8SZlXrC3UrV4K1YRmTsjBOXIJLEsSSSR8n5P3qoX7PfWWuYIMxIZTN2fuyFgOGb5A7eB+TppqoS0RXckeqJU2x9shr14WL0YppJJAWZ3fLEk5/OBj4A/vTTTSPcJ7n/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/046-bird-960.jpg, /blog/namibia-south-africa-photos/046-bird-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/046-bird-640.jpg, /blog/namibia-south-africa-photos/046-bird-1280.jpg 2x, /blog/namibia-south-africa-photos/046-bird-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/046-bird-320.jpg, /blog/namibia-south-africa-photos/046-bird-640.jpg 2x, /blog/namibia-south-africa-photos/046-bird-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/046-bird-320.jpg\" alt=\"Bird in a tree near Cape Town, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Bird in a tree near Cape Town.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgMH/8QAKhAAAgEEAAMGBwAAAAAAAAAAAQIDAAQFEQYhMRIiI1GRwUFCUmJxsdH/xAAXAQEBAQEAAAAAAAAAAAAAAAAFAgAB/8QAHBEAAgEFAQAAAAAAAAAAAAAAAAEUAhNBUbFC/9oADAMBAAIRAxEAPwC5ixpA70yehNdY8agcM1zo/bF/ax0PHeMvm2uVaAj5WQpU614ssteDm7aXfUM+yPUUrLpfrgXHqWOmmewjZttPMT58h7UqgHFUB6X0T6+IRvYUrkhbKsvR4jkcHaxqWjaZTv69/uomNx0T30iPJKVjHaHMDf55UpQuBRm8x6JJZQyToJpHXZZyQeutciPKlKVij//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/047-table-mountain-960.jpg, /blog/namibia-south-africa-photos/047-table-mountain-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/047-table-mountain-640.jpg, /blog/namibia-south-africa-photos/047-table-mountain-1280.jpg 2x, /blog/namibia-south-africa-photos/047-table-mountain-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/047-table-mountain-320.jpg, /blog/namibia-south-africa-photos/047-table-mountain-640.jpg 2x, /blog/namibia-south-africa-photos/047-table-mountain-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/047-table-mountain-320.jpg\" alt=\"Table Mountain in Cape Town, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Table Mountain in Cape Town.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwT/xAAkEAABBAEEAQUBAAAAAAAAAAABAAIDEQQSEyExQQUGYXGRof/EABgBAAIDAAAAAAAAAAAAAAAAAAIGAwQF/8QAIBEAAgIBAwUAAAAAAAAAAAAAAAECA5EEETEFEiJCUf/aAAwDAQACEQMRAD8AkiNIoqbyPJWhxMfCw5J5847kWNFukWKdxf4PlTHviy8yR+JGWYr9IgZprgD+nr9TDDqNM7FBcfTHlorYw7ng8e2T0BXyiqxYcz222JxANIrL1FSezmsogVVj4i8E995vo+Vuuc0StaHhhrUC6iPquFw9qhsUUOO1o24YyWDoghl3Y82e0RJafiMvsavD1VKHPc7S8gE/QREQtsPY/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/048-table-mountain-cable-car-960.jpg, /blog/namibia-south-africa-photos/048-table-mountain-cable-car-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/048-table-mountain-cable-car-640.jpg, /blog/namibia-south-africa-photos/048-table-mountain-cable-car-1280.jpg 2x, /blog/namibia-south-africa-photos/048-table-mountain-cable-car-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/048-table-mountain-cable-car-320.jpg, /blog/namibia-south-africa-photos/048-table-mountain-cable-car-640.jpg 2x, /blog/namibia-south-africa-photos/048-table-mountain-cable-car-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/048-table-mountain-cable-car-320.jpg\" alt=\"Cable Car going up Table Mountain, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cable Car going up Table Mountain.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYFCP/EACcQAAEDAgUEAgMAAAAAAAAAAAECAwQAEQUSEyExBiJBUWGRcYHB/8QAGQEAAgMBAAAAAAAAAAAAAAAAAgUAAQME/8QAIBEAAgICAAcAAAAAAAAAAAAAAREAAwIhQVFhcZHB8f/aAAwDAQACEQMRAD8A5/eMnGsYjxYSFJkZ7Nd9iVE3Kif0PqquFh3UimDHxGHqNKU3nLirqcUo2sSDcqAB42HmsbpSHExCW6kFwYg2NVCj4IIAI92vcj4FVsmRIVhwinFdZ9vMhSxYF8gHx4sLfZpfdaARioxpqrNbzJfDl2PX5J7qd9GG4nosNKLJaQtGbuOUja/r8UrRjvR1RGDFiKcaCMuZ13uJGx5PFwaVnjcMQiJzN7a8ybwhWn1EFJAGRlWw2zdvm3PNa0FSZDy3HW0FSXdfjlaTsT/RSlVf6gZSpZcQ3DjFxhp5S2wu7lxluTsAkgAfFqUpQZaOpE5//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/049-table-mountain-flower-960.jpg, /blog/namibia-south-africa-photos/049-table-mountain-flower-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/049-table-mountain-flower-640.jpg, /blog/namibia-south-africa-photos/049-table-mountain-flower-1280.jpg 2x, /blog/namibia-south-africa-photos/049-table-mountain-flower-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/049-table-mountain-flower-320.jpg, /blog/namibia-south-africa-photos/049-table-mountain-flower-640.jpg 2x, /blog/namibia-south-africa-photos/049-table-mountain-flower-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/049-table-mountain-flower-320.jpg\" alt=\"Flower on Table Mountain, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Flower on Table Mountain.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMEBQb/xAAiEAABBAMAAAcAAAAAAAAAAAABAAIDEQQhMRJBUWGBsdH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEBQb/xAAcEQACAQUBAAAAAAAAAAAAAAAAAgEDBBESMSH/2gAMAwEAAhEDEQA/APMOjk7DI14O6Ois0mRLG7wvBBUoMjRBA+OhSz5raC0Podv7pU6F0zNq0gq1usLspc5x9Si4TsjfUTtgWDRVsLhYIYDo+axtzZ2SCnnR1aIs9TnwtMSaWvFljQfa/wBRETIdsdCSi54f/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/050-table-mountain-view-960.jpg, /blog/namibia-south-africa-photos/050-table-mountain-view-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/050-table-mountain-view-640.jpg, /blog/namibia-south-africa-photos/050-table-mountain-view-1280.jpg 2x, /blog/namibia-south-africa-photos/050-table-mountain-view-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/050-table-mountain-view-320.jpg, /blog/namibia-south-africa-photos/050-table-mountain-view-640.jpg 2x, /blog/namibia-south-africa-photos/050-table-mountain-view-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/050-table-mountain-view-320.jpg\" alt=\"View from Table Mountain, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View from Table Mountain.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMEBQb/xAAmEAACAQMDBAEFAAAAAAAAAAABAgMABBESEyEFBjFRQQcygaGx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAEDAv/EABoRAQEBAAMBAAAAAAAAAAAAAAEAAhESMUH/2gAMAwEAAhEDEQA/AOV+rHTpE7btrq4jkd1vYdRfngk8E/iuguJLCRdqS9gS4Y5VDMMg5+R+vdT9xpe33R5I7FIriRmUHfAYYzywDfI8jNY9n2xswsDtI7Nlm+4gVDS/CtnI+tsDpRcAssQ9FVzke6VY1sAFDsNI08ilHVjkpCNu3VkyDoH8qtNPJIuCcZGcjzSlbJNdsbdLi2R5MlvGaUpSlf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/051-dassie-960.jpg, /blog/namibia-south-africa-photos/051-dassie-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/051-dassie-640.jpg, /blog/namibia-south-africa-photos/051-dassie-1280.jpg 2x, /blog/namibia-south-africa-photos/051-dassie-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/051-dassie-320.jpg, /blog/namibia-south-africa-photos/051-dassie-640.jpg 2x, /blog/namibia-south-africa-photos/051-dassie-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/051-dassie-320.jpg\" alt=\"Dassie on Table Mountain, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dassie on Table Mountain.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwj/xAApEAABAwQBAgQHAAAAAAAAAAABAgMEAAURIRIxUQYTIkEjUmFxgZGx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAwQFAP/EACERAAIBAwMFAAAAAAAAAAAAAAECAAMRQQUxkRIUIWGh/9oADAMBAAIRAxEAPwDQ3fxa7CfcRAShYSnJdUoa9+mf7Uy23u9z4jkkyGHWQ5xw4DyJ9wMDQ+9FN2WPLRcGoMdNxc9QXJSM8AnHMJX031+g71TdlyLgyJLSWyhhfB3yjgYGyoBI1ok77URKlwSRtM1LyoB3PzPqUIVvfuEZElybHjFefhqC3CMHGyMCld7fAjvRkuecl9KgOLgJ9QwMHrSoz6m/UbEcR/s0xPPfg7xBcL7fpSLq8ZKQznDpK9hQGdk1p5NshrUQGA1nqWVFvv8AKR3P7pSqxiMr2qTItsFuLDkOtsN6SkqKsfk7pSlBNJCblRxCB2GZ/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/069-bo-kaap-960.jpg, /blog/namibia-south-africa-photos/069-bo-kaap-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/069-bo-kaap-640.jpg, /blog/namibia-south-africa-photos/069-bo-kaap-1280.jpg 2x, /blog/namibia-south-africa-photos/069-bo-kaap-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/069-bo-kaap-320.jpg, /blog/namibia-south-africa-photos/069-bo-kaap-640.jpg 2x, /blog/namibia-south-africa-photos/069-bo-kaap-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/069-bo-kaap-320.jpg\" alt=\"Colorful houses in the Bo Kaap neighborhood in Cape Town, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Colorful houses in the Bo Kaap neighborhood in Cape Town.</figcaption></figure><p></p>\n<h2>Boulder Beach</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIHAwUI/8QAJxAAAQMCBAYDAQAAAAAAAAAAAQACAwQRBRIhUQcTMUJSkRRhgaH/xAAZAQACAwEAAAAAAAAAAAAAAAACAwABBAX/xAAcEQACAwEAAwAAAAAAAAAAAAAAAQIREjETIpH/2gAMAwEAAhEDEQA/ALLFXftPtSNRGRqSPxUzQ8X5q8SfFwctDej55g0fwXUDxCxpkRcH0RzSmQnlF1mnsFzoBv1TMXxA6rpcpqYvI+kXOFXjmKVNTJM/G8Wa55vljqMrR9AAaIqwyaNI6VsLhDHDG1gB8tr7rIZLVTYA0ZHak3N+l90Rc3yz0vZ/Ryiq4RnHLflaTa10RFpjOVdBaR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/052-boulder-beach-penguin-960.jpg, /blog/namibia-south-africa-photos/052-boulder-beach-penguin-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/052-boulder-beach-penguin-640.jpg, /blog/namibia-south-africa-photos/052-boulder-beach-penguin-1280.jpg 2x, /blog/namibia-south-africa-photos/052-boulder-beach-penguin-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/052-boulder-beach-penguin-320.jpg, /blog/namibia-south-africa-photos/052-boulder-beach-penguin-640.jpg 2x, /blog/namibia-south-africa-photos/052-boulder-beach-penguin-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/052-boulder-beach-penguin-320.jpg\" alt=\"African Penguins on Boulder Beach, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">African Penguins on Boulder Beach.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAYBAgMF/8QAKBAAAgICAQMDAwUAAAAAAAAAAQIDBAARBRIhMQYiUUFhcRMUMrHw/8QAGAEAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAdEQACAwACAwAAAAAAAAAAAAAAAQIREgMhMUJh/9oADAMBAAIRAxEAPwCGsWp4qjs8T2Iyixsit2APff8AvvnGSSrBCJZ6RRPKkL7vg6B+Cfxl5x0nDX6VFq8EUdtFIuvH1tOwHk6VtAkH+RHkb+mdnIeoPT9VYoZONEyRxCoa1iMFCOolCDonqG9dXkg9/pkMFLN3SDP0k3NddbIXY3pvaf6xnlcvV9Q3brS0oqkdfQVVjlCgfgEYzK2/YVyN4l5eKhtfs55leWNet+shm9vyNZnCcPDzN/Vye11IocMspJ3v77xjKuZUlQ49+SgvcBSE+z+uWI2SZW7nGMZ1gllA12f/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/053-boulder-beach-penguin-960.jpg, /blog/namibia-south-africa-photos/053-boulder-beach-penguin-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/053-boulder-beach-penguin-640.jpg, /blog/namibia-south-africa-photos/053-boulder-beach-penguin-1280.jpg 2x, /blog/namibia-south-africa-photos/053-boulder-beach-penguin-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/053-boulder-beach-penguin-320.jpg, /blog/namibia-south-africa-photos/053-boulder-beach-penguin-640.jpg 2x, /blog/namibia-south-africa-photos/053-boulder-beach-penguin-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/053-boulder-beach-penguin-320.jpg\" alt=\"African Penguin running on Boulder Beach, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">.African Penguin running on Boulder Beach.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMHCAIE/8QAKRAAAgECBQIFBQAAAAAAAAAAAQIAAxEEEiEiMQcTBSRBUWEycYGR8P/EABgBAAIDAAAAAAAAAAAAAAAAAAEDAAIE/8QAHBEAAgEFAQAAAAAAAAAAAAAAAAEDAhExUWGh/9oADAMBAAIRAxEAPwCyEpqBtLCTKGA0cn7iZ8r9XsUz0qmHNcBXtd22m+liBzJ26ueItTxQIDBjmThe2MouCRzr7e8c56U7NiFTwvw39Sn5iZ3wXUy9Dzidyrf6ht0/cSKaPfgLPRVNE5aS1Bo2Yr8H+vOkxVZKFWzDccpuBxETNkaehsrEHIouB6fERECwVP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/054-boulder-beach-penguin-960.jpg, /blog/namibia-south-africa-photos/054-boulder-beach-penguin-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/054-boulder-beach-penguin-640.jpg, /blog/namibia-south-africa-photos/054-boulder-beach-penguin-1280.jpg 2x, /blog/namibia-south-africa-photos/054-boulder-beach-penguin-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/054-boulder-beach-penguin-320.jpg, /blog/namibia-south-africa-photos/054-boulder-beach-penguin-640.jpg 2x, /blog/namibia-south-africa-photos/054-boulder-beach-penguin-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/054-boulder-beach-penguin-320.jpg\" alt=\"African Penguins on Boulder Beach, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">African Penguins on Boulder Beach.</figcaption></figure><p></p>\n<h2>Cape Point National Park</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcBAwQF/8QAJxAAAgAGAQIGAwAAAAAAAAAAAQIAAwQREiEFBjEHIkFRcYEUkbH/xAAZAQACAwEAAAAAAAAAAAAAAAADBAABBQb/xAAcEQACAgMBAQAAAAAAAAAAAAAAAQIDBBFSBRX/2gAMAwEAAhEDEQA/AJvzHTdVIVExfMgeVhkT8W9LRUPCfqedI4+bw3U0udLNMimlqZqk5yz2Q6sMQNXPY29In9RST1MxBydYumDOzuEU67kmxPxc6jrpaKrlqqfm1m2ZcWZsyfLa6hie/wDYFXnSre4oYnhKxabLk3P8NJODVUpD7MbH9QiOLxdcpOLVrk7ZlkTm2R7gbMIYXrS5A/LXR6syTLdvOitbYyF7RrZEVrhFBN7kCEIwzojEoY5FSwLG7EMRc2AufoAfUIQiiJI//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/055-cape-of-good-hope-960.jpg, /blog/namibia-south-africa-photos/055-cape-of-good-hope-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/055-cape-of-good-hope-640.jpg, /blog/namibia-south-africa-photos/055-cape-of-good-hope-1280.jpg 2x, /blog/namibia-south-africa-photos/055-cape-of-good-hope-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/055-cape-of-good-hope-320.jpg, /blog/namibia-south-africa-photos/055-cape-of-good-hope-640.jpg 2x, /blog/namibia-south-africa-photos/055-cape-of-good-hope-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/055-cape-of-good-hope-320.jpg\" alt=\"Sign marking the Cape of Good Hope in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sign marking the Cape of Good Hope in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUIAgQGB//EACoQAAIBAwMCBAcBAAAAAAAAAAECAwAEEQUhMQcSBhNBcRQiMmGBkbHR/8QAFgEBAQEAAAAAAAAAAAAAAAAABAMF/8QAHREAAgAHAQAAAAAAAAAAAAAAAAECAwQREkFRE//aAAwDAQACEQMRAD8Akb3qt4NayvEW4laUREKnkHEhPCgnYe5rc6e+I9H1fSBDFOkV0WLi1IUOqk+mNmB52qrz3E9vDKH8gmQFXwclvyNqmtIhj7ZGtLxo5o4zKoA5I3IUjg/5SFVNPJkHJTVkW2C2ePrGfalV20nqpr+j272t95N5IHLK9wr9yrgYXIG/B++9KSquW9sj4x8PNY53W7Ck92QBk8811OmyfD6JqNxCiLLGI1Vu30Zt/wCUpWVEP2Y3VhDNIHcvnGPlYqP0KUpUrsRiuH//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/056-cape-point-lighthouse-960.jpg, /blog/namibia-south-africa-photos/056-cape-point-lighthouse-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/056-cape-point-lighthouse-640.jpg, /blog/namibia-south-africa-photos/056-cape-point-lighthouse-1280.jpg 2x, /blog/namibia-south-africa-photos/056-cape-point-lighthouse-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/056-cape-point-lighthouse-320.jpg, /blog/namibia-south-africa-photos/056-cape-point-lighthouse-640.jpg 2x, /blog/namibia-south-africa-photos/056-cape-point-lighthouse-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/056-cape-point-lighthouse-320.jpg\" alt=\"Old lighthouse in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Old lighthouse in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAQMHBP/EAC0QAAIBAwEGAgsAAAAAAAAAAAECAwAEEQUGEiExQVEHIhMUFTJCYWNxkaHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQC/8QAHhEAAQMFAQEAAAAAAAAAAAAAAAECAwQRFDFREiH/2gAMAwEAAhEDEQA/AIPSdShv45ntllVklKBjGAcY+Jc5BJrHtCRg7LLlkJ3kC54d+f8AK8Gg6zHLM9nFaxrc3MoaSeQlzIcDORkYyAeI5djVwn2GvWunligiKt54NyRidzqDjBJyevemfUTNctl+BMiheiW2V9L1XUGRr0n6UIK/tqVsu9gdUlMbyadeqxQeX1flxPzpWcyTprGbwj/CvQbTW9WVr0ygxzIB6NgOv2ruO2V4+jWz3toiGSG2O4sgJX3uwIpSkqtKT0Bw7VPEbaC8uzK8tshIxupAuB+cmlKVB6XpfY//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/057-cape-point-beach-960.jpg, /blog/namibia-south-africa-photos/057-cape-point-beach-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/057-cape-point-beach-640.jpg, /blog/namibia-south-africa-photos/057-cape-point-beach-1280.jpg 2x, /blog/namibia-south-africa-photos/057-cape-point-beach-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/057-cape-point-beach-320.jpg, /blog/namibia-south-africa-photos/057-cape-point-beach-640.jpg 2x, /blog/namibia-south-africa-photos/057-cape-point-beach-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/057-cape-point-beach-320.jpg\" alt=\"A beach viewed from the old lighthouse in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">A beach viewed from the old lighthouse in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYDBf/EACkQAAIBAwMDAgcBAAAAAAAAAAECAwAEEQUGEiExQVFxBxMUIzJhgZH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAwL/xAAZEQEAAwEBAAAAAAAAAAAAAAAAAQIRITH/2gAMAwEAAhEDEQA/AJm7fQLfeiaHpc97LAGa2aBwsEsEmeoLSYXBx+X76+Kqt07QjtdOnv7a5M6W6/LktGCoykkAjIJBPYEeMkipvae6ptxXl5p24k05wCrW121mWM8kbZLqW6YwuT2zn1ru6nudtzaW+n3FqYzFOGhvIuQ5sGI6KRkDifPaozFdVr1Nrp+4HeT6C+SK3VuKorcAOg/33pWc2rLp0rQXSyNICT9pxgDOAPfAFKOqZDX4TTzz3Wl2c8zyWsEc7rG2McuXQ/zJ7VT7906PT+N3aSzRtcW5kaNWARWYAkgY9SfNKUM08SsTiWKMyRRMwUDPHqfelKVov//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/058-cape-point-flowers-960.jpg, /blog/namibia-south-africa-photos/058-cape-point-flowers-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/058-cape-point-flowers-640.jpg, /blog/namibia-south-africa-photos/058-cape-point-flowers-1280.jpg 2x, /blog/namibia-south-africa-photos/058-cape-point-flowers-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/058-cape-point-flowers-320.jpg, /blog/namibia-south-africa-photos/058-cape-point-flowers-640.jpg 2x, /blog/namibia-south-africa-photos/058-cape-point-flowers-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/058-cape-point-flowers-320.jpg\" alt=\"Flowers in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Flowers in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBQP/xAAlEAACAgAEBQUAAAAAAAAAAAAAAgEDBBEyUxITMTOBUVJhkZL/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQX/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEgH/2gAMAwEAAhEDEQA/AO0PVHWxI8lubTuIZ84W3Lu2+GJfDvM67V+Fc25xlU0Yup3FBmTh33Lv3IE4U6RY/un7LRY+WqQCojjb1AAH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/059-cape-point-whale-960.jpg, /blog/namibia-south-africa-photos/059-cape-point-whale-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/059-cape-point-whale-640.jpg, /blog/namibia-south-africa-photos/059-cape-point-whale-1280.jpg 2x, /blog/namibia-south-africa-photos/059-cape-point-whale-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/059-cape-point-whale-320.jpg, /blog/namibia-south-africa-photos/059-cape-point-whale-640.jpg 2x, /blog/namibia-south-africa-photos/059-cape-point-whale-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/059-cape-point-whale-320.jpg\" alt=\"Whale in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Whale in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcEAgP/xAAnEAACAQMDAgYDAAAAAAAAAAABAgMABREEEjEhUQYTInGBkRRBUv/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgT/xAAdEQEBAAIBBQAAAAAAAAAAAAABAAIREgMTFDFB/9oADAMBAAIRAxEAPwCRXC4ahHLqHQuck9ep/ePo1otOm10rSOFlwMKY1b1EkZBA4xVrk8K2Q6MldLC0oPmK2MhW+uBx3rPa7Bonf0vhg24JGqgLgY5Iz35yO1T5J71LttLBDNtX8m1s8n9Ny3XmlVyax22SQln1KsOhClcfFKZ1xPscG5ngEcsrB5W2qMKzkjnt8V5WNjqJnZzjY+AF6D396UrKmsXVRaZpm86TIDHceaUpTwXiRf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/060-bontebok-antelope-960.jpg, /blog/namibia-south-africa-photos/060-bontebok-antelope-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/060-bontebok-antelope-640.jpg, /blog/namibia-south-africa-photos/060-bontebok-antelope-1280.jpg 2x, /blog/namibia-south-africa-photos/060-bontebok-antelope-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/060-bontebok-antelope-320.jpg, /blog/namibia-south-africa-photos/060-bontebok-antelope-640.jpg 2x, /blog/namibia-south-africa-photos/060-bontebok-antelope-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/060-bontebok-antelope-320.jpg\" alt=\"Bontebok antelope in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Bontebok antelope in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAcIAgQFBv/EACgQAAIBAwEHBAMAAAAAAAAAAAECAwAEEQUGEhMhQYHRBxQxUmFisf/EABgBAAIDAAAAAAAAAAAAAAAAAAECAAME/8QAHREAAQQCAwAAAAAAAAAAAAAAAAECElEDExEhMf/aAAwDAQACEQMRAD8AnuPUImUkOMD8HxWnLtFaxs4ZLgqvywiOPNV3ufUm6kysGoapHEeaqbknHeuE+01zJJvPdOd77MxJ75qza1PUFitllH2201HKv7tSOnAJ/lKrMdYlc5ErDufNKm5lAi6yKZtSuZWWN3G7npyr0EMzcK3JwWYNknrg0pWfJ0OYw3DvGGKpk/rSlKXkJ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/061-cape-point-beach-960.jpg, /blog/namibia-south-africa-photos/061-cape-point-beach-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/061-cape-point-beach-640.jpg, /blog/namibia-south-africa-photos/061-cape-point-beach-1280.jpg 2x, /blog/namibia-south-africa-photos/061-cape-point-beach-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/061-cape-point-beach-320.jpg, /blog/namibia-south-africa-photos/061-cape-point-beach-640.jpg 2x, /blog/namibia-south-africa-photos/061-cape-point-beach-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/061-cape-point-beach-320.jpg\" alt=\"Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAwT/xAAkEAACAQQCAgIDAQAAAAAAAAABAgMABBEhBRIGQQciEzFhUv/EABYBAQEBAAAAAAAAAAAAAAAAAAMCAP/EABwRAQEAAQUBAAAAAAAAAAAAAAEAMQIDEhMhUv/aAAwDAQACEQMRAD8A9D/GtgRFfX6RNCI1d4PxHMoA37J3k6yMZxWB4t4H475Xx8XIwXdyoWQieFQqtGwwACMb0BjFWzyCxfkOKuLJbpbMF0ZZW/RHYEqDnWQCM+s1jeHcDxvj1/y9vxcKRQzyxyIGbswDJv3nr2BO/wDVRp2+Po+ychcU/b4H4qZmlPKXrBz2B6xjX9pVcN01viMIvVdDswBApU9j9TdY40U2h5i85bkTFdvlPqfrkEazrf8AK0Lq6kIEino+yWUnJwfZzmlKQILibp5mLTLHIw12ZATilKVkJDF//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/062-lizard-960.jpg, /blog/namibia-south-africa-photos/062-lizard-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/062-lizard-640.jpg, /blog/namibia-south-africa-photos/062-lizard-1280.jpg 2x, /blog/namibia-south-africa-photos/062-lizard-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/062-lizard-320.jpg, /blog/namibia-south-africa-photos/062-lizard-640.jpg 2x, /blog/namibia-south-africa-photos/062-lizard-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/062-lizard-320.jpg\" alt=\"Lizard in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Lizard in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYBAwcE/8QAJxAAAQMBBwMFAAAAAAAAAAAAAQACAwQFBgcREiExMlGSQYKhstL/xAAZAQABBQAAAAAAAAAAAAAAAAAEAAECAwX/xAAdEQEBAAEEAwAAAAAAAAAAAAABAAMCBBRRERIT/9oADAMBAAIRAxEAPwCtbeOiy5l8Fk3joRy549hXOocRrVaSXWbRTDuY9J+FsdiPLnqlsancfVuvb6ok3uFh+PkK9N46DPrd4FFz44mSjZti0zR2BZ+ET8zD3L4ZOqYNPH2OzSVOitk0yAhpyeQOURYqHiMW8dZXzRTljNOQA53REV+gPUoq3//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/063-cape-point-beach-960.jpg, /blog/namibia-south-africa-photos/063-cape-point-beach-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/063-cape-point-beach-640.jpg, /blog/namibia-south-africa-photos/063-cape-point-beach-1280.jpg 2x, /blog/namibia-south-africa-photos/063-cape-point-beach-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/063-cape-point-beach-320.jpg, /blog/namibia-south-africa-photos/063-cape-point-beach-640.jpg 2x, /blog/namibia-south-africa-photos/063-cape-point-beach-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/063-cape-point-beach-320.jpg\" alt=\"Beach in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Beach in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgH/xAArEAABAgUEAAMJAAAAAAAAAAABAgMABAURIQYSMUEUIjJRYXFygZGxwdH/xAAXAQADAQAAAAAAAAAAAAAAAAABAwQC/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAEDBAIUYVH/2gAMAwEAAhEDEQA/ALdvVNAf5nQPmQofqOvahoLe204lQJtdKSQPjiJbenaeloqVQJUKGNiX0G+eefrGT1e1VJbe3QdHya07VAOnYpRJ9JGcEW79vcOVuZeGHVjyLxWpKCCR4v7Nq/kIq5KnOOSUuuao8k0+ptJcbUyq6FWyMEjm8Idsz8E68XTZtvr2q4xfqIyZ1x5KN6UeYEnHvhCIiwiNvLANj2fzCEIKAf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/064-cape-point-shipwreck-960.jpg, /blog/namibia-south-africa-photos/064-cape-point-shipwreck-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/064-cape-point-shipwreck-640.jpg, /blog/namibia-south-africa-photos/064-cape-point-shipwreck-1280.jpg 2x, /blog/namibia-south-africa-photos/064-cape-point-shipwreck-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/064-cape-point-shipwreck-320.jpg, /blog/namibia-south-africa-photos/064-cape-point-shipwreck-640.jpg 2x, /blog/namibia-south-africa-photos/064-cape-point-shipwreck-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/064-cape-point-shipwreck-320.jpg\" alt=\"Shipwreck on the beach in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Shipwreck on the beach in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAgBAwQFBgf/xAAjEAABBAEDBQEBAAAAAAAAAAABAAIDEQQFBiESEzFRgWKh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAQIAA//EABcRAQEBAQAAAAAAAAAAAAAAAAARARL/2gAMAwEAAhEDEQA/APaJd5YFHtNBP6ctVmbkjyLByOlvpooKNmBvjMyRJG2QOmb5DmVx7VY916hBNLktnkmhkPEUnLWHzwQLU9xUSEOo4xN92/iKP0u89YLgY2QNaRYDnEn+Into4fScuQ5j4yGUY7J6RZr2Venlc18Yuw+yQfiIueFjDKc0lvRGQDXLeURE4H//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/065-eland-960.jpg, /blog/namibia-south-africa-photos/065-eland-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/065-eland-640.jpg, /blog/namibia-south-africa-photos/065-eland-1280.jpg 2x, /blog/namibia-south-africa-photos/065-eland-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/065-eland-320.jpg, /blog/namibia-south-africa-photos/065-eland-640.jpg 2x, /blog/namibia-south-africa-photos/065-eland-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/065-eland-320.jpg\" alt=\"Elands in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Elands in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQb/xAAoEAACAQMCBQMFAAAAAAAAAAABAgMABBESIQUTMUGRFCJRBiRhcYH/xAAXAQADAQAAAAAAAAAAAAAAAAABAwQA/8QAGxEAAgMAAwAAAAAAAAAAAAAAAAECERIDISP/2gAMAwEAAhEDEQA/AOJWwgVWWD1AkdNiy9DjqR3FUuIS2/BrmWz4sdLABonthqUqdwWx0J7/AKqy/wBQWC85by4xciLQkChlwDt8ncbVmW7tEsnpxJzIHVhnqzEdRntgVJCOlbHPo0ltodCPGt0I5BrUgbMD3FKp3HG7lZPtoV0kZYMM4bvj8d/7ShlhpEIbWPnrcYHOX2B8AkDxWrwoc1byWT3SBQuryPO5pSpeN+iMT5MMACLDGw+WGT1pSlVsYj//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/066-zebra-960.jpg, /blog/namibia-south-africa-photos/066-zebra-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/066-zebra-640.jpg, /blog/namibia-south-africa-photos/066-zebra-1280.jpg 2x, /blog/namibia-south-africa-photos/066-zebra-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/066-zebra-320.jpg, /blog/namibia-south-africa-photos/066-zebra-640.jpg 2x, /blog/namibia-south-africa-photos/066-zebra-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/066-zebra-320.jpg\" alt=\"Mountain Zebra in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Mountain Zebra in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMEBQb/xAAoEAACAgICAQMCBwAAAAAAAAABAgMRAAQSITEVIkFhoRQjUVJxgbH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQT/xAAeEQACAQQDAQAAAAAAAAAAAAAAAQIREyFBAzGhBP/aAAwDAQACEQMRAD8A8ws0EaE67zSxohYuimNQbrj7jZPn4Oafx+xFBb6jSFiOJUF6F9XVDtRd/wCZWtaXXiEEia7yKZAWAagCR89WeJymzINEw83YpM0YI/YWPGx/Jr75ivQekLaloh6tKUjKaKKSo5BlZ+/oQw6+mM66ppJyXaUiYMQwLla76+2MJ/TCLo14VcTe/TH6frTbrKYlVY/zQqihyF/H9DKaWvEdYsyBqc0G9wFAsPP6HvGMNvCL0cSfZYzyCVVmYMRyksmvNecYxiRSoH3ln//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/067-birds-960.jpg, /blog/namibia-south-africa-photos/067-birds-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/067-birds-640.jpg, /blog/namibia-south-africa-photos/067-birds-1280.jpg 2x, /blog/namibia-south-africa-photos/067-birds-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/067-birds-320.jpg, /blog/namibia-south-africa-photos/067-birds-640.jpg 2x, /blog/namibia-south-africa-photos/067-birds-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/067-birds-320.jpg\" alt=\"Birds in Cape Point National Park, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Birds in Cape Point National Park.</figcaption></figure>\n<figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAYDBAX/xAApEAACAQMDAgQHAAAAAAAAAAABAgMABBEFIVExYQYSI5EVIjJBcYHR/8QAFgEBAQEAAAAAAAAAAAAAAAAABQQD/8QAHBEBAAICAwEAAAAAAAAAAAAAAQACAwQREiEx/9oADAMBAAIRAxEAPwCa0XxBNpM8sNtKz2qtlYXXYjqccGq618WQXUQeKCQr0PzLseOtQ0IjmuIpBGiCMbkL9WBxx3712LJrSbT0aUpFORlwuB5SSd+/22rDXzWog8pKM2OthT7Kn47bnfD+wpUMJFKgm8hBPVfKxx22FKU8hvLNpYopbIK0a+mHcEbE8j8bD2rBZ6NZzaXcXXkZJI4y4CscZyec8UpROqvaI7AdZNtIAT6aH9n+0pSlJBP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/namibia-south-africa-photos/068-scenic-drive-960.jpg, /blog/namibia-south-africa-photos/068-scenic-drive-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/namibia-south-africa-photos/068-scenic-drive-640.jpg, /blog/namibia-south-africa-photos/068-scenic-drive-1280.jpg 2x, /blog/namibia-south-africa-photos/068-scenic-drive-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/namibia-south-africa-photos/068-scenic-drive-320.jpg, /blog/namibia-south-africa-photos/068-scenic-drive-640.jpg 2x, /blog/namibia-south-africa-photos/068-scenic-drive-960.jpg 3x\" src=\"/blog/namibia-south-africa-photos/068-scenic-drive-320.jpg\" alt=\"Coast between Cape Point and Cape Town, South Africa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Coast between Cape Point and Cape Town.</figcaption></figure><p></p>",
            "url": "/blog/namibia-south-africa-photos/",
            "title": "Namibia And South Africa In June 2019",
            "date_modified": "2019-07-11T21:29:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/gatsby-build-netlify-segmentation-fault/",
            "content_html": "<p>Yesterday evening I was switching this site from manual deploys to Git-based deploys, but the Gatsby build always failed because of a segmentation fault:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"token number\">11</span>:19:12 PM: <span class=\"token punctuation\">(</span>sharp:1509<span class=\"token punctuation\">)</span>: GLib-GObject-WARNING **: <span class=\"token number\">21</span>:19:12.143: gtype.c:4265: <span class=\"token builtin class-name\">type</span> <span class=\"token function\">id</span> <span class=\"token string\">'0'</span> is invalid\n<span class=\"token number\">11</span>:19:12 PM: <span class=\"token punctuation\">(</span>sharp:1509<span class=\"token punctuation\">)</span>: GLib-GObject-WARNING **: <span class=\"token number\">21</span>:19:12.143: can<span class=\"token string\">'t peek value table for type '</span><span class=\"token operator\">&#x3C;</span>invalid<span class=\"token operator\">></span><span class=\"token string\">' which is not currently referenced\n11:19:12 PM: (sharp:1509): GLib-GObject-WARNING **: 21:19:12.143: gvalue.c:188: cannot initialize GValue with type '</span><span class=\"token punctuation\">(</span>null<span class=\"token punctuation\">)</span>', this <span class=\"token builtin class-name\">type</span> has no GTypeValueTable implementation\n<span class=\"token number\">11</span>:19:18 PM: /usr/local/bin/build: line <span class=\"token number\">34</span>:  <span class=\"token number\">1509</span> Segmentation fault      <span class=\"token punctuation\">(</span>core dumped<span class=\"token punctuation\">)</span> gatsby build</code></pre></div>\n<p>In the log from Netlify we can see that segmentation fault happens in sharp, a library to process images. I never had problems with sharp in the past, but after some searching I found <a href=\"https://github.com/gatsbyjs/gatsby/issues/6291\">a Github issue</a> and sharp crashes sometimes when processing large amounts of images.</p>\n<p>In <a href=\"https://github.com/gatsbyjs/gatsby/issues/6291#issuecomment-505097465\">a comment</a> in the aforementioned issue I also found the solution for my problem. Add the following to your <code class=\"language-text\">gatsby-node.js</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> sharp <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'sharp'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nsharp<span class=\"token punctuation\">.</span><span class=\"token function\">cache</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nsharp<span class=\"token punctuation\">.</span><span class=\"token function\">simd</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The two lines disable caching and SIMD instructions, the later provides performance benefits, but <a href=\"https://github.com/gatsbyjs/gatsby/issues/6291#issuecomment-465008389\">sometimes causes sharp to segfault</a>.</p>\n<p>If you are reading this, the build now works correctly.</p>",
            "url": "/blog/gatsby-build-netlify-segmentation-fault/",
            "title": "Segmentation fault when building Gatsby on Netlify",
            "summary": "Gatsby build fails on Netlify because of a segmentation fault while processing images with `sharp`",
            "date_modified": "2019-08-16T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/gatsby-plugin-advanced-feed-1.0.0/",
            "content_html": "<p>TLDR: <a href=\"https://github.com/florianeckerstorfer/gatsby-plugin-advanced-feed\">@fec/gatsby-plugin-advanced-feed</a> is a Gatsby plugin that publishes RSS2, Atom and JSON feeds of your content.</p>\n<p>When I switched this site to Gatsby a couple of weeks ago I looked around for a Gatsby plugin to publish a feed of blog articles. Sadly all the existing plugins only allowed publishing of RSS2 feeds, but I also wanted to publish the feed in Atom and JSON Feed formats. Atom because that was the format I used on the previous version and JSON Feeds because it seems like the future of feeds to me.</p>\n<p>Since there was no existing plugin, I used <a href=\"https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-feed\">gatsby-plugin-feed</a> as a starting point and created my own plugin that supported Atom and JSON Feeds in addition to RSS2. For the last couple of weeks that plugin has lived inside the repository of this site, but earlier this week I released v1.0.0 of <a href=\"https://github.com/florianeckerstorfer/gatsby-plugin-advanced-feed\">@fec/gatsby-plugin-advanced-feed</a>.</p>\n<p>The highlights in short are:</p>\n<ul>\n<li>Generates RSS 2.0</li>\n<li>Generates Atom 1.0</li>\n<li>Generates JSON Feed 1.0</li>\n<li>Supports multiple feeds</li>\n<li>100% unit tested</li>\n</ul>\n<p>The tests are run on Github Actions, Github's CI service that is still in beta. If you are interested in how to run Jest tests on Github Actions the <a href=\"https://github.com/florianeckerstorfer/gatsby-plugin-advanced-feed/blob/master/.github/workflows/tests.yml\">workflow config</a> is on Github. It's quite simple.</p>",
            "url": "/blog/gatsby-plugin-advanced-feed-1.0.0/",
            "title": "@fec/gatsby-plugin-advanced-feed v1.0.0 released",
            "summary": "I released v1.0.0 of Gatsby plugin to published RSS2, Atom and JSON feeds",
            "date_modified": "2019-09-11T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/cocur-chain-0-8-0/",
            "content_html": "<p>I just released v0.8.0 of <a href=\"https://github.com/cocur/chain\">cocur/chain</a>, my PHP library to chain array operations.</p>\n<p>For this release I have updated the tooling and dependencies to more recent versions and I fixed the CI runs. Here are the release notes:</p>\n<h2>Version 0.8.0 (12 September 2019)</h2>\n<ul>\n<li><a href=\"https://github.com/cocur/chain/pull/40\">#40</a> Update tooling and dependencies, set minimum PHP version to 7.2</li>\n<li><a href=\"https://github.com/cocur/chain/pull/37\">#37</a> Add missing traits <code class=\"language-text\">\\Cocur\\Chain\\Chain</code> (by <a href=\"https://github.com/nreynis\">nreynis</a>)</li>\n<li><a href=\"https://github.com/cocur/chain/pull/41\">#41</a> Add <code class=\"language-text\">➞flatMap()</code> (by <a href=\"https://github.com/nreynis\">nreynis</a>)</li>\n</ul>",
            "url": "/blog/cocur-chain-0-8-0/",
            "title": "cocur/chain v0.8.0 released",
            "summary": "I released v0.8.0 of cocur/chain, PHP library to chain array operations",
            "date_modified": "2019-09-12T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/webclerks-2019/",
            "content_html": "<p>On Monday, November 25, I attended the <a href=\"https://webclerks.at\">Webclerks Community Conference</a> in Vienna and I wanted to give a short recap of this excellence conference. With nine speakers and two lightning talks during lunch break this was a packed conference with a good mixture of technical, inspiring and philosophical topics.</p>\n<h2>Jeremy Keith - Building</h2>\n<p><a href=\"https://adactio.com\">Jeremy Keith</a> started the day with a talk about the words and concepts we in the web community took from other disciplines such as architecture or engineering. Jeremy also took a look at the <a href=\"https://en.wikipedia.org/wiki/Shearing_layers\">pace layers</a> of the web. TCP/IP is the basis at the bottom, a technology that did not change at all. HTTP sits on top, it changes very slowly. Next comes HTML, which evolves also very relatively slowly. CSS changes more often, but less often than the JavaScript ecosystem (Jeremy calls it JS+). In the JS+ layer things change very often, for example, we experimented with the best ways to embed responsive images in websites. Once we have established a system, the concepts moved down into the HTML layer and they will most likely not change in a very long time now.</p>\n<p>The advantage of this layered approach is that once something settles in a bottom layer it does not change anymore, our code will work for a very long time. Browsers can still render websites from two decades ago.</p>\n<p>What I took away from this Jeremys talk is that we should always start with the foundation. We should markup our content with semantic HTML, then add styling with CSS and additional functionality with JS on top. When we build a solid foundation the content will be accessible for a very long time.</p>\n<h2>Lisa Gringl - Dark UX Pattern</h2>\n<p><a href=\"https://twitter.com/kringal\">Lisa Gringl</a> talked about <a href=\"https://www.darkpatterns.org\">Dark UX Patterns</a>. There is a different between anti patterns, when an inexperiences UX designer creates an experience that is bad for both the user and the company and Dark UX, when an UI is designed to confuse and trick a user into doing something that does not benefit them.</p>\n<p>Lisa also walked us through examples of Dark UX and about the consequences. Mostly, Dark Patterns work only in the short-term, since you trick your users into something they will not become loyal customers. Her point was that in the long-term Dark Patterns are bad for your business.</p>\n<p>I have to say here that I agree only partly with the last point. In my experience this does not apply to all industries. Most prominently Dark Patterns work very well in the tourism industry, that is why so many of the famous examples of these patterns from hotel booking sites and air travel search engines. My best guess is that people only go on vacation once or twice every year, after a few months most people forget the bad experiences they had on a site and use it again if they think they can get a great deal there.</p>\n<h2>Max Böck - Rage Against the Content Machine</h2>\n<p>In the third talk of the day <a href=\"https://mxb.dev\">Max Böck</a> talked about the <a href=\"https://indieweb.org\">Indie Web</a>. This topic is of course right up my alley, since I am a big fan of owning your own website and not giving all your content to big Silicon Valley cooperations. Max specifically talked about how we can use RSS, <a href=\"https://www.w3.org/TR/micropub/\">Micropub</a> and <a href=\"https://www.w3.org/TR/webmention/\">Webmention</a> to implement the most essential features of social media on our indie websites. So yes, this talk was also a bit of a kick in the butt to finally implement all of this stuff on my website.</p>\n<h2>Heydon Pickering - Why Every Interface Should Be Black &#x26; White</h2>\n<p><a href=\"https://www.heydonworks.com\">Heydon</a> likes to be controversial. He explained in this talk why every layout he created in the last couple of years is only black and white. Black and white has a great contrast and when you don't have color at your disposal it sparks your creativity to find a solution that does not require colours.</p>\n<p>Absolutely uncontroversial is his point that Nazis are bad and that you should not work for Nazis. Agreed.</p>\n<p>Heydons talk was a lot of fun. He also wants you to underline your links and I agree once again.</p>\n<h2>Che Harvey - Stakeholder-Centric Design</h2>\n<p>Che talked about how to navigate corporate politics as a designer when joining a new company and how to make a name for yourself in a new workplace. This talk was not super interesting for me since I have over ten years of experience navigating office politics, but Che was a first time speaker and did a great job to get his ideas over.</p>\n<h2>Rachel Andrew - Does It Work? Using The New CSS Layout</h2>\n<p><a href=\"https://rachelandrew.co.uk\">Rachel Andrew</a> is one of two acceptable answers to the question \"How can I best learn CSS Grid?\" (the other one is <a href=\"https://jensimmons.com\">Jen Simmons</a>). Here Rachel talked about the history of creating layouts on the web (tables, floats) and the current state of the art (<a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout\">Flexbox</a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout\">CSS Grid</a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/columns\">columns</a>). First of all asking whether to use Flexbox or CSS Grid is a terrible question. You should use what works for your use case. If it works, it is a good solution. But you should learn and understand how layouts work in CSS and not just copy snippets, because if you know how it works you can better decide whether Flexbox, CSS Grid or columns are the right solution for you.</p>\n<h2>Charlie Owen - I'm just an Old Guard Dev in a New Guard world</h2>\n<p><a href=\"https://www.sonniesedge.net\">Charlie</a> took a walk down memory lane and talked about the good and the bad (but mostly the bad) of how we created websites in the 90s and which of these things are better now. But some things are also worse. And that Flash was somehow very cool. And we should be allowed to miss Flash sometimes.</p>\n<p>It also made me remember <a href=\"https://notes.florian.ec/2019/11/26/after-charlie-owens.html\">how we did Ajax before <code class=\"language-text\">XMLHttpRequest</code></a>.</p>\n<h2>Remy Sharp - Using a modern web to recreate 1980S horribly slow and loud loading screens</h2>\n<p>This was a bit crazy. <a href=\"https://remysharp.com\">Remy</a> decided to recreate the most fun thing from his childhood, the loading screen of the <a href=\"https://en.wikipedia.org/wiki/ZX_Spectrum\">ZX Spectrum</a>, with JavaScript. So basically the ZX stores data on cassettes, so Remy made a web app that can take a photo from his phone, convert it into sound and then transmit it to the ZX over audio. <a href=\"https://twitter.com/stefankkern/status/1199017722492919810\">Here is a video</a> from when he did that live at the conference.</p>\n<h2>Surprise speaker: Vitali Friedman - Bringing Personality Back to the Web</h2>\n<p><a href=\"https://www.smashingmagazine.com/author/vitaly-friedman/\">Vitaly Friedman</a> made a surprise appearance to finish up the conference. He is the co-founder of Smashing Magazine and in his talk he wants to give the web a bit more personality and creativity. The web should be fun and nice, it is boring if every website is just an implementation of <a href=\"https://twitter.com/jongold/status/694591217523363840\">one of two layouts</a>.</p>\n<h2>Conclusion</h2>\n<p>Webclerks was the first conference organised by <a href=\"https://www.matuzo.at\">Manuel Matuzović</a>, <a href=\"https://twitter.com/claudia_laber\">Claudia Laber</a>, <a href=\"https://twitter.com/lctdnl\">Daniel Lechthaler</a> and <a href=\"https://mxb.dev\">Max Böck</a> and it was very well organised. Besides the excellent talks there was coffee, snacks and an excellent (and fully vegan) lunch from <a href=\"https://www.speisen-ohne-grenzen.at\">Speisen ohne Grenzen</a>.</p>\n<p>I left the conference very exhausted, but also inspired, full of new ideas and also a bit humbled. <span role=\"img\" aria-label=\"thumbs up\">👍</span></p>\n<p>On the Webclerks blog they also have a <a href=\"https://webclerks.at/blog/recap-webclerks-conference-2019/\">recap with slides from all talks</a>.</p>",
            "url": "/blog/webclerks-2019/",
            "title": "Recap of Webclerks Community Conference 2019",
            "summary": "My recap of the first Webclerks Community Conference, that happened on November 25, 2019 in Vienna, Austria",
            "date_modified": "2019-12-04T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/cocur-slugify-4-0-0/",
            "content_html": "<p>Today we finally released <a href=\"https://github.com/cocur/slugify/releases/tag/v4.0.0\">Version 4.0.0</a> of <a href=\"https://github.com/cocur/slugify\">cocur/slugify</a> it does not introduce new major features, but adds support for Symfony 4 and 5, Twig 3 and, most importantly, PHP 7.3 and 7.4. Support for PHP 5, Twig 1 and Silex is dropped.</p>\n<p>Thanks to everyone who contributed to this release: <a href=\"https://github.com/bartko-s\">bartko-s</a>, <a href=\"https://github.com/mhujer\">mhujer</a>, <a href=\"https://github.com/kubawerlos\">kubawerlos</a>, <a href=\"https://github.com/FabienPapet\">FabienPapet</a>, <a href=\"https://github.com/snapshotpl\">snapshotpl</a> and <a href=\"https://github.com/franmomu\">franmomu</a>.</p>\n<p>As usual, you can install cocur/slugify using Composer:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">composer</span> require cocur/slugify</code></pre></div>\n<p>Here are the full release notes:</p>\n<ul>\n<li><a href=\"https://github.com/cocur/slugify/pull/230\">#230</a> Add Slovak rules (by <a href=\"https://github.com/bartko-s\">bartko-s</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/236\">#236</a> Make Twig Bridge compatible with Twig 3.0 (by <a href=\"https://github.com/mhujer\">mhujer</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/237\">#237</a> Fix Travis CI configuration (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/238\">#238</a> Drop Twig 1 support (by <a href=\"https://github.com/FabienPapet\">FabienPapet</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/239\">#239</a> Fix AppVeyor (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/241\">#241</a> Update .gitattributes (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/242\">#242</a> Add PHP CS Fixer (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/243\">#243</a> Normalize composer.json (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/246\">#246</a> Add support for PHP 7.3 and 7.4 (by <a href=\"https://github.com/snapshotpl\">snapshotpl</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/247\">#247</a> AppVeyor improvements (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/249\">#249</a> PHPUnit annotations should be a FQCNs including a root namespace (by <a href=\"https://github.com/kubawerlos\">kubawerlos</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/250\">#250</a> Add support for Symfony 4 and 5 (by <a href=\"https://github.com/franmomu\">franmomu</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/251\">#251</a> Dropping support for PHP 5 (by <a href=\"https://github.com/franmomu\">franmomu</a>)</li>\n<li><a href=\"https://github.com/cocur/slugify/pull/253\">#253</a> Add conflict for unmaintained Symfony versions (by <a href=\"https://github.com/franmomu\">franmomu</a>)</li>\n</ul>",
            "url": "/blog/cocur-slugify-4-0-0/",
            "title": "cocur/slugify v4.0.0 released",
            "summary": "Announcing a new major version of my library `cocur/slugify`.",
            "date_modified": "2019-12-14T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2019/",
            "content_html": "<p>It is the end of the year and therefore time for looking back at my favourite albums of the year. These are all albums that came out in 2019, <a href=\"https://www.last.fm/user/feredir/library/tracks?from=2019-01-01&#x26;rangetype=year\">the album is have listened most</a> was Mitski's <a href=\"https://mitski.bandcamp.com/album/be-the-cowboy\">Be The Cowboy</a>.</p>\n<p>I have created an Apple Music playlist, <a href=\"https://music.apple.com/at/playlist/florians-favourite-albums-2019/pl.u-NpG5GsmL2XgG?l=en\">Florians Favourite Albums 2019</a>, if you want to listen to all 15 albums from this list.</p>\n<h2>Angel Olsen - All Mirrors</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgMEBf/EACkQAAIBAwIFAgcAAAAAAAAAAAECAwAEBQYRBxIhQWExURMVIiNCcYH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A0XPELG3WT+QadWVr6RzELt1AjQg7bqPyJ9B261E9T3Gs+Gudhlzl216txzbQyTmSKRR0691PcEAVWmk7s2ep8ZdcglaK4R+Rj0fY+h/fp/alnGfP2eZ1ZcjFxW4x/wBp4CsRWSECIL8I+BtuR796CZWPFHA3NpHJkIJ7e6I+uONOdd/B9qVR6sNuqKfNKDGFjHMrodmUgg+d679QM75i6aR2d2fcsx6knrSlB51KUoP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/angel-olsen-all-mirrors-960.jpg, /blog/favourite-albums-2019/angel-olsen-all-mirrors-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/angel-olsen-all-mirrors-640.jpg, /blog/favourite-albums-2019/angel-olsen-all-mirrors-1280.jpg 2x, /blog/favourite-albums-2019/angel-olsen-all-mirrors-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/angel-olsen-all-mirrors-320.jpg, /blog/favourite-albums-2019/angel-olsen-all-mirrors-640.jpg 2x, /blog/favourite-albums-2019/angel-olsen-all-mirrors-960.jpg 3x\" src=\"/blog/favourite-albums-2019/angel-olsen-all-mirrors-320.jpg\" alt=\"Album cover of All Mirrors by Angel Olsen\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>All Mirrors</em> on <a href=\"https://angelolsen.bandcamp.com/album/all-mirrors\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/all-mirrors/1472009368?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/0RedX0LZkGUFoRwFntAaI0\">Spotify</a>.</p>\n<h2>Big Thief - Two Hands</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYBAgQF/8QAJRAAAgEEAgIBBQEAAAAAAAAAAQIDAAQFEQYhEjEiExRRYYFx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEAP/EAB0RAAICAgMBAAAAAAAAAAAAAAECABEDEiEycTH/2gAMAwEAAhEDEQA/AOq5nyIS3wS8j+/ydyjQ3ltelVjQFCSY5CAR1od7B/RqSwqxxKwyAi+sbcWUIkmCLsF4yCw38fkSd+vEa914dlZ8vmwtvfPj71lx0juJJ2+RjfSlERh62Nk6PuuPmls2LsMVLLjobedfIzXUTlHa4PyI16AX0NDX4qLVromVkow2UfJi9t77jMwxr2y3X01Gp7OMujj1vfXfWv5Str7lc8f2yZd8pFdCBNrBKNFSNqTskkkEE/7SjCMeagE4wauX1zyLISW1nEzqFkkAbQPY81Gvf7NQXO8tNHyR3t4bWB3jcOUhU+fkxJJ3vve+6UrN2UewMfRj5J3LFJWtpGiQO0K+RXY8iCQCe/wAP5SlKYpNRZAuf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/big-thief-two-hands-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/big-thief-two-hands-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/big-thief-two-hands-320.jpg, /blog/favourite-albums-2019/big-thief-two-hands-640.jpg 2x, /blog/favourite-albums-2019/big-thief-two-hands-960.jpg 3x\" src=\"/blog/favourite-albums-2019/big-thief-two-hands-320.jpg\" alt=\"Album cover of Two Hands by Big Thief\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Two Hands</em> on <a href=\"https://bigthief.bandcamp.com/album/two-hands-3\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/two-hands/1473012904?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/7pg8T6pajjHVZbiyB8bGxo\">Spotify</a></p>\n<h2>Chastity Belt - Chastity Belt</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFBAj/xAAnEAACAQIFAwQDAAAAAAAAAAABAgMABAUGERJBExQhIjFRYTJSgf/EABcBAQADAAAAAAAAAAAAAAAAAAQBAgf/xAAjEQACAQIEBwAAAAAAAAAAAAAAAREDIQIEEjEFBhQyYbHw/9oADAMBAAIRAxEAPwCBRWlxNLHHFC7PIdEUD8jWlf5ZxewhnmubNligk6TupDKDwQR7qeGHg1esv5LtJugEVLd4lBVmQekj4NdmJ5KQgxzlpoXAd9ybtT/efihYuYqc2VvvJXDmdSnT6PMFKr+K5DsO8fb1Ih+oUUpa49lWpkjraa3LHl2Ru1jPjXbrWzeRqtsxGvli2mvJ9zSlZ9LmA1PtJ3ichS7YbVP2R90pSkpWDPc//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/chastity-belt-chastity-belt-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/chastity-belt-chastity-belt-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/chastity-belt-chastity-belt-320.jpg, /blog/favourite-albums-2019/chastity-belt-chastity-belt-640.jpg 2x, /blog/favourite-albums-2019/chastity-belt-chastity-belt-960.jpg 3x\" src=\"/blog/favourite-albums-2019/chastity-belt-chastity-belt-320.jpg\" alt=\"Album cover of Chastity Belt by Chastity Belt\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Chastity Belt</em> on <a href=\"https://chastity-belt.bandcamp.com/album/chastity-belt\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/chastity-belt/1468347091?l=en\">Apple Music</a> or <a href=\"https://open.spotify.com/album/2w90HaDXKJ3WT9WHmYrQEE\">Spotify</a>.</p>\n<h2>Lana Del Rey - Norman Fucking Rockwell!</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHBf/EACgQAAEDAwIFBAMAAAAAAAAAAAECAwQABREGEhMhMUFRBxQiYUJigf/EABYBAQEBAAAAAAAAAAAAAAAAAAQDBf/EACIRAAEDAgYDAAAAAAAAAAAAAAEAAgMRwQQSITEzoUFhgf/aAAwDAQACEQMRAD8A6kSQqE5EdkMh1/3BQwlKyjjrVnYlxRwAAM5P6jAqH1JNi6NusS/CTNVfZfH9xE27RICx8AR+KQrAOOZI5Z61oQgNv3y2NrkL9qttxTgZdwcjBQcjmMEdfH0axj1Qtiz6gQbe7KCV8Fr5y3AnhgqUr5L6d+X8FGdLGZqMPtXiY8x5ZBrZXWjtJvO2x6bqhlDl2nPrlPBSclG7GEnxgDp2pVa9e9NJKSq+Q8LG4Hf1FKYMWwClOkF2Dlca17UlHtUaBp1b8HiR3uA2tS2lbSonbnJHnPbFUPoHpi06v0q5e9VxE3i5GW9GDsslWG0hICcDA7nr5pSs94Gdx86XWoOMfbLDdX3V2JqCZAjsx0RoLzsZlIR0QHFkZ5/dKUprdlI7r//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-640.jpg, /blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-320.jpg, /blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-640.jpg 2x, /blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-960.jpg 3x\" src=\"/blog/favourite-albums-2019/lana-del-rey-norman-fucking-rockwell-320.jpg\" alt=\"Album cover of Norman Fucking Rockwell! by Lana Del Rey\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Norman Fucking Rockwell!</em> on <a href=\"https://music.apple.com/at/album/norman-f-g-rockwell/1474669063?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/5XpEKORZ4y6OrCZSKsi46A\">Spotify</a>.</p>\n<h2>Marika Hackman - Any Human Friend</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYBBAgF/8QALBAAAgEDAwEECwAAAAAAAAAAAQIDAAQRBQYhEhNRYXEHIiQlMTJBUoGx0f/EABcBAQEBAQAAAAAAAAAAAAAAAAMEAQL/xAAZEQEBAAMBAAAAAAAAAAAAAAAAAQISITL/2gAMAwEAAhEDEQA/AOkpCsaM7cKoyfKpDZG4zucalDeKI5Le4PQqK0ZMR+Qnv+vw8Kr5l7S3dfuXFSHo6uru6hvjerEBDIIY+hAuVA4J/GKmvqKsZNbVTBbxxKwTqwWJ5Yn90rPaLk57zStH1zXDvHcU6H3zepg9PqynnzzmtfStw61aXEkdvq16iMmWAlIyQMA8eApSiPI8ybc2vdqxOtajknJ9ob+0pSuxv//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/marika-hackman-any-human-friend-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/marika-hackman-any-human-friend-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/marika-hackman-any-human-friend-320.jpg, /blog/favourite-albums-2019/marika-hackman-any-human-friend-640.jpg 2x, /blog/favourite-albums-2019/marika-hackman-any-human-friend-960.jpg 3x\" src=\"/blog/favourite-albums-2019/marika-hackman-any-human-friend-320.jpg\" alt=\"Album cover of Any Human Friend by Marika Hackman\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Any Human Friend</em> on <a href=\"https://marikahackman.bandcamp.com/album/any-human-friend\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/any-human-friend/1463028399?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/1MyAYzrDvFNjNY689PtpWF\">Spotify</a>.</p>\n<h2>Nilüfer Yanya - Miss Universe</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAMBAgQGB//EACIQAAICAQQCAwEAAAAAAAAAAAECAAMEBhEhMQUSEyJRQf/EABYBAQEBAAAAAAAAAAAAAAAAAAEDAv/EABkRAAMBAQEAAAAAAAAAAAAAAAABAhEDgf/aAAwDAQACEQMRAD8A9B1pqo6fzPH4y49dz5nuE93K8qCduvwGY83qZ/EY+Nk2YfyYzpW9zh9viDdnb+gcTseXi0XWLZZTU9iAhXZASoPexPUkMWqxGrvSu2tl9SjopBH5tt1Iq4zHJt873VXhV9gxBMTSw/buJEsckjmQB+5ERFgiNnLGIiAn/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/niluefer-yanya-miss-universe-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/niluefer-yanya-miss-universe-640.jpg, /blog/favourite-albums-2019/niluefer-yanya-miss-universe-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/niluefer-yanya-miss-universe-320.jpg, /blog/favourite-albums-2019/niluefer-yanya-miss-universe-640.jpg 2x, /blog/favourite-albums-2019/niluefer-yanya-miss-universe-960.jpg 3x\" src=\"/blog/favourite-albums-2019/niluefer-yanya-miss-universe-320.jpg\" alt=\"Album cover of Miss Universe by Nilüfer Yanya\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Miss Universe</em> on <a href=\"https://music.apple.com/at/album/miss-universe/1449797523?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/miss-universe/1449797523?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/3cQu6qRAzmJla1JTJHHl4q\">Spotify</a>.</p>\n<h2>Sharon Van Etten - Remind Me Tomorrow</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYEBf/EACYQAAIBAwIGAgMAAAAAAAAAAAECAwAEEQUhBhITMUFhIlEUMkL/xAAWAQEBAQAAAAAAAAAAAAAAAAADBAL/xAAiEQABAwQABwAAAAAAAAAAAAACAAERBBITIQMxMlFSgaH/2gAMAwEAAhEDEQA/AJi0/M0WJpLO4hkcRh5Iba0I6qZx8mzhipIOCPFJk1C+upsSo7kZ5VkUs7Y7ADyTsB91TaDremQQRJqzXtsXhMU08QUdFjsoQKMnyN6M1lb2trK8dxbWqM0NnNeKodkDbMVJDDfmx6zmt3EMRqVSQBud+lNRaRPMG6mrWthKh5Ht5oFZ0I+8mldG2iSQSSKt3JzuWJ5TnPv7PulJmPyR4Ow/Ft0TTItUihuLh5Fd5ijBMAEKpI8d87571GcQ6hPacXSjm65t25UaUkt8f13BB29UpS1Ite7QtU3FNgaHfktcXFOp4OJEXOOy4/kUpSpT6nU46Zf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-640.jpg, /blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-320.jpg, /blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-640.jpg 2x, /blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-960.jpg 3x\" src=\"/blog/favourite-albums-2019/sharon-van-etten-remind-me-tomorrow-320.jpg\" alt=\"Album cover of Remind Me Tomorrow by Sharon Van Etten\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Remind Me Tomorrow</em> on <a href=\"https://sharonvanetten.bandcamp.com/album/remind-me-tomorrow\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/remind-me-tomorrow/1436857685?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/2dvXk4nacVRmDSnbKniwrS\">Spotify</a>.</p>\n<h2>Weyes Blood - Titanic Rising</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcEBv/EACgQAAEDAwQBAgcAAAAAAAAAAAECAwQABREGEiExcQcTFBYyUWGBwf/EABcBAQEBAQAAAAAAAAAAAAAAAAIEAwX/xAAdEQACAgIDAQAAAAAAAAAAAAABAgADBDEREyFB/9oADAMBAAIRAxEAPwCT6XRtcaeG04wrGO8VWNEXdPzgSxDKhMcz7DKeEeD9hUhtEF9iOl74iL7YxhAfBWoZA4SO+6sOlJca2avfuUmVDEyQtCGURgUNJGcLQEn6VcH8Hmqc6+vrVRuY4a2dhLHyYPUo3VzVsorZLICUhKUnjbjilYte6rk3TU0mVCakNsnCNjoAUCnjkfrPgilCrIIQABdTtcV/WMnd5tkRvSUyS0ylt9pxG1ae+wP6a4cT5KEEB5RGc4Jzz1nzSlRp6siB3OokXi4ypDq3pryilWwc4wB0KUpQin//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/weyes-blood-titanic-rising-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/weyes-blood-titanic-rising-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/weyes-blood-titanic-rising-320.jpg, /blog/favourite-albums-2019/weyes-blood-titanic-rising-640.jpg 2x, /blog/favourite-albums-2019/weyes-blood-titanic-rising-960.jpg 3x\" src=\"/blog/favourite-albums-2019/weyes-blood-titanic-rising-320.jpg\" alt=\"Album cover of Titanic Rising by Weyes Blood\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Titanic Rising</em> on <a href=\"https://weyesblood.bandcamp.com/album/titanic-rising\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/titanic-rising/1450550344?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/53VKICyqCf91sVkTdFrzKX\">Spotify</a>.</p>\n<h2>Sleater-Kinney - The Center Won't Hold</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGBAj/xAAmEAACAQMEAgICAwAAAAAAAAABAgMEBREABhIhBxMiMUGRUWFx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AkO0dt0tVZKe4zXOKmVq/0zp6vayRoAwPEHlg/L8fS63flLZ9IbvQw7MsXserV5TKqMsfJ3LDBxjHE9Z6AA12+A9wUdDRT2Gvtpmqo53qFljpRKWHXXePo57P9Y1Tl3rLT2isjr4qgJKGSmLRojN+FUKpJJ7xn941keYaTx5vG5PUPSWqWRYpPUxVwo5cVbrJ76Yd6a1+6fJ27bDfqu1266i301MwRYFjQY+IOSSMse/v/NNQZi1XWrFcrCZ1JIBMbshI+sEqQdUCK71Mt2tkknFnWP2cjkliFBGSTkgE5A/nTTWhON2XWovN7nq65YnmPw6QYAUkAfoaaaag/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-960.jpg, /blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-1920.jpg 2x, /blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-640.jpg, /blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-1280.jpg 2x, /blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-320.jpg, /blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-640.jpg 2x, /blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-960.jpg 3x\" src=\"/blog/favourite-albums-2019/sleater-kinney-the-center-wont-hold-320.jpg\" alt=\"Album cover of The Center Won&#x27;t Hold by Sleater-Kinney\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>The Center Won't Hold</em> on <a href=\"https://sleaterkinney.bandcamp.com/album/the-center-wont-hold\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/the-center-wont-hold/1467763810?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/6ArjrXMlLegKiAPOp34K58\">Spotify</a>.</p>\n<h2>Honeyblood - In Plain Sight</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQYH/8QAJBAAAgEDAwUBAQEAAAAAAAAAAQIDAAQREiExBRNBUWEiccH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQD/8QAGhEBAAMAAwAAAAAAAAAAAAAAAAEhMQJBUf/aAAwDAQACEQMRAD8A87tnTsjuysY8aysZwwwOB4AyKuWd3Dcys9rLGunGTuNfsE+htsKweoyg2sSODHqKp3fOkjyeCa3+npHb9NjiiLS2yMY1ikUFl4yduSdqgmKUwsiSKIYxcMW/RJGck+vlKjrDqvdkQlRhRG/A8A/aUtDfrlOoRKYYlbLKwGxOcZxWq+TEoZixCalJ5XYbD5SladEQ6piJrcoB+4Vc/wB3H+UpSm44E6//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/honeyblood-in-plain-sight-960.jpg, /blog/favourite-albums-2019/honeyblood-in-plain-sight-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/honeyblood-in-plain-sight-640.jpg, /blog/favourite-albums-2019/honeyblood-in-plain-sight-1280.jpg 2x, /blog/favourite-albums-2019/honeyblood-in-plain-sight-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/honeyblood-in-plain-sight-320.jpg, /blog/favourite-albums-2019/honeyblood-in-plain-sight-640.jpg 2x, /blog/favourite-albums-2019/honeyblood-in-plain-sight-960.jpg 3x\" src=\"/blog/favourite-albums-2019/honeyblood-in-plain-sight-320.jpg\" alt=\"Album cover of In Plain Sight by Honeyblood\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>In Plain Sight</em> on <a href=\"https://music.apple.com/at/album/in-plain-sight/1450146520?uo=4&#x26;app=music&#x26;at=11lSjE&#x26;ct=florianec\">Apple Music</a> or <a href=\"https://open.spotify.com/album/5SwVk8cwJyNxEFrFXVyjsJ\">Spotify</a>.</p>\n<h2>Cherry Glazerr - Stuffed &#x26; Ready</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgQH/8QAIhAAAgEEAgIDAQAAAAAAAAAAAQIDAAQRIQUxBhITFEEi/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQP/xAAZEQEBAAMBAAAAAAAAAAAAAAABAAIRMRL/2gAMAwEAAhEDEQA/APbOSHLm+uAPspbPkoIXU6/OxrrrP7We53kLi2gtYZZ7iO7knDqrD3YqPz+cADWydZz3XTzvldxHfwWqH6xk+QxlX9jIFkVNjGj3gHVWXK2kM84uZIB9hUKKzDYBOhUfHXdXDpsrOzuBLbo/xyKCOitKnxgAUq1KyCeJcU3lS8hLHJNMVeT1kfKhiynIFbV9g5ANKUBKrRM5BxqlKUxf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/cherry-glazerr-stuffed-and-ready-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/cherry-glazerr-stuffed-and-ready-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/cherry-glazerr-stuffed-and-ready-320.jpg, /blog/favourite-albums-2019/cherry-glazerr-stuffed-and-ready-640.jpg 2x, /blog/favourite-albums-2019/cherry-glazerr-stuffed-and-ready-960.jpg 3x\" src=\"/blog/favourite-albums-2019/cherry-glazerr-stuffed-and-ready-320.jpg\" alt=\"Album cover of Stuffed &#x26; Readey by Cherry Glazerr\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Stuffed &#x26; Ready</em> on <a href=\"https://cherryglazerr.bandcamp.com/album/stuffed-ready\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/stuffed-ready/1440076617?l=en\">Apple Music</a> or <a href=\"https://open.spotify.com/album/1EE4A8oz3gG7CZUdFj7KMh\">Spotify</a>.</p>\n<h2>Jenny Lewis - On The Line</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUHBAb/xAApEAACAQMDAgQHAAAAAAAAAAABAgMABBEFEiEGMQcyUYETFCJBYXGR/8QAFgEBAQEAAAAAAAAAAAAAAAAABgQF/8QAIxEAAQIEBgMAAAAAAAAAAAAAAQACAwQRIRIkMlFxsTFSof/aAAwDAQACEQMRAD8A8h4lxTXGoaBYxqGSYCdO3n34PsABXD1Z07c2KWF4be2jRD8xshTaPMOT+cgVW8Sby8sotGn09bcXEMTrukXJUOxwV/hqV1D1Xd6ja6WGJ3LbOl0rbdrE9gAOccfeppKAIkNoA81qdtlbOzT4URxrTDSg9r3+LShdx3UMFzGjRrPCk2xzkruUEj2zSpizhbHTsjGbOAgduPhilYz7OIWwy7QVB6/Yta2Abnbb8Z/ZrL3keS6WNmJQnGPTPelKVyAyrDz2ik+c28cdBbRrn0atcxLwkWyNR6KEUClKUQfqKYs0hf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/jenny-lewis-on-the-line-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/jenny-lewis-on-the-line-640.jpg, /blog/favourite-albums-2019/jenny-lewis-on-the-line-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/jenny-lewis-on-the-line-320.jpg, /blog/favourite-albums-2019/jenny-lewis-on-the-line-640.jpg 2x, /blog/favourite-albums-2019/jenny-lewis-on-the-line-960.jpg 3x\" src=\"/blog/favourite-albums-2019/jenny-lewis-on-the-line-320.jpg\" alt=\"Album cover of On The Line by Jenny Lewis\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>On The Line</em> on <a href=\"https://open.spotify.com/album/1EE4A8oz3gG7CZUdFj7KMh\">Apple Music</a> or <a href=\"https://open.spotify.com/album/2AHG3vkC3H7zqHbYdgCCcy\">Spotify</a>.</p>\n<h2>Girlpool - What Chaos Is Imaginary</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcBAgQI/8QAKhAAAQMCBAUDBQAAAAAAAAAAAQACAwURBBIhMQYHEyJBFGFxM1GBkaH/xAAXAQEBAQEAAAAAAAAAAAAAAAADAgAB/8QAHBEAAgMAAwEAAAAAAAAAAAAAAAECAxESQVEh/9oADAMBAAIRAxEAPwCiRYYSMt1MvyuOk8RsmqM9PfE+GSP6ZeQRMBvlI8jcjcAgravTSUimTTnQgWa5w0B+59lMYam6bi+lYTMOzGxyiNoAc17wWuzEeLO/iu21qcY787OVVpwcse9Fj9eRsiyKULazC/wibK/Qtu8JHzrq+Lgw1FyPHbM+UXHloFvxrdTfldipmcxqOc5d1cYOoHG4cSDqffyiIJJcmLGTxHqd2IffZv6REWKZ/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-640.jpg, /blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-320.jpg, /blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-640.jpg 2x, /blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-960.jpg 3x\" src=\"/blog/favourite-albums-2019/girlpool-what-chaos-is-imaginary-320.jpg\" alt=\"Album cover of What Chaos Is Imaginary by Girlpool\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to What Chaos Is Imaginary on [Bandcamp][girlpool-bandcamp], <a href=\"https://music.apple.com/at/album/what-chaos-is-imaginary/1485073846?l=en\">Apple Music</a> or <a href=\"https://open.spotify.com/album/58HB0yjdQE2MH5MrfWt4EO\">Spotify</a>.</p>\n<h2>Jenny Hval - The Practice of Love</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAIFAQMGB//EACcQAAIBAwMEAAcAAAAAAAAAAAECAwAEEQUSIRMxQWEGFBUiUXGB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAECA//EABcRAQEBAQAAAAAAAAAAAAAAAAABESH/2gAMAwEAAhEDEQA/APW9R1e4i+K7axj6YshaSTzYb7yw7Ko/QJrFtr01vDNLqFqYlED3CKs28gKASjcYBwffOR4rbcfJuZr6ZIYjArI80nG1Mckn8YqthutL1nrQx3bvG8EihxEUVUIG5s4x47mqGOhtzHfWsF0YtnWjWTa/dcjODSp6fbx2djb28LM8UaAKzHcSPBzSmiqvQZvqOlBLpI2Ru67eDz7qwGjWMV8l0kAE4UIGBIAUeMDjH8pSkJeIyOTI3o4AHGKUpUs3/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/jenny-hval-the-practice-of-love-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/jenny-hval-the-practice-of-love-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/jenny-hval-the-practice-of-love-320.jpg, /blog/favourite-albums-2019/jenny-hval-the-practice-of-love-640.jpg 2x, /blog/favourite-albums-2019/jenny-hval-the-practice-of-love-960.jpg 3x\" src=\"/blog/favourite-albums-2019/jenny-hval-the-practice-of-love-320.jpg\" alt=\"Album cover of The Practice of Love by Jenny Hval\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>The Practice of Love</em> on <a href=\"https://jennyhval.bandcamp.com/album/the-practice-of-love\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/the-practice-of-love/1468366932?l=en\">Apple Music</a> or <a href=\"https://open.spotify.com/album/6Ia2sw3y79k40GHeNjCfLh\">Spotify</a>.</p>\n<h2>Florist - Emily Alone</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAMBAgUGBwj/xAAsEAABAwIEBAQHAAAAAAAAAAABAgMEABEFBgcxEiEiUQgTFFIVM0FxcrHh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAL/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAMAwEAAhEDEQA/AOX6d6fYpnsz/hUmEwIQQXTJWpNwq9rWB9p3rZcI0XxPH8OXOwHF8Kkxm3FtLUXHB1J3t0D+3rGacZrl5TypmeRBdbZckLjsKWbFYTZw9KTvfY9h966Z4ds5ojqGXXFtvxZpcWytDZCkr4dyfbZNue3KirMecSCCR2NqVVz5i/yP7pQWnmkg7Hcd6ljyX43D6d51rhBSPLWU2B3HL6UpQQ3pSlB//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2019/florist-emily-alone-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2019/florist-emily-alone-640.jpg, /blog/favourite-albums-2019/florist-emily-alone-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2019/florist-emily-alone-320.jpg, /blog/favourite-albums-2019/florist-emily-alone-640.jpg 2x, /blog/favourite-albums-2019/florist-emily-alone-960.jpg 3x\" src=\"/blog/favourite-albums-2019/florist-emily-alone-320.jpg\" alt=\"Album cover of Emily Alone by Florist\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Emily Alone</em> on <a href=\"https://florist.bandcamp.com/album/emily-alone\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/emily-alone/1462774222?l=en\">Apple Music</a> or <a href=\"https://open.spotify.com/album/2Lgoj4yzpi5YchgiVuZTcH\">Spotify</a>.</p>",
            "url": "/blog/favourite-albums-2019/",
            "title": "My Favourite Albums of 2019",
            "summary": "At the end of the year Florian collects his favourite albums of 2019.",
            "date_modified": "2019-12-23T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2019/",
            "content_html": "<ul>\n<li><a href=\"http://prelectur.stanford.edu/lecturers/hofstadter/excerpts.html#gebxx\">Gödel, Escher, Bach: An Eternal Golden Braid</a> by <em>Douglas R. Hofstadter</em> ★★★☆☆</li>\n<li><a href=\"http://www.gutenberg.org/files/58238/58238-h/58238-h.htm\">Schuld und Sühne</a> by <em>Fyodor Dostoyevsky</em> ★★★★★</li>\n<li><a href=\"https://thomasbernhard.at/das-werk/prosa/romane/alte-meister-komoedie/\">Alte Meister</a> by <em>Thomas Bernhard</em> ★★★☆☆</li>\n<li><a href=\"https://formdesignpatterns.com\">Form Design Patterns</a> by <em>Adam Silver</em> ★★★★★</li>\n<li><a href=\"https://www.klett-cotta.de/buch/Gegenwartsliteratur/Troll/96747\">Troll</a> by <em>Michal Hvorecky</em> ★★★☆☆</li>\n<li><a href=\"https://www.brandstaetterverlag.com/buch/feministin-sagt-man-nicht\">Feministin sagt man nicht</a> by <em>Hanna Herbst</em> ★★★★★</li>\n<li><a href=\"http://goodbadstrategy.com\">Good Strategy/Bad Strategy: The difference and why it matters</a> by <em>Richard P. Rumelt</em> ★★★★☆</li>\n<li><a href=\"https://en.wikipedia.org/wiki/Six_Memos_for_the_Next_Millennium\">Six Memos for the Next Millennium</a> by <em>Italo Calvino</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-22\">Lethe</a> by <em>Leanna James Blackwell</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-23\">The Sixteenth Tape</a> by <em>Sean Madigan Horn</em> ★★★★☆</li>\n<li><a href=\"https://www.luebbe.de/bastei-luebbe/buecher/sonstige-belletristik/nsa-nationales-sicherheits-amt/id_5802102\">NSA - Nationales Sicherheits-Amt</a> by <em>Andreas Eschbach</em> ★★★☆☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-24\">Memoirs of a Used Car Salesman‘s Daughter</a> by <em>Nancy A. Nichols</em> ★★★★★</li>\n<li><a href=\"https://www.ecowin.at/produkt/der-weg-zur-prosperitat/\">Der Weg zur Prosperität</a> by <em>Stephan Schulmeister</em> ★★★★★</li>\n<li><a href=\"https://www.penguin.co.uk/books/109/1097238/serious-sweet/9780099587439.html\">Serious Sweet</a> by <em>A.L. Kennedy</em> ★★★★★</li>\n<li><a href=\"https://www.oreilly.com/library/view/97-things-every/9780596800611/\">97 Things Every Software Architect Should Know: Collective Wisdom from the Experts</a> by <em>Richard Monson-Haefel</em> ★★★☆☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-20\">6’3” Man with Dorritos</a> by <em>Matthew Clark</em> ★★★★☆</li>\n<li><a href=\"https://www.minjinlee.com/book/pachinko/\">Pachinko</a> by <em>Min Jin Lee</em> ★★★★★</li>\n<li><a href=\"http://www.georgerrmartin.com/grrm_book/fire-and-blood/\">Fire &#x26; Blood (A Targaryen History, #1)</a> by <em>George R.R. Martin</em> ★★★★☆</li>\n<li><a href=\"https://www.terrypratchettbooks.com/books/good-omens/\">Good Omens</a> by <em>Terry Pratchett</em> ★★★★★</li>\n<li><a href=\"https://www.rowohlt.de/taschenbuch/elfriede-jelinek-die-ausgesperrten.html\">Die Ausgesperrten</a> by <em>Elfriede Jelinek</em> ★★★★☆</li>\n<li><a href=\"https://www.penguinrandomhouse.com/books/317074/feel-free-by-zadie-smith/\">Feel Free: Essays</a> by <em>Zadie Smith</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-26\">Marceline Wanted a Bigger Adventure</a> by <em>Schena McAuliffe</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-25\">Suffering Self</a> by <em>Minh Phiong Nguyen</em> ★★★★☆</li>\n<li><a href=\"https://www.hanser-literaturverlage.de/buch/der-tag-als-meine-frau-einen-mann-fand/978-3-446-24760-4/\">Der Tag, als meine Frau einen Mann fand</a> by <em>Sibylle Berg</em> ★★★★☆</li>\n<li><a href=\"https://www.ruinedby.design\">Ruined by Design: How Designers Destroyed the World, and What We Can Do to Fix It</a> by <em>Mike Monteiro</em> ★★★★★</li>\n<li><a href=\"https://www.penguin.co.uk/books/111/1114924/in-praise-of-walking/9781847925015.html\">In Praise of Walking: The new science of how we walk and why it’s good for us</a> by <em>Shane O'Mara</em> ★★★☆☆</li>\n<li><a href=\"https://www.randomhouse.de/Buch/HERKUNFT/Sasa-Stanisic/Luchterhand-Literaturverlag/e472733.rhd\">Herkunft</a> by <em>Saša Stanišić</em> ★★★★★</li>\n<li><a href=\"https://www.wallstein-verlag.de/9783835309531-maja-haderlap-engel-des-vergessens.html\">Engel des Vergessens</a> by <em>Maja Haderlap</em> ★★★★★</li>\n<li><a href=\"https://www.penguinrandomhouse.com/books/609153/resistance-reborn-star-wars-by-rebecca-roanhorse/9780593128428/\">Star Wars: Resistance Reborn</a> by <em>Rebecca Roanhorse</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-32\">Everything Gets Worse</a> by <em>John O‘Connor</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-31\">Pig, An Essay</a> by <em>Sonia Hamer</em> ★★★☆☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-27\">Where Am I</a> by <em>Heather Sellers</em> ★★★★★</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-28\">The Sfumato of Captain Jeff</a> by <em>Dave Zoby</em> ★★★★☆</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-29\">Stumbling Into Joy</a> by <em>Kate Hopper</em> ★★★★★</li>\n<li><a href=\"https://www.creativenonfiction.org/products/true-story-issue-30\">Bought and Sold</a> by <em>Renata Golden</em> ★★★★☆</li>\n<li><a href=\"https://resilient-management.com\">Resilient Management</a> by <em>Lara Hogan</em> ★★★★★</li>\n</ul>",
            "url": "/blog/books-2019/",
            "title": "Books I Have Read in 2019",
            "summary": "The list of books Florian Eckerstorfer has read in 2019.",
            "date_modified": "2020-01-01T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/sticky-notes-ios-lockscreen/",
            "content_html": "<video src=\"/blog/2020-01-31-sticky-notes-ios-lockscreen/drafts-pushcut-notification.mp4\" loop autoplay muted>\n<figure class=\"figure\">\n    <picture>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;img\n  srcset=\"\"\n  alt=\"Pushcut notification is appearing on the lock screen saying Create Sticky Notes in iOS Lock Screen with... I am using Pushcut to send notes from Drafts to my iOS lock screen.\"\n  loading=\"lazy\"\n></code></pre></div>\n  </picture>\n    <figcaption class=\"figure__caption\">Pushcut notification is appearing on the lock screen saying Create Sticky Notes in iOS Lock Screen with... I am using Pushcut to send notes from Drafts to my iOS lock screen.</figcaption>\n  </figure>\n</video>\n<p>Sometimes I put a post-it note on the back of my phone with I bit of information I need quick access to. Yesterday I was in one of the situations and I had the text already in a Drafts note. Therefore the note is already on my phone, but to view it I have to unlock my phone, go to the home screen, open <a href=\"https://getdrafts.com\">Drafts</a>, look for the specific note and open it. I would prefer if I could just glance at my phone and view my note.</p>\n<p>I remembered that I recently downloaded <a href=\"https://www.pushcut.io\">Pushcut</a> on my phone. Pushcut is an iOS app that allows you to create notifications based on certain triggers, which in turn can have actions associated with them. Besides it being very well integrated with Shortcuts it also provides you with a <em>Webhook URL</em>. Since I am writing my notes in Drafts I can create an action that calls the <em>Webhook URL</em> and trigger a notification.</p>\n<p>The first step is to create a new notification in Pushcut, we just need a name and then press <em>Save</em>. Once we have saved the notification we can copy the <em>Webhook URL</em>. Pushcut has a <a href=\"https://www.pushcut.io/support.html\">pretty good documentation for their API</a>, which tells us that we need to send a <code class=\"language-text\">POST</code> request to the webhook URL and send the title and text of the notification.</p>\n<p>Since we now have the Webhook URL we now can create a new action in Drafts (I am using the Mac version, but this should also work on iOS) and add a <em>Script</em> step.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 58.75%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACVklEQVR4nHWT227aQBCG/fq96lWlvkHVJ2hQpabqDWmEUDAh4PiA1zYG2+AT4WQDzmdvlJBAfonRsN5/5t85KEmDNE2TM8wbpA3OvwLFcRzXdQ3DELbteR4+B2Ls2LYYjUaapj02aM7fIITAKnmeL5fLXq93c3Oj6zr3LVt3Q9MW4/HY5sZgMID5KkRisVhg38itVuv6+u/vP1dXP25/ffEHXUPTRyjKsuzp6Wk2m3ENn/u8YjKZ4ChVVe12OwSTBKnCEZbuPtw62lA3DN22bfi+79fponmSxvk6TpfRIguy9VwpioLA2+22+ogjv/1+z4Pv7++Hw6HaV++6/fFdGoyKUN/5/Z0SRRGBSX5GriQZwVTONMyJ7wVuov7cd75X/79V7a+VwjfIMvPxDJJMzXkXTpws0JzkUZxFOAod4rWIv5i5LEsK0+122+12p9MJguBQHottWRRlWewV0zSJejGzrOVqteJpcRzTrc1mcxq6ls23z96MIsgUHHW0h1bJHC9k0+SDK8mnaQ+Hl8yyz/Q2DMP1ev0usyPGQTA7J8tWcc6bL4qqyaqVWcLPs5TwzBCvKnabKN1q7nK7WbExH+K+I0/DxJv4lNGyLGw9SFE4nYWeTylCKvJZI5qC+e6sAYtiNaAwYRh4rqD/0+mURtDt4hKUzsPEcesBoGfMIPOAU2+ocCCjhUMWiwuIChvUkhqr/BvkcNkwrpKTzJCxCKlHKo5JzngTjkMsQyG3sib3hwZrDAErb0gyPic4bAULq6oqFglIY9QJh6M8aiP5X9pTvJ5/hmcdPU76O+idmAAAAABJRU5ErkJggg==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/sticky-notes-ios-lockscreen/drafts-script-960.png, /blog/sticky-notes-ios-lockscreen/drafts-script-1920.png 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/sticky-notes-ios-lockscreen/drafts-script-640.png, /blog/sticky-notes-ios-lockscreen/drafts-script-1280.png 2x, /blog/sticky-notes-ios-lockscreen/drafts-script-1920.png 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/sticky-notes-ios-lockscreen/drafts-script-320.png, /blog/sticky-notes-ios-lockscreen/drafts-script-640.png 2x, /blog/sticky-notes-ios-lockscreen/drafts-script-960.png 3x\" src=\"/blog/sticky-notes-ios-lockscreen/drafts-script-320.png\" alt=\"Screenshot of Drafts Edit Action Screen, the depicted code is shown below\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Drafts provides a pretty nice API to send HTTP requests, so we use it to <code class=\"language-text\">POST</code> the <code class=\"language-text\">title</code> and <code class=\"language-text\">text</code> of the notification to the <em>Webhook URL</em>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> http <span class=\"token operator\">=</span> <span class=\"token constant\">HTTP</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> http<span class=\"token punctuation\">.</span><span class=\"token function\">request</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">url</span><span class=\"token operator\">:</span> <span class=\"token string\">'https://api.pushcut.io/SECRET/notifications/Sticky%20Note'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">'POST'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">data</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">text</span><span class=\"token operator\">:</span> draft<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span><span class=\"token function\">substring</span><span class=\"token punctuation\">(</span>draft<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">trim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> draft<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">.</span><span class=\"token function\">trim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In addition to be able send a title and text of the notification we can also define actions. We will define an action that opens the note in Drafts.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> openDraftsAction <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Open Draft'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">url</span><span class=\"token operator\">:</span> draft<span class=\"token punctuation\">.</span>permalink<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> http <span class=\"token operator\">=</span> <span class=\"token constant\">HTTP</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> http<span class=\"token punctuation\">.</span><span class=\"token function\">request</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">url</span><span class=\"token operator\">:</span> <span class=\"token string\">'https://api.pushcut.io/SECRET/notifications/Sticky%20Note'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">method</span><span class=\"token operator\">:</span> <span class=\"token string\">'POST'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">data</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">text</span><span class=\"token operator\">:</span> draft<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span><span class=\"token function\">substring</span><span class=\"token punctuation\">(</span>draft<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">trim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> draft<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">.</span><span class=\"token function\">trim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">defaultAction</span><span class=\"token operator\">:</span> openDraftsAction<span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">actions</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>openDraftsAction<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>That's it.</p>",
            "url": "/blog/sticky-notes-ios-lockscreen/",
            "title": "Create Sticky Notes on iOS Lockscreen with Drafts",
            "summary": "Using Pushcut I wrote a script to put notes from Drafts on the iOS lockscreen.",
            "date_modified": "2020-01-31T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/why-we-cant-have-nice-things/",
            "content_html": "<p><a href=\"https://www.macrumors.com/2020/06/25/tiktok-clipboard-access-ios-14-caught/\">TikTok App to Stop Accessing User Clipboards After Being Caught in the Act by iOS 14</a> by Juli Clover, MacRumors:</p>\n<blockquote>\n<p>TikTok users who upgraded to ‌iOS 14‌, for example, quickly noticed constant alerts warning them that TikTok was accessing the clipboard every few seconds. After being caught, TikTok now says that it's removing the feature.</p>\n</blockquote>\n<p>This is exactly the kind of behaviour that requires platforms to lock down their systems. There are so many examples of this in the past, <a href=\"https://www.vox.com/2014/11/26/11633282/twitters-now-collecting-data-on-which-apps-you-download\">Twitter tracking which apps a user has installed on their pone</a>, <a href=\"https://appleinsider.com/articles/12/02/08/path_app_under_fire_for_unauthorized_address_book_upload\">Path uploading the users full address book</a> and so on. Many of the features that these companies have exploited also have legitimate use cases and locking them down makes them require additional confirmation dialogs or renders them completely unusable.</p>\n<p>While it is better for users to have their privacy protected, it also makes me sad that many power users can't use their system to the full extent possible because of a few bad actors abusing the system.</p>\n<p>Side note: Apple's decision to show a notification that an app accessed the clipboard instead of requiring a confirmation is a good balance between privacy and usability.</p>",
            "url": "/blog/why-we-cant-have-nice-things/",
            "title": "Why We Can't Have Nice Things",
            "summary": "Developers abusing system features",
            "date_modified": "2020-06-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/remark-a11y-emoji/",
            "content_html": "<p>Last year I created a plugin for Remark to add accessible descriptions to Emoji: <a href=\"https://github.com/florianeckerstorfer/remark-a11y-emoji\">@fec/remark-a11y-emoji</a>. Today I'm happy to announce that I released version 2.0.0.</p>\n<p>The main new feature is support for skin colours: <span role=\"img\" aria-label=\"victory hand (skin tone 6)\">✌🏿</span><span role=\"img\" aria-label=\"victory hand (skin tone 5)\">✌🏾</span><span role=\"img\" aria-label=\"victory hand (skin tone 4)\">✌🏽</span><span role=\"img\" aria-label=\"victory hand (skin tone 3)\">✌🏼</span><span role=\"img\" aria-label=\"victory hand (skin tone 2)\">✌🏻</span>. Many thanks to <a href=\"https://github.com/amirahaile\">Amira Hailemariam</a> for providing the pull request with this feature.</p>\n<p>In addition I added a real build process, switch to using <code class=\"language-text\">import</code>, updated all dependencies and bumped the minimum node version to v10.x.</p>\n<p>You can install the library with:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-S</span> @fec/remark-a11y-emoji</code></pre></div>\n<p>Then you can use the plugin with Remark:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> remark <span class=\"token keyword\">from</span> <span class=\"token string\">'remark'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> a11yEmoji <span class=\"token keyword\">from</span> <span class=\"token string\">'@fec/remark-a11y-emoji'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> processor <span class=\"token operator\">=</span> <span class=\"token function\">remark</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span>a11yEmoji<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>",
            "url": "/blog/remark-a11y-emoji/",
            "title": "@fec/remark-a11y-emoji v2.0.0 released",
            "summary": "I released v2.0.0 of my Remark plugin to Accessibility descriptions to Emoji",
            "date_modified": "2020-09-27T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-plugin-remark/",
            "content_html": "<p>The funny thing about <a href=\"https://semver.org\">semantic versioning</a> is that even a small update can release in a major version increase. Yesterday I created a new release of <a href=\"https://github.com/florianeckerstorfer/eleventy-plugin-remark\">@fec/eleventy-plugin-remark</a> and since it bumps the minimum version from Node 8 to Node 10 its version number also increased from 1.0.2 to 2.0.0.</p>\n<p>New in 2.0.0 is the ability to pass options to remark plugins. For example,</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// .eleventy.js</span>\n<span class=\"token keyword\">const</span> eleventyRemark <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'@fec/eleventy-plugin-remark'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">exports</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">eleventyConfig</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  eleventyConfig<span class=\"token punctuation\">.</span><span class=\"token function\">addPlugin</span><span class=\"token punctuation\">(</span>eleventyRemark<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">plugin</span><span class=\"token operator\">:</span> <span class=\"token string\">'remark-emoji'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token literal-property property\">padSpaceAfter</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n          <span class=\"token literal-property property\">emoticon</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>You can install @fec/eleventy-plugin-remark with NPM or Yarn:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-D</span> @fec/eleventy-plugin-remark remark remark-html\n<span class=\"token function\">yarn</span> <span class=\"token function\">add</span> <span class=\"token parameter variable\">--dev</span> @fec/eleventy-plugin-remark remark remark-html</code></pre></div>\n<p>Thanks to <a href=\"https://github.com/byoigres\">Sergio Flores</a> for providing the <a href=\"https://github.com/florianeckerstorfer/eleventy-plugin-remark/pull/35\">pull request that added this feature</a>.</p>",
            "url": "/blog/eleventy-plugin-remark/",
            "title": "@fec/eleventy-plugin-remark v2.0.0 released",
            "summary": "I released @fec/eleventy-plugin-remark v2.0.0",
            "date_modified": "2020-10-04T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/react-file-upload-jest/",
            "content_html": "<p>A few days ago I implemented a simple React component to upload files. I started to think how to properly test the component with Jest, which includes mocking <code class=\"language-text\">FileReader</code>. In this article I am going to demonstrate how to write test cases for such a component, including some refactoring to make the component easier to test and a mock of <code class=\"language-text\">FileReader</code>.</p>\n<p>All code examples are written in TypeScript, and we will use <a href=\"https://jestjs.io\">Jest</a> with <a href=\"https://github.com/enzymejs/enzyme/\">Enzyme</a> and <a href=\"https://github.com/FormidableLabs/enzyme-matchers/tree/master/packages/jest-enzyme\">jest-enzyme</a> matchers in our tests.</p>\n<h2>A simple file upload component</h2>\n<p>Let’s begin with a simple file upload component: a label, an input field and a preview if a file has been selected and stored in the components state.</p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token comment\">// FileUploadField.tsx</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">FileUploadField</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> ReactElement <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>preview<span class=\"token punctuation\">,</span> setPreviewImage<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token generic-function\"><span class=\"token function\">useState</span><span class=\"token generic class-name\"><span class=\"token operator\">&#x3C;</span><span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token keyword\">undefined</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> previewStyle <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> width<span class=\"token operator\">:</span> <span class=\"token string\">'200px'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> handleChange <span class=\"token operator\">=</span> <span class=\"token function\">useCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> target <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> reader <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    reader<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'load'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>evt<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>reader<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setPreviewImage</span><span class=\"token punctuation\">(</span>reader<span class=\"token punctuation\">.</span>result <span class=\"token keyword\">as</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsDataURL</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>label</span> <span class=\"token attr-name\">htmlFor</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>fileUpload<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Upload file:</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>input</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>file<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>fileUpload<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleChange<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>preview <span class=\"token operator\">&#x26;&#x26;</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>preview<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Preview<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">style</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>previewStyle<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>div</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Just to make this clear, this is a simplified version of a file upload component. In a real application we would add error handling and the code would do something with the selected file (for example, upload it to a server).</p>\n<p>Before we start refactoring and writing tests we should think about all the possible test cases that we need:</p>\n<ul>\n<li>A label and an input field should be visible.</li>\n<li>The ID of the input field should match the label to <a href=\"https://webaim.org/articles/label-name/#labelBest\">make the form accessible</a>.</li>\n<li>If no image is selected, the preview should <em>not</em> be visible.</li>\n<li>If a file is selected (the <code class=\"language-text\">onChange</code> event) successfully, the preview <em>is</em> visible and shows the selected image.</li>\n</ul>\n<p>We can immediately start writing the first three test cases:</p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token comment\">// FileUploadField.test.tsx</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'FileUploadField'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> component <span class=\"token operator\">=</span> <span class=\"token function\">shallow</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span><span class=\"token class-name\">FileUploadField</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render a label and a file input field'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input[type=\"file\"]'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toExist</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'label'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toExist</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should attach the label to the input field'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> id <span class=\"token operator\">=</span> <span class=\"token string\">'fileUpload'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'label'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">prop</span><span class=\"token punctuation\">(</span><span class=\"token string\">'htmlFor'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">prop</span><span class=\"token punctuation\">(</span><span class=\"token string\">'id'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should not show preview if no image has been selected'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'img'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>not<span class=\"token punctuation\">.</span><span class=\"token function\">toExist</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Testing the file selection is harder and we will refactor our component a bit to make testing easier. The best refactoring we can do here is to move all logic that is not directly related to rendering the component into a separate function. In addition to making it easier to test the component we will also increase the readability of our component and our business logic.</p>\n<h2>Separating the logic from the component</h2>\n<p>In this case we are going to move the <code class=\"language-text\">FileReader</code> logic into a separate function. We will call the function <code class=\"language-text\">readFileAsDataURL</code> and it takes a <code class=\"language-text\">File</code> object (which is the type of <code class=\"language-text\">target.files[0]</code> in the code above) and returns a promise that resolves with the data URL as string. With this refactoring, we can test the logic of reading the file separately from the component logic and we can mock <code class=\"language-text\">readFileAsDataURL()</code> when we test our component and do not concern ourselves with the file reading logic there. Here is the code:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// readFileAsDataURL.ts</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">readFileAsDataURL</span><span class=\"token punctuation\">(</span>file<span class=\"token operator\">:</span> File<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&#x3C;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\"><span class=\"token builtin\">Promise</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> reader <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    reader<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'load'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>evt<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>reader<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>reader<span class=\"token punctuation\">.</span>result <span class=\"token keyword\">as</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsDataURL</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Testing the logic</h2>\n<p>When we consider the success case (the file is loaded) we need to check if the promise resolves the result. To simulate the <code class=\"language-text\">load</code> event we need to mock <code class=\"language-text\">FileReader</code> and overwrite <code class=\"language-text\">addEventListener</code> with a mock implementation, which immediately invokes the given listener. Since resolving the promise is now independent of the actual event we also want to make sure that <code class=\"language-text\">readAsDataURL()</code> is called.</p>\n<p>But first things first, because we use TypeScript we need to create a class with all properties and methods of <code class=\"language-text\">FileReader</code> and replace <code class=\"language-text\">FileReader</code> with it:</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// readFileAsDataURL.test.ts</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">FileReaderMock</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token constant\">DONE</span> <span class=\"token operator\">=</span> FileReader<span class=\"token punctuation\">.</span><span class=\"token constant\">DONE</span><span class=\"token punctuation\">;</span>\n  <span class=\"token constant\">EMPTY</span> <span class=\"token operator\">=</span> FileReader<span class=\"token punctuation\">.</span><span class=\"token constant\">EMPTY</span><span class=\"token punctuation\">;</span>\n  <span class=\"token constant\">LOADING</span> <span class=\"token operator\">=</span> FileReader<span class=\"token punctuation\">.</span><span class=\"token constant\">LOADING</span><span class=\"token punctuation\">;</span>\n  readyState <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  error<span class=\"token operator\">:</span> FileReader<span class=\"token punctuation\">[</span><span class=\"token string\">'error'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  result<span class=\"token operator\">:</span> FileReader<span class=\"token punctuation\">[</span><span class=\"token string\">'result'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  abort <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  addEventListener <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  dispatchEvent <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onabort <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onerror <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onload <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onloadend <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onloadprogress <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onloadstart <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  onprogress <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  readAsArrayBuffer <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  readAsBinaryString <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  readAsDataURL <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  readAsText <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  removeEventListener <span class=\"token operator\">=</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now we have everything in place to test <code class=\"language-text\">readFileAsDataURL()</code>. First we set up the mocks, then we call the function and await the result. Lastly we expect that the function returns the content of the file and that <code class=\"language-text\">FileReader.readAsDataURL()</code> has been called with the given file.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// readFileAsDataURL.test.ts</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'readFileAsDataURL()'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> file <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">File</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayBuffer</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'file.jpg'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> fileReader <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileReaderMock</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  jest<span class=\"token punctuation\">.</span><span class=\"token function\">spyOn</span><span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">,</span> <span class=\"token string\">'FileReader'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">mockImplementation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> fileReader<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">beforeEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    jest<span class=\"token punctuation\">.</span><span class=\"token function\">clearAllMocks</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should resolve file as data URL'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    fileReader<span class=\"token punctuation\">.</span>result <span class=\"token operator\">=</span> <span class=\"token string\">'file content'</span><span class=\"token punctuation\">;</span>\n    fileReader<span class=\"token punctuation\">.</span>addEventListener<span class=\"token punctuation\">.</span><span class=\"token function\">mockImplementation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>_<span class=\"token punctuation\">,</span> fn<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> content <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">readFileAsDataURL</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'file content'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>fileReader<span class=\"token punctuation\">.</span>readAsDataURL<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveBeenCalledTimes</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>fileReader<span class=\"token punctuation\">.</span>readAsDataURL<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveBeenCalledWith</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>As already mentioned above, in a real world application we would add error handling and the corresponding tests. The tests will follow the same schema, a mock implementation of <code class=\"language-text\">addEventListener()</code> that is immediately invoked, but instead of resolving the result we would throw the error.</p>\n<h2>Updating the component and testing file selection</h2>\n<p>In our <code class=\"language-text\">FileUploadField</code> we can now replace the <code class=\"language-text\">handleChange</code> callback with a call to our new function <code class=\"language-text\">readFileAsDataURL()</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token comment\">// FileUploadField.tsx</span>\n\n<span class=\"token keyword\">const</span> handleChange <span class=\"token operator\">=</span> <span class=\"token function\">useCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> target <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">doFileRead</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">readFileAsDataURL</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setPreviewImage</span><span class=\"token punctuation\">(</span>result <span class=\"token keyword\">as</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">doFileRead</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Because <code class=\"language-text\">useCallback()</code> cannot be asynchronous, we need to wrap our function call in another <code class=\"language-text\">async</code> function. We can now write the final test case: <em>if a file is selected (the <code class=\"language-text\">onChange</code> event) successfully, read the image should be shown in the preview</em>.</p>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token comment\">// FileUploadField.test.tsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">as</span> ReadFileAsDataURL <span class=\"token keyword\">from</span> <span class=\"token string\">'./readFileAsDataURL'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should render preview after image has been selected'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> file <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">File</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayBuffer</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'file.jpg'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> readFileMock <span class=\"token operator\">=</span> jest\n    <span class=\"token punctuation\">.</span><span class=\"token function\">spyOn</span><span class=\"token punctuation\">(</span>ReadFileAsDataURL<span class=\"token punctuation\">,</span> <span class=\"token string\">'default'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">mockResolvedValue</span><span class=\"token punctuation\">(</span><span class=\"token string\">'image content'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">simulate</span><span class=\"token punctuation\">(</span><span class=\"token string\">'change'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> target<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> files<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>file<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>readFileMock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveBeenCalledTimes</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>readFileMock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveBeenCalledWith</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">setImmediate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token string\">'img'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">prop</span><span class=\"token punctuation\">(</span><span class=\"token string\">'src'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'image content'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>There are three things of note here:</p>\n<ul>\n<li>We need to import from <code class=\"language-text\">readFileAsDataURL.ts</code> with the <code class=\"language-text\">import * as </code> syntax because <code class=\"language-text\">jest.spyOn()</code> expects an object and a function name.</li>\n<li>After we trigger the <code class=\"language-text\">change</code> event we first check if our mock has been called. In unit tests we test each component, function or class in isolation, however, we need to make sure the units are correctly called.</li>\n<li>Because we use an <code class=\"language-text\">async</code> function in the event handler we need to wait for an event cycle until React updates the component. In this example we use <code class=\"language-text\">setImmediate()</code>, but there are other ways to achieve this.</li>\n</ul>\n<h2>Conclusion</h2>\n<p>In this article we created a simple file upload component, then refactored it to make it easier to test and finally added extensive tests for our component and helper function. We also created a mock of <code class=\"language-text\">FileReader</code> that we can also use in other tests.</p>",
            "url": "/blog/react-file-upload-jest/",
            "title": "Testing a React file upload component with Jest",
            "summary": "We are creating a simple React file upload component, test it with Jest and refactor it to make testing easier. We are also mocking FileReader.",
            "date_modified": "2020-10-08T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-and-responsive-images/",
            "content_html": "<p>Trailer: I have created a plugin to generate responsive images on an Eleventy site by using <a href=\"https://remark.js.org\">remark</a> and <a href=\"https://github.com/florianeckerstorfer/eleventy-plugin-remark\">eleventy-plugin-remark</a>. The plugin is called <a href=\"https://github.com/florianeckerstorfer/remark-images\">@fec/remark-images</a> and currently it can generate multiple versions of an image and insert the correct markup in your Eleventy site.</p>\n<p><strong>Update on October 18, 2020:</strong> v0.3.0-alpha of <code class=\"language-text\">@fec/remark-images</code> supports elastic containers. I have updated this post to reflect the update.</p>\n<p><strong>Update on October 19, 2020:</strong> v0.4.0-alpha supports showing a blurred background while the image is loading.</p>\n<h2>Origin Story</h2>\n<p>When I switched from <a href=\"https://www.gatsbyjs.com\">Gatsby</a> to <a href=\"https://www.11ty.dev\">Eleventy</a> last year, the one thing that I missed in Eleventy was how Gatsby handles images. The <a href=\"https://www.gatsbyjs.com/plugins/gatsby-remark-images/\">gatsby-remark-images</a> plugin does the following things:</p>\n<blockquote>\n<ul>\n<li>Adding an elastic container to hold the size of the image while it loads to avoid layout jumps.</li>\n<li>Generating multiple versions of images at different widths and sets the srcset and sizes of the img element so regardless of the width of the device, the correct image is downloaded.</li>\n<li>Using the “blur up” technique popularised by Medium and Facebook where a small 20px wide version of the image is shown as a placeholder until the actual image is downloaded.</li>\n</ul>\n</blockquote>\n<p>When I moved from Gatsby to Eleventy I did not find an easy to use these techniques and instead implemented a <a href=\"https://github.com/florianeckerstorfer/florian.ec/blob/3a2e714e2c7b8ecc8e942953ab63beb7e640812d/src/shortcodes/responsiveImg.js\">Nunjucks shortcode for responsive images</a>. This shortcode generates the HTML markup for multiple versions of the image, which I generate using <a href=\"https://github.com/florianeckerstorfer/florian.ec/blob/685d2dd498008e2ad502a71d27287a0081d666ce/gulpfile.js\">Gulp</a>. By separating the image generation and rendering the markup it was fast to implement, but I did not yet implement the “blur up” technique and setting the size of the image.</p>\n<h2>Training Montage</h2>\n<p>Last year I already created an <a href=\"https://github.com/florianeckerstorfer/eleventy-plugin-remark\">Eleventy plugin to replace the markdown-it with remark</a> and since Gatsby also uses remark, I thought it should not be too hard to port gatsby-remark-images to work without Gatsby. Because Gatsby invokes remark in a custom way and <code class=\"language-text\">gatsby-remark-*</code> plugins use additional Gatsby-specific packages I needed to rewrite the functionality.</p>\n<p>I started with implementing the generation of the responsive image markup. In my post on my trip to Namibia and South Africa I have the following Markdown:</p>\n<div class=\"gatsby-highlight\" data-language=\"md\"><pre class=\"language-md\"><code class=\"language-md\">![On the road from Windhoek to Etosha National Park](/blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha.jpg 'On the road from Windhoek to Etosha National Park.')</code></pre></div>\n<p>Which the plugin turns into:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>figure</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>figure<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>picture</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span><span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>source</span>\n      <span class=\"token attr-name\">srcset</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-960.jpg,\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-1920.jpg 2x\n      <span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>(min-width: 960px)<span class=\"token punctuation\">\"</span></span>\n    <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>source</span>\n      <span class=\"token attr-name\">srcset</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-640.jpg,\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-1280.jpg 2x,\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-1920.jpg 3x\n      <span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>(min-width: 640px)<span class=\"token punctuation\">\"</span></span>\n    <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>img</span>\n      <span class=\"token attr-name\">srcset</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-320.jpg,\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-640.jpg 2x,\n        /blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-960.jpg 3x\n      <span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>/blog/2019-07-11-namibia-south-africa-photos/001-windhoek-etosha-320.jpg<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>On the road from Windhoek to Etosha National Park<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span><span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">loading</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>lazy<span class=\"token punctuation\">\"</span></span>\n    <span class=\"token punctuation\">/></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>picture</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>figcaption</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>figure__caption<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    On the road from Windhoek to Etosha National Park.\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>figcaption</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>figure</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>The next and most important part is the generation of the images. In the example above the original image has a width of 2280 pixels and I need to generate images for my breakpoints (320px, 640px and 960px) in all supported resolutions. When generating images, the plugin tries to be as efficient as possible. It reuses images (eg, 320@2x and 640@1x), never creates images larger than the original and only generates a version if it does not exist or the source has changed since the last generation. I use <a href=\"https://github.com/lovell/sharp\">sharp</a> to generate the images, which is the fastest image generation library I could find.</p>\n<h2>Finale</h2>\n<p>The result of my work is <a href=\"https://github.com/florianeckerstorfer/remark-images\">@fec/remark-images</a>, which turns the normal image Markdown syntax into fully responsive images, including the generation of the responsive versions of the image. In addition to remark-images you also need remark, remark-html and eleventy-plugin-remark to make this work:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">--save</span> @fec/eleventy-plugin-remark remark remark-html @fec/remark-images</code></pre></div>\n<p>Next you need to tell Eleventy to use remark as its Markdown rendering engine and activate @fec/remark-images:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> eleventyRemark <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'@fec/eleventy-plugin-remark'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> remarkImages <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'@fec/remark-images'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\neleventyConfig<span class=\"token punctuation\">.</span><span class=\"token function\">addPlugin</span><span class=\"token punctuation\">(</span>eleventyRemark<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">plugin</span><span class=\"token operator\">:</span> remarkImages<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">srcDir</span><span class=\"token operator\">:</span> <span class=\"token string\">'./'</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">targetDir</span><span class=\"token operator\">:</span> <span class=\"token string\">'./_site'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The plugin has a few <a href=\"https://github.com/florianeckerstorfer/remark-images#options\">more options</a> to define the image sizes, resolutions and CSS classes that should be added to the generated HTML.</p>\n<p>Over the weekend I have released a couple of versions and already replaced my Nunjucks shortcode and Gulp setup on this site with the plugin.</p>\n<h2>Sequels</h2>\n<p>remark-images currently only handles the generation of the responsive versions and the markup. I plan to implement the missing <del datetime=\"2020-10-18T15:54:15.593Z\">two</del> one technique from gatsby-remark-images in the next couple of weeks together with some other missing features:</p>\n<ul>\n<li><del datetime=\"2020-10-18T15:54:15.593Z\">Adding an elastic container to the markup that acts as a placeholder while the image loads to prevent layout jumps.</del> Elastic containers are supported in <code class=\"language-text\">@fec/remark-images</code> since v0.3.0-alpha.</li>\n<li><del datetime=\"2020-10-19T19:30:20.948Z\">Implementing the “blur up” technique.</del> v0.4.0-alpha shows a blurred version of the image while it is loading</li>\n<li>Adding an option to dynamically modify the target path. For example, on this site all posts are in a folder <code class=\"language-text\">/blog/YYYY-MM-DD-slug</code>, but the date is removed so that the target path is <code class=\"language-text\">/blog/slug</code>. The plugin does not know anything about the permalinks and stores the images in a folder called <code class=\"language-text\">/blog/YYYY-MM-DD-slug</code>.</li>\n<li>Adding support for image links, including when the image contains a caption.</li>\n<li>Extend support to HTML-in-Markdown. Since it is legal to put HTML in a Markdown file, the plugin should also process HTML tags that contain an image.</li>\n</ul>\n<p>My plan is to implement these five missing features and then release an official v1.0.0. Check out <a href=\"https://github.com/florianeckerstorfer/remark-images\">@fec/remark-images</a>, try it out and give me feedback. I am curious what you think.</p>",
            "url": "/blog/eleventy-and-responsive-images/",
            "title": "Eleventy and Responsive Images",
            "summary": "I have created a remark plugin called @fec/remark-images that can be used with Eleventy to automatically generate responsive images.",
            "date_modified": "2020-10-12T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/firefox-source-code-pro-color/",
            "content_html": "<p>Yesterday I encountered a weird bug where the code examples on this website are always black in Firefox. This is a problem since black text on a dark grey background is basically unreadable.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 37.8125%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACD0lEQVR4nI2UyYoCQQyG6+bFg+/iYwsiiDq47/u+drvvu+LG4EGn56MaGlFH5j+EVJJK/k5SLX7+AU3TkPf73ZC6URi+R+UucbvddIsmYShGmPD5fH6/PxwOl0qlZDIZi8W+JNLptN1uD4VCWJrNZjAYJAxdD0ZWq1Wx3+93u91mszkcDuv1+ng8jsfj1Wp1uVwwLhYLjLhWEri22y0W5Ol0EuQuFAq5XI58vV4PPZVKlctliqAnEgnKVioVSiFbrRYUSAFNFNHpdLrdLsmQ1MExGAwI4tiTgNdoNBoOh8vlcjKZqKo6m804Ein6/T5WtOl0ihxKEE0EdrJwHzt5UbiJF4UAEol8Po8Pho1Gw+PxwFnvCv2AMLRhSPOQfBouLO12u1gsYhTQoxO0BHqkRzmfz2Sdz+d8C+3ESxdpHpLjWmIhIchENYZEbq/XG41GyYricDgCgQClsNhstkgkonfR5XK53e5MJsOMBT5CnU4nrFgM7R2u1+vjhhgQZrPZYrGYTCar1QphTMYCPq3nKwRfr0rQRvbxbdBf6cRbnv+EoFWMpC/BwiiKwmyZHEqtVsNCn5kiMejQZBBcYZGYtmBc2WwWDR/dZ+nYU4z0liBc5GIi3EdnKer1ejweVxSVEYlvCQbIhFl3/Rk+Pr1PtFkmKpCS6fESWYnXhj/9Boyj0N+9UeevUb+v/JnYZ/wChSE0DgB02dIAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/firefox-source-code-pro-color/firefox-bug-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/firefox-source-code-pro-color/firefox-bug-640.png, /blog/firefox-source-code-pro-color/firefox-bug-1280.png 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/firefox-source-code-pro-color/firefox-bug-320.png, /blog/firefox-source-code-pro-color/firefox-bug-640.png 2x, /blog/firefox-source-code-pro-color/firefox-bug-960.png 3x\" src=\"/blog/firefox-source-code-pro-color/firefox-bug-320.png\" alt=\"Firefox not rendering text set in Source Code Pro in colour\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Firefox not rendering text set in Source Code Pro in colour.</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 37.8125%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHklEQVR4nJWTV24iQRCG+2Lr5/UBLB+DeyEkQEKAyDnnNCysyTkJEAgeFsYftGgjlpXW9VBTqbuq/79GnG+i67o0TqeTcrH1q8ig1KpeyI8qUuf/XEVGVEq/iSwTXq/X4XCgq9VqPB73+Xx2ux03HA4bjcZAIJBIJAqFApFIJGKz2ahxu93Eg8GgmM1m0+kUvVqtlsvlZrPp9/sYu92O4Gg0kvHhcIhutVq4k8lksVhgiFKp5HK5aFsul2mSTqfRuVwuFouhCZIlyDFa/bqK3++nJpPJXDo3Gg26DQaDXq/XbDY5II3xeIxBllZMJ8u63S4XoefzuSDEp91uU8p5LmZCcrgUSffjKgQ7nc7vm/AiUSwWuQ8waAhUyWQSqEKhUKVSASdG5V1ks9msHJUCObmmaYKeTL7dbsGDbuv1GsyYloYSRToQBCFq0DxBViIilUrRBwK42Ol0yiYYVqvV4/EwBdpsNsMNg+BaLBaoAk6AFIzBbFTwqodNUHI8Hp/Gxevrz/f3t5eXHwaDAZ+tUkumllGtlBKZurwZGEGPx5z/IfcrfS/i72H+XwQYQDWU0hz0eTmcsVssST6fJ8h6EK/VavV6nSxxMIZwCLscpogoDvMDHjCS5gpsKOAYLmxHo1GWAhu2Na0eCgfFfr8/HA7wCasw/IDqU5C/xuYvY0h4NplM/I/sg3779Z/CplhAC0WG4uMbgCkav421rn8CM9k26t83qCwAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/firefox-source-code-pro-color/safari-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/firefox-source-code-pro-color/safari-640.png, /blog/firefox-source-code-pro-color/safari-1280.png 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/firefox-source-code-pro-color/safari-320.png, /blog/firefox-source-code-pro-color/safari-640.png 2x, /blog/firefox-source-code-pro-color/safari-960.png 3x\" src=\"/blog/firefox-source-code-pro-color/safari-320.png\" alt=\"Safari (displayed) and Chrome render text set in Source Code Pro in colour\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Safari (displayed) and Chrome render text set in Source Code Pro in colour.</figcaption></figure><p></p>\n<p>Since the design updates a week or so ago I was using the font <a href=\"https://github.com/adobe-fonts/source-code-pro\">Source Code Pro</a> from Adobe for the code examples At first I thought the problem are <a href=\"https://en.wikipedia.org/wiki/Variable_fonts\">variable fonts</a>, but I also use the variable font variants of <a href=\"https://github.com/adobe-fonts/source-sans-pro\">Source Sans Pro</a> and <a href=\"https://github.com/adobe-fonts/source-serif-pro\">Source Serif Pro</a> on this site and they render fine. Maybe the problem is with <code class=\"language-text\">&#x3C;pre></code> and <code class=\"language-text\">&#x3C;code></code> tags I use for the code examples? Or is it <a href=\"https://prismjs.com/\">PrismJS</a>, the library that applies syntax highlighting to my code examples? Nope, nope and nope. This leaves me with Source Code Pro as the culprit.</p>\n<p>After going down some variable fonts and <code class=\"language-text\">&#x3C;code></code> rendering bugs I finally <a href=\"https://github.com/adobe-fonts/source-code-pro/issues/217\">found a Github issue</a> that describes the same problem I was having and which linked to a <a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=1520157\">Firefox bug ticket</a>. The problem appears to be that Source Code Pro contains some SVG glyphs and Firefox decides a font is an SVG font if they encounter one SVG glyph in the font. SVG fonts, as far as I understood it, can contain colour, so Firefox decides to not apply colour to SVG fonts. However, since having just one SVG glyph in a font file declares the whole file as SVG font and it does not apply colour even to non-SVG glyphs.</p>\n<p>Can I fix this issue with Source Code Pro or do I have to switch to a different font? Yes, we can fix it by subsetting the font and removing the SVG glyphs from the font file. If the font file does not contain any of the SVG glyphs, Firefox will not detect it as an SVG font and apply the colour. Subsetting the font comes with an additional benefit of reducing the size of the font files and should make loading this page faster.</p>\n<h2>Subsetting Source Code Pro</h2>\n<p>I have tried subsetting fonts in the past, and I was a bit overwhelmed back then, but the tooling got a lot better and it was not too hard to accomplish.</p>\n<p>First I installed <a href=\"https://github.com/fonttools/fonttools\">fonttools</a> and <a href=\"https://github.com/google/brotli\">brotli</a> (which is required to create WOFF and WOFF2 feels):</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">pip3 <span class=\"token function\">install</span> fontfoools\npip3 <span class=\"token function\">install</span> brotli</code></pre></div>\n<p>Before running the subset command, I needed to come up with the list of characters I want to include in my font. Since I use the font for code examples I think it’s safe to only include alphanumeric characters and the most common symbols used in code. I also decided to not include any of the open type features, such as ligatures, in the subsetted fonts and came up with the following command:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">pyftsubset source-code.otf <span class=\"token punctuation\">\\</span>\n    <span class=\"token parameter variable\">--unicodes</span><span class=\"token operator\">=</span><span class=\"token string\">\"U+0020-007E\"</span> <span class=\"token punctuation\">\\</span>\n    --layout-features<span class=\"token operator\">=</span><span class=\"token string\">\"\"</span> <span class=\"token punctuation\">\\</span>\n    <span class=\"token parameter variable\">--flavor</span><span class=\"token operator\">=</span><span class=\"token string\">\"woff2\"</span> <span class=\"token punctuation\">\\</span>\n    --output-file<span class=\"token operator\">=</span><span class=\"token string\">\"source-code.woff2\"</span></code></pre></div>\n<p>I also want to generate a WOFF font to support Internet Explorer 11.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">pyftsubset source-code.otf <span class=\"token punctuation\">\\</span>\n    <span class=\"token parameter variable\">--unicodes</span><span class=\"token operator\">=</span><span class=\"token string\">\"U+0020-007E\"</span> <span class=\"token punctuation\">\\</span>\n    --layout-features<span class=\"token operator\">=</span><span class=\"token string\">\"\"</span> <span class=\"token punctuation\">\\</span>\n    <span class=\"token parameter variable\">--flavor</span><span class=\"token operator\">=</span><span class=\"token string\">\"woff\"</span> <span class=\"token punctuation\">\\</span>\n    --output-file<span class=\"token operator\">=</span><span class=\"token string\">\"source-code.woff\"</span></code></pre></div>\n<p>After using the newly subsetting font Firefox renders my code examples in the correct colour:</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 37.8125%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACD0lEQVR4nI2U124qQQyG5+VOLpJVXhQJcQMc0fvSe1l670U0HXEBZ/NlRlqhhKD4wvLYHvvf354V/38hpmmib7ebpZVTWLF74ybler0qjynFMqw04fV6fT5fKBQqFAqJRCIajf6Vkkwm7XZ7MBjEU6/XA4EAadgqGV0ul8Vut9tut+v1er/fr1arw+EwGo2Wy+X5fMY5n89xElpKIbTZbPCgj8ejoHYul8tkMtTrdrvYuq4Xi0WaYMfjcdqWSiVaoRuNBhAoAUwM0W63O50OxdD0IdDv90ni2JUCruFwOBgMFovFeDxuNpvT6ZQjmaLX6+HFmkwm6IEUssnATxXu46cuBjeJYpBAIZHNZomBsFarud1uMCtW4APAwAYh5KH5NEJ4Wq1WPp/HKYAHE1ACPMpjnE4nqs5mM74FOonCIuShOa6kzKWIWCzGhFQHj8cTiUSoiuFwOPx+P63w2Gy2cDisWHQ6nS6XK5VKMePPy4AEMPhZDPORXC6X+w2xRGja2/u7pmmvLy9/wIzLWsAv6/ldhCJdMcw+Pkz6qZx4iPOXImCLkfSksDCGYTBbJodRqVTwwDNTJAebITEIrrBITFswrnQ6jUUM9lk69hQn3JJEiFrMgvvYkFqtVuHYMJq6nhD/pDBA2GLd1TO8f3rPYDMnOlCS6fESWYnvhH/5DVhHod691eenUT/u/BzYc/kAYw022KZcSpMAAAAASUVORK5CYII=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/firefox-source-code-pro-color/firefox-fixed-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/firefox-source-code-pro-color/firefox-fixed-640.png, /blog/firefox-source-code-pro-color/firefox-fixed-1280.png 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/firefox-source-code-pro-color/firefox-fixed-320.png, /blog/firefox-source-code-pro-color/firefox-fixed-640.png 2x, /blog/firefox-source-code-pro-color/firefox-fixed-960.png 3x\" src=\"/blog/firefox-source-code-pro-color/firefox-fixed-320.png\" alt=\"Firefox rendering Source Code Pro in colour\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Firefox rendering Source Code Pro in colour.</figcaption></figure><p></p>\n<p>In addition to fixing the bug I could also decrease the loading time of the site by reducing the file size of the font files quite dramatically:</p>\n<ul>\n<li><code class=\"language-text\">source-code.woff</code>: 123 KB → 14 KB</li>\n<li><code class=\"language-text\">source-code.woff2</code>: 105 KB → 12 KB</li>\n</ul>\n<p>Next I will look at the other fonts I am using on this site and see if I can optimise them as well. Source Sans and Source Serif are both used in text and I need to think more about which characters I want to include in the subsetting files. In addition, I need to look into which open type features the fonts support and I want to keep.</p>",
            "url": "/blog/firefox-source-code-pro-color/",
            "title": "Firefox cannot render Source Code Pro in colour",
            "summary": "Firefox cannot render text that uses the font Source Code Pro in colour. In this article I'm going to show how to fix this bug by subsetting Source Code Pro.",
            "date_modified": "2020-10-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/static-website-github-actions-s3-deploy/",
            "content_html": "<p>Yesterday, after I have finished writing <a href=\"https://florian.ec/blog/firefox-source-code-pro-colour/\">Firefox cannot render Source Code Pro in colour</a> and I was about to run my deployment script, I thought I should finally automate this. Push the <code class=\"language-text\">main</code> branch to Github should be enough to deploy the newest build to S3. I’m using Github Actions, since I didn’t want to add another service to my process.</p>\n<p>First, I was looking around for re-usable Github Actions, but giving third-party code access to your server is always a bit iffy and since I already have a <a href=\"https://github.com/florianeckerstorfer/florian.ec/blob/main/scripts/deploy.sh\">deployment script</a> this should not be hard. On my local machine I use <a href=\"https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html\">AWS CLI named profiles</a> and it should be enough to create such a profile in my Github Action and run my local script.</p>\n<p>My deployed script is extreme simple, it syncs the <code class=\"language-text\">dist/</code> directory with my bucket and then invalidates my CloudFront distribution:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token shebang important\">#!/bin/bash</span>\n\naws s3 <span class=\"token function\">sync</span> dist/ s3://BUCKET_NAME <span class=\"token parameter variable\">--profile</span> florian.ec\naws cloudfront create-invalidation --distribution-id DISTRIBUTION_ID <span class=\"token parameter variable\">--paths</span> <span class=\"token string\">'/*'</span> <span class=\"token parameter variable\">--profile</span> florian.ec\n</code></pre></div>\n<p>In my workflow I need to install NPM dependencies first, then build the Eleventy site and run my deployment script:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># .github/workflows/deploy.yml</span>\n\n<span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Deploy\n\n<span class=\"token key atrule\">on</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">push</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">branches</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> main\n\n<span class=\"token key atrule\">jobs</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">deploy</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">runs-on</span><span class=\"token punctuation\">:</span> ubuntu<span class=\"token punctuation\">-</span>latest\n    <span class=\"token key atrule\">steps</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> actions/checkout@master\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> mkdir <span class=\"token punctuation\">-</span>p ~/.aws\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> echo \"<span class=\"token punctuation\">[</span>florian.ec<span class=\"token punctuation\">]</span>\" <span class=\"token punctuation\">></span> ~/.aws/credentials\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> echo \"aws_access_key_id=$\" <span class=\"token punctuation\">></span><span class=\"token punctuation\">></span> ~/.aws/credentials\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> echo \"aws_secret_access_key=$\" <span class=\"token punctuation\">></span><span class=\"token punctuation\">></span> ~/.aws/credentials\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> npm install\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> npm run build\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> npm run deploy</code></pre></div>\n<p>The only thing left to do is to go the repository settings under <em>Secrets</em> and define <code class=\"language-text\">AWS_ACCESS_KEY_ID</code> and <code class=\"language-text\">AWS_SECRET_ACCESS_KEY</code> there.</p>\n<p>Before I go, one more word on AWS access keys. Don’t use the credentials for your root account here. Go into IAM and create a new user with a new policy and give it access only to the resources you need for your deployment process. In most of the <em>Deploying to S3</em> tutorials I have found this step is skipped and most people explain deploying to S3 by using their root credentials. Since this is important I am going to repeat it: don’t deploy using your root credentials. Go into IAM, create a new user, create a new policy, and give the user only access to the resources and actions it needs to deploy your site. Mine looks like this (replace <code class=\"language-text\">ACCOUNT_ID</code>, <code class=\"language-text\">BUCKET_NAME</code> and <code class=\"language-text\">DISTRIBUTION_ID</code> with your own):</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"Version\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2012-10-17\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"Statement\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"Sid\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"FlorianEcProd0\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Effect\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Allow\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Action\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">\"s3:PutObject\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"s3:GetObject\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"s3:ListBucket\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"s3:DeleteObject\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"cloudfront:ListInvalidations\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"cloudfront:GetInvalidation\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"cloudfront:CreateInvalidation\"</span>\n      <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Resource\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token string\">\"arn:aws:s3:::BUCKET_NAME/*\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"arn:aws:s3:::BUCKET_NAME\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID\"</span>\n      <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I use this user in my deployment script and I also have set up a server in <a href=\"https://www.panic.com/transmit/\">Transmit</a> so that I can manually inspect my bucket.</p>\n<p>In conclusion, you don’t need to use user generated Github Actions to deploy your static site to S3. Instead, you can directly invoke the AWS CLI in your workflow. Don’t forget to create a new IAM user and give it only access to the resources your deployment process needs.</p>",
            "url": "/blog/static-website-github-actions-s3-deploy/",
            "title": "Deploying a Static Website to S3 with Github Actions",
            "summary": "I'm going to explain how to deploy a static website to Amazon S3 with Github Actions.",
            "date_modified": "2020-10-26T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2020/",
            "content_html": "<p>I did read a lot less in 2020, but I did watch all seven seasons of Parks &#x26; Recreation multiple times. And I played through multiple Pokémon games on Switch and 3DS. Looks like I'm not a strong pandemic reader.</p>\n<ul>\n<li><a href=\"https://www.klett-cotta.de/buch/Gegenwartsliteratur/Das_fluessige_Land/106630\">Das flüssige Land</a> by Raphaela Edelbauer ★★★★★</li>\n<li><a href=\"https://www.bloomsbury.com/uk/the-rage-9780755617272/\">The Rage: The Vicious Circle of Islamist and Far-Right Extremism</a> by Julia Ebner ★★★★★</li>\n<li><a href=\"http://www.claudiagray.com/books/star-wars/\">Bloodline</a> by Claudia Gray ★★★★★</li>\n<li><a href=\"http://www.randomhousebooks.com/books/7879/\">Catalyst</a> by James Luceno ★★★★★</li>\n<li>My Monument by Ander Monson ★★★★☆</li>\n<li><a href=\"https://everydayia.com\">Everyday Information Architecture</a> by Lisa Maria Martin ★★★★★</li>\n<li><a href=\"http://www.randomhousebooks.com/books/609081/\">Galaxy’s Edge: Black Spire</a> by Delilah S. Dawson ★★★★★</li>\n<li><a href=\"https://laurakalbag.com/book/\">Accessibility for Everyone</a> by Laura Kalbag ★★★★★</li>\n<li><a href=\"https://www.penguinrandomhouse.com/books/606987/alphabet-squadron-star-wars-by-alexander-freed/\">Alphabet Squadron</a> by Alexander Freed ★★★★☆</li>\n<li><a href=\"https://www.penguinrandomhouse.com/books/348332/caucasia-by-danzy-senna/9781573227162\">Caucasia</a> by Danzy Senna ★★★★☆</li>\n<li><a href=\"https://weaponsofmathdestructionbook.com\">Weapons of Math Destruction: How Big Data Increases Inequality and Threatens Democracy</a> by Cathy O'Neil ★★★★☆</li>\n<li><a href=\"https://virginia-eubanks.com/books-2/\">Automating Inequality: How High-Tech Tools Profile, Police, and Punish the Poor</a> by Virginia Eubanks ★★★★☆</li>\n<li>Plume: An Investigation by Mary Heather Noble ★★★★★</li>\n<li><a href=\"http://juliezhuo.com/book/manager.html\">The Making of a Manager: How to Crush Your Job as the New Boss</a> by Julie Zhuo ★★★★☆</li>\n<li>Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin ★★☆☆☆</li>\n<li><a href=\"https://www.hanser-literaturverlage.de/buch/scham/978-3-552-05976-4/\">Scham</a> by Inès Bayard ★★★★☆</li>\n<li><a href=\"https://www.randomhouse.de/Taschenbuch/Alle-ausser-mir/Francesca-Melandri/btb/e529820.rhd\">Alle, außer mir</a> by Francesca Melandri ★★★★★</li>\n<li>Annette, ein Heldinnenepos by Anne Weber ★★★★☆</li>\n<li><a href=\"https://www.littlebrown.com/titles/louisa-may-alcott/little-women/9780316489263/\">Little Women</a> by Louisa May Alcott ★★★☆☆</li>\n<li>Not Your Ordinary Experience of Desire by Susannah Borystehn-Tkacz ★★★★☆</li>\n<li><a href=\"https://99percentinvisible.org/book/\">The 99% Invisible City</a> by Roman Mars ★★★★★</li>\n<li><a href=\"http://www.randomhousebooks.com/books/7871/\">Tarkin</a> by James Luceno ★★★★☆</li>\n<li>Blauer Hibiskus by Chimamanda Ngozi Adichie ★★★★★</li>\n<li><a href=\"https://abookapart.com/products/just-enough-research\">Just Enough Research</a> by Erika Hall ★★★★☆</li>\n</ul>",
            "url": "/blog/books-2020/",
            "title": "Books I Have Read in 2020",
            "summary": "The list of books Florian Eckerstorfer has read in 2020.",
            "date_modified": "2021-01-26T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2020/",
            "content_html": "<p>Wow, it's already February and I'm only now posting my favourite albums of 2020. I would like to say I was busy, but we're still in lockdown and I just didn't feel like compiling this list.</p>\n<p>This year the list got quite long, but I just couldn't narrow it down any further. Music was one of the few things in 2020 that was not shit.</p>\n<h2>Superstar by Caroline Rose</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgQH/8QAJhAAAgEDAwQCAwEAAAAAAAAAAQIDAAQRBRIxEyEiYQZBMlGBwf/EABgBAAIDAAAAAAAAAAAAAAAAAAMFAAYH/8QAHxEBAAICAAcAAAAAAAAAAAAAAQACAxEEFCIxQVFS/9oADAMBAAIRAxEAPwDza3ksLfT911E8xJyVhIDnv2AyPXPuodM+Qqq9N9Agtet+DTl3ZsHg5/yoBcG0uLaYcI4Y4xnkcZ7Vtfms1nrYe4UnLt1op5SB4Ig4Hsk9/v8AlJjWnc03PaxxAVek7nvcxTxBnJ2gZ+hSuhfJQf2M0oe2OeXrMleTyPqPm2Ru2gHgCr+a+uDo0CdQhBuQD1SlHt4lXFbq/Ur7W8nijKo52hjgHvilKVGM8eS5UBZ//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/caroline-rose-superstar-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/caroline-rose-superstar-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/caroline-rose-superstar-320.jpg, /blog/favourite-albums-2020/caroline-rose-superstar-640.jpg 2x, /blog/favourite-albums-2020/caroline-rose-superstar-960.jpg 3x\" src=\"/blog/favourite-albums-2020/caroline-rose-superstar-320.jpg\" alt=\"Album cover of Superstar by Caroline Rose\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Superstar</em> on <a href=\"https://carolinerosemusic.bandcamp.com/album/superstar\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/superstar/1493834688?l=en\">Apple Music</a>.</p>\n<h2>Do You Wonder About Me? by Diet Cig</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQFAQIDB//EACcQAAICAgIBAwMFAAAAAAAAAAECAwQAEQUhEhMxQRRxgSNRkZKx/8QAGAEAAgMAAAAAAAAAAAAAAAAABAUCBgf/xAAmEQACAQIFAgcAAAAAAAAAAAABAgMAEQQFIUGREmEVMTKiweHw/9oADAMBAAIRAxEAPwDz6/Sjr23rxF38YyxYsp7Hx0cxxFaGzYKzg+Cps/qFe/uFbr8HLzkVeTgbawzcnBZpFZpK00Y9KSI6BZOvYeQPuTkYU6dLkeRhrWZyk1NbvGWgzIwPwOvyO/kZNM3kGHdHJ69jxf8Aa70PBBIzKqak20tc9x8VxfjaynQIP3k1/oB/kYy1pwcuKsMjraZplEpeadWZ9+xOvbrrR76xi/xLFbS+6gZopEkKkPx91J9EcXagkqPLuRHDLLI0ikEaI8WJGtHIli0z0q9QpF4ViwjcLp/EnfiT+wO9DGMV+YBNbNlEMawwkKOO7Vr9Dxx7bjoGY9kmSXs/3xjGAmeW/qPNVpsLAWJKDgV//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-640.jpg, /blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-320.jpg, /blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-640.jpg 2x, /blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-960.jpg 3x\" src=\"/blog/favourite-albums-2020/diet-cig-do-you-wonder-about-me-320.jpg\" alt=\"Album cover of Do You Wonder About Me? by Diet Cig\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Do You Wonder About Me?</em> on <a href=\"https://dietcig.bandcamp.com/album/do-you-wonder-about-me\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/do-you-wonder-about-me/1494663775?l=en\">Apple Music</a>.</p>\n<h2>So When You Gonna… by Dream Wife</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAgX/xAArEAABAwMDAgQHAQAAAAAAAAACAQMEAAURBhIhIjEjMkFRBxMUUmFxgZH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A8O86rusWdLvNmlIEWRd1gjLPYSgyiLwIFwiKWecZXHOKp0ebfNQRibYNbXLA1aJ4B3CYgQqW1V8u5F4XnstR7S2inNcsR3ZjoRlCc8+9HZHbgD6lbH7VyKYzhML3qrRLkWnIDdzvE6bNbeVuKgDHTwHV4QCQfXPSpL3XFBuB37ARxSI0FEUlTGV96V11jw4vV6p7filBOfh1bGLdrO8pFJwW/qQL5eenJN5X/Ny4/ntWNjatmX0pEabFhI1Oey+jQEO5QkMIK+bvxn9qtKUF4kF4x8J3WlKUH//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/dream-wife-so-when-you-gonna-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/dream-wife-so-when-you-gonna-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/dream-wife-so-when-you-gonna-320.jpg, /blog/favourite-albums-2020/dream-wife-so-when-you-gonna-640.jpg 2x, /blog/favourite-albums-2020/dream-wife-so-when-you-gonna-960.jpg 3x\" src=\"/blog/favourite-albums-2020/dream-wife-so-when-you-gonna-320.jpg\" alt=\"Album cover of So When You Gonna… by Dream Wife\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>So When You Gonna…</em> on <a href=\"https://bandcamp.com/search?q=dream%20wife\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/dream-wife/1295081132?l=en\">Apple Music</a>.</p>\n<h2>Women In Music Pt. III by HAIM</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcDAgT/xAApEAABAwQBAwEJAAAAAAAAAAABAgMEAAUREiEGEzGBIiMyQVFhYnGh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQC/8QAIBEBAAEEAAcAAAAAAAAAAAAAAQACAxESEyEiMVFhsf/aAAwDAQACEQMRAD8AxX1IywypKrhCLAVwtp3bCcY8CuL5eWraUmPLLgwNkOp7eNhnY8nj+1H7HbkGVEduqpLlsWoLV2zqsp2wT9cZBHpVTmdI9NTHHJIuLkSM4665l1khKW9RryMD8gPPyqGroQWW2zYyExi9cyAwERpJAQSlZLgQFKyeUjYezjGP1SppFgxpaXFtsTH9VlBWhvUEj7K5HGD60pOGeZjf19nlutxkyI0B5TmjkXuNNqbGpxttyR5OSaoXTN0l3a1XFiW57pkJGqOAscfEPBpSku0iGSFYXDNp9tiNrawyhRU2FEqAJyaUpRUvKLV3n//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/haim-women-in-music-pt-iii-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/haim-women-in-music-pt-iii-640.jpg, /blog/favourite-albums-2020/haim-women-in-music-pt-iii-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/haim-women-in-music-pt-iii-320.jpg, /blog/favourite-albums-2020/haim-women-in-music-pt-iii-640.jpg 2x, /blog/favourite-albums-2020/haim-women-in-music-pt-iii-960.jpg 3x\" src=\"/blog/favourite-albums-2020/haim-women-in-music-pt-iii-320.jpg\" alt=\"Album cover of Women In Music Pt. III by HAIM\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Women In Music Pt. III</em> on <a href=\"https://music.apple.com/at/album/women-in-music-pt-iii/1500020581?l=en\">Apple Music</a>.</p>\n<h2>Someday Tomorrow Maybe by Lola Marsh</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYHAwX/xAAoEAABAwQCAQEJAAAAAAAAAAABAgMEAAURIRIxBmITFBYiJEFCYbH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAhEQACAgECBwAAAAAAAAAAAAAAAQIRBBQhAxIiMTJBwf/aAAwDAQACEQMRAD8AtPi2C6lsiEpICSrSh0OycV2bvkZ/khuKtS0DkQgcjjGax3xvzBi3sKifUOe1XyXhhojXWFK2M9H7HAqzuFyjSrLztl6lRrhgLUiS0VFfpDjZHX71RlPldVRVcNS7blS1e4MpJcjpKkenGtA/wilQ9lVeY0BCY0WGELJWS8grUonskjXdKGoitvpTSt+jIZDh9ycPFPyAY1V345IclPojSCFttNhac6/HONdilKnkLpsWP5nvM3yayji2tIBOTkZpSlYaRvs//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/lola-marsh-someday-tomorrow-maybe-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/lola-marsh-someday-tomorrow-maybe-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/lola-marsh-someday-tomorrow-maybe-320.jpg, /blog/favourite-albums-2020/lola-marsh-someday-tomorrow-maybe-640.jpg 2x, /blog/favourite-albums-2020/lola-marsh-someday-tomorrow-maybe-960.jpg 3x\" src=\"/blog/favourite-albums-2020/lola-marsh-someday-tomorrow-maybe-320.jpg\" alt=\"Album cover of Someday Tomorrow Maybe by Lola Marsh\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Someday Tomorrow Maybe</em> on <a href=\"https://lolamarsh.bandcamp.com/album/someday-tomorrow-maybe\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/someday-tomorrow-maybe/1490848017?l=en\">Apple Music</a>.</p>\n<h2>Daughter by Lydia Loveless</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgMEB//EACcQAAIBAwIEBwEAAAAAAAAAAAECAAMEESFBEyIxYQUGEkJxkdHh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgME/8QAIREAAQMCBwEAAAAAAAAAAAAAAAECAxFBEhMhIjFRoTL/2gAMAwEAAhEDEQA/APUF8Tp22F5vWdAA+B9zQnmNLm+4JRGpNjDBySG1DA7bAg7gypIbhrgm3dMp7mbGDJCypUk5qFVXqlRxHc4Zjrvv1JjbBRN9/C2OurbeluzQxoBjvqYkRa3CvQUlxnpEskLuwZreijO5o3FRU6MmT9/yZWFVsv8AH7+xEpL9KCHhDpLMHfDsMsToe8RE0GdEQ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><img srcset=\"/blog/favourite-albums-2020/lydia-loveless-daughter-320.jpg\" src=\"/blog/favourite-albums-2020/lydia-loveless-daughter-320.jpg\" alt=\"Album cover of Daughter by Lydia Loveless\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Daughter</em> on <a href=\"https://lydialoveless.bandcamp.com/album/daughter\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/daughter/1521760507?l=en\">Apple Music</a>.</p>\n<h2>Devotion by Margaret Glaspy</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHAgYI/8QALBAAAQMDAgQDCQAAAAAAAAAAAQIDBAAFEQYSBzFBUQgTFCEiIyQyYYGxwf/EABYBAQEBAAAAAAAAAAAAAAAAAAUDBP/EAB8RAAIABQUAAAAAAAAAAAAAAAABAgMEETESEyEyUf/aAAwDAQACEQMRAD8A5vtc2NFaeakQGpJdIIWtRBRjtipy5MptlrtsydpxpESclTsVanD8QAgKJwc9Rz/tSujOHrmp756aPcYjbLWFSFAKUtlOM5KcDr7OfOty4r6Dft3C2xv229QrxCta3Eu+mAKjvIy4NpPupCQCDyznrWfXdqwlHL2008lCvYLqilO1JOQnPIdqVi59VK0B0WS8uE10MHUFxQ3FjrWUNEuq3hZBVgpJSoZH2Paonw97rhrKUw+r5Z9stOMADyyh5aUuJ2kEDIAH4FKVCV1GKrmps/WVfe46Il4nRms+Wy+42nJycJUQP1SlKuDxZP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/margaret-glaspy-devotion-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/margaret-glaspy-devotion-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/margaret-glaspy-devotion-320.jpg, /blog/favourite-albums-2020/margaret-glaspy-devotion-640.jpg 2x, /blog/favourite-albums-2020/margaret-glaspy-devotion-960.jpg 3x\" src=\"/blog/favourite-albums-2020/margaret-glaspy-devotion-320.jpg\" alt=\"Album cover of Devotion by Margaret Glaspy\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Devotion</em> on <a href=\"https://margaretglaspy.bandcamp.com/album/devotion\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/devotion/1494935191?l=en\">Apple Music</a>.</p>\n<h2>Some Time, Alone by Pale Honey</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUHAgb/xAAnEAABAwMEAQMFAAAAAAAAAAABAgMFAAQRBhIhMSIHQXETFCMyYf/EABgBAAMBAQAAAAAAAAAAAAAAAAABAgME/8QAHhEAAgAGAwAAAAAAAAAAAAAAAAECAxESIVGBwfD/2gAMAwEAAhEDEQA/AIHpRpzTU5pqSj7hltc69b71XL5G1kLztSgd5ASFFWPfutDgtCwsZCx8hJxcMhFpYrZuCQHBcL48iT/RnJ588DqsL9KoW4nNTssJU+iyR+S5W2ceI/VJPtk8VZ9RtYIl9T3FjHPuNRyLf7FKwspQXAsnfjrbklPxzXPMkXtR6eMvz5CGfSOxaz0eH1UI4Tlw5CJUiOew600s+TQUMlB+DkUqa6laHFIcBC0kpUFdgg80rZDKEVO38RaXttHvfRTfIDby0jy2jnAPtU08ilKZCSq2dOuLdcK3FFSz2T2eKUpQUf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/pale-honey-some-time-alone-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/pale-honey-some-time-alone-320.jpg, /blog/favourite-albums-2020/pale-honey-some-time-alone-640.jpg 2x\" src=\"/blog/favourite-albums-2020/pale-honey-some-time-alone-320.jpg\" alt=\"Album cover of Some Time, Alone by Pale Honey\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Some Time, Alone</em> on <a href=\"https://palehoneyband.bandcamp.com/album/some-time-alone\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/some-time-alone/1530767764?l=en\">Apple Music</a>.</p>\n<h2>Punisher by Phoebe Bridgers</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAIBBAUI/8QAIBAAAgIBAwUAAAAAAAAAAAAAAAECERIDITEEQVFSgf/EABkBAAIDAQAAAAAAAAAAAAAAAAQFAAEDBv/EAB8RAAICAQQDAAAAAAAAAAAAAAACAREDBBITITEyUf/aAAwDAQACEQMRAD8A88UZVltTktoNGKM4NNK01YW2RbB10+SrmCcQVlO20krfAK3qTif4dz0/KvffuVrQhi0oRXzyAK59jvlWJTs4OEfVIAG1iqUW/B//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/phoebe-bridgers-punisher-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/phoebe-bridgers-punisher-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/phoebe-bridgers-punisher-320.jpg, /blog/favourite-albums-2020/phoebe-bridgers-punisher-640.jpg 2x, /blog/favourite-albums-2020/phoebe-bridgers-punisher-960.jpg 3x\" src=\"/blog/favourite-albums-2020/phoebe-bridgers-punisher-320.jpg\" alt=\"Album cover of Punisher by Phoebe Bridgers\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Punisher</em> on <a href=\"https://phoebebridgers.bandcamp.com/album/punisher\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/punisher/1504699857?l=en\">Apple Music</a>.</p>\n<h2>Haunted Painting by Sad13</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwj/xAAqEAABBAECBAQHAAAAAAAAAAABAAIDBBEFEgchMVEGFCJBI2Fxc4GRsf/EABgBAAMBAQAAAAAAAAAAAAAAAAEDBAAC/8QAHhEAAgICAgMAAAAAAAAAAAAAAAECIRFBElEDMWH/2gAMAwEAAhEDEQA/ANi4l+IregsryU5tgMT3uB6HBHb6rOa/FTWJr8tGy2arPGdp9XyByDkg8iP2Ff8AG98kkdSOFhe59aZoA98lqyTWKOp+f8OahPIJ53Vtt0Qu+HC8dOXsSNuT3Cmk/ElNzd3trSxWexqjNyjx+ar2866Otq0pfWhc45LmNJP4RQaEuaNb7Tf4EVKdC2VVqGG1t8zDHLt6b25wosWmURyNSA47sBRFxxTNllm2RzWgDAA5AIiIgP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/sad13-haunted-painting-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/sad13-haunted-painting-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/sad13-haunted-painting-320.jpg, /blog/favourite-albums-2020/sad13-haunted-painting-640.jpg 2x, /blog/favourite-albums-2020/sad13-haunted-painting-960.jpg 3x\" src=\"/blog/favourite-albums-2020/sad13-haunted-painting-320.jpg\" alt=\"Album cover of Haunted Painting by Sad13\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Haunted Painting</em> on <a href=\"https://sad13.bandcamp.com/album/haunted-painting\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/haunted-painting/1517716997?l=en\">Apple Music</a>.</p>\n<h2>Feel Feelings by Soko</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcBAwQG/8QAJxAAAgEEAAQGAwAAAAAAAAAAAQIDAAQFERIhMUEGByJhgZEyUbL/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAwX/xAAeEQACAgICAwAAAAAAAAAAAAAAAwECBBEhgTEzNP/aAAwDAQACEQMRAD8AiGOtJspNaY+ztg9zI5VTGjM8jHouh16ctDua3Nh7qJZS8JBiPC468Db1ptdDvlz711+XWaixniq0mumEaHijEwJBiZhoNv5181TPHt/bYrwhmWx8VvbjJTwsI409KlG9IXftzPvs8t1G+RK7xTXksnCs1UtieI3shcjh3LBdb7bpWbmdriZpHChj14FCj6FKQEO6JAmRxwG9F0/oV7zzbG8XjOZ0JSNdvxpSgN96+zbx/kf0THiP6X6FKUp5in//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/soko-feel-feelings-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/soko-feel-feelings-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/soko-feel-feelings-320.jpg, /blog/favourite-albums-2020/soko-feel-feelings-640.jpg 2x, /blog/favourite-albums-2020/soko-feel-feelings-960.jpg 3x\" src=\"/blog/favourite-albums-2020/soko-feel-feelings-320.jpg\" alt=\"Album cover of Feel Feelings by Soko\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Feel Feelings</em> on <a href=\"https://music.apple.com/at/album/feel-feelings/1500616992?l=en\">Apple Music</a>.</p>\n<h2>Powerslide by Soleima</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGCAP/xAAmEAABAwMDAwUBAAAAAAAAAAABAgMEAAURBhIhBxMxFSJRYXGx/8QAFgEBAQEAAAAAAAAAAAAAAAAABAID/8QAHREAAgEEAwAAAAAAAAAAAAAAAAECBDKBsQMREv/aAAwDAQACEQMRAD8A52dgxk6SgyuwEvuSlpW9vyVJA4TtzxjB5xznzxVMtekI46SQL1Aa7l0U+4tBT7Vgb9if0A/2sLeYMq2aVhxLghTUuNOdaXHURubIzuyMZHOB5OcfQqlW/Wkqz9BotujMvKPfXudS0SlsKWT7lK4yfAx858ii1Kk0khNP56bkQt8K7yw8SHAdqgfII4pXipSlKJJySck0pQY2vUy4Sn9eX+K68THRcH3A3gAbiTz9n9qpORGVdCJrq0BS/S2ljPICu4nkD5pSsuS6OdFwtljZz1tGTSlK0IP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/soleima-powerslide-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/soleima-powerslide-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/soleima-powerslide-320.jpg, /blog/favourite-albums-2020/soleima-powerslide-640.jpg 2x, /blog/favourite-albums-2020/soleima-powerslide-960.jpg 3x\" src=\"/blog/favourite-albums-2020/soleima-powerslide-320.jpg\" alt=\"Album cover of Powerslide by Soleima\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Powerslide</em> on <a href=\"https://music.apple.com/at/album/powerslide/1499879278?l=en\">Apple Music</a>.</p>\n<h2>Silver Tongue by TORRES</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAQBAgUGB//EACUQAAIBAwMEAgMAAAAAAAAAAAECAwAEEQUSIQYUMUFRYTKBof/EABcBAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQIRAxIhQf/aAAwDAQACEQMRAD8A8UTQn7LEdwCXwWXIAH9qzrjpiy0/TYLrTwzGEJ3KmTcxB43fQ3ED911eymErBZL0wbEJG8kKcDxx7NRmeUGSfMxEuVZ2zh+ckE+6rV1RzxRcU9ukl4sbzbrZGSMj8WOaVvPeGVlLRxghQOFpUNpsxGx5Pxk1XLrV7d6TDpcsg7S1VmjVRg5+/nzSlCr04Y+aUpQH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/torres-silver-tongue-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/torres-silver-tongue-640.jpg, /blog/favourite-albums-2020/torres-silver-tongue-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/torres-silver-tongue-320.jpg, /blog/favourite-albums-2020/torres-silver-tongue-640.jpg 2x, /blog/favourite-albums-2020/torres-silver-tongue-960.jpg 3x\" src=\"/blog/favourite-albums-2020/torres-silver-tongue-320.jpg\" alt=\"Album cover of Silver Tongue by TORRES\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Silver Tongue</em> on <a href=\"https://torrestorrestorres.bandcamp.com/album/silver-tongue\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/silver-tongue/1482205055?l=en\">Apple Music</a>.</p>\n<h2>Heavy Light by U.S. Girls</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHAwQF/8QAKBAAAgEDAwIFBQAAAAAAAAAAAQIDAAQRBRJBBiETFCIxUVJhcZGx/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwEAAv/EABoRAAMBAAMAAAAAAAAAAAAAAAACEQESIlH/2gAMAwEAAhEDEQA/AKo6d6gsoABf+Krc7UyDUls59LjFzMlwyo4DwiZShZSD3GfcZBGRyDVZ6BcMl2sztHI6gmNJyShbgsB3IHvjk4HzUvTSvNdHNPbanAuoeKZH2ttZwNwwu72Ug5x2BPFE2bu9RlnGsbF1cETsFX08Ed8ilQG5g1SOZlae7yPuD/DilWN6c1TjI7IfT+KzRzygdpGA+BSlIHQZZPrb90pSoY//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/us-girls-heavy-light-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/us-girls-heavy-light-640.jpg, /blog/favourite-albums-2020/us-girls-heavy-light-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/us-girls-heavy-light-320.jpg, /blog/favourite-albums-2020/us-girls-heavy-light-640.jpg 2x, /blog/favourite-albums-2020/us-girls-heavy-light-960.jpg 3x\" src=\"/blog/favourite-albums-2020/us-girls-heavy-light-320.jpg\" alt=\"Album cover of Heavy Light by U.S. Girls\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Heavy Light</em> on <a href=\"https://music.apple.com/at/album/heavy-light/1490058404?l=en\">Apple Music</a>.</p>\n<h2>Saint Cloud by Waxahatchee</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcEAwUG/8QAKBAAAgEDAwIFBQAAAAAAAAAAAQIDAAQFBhExEiEHIjJhgUFxkbHB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIDBP/EAB4RAAICAgIDAAAAAAAAAAAAAAABAhEDBCExFIHw/9oADAMBAAIRAxEAPwCoR5a3YdKzQk+0gP8AamXiFrjO4/LGHGNFb2exjjc9IMrcFgWG3Y9u33qd6L0RbXV+2+WkZ4wCA1upHyCa91qPSSZaxke/yhlMSExMYFJUAb7DzcfT5rPPcjKPA0dV2rMWK8VM9aWSx31st5LuSJCvmA42bp7bgg/G1Kmkenweox5ooCxJUKex/I/VKVbqrt/eg+K3zRmy0Eb2wjYEqGDeo811eQWS7kie4uLh2iARCZSelRwBvwKUqWNuymTo5Y7QFQTNOT7vSlKclSP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2020/waxahatchee-saint-cloud-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2020/waxahatchee-saint-cloud-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2020/waxahatchee-saint-cloud-320.jpg, /blog/favourite-albums-2020/waxahatchee-saint-cloud-640.jpg 2x, /blog/favourite-albums-2020/waxahatchee-saint-cloud-960.jpg 3x\" src=\"/blog/favourite-albums-2020/waxahatchee-saint-cloud-320.jpg\" alt=\"Album cover of Saint Cloud by Waxahatchee\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Saint Cloud</em> on <a href=\"https://waxahatchee.bandcamp.com/album/saint-cloud-2\">Bandcamp</a> or <a href=\"https://music.apple.com/at/album/saint-cloud/1493459885?l=en\">Apple Music</a>.</p>",
            "url": "/blog/favourite-albums-2020/",
            "title": "My Favourite Albums of 2020",
            "summary": "Collection of my favourite albums of 2020 in no particular order.",
            "date_modified": "2021-02-18T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/github-actions-awscli-errors/",
            "content_html": "<p>When I was trying to update this website yesterday I noticed that <a href=\"https://florian.ec/blog/static-website-github-actions-s3-deploy/\">my deployment script</a> that builds this Eleventy site and deploys it to AWS S3 was not working and throwing errors when running in Github Actions. Locally the script was running fine, but when it is executed in a Github Action <code class=\"language-text\">awscli</code> was throwing the following error:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;botocore.awsrequest.AWSRequest object at 0x7f44ac9b2eb8>\n&#x3C;botocore.awsrequest.AWSRequest object at 0x7f336fca6828></code></pre></div>\n<p>After a bit of searching I found <a href=\"https://github.com/aws/aws-cli/issues/5234#issuecomment-705831465\">a comment in a Github issue</a> that described the solution. This is a problem with <code class=\"language-text\">awscli</code> trying to detect the region and failing when run in certain virtualised environments and to fix it I needed to specify the region manually. For me this bug was caused when Github updated the Ubuntu that is running my actions to <code class=\"language-text\">ubuntu-20.04</code>. After updating my deploy script to specify the region everything works correctly again:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">aws s3 <span class=\"token function\">sync</span> dist/ s3://<span class=\"token variable\">$BUCKET_NAME</span> <span class=\"token parameter variable\">--profile</span> florian.ec <span class=\"token parameter variable\">--region</span> eu-west-1\naws cloudfront create-invalidation --distribution-id <span class=\"token variable\">$DISTRIBUTION_ID</span> <span class=\"token parameter variable\">--paths</span> <span class=\"token string\">'/*'</span> <span class=\"token parameter variable\">--profile</span> florian.ec <span class=\"token parameter variable\">--region</span> eu-west-1</code></pre></div>\n<p>I tried to simplify the setup I have for this website as much as possible and it is kinda annoying when things still randomly break. On the positive side I got another blog article out of it.</p>",
            "url": "/blog/github-actions-awscli-errors/",
            "title": "Fixing errors with AWS CLI in Github Actions",
            "summary": "Through an update of Ubuntu in Github Actions my deployment script was breaking with errors in awscli. Here I describe a fix for these errors.",
            "date_modified": "2021-02-19T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/cache-busting-eleventy-postcss/",
            "content_html": "<p>Last night I was fixing a few CSS bugs on this site and after deploying them I noticed that the changes were not visible yet. I forgot to implement some kind of cache busting on this site <span role=\"img\" aria-label=\"man facepalming\">🤦‍♂️</span></p>\n<p>The best practice for caching CSS assets in recent years has been to set a pretty high cache time for these files and to bust the cache by changing the filename when the content changes. Most commonly a hash of the content is used as part of the filename. Tools like <a href=\"https://webpack.js.org\">Webpack</a> or <a href=\"https://parceljs.org\">Parcel</a> will do this automatically, but for this site I decided to not use any kind of bundler and instead use <a href=\"https://postcss.org\">PostCSS</a> directly to transpile my CSS. By invoking PostCSS through an <a href=\"https://www.11ty.dev/docs/languages/javascript/\">JavaScript template in Eleventy</a> I am avoiding having another command I need to run when I want to build the site.</p>\n<p>To implement cache busting I need three things:</p>\n<ol>\n<li>A method that takes a directory of CSS files and returns a hash of the content of all files in this directory,</li>\n<li>a way to include the content hash in the filename when writing the transformed CSS,</li>\n<li>and I need to be able to reference the filename with the content hash in my layout to link the stylesheet.</li>\n</ol>\n<h2>Generating a content hash</h2>\n<p>Generating a content hash is straight forward: first I read all the files in the given directory, concatenate them into a single string and then use a hashing function to generate a hash.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/lib/generateCssHash.js</span>\n\n<span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> glob <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fast-glob'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> md5 <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'md5'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">generateCssHash</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">dir</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> cssFiles <span class=\"token operator\">=</span> glob<span class=\"token punctuation\">.</span><span class=\"token function\">sync</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>dir<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/**/*.css</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> cssContent <span class=\"token operator\">=</span> cssFiles\n    <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cssFile</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> fs<span class=\"token punctuation\">.</span><span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span>cssFile<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">md5</span><span class=\"token punctuation\">(</span>cssContent<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> generateCssHash<span class=\"token punctuation\">;</span></code></pre></div>\n<p>I'm using the <a href=\"https://github.com/mrmlnc/fast-glob#readme\">fast-glob</a> library to find all the CSS files since it is already a dependency of Eleventy and <a href=\"https://github.com/pvorb/node-md5#readme\">md5</a> as my hashing function.</p>\n<h2>Adding the content hash to the CSS filename</h2>\n<p>Before adding cache busting my script to run PostCSS looked like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/css/styles.11ty.js</span>\n\n<span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'path'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> postcss <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'postcss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token keyword\">class</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">async</span> <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> cssDir <span class=\"token operator\">=</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">'..'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'includes'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'postcss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> rawFilepath <span class=\"token operator\">=</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>cssDir<span class=\"token punctuation\">,</span> <span class=\"token string\">'styles.css'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">permalink</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">css/styles.css</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      rawFilepath<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">rawCss</span><span class=\"token operator\">:</span> fs<span class=\"token punctuation\">.</span><span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span>rawFilepath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> rawCss<span class=\"token punctuation\">,</span> rawFilepath <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">postcss</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'postcss-import'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span>rawCss<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">from</span><span class=\"token operator\">:</span> rawFilepath <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> result<span class=\"token punctuation\">.</span>css<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>JavaScript templates can contain a class, the <code class=\"language-text\">render()</code> method generates the content of the file, while the <code class=\"language-text\">data()</code> method provides the frontmatter. We need to update the <code class=\"language-text\">permalink</code> property of the frontmatter to give Eleventy a filename that includes a hash of the content.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/css/styles.11ty.js</span>\n\n<span class=\"token comment\">// ...</span>\n<span class=\"token keyword\">const</span> generateCssHash <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../lib/generateCssHash'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token keyword\">class</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">async</span> <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> cssDir <span class=\"token operator\">=</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">'..'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'includes'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'postcss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">//...</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">permalink</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">css/styles.</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">generateCssHash</span><span class=\"token punctuation\">(</span>cssDir<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.css</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// ..</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// ...</span></code></pre></div>\n<h2>Referencing the hashed CSS file in HTML</h2>\n<p>We now have a CSS file with the content hash in its filename, but we need the hash also inside our HTML template to reference it inside the <code class=\"language-text\">&#x3C;link></code> tag. For this step my solution is different than most of the examples I've found, because I decided to transpile my CSS with a JavaScript template instead of invoking PostCSS in a build step before building Eleventy. For example, in <a href=\"https://brycewray.com/posts/2020/12/hashing-out-cache-busting-fix-eleventy/\">this article</a> (or <a href=\"https://codsen.com/articles/our-cache-busting-setup-on-eleventy/\">this one</a>) the idea is to save the newly generated hash into a file after running PostCSS and then read this file in Eleventy.</p>\n<p>This technique doesn't work for my setup, because PostCSS is run as a JavaScript template and I can't be sure that this code is executed before the hashed filename is required in the HTML pages. Luckily, the solution is quite simple: in a Eleventy <a href=\"https://www.11ty.dev/docs/data-js/\">Data File</a> I run the function that generates the content hash again. The content of the CSS files does not change, reading all CSS files, concatenating and hashing them does not take a noticeable amount of time and the hashing algorithm is deterministic.</p>\n<p>For a programmer reading a bunch of files and then executing an hashing algorithm twice sounds like a waste, but in this case it makes no difference. My Eleventy build already reads and writes hundreds of images, reading a dozen CSS files does not impact the build time in any meaningful way. And this way the code is straight forward:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/data/css.js</span>\n\n<span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'path'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> generateCssHash <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'../lib/generateCssHash'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> cssDir <span class=\"token operator\">=</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">'..'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'includes'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'postcss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> hash <span class=\"token operator\">=</span> <span class=\"token function\">generateCssHash</span><span class=\"token punctuation\">(</span>cssDir<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">stylesCss</span><span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/css/styles.</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>hash<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.css</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This is an Eleventy Data File and I can access the values in any Eleventy template by <code class=\"language-text\">[filename].[varName]</code>. I need the name of the generated CSS file in my main template and there I can link it like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&#x3C;!-- src/includes/layouts/layout.njk --></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>{{ css.stylesCss }}<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span></code></pre></div>\n<p>Done. When I started thinking about adding cache busting I thought that this maybe will get overly complicated, but in reality it works nicely, does only need one additional dependency, and does not effect the performance of the build script and dev server in any noticeable way.</p>",
            "url": "/blog/cache-busting-eleventy-postcss/",
            "title": "Cache Busting with Eleventy and PostCSS",
            "summary": "This article describes a simple technique to add cache busting to a site that uses Eleventy and PostCSS",
            "date_modified": "2021-02-20T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/last-fm-apple-music-2021/",
            "content_html": "<p>In 2015, shortly after Apple Music came out I <a href=\"/blog/apple-music-last-fm-scrobbling/\">wrote an article about Apple Music and scrobbling to Last.fm</a> and I still get occasionally questions about it. To celebrate the 15th anniversary of <a href=\"https://www.last.fm/user/feredir\">my Last.fm account</a>, I thought it might be time to revisit the topic.</p>\n<h2>Mac OS</h2>\n<p>Back then scrobbling worked on the Mac for music you have added to your library, but songs that you played directly from Apple Music were not scrobbled. This was caused by Apple not exposing these streamed songs as the currently playing song in the AppleScript API, which in my experience most scrobblers use to find the currently playing track in Music.app (née iTunes). Apple has fixed this a couple of years ago and in my experience everything you play in Music.app is now exposed through AppleScript and therefore scrobbled.</p>\n<p>For the last couple of years I have used the <a href=\"http://www.last.fm/download\">official Last.fm Mac app</a> to scrobble the music I play through Music.app.</p>\n<h2>iOS</h2>\n<p>Things are a lot more different on iOS. In 2015 we had to use apps that detected the songs played in the Music app on iOS and scrobble them to Last.fm. While this worked, it worked not very well. Apple has introduced <a href=\"https://developer.apple.com/musickit/\">MusicKit</a>, which allows third-party developers to create Apple Music clients and some of them integrate Last.fm as well.</p>\n<p><a href=\"https://apps.apple.com/us/app/id1439731526\">Soor</a> and <a href=\"https://apps.apple.com/us/app/marvis-pro/id1447768809\">Marvis</a> are two great third-party Apple Music clients and I switch between the two of them occasionally. In addition to Last.fm scrobbling, both Soor and Marvis better align with my expectations to a music app, compared to Apples Music app. For example, I only care about two of the five items in Musics main navigation (Library and Search), while Soor and Marvis focus much more on listening to music that you have added to your library.</p>\n<p>Bonus: Since the release of iOS 14 both Soor and Marvis contain beautiful widgets that shows your currently playing song on your homescreen.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 52.5%; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD6klEQVR4nGNgwAb0OdksuTkYwWxGrCrggJERpEBQXE5ew4RfxchPSf1XuPf/tOhUaTGgOBMDg4KCgoODgz0QwYAdGEH1C0mphNeuTG7fnDF5X0ft3I+x4f9igsPFRYBSiXFxz58/e/rk4eNH9x89evDw4f0HD+4/fHD34YM7UM2SGhZ+Fasy2ldPWnFowY7zOTWLLQ1dgOIsLKwHDx749On9+3cvv315/+3Ty++fX/z4/OL759dfPr2DauaT0XXNmV09ZaNLxsRZaw76VC4X0vUEinNx8xw7duzt66f//v19+erNlQvHzh7bdvnM7ru3Ln34+AUaJJwSmnphbW2zNgUVToksm24Y0SGoCvISJxf34SOH375+8vfvn5LyCgdnJ18vD28PNwsbm5lz5oI0MzMwsAopCtqXWsZ1euVMUfau5rUt5ZIzBWvmOnz40JuXT4A2l5YU2tlYTmou76rOt7CymDV3Piy0mViYRLQZBAwZeHQYRIyZJIyYWDlBmjk5Dx068PrV43///pTnJVmb6nm4uFhZ2mrqaE2aPBERVcLCQmYmRuYmRlYWpjzcXJCwgGh+8/LR379/y3MjvRwkI3xU4oM0vOwkpk9qRcQ2Ly+3vLyMsrKivLwsPx8PI1Qzx+HD+9++evTr959ja8NXtwmt7FA8PE91dbvkhf0dBFIOUPORw/vfvHz47+/fnx9vvbx38PHNPXcvb3l0c9evb88YwGoYuDgYWgrk103RW9Gvs3ay3rR6FWkxFpA4F+exo/vevXny49uHH98///z+CYi+f/3w6f2bTx/eMLAwg3R7O4j/f+z796bn/9uev294/n/hV56mAhTn4eY8e/rI1cund2xbd/TwjuNHdu7dtWHPrvVXLh69ee0UAxsLK1BRWFjY////37z9AIz6N2/fA9nNzc0gzTzc588dO3F83/Jl8+bPnTZ39uR5c6bMmTXp6qXjTx9eY2BlZQMqCg8PB2r4/v37n9+/v3/7BmS3toICk4+P9+zpw29e3r9x9czZ0wcvnD105cLRsyf3nzt14MaVEwwsYM2RkZFADV+/fPn58+eXL1+A7Pb2dqA4GxvbiWP7Pr1/ev7MocsXjl27dByo+czJvefPHLh17SQDExMwgTEYGRl9/gzS8w8MgAygRyDBHhkR+vbVg59fXwOzxLdPz758ePL5/aOvH4HkY0TcqKqqurg429ra2tnZaWlpQaIKAqSlJI2NDEyMDYGkuZmxvZ21mamRhbkJA1yRgICAGRhYW1sDExZcJxMTE3LMc3FxOTg4mpiYAC1A2MzCwsLBwQGU4+HhAXoVOcEwMzOzIAGg0cD4ByoGALPKzCgStEE7AAAAAElFTkSuQmCC); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/last-fm-apple-music-2021/marvis-homescreen-960.png\" media=\"(min-width: 960px)\"><source srcset=\"/blog/last-fm-apple-music-2021/marvis-homescreen-640.png\" media=\"(min-width: 640px)\"><img srcset=\"/blog/last-fm-apple-music-2021/marvis-homescreen-320.png, /blog/last-fm-apple-music-2021/marvis-homescreen-640.png 2x, /blog/last-fm-apple-music-2021/marvis-homescreen-960.png 3x\" src=\"/blog/last-fm-apple-music-2021/marvis-homescreen-320.png\" alt=\"Marvis widget on iOS 14 homescreen\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><span role=\"img\" aria-label=\"guitar\">🎸</span></p>",
            "url": "/blog/last-fm-apple-music-2021/",
            "title": "Last.fm and Apple Music in 2021",
            "date_modified": "2021-03-20T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/jenny-odell-how-to-do-nothing/",
            "content_html": "<p>I am standing in a large hall, waiting the 15 minutes it takes that my antigen test for Corona shows the result and I am one of just a few people who does not constantly look at their phone. It is surprisingly hard to stand here and to do nothing. Several times I have to resist the urge to pull out my phone. I have nothing to do on it: I'm no longer on social media, I've read all my feeds earlier that day, I didn't receive any new messages. Still, it's hard to not look on my phone.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQGAgUH/8QAKRAAAgEDAgUCBwAAAAAAAAAAAQIDAAQRBSESE0FhcQYUIiMkMlKRof/EABUBAQEAAAAAAAAAAAAAAAAAAAQF/8QAIBEAAgICAAcAAAAAAAAAAAAAAAECAxESITEyUWGR8P/aAAwDAQACEQMRAD8A1kNvYarbe4uWeCFw0bNxY3Az+QBqTpmk6etnIFS2HAriBkEWJJBuRgEn7d8+axvrQaZoejW7xGZIVLzhTwknAJGR3JqJqDiO5dECWkIkjmSBk+MjcDDjyduvij1QjKHDyU4WTjYkl2z9yJY0uQxxsSgLIrHYdRSrBbyD2tv9Op+UnTsKVN0EKZWvWc86QnlTyRhZCMKdiO9UVXnEolN1cMwGMM2R+qUpdDemA9nV6Ohw3My28I5jbRqP5SlKJliMI//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-960.jpg, /blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-1920.jpg 2x, /blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-640.jpg, /blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-1280.jpg 2x, /blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-320.jpg, /blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-640.jpg 2x, /blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-960.jpg 3x\" src=\"/blog/jenny-odell-how-to-do-nothing/how-to-do-nothing-320.jpg\" alt=\"How to Do Nothing by Jenny Odell on a wood table with a notebook and pen\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>In <a href=\"https://www.penguinrandomhouse.com/books/600671/how-to-do-nothing-by-jenny-odell/\">How to do Nothing</a> Jenny Odell investigates the attention economy, how phones, social media and the media in general require more of our attention every year and how we stop noticing anything around us. Odell combines personal experience with history, art, and nature to argue that we need to be more conscious with our attention. In essence, forgetting how to do nothing will lead us into a future with less community and less nature in return for more capitalism and more waves of hysteria and fear.</p>\n<blockquote>\n<p>As the attention economy profits from keeping us trapped in a fearful present, we risk blindness to historical context at the same time that our attention is ripped from the physical reality of our surroundings.</p>\n</blockquote>\n<p>Nothing in this book is really ground-breaking, instead this book is a nice reminder to be more mindful with our attention and our surroundings.</p>\n<p>★★★★★</p>",
            "url": "/blog/jenny-odell-how-to-do-nothing/",
            "title": "How to Do Nothing by Jenny Odell",
            "summary": "Review of the book How to Do Nothing by Jenny Odell",
            "date_modified": "2021-04-16T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-data-pages/",
            "content_html": "<p><a href=\"https://www.11ty.dev\">Eleventy</a> is a static site generation that is most commonly used to take files with content, such as Markdown or HTML and combine them with templates to turn them into websites. Besides plain content files Eleventy can also process JSON files and data generated by JavaScript code. We can use these structured data formats to generate multiple pages from a single data source.</p>\n<p>In this article we are going to explore page creation, first from static JSON data files and then we will use JavaScript to dynamically create pages from an API.</p>\n<h2>Using global data files in Eleventy</h2>\n<p>In our example we want to create a list of Pokémon that links to a detail page for each Pokémon. We start by creating a JSON file in <a href=\"https://www.11ty.dev/docs/config/#directory-for-global-data-files\">Eleventys global data directory</a>: <code class=\"language-text\">_data/pokemon.json</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"dexno\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"001\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Bulbasaur\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"dexno\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"002\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Ivysaur\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"dexno\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"003\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Venusaur\"</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<p>Before we generate the detail pages, we want to show a list of these Pokémon on our start page. Create a new template and call it <code class=\"language-text\">index.njk</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>h1</span><span class=\"token punctuation\">></span></span>Pokemon<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>h1</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>ul</span><span class=\"token punctuation\">></span></span>\n  {%- for species in pokemon %}\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>li</span><span class=\"token punctuation\">></span></span>{{ species.name }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>li</span><span class=\"token punctuation\">></span></span>\n  {% endfor -%}\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Eleventy exposes the data using a variable with the same name as the file. In the template we use a for loop to iterate trough the items in <code class=\"language-text\">pokemon</code> and render their names in a list. After building the site we should see a page that lists all the Pokémon from <code class=\"language-text\">_data/pokemon.json</code>.</p>\n<h2>Creating pages from global data files</h2>\n<p>The next step is to generate the detail pages for each Pokémon by using the <a href=\"https://www.11ty.dev/docs/pagination/\">pagination</a> feature from Eleventy. The trick is to define a <code class=\"language-text\">size</code> of <code class=\"language-text\">1</code>, which will tell Eleventy to create a page for each element in the array. We start by creating a template called <code class=\"language-text\">pokemon.njk</code> and define the <code class=\"language-text\">size</code> and <code class=\"language-text\">data</code> in the <code class=\"language-text\">pagination</code> frontmatter.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">---\npagination:\n  data: pokemon\n  size: 1\npermalink: 'pokemon/{{ pagination.pageNumber }}/index.html'\n---\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>h1</span><span class=\"token punctuation\">></span></span>{{ pagination.items[0].name }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>h1</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>There are a couple of interesting things in that template:</p>\n<ul>\n<li>We use the <code class=\"language-text\">pagination.data</code> frontmatter to define the name of the variable that holds our data. Because the data file is called <code class=\"language-text\">pokemon.json</code>, the data will be available in the <code class=\"language-text\">pokemon</code> variable.</li>\n<li><code class=\"language-text\">pagination.size</code> needs to be set to <code class=\"language-text\">1</code> to tell Eleventy to create a page for each element in the array</li>\n<li>We define a permalink for each page by using <code class=\"language-text\">pagination.pageNumber</code>.</li>\n<li>Because we use the pagination feature, accessing the data is a bit awkward. Since <code class=\"language-text\">pagination.items</code> holds all the items that should be displayed on this page and our pagination size is <code class=\"language-text\">1</code> it will always contain exactly 1 element. We will see a solution to make this a bit nicer soon.</li>\n</ul>\n<p>After building the site we will get the following pages:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">- index.html\n- pokemon/0/index.html\n- pokemon/1/index.html\n- pokemon/2/index.html</code></pre></div>\n<h2>Better permalink for pages created from data</h2>\n<p>At the moment the URL of each page contains its page number, that is, the index of the element in the data array. However, since we have access to <code class=\"language-text\">pagination.items</code> in the permalink frontmatter we can tell Eleventy to create prettier permalinks:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">---\npagination:\n  data: pokemon\n  size: 1\npermalink: 'pokemon/{{ pagination.items[0].dexno }}/index.html'\n---\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>h1</span><span class=\"token punctuation\">></span></span>{{ pagination.items[0].name }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>h1</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>After another build we will get the following files:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">- index.html\n- pokemon/001/index.html\n- pokemon/002/index.html\n- pokemon/003/index.html</code></pre></div>\n<p>We also have access to universal filters in the permalink frontmatter and can use the <code class=\"language-text\">slug</code> filter to use the Pokémon name in the URL:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">---\npagination:\n  data: pokemon\n  size: 1\npermalink: 'pokemon/{{ pagination.items[0].name | slug }}/index.html'\n---\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>h1</span><span class=\"token punctuation\">></span></span>{{ pagination.items[0].name }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>h1</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Now Eleventy will build the following pages:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">- index.html\n- pokemon/bulbasaur/index.html\n- pokemon/ivysaur/index.html\n- pokemon/venusaur/index.html</code></pre></div>\n<p>Eleventy recognises that using <code class=\"language-text\">pagination.items[0]</code> in templates is ugly and provides us with the <code class=\"language-text\">alias</code> option. It will setup a variable with the given name that points to <code class=\"language-text\">pagination.items[0]</code> if the array contains exactly one element, and to <code class=\"language-text\">pagination.items</code> if the array contains multiple items.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">---\npagination:\n  data: pokemon\n  size: 1\n  alias: detail\npermalink: 'pokemon/{{ detail.name | slug }}/index.html'\n---\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;</span>h1</span><span class=\"token punctuation\">></span></span>{{ detail.name }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>h1</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Nice. Now we have exactly what we want: Eleventy reads our JSON file with Pokémon data and generates both an overview page and a detail page for each Pokémon with a pretty URL.</p>\n<h2>Generating pages from dynamic data</h2>\n<p>At the time of writing there are 898 different Pokémon and, let's be honest, we don't want to manually compile that list. We would also like to quickly update the list of Pokémon once new ones are released. We're in luck: in addition to JSON files we can define global data also in JavaScript files and Eleventy will expose the data to our templates and even handle promises for us.</p>\n<p>First we delete <code class=\"language-text\">_data/pokemon.json</code> and replace it with <code class=\"language-text\">_data/pokemon.js</code>, which exports an asynchronous function that fetches the list of Pokémon from <a href=\"https://pokeapi.co\">PokéAPI</a> and returns it.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> fetch <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node-fetch'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">exports</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://pokeapi.co/api/v2/pokemon?limit=10'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> result<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>results<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>To make this code work you need to install <a href=\"https://github.com/node-fetch/node-fetch\"><code class=\"language-text\">node-fetch</code></a> from NPM. In this example we limit the results to 10, because Eleventy will execute this request whenever it builds the site and while developing it is annoying when every small change triggers the creation of 898 pages.</p>\n<p>If we build the site, we will immediately see a couple of new pages for the Pokémon 4 to 10. We have nothing else to do since <a href=\"https://pokeapi.co\">PokéAPI</a> returns an array, where each element has a <code class=\"language-text\">name</code> property.</p>\n<h2>Conclusion</h2>\n<p>With the ability to generate pages from dynamic data we can use Eleventy in even more scenarios as a convenient tool to turn data into static HTML.</p>",
            "url": "/blog/eleventy-data-pages/",
            "title": "Creating pages from data with Eleventy",
            "summary": "Eleventy has the ability to generated multiple pages from a structured data source, either static JSON or JSON dynamically generated by JavaScript code.",
            "date_modified": "2021-04-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/silvia-moreno-garcia-mexican-gothic/",
            "content_html": "<p>I have no idea how I should start writing about <a href=\"https://silviamoreno-garcia.com/novels/mexicangothic/\">Mexican Gothic</a> by Silvia Morena-Garcia. Maybe at the beginning. It begins in Mexico City's high society in the 1950s. Noemí is a socialite who likes to party, drink, smoke, and has the tendency to switch partners every couple of weeks. But her life is put on pause when one day she receives a rambling letter from her recently wed cousin, who moved to a house in the country side and who is asking Noemí to rescue her.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQHAgX/xAAkEAACAgIBBAIDAQAAAAAAAAABAgMRAAQhBRMxcRJRIkFSof/EABYBAQEBAAAAAAAAAAAAAAAAAAIDBf/EACERAAICAAUFAAAAAAAAAAAAAAABAhEDEiFh8DEzQUNR/9oADAMBAAIRAxEAPwDHd6FJdVfn1KNDHIbKIaoiwDXk0CRnER0tPdg3nZu0JQ/bQX3VVhZvx/VeufOedsyNsaca7bQoqhn15GItqoFCBz6v6yVpoY4NdI1aVo5XI7v4qQSpHA9G+f3xmfCMl1ZqYsIVVU1zn03YaOlvKu1odRlbWmAdGHNgj/PWMw2HqO5qqUhmVFJLfEeBeMWUnr4RJ06CPZ6gUlFp8GerqyFvJtlq2mjXiNHKqPoYxlPa1sF9tPctMES8GMMeeSTfn3jGMYD/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-960.jpg, /blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-1920.jpg 2x, /blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-640.jpg, /blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-1280.jpg 2x, /blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-320.jpg, /blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-640.jpg 2x, /blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-960.jpg 3x\" src=\"/blog/silvia-moreno-garcia-mexican-gothic/mexican-gothic-320.jpg\" alt=\"Mexican Gothic by Silvia Moreno-Garcia with a glass and a silver coaster\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Noemí travels to High Place, the house that her cousin lives with her husband and his family. The once luxurious mansion is falling into disrepair, there is mould on the walls and the electricity is barely working. Her cousins in-laws are eccentric (to put it nicely) and racist, they don't talk during dinners and are hostile to their guest. But things escalate quickly once Noemí starts to investigate the mysterious history of High Place after she hears voices in her dreams.</p>\n<p>Mexican Gothic also deals with colonialism, racism, and eugenics. This is embodied by the ancient patriarch of the family, who we rarely see, but whose menacing presence we feel weighing heavy on Noemí and the family.</p>\n<p>I'm not a big fan of horror movies, but I recently started to readhttps://silviamoreno-garcia.com/novels/mexicangothic/ horror books and Mexican Gothic is thrilling. While it starts slow, by the second half of the book I had to force myself to put it down and go to bed. Big recommendation.</p>\n<p>★★★★★</p>",
            "url": "/blog/silvia-moreno-garcia-mexican-gothic/",
            "title": "Mexican Gothic by Silvia Moreno-Garcia",
            "summary": "My review of Mexican Gothic by Silvia Moreno-Garcia",
            "date_modified": "2021-04-26T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/jsx-templating-astro/",
            "content_html": "<p>A couple of days ago while I was working on a side projects with a lot of <a href=\"https://mozilla.github.io/nunjucks/\">Nunjucks</a> templates, I noticed how aesthetically unpleasing the its template syntax is. The template tags feel alien in the HTML that surround them and I was thinking if it would be possible to use JSX as templating language instead.</p>\n<p>While I was still contemplating if it would be worthwhile to experiment with JSX as template engine in Eleventy, I stumbled over a <a href=\"https://css-tricks.com/astro/\">post about Astro on CSS-Tricks</a>. <a href=\"https://astro.build\">Astro</a> is an upcoming open source static site generator and build tool that is built on the premise of JSX templates and components. We can't look at the source code or even the documentation for Astro yet, but it looks promising. Astro is supposed to be framework agnostic and all the JavaScript will be executed during the build process and by default it does not ship JavaScript to the browser. There is a <a href=\"https://www.youtube.com/watch?v=mgkwZqVkrwo\">talk on Speakeasy JS from Fred K. Schott</a> introducing the project which has a little more information and some code to look at.</p>\n<p>Good stuff.</p>",
            "url": "/blog/jsx-templating-astro/",
            "title": "JSX as Templating Language and Astro",
            "summary": "Using JSX as templating language and a new project called Astro",
            "date_modified": "2021-05-06T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/responsive-svg-constant-font-size/",
            "content_html": "<p>In this post I present an overview of some techniques to keep the size of text constant in responsive SVGs. At the moment there is no perfect solution, but we will discuss a technique that gets us close to the result we want.</p>\n<p>One of the great things about SVGs is that they are vector graphics and responsive by default. SVGs images are scaled based on the image width and look sharp at whatever size they are rendered. We can even use CSS and media query to adapt SVGs images based on the viewport. Since the whole SVG is scaled based on its width, the size of text is scaled together with the image. In most cases this is the behaviour we want: text should be bigger if the image gets bigger and smaller if the image gets smaller, but in some cases you want the SVG to scale to the width of its parent element, but the font size should stay constant, compared to the text in the surrounding HTML.</p>\n<ol>\n<li><a href=\"#setting-the-stage\">Setting the Stage</a></li>\n<li><a href=\"#breakpoints\">Fixing the Font Size at Breakpoints</a></li>\n<li><a href=\"#text-alignment\">Fixing the Text Alignment</a></li>\n<li><a href=\"#formula\">A Formula to Scale the Font Size</a></li>\n<li><a href=\"#fluid-typography\">Improvising with Fluid Typography</a></li>\n<li><a href=\"#conclusion\">Conclusion</a></li>\n</ol>\n<h2>Setting the Stage <a name=\"setting-the-stage\"></a></h2>\n<p>Let's take a look at a <a href=\"/blog/responsive-svg-constant-font-size/example1-scaling.html\">first example</a>, where the font size is together with the image. The SVG image in this example has a width of <em>320px</em>, the text is set in font size <em>16px</em>, and the image width is set to <em>100%</em>. When the browsers viewport width matches the image width of 320px, the text is rendered in 16px. If we increase the width of the viewport to 640px, the font size is increased to 32px.</p>\n<figure>\n  \n  <figcaption>The text in example 1 scales with the image. When the image is rendered at double the size, the font size is also doubled.</figcaption>\n</figure>\n<p>If the graphic is integrated into the design of the page it is often desirable that the font size stays constant, no matter the width of the viewport. I recently encountered such a situation when I wanted to render a graph directly in SVG without the help of a Javascript-based visualisation library.</p>\n<h2>Fixing the Font Size at Breakpoints <a name=\"breakpoints\"></a></h2>\n<p>Let's get back to our example image, at 640px width the size of the text is doubled to 32px. Because the image has the same width as the minimum viewport we want to support, we need to half the font size for the 640px viewport width. In a first attempt we can scale down the font at that breakpoint.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">svg text</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 16px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 640px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">svg text</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 8px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>With this CSS in place the text has the correct size at the 320px breakpoint and the 640px breakpoint, but is scaled with the image for all other viewport widths. If the image matches the bigger viewport with, the text would appear smaller for the smaller viewport and we need to double the font size at the 320px.</p>\n<figure>\n\n<figcaption>The text in example 2 grows with the size of image, but is scaled to the correct size at a specific breakpoint. View this example at 640px or 320px for the correct result.</figcaption>\n</figure>\n<p>If we resize the browser window to 470px width with <a href=\"/blog/responsive-svg-constant-font-size/example2-breakpoints.html\">example two</a> open the text is rendered in font size 24px. We can add another breakpoint:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 470px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">svg text</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 12px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Fixing the Text Alignment <a name=\"text-alignment\"></a></h2>\n<p>After adding the breakpoints at 470px and 640px viewport width, the font size is correct at these two viewports, the position of the text is off. By default the coordinates that define the position in an SVG point to the bottom left corner of the text and therefore text that was centered in the original version is no longer centered, because the width of the text box is smaller and the coordinates no longer point to the center.</p>\n<p>The good news is that we SVG provides as with attributes to define where a text elements coordinates should be anchored. For the <code class=\"language-text\">x</code> coordinate we have the <code class=\"language-text\">text-anchor</code> (<a href=\"https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/text-anchor\">MDN</a>) attribute with possible values of <code class=\"language-text\">start</code>, <code class=\"language-text\">middle</code>, and <code class=\"language-text\">end</code>. The <code class=\"language-text\">y</code> coordinate is controlled by the attribute <code class=\"language-text\">dominant-baseline</code> (<a href=\"https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/dominant-baseline\">MDN</a>) and its possible values are <code class=\"language-text\">auto</code> (bottom), <code class=\"language-text\">middle</code>, and <code class=\"language-text\">hanging</code> (top).</p>\n<p>For example, if our element should be centered on both the x- and y-axis:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">svg text</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">dominant-baseline</span><span class=\"token punctuation\">:</span> middle<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-anchor</span><span class=\"token punctuation\">:</span> middle<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<figure>\n\n<figcaption>In example 3 we use <code>text-anchor</code> and <code>dominant-baseline</code> to define where the x and y coordinates point to.</figcaption>\n</figure>\n<h2>A Formula to Scale the Font Size <a name=\"formula\"></a></h2>\n<p>By using breakpoints to scale down the font size gives us the possibility to have the correct font size for certain viewports, but we will not be able to cover all possible viewports. Instead it would be better if we could come up with a formula that calculates the correct font size dynamically based on the width of the viewport. Math and <code class=\"language-text\">calc()</code> to the rescue.</p>\n<p>We already know that we need to divide the font size by 2 if the width of the image doubles and if we quadruple the size of the image, we need to divide the font size by 4. In short, we need to divide the base font size by the scaling factor of the image to get the target font size:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">[font size] / ([viewport width] / [image width])</code></pre></div>\n<p>When I came up with this formula I was super happy and I was wondering why I couldn't find it anywhere when I look for a solution of my constant font size problem. The devil is in the details, as they say and in this case the details are the constraints of <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/calc()\"><code class=\"language-text\">calc()</code></a> and therefore which kind of formulas we can use in CSS. If we put the numbers from our example above in the formula above, we would get the following CSS:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">svg text</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> <span class=\"token function\">calc</span><span class=\"token punctuation\">(</span>16px / <span class=\"token punctuation\">(</span>100vw / 320<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Sadly this will not work, because the divisor in <code class=\"language-text\">calc()</code> needs to be a <code class=\"language-text\">&#x3C;number></code> and a <code class=\"language-text\">&#x3C;number></code> in CSS is unit-less. However, we need to use <code class=\"language-text\">100vw</code>, because it's the only way that we get the width of the viewport into our formula. I tried for a couple of hours other ways to calculate the scaling factor, but I was not able to come up with a formula that worked with the restrictions of <code class=\"language-text\">calc()</code>.</p>\n<p>Solution, you're so close and still so far away.</p>\n<p>Side note: If you want to learn more about how <code class=\"language-text\">calc()</code> works, CSS-Tricks does have a <a href=\"https://css-tricks.com/a-complete-guide-to-calc-in-css/\">A Complete Guide to calc() in CSS</a>.</p>\n<h2>Improvising with Fluid Typography <a name=\"fluid-typography\"></a></h2>\n<p>After the setback with the formula that scales the font size down based on the scaling factor of the image, my mind wandered back to a technique that I have considered in the beginning, but rejected because the math does not work out perfectly: <a href=\"https://css-tricks.com/snippets/css/fluid-typography/\">Fluid Typography</a>.</p>\n<p>Fluid Typography is used to scale the font size between a minimum and maximum font size when the size of the viewports increases. Normally we use this technique to increase the font size when the viewport width increases, but we can switch the <code class=\"language-text\">minimum size</code> and <code class=\"language-text\">maximum size</code> parameters to get a negative scaling factor and decrease the font size when the viewport width increases:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">[minimum size] + ([minimum size] - [maximum size]) * ((100vw - [minimum viewport width]) / ([maximum viewport width] - [minimum viewport width]))</code></pre></div>\n<p>Let's put in the numbers of a base font size of 16px, an image width of 320px and a maximum viewport width of 640px:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">16px + (8 − 16) × ((320px − 320px)/320) = 16px\n16px + (8 − 16) × ((480px − 320px)/320) = 12px\n16px + (8 − 16) × ((640px − 320px)/320) = 8px</code></pre></div>\n<p>It works for these numbers, but as I said in the beginning the math does not work out perfectly and we can see this if we increase the maximum viewport width to 1280px:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">16px + (4 − 16) × ((1280px − 320px) / 960) = 4px\n16px + (4 − 16) × ((1024px − 320px) / 960) = 7.2px\n16px + (4 − 16) × ((960px − 320px) / 960) = 8px\n16px + (4 − 16) × ((640px − 320px) / 960) = 12px\n16px + (4 − 16) × ((320px − 320px) / 960) = 16px</code></pre></div>\n<p>Well, this doesn't look as right anymore. The problem is that the Fluid Typography formula scales the font size linearly between min and max, but we need the font size for the viewport with a width of 640px to always be 8px. With Fluid Typography the value depends on the maximum viewport, which makes the formula only work correctly if the maximum width is double the minimum width.</p>\n<p>This is not perfect, but we can work with that. Our pages will not be going up to an infinite viewport width, we can apply the formula at each breakpoint where the image size doubles:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.graphic svg text</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> <span class=\"token function\">calc</span><span class=\"token punctuation\">(</span>16px + <span class=\"token punctuation\">(</span>8 - 16<span class=\"token punctuation\">)</span> * <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>100vw - 320px<span class=\"token punctuation\">)</span> / <span class=\"token punctuation\">(</span>640 - 320<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 641px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.graphic svg text</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> <span class=\"token function\">calc</span><span class=\"token punctuation\">(</span>8px + <span class=\"token punctuation\">(</span>4 - 8<span class=\"token punctuation\">)</span> * <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>100vw - 640px<span class=\"token punctuation\">)</span> / <span class=\"token punctuation\">(</span>1280 - 640<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">min-width</span><span class=\"token punctuation\">:</span> 1280px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.graphic svg</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 1280px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">.graphic svg text</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 4px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The important part in the calculation for the 641 to 1280px breakpoint is that we need to use 8px as the base font size now and that 640px is our minimum viewport width for this breakpoint.</p>\n<p>The last part is defining the absolute maximum width of the image. Because the font size calculations for the previous breakpoint is based on the viewport width (not the actual width of the image), the font size will further decrease even if the image no longer gets bigger. Therefore we replace our formula with the minimum font size at the maximum viewport width breakpoint.</p>\n<figure>\n\n<figcaption>The font size in example 4 is scaled down and the size of the text appears to be constant even when the image gets bigger.</figcaption>\n</figure>\n<h2>Conclusion <a name=\"conclusion\"></a></h2>\n<p>That actually works exactly as we want, it's just not as elegant as we would like it to be. Depending on how much the image can increase in size we need to add multiple breakpoints, whenever the width of the image doubles. Since, at the time of writing, we <a href=\"https://caniuse.com/css-container-queries\">cannot use container queries</a> we need to write our media queries based on the viewport. If the image is part of a CSS Grid or Flexbox we also need to add additional queries when the layout effects the width of the image.</p>",
            "url": "/blog/responsive-svg-constant-font-size/",
            "title": "Responsive SVGs with Constant Font Size",
            "summary": "In this post I present an overview of some techniques to keep the size of text constant in responsive SVGs.",
            "date_modified": "2021-05-08T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/tuscany-italy-2021/",
            "content_html": "<p>After 1.5 years of not leaving Austria, Marina and I were finally able to travel again. We took the night train from Vienna to Florence and then rented a car and travelled Santo Porto Stefano, Val d'Orcia and Lucca. We ended our trip by staying for a couple of nights in Florence. Here are some photos:</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQGAQIDBf/EACUQAAEEAQEIAwAAAAAAAAAAAAEAAgMEESEFEhMxQVFSYRQykf/EABYBAQEBAAAAAAAAAAAAAAAAAAMCBP/EAB8RAAEDBAMBAAAAAAAAAAAAAAABAxECFVKxBAUhIv/aAAwDAQACEQMRAD8A3jds+3PJFWsxSPY0vODgbo5kHkQuQqV5Gl8c0L292vBCpsrHXJKkYia+WuA8OLdzgtGBj300Hb0p7bFk2pJOMMlhBldH9tXHdwdR1OfaajtXvPgzVcFrMsTKcLhlskZHcEFF4lKxaEADLccDfAx5P6im8P4bEtzOeit2toWCTl6gm7OXavREcrIEGfmTeSIiWVDhD//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_001-960.jpg, /blog/tuscany-italy-2021/tuscany_001-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_001-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_001-640.jpg, /blog/tuscany-italy-2021/tuscany_001-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_001-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_001-320.jpg, /blog/tuscany-italy-2021/tuscany_001-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_001-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_001-320.jpg\" alt=\"River Arno in Florence\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">River Arno in Florence</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgQH/8QAKBAAAQMDAwIGAwAAAAAAAAAAAQIDEQAEBRIhMQYTFSIkJjLBQZHw/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAERQQISgf/aAAwDAQACEQMRAD8AwuBv8ggFoKR2E6jvtpETpA/uau73qpy+cVi7RfqSkJUpQlLSdgeeTFcmItUXF0tKh8nmvjzAAP1XnHSWX90redPkecOqT+JopWyvBNyWeYw2Usr9xi2tU9tMRBgGd/ulbu6ue+7rMrMAapO9KvS6sgwbaEJ1QSoQZKjO2wqXw3HocWUY+zSeJS0Af3SlKDajPXty6xcFDSyE8xSlKAYP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_002-960.jpg, /blog/tuscany-italy-2021/tuscany_002-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_002-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_002-640.jpg, /blog/tuscany-italy-2021/tuscany_002-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_002-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_002-320.jpg, /blog/tuscany-italy-2021/tuscany_002-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_002-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_002-320.jpg\" alt=\"Vie Cave at Città del Tufo\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Vie Cave at Città del Tufo</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAwj/xAAqEAACAQQBAQUJAAAAAAAAAAABAgMABAUREgYHISJBkRMUMUJhgYKhov/EABYBAQEBAAAAAAAAAAAAAAAAAAUEAf/EACMRAAIBAwEJAAAAAAAAAAAAAAEDAAIEEQUSISIxUYGhwfD/2gAMAwEAAhEDEQA/AMVfZv3zEY5rWQq65KeV12NkAqynX51SOm76TK48391LY20Usp9hEZQHMfLXiVtEN3H9V536auC07sVZg8vx1ve6v3Z5Z2rYyKaS0t3lffJ3iVi3iPmRU7LxqycHp4motaKzvHL3O2U6lweMuzbXd/EswALKvi4/Q686VIO1nHWkHaBlVj1EhZGEcKhFXaL3aHr96UkNQdUMgD7vIzZLBxmaHA4Wwa2unFtGvEB1CqNKSw7x66qqdHwRxY22Cj5N/wBGlKFbGFzFdbWGMTNLHPi7O5aOCNBLMG5sAvnxYA+lKUpOgcIhjCdoz//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_003-960.jpg, /blog/tuscany-italy-2021/tuscany_003-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_003-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_003-640.jpg, /blog/tuscany-italy-2021/tuscany_003-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_003-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_003-320.jpg, /blog/tuscany-italy-2021/tuscany_003-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_003-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_003-320.jpg\" alt=\"Cappella della Madonna di Vitaleta, San Quirico d&#x27;Orcia\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cappella della Madonna di Vitaleta, San Quirico d'Orcia</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAQP/xAAlEAACAgIBBAAHAAAAAAAAAAABAgMRAAQSBQYTMSFBYWJxgbH/xAAYAQADAQEAAAAAAAAAAAAAAAACAwQBBf/EAB0RAAICAQUAAAAAAAAAAAAAAAABAxMCEiExUWH/2gAMAwEAAhEDEQA/ALbPtC38ix0fQJsZkb/V4llKxvCifSsjkPfA2H8bTNzAsgMHI/OeQ7vglMindopRYOvA/rKVLGhWjJleXruuq0zpf2g1jJEncOtsDmuxxX0B5UP9xhXRemVSdksXTgXqEkkaeOQMFDIaNH2M5JO8myVfiw4mrHqvnjGclvYoZluAs0qgLQah8BjGMJcCz//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_004-960.jpg, /blog/tuscany-italy-2021/tuscany_004-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_004-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_004-640.jpg, /blog/tuscany-italy-2021/tuscany_004-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_004-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_004-320.jpg, /blog/tuscany-italy-2021/tuscany_004-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_004-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_004-320.jpg\" alt=\"Pienza\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Pienza</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAYDBAUH/8QAJxAAAgEDAwIGAwAAAAAAAAAAAQIDAAQRBRIhBjETFSJRgbEzQWH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwABBP/EAB4RAAIBAwUAAAAAAAAAAAAAAAABAgMRFBIhMkFR/9oADAMBAAIRAxEAPwCVHWGomPe93Mpz6RESdx9uKxm6y1BZDFJcXDsw5BkwQfmsbroqW1iNzHrkcUCrldyBM8cAHOPmupvLyGSyFnNEniRYJuS43Fuw/mP13ociS7AdG27RQ2mu6vPCGSZ0A4IfBJpU35lEnoZZwV4/IR9NShyJek0xL7qFLeO9ktltLbZDZySISnIIxj7NeWtq09jqrGCODBYLteMMvb2PFKUiJsrckcm5SG5EMr20IdkG7aCMnJ5xmlKVTESSuf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_005-960.jpg, /blog/tuscany-italy-2021/tuscany_005-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_005-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_005-640.jpg, /blog/tuscany-italy-2021/tuscany_005-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_005-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_005-320.jpg, /blog/tuscany-italy-2021/tuscany_005-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_005-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_005-320.jpg\" alt=\"Montepulciano\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Montepulciano</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAED/8QAJxAAAgEEAQMCBwAAAAAAAAAAAQIDAAQFESEGMVGRsRITIidBYWL/xAAXAQADAQAAAAAAAAAAAAAAAAABAgMF/8QAHxEAAgECBwAAAAAAAAAAAAAAAAECAzEEERITFCJR/9oADAMBAAIRAxEAPwC25cukELy3KokSjbO7AACobJ1v9wsdiYGtHxd1ayzfEFG9qBrTfs79KieX66lvcCY7mGPHPLGok3IG1vvzrXcdh5HNVPdwnJ5mKKK6mlnhiMaBI9jRYtrZPHJq1TERclosSp02l3uarfM4kt9dxZq3hpUB96VmI4GfZ+cbh28tGRx60pOYvAbTJjMEuIis8UciA7CuoIBH5r0VmMa6YqCdEJx7UpWc7GhE6jOVBMkhJ/o0pSkSDmf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_006-960.jpg, /blog/tuscany-italy-2021/tuscany_006-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_006-640.jpg, /blog/tuscany-italy-2021/tuscany_006-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_006-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_006-320.jpg, /blog/tuscany-italy-2021/tuscany_006-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_006-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_006-320.jpg\" alt=\"Abbey of Sant&#x27;Antimo\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Abbey of Sant'Antimo</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFCAb/xAAoEAABBAECBQMFAAAAAAAAAAABAgMEEQAFBhITITFBB3GRFiJhY7H/xAAWAQEBAQAAAAAAAAAAAAAAAAADBAL/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIDESEx/9oADAMBAAIRAxEAPwDl5JW48og/conqcuelaa7H2jpUyPPflmQkqK3AWyB0HLCb7Cj75C45p5J7dcum3tRcR6b7f5lENlwPWCVcsOXaQPNVhWrULU8empthuQmA4p8urK3lqTTdgJ8D4xmzsuMZkSemmGhHlqZFpsqASk2b98YI2o592jocbWJPBJW8gfrIH9Bywa/o7Gk7JU1BdkIbioHAC5d2oXfz+MYyia4TI9Z6X6X9RbUb1CdOmokKecbIjrDaSEHhBoDvQFnzjGMJPhqPh//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_007-960.jpg, /blog/tuscany-italy-2021/tuscany_007-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_007-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_007-640.jpg, /blog/tuscany-italy-2021/tuscany_007-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_007-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_007-320.jpg, /blog/tuscany-italy-2021/tuscany_007-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_007-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_007-320.jpg\" alt=\"Siena\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Siena</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwEI/8QAJBAAAQMDAwUBAQAAAAAAAAAAAQIDEQAEBQYSIQcTMUGBUWH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQD/8QAGxEBAQACAwEAAAAAAAAAAAAAAQARIQIiMTL/2gAMAwEAAhEDEQA/AJnqY/kWsWpONS4obNzgQkcASQZ/lZNgdQ6pyFwbawXcLKBLnbkbB74+VfdXa7srnRuZZO+wyuxdv2TKpg+lDgHz5+VzoLbgHLOAqdTKVpKhykkeZ88ipPk3U+7K8aQNzeaftrh519C3ASQ4ZPBg/JBilTK7y1YIbU622UiNsxFKTLG8kJeN5jWzcgOdxRCgSeQOR7rVemCO7jL7atxncuD2llPgCKUrZe9PxdNFaozt83l3EJcEIASJknj9NKUpwJs3/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_008-960.jpg, /blog/tuscany-italy-2021/tuscany_008-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_008-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_008-640.jpg, /blog/tuscany-italy-2021/tuscany_008-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_008-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_008-320.jpg, /blog/tuscany-italy-2021/tuscany_008-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_008-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_008-320.jpg\" alt=\"Lucca\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Lucca</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHAgMG/8QAJxAAAQQBAwMDBQAAAAAAAAAAAQIDBBEABQYhEjFRBxMUMmFiccH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQME/8QAHhEAAgIBBQEAAAAAAAAAAAAAAAECEQMTITFRgfD/2gAMAwEAAhEDEQA/AOO131U1VrcMtyItgNNBbIjJTaQL+s/l9+wyLk61LcitTdXcdc+UgSgeoqA6jQsWKJAHbzmO3Y+mGc289EQBTi1rZorVaK6eeKvz5zZP1j3NAJdg37Kkg2A430XVHiwRz/Mg82srbZOGOMVaJvb3qbuGPpyWYJYejoNJU+0pahwOLF8YyvNO3CrSI/xoSENt9RUQqiSrsTz+sY1lklVv70VR6LG2vteEYIlJdlJdDVmlilWTdgjILWYaCw+wXHSlJu+uiquwNdxz2xjCCVGiezKxlMI+Qvg9/OMYxknyf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_009-960.jpg, /blog/tuscany-italy-2021/tuscany_009-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_009-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_009-640.jpg, /blog/tuscany-italy-2021/tuscany_009-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_009-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_009-320.jpg, /blog/tuscany-italy-2021/tuscany_009-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_009-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_009-320.jpg\" alt=\"Palazzo Pfanner\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Palazzo Pfanner in Lucca</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBAUH/8QAJhAAAgEDAwIHAQAAAAAAAAAAAQIDAAQREiExBSITFBVBUWGBcf/EABcBAAMBAAAAAAAAAAAAAAAAAAADBAX/xAAeEQACAQMFAAAAAAAAAAAAAAAAAQIEFDERIlFSYf/aAAwDAQACEQMRAD8A73lYtKhsAAcjbP3WaMiNBGkqgfHNSPTzb3gdoJ7W4A7W0PuQRnOCfr8rX6i6W0ReW114HaQNsDng84qt18Zek8aN5TRXyXMEbkSTQBvguopUcOmtJHHJ6ZI3iLqGlWbA/tKL2PAWsux5XZTyQOWiYq2SMg4Nduzu7m4t5pJJ5MxgYAbb35pSsOD3DYZKUWriKIi7uhrQMQHHJ/KUpVCb0Hs//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_010-960.jpg, /blog/tuscany-italy-2021/tuscany_010-1920.jpg 2x, /blog/tuscany-italy-2021/tuscany_010-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/tuscany-italy-2021/tuscany_010-640.jpg, /blog/tuscany-italy-2021/tuscany_010-1280.jpg 2x, /blog/tuscany-italy-2021/tuscany_010-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/tuscany-italy-2021/tuscany_010-320.jpg, /blog/tuscany-italy-2021/tuscany_010-640.jpg 2x, /blog/tuscany-italy-2021/tuscany_010-960.jpg 3x\" src=\"/blog/tuscany-italy-2021/tuscany_010-320.jpg\" alt=\"Florence Cathedral\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Florence Cathedral</figcaption></figure><p></p>",
            "url": "/blog/tuscany-italy-2021/",
            "title": "Road trip through Tuscany in August 2021",
            "summary": "Photos from my road trip through Tuscany in August 2021",
            "date_modified": "2021-09-24T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/sloppy-jane-margot-nijhuis-kissing-in-the-rain/",
            "content_html": "<p>If there is an indie rock band that has the same name as an Ibiza DJ, they are the same band for <em>\"the algorithm\"</em>. Yes, computers are very stupid. However, occassionally, and I want to stress the word occassionally, this namespace pollution leads to a happy accident.</p>\n<p>I use an app called <a href=\"https://apps.apple.com/us/app/musicharbor/id1440405750\">MusicHarbor</a> to inform me about new releases of bands that I like. Back in March it informed me that Sloppy Jane has released a new album. They are a New York-based punk rock orchestra and I've listened to their first album <a href=\"https://sloppyjanemusic.bandcamp.com/album/willow-2\">Willow</a> a couple of times. A couple of days after adding <em>Kissing in the Rain</em> to my library, I listened to it and immediately liked it. But something was wrong. It did not sound like an album from a New York-based punk rock orchestra, that are famous for their <a href=\"https://www.gazettemusicale.com/live/2017/9/8/sloppy-jane\"><em>intense</em> live shows</a> (<span role=\"img\" aria-label=\"backhand index pointing left\">👈</span> NSFW). I checked Sloppy Jane's social media, Bandcamp, website; no mention of a new album.</p>\n<p>When searching for <code class=\"language-text\">sloppy jane</code> I could only find information about the punk rock band and their NSWF live shows, but the album was credited to <em>Sloppy Jane &#x26; Margot Nijhuis</em>, which lead me to a blog post from 2011 where Margot Nijhuis was interviewed. She works for a large health insurance company and in her spare time writes books and makes pretty good music.</p>\n<p>We reached the point of the article where I recommend you to listen to Kissing in the Rain by Sloppy Jane &#x26; Margot Nijhuis on <a href=\"https://music.apple.com/at/album/kissing-in-the-rain/1561707970?l=en\">Apple Music</a> or <a href=\"https://open.spotify.com/album/3bgifxLEyCHIeOZz2T05A9\">Spotify</a>.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAYEBQf/xAAnEAACAQMDAwMFAAAAAAAAAAABAgMABBEFEiEGEzEiYcFBQlFxkf/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAf/EABwRAAEEAwEAAAAAAAAAAAAAAAABAgMhERIxE//aAAwDAQACEQMRAD8A4t0pDayHuXRAQkj4x/SK3mp6Xbx2xFqpdFYrJn7SfFSnSmoJbbWkk2gZU+wJHyKptf1xU0pkhmWSaYYG0ZHueakk23otiRvnlSTuoGjnZWGCDSs67VpJQ443KCVZhlT+KU6OolVtklZZa6iXJALAHB881Xs/av4QiIO1EQnHj0k5/dKVknTWcJt0DsWbJY8kn60pSkDP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/sloppy-jane-margot-nijhuis-kissing-in-the-rain/sloppy-jane-margot-nijhuis-kissing-in-the-rain-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/sloppy-jane-margot-nijhuis-kissing-in-the-rain/sloppy-jane-margot-nijhuis-kissing-in-the-rain-320.jpg, /blog/sloppy-jane-margot-nijhuis-kissing-in-the-rain/sloppy-jane-margot-nijhuis-kissing-in-the-rain-640.jpg 2x\" src=\"/blog/sloppy-jane-margot-nijhuis-kissing-in-the-rain/sloppy-jane-margot-nijhuis-kissing-in-the-rain-320.jpg\" alt=\"Album cover of Kissing in the Rain by Sloppy Jane &#x26; Margot Nijhuis\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Kissing in the Rain by Sloppy Jane &#x26; Margot Nijhuis</figcaption></figure><p></p>\n<p>If you're wondering why I write this eigth months after it was released, on Friday Sloppy Jane (the New York-based punk rock orchestra) released their second album, <a href=\"https://sloppyjanemusic.bandcamp.com/album/madison\">Madison</a>. <a href=\"https://www.nytimes.com/2021/11/02/arts/music/sloppy-jane-madison-cave.html\">It was recorded in a cave</a>.</p>",
            "url": "/blog/sloppy-jane-margot-nijhuis-kissing-in-the-rain/",
            "title": "Kissing in the Rain by Sloppy Jane & Margot Nijhuis",
            "date_modified": "2021-11-07T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/on-file-management/",
            "content_html": "<h2>Part 1: The Mess I Created</h2>\n<p>A few years ago I had to declare bankruptcy on my file system. Up to this point I had sorted all my files into a complicated hierarchy of folders: folders with sub-folders with sub-folders with sub-folders with sub-folders. You get the gist. Every time I created a new document, downloaded something, or wanted to permanently store an email attachment, I had to make a lot of tiny decisions which folder, which sub-folder, which sub-sub-folder is the one correct place for this file.</p>\n<p>When I was later looking for that file I had to retrace my thoughts on where I might have put it. For my most commonly accessed files this was easy to do, but still involved a lot of clicks or keyboard commands to get there. Less accessed files became increasingly hard to find just by navigating through the hierarchy of my file system. Instead I was starting to give my files proper names and use Spotlight to find them.</p>\n<p>I reached the point where I was using precious mental energy to make many tiny decisions on where to place a file, but I only ever accessed these files through Spotlight searches. Why was I putting all that energy into sorting my files into a system of organisation when I was not using that system to access them?</p>\n<h2>Part 2: A New Start</h2>\n<p>Fuck it. Instead of hundreds of folders I created three brand new folders:</p>\n<ul>\n<li>Inbox</li>\n<li>Workspace</li>\n<li>Archive</li>\n</ul>\n<p><em>Inbox</em> holds all incoming files that I haven’t look at yet. Receipts saved from emails, photos sent through IM and so on.</p>\n<p><em>Workspace</em> is the place to put files I am actively working on. Some files are in this folder temporarily (a design I'm currently working on) and move into <em>Archive</em> after I finished the project, while other stay in this folder permanently (the spreadsheet where I keep track of my finances).</p>\n<p><em>Archive</em> contains files for digital eternity. Presentations I already gave, old receipts, etc.</p>\n<p>All of these folders are synched to the cloud, which allows me to access them from all my devices. I used Dropbox in the beginning (when it still was just a folder that syncs), but now I have great success with iCloud Drive. There were a bunch of other services in between those two.</p>\n<p>One thing I learned about folders in the process is that there is a limit of how many files you can put into a folder. Especially when you want to sync them. Therefore there is actually one folder per month in <em>Archive</em>.</p>\n<p>The first step to make this system work for me was to give files good names. For example, receipts follow the schema <code class=\"language-text\">CompanyName Receipt YY-MM-DD</code> , pictures of me that I use as an avatar <code class=\"language-text\">florian-avatar-july-2020</code>.</p>\n<p>I spent a lot of time for the initial migration to make sure that files have good names, however, I focused my efforts on the parts of my file system that I knew I would need to access frequently. Most of the initial filing into the monthly subfolders of <em>Archive</em> was done by a script and the last modified date of the file.</p>\n<h2>Part 3: Exceptions Make Rules Work</h2>\n<p>To be honest, not all of my files are in these three folders. Every good rule needs exceptions.</p>\n<p>The biggest one is code: source code is not particularly well suited to be stored in a cloud folder, especially if it is a JavaScript project with lots of dependencies in <code class=\"language-text\">node_modules</code>. Therefore I have a <em>Development</em> folder outside of iCloud Drive that holds all my source code. However, when I retire a project and plan to no longer work on it, I zip the folder and move it into <em>Archive</em>.</p>\n<p>Another exception is music. For most of the time I used the system I listened to music via Apple Music, but I still have a lot of MP3. Ripped CDs, digital versions when I buy vinyl, or music that is not available on streaming platforms and I therefore bought. I keep the canoncial copy of these files in a <em>Music</em> folder in iCloud Drive, mostly because iTunes Match keeps messing up.</p>\n<p>Then there are notes. Over the years I used many different systems to take notes and organise them: Notes (from Apple), <a href=\"https://bear.app\">Bear</a>, <a href=\"https://getdrafts.com\">Drafts</a>, and others. At some point I switched to a more formal knowledge management system: <a href=\"https://www.devontechnologies.com/apps/devonthink\">DEVONthink</a>, <a href=\"https://www.craft.do\">Craft</a>, and now <a href=\"https://obsidian.md\">Obsidian</a>. Therefore the number of documents (Pages, Markdown or plain text) that are stored directly in the file system has gone down over the years, but I still have many other types of files for which my three folder system works great. I still use Drafts as place where text starts, but it is only a convinient temporary holding place and the text will move to a note in Obsidian or a file in my <em>Archive</em>.</p>\n<h2>Part 4: Automate the Hell Out Of It</h2>\n<p>Like any other system of organisation my three folders requires some discipline to keep them tidy. I have a repeating task in <a href=\"http://culturedcode.com/things/\">Things</a> to review files in <em>Inbox</em>, which includes giving them proper names and moving them into either <em>Workspace</em>, <em>Archive</em>, or into one of my exception folders. This is a very low-tech automation, but necessary to not get lazy with manually cleaning up.</p>\n<p>The next automation is in the form of a couple of helpers to move files into the correct place. I use an app called <a href=\"https://servicestation.menu\">Service Station</a> to add items to the Finder context menu:</p>\n<ul>\n<li>Move to Inbox</li>\n<li>Move to Workspace</li>\n<li>Move to Archive</li>\n</ul>\n<p>The <em>Move to Inbox</em> and <em>Move to Workspace</em> scripts are identical, they take a list of files and move them into the <em>Inbox</em> or <em>Workspace</em> folder respectivly:</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">on</span> serviceStationDidSelect<span class=\"token punctuation\">(</span>targetedURL<span class=\"token punctuation\">,</span> selectedItemURLs<span class=\"token punctuation\">,</span> menuKind<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">set</span> targetDir <span class=\"token keyword\">to</span> <span class=\"token string\">\"/Users/fec/Library/Mobile Documents/com~apple~CloudDocs/Florian/Inbox\"</span>\n\t<span class=\"token keyword\">set</span> sourceFiles <span class=\"token keyword\">to</span> <span class=\"token keyword\">my</span> theSplit<span class=\"token punctuation\">(</span>selectedItemURLs<span class=\"token punctuation\">,</span> <span class=\"token string\">\",\"</span><span class=\"token punctuation\">)</span>\n\n\t<span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"System Events\"</span>\n\t\t<span class=\"token keyword\">repeat</span> <span class=\"token keyword\">with</span> i <span class=\"token keyword\">from</span> <span class=\"token number\">1</span> <span class=\"token keyword\">to</span> <span class=\"token class-name\">number</span> <span class=\"token keyword\">of</span> items <span class=\"token keyword\">in</span> sourceFiles\n\t\t\t<span class=\"token keyword\">set</span> sourceFile <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>item i <span class=\"token keyword\">of</span> sourceFiles<span class=\"token punctuation\">)</span>\n\t\t\tmove sourceFile <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>targetDir<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">end</span> <span class=\"token keyword\">repeat</span>\n\t<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n<span class=\"token keyword\">end</span> serviceStationDidSelect\n\n<span class=\"token keyword\">on</span> theSplit<span class=\"token punctuation\">(</span>theString<span class=\"token punctuation\">,</span> theDelimiter<span class=\"token punctuation\">)</span>\n\t<span class=\"token comment\">-- save delimiters to restore old settings</span>\n\t<span class=\"token keyword\">set</span> oldDelimiters <span class=\"token keyword\">to</span> AppleScript's <span class=\"token class-name\">text</span> item delimiters\n\t<span class=\"token comment\">-- set delimiters to delimiter to be used</span>\n\t<span class=\"token keyword\">set</span> AppleScript's <span class=\"token class-name\">text</span> item delimiters <span class=\"token keyword\">to</span> theDelimiter\n\t<span class=\"token comment\">-- create the array</span>\n\t<span class=\"token keyword\">set</span> theArray <span class=\"token keyword\">to</span> <span class=\"token keyword\">every</span> <span class=\"token class-name\">text</span> item <span class=\"token keyword\">of</span> theString\n\t<span class=\"token comment\">-- restore the old setting</span>\n\t<span class=\"token keyword\">set</span> AppleScript's <span class=\"token class-name\">text</span> item delimiters <span class=\"token keyword\">to</span> oldDelimiters\n\t<span class=\"token comment\">-- return the result</span>\n\t<span class=\"token keyword\">return</span> theArray\n<span class=\"token keyword\">end</span> theSplit</code></pre></div>\n<p>The <em>Move to Archive</em> script has an additional step. I can select if the files belongs into the archive of the current month, previous month, or next month. Since I clean up my <em>Inbox</em> and <em>Workspace</em> on a weekly basis I rarely need to put a file into the archive of another month. Here is the script:</p>\n<div class=\"gatsby-highlight\" data-language=\"applescript\"><pre class=\"language-applescript\"><code class=\"language-applescript\"><span class=\"token keyword\">on</span> serviceStationDidSelect<span class=\"token punctuation\">(</span>targetedURL<span class=\"token punctuation\">,</span> selectedItemURLs<span class=\"token punctuation\">,</span> menuKind<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">set</span> theCurrentMonth <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>do shell <span class=\"token class-name\">script</span> <span class=\"token string\">\"date +'%Y-%m'\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">set</span> thePrevMonth <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>do shell <span class=\"token class-name\">script</span> <span class=\"token string\">\"date -v-1m +'%Y-%m'\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">set</span> theNextMonth <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>do shell <span class=\"token class-name\">script</span> <span class=\"token string\">\"date -v+1m +'%Y-%m'\"</span><span class=\"token punctuation\">)</span>\n\n\t<span class=\"token keyword\">set</span> theMonthChoices <span class=\"token keyword\">to</span> <span class=\"token punctuation\">{</span>theCurrentMonth<span class=\"token punctuation\">,</span> thePrevMonth<span class=\"token punctuation\">,</span> theNextMonth<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">set</span> theMonth <span class=\"token keyword\">to</span> choose <span class=\"token keyword\">from</span> <span class=\"token class-name\">list</span> theMonthChoices <span class=\"token keyword\">with</span> prompt <span class=\"token string\">\"Move into the following Archive:\"</span> default items <span class=\"token punctuation\">{</span>theCurrentMonth<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token keyword\">if</span> theMonth <span class=\"token keyword\">is</span> <span class=\"token keyword\">false</span> <span class=\"token keyword\">then</span>\n\t\t<span class=\"token keyword\">return</span>\n\t<span class=\"token keyword\">end</span> <span class=\"token keyword\">if</span>\n\n\t<span class=\"token keyword\">set</span> targetFolder <span class=\"token keyword\">to</span> <span class=\"token string\">\"/Users/fec/Library/Mobile Documents/com~apple~CloudDocs/Florian/Archive/\"</span> <span class=\"token operator\">&#x26;</span> theMonth\n\n\t<span class=\"token keyword\">set</span> sourceFiles <span class=\"token keyword\">to</span> <span class=\"token keyword\">my</span> theSplit<span class=\"token punctuation\">(</span>selectedItemURLs<span class=\"token punctuation\">,</span> <span class=\"token string\">\",\"</span><span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">-- Create month folder if it does not exist</span>\n\t<span class=\"token keyword\">set</span> targetFolderPosix <span class=\"token keyword\">to</span> POSIX path <span class=\"token keyword\">of</span> <span class=\"token punctuation\">(</span>targetFolder <span class=\"token operator\">as</span> <span class=\"token class-name\">text</span><span class=\"token punctuation\">)</span>\n\tdo shell <span class=\"token class-name\">script</span> <span class=\"token string\">\"mkdir -p \"</span> <span class=\"token operator\">&#x26;</span> quoted form <span class=\"token keyword\">of</span> targetFolderPosix\n\n\t<span class=\"token comment\">-- Move all selected files into target folder</span>\n\t<span class=\"token keyword\">tell</span> <span class=\"token class-name\">application</span> <span class=\"token string\">\"System Events\"</span>\n\t\t<span class=\"token keyword\">repeat</span> <span class=\"token keyword\">with</span> i <span class=\"token keyword\">from</span> <span class=\"token number\">1</span> <span class=\"token keyword\">to</span> <span class=\"token class-name\">number</span> <span class=\"token keyword\">of</span> items <span class=\"token keyword\">in</span> sourceFiles\n\t\t\t<span class=\"token keyword\">set</span> sourceFile <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>item i <span class=\"token keyword\">of</span> sourceFiles<span class=\"token punctuation\">)</span>\n\t\t\tmove sourceFile <span class=\"token keyword\">to</span> <span class=\"token punctuation\">(</span>targetFolder<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">end</span> <span class=\"token keyword\">repeat</span>\n\t<span class=\"token keyword\">end</span> <span class=\"token keyword\">tell</span>\n<span class=\"token keyword\">end</span> serviceStationDidSelect</code></pre></div>\n<p>Lastly, I use <a href=\"https://www.noodlesoft.com\">Hazel</a> to move files automatically without me intervention. For <em>Inbox</em> I have two rules configured in Hazel:</p>\n<ul>\n<li>If the file name ends with a date (in <code class=\"language-text\">YYYY-MM-DD</code> format), move the file into the sub-folder of <em>Archive</em> for that date.</li>\n<li>If the file has not been modified in over a quarter, move the file into the sub-folder of <em>Archive</em> for the modified date.</li>\n</ul>\n<p>Files in <em>Workspace</em> are moved according to this one rule:</p>\n<ul>\n<li>If the file has not been modified in over a year, move the file into the sub-folder of <em>Archive</em> for the modified date.</li>\n</ul>\n<h2>Conclusion</h2>\n<p>I use this system for many years now and I'm very happy with it. I need to use very little mental energy when storing a file in my file system and search has gotten good enough that I never have a problem finding a file again. Good naming helps a lot with that, but in a pinch full-text search comes in handy. While this often means looking through a long list of files, it happens rarely enough to not be a problem. Automation helps reduce the effort in putting the files in the correct place. Repeating tasks are an easy way to keep me on top of manual organisation tasks.</p>\n<p>The important learning for me was that I need to store a lot more files than I need to access on a regular basis. My three-folder system is a great way for me to reduce the effort of storing files, while still making them accessible through search. Current and regularly used files are even more accessible because I can always find them in <em>Workspace</em>.</p>",
            "url": "/blog/on-file-management/",
            "title": "On File Management",
            "summary": "I use just three folders to store all my files: Inbox, Workspace, and Archive and use a bit of automation to keep the mental burden of storing files low and use search to access files.",
            "date_modified": "2021-11-14T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/automating-meditation/",
            "content_html": "<p>Don't worry if you felt icky clicking on a blog post called <em>Automating Meditation</em>, I felt icky writing it. I don't need to increase the efficiency or throughput of my meditation practice, but I can also use automation to reduce the chance of human error. Before I sit down with <a href=\"https://apps.apple.com/us/app/calm-sleep-meditation/id571800810\">Calm</a> I always want enable Do Not Disturb mode. Annoyingly I forgot this often enough and my practice is disturbed by notifications, that I was looking into Shortcuts if I can make the computer help me.</p>\n<p>I ended up with a simple Shortcut that enables <em>Do Not Disturb</em> for 12 minutes, sets the playback destination to my AirPods and then starts a Daily Calm meditation. To not stick with old behaviours I removed the Calm app from home screen and instead replaced it with the Shortcut. I have also created another Shortcut that starts a sleep story.</p>\n<p>Here are two four steps in my Shortcut:</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 115.00000000000001%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAEFAAAAAAAAAAAAAAAAAAQBAgMFCP/EACYQAAEDBAEBCQAAAAAAAAAAAAEAAgMEERIxIVEyQUJhgbHR0vD/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGBEBAAMBAAAAAAAAAAAAAAAAAAEhMRH/2gAMAwEAAhEDEQA/AOj25CWbCKlcMidtBvYb8/lTIjcczRY97A3Q6XuoMroop5CaWVz8siQRY8Dnf6yU9MC1pjpKnEjtGUfZa1y0ztNg8BhDWcNA0BYBFWYOD+SB6IoUjYSFxtUSNFzZoayw11astKxwdeSV0lx4mtHsAiInSjF0oAfoIiIg3//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/automating-meditation/shortcut-daily-calm-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/automating-meditation/shortcut-daily-calm-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/automating-meditation/shortcut-daily-calm-320.jpg, /blog/automating-meditation/shortcut-daily-calm-640.jpg 2x, /blog/automating-meditation/shortcut-daily-calm-960.jpg 3x\" src=\"/blog/automating-meditation/shortcut-daily-calm-320.jpg\" alt=\"Screenshot of iOS Shortcut to enable Do Not Disturb for 12 minutes, set playback destination to my AirPods and start Daily Calm\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/automating-meditation/",
            "title": "Automating Meditation",
            "summary": "Use Shortcuts on iOS to automatically enable Do Not Disturb before playing Daily Calm.",
            "date_modified": "2021-11-24T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/camp-cope-ive-got-you/",
            "content_html": "<blockquote>\n<p>There's still some things I don't understand<br>\nLike the casual blindness toward the cruelty of man</p>\n</blockquote>\n<p>Once in a while I come across a song that moves me in a way that I cannot explain. <a href=\"https://campcope.bandcamp.com/track/ive-got-you-2\">I've Got You by Camp Cope</a> is one of these songs. Every time I listen to it, the songs story unfolds in my mind like a movie and the emotions feel so real.</p>\n<blockquote>\n<p>When they said there's something inside of you<br>\nSo they tried radiation and chemicals too<br>\nAnd now you're standing on the last line<br>\nAnd so am I, I've got you<br>\nYou've got me too<br>\nHold on, I've got you</p>\n</blockquote>",
            "url": "/blog/camp-cope-ive-got-you/",
            "title": "Like the casual blindness toward the cruelty of man",
            "date_modified": "2021-12-23T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/sustainable-web-design-tom-greenwood/",
            "content_html": "<p>In classic A Book Apart fashion <a href=\"https://abookapart.com/products/sustainable-web-design\"><em>Sustainable Web Design</em></a> by Tom Greenwood provides us with a concise introduction on creating websites that consume less energy, produce less carbon emissions and have the least impact on our planet.</p>\n<p>After a quick introduction why we should care about creating sustainable websites, we learn how to measure the impact of websites and how we can design and develop more sustainable. Greenwood also explains some of the considerations to look at when choosing a green web hoster, for example, the effect of scale on the carbon emissions of data centres and the different ways that data centres can become green. Chapter 6 is the least relevant for me, since I don't need to sell my work to clients. In summary, everything that makes a website sustainable also makes the website better: higher performance, better accessibility, faster loading times, etc.</p>\n<p>The book finishes with a chapter on the challenges the climate crisis brings for the internet: data centres that are built in areas likely to be flooded, or increased need to cool servers when temperatures rise.</p>\n<p>While I think about my impact on the environment on a daily basis, I never really thought about the impact my websites and code have before. In the <em>Selling Sustainable Web Design</em> chapter Greenwood explains that many of the things that make a website more sustainable are just good web design, Sustainable Web Design has opened my eyes to include environmental impact in my design and development decisions.</p>\n<p>PS: In the past I would have included a picture of the cover in this blog post. After you have read this book you know why I didn't this time.</p>\n<p>★★★★☆</p>",
            "url": "/blog/sustainable-web-design-tom-greenwood/",
            "title": "Sustainable Web Design by Tom Greenwood",
            "summary": "Review of Sustainable Web Design by Tom Greenwood.",
            "date_modified": "2021-12-26T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/humble-inquiry/",
            "content_html": "<p><a href=\"https://bkconnection.com/books/title/Humble-Inquiry-Second-Edition\">Humble Inquiry</a> by Edgar H. Schein and Peter A. Schein is one of these business books that should have been a blog post. While it is only 150 pages, I felt like I didn't learn anything new after the <strike>first chapter</strike> introduction.</p>\n<p>In the introduction the authors define Humble Inquiry, as a management style where you ask questions, listen to the answer, and respond appropriately. It also includes revealing more of you in order to build a better relationship with others.</p>\n<p>The rest of the book repeats these points and adds a lot of arguments why this is better than managing people by just telling them what to do and not listening to them. Yeah, I'm probably the wrong audience since I was already onboard with the fact that asking questions and listening to people is good. You know, better than just telling other people what you think and not giving a fuck about the relationship you have with them. After reading this book and the fact that it is part of many lists of best management or leadership books I can only assume that most managers need to hear these basic facts of human interaction repeated over and over again.</p>\n<p>★★☆☆☆</p>",
            "url": "/blog/humble-inquiry/",
            "title": "Humble Inquiry by Edgar H. Schein, Peter A. Schein",
            "summary": "Review of Humble Inquiry by Edgar H. Schein and Peter A. Schein.",
            "date_modified": "2022-01-04T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2021/",
            "content_html": "<p>This is the fifth consecutive year where I'm posting the list of my favourite albums. Now it's a tradition. As always, in no particular order. My Last.fm profile has <a href=\"https://www.last.fm/user/feredir/library/albums?from=2021-01-01&#x26;rangetype=year\">all the music I listening to in 2021</a>.</p>\n<h2>Thirstier by TORRES</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAMF/8QAJBAAAgEDAwUAAwAAAAAAAAAAAQIDAAQRBQchBhIiMUETMtH/xAAWAQEBAQAAAAAAAAAAAAAAAAAFBwb/xAAlEQABAgMIAwEAAAAAAAAAAAABAAMCBLEFERIhMjRRcjFi0fH/2gAMAwEAAhEDEQA/APN3ilvhuZeLBe3cMSwwdqxTMoB7M+s1FdQ1XVZbe1uE1a+kVkP7XDu4YHnnPr+VYO7OnySdb3NzEFYBIe/GO5cIPlV+j3VnYrqjKIrcAIlvBIHUBj5SSYHJ5zweOBWbs3CZVrIE4RRbRtuGFqEnj4tHbXtK/QGitcyPJMYSWdzknyaldNt3lk6F0Z7hESVoe5lT0MsTSp5PblzsalEOazdyqM3k1G50zc/VpLV8FobclTyDiMfKh/RyDV4lhuMxwxq8344iVVmZzkkfcYGKUqj2cLpNs+sNElLZwwA+Pxal27iEPRelxhmYLG3LHJPm3ulKVOJ7dO9jVGx6iv/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/torres-thirstier-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/torres-thirstier-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/torres-thirstier-320.jpg, /blog/favourite-albums-2021/torres-thirstier-640.jpg 2x, /blog/favourite-albums-2021/torres-thirstier-960.jpg 3x\" src=\"/blog/favourite-albums-2021/torres-thirstier-320.jpg\" alt=\"Album cover of Thirstier by TORRES\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Thirstier</em> on <a href=\"https://torrestorrestorres.bandcamp.com/album/thirstier\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/thirstier/1564152909?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/5Sq7ZgoJQQEY54oupmAtbu\">Spotify</a>.</p>\n<h2>Home Video by Lucy Dacus</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAUDBAcG/8QAJBAAAgIBBAIBBQAAAAAAAAAAAQIAAwQFESExEkEGFCJRcqH/xAAXAQEBAQEAAAAAAAAAAAAAAAAEBQMG/8QAHxEAAgICAQUAAAAAAAAAAAAAAQIAAwQRIQUiMmFx/9oADAMBAAIRAxEAPwDimVXfkGxaqLLFDnYgTQt03P5P0N+36y9jajTiFlsZuHJ4Xf3LGtfMsHUaqVNOPimpSN6KSvn13+ep02N0nAetGe7RI57l4OpMys3IRiFTY+Tno86mZLFKMDyp7ETJn5CXZt9iHdXbcE8eokO+pEsZUOwCdH1GJaSoJHM9PQK7q3ZqaQfuPCAdSTlotVq2VKEcL5Age4iHEY/jIVigN/YiJrAT/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/lucy-dacus-home-video-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/lucy-dacus-home-video-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/lucy-dacus-home-video-320.jpg, /blog/favourite-albums-2021/lucy-dacus-home-video-640.jpg 2x, /blog/favourite-albums-2021/lucy-dacus-home-video-960.jpg 3x\" src=\"/blog/favourite-albums-2021/lucy-dacus-home-video-320.jpg\" alt=\"Album cover of Home Video by Lucy Dacus\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Home Video</em> on <a href=\"https://lucydacus.bandcamp.com/album/home-video\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/home-video/1586471742?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/2nwfSapJ3YIq7Ofad4Vuh1\">Spotify</a>.</p>\n<h2>Little Oblivions by Julien Baker</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBwYI/8QAKRAAAQMDAgQGAwAAAAAAAAAAAQIDBAAFERIxBgchUQgTIjJBkWFicf/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAbEQADAQEAAwAAAAAAAAAAAAAAAQIDEQQSMf/aAAwDAQACEQMRAD8A1/m3zFk8EybfHjQGpRltrXqcdKNOkpHTAOd64N3nne4IQqZYGClaNSdTy05/Pt61f8Rtlm3W7WNcXyUssx3i4pz49Sdhudvisel8K8QyoTLkm6qkLEdCUNSHSS2Tn0DOwHQdvqsWvm4Z36XSTRacbqepHtOG6X4rLxGkuISrHbIzSorWlSLbFSr3BpAP90ilbSJM8w08AHW0LH7DNV02yGlYWmO2FDbptSlK5TfwPS1oHdX3SlKYB//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/julien-baker-little-oblivious-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/julien-baker-little-oblivious-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/julien-baker-little-oblivious-320.jpg, /blog/favourite-albums-2021/julien-baker-little-oblivious-640.jpg 2x, /blog/favourite-albums-2021/julien-baker-little-oblivious-960.jpg 3x\" src=\"/blog/favourite-albums-2021/julien-baker-little-oblivious-320.jpg\" alt=\"Album cover of Little Oblivions by Julien Baker\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Little Oblivions</em> on <a href=\"https://julienbaker.bandcamp.com/album/little-oblivions\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/little-oblivions/1586464816?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/3IQRHa9iVLsGlSuVHiHZ3A\">Spotify</a>.</p>\n<h2>Mythopoetics by Half Waif</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIGCAQF/8QAJhAAAgEDAgUFAQAAAAAAAAAAAQIDABEhBAUGEhMxQSJRYYGxB//EABYBAQEBAAAAAAAAAAAAAAAAAAMFBP/EACQRAAEBBAsAAAAAAAAAAAAAAAABAxEy8AIEEhQVISMxQcHx/9oADAMBAAIRAxEAPwDlkji0/TWVgHcEqvlrC5t9VPaOjuMYl0xJCymNgylSrA5BBFwaqO/7jq+JNLKy6blm0gLRjTA+k49Xvi1vuvU2TfJNtntDiGdkkaPUHLSOAWYHxe+R2xWzFEt5w+ArUNFGibvno1krScowe3xSpplQfilSnGwyp/Hl6se/TvmRDCgNvDc1/wAFVLjMNFBoJRI7O+oZSWPgFQLe3YUpRJEUGaJc6U8m2owORceB+UpSnJ5//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/half-waif-mythopoetics-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/half-waif-mythopoetics-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/half-waif-mythopoetics-320.jpg, /blog/favourite-albums-2021/half-waif-mythopoetics-640.jpg 2x, /blog/favourite-albums-2021/half-waif-mythopoetics-960.jpg 3x\" src=\"/blog/favourite-albums-2021/half-waif-mythopoetics-320.jpg\" alt=\"Album cover of Mythopoetics by Half Waif\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Mythopoetics</em> on <a href=\"https://halfwaif.bandcamp.com/album/mythopoetics\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/mythopoetics/1561315256?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/4FdIfIKSgiDBEG6Er5ANj4\">Spotify</a>.</p>\n<h2>An Overview On Phenomenal Nature by Cassandra Jenkins</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcCAwQF/8QAJhAAAgIABQMEAwAAAAAAAAAAAQIAAwQREiEiBUFxBhNRYRQxgf/EABYBAQEBAAAAAAAAAAAAAAAAAAIDBP/EAB8RAAIBAwUBAAAAAAAAAAAAAAABAgMRoRIUIUJSU//aAAwDAQACEQMRAD8AttNVRYaiAO5m10pz4bL9nOQWjq+JV8nyde2hyD/QZk3qVFLrqszQ6XBbLI9oEovjVgq6sl0yXP26/kRII3qWsk6TaR9WRKKnH2S3EvnklFGKxdAVKcXeg2OzefnxOq/qGMUvR+S7IVz5AE7jxETMb7I8KrG38+ZHI/okRERBsj//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/cassandra-jenkins-an-overview-on-phenomenal-nature-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/cassandra-jenkins-an-overview-on-phenomenal-nature-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/cassandra-jenkins-an-overview-on-phenomenal-nature-320.jpg, /blog/favourite-albums-2021/cassandra-jenkins-an-overview-on-phenomenal-nature-640.jpg 2x, /blog/favourite-albums-2021/cassandra-jenkins-an-overview-on-phenomenal-nature-960.jpg 3x\" src=\"/blog/favourite-albums-2021/cassandra-jenkins-an-overview-on-phenomenal-nature-320.jpg\" alt=\"Album cover of An Overview On Phenomenal Nature by Cassandra Jenkins\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>An Overview On Phenomenal Nature</em> on <a href=\"https://cassandrajenkins.bandcamp.com/album/an-overview-on-phenomenal-nature\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/an-overview-on-phenomenal-nature/1539001628?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/1NzOdSkSNmBhhg72KlNcsE\">Spotify</a>.</p>\n<h2>Jubilee by Japanese Breakfast</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEBwX/xAAnEAABAwMEAQMFAAAAAAAAAAABAgMEAAURBhIhMUETUYEzYXGRsf/EABUBAQEAAAAAAAAAAAAAAAAAAAMF/8QAIhEAAgEDAgcAAAAAAAAAAAAAAQIAAxESBDEhIjJRcYHh/9oADAMBAAIRAxEAPwDu9yucdhmO7dQ9HYfQpDkdxIKUjypZ8AD+1Gt6yZujMWRYrahqOwnchySEJBZzwpABztP4yMiqTW8yREZaWzKYZYwfVDqNwUMjOR7YyPmoXR1viS7uG5aEYj/SQ4AkqawRkpHwM9cVGquWvTU8e8oUlAAdtp0OzXlm5QUyFNrjrJwptR3YP2I7FK1wokaEwGYjLbTQ5CUDilIgrYjNhfx9hMUvyg2mGTBjXA75rKXi0vKQrr9ea8PWUJiPZX5sdAalNrQkOIABUneCUn3B8ilKnafqHuIxO0q4x9SO0sgAqQDgddUpSq0Cf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/japanese-breakfast-jubilee-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/japanese-breakfast-jubilee-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/japanese-breakfast-jubilee-320.jpg, /blog/favourite-albums-2021/japanese-breakfast-jubilee-640.jpg 2x, /blog/favourite-albums-2021/japanese-breakfast-jubilee-960.jpg 3x\" src=\"/blog/favourite-albums-2021/japanese-breakfast-jubilee-320.jpg\" alt=\"Album cover of Jubilee by Japanese Breakfast\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Jubilee</em> on <a href=\"https://michellezauner.bandcamp.com/album/jubilee\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/jubilee/1553364590?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/0ajoNtBO6xHfWEkORtRCAv\">Spotify</a>.</p>\n<h2>Maximum Sorrow! by Desperate Journalist</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHBAgJ/8QAKBAAAQMDBAEEAgMAAAAAAAAAAQIDBAAFEQYSITETBwhBURVhMoGh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwEABP/EACARAAIBBAEFAAAAAAAAAAAAAAABAgMRITFREkFhkeH/2gAMAwEAAhEDEQA/AJr6+aq1Da7PDn6PnOpZY3KlhptQUQVJSnkj9nqqJuuvvVBDKbkbtc4kNTgaKVqTkHalRyCArpST181Zfu31JIYten49muavHIXID6Y7/ePGU52n75Fa4Tr9cri2PytxlyZLjoKg8d3QSkEqP6SB/VanCe7L4dVN03FdTenrnNs+joehx5TDJMyEV7AFndxuHBxz1njnnilRxV3s7kSEtiRYVtKYSQXZLKT89DB4z9fOaUNvAN1yZ2t/Tywa8RDTqBqQsQ95a8D6msbsZzt7/iKijnt40ApSCqJcFKScgqnOE/6aUpoNqJH3LS8LQAHjb4GOUilKURT/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-640.jpg, /blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-320.jpg, /blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-640.jpg 2x, /blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-960.jpg 3x\" src=\"/blog/favourite-albums-2021/desperate-journalist-maximum-sorrow-320.jpg\" alt=\"Album cover of Maximum Sorrow! by Desperate Journalist\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Maximum Sorrow!</em> on <a href=\"https://desperatejournalist.bandcamp.com/album/maximum-sorrow-2\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/maximum-sorrow/1559029228?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/3rj40fZ0EUmRXm1kHSc6d9\">Spotify</a>.</p>\n<h2>Collapsed in Sunbeams by Arlo Parks</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHBf/EACgQAAEDAwQBAgcAAAAAAAAAAAECAwQABREGEhMhMSKBBxYyYXGRof/EABYBAQEBAAAAAAAAAAAAAAAAAAQDBf/EABwRAAMAAgMBAAAAAAAAAAAAAAABAhETAxIhQf/aAAwDAQACEQMRAD8A0e2Osw749FLrqn5SebslYSkKwT30PqHQq2hNEZDgx9s+DWSXObqlF4nt6YYgzOcN8apSumyE5UkEeM4/tcqd8S9UW2JAEpq3MvzENu8LMZTakJX6tuVKOF9kE4I7zRuK1K7Nj9NXXWF8yb6W00qNh62jS4rLrim47im0KW0VhW0lIVjPvSq74Ja6XhOwLcw1KKkcnqGMbzgePH6rofK1lfQ0l63suBKABvG7r3/NKVmoRlr0ooWn4Edo8TZCXMK2nBCfSEgJGOgAAABSlKQkieT/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/arlo-parks-collapsed-in-sunbeams-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/arlo-parks-collapsed-in-sunbeams-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/arlo-parks-collapsed-in-sunbeams-320.jpg, /blog/favourite-albums-2021/arlo-parks-collapsed-in-sunbeams-640.jpg 2x, /blog/favourite-albums-2021/arlo-parks-collapsed-in-sunbeams-960.jpg 3x\" src=\"/blog/favourite-albums-2021/arlo-parks-collapsed-in-sunbeams-320.jpg\" alt=\"Album cover of Collapsed in Sunbeams by Arlo Parks\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Collapsed in Sunbeams</em> on <a href=\"https://arloparks.bandcamp.com/album/collapsed-in-sunbeams\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/collapsed-in-sunbeams-up-next-film-edition/1550632003?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/42joEEymK7EIHODfNB4yug\">Spotify</a>.</p>\n<h2>Today We're the Greatest by Middle Kids</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAgj/xAAoEAABAwMDAwMFAAAAAAAAAAABAgMEAAURBhIhBxMxCFFhMkFxobH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAT/xAAfEQEBAAECBwAAAAAAAAAAAAABABECEgMTISIxMkH/2gAMAwEAAhEDEQA/AITpWwTdRXRmNGbcLPcSl54DhtOeT+fYe5Fajq/p+z2C6Q0WBE5phxpW9Mpe5W5KsZz7HzVa0LouYy7EVaH4qGo6il15JGHH9uQ2gYwpCckn585rL9RLZ3498gzCqQuHL2GUU7VIG5Q348bc8Y8ZNDzO3cHSV4YOF8UVbmPbAnuLCU8AJOMClcyozkN9TD6Qlaf2PsR8UpSNMXtb045f6RWyS+ouvrekKUtXJyXFD+AVntXWiOz1GfjFTrjdyjvvO9wg7SrYClPH08cA58mlKtQbcV8aN6pjxIl3LbMKN2+22pKVI3BGUgkDPgZycfNKUrPp9STLf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2021/middle-kids-today-were-the-greatest-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2021/middle-kids-today-were-the-greatest-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2021/middle-kids-today-were-the-greatest-320.jpg, /blog/favourite-albums-2021/middle-kids-today-were-the-greatest-640.jpg 2x, /blog/favourite-albums-2021/middle-kids-today-were-the-greatest-960.jpg 3x\" src=\"/blog/favourite-albums-2021/middle-kids-today-were-the-greatest-320.jpg\" alt=\"Album cover of Today We&#x27;re the Greatest by Middle Kids\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Listen to <em>Today We're the Greatest</em> on <a href=\"https://middlekids.bandcamp.com/album/today-we-re-the-greatest\">Bandcamp</a>, <a href=\"https://music.apple.com/at/album/today-were-the-greatest/1542609518?l=en\">Apple Music</a>, or <a href=\"https://open.spotify.com/album/5dK1qxuVTRmckVMtThjoGu\">Spotify</a>.</p>",
            "url": "/blog/favourite-albums-2021/",
            "title": "My Favourite Albums of 2021",
            "summary": "I'm closing 2021 by compiling the list of my favorite albums of the year.",
            "date_modified": "2022-01-05T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2021/",
            "content_html": "<p>In 2021 I read 43 books, quite a lot of the books this year were related to my job and looking at the stack of books on my desk that I plan to read next this trend is likely to continue. I also started to read the Neapolitian Saga by Elena Ferrante and the next two books about the relationship of Elena and Lila are already waiting for me.</p>\n<p>The most remarkable book I have read this year was <strong>Disappearing Earth</strong> by Julia Phillips. The story of two abducted girls is told over twelve months through the lens of twelve different woman that are connected to the two girls through different levels of separation. Huge recommendation.</p>\n<ul>\n<li><a href=\"/blog/sustainable-web-design-tom-greenwood/\"><strong>Sustainable Web Design</strong></a> by Tom Greenwood ★★★★☆</li>\n<li><strong>Cross-Cultural Design</strong> by Senongo Akpem ★★★★☆</li>\n<li><strong>Thinking in Bets: Making Smarter Decisions When You Don't Have All the Facts</strong> by Annie Duke ★★★☆☆</li>\n<li><a href=\"/blog/humble-inquiry/\"><strong>Humble Inquiry: The Gentle Art of Asking Instead of Telling</strong></a> by Edgar H. Schein and Peter A. Schein ★★☆☆☆</li>\n<li><strong>Die Geschichte eines neuen Namens</strong> by Elena Ferrante ★★★★★</li>\n<li><strong>2001</strong> by Angela Lehner ★★★★☆</li>\n<li><strong>The ART of Avoiding a Train Wreck: Practical Tips and Tricks for Launching and Operating SAFe Agile Release Trains</strong> by Em Campbell-Pretty and Adrienne L. Wilson ★★★☆☆</li>\n<li><strong>Salonfähig</strong> by Elias Hirschl ★★★★☆</li>\n<li><strong>I Hold a Wolf by the Ears: Stories</strong> by Laura van den Berg ★★★★☆</li>\n<li><strong>Unterwasserflimmern</strong> by Katharina Schaller ★★★★☆</li>\n<li><strong>Disappearing Earth</strong> by Julia Phillips ★★★★★</li>\n<li><strong>Meine geniale Freundin</strong> by Elena Ferrante ★★★★★</li>\n<li><strong>Kim Jiyoung, geboren 1982</strong> by Nam-joo Cho ★★★★★</li>\n<li><strong>Vesper Flights</strong> by Helen Macdonald ★★★★★</li>\n<li><strong>Luster</strong> by Raven Leilani ★★★★★</li>\n<li><strong>DAVE</strong> by Raphaela Edelbauer ★★★★☆</li>\n<li><strong>The Rollout: A Novel about Leadership and Building a Lean-Agile Enterprise with SAFe</strong> by Alex Yakyma ★☆☆☆☆</li>\n<li><strong>Small Fry</strong> by Lisa Brennan-Jobs ★★★★☆</li>\n<li><strong>SAFe 5.0 Distilled</strong> by Richard Knaster by Dean Leffingwell ★★☆☆☆</li>\n<li><strong>Why Fish Don't Exist: A Story of Loss, Love, and the Hidden Order of Life</strong> by Lulu Miller ★★★★★</li>\n<li><strong>Wilde Iris. Gedichte</strong> by Louise Glück ★★★★☆</li>\n<li><strong>Die Bagage</strong> by Monika Helfer ★★★★☆</li>\n<li><strong>Das Palais muss brennen</strong> by Mercedes Spannagel ★★★★★</li>\n<li><strong>The Great Believers</strong> by Rebecca Makkai ★★★★★</li>\n<li><strong>Quiet: The Power of Introverts in a World That Can't Stop Talking</strong> by Susan Cain ★★★★☆</li>\n<li><strong>The Coaching Habit: Say Less, Ask More &#x26; Change the Way You Lead Forever</strong> by Michael Bungay Stanier ★★★★☆</li>\n<li><strong>Girls Against God</strong> by Jenny Hval ★★☆☆☆</li>\n<li><strong>Thinking, Fast and Slow</strong> by Daniel Kahneman ★★★☆☆</li>\n<li><strong>Kissa by Kissa</strong> by Craig Mod ★★★★☆</li>\n<li><a href=\"/blog/silvia-moreno-garcia-mexican-gothic/\"><strong>Mexican Gothic</strong></a> by Silvia Moreno-Garcia ★★★★☆</li>\n<li><strong>Der Gast im Garten</strong> by Takashi Hiraide ★★★★☆</li>\n<li><strong>This Is What America Looks Like: My Journey from Refugee to Congresswoman</strong> by Ilhan Omar ★★★★☆</li>\n<li><a href=\"/blog/jenny-odell-how-to-do-nothing/\"><strong>How to Do Nothing: Resisting the Attention Economy</strong></a> by Jenny Odell ★★★★★</li>\n<li><strong>Paradise Rot</strong> by Jenny Hval ★★★☆☆</li>\n<li><strong>Uncanny Valley: A Memoir</strong> by Anna Wiener ★★★★★</li>\n<li><strong>Radical Candor: Fully Revised &#x26; Updated Edition</strong> by Kim Scott ★★★☆☆</li>\n<li><strong>The Third Hotel</strong> by Laura van den Berg ★★★★★</li>\n<li><strong>Fräulein Smillas Gespür für Schnee</strong> by Peter Hoeg ★★★★★</li>\n<li><strong>The Little Snake</strong> by A.L. Kennedy ★★★★☆</li>\n<li><strong>Brüste und Eier</strong> by Mieko Kawakami ★★★★★</li>\n<li><strong>The Manager's Path: A Guide for Tech Leaders Navigating Growth and Change</strong> by Camille Fournier ★★★★★</li>\n<li><strong>Rebecca</strong> by Daphne du Maurier ★★★★★</li>\n<li><strong>Das lügenhafte Leben der Erwachsenen</strong> by Elena Ferrante ★★★★★</li>\n</ul>",
            "url": "/blog/books-2021/",
            "title": "Books I Read in 2021",
            "summary": "The list of all 43 books that I read in 2021.",
            "date_modified": "2022-01-08T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/clayton-m-christensen-the-innovators-dilemma/",
            "content_html": "<p><a href=\"https://www.hbs.edu/faculty/Pages/item.aspx?num=46\">The Innovator's Dilemma</a> looks at why established companies sometimes are able to thrive on new technological innovation in their industry and in other cases are incapable of adapting new technologies and are driven from the market by startups. Clayton M. Christensen published The Innovator's Dilemma in 1997 (I read the edition from 2016) and it is one of these books you see referenced all the time if you're interested in innovation, startups, or strategies for technology companies.</p>\n<p>The gist of the Christensen's research is that established companies do well if innovation benefits their current customers immediately, but are unable to adapt new technologies if they cannot sell it to their current customers or at least through their current sales channels. A new technology might allow for a simpler and cheaper product, that, on the other hand, offers worse price per <em>performance</em> and is therefore of little interest to the customers of an established company (which are mostly also big companies). However, a small startup selling to other small companies is able to grow with lower margins and lower overall market size. One of the examples Christensen gives is Apple's Newton, which had more sales than the Apple II in its first two years. The difference is that when the Apple II launched Apple was a startup, while it was a computer giant in 1994 when it launched the Apple II. Selling 140,000 Newtons was not considered a success for such a large corporation.</p>\n<p>There are these 1.5 pages at the beginning of Part 2 where Christensen lays out the strategies to fight the disruption from startups. Because disruption happens in new markets, which are in the beginning always smaller than already established markets, it is important to create some kind of separate organisation to develop and market disruptive technologies. Smaller organisations need lower margins and are excited about small wins. In addition, disruptive technologies often need different values and processes, because the market is not defined yet and the organisation needs to find or create the market first. Products need to be flexible so they can be easily adapted when new discoveries are made. When a disruptive technology establishes itself in the new market, the company can start moving up market where margins and sales volumes are higher.</p>\n<p>★★★★★</p>",
            "url": "/blog/clayton-m-christensen-the-innovators-dilemma/",
            "title": "The Innovator's Dilemma by Clayton M. Christensen (2016)",
            "summary": "Review and very concise summary of the book The Innovator's Dilemma by Clayton M. Christensen.",
            "date_modified": "2022-01-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/convert-mp3-ffmpeg-fish/",
            "content_html": "<p>From time to time I need to convert audio files from some kind of audio format into a MP3 file with variable bitrate (VBR). The easiest way to convert audio files, without having to search and install a GUI application, is <a href=\"https://ffmpeg.org\">ffmpeg</a>. Ffmpeg can do everything related to audio and video files, which is a blessing and a curse and I always end up having to search for the correct arguments.</p>\n<p>This time I was smart enough to save the correct incantation as a <a href=\"https://fishshell.com\">Fish</a> function:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"token keyword\">function</span> mp3convert\n  <span class=\"token keyword\">for</span> <span class=\"token for-or-select variable\">f</span> <span class=\"token keyword\">in</span> <span class=\"token variable\">$argv</span>\n    <span class=\"token builtin class-name\">command</span> ffmpeg <span class=\"token parameter variable\">-i</span> <span class=\"token string\">\"<span class=\"token variable\">$f</span>\"</span> <span class=\"token parameter variable\">-codec:v</span> copy <span class=\"token parameter variable\">-codec:a</span> libmp3lame <span class=\"token parameter variable\">-q:a</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">(</span>string replace <span class=\"token parameter variable\">-r</span> <span class=\"token string\">'\\.[a-zA-Z0-9]+$'</span> <span class=\"token string\">\".mp3\"</span> <span class=\"token string\">\"<span class=\"token variable\">$f</span>\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  end\nend</code></pre></div>\n<p><code class=\"language-text\">mp3convert</code> takes either a single file or a list of files and converts them into a variable bitrate MP3 in high quality and it replaces the extension from whatever the input format is to <code class=\"language-text\">.mp3</code>. Here are a couple of ways <code class=\"language-text\">mp3convert</code> can be run:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">mp3convert my-file.wav\nmp3convert my-file-1.wav my-file-2.m4a\nmp3convert *.m4a</code></pre></div>",
            "url": "/blog/convert-mp3-ffmpeg-fish/",
            "title": "Convert Audio Files to MP3 with ffmpeg in Fish Shell",
            "summary": "In this blog post I introduce a small Fish function that converts one or more audio files to MP3 (with VBR) with ffmpeg.",
            "date_modified": "2022-01-29T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-apple-touch-icons/",
            "content_html": "<p>Creating the various sizes of Apple Touch Icons is one of the more tedious tasks in web development. iOS uses the Apple Touch Icon when a user adds the website to their home screen and since most websites now include them, many things use Apple Touch Icons when they need to display a higher quality version of the Favicon. According to Apple's Human Interface Guidelines on <a href=\"https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/\">App Icons</a> we need to add icons in the following sizes to our websites: <code class=\"language-text\">180x180</code>, <code class=\"language-text\">167x167</code>, <code class=\"language-text\">152x152</code>, and <code class=\"language-text\">120x120</code>.</p>\n<p>While sometimes it is necessary to optimise our icon for each size, in many cases a simple resize is good enough. Instead of having to manually create all four versions of the app icon, we can use <a href=\"https://www.11ty.dev/docs/languages/javascript/\">JavaScript templates</a> in Eleventy to automatically generate a version for each size.</p>\n<p>We will use the <a href=\"https://github.com/lovell/sharp\"><code class=\"language-text\">sharp</code></a> library to resize the file and will start by installing it as a dependency:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev sharp</code></pre></div>\n<p>Next we create a JavaScript template in the input directory of our Eleventy site that reads the original image file, resizes the image for each variant and saves them into the output directory. In my case the input directory is <code class=\"language-text\">site/</code> and the output directory is <code class=\"language-text\">dist/</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> sharp <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'sharp'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> promisify <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'util'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>promisify<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> readFile <span class=\"token operator\">=</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>fs<span class=\"token punctuation\">.</span>readFile<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">AppleTouchIcon</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">async</span> <span class=\"token function\">readOriginalIcon</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">readFile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./site/images/apple-touch-icon.png'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">resizeIcon</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">icon<span class=\"token punctuation\">,</span> size</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">await</span> <span class=\"token function\">sharp</span><span class=\"token punctuation\">(</span>icon<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">resize</span><span class=\"token punctuation\">(</span>size<span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">toFile</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">./dist/images/apple-touch-icon-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>size<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">x</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>size<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.png</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// See https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/</span>\n    <span class=\"token keyword\">const</span> iconSizes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">120</span><span class=\"token punctuation\">,</span> <span class=\"token number\">152</span><span class=\"token punctuation\">,</span> <span class=\"token number\">167</span><span class=\"token punctuation\">,</span> <span class=\"token number\">180</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> originalIcon <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">readOriginalIcon</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span>\n      iconSizes<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">size</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">resizeIcon</span><span class=\"token punctuation\">(</span>originalIcon<span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> AppleTouchIcon<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Since the <code class=\"language-text\">render</code> method of the JavaScript template always returns <code class=\"language-text\">undefined</code> Eleventy will not create an additional file.</p>\n<p>The last step is to include the Apple Touch Icons in the <code class=\"language-text\">&#x3C;head></code> of our page, in most cases you will have a layout which is used for all pages:</p>\n<div class=\"gatsby-highlight\" data-language=\"nunjucks\"><pre class=\"language-nunjucks\"><code class=\"language-nunjucks\">&#x3C;link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/images/apple-touch-icon-180x180.png\">\n&#x3C;link rel=\"apple-touch-icon\" sizes=\"167x167\" href=\"/images/apple-touch-icon-167x167.png\">\n&#x3C;link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"/images/apple-touch-icon-152x152.png\">\n&#x3C;link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"/images/apple-touch-icon-120x120.png\"></code></pre></div>",
            "url": "/blog/eleventy-apple-touch-icons/",
            "title": "Generating Apple Touch Icons with Eleventy",
            "summary": "Creating the various sizes of Apple Touch Icons is one of the more tedious tasks in web development, but we can use JavaScript templates in Eleventy to automatically generate Apple Touch Icons.",
            "date_modified": "2022-03-30T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/pop-is-back/",
            "content_html": "<p>Between October 2010 and May 2018 I regularly posted to my music blog <a href=\"https://pop.md\">POP.md</a>, but the Tumblr interface kept annoying me and so I stopped. Because I set myself the goal to post at least two things per day I was burned out. I never intended to fully stop, however, I could not motivate myself to move the content to another blogging system until I kind of forgot about POP.</p>\n<p>A couple of weeks ago I thought it would be great to have a place where I can post music I like and started to create a simple static blog setup using <a href=\"https://www.11ty.dev\">Eleventy</a>. I downloaded an archive of all old posts from Tumblr and wrote a script that migrated all the old posts into the new system. The <a href=\"https://git.sr.ht/~fec/pop.md-tumblr-import/tree/main/item/import.mjs\">import from Tumblr script</a> is straight forward: I use the cheerio library to extract the post body from the HTML Tumblr provides and then construct the required meta data from the body.</p>\n<p>I have already collected a couple of songs and music videos that I wanted to share while I was designing and building the site and put it live last week.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 73.4375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAQCAwUI/8QAJRAAAwABAwMDBQAAAAAAAAAAAQIDAAQREiExkUFh0VJUcYHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/8QAGREBAAMBAQAAAAAAAAAAAAAAAAERIQIy/9oADAMBAAIRAxEAPwD0RLVWgJTveFX4As9LCbd+p4gZdJ1qyotosSey3JPv6ZNqo2NFEtVKYCAcXVSfyNxvlGgg+6tUysq9iir38f3NTN6OPMWtOmUnfnT9NjOXmfpbxjDS6ysGsVL3ruvQbBfjNTR59EvQAey/GMZXib5W+4p4X4xjGCf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/pop-is-back/pop-md-2022-04-11-960.jpg, /blog/pop-is-back/pop-md-2022-04-11-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/pop-is-back/pop-md-2022-04-11-640.jpg, /blog/pop-is-back/pop-md-2022-04-11-1280.jpg 2x, /blog/pop-is-back/pop-md-2022-04-11-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/pop-is-back/pop-md-2022-04-11-320.jpg, /blog/pop-is-back/pop-md-2022-04-11-640.jpg 2x, /blog/pop-is-back/pop-md-2022-04-11-960.jpg 3x\" src=\"/blog/pop-is-back/pop-md-2022-04-11-320.jpg\" alt=\"Screenshot of POP.md\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>For now I am going to post whenever I feel like it and I jerry-rigged a simple mobile blogging system using <a href=\"https://getdrafts.com\">Drafts</a>, <a href=\"https://support.apple.com/en-gb/guide/shortcuts/welcome/ios\">Shortcuts</a>, and <a href=\"https://workingcopy.app\">Working Copy</a> to make posting as easy as possible for me.</p>\n<p>Good night and <a href=\"https://pop.md\">enjoy a bit of music</a>.</p>",
            "url": "/blog/pop-is-back/",
            "title": "POP is Back",
            "summary": "I have re-activated my music blog POP.md that I first maintained from 2010 to 2018.",
            "date_modified": "2022-04-11T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/post-to-eleventy-ios-drafts-shortcuts-working-copy/",
            "content_html": "<p>For me using a static site generator such as <a href=\"https://www.11ty.dev\">Eleventy</a> to blog has one big advantage and one big disadvantage compared to other systems (eg, <a href=\"https://wordpress.org\">WordPress</a>). On the plus side hosting is extremely easy because I just need to host static files, no need to run PHP, Ruby, or Node.js on the server. However, blogging when I'm away from my Mac is more complicated than with a server-side system that has either an app for iOS or at least a mobile website I can log in.</p>\n<p>When I was recently <a href=\"/blog/pop-is-back/\">migrating POP.md from Tumblr to Eleventy</a> on my own server I was thinking how I could handle writing new posts from the go and came up with a solution that involves <a href=\"https://getdrafts.com\">Drafts</a>, <a href=\"https://support.apple.com/en-gb/guide/shortcuts/welcome/ios\">Shortcuts</a>, and <a href=\"https://workingcopyapp.com\">Working Copy</a> and gives me the following workflow:</p>\n<ol>\n<li>I start a new post in Drafts with the <a href=\"https://actions.getdrafts.com/a/1VL\">New Draft with Template</a> action, which provides me with the basic front matter structure.</li>\n<li>I write the post in Markdown and add all the meta information about the post to the front matter.</li>\n<li>When the post is ready to be published, I invoke the <em>Post to Eleventy</em> shortcut directly from Drafts.</li>\n<li>The shortcut parses the front matter, extracts the date and title, and generates a slug for the post. The slug is used as file name for the new post.</li>\n<li>Next the shortcut parses the post itself to find Markdown image links and opens a Photo picker for each image it finds. I can select an image and the shortcut will prepare the file (remove metadata, resize, convert to JPG if a photo or to PNG if a screenshot) and save it with the name I defined in the image link.</li>\n<li>Using Working Copy the shortcut writes the files (one Markdown file and all linked images) to the Git repository and creates a commit.</li>\n<li>The last step of the shortcut is to pull and push the repository.</li>\n<li>Pushing the repository causes the Continuous Integration to start a build. It runs the Eleventy and then <a href=\"https://rsync.samba.org\">rsync</a>s the built site to my server.</li>\n</ol>\n<h2>Demo Time</h2>\n<p><video src=\"/blog/2022-04-23-post-to-eleventy-ios-drafts-shortcuts-working-copy/post-to-eleventy-demo.mp4\" controls muted></video></p>\n<h2>Just give me the shortcut</h2>\n<p>Ok, here it is:</p>\n<ul>\n<li><a href=\"https://www.icloud.com/shortcuts/5e8ce104c86a4ce5ae77c4cca6c40834\">Post to Eleventy</a></li>\n<li><a href=\"https://www.icloud.com/shortcuts/42cbdde5f18f4ddf9d9926afadb5cbcb\">Slugify</a></li>\n<li><a href=\"https://www.icloud.com/shortcuts/8a69f9d0c3e24cb2a1e224e0c620cba4\">Very Simple YAML Parser</a></li>\n</ul>\n<p>The <em>Slugify</em> and <em>Very Simple YAML Parser</em> shortcuts are used in the <em>Post to Eleventy</em> shortcut and need to be installed separately to make it work. I should mention that both of these are very simple and I've created them mostly for my own needs at the moment.</p>\n<p>To integrate this shortcut into Drafts I recommend the following two actions:</p>\n<ul>\n<li><a href=\"https://actions.getdrafts.com/a/1VL\">New Draft with Template</a></li>\n<li><a href=\"https://actions.getdrafts.com/a/1xP\">Run Shortcut</a></li>\n</ul>\n<h2>Very Simple YAML Parser</h2>\n<p>I've created the <em>Very Simple YAML Parser</em> because I was frustrated by having to construct the file name manually and I wanted the script to extract this information from the front matter. However, at the moment it can only parse the most basic YAML possible. The following works:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">date</span><span class=\"token punctuation\">:</span> <span class=\"token datetime number\">2022-04-23</span>\n<span class=\"token key atrule\">title</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'String with single quotes'</span>\n<span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'String with double quotes'</span>\n<span class=\"token key atrule\">tags</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>foo<span class=\"token punctuation\">,</span> bar<span class=\"token punctuation\">]</span></code></pre></div>\n<p>No other YAML syntax is supported, don't even try to write multi-line values, quotes in arrays, and so on. This is very simple at the moment, but I've created this as a separate shortcut so that I can potentially improve this in the future.</p>\n<h2>Slugify</h2>\n<p>The <em>Slugify</em> shortcut takes a human-readable string and converts it into an URL slug. It replaces certain special characters with similar looking ASCII characters (<code class=\"language-text\">ä</code> → <code class=\"language-text\">a</code>) and whitespace with dashes. The shortcut contains a dictionary with all the replacements, which is very limited.</p>\n<h2>Limitations</h2>\n<p>Currently the shortcut does not work on Mac OS because it relies on Working Copy which is only available on iOS. I'm not sure if I even want to have this shortcut on Mac OS, because I use the file system for images.</p>\n<h2>Next Steps</h2>\n<p>One thing that I want to add to my workflow is the ability to receive a push notification once the site has been deployed. This should be possible by triggering a <a href=\"https://www.pushcut.io\">Pushcut</a> webhook on my CI once the deploy step is done.</p>",
            "url": "/blog/post-to-eleventy-ios-drafts-shortcuts-working-copy/",
            "title": "Post to Eleventy from iOS with Drafts, Shortcuts and Working Copy",
            "summary": "A workflow to write and publish posts from iOS to an Eleventy blog using Drafts, Shortcuts, and Working Copy.",
            "date_modified": "2022-04-23T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-remark-images-nice-urls/",
            "content_html": "<p>This weekend I fixed how my blog saves generated images, which bothered me (and only me) for a long time. Images are now stored in the same folder as the HTML file that embeds them, for example, the post <a href=\"/blog/favourite-albums-2021/\">My Favourite Albums of 2021</a> and its images are now all stored in <code class=\"language-text\">/blog/favourite-albums-2021/</code>. Previously the images were stored in <code class=\"language-text\">/blog/2022-01-05-favourite-albums-2021/</code>, because the source (Markdown post and original images) where stored in that folder and the <a href=\"https://www.11ty.dev/docs/permalinks/#remapping-output-(permalink)\">permalink option</a> from Eleventy would only rewrite the URL of the HTML file, but not of the images included.</p>\n<p>I was able to make the URLs nicer by two features that I have recently added to the libraries involved in this process:</p>\n<ol>\n<li>I now pass metadata from Eleventy to the remark library in <code class=\"language-text\">@fec/eleventy-plugin-remark</code>. The data includes the Eleventy environment data, global data, and page data. Remark plugins can access this data and therefore use metadata when processing Markdown.</li>\n<li>I added an option to <code class=\"language-text\">@fec/remark-images</code> that can transform the file name of the target images. The option expects a function that receives the file name and the context data.</li>\n</ol>\n<p>None of this was particularly hard to implement, but it took me a long time to figure out the best way to implement this. I didn't want this feature to only work with Eleventy, but it should be useful independent of the context remark is used.</p>\n<p>For this blog, I used the following config to transform the image file names:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">eleventyConfig<span class=\"token punctuation\">.</span><span class=\"token function\">addPlugin</span><span class=\"token punctuation\">(</span>eleventyRemark<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">enableRehype</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">plugins</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">plugin</span><span class=\"token operator\">:</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'@fec/remark-images'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">options</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">srcDir</span><span class=\"token operator\">:</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">'site'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">targetDir</span><span class=\"token operator\">:</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>__dirname<span class=\"token punctuation\">,</span> <span class=\"token string\">'dist'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token function-variable function\">transformTargetFileName</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">fileName<span class=\"token punctuation\">,</span> data</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n          <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>data<span class=\"token punctuation\">.</span>eleventy<span class=\"token punctuation\">.</span>page<span class=\"token punctuation\">.</span>url<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">basename</span><span class=\"token punctuation\">(</span>fileName<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n        <span class=\"token comment\">//other remark-images options...</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token comment\">// other remark plugins...</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>If you are curious, here are links to the two libraries:</p>\n<ul>\n<li><a href=\"https://github.com/florianeckerstorfer/remark-images\"><code class=\"language-text\">@fec/remark-images</code></a> (<a href=\"https://github.com/florianeckerstorfer/remark-images/releases/tag/v0.8.1\">v0.8.1</a>)</li>\n<li><a href=\"https://github.com/florianeckerstorfer/eleventy-plugin-remark\"><code class=\"language-text\">@fec/eleventy-plugin-remark</code></a> (<a href=\"https://github.com/florianeckerstorfer/eleventy-plugin-remark/releases/tag/v3.1.1\">v3.1.1</a>)</li>\n</ul>",
            "url": "/blog/eleventy-remark-images-nice-urls/",
            "title": "Nicer Image URLs with eleventy-plugin-remark and remark-images",
            "date_modified": "2022-04-30T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/trieste-may-2022/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBgj/xAAnEAACAQMEAgIBBQAAAAAAAAABAgMABBEFBhIhMUETUYFCcXKRsf/EABgBAAMBAQAAAAAAAAAAAAAAAAECAwQF/8QAHxEAAwAABgMAAAAAAAAAAAAAAAECAxESEyExMkFR/9oADAMBAAIRAxEAPwDTU96W+nSJDNDK6lSxYecY8/1WGjSW26dQENjLzjETNd80J4L+kjj2eWQOvon1VfbW0hdw3FxdSgx3jLHByRWDRhGJPYJHfXXrzV/a+29L0q1lvLC243kkXxs0RGCOTEEgHAA9YA/PdF0vQ04dVzXREOwbW+JkiWBwhMbfDBKQpHkHB8j6pXS2mtS6bealDa6WscD3JlWWKQYnLKpaQj0eWQf40oamPtR8JWztRuRs7T8OuYmMaHiMquB4+vOK6TTi0ckkUbFFMJY8cD8ft3SlRfZaPFHnzeUr2m6tURGZgZs5dj6AH+AUpStSOdTeZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_1960-960.jpeg, /blog/trieste-may-2022/IMG_1960-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_1960-640.jpeg, /blog/trieste-may-2022/IMG_1960-1280.jpeg 2x, /blog/trieste-may-2022/IMG_1960-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_1960-320.jpeg, /blog/trieste-may-2022/IMG_1960-640.jpeg 2x, /blog/trieste-may-2022/IMG_1960-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_1960-320.jpeg\" alt=\"Predjama Castle\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">We stopped at Predjama Castle in Slovenia on our way down to Trieste</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFBAb/xAAoEAACAQQBAgQHAAAAAAAAAAABAgMABAURIQaBEhMxQRQVInGRscH/xAAXAQADAQAAAAAAAAAAAAAAAAACAwQF/8QAHhEAAgEDBQAAAAAAAAAAAAAAAAECAxFREhMhIjH/2gAMAwEAAhEDEQA/AKriM3Z5ZD8PMVlHLwuNOvb3+42K1T5ccbySsQsaFzsckAb4/FQfoTP3V11PbR2C2tvMsLljMTKoXQ3sADnvVH6iyXUTYmWOxu8bIXRlkC23lsE0fEVJcjeqfuTwAoU7N3MiDqDqLIxi7+aJj0lAZLeGBHCLrjZbnZ9TSvCYTM3Vxj43s8TmLmHQCvbRhk4A4/velB2yEpQwduKRcDZpa45QiHTO55dzocsff9VqW+SuJpUDlfqBQkDnTcEd6Uqlrgx1KWr0gsF7dxNPHHd3KKkzqAkzIODr0BA9BSlKSVtu5//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_1982-960.jpeg, /blog/trieste-may-2022/IMG_1982-1920.jpeg 2x, /blog/trieste-may-2022/IMG_1982-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_1982-640.jpeg, /blog/trieste-may-2022/IMG_1982-1280.jpeg 2x, /blog/trieste-may-2022/IMG_1982-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_1982-320.jpeg, /blog/trieste-may-2022/IMG_1982-640.jpeg 2x, /blog/trieste-may-2022/IMG_1982-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_1982-320.jpeg\" alt=\"Canale Grande in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Arriving in Trieste and Canale Grande immediately gives you the imperial seaside town feeling</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAYBAwQFBwj/xAAmEAABBAEEAQQDAQAAAAAAAAABAgMEEQAFBhIhQRMiMVEHFGEV/8QAGAEAAgMAAAAAAAAAAAAAAAAAAgMAAQT/xAAcEQEBAAICAwAAAAAAAAAAAAABABESAiEDMVH/2gAMAwEAAhEDEQA/AN2ifuiWjgjUZwdXQpxY6sWAa+DVZT9fc/NK16k65yHfF5QoXWR/bn5Oga+6YbpXBeXYb9vJCiPCj8i/B6/pyxvLXpkbb8yREbXFJ4BLgWCRaqJqz4qsAX5MTxpnZbI1WdOjyy25uOMyoDtB1BQI780od4zz5PdU/LcceWVLUbJPV4wu7Ltd+Rpmn8IyImnw4baQoEMspJWRfZUoE3195Fp0dr0VB1tD3FRUorSBz/hoCvrqjjGWep3LpMXPNwJZ/wBA+nGjtJKR7UNgAYxjJJv/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_1988-960.jpeg, /blog/trieste-may-2022/IMG_1988-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_1988-640.jpeg, /blog/trieste-may-2022/IMG_1988-1280.jpeg 2x, /blog/trieste-may-2022/IMG_1988-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_1988-320.jpeg, /blog/trieste-may-2022/IMG_1988-640.jpeg 2x, /blog/trieste-may-2022/IMG_1988-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_1988-320.jpeg\" alt=\"Scala dei Giganti in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Climbing the Scala dei Giganti rewards you with a nice view of the city</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBwMG/8QAJxAAAgIBBAEEAQUAAAAAAAAAAQIDBBEABRIhBhMiMWFRB0FxgZH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgT/xAAcEQACAgMBAQAAAAAAAAAAAAAAAQIRAyHwYTH/2gAMAwEAAhEDEQA/AKHzjYt33bf69vbaMdytKGrBLCrySRXYkjJ6U/n6+NQfENovLu1C1PtkdWjJFPIZHQEEBCCOIJyuSD2P21rTU7LR1VeosDyTT+oR2YUAbg4+z7f9OvM+EbJu9ahA9uYXK0sErxIevSBGUTI+S2ezqFkyKDhrrFeKDmpb6jk1LZTLI0sNBS/FhmAjI4jvHHTVkKdySzZVKseI3Vfe7AgmNGI6/BJH9aaGvRr8M1feLFj9UZKBAjoCyY1rxu6qozjr3Z+/n5+utTtysCHxLbfTgjWadWRpwzhxgtgjDYz/ACNNNPIy49qV98KWPcJZIoy4PLguSJZBnod4DY0000TbspJUf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_1996-960.jpeg, /blog/trieste-may-2022/IMG_1996-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_1996-640.jpeg, /blog/trieste-may-2022/IMG_1996-1280.jpeg 2x, /blog/trieste-may-2022/IMG_1996-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_1996-320.jpeg, /blog/trieste-may-2022/IMG_1996-640.jpeg 2x, /blog/trieste-may-2022/IMG_1996-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_1996-320.jpeg\" alt=\"Passaggio Joyce in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">James Joyce lived in Trieste for 11 years and the city is very proud</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQGAwUH/8QAJxAAAgEDAwQBBQEAAAAAAAAAAQIDAAQRBRIhBhQxQVETFWGBocH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQT/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQIhAxETMf/aAAwDAQACEQMRAD8A5v0sby3E0WoQxtHKnciZn2sCG5bA4PHo+zn5q1WeuWMd72cDspkbduJy2weF/ZI5+B+ah3d5F2E9jHG/3I5iQhVCLISEA3ecZ8/uofWXR110e+h3Ml1HfXT74bj6YJy65dgfQAHGODWBY+lyoJRkltLw2et2qy3SdpqghVU2uoXOW3Ek/wBFKn2l1b7XcRriRg4xj2B/uaVqUoqhOW7LBpvT+mNHPNPax3E87GWSSYbiWLFuB4HJ+Ky6roGnXVhKs0AIjJkT5DYPP9IpSohmqKrHodvFujSa5CIdqgSegBSlKoR//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2087-960.jpeg, /blog/trieste-may-2022/IMG_2087-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2087-640.jpeg, /blog/trieste-may-2022/IMG_2087-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2087-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2087-320.jpeg, /blog/trieste-may-2022/IMG_2087-640.jpeg 2x, /blog/trieste-may-2022/IMG_2087-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2087-320.jpeg\" alt=\"San Giusto Martire in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Going another hill up gets you to San Giusto Martire</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwUI/8QAKxAAAgEDAwIEBgMAAAAAAAAAAQIDAAQRBSExBhIiUXGhExdBQuHwYoGi/8QAFwEBAAMAAAAAAAAAAAAAAAAAAwECBP/EAB0RAAIBBAMAAAAAAAAAAAAAAAABEQIDEjETIVH/2gAMAwEAAhEDEQA/ALt1NGItB05h4g17KQQcg7Mc/vtzXJu5i1qe3uyWB5/l+7+54qBL3fLrpxVkJkhHawJyNlc59d+fcVXLvqJbCWMSj4uWBKg4Jyw3/P8Ao0beTNEwuzSpDFEQJrmOBjuAZApYefI9P6pXm3qfVrvqHWZ9Qu5ZVaTASNcBY0+1RvxilIByeG0XgEXT8kabJFqFxGg8lWMED3NUrWLKNr22LM7FhG5zj6uoxx+aUo6dIW5slHSFtme3t7u5SGF2jRfAcAEgcrSlKrkyYR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2164-960.jpeg, /blog/trieste-may-2022/IMG_2164-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2164-640.jpeg, /blog/trieste-may-2022/IMG_2164-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2164-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2164-320.jpeg, /blog/trieste-may-2022/IMG_2164-640.jpeg 2x, /blog/trieste-may-2022/IMG_2164-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2164-320.jpeg\" alt=\"Santuario mariano di Monte Grisa in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">A little bit outside of the city is Santuario mariano di Monte Grisa, a massive church in Brutalist architecture</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgMEBf/EACMQAAIBAwQCAwEAAAAAAAAAAAECAwAEEQUSITEGQSNRYSL/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgME/8QAHBEAAQQDAQAAAAAAAAAAAAAAAAEDETEEEjJx/9oADAMBAAIRAxEAPwC0rm/fSrGS4uVIghQu28YHH7VMwapJr2oXWpXD7ZbhxIqb1BSPPx8EHo5r0vO5vMNb0hbOXSZYIn3F7a2ZpVYA/wA7mIHPXX7UXs9C8htLy3mj0W+h2wncY4d5LkYIx9Y9dfVM65tRZnG5lb9JQkMrr8TR7QSMNKnBzz66zmlc5Eowt1DeiVQFxiBDwPYY5zSoQoShbisRWauc0pWgY2kB8F1VjjsjNKUoA//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2182-960.jpeg, /blog/trieste-may-2022/IMG_2182-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2182-640.jpeg, /blog/trieste-may-2022/IMG_2182-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2182-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2182-320.jpeg, /blog/trieste-may-2022/IMG_2182-640.jpeg 2x, /blog/trieste-may-2022/IMG_2182-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2182-320.jpeg\" alt=\"Santuario mariano di Monte Grisa in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Santuario mariano di Monte Grisa consists of triangles, inside and out</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYHAwT/xAAoEAABAwQABAYDAAAAAAAAAAABAAIDBAURIQYSMWETIkFCUcEycdL/xAAXAQEAAwAAAAAAAAAAAAAAAAAFAgQG/8QAJBEAAgECAwkAAAAAAAAAAAAAAAECEZEDEvAUITFBUWGB0dL/2gAMAwEAAhEDEQA/AK+nu3D8X43qSInqCyQfS7svNgLwXXlzwTo8sv2FmEd+uEL2F0VJWSvGXiEeffrnoT29VRQXCOaWZppJICMbljAD/wBEJFYubnqwPOEsJb0rP6LE3zhT3Xsg92P/AJRRTp2A4a1gA1jCKdO714K+1PorP2YrwveKoVTYfJiMPLXbyCcb67x3yr+kuVRS2WnrObx31bhzsmJcxuT7RnXT5REbFuoy0nFpntqnuZO8NJA+EREiuBlJukmf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2184-960.jpeg, /blog/trieste-may-2022/IMG_2184-1920.jpeg 2x, /blog/trieste-may-2022/IMG_2184-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2184-640.jpeg, /blog/trieste-may-2022/IMG_2184-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2184-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2184-320.jpeg, /blog/trieste-may-2022/IMG_2184-640.jpeg 2x, /blog/trieste-may-2022/IMG_2184-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2184-320.jpeg\" alt=\"Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View on Trieste from Santuario mariano di Monte Grisa</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgcI/8QAJxAAAQIGAgIABwAAAAAAAAAAAQIDAAQFERIhEzEGQQcUIlFhscH/xAAYAQEAAwEAAAAAAAAAAAAAAAAEAQIDBf/EAB0RAAIBBAMAAAAAAAAAAAAAAAABAgMRMUITIUH/2gAMAwEAAhEDEQA/AOBqoiJejrqzjyXBy8SJcOWWo62oehsW+8aylfDGtVXwxPkElLc4Fytg/SUosTkCSL9dRTuUWZmKe68+T8w44HVlaQArexkOv5HcJXzB13wVFJUpqn0/DF1DL4U+tsC1gQMU9XN79QfkaYlUoyWPDzO9KNodUHXkpXfaSg6/EIsvIHk1GsTL6G2QArDJJJ5Laz37PcI2TuHfRoDVZyYeaQ46cSRpIt+ojqs864jjXioBVwSL216hCB7HS0IqZTJWbleaZQXHFKN1EwhCLSk75Ipwi4ptH//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2262-960.jpeg, /blog/trieste-may-2022/IMG_2262-1920.jpeg 2x, /blog/trieste-may-2022/IMG_2262-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2262-640.jpeg, /blog/trieste-may-2022/IMG_2262-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2262-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2262-320.jpeg, /blog/trieste-may-2022/IMG_2262-640.jpeg 2x, /blog/trieste-may-2022/IMG_2262-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2262-320.jpeg\" alt=\"Grotta Gigante\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Grotta Gigante is a giant cave in the Trieste Karst. The cave is impressive to visit, but hard to photograph</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHAQQF/8QAJxAAAQMDAwIHAQAAAAAAAAAAAQIDBAAFEQYSIQcxExQiQVFhcTL/xAAYAQACAwAAAAAAAAAAAAAAAAABBAACA//EABsRAAICAwEAAAAAAAAAAAAAAAABAhESITED/9oADAMBAAIRAxEAPwCqem+nvPMT5rSMNNgIDjiuCvvjH3jHHzVmwbbIlh2MqDFZaabRl+QspTjH87QM7jxzwBxxk1jonbyxpML2FbEiUUeKD3OBwR7c+9STUFyRp51xhqzSLjN8NczDLm7agZypRPPBz+Ck7uTY8o4wRoI0pZ1NN72EAbcpDysqAPq5x+0rjXa7PPrjS7WmR5GVHQ80loBxKM8FOfDVghQVkZ7/ALSji3uy2UVqibdN2UQtF29qOAEHavke5CagGsbzLHVpuKSlUdy3BsoOcbXE7lDv8ilKEOE9eIp2bdrgwWmok6VGbQjbtYeUgKIUfUQD3+6UpW6WhKTdn//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2271-960.jpeg, /blog/trieste-may-2022/IMG_2271-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2271-640.jpeg, /blog/trieste-may-2022/IMG_2271-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2271-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2271-320.jpeg, /blog/trieste-may-2022/IMG_2271-640.jpeg 2x, /blog/trieste-may-2022/IMG_2271-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2271-320.jpeg\" alt=\"Grotta Gigante\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Stalactites and Stalagmites in Grotta Gigante</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwIE/8QAKBAAAgEDAwIFBQAAAAAAAAAAAQIDAAQRBRIhEzEGFEFRYSJxodHw/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwIABP/EABsRAAMAAwEBAAAAAAAAAAAAAAABAgMRIRIx/9oADAMBAAIRAxEAPwDRdN11LqIyRWrpMDteLOWU/r5rq6uLy6JUWaBO5MkgU49+Kyzzt/e3phk03FwN22Qq0H0j74Pr+a9d3PrMECb1SW2UEzQwSFRLx2bnJ/s085Hr4FUd164TjeIJuvPHa20HSikMYaRmYsR3OQQMe1KzqTUdStpHHljCrkuqNHKcA9uVBBpUPJRSiNFvRVjt9sahFznj3qH1KWSNsI7D5HFKUqOLI+lbnduq3Ocn1pSlYJn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2279-960.jpeg, /blog/trieste-may-2022/IMG_2279-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2279-640.jpeg, /blog/trieste-may-2022/IMG_2279-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2279-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2279-320.jpeg, /blog/trieste-may-2022/IMG_2279-640.jpeg 2x, /blog/trieste-may-2022/IMG_2279-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2279-320.jpeg\" alt=\"Canale Grande in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Canale Grande is also beautiful just before the storm hits</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcGAv/EAC0QAAEDAwIDBQkAAAAAAAAAAAECAwQABRESEwYhMQcUMkFhFSJCUXGBkaGx/8QAFQEBAQAAAAAAAAAAAAAAAAAABQT/xAAcEQEAAwADAQEAAAAAAAAAAAABAAMRAgQhMUH/2gAMAwEAAhEDEQA/AOfYVqldlcrS0TPdRoUQnTlQOQMfXFRrgC3rcvokhhe3tuBtxSTpKgCMA/Pn0q/NXW3TYcO3rQqOh+S5E3QeWtKDpJB+DzBrJ8IWqNYrNa0uPImSGpq3kpR4VJzhSlfrHqaOo7A1KHrEL6nlab8JBpDat9zkPEetK2PEE+0SLvJc7q2xlZ91LafzzNKr42qbkhagc2VBq5GLCRJYhwkvglwL2QcLPVXPz9ancriOXBVIMJmFHUvCSpuOkEjOf6AftSlG0H5Gex4aTGSpG++tx1lkrUck6eppSlJnyDrrP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/trieste-may-2022/IMG_2281-960.jpeg, /blog/trieste-may-2022/IMG_2281-1920.jpeg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/trieste-may-2022/IMG_2281-640.jpeg, /blog/trieste-may-2022/IMG_2281-1280.jpeg 2x, /blog/trieste-may-2022/IMG_2281-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/trieste-may-2022/IMG_2281-320.jpeg, /blog/trieste-may-2022/IMG_2281-640.jpeg 2x, /blog/trieste-may-2022/IMG_2281-960.jpeg 3x\" src=\"/blog/trieste-may-2022/IMG_2281-320.jpeg\" alt=\"Piazza Sant&#x27;Antonio Nuovo in Trieste\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Piazza Sant'Antonio Nuovo at night</figcaption></figure><p></p>",
            "url": "/blog/trieste-may-2022/",
            "title": "Trieste (May 2022)",
            "summary": "Photos from my vacation to Trieste in May 2022.",
            "date_modified": "2022-06-13T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/mauritius/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgMEB//EACcQAAIBAwMDAwUAAAAAAAAAAAECAwAEEQUhQQYSURMikRQVIzFS/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgMEBQb/xAAgEQACAgEDBQAAAAAAAAAAAAABAgADEQQSITEyQcHw/9oADAMBAAIRAxEAPwCD6asm1Awy/TpHawIAWUlTkHf3Ejc8mrnp/o2F27WMuZGfAEkwcnkYIO/INZaNNpOmRT6a8zX3pv8AjazhacOp3x7QcdpyN61X9pp+qrK1rpl9HKpwJWCQjPnBbf4qanbWmT3QrBYzY8S1w6g6RgFJz4IPHFK8xsui5L23Wd9PmVmJBDai8XP842HilPGrijpm+ElukrtvuCsIoFzAyEJGFyB2kZxjNXWNRJHE26mPI9u3dvz5xilK5ehi77XORj3NmvipSOs7hGO0fv5pSlXwZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3365-960.jpg, /blog/mauritius/IMG_3365-1920.jpg 2x, /blog/mauritius/IMG_3365-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3365-640.jpg, /blog/mauritius/IMG_3365-1280.jpg 2x, /blog/mauritius/IMG_3365-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3365-320.jpg, /blog/mauritius/IMG_3365-640.jpg 2x, /blog/mauritius/IMG_3365-960.jpg 3x\" src=\"/blog/mauritius/IMG_3365-320.jpg\" alt=\"Beach at Salt of Palmar in Mauritius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Beach at Salt of Palmar</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBAf/xAAmEAABAwQBAwQDAAAAAAAAAAACAQMEAAURIRIxQVEGExQiB2Hx/8QAFwEBAQEBAAAAAAAAAAAAAAAABQQCBv/EACERAAIBAwMFAAAAAAAAAAAAAAABAgMEIQUREzEzUWGB/9oADAMBAAIRAxEAPwCdvthlRrSNvtE9x+DHQ3Y5oKNOEhECKJF0UU2Wc7TxUrb4TsiG/aSknCmPvojrR9HWx2hFhNbwuM71qr+FHbceSSwRjHQeatNmoIWO+t1nra3iO7yG4sQ3m2wBFcZLkfLaOCaKmCyq5z4qZXClgRq6TKlFZ+npn47szMT0tGCVa2n3i+xOuovI9JhVyvjH6pWZ7vpRkQ+ePxpJiJG2uR3jqiZ6a7UqhSfgL4/ZJWnDbAA2iCAlwEU6IPHGK1eR8PZFwxBwAIuK90/tKUSup2lz2jmnzH4pNNtmqjwz9lXytKUrMm9wZLB//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3374-960.jpg, /blog/mauritius/IMG_3374-1920.jpg 2x, /blog/mauritius/IMG_3374-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3374-640.jpg, /blog/mauritius/IMG_3374-1280.jpg 2x, /blog/mauritius/IMG_3374-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3374-320.jpg, /blog/mauritius/IMG_3374-640.jpg 2x, /blog/mauritius/IMG_3374-960.jpg 3x\" src=\"/blog/mauritius/IMG_3374-320.jpg\" alt=\"Marina and Florian on the beach\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Marina and Florian on the beach</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYDBQf/xAArEAACAQMDAQUJAAAAAAAAAAABAgMABBEFEiFBBhMicbEHJDEyQlFhocH/xAAXAQEBAQEAAAAAAAAAAAAAAAACBQME/8QAHxEAAgIABwEAAAAAAAAAAAAAAAECEQQTFDFBUqFi/9oADAMBAAIRAxEAPwC3h02Kf3hbm8WYgDAcpgD79cVpdx6vbwzJaXTv3h5M7bmH4Xp/ajbjtetqGdbNlUfU0y8nywfWuRJ7Rr9wSunMMnAG458+RWuZCLuzicJtVTRaRaGCGe9vytw53MNgPqaV5/J201u5beI5F6FY51AH6+NKerXbwKwnz6TN8r3WnrcNK6StNsYpjxDIHOQayfdFqFtEJHKRnbyfmyOtKVIjsUuTK6kke5lHeONrFfCcZpSlJBtn/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3445-960.jpg, /blog/mauritius/IMG_3445-1920.jpg 2x, /blog/mauritius/IMG_3445-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3445-640.jpg, /blog/mauritius/IMG_3445-1280.jpg 2x, /blog/mauritius/IMG_3445-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3445-320.jpg, /blog/mauritius/IMG_3445-640.jpg 2x, /blog/mauritius/IMG_3445-960.jpg 3x\" src=\"/blog/mauritius/IMG_3445-320.jpg\" alt=\"Southern coast of Mauritius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Southern coast of Mauritius</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgP/xAAmEAACAQQCAQIHAAAAAAAAAAABAwIABBESBVEhBjEHEyJhcZKh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwQAAf/EAB8RAQEAAAUFAAAAAAAAAAAAAAEAAgMEEUETFSExQv/aAAwDAQACEQMRAD8AqEc56mfBSrK55Mqlsdi2WRLrMiPB7ru7k/WdoiHy7mSWZwIsvNiR2fcf2tExYkoKTfsEckyE7bWJ/UVOtbbjpo1YxbTj6zHwScY9yCcVMIHLWGi87LZHj/VnxDRb6M4YXh2JDpW0Z7D7EEZFK0zbpK5CCLxSYRGNNyMUrdbFL27L5a2417HQmGSMgO/NQOdTBcE3Kxqwz0OD4I/HdKUX2zPuixvHAY2Bx2M0pSkuK3//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3468-960.jpg, /blog/mauritius/IMG_3468-1920.jpg 2x, /blog/mauritius/IMG_3468-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3468-640.jpg, /blog/mauritius/IMG_3468-1280.jpg 2x, /blog/mauritius/IMG_3468-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3468-320.jpg, /blog/mauritius/IMG_3468-640.jpg 2x, /blog/mauritius/IMG_3468-960.jpg 3x\" src=\"/blog/mauritius/IMG_3468-320.jpg\" alt=\"Seven-colored sands of Chamarel, Mauritius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The seven-colored sands of Chamarel</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQGB//EACkQAAICAgECAgsAAAAAAAAAAAECAxEABBIFIWFxBhQWMUFDUnKBgpH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAwQB/8QAHhEAAgEEAwEAAAAAAAAAAAAAABEBAgMSURMiMUH/2gAMAwEAAhEDEQA/AOpSdbPGpJyF8BWSbfphDqpTTSTWKPEi68s5306VdzihkLAigrt7/wC98ukMWvCFEcayH9ifKsdnba+kCrTZqvbXV+X66y/bVeGMwp2YkJDQxyn62fjf4xm5W9BHJszq72xq6+w0L08LqFf496u8kbqW1O2wJJSQsnHt2sccYyGuOzKaPCwa0JRS6BiRdknGMYhyOiD/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3500-960.jpg, /blog/mauritius/IMG_3500-1920.jpg 2x, /blog/mauritius/IMG_3500-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3500-640.jpg, /blog/mauritius/IMG_3500-1280.jpg 2x, /blog/mauritius/IMG_3500-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3500-320.jpg, /blog/mauritius/IMG_3500-640.jpg 2x, /blog/mauritius/IMG_3500-960.jpg 3x\" src=\"/blog/mauritius/IMG_3500-320.jpg\" alt=\"Black River Gorges, Mauritius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Black River Gorges</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQYH/8QAJBAAAQQBAwMFAAAAAAAAAAAAAQACAwQFESExElFhFCJBwdH/xAAZAQACAwEAAAAAAAAAAAAAAAABAgADBQb/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQNRAkEREhP/2gAMAwEAAhEDEQA/APWsKGemHuBB8qS9Uim42d4K4fGZHJtHUyg5xPyZx+LSblciN5MeSewtNH0qnNHYEnTL8sDGvIbK7QIsC9buTT9YoujJG4Ftu578Il9I7J1zolbZkjgAY7QaKtNPI5x1PCIuf2a2iFsjjrqURE3LAf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3562-960.jpg, /blog/mauritius/IMG_3562-1920.jpg 2x, /blog/mauritius/IMG_3562-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3562-640.jpg, /blog/mauritius/IMG_3562-1280.jpg 2x, /blog/mauritius/IMG_3562-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3562-320.jpg, /blog/mauritius/IMG_3562-640.jpg 2x, /blog/mauritius/IMG_3562-960.jpg 3x\" src=\"/blog/mauritius/IMG_3562-320.jpg\" alt=\"Rainbow on the beach\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Rainbow on the beach</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgcE/8QAKBAAAgEDAwIFBQAAAAAAAAAAAQIEAAMRBRJBITEGEyJRwQcVYXGh/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEAP/EABsRAAICAwEAAAAAAAAAAAAAAAABAiEREjFh/9oADAMBAAIRAxEAPwDm9iLKhNCkxd7uqJjqM7iB0yeM9jV/421jUo0mFImzJRkiz5RVpBYkjPpCdgMYJPP7NWsaKwkwICXlu2Q9redwAwGIJPAGAP7U31FgQNR09JVvUkuzIrbQqOD0YgHjgFjSIyee0C4VRyqx4jux0Nu/Pu22B6KhuW1x+ApA+aVtdOhIiX1v/bM+c2Ddt2rpI9wxHbvSi38NobCRCsLGZAnp3Hp7c/NQJp0VYilbIBVwAQTzmlKRF0XNLB7X02GpAEe1gDoCoOKUpSm3klfT/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3663-960.jpg, /blog/mauritius/IMG_3663-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3663-640.jpg, /blog/mauritius/IMG_3663-1280.jpg 2x, /blog/mauritius/IMG_3663-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3663-320.jpg, /blog/mauritius/IMG_3663-640.jpg 2x, /blog/mauritius/IMG_3663-960.jpg 3x\" src=\"/blog/mauritius/IMG_3663-320.jpg\" alt=\"Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQYH/8QAJRAAAgEDBAICAwEAAAAAAAAAAQIDAAQRBRIhMQYTMkEUUZHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgMB/8QAGxEBAQACAwEAAAAAAAAAAAAAAQACERIhQTH/2gAMAwEAAhEDEQA/API/ApJZtS055pFZYZBJF7ACpf2KxB+z1Wl5I8tzafkSyKu5mULjALbmP9Arm9MjewuNkwCxouGJOB8sn/K1fKyLmI29mgjW2RHkAJwXY438no8DIqLg8t2b8qmk3qi1O4MQXJXo4FKm0bxTV7mz9tvEzxM2Q5wN3XI56pWuJMGr2ch1LyJVvQJYjHK3qPxBCnHFSanKLKMXYijmbfsMcoJQ8LyQCD9/ulKt5RftR0m/uUgkCSsF9hIGc464GfqlKUU7kPV//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3698-960.jpg, /blog/mauritius/IMG_3698-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3698-640.jpg, /blog/mauritius/IMG_3698-1280.jpg 2x, /blog/mauritius/IMG_3698-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3698-320.jpg, /blog/mauritius/IMG_3698-640.jpg 2x, /blog/mauritius/IMG_3698-960.jpg 3x\" src=\"/blog/mauritius/IMG_3698-320.jpg\" alt=\"Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcCAwQG/8QAJRAAAQMDAwQDAQAAAAAAAAAAAQIDBAARIQUSEyIxUWEGQYGx/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABwRAAICAwEBAAAAAAAAAAAAAAABAgMUMVEREv/aAAwDAQACEQMRAD8AlkiUGZLwHGEl7h2oVtWvAN7+r2BrkYmliaytOziK7tuqG0AD6UDcfXfyDVBe0OOhpcl9DqgrqK21NhKsi2cAkH9rczSITUiOyS9Hcc78hJF7dz0+yP2sOXW9ItiSJ0jVIERAS7JhyHVda1oQpefHfBx2pVEl/AW3HAqO0662RcKDAH9TSkyqHthiz4Y1BhtkFKW0dZ6zsF1ZvnHuu81pMZ/QHJCwrlauE2sB5yLZpSmq0xZt+nmi4tJsDilKVH5XCisn1n//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3711-960.jpg, /blog/mauritius/IMG_3711-1920.jpg 2x, /blog/mauritius/IMG_3711-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3711-640.jpg, /blog/mauritius/IMG_3711-1280.jpg 2x, /blog/mauritius/IMG_3711-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3711-320.jpg, /blog/mauritius/IMG_3711-640.jpg 2x, /blog/mauritius/IMG_3711-960.jpg 3x\" src=\"/blog/mauritius/IMG_3711-320.jpg\" alt=\"Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAQFBv/EACQQAAIBAwMEAwEAAAAAAAAAAAECAwAEEQUSIQYTMUEzUWGB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAMEBf/EACERAAEEAQMFAAAAAAAAAAAAAAEAAgMRBCEx8CQygbHR/9oADAMBAAIRAxEAPwDNRwW+mWR1IzXd1th70ZecI6ZHLBQclSTtz6zUu86uFxNbdq5misANxMzl2jOMlQQMnkD6rLWFnHqkUsV5qjQrDbfDjdk5AypPAYfypNvpdgl7JbdmG4SON2G+Pa7tjbyR5++axJMeI6u35smxkVQV/fRu11I76w9lvO8QqxcgH2Tg8n8pVC9lBCscdva96JVGHR2wT79HwcilUjHjIs3zwlmQA1Xv6o2mIoEk2CWlVo5RnAkGAecftabqaCKz0yMWsSR7pApIHOCoOMnnzSlTTnqowhvYSqC3jZw+JpUCttAVuBwKUpVbnGzqkgBf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3765-960.jpg, /blog/mauritius/IMG_3765-1920.jpg 2x, /blog/mauritius/IMG_3765-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3765-640.jpg, /blog/mauritius/IMG_3765-1280.jpg 2x, /blog/mauritius/IMG_3765-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3765-320.jpg, /blog/mauritius/IMG_3765-640.jpg 2x, /blog/mauritius/IMG_3765-960.jpg 3x\" src=\"/blog/mauritius/IMG_3765-320.jpg\" alt=\"Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sir Seewoosagur Ramgoolam Botanical Garden in Pamplemousses</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFAwf/xAAnEAABAwMEAQMFAAAAAAAAAAABAgMEAAURBhIhMSITQVEVI2Ghsf/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAf/EABsRAAICAwEAAAAAAAAAAAAAAAABAhEDBBIT/9oADAMBAAIRAxEAPwDgu23GAxblxZEgyXnVIyleAOsVqxtE3ibPQ9cHY48sqS8/uPfXGf1UX9JTbp1oW45HguPN79zSvTyrcMJCeyT17j5xWheLlPuUt+329D8SGnCXVJcKC+eTgrwSBweE465NXYdqWFvlVZFPXWRLp3RcTtV6NtjqYcy8QUvtJCFBx8kjHHsDjrqlePv2mBCUIr67chxrxUn0HFnvPJJGTz8Uo/aQvCKebpyDPfRJnF6Q40rx3r4GOcYqnd0/bRAakpjIStJCEpwCEj8ZpSpLdjpGQ5Dj71faHfsoj+GlKUhh/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3847-960.jpg, /blog/mauritius/IMG_3847-1920.jpg 2x, /blog/mauritius/IMG_3847-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3847-640.jpg, /blog/mauritius/IMG_3847-1280.jpg 2x, /blog/mauritius/IMG_3847-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3847-320.jpg, /blog/mauritius/IMG_3847-640.jpg 2x, /blog/mauritius/IMG_3847-960.jpg 3x\" src=\"/blog/mauritius/IMG_3847-320.jpg\" alt=\"Port Louis, Mauritius\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Port Louis</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQYB/8QAJhAAAgICAgAFBQEAAAAAAAAAAQIDEQAEBRIGITFBURNhYnGBkf/EABYBAQEBAAAAAAAAAAAAAAAAAAQCBv/EAB0RAAICAwADAAAAAAAAAAAAAAABBBECAxIFIVH/2gAMAwEAAhEDEQA/AMXwih3+O2SkJfZ7jpLG9FPkEH5vOi47w7G69p5pEZQSQqAgfskj/Mtw+CI+L1oxw/I8gkLebd5FJZr9x1r0ySLV3NWhJu7LUbuRUN/3rjIfkONKwb9oJIivt5VaPZ9X6chjgiRoo6VWVAnYV6kUfP73jLB3ttD1E60PwBxj1M10CerOzp9ZiyUao+1ZHJEjFlZQRdeeMZkWadGbPpQiVqBA+AcYxlWyeV8P/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3867-960.jpg, /blog/mauritius/IMG_3867-1920.jpg 2x, /blog/mauritius/IMG_3867-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3867-640.jpg, /blog/mauritius/IMG_3867-1280.jpg 2x, /blog/mauritius/IMG_3867-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3867-320.jpg, /blog/mauritius/IMG_3867-640.jpg 2x, /blog/mauritius/IMG_3867-960.jpg 3x\" src=\"/blog/mauritius/IMG_3867-320.jpg\" alt=\"Mont Choisy Beach\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Mont Choisy Beach</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAmEAABAwQBBAEFAAAAAAAAAAABAgMEAAURITEGEkGRIhMUQlFh/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIGBf/EAB8RAAEEAgIDAAAAAAAAAAAAAAEAAgMhBBEFEjFRwf/aAAwDAQACEQMRAD8As7nDOSQKz81lxtbIQ2FBbgQreCAQdj97xqtXCvNoui5Upm5Nqg4SlptTKkrBGe4kHZzr1XPuuL2zDkwnpyTHZkZbYbWkkoVkZWcceN8jwOao5eSjYwFps+FjQ4kheQ4UPoVkYW90qOu8SSe15qQHEfAqaSe1ePy480pDzUe6FJxgP1ZUK9KTAkvJjNpT9cBbmST3H3ipFgskTqlhYvIW+IrhQ1sfH+7HNKVHMJ67VC69LRudEwFuKV97c0lRyQmRgesUpSj2PtDQX//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mauritius/IMG_3887-960.jpg, /blog/mauritius/IMG_3887-1920.jpg 2x, /blog/mauritius/IMG_3887-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mauritius/IMG_3887-640.jpg, /blog/mauritius/IMG_3887-1280.jpg 2x, /blog/mauritius/IMG_3887-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mauritius/IMG_3887-320.jpg, /blog/mauritius/IMG_3887-640.jpg 2x, /blog/mauritius/IMG_3887-960.jpg 3x\" src=\"/blog/mauritius/IMG_3887-320.jpg\" alt=\"Cap Malheureux\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cap Malheureux</figcaption></figure><p></p>",
            "url": "/blog/mauritius/",
            "title": "Mauritius (September 2022) aka The Honeymoon",
            "summary": "Photos from our honeymoon in Mauritius in September 2022.",
            "date_modified": "2022-10-30T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/wedding/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcDCAX/xAApEAABAwMEAAQHAAAAAAAAAAABAgMEAAURBhIhMRNBUWEHFCIjcZHB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEAf/EACARAAIBBAEFAAAAAAAAAAAAAAECAAMEERITIUFxkeH/2gAMAwEAAhEDEQA/AIdBts6ySIW5akyZrSVR0oHiAhXWcfnryPfVbBUmYFqmuFpbJ8PxSn6UkE8E+vtXT+jtK6BuDkOXb7K3IdabCW5DJUpl9IHIO449Rnz4qA6zVLvUkNx7bGtFmjOKDNtiN7EHBxvVgnesgAZJPXHFSEIrBqkKpoFGsz1AyqZKjvN3OAFKjt7w0jYEq29EJ4yBjPvSvBQw05n7WQnABKcZGAf7SqmpW4ODj39iS5PUztPQUBm0WNqDD3BmM2kNlXJ6ByfcmoV8RGG7frC7sxUBLaZOQnyG4BRH7JpSob8DRfM1u0m1lkr+UUSEHLijynrnqlKUm4A5DAn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wedding/wedding-960.jpg, /blog/wedding/wedding-1920.jpg 2x, /blog/wedding/wedding-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wedding/wedding-640.jpg, /blog/wedding/wedding-1280.jpg 2x, /blog/wedding/wedding-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wedding/wedding-320.jpg, /blog/wedding/wedding-640.jpg 2x, /blog/wedding/wedding-960.jpg 3x\" src=\"/blog/wedding/wedding-320.jpg\" alt=\"Marina and Florian directly after saying yes\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><span role=\"img\" aria-label=\"red heart\">❤️</span><span role=\"img\" aria-label=\"red heart\">❤️</span><span role=\"img\" aria-label=\"red heart\">❤️</span></p>",
            "url": "/blog/wedding/",
            "title": "17.09.2022",
            "summary": "Marina and I got married in September.",
            "date_modified": "2022-10-30T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/book-report-2022/",
            "content_html": "<p>In 2022 I have read 29 books, which is a lot less then in the previous year. A couple of the ones I've read were quit thick, but most importantly after I got Covid-19 in March I've lost all motivation to read after work for three months. In July I was feeling better and I've read 21 books since then.</p>\n<p>This year I've spent a lot of time with Hillary Mantel and her Thomas Cromwell saga, but I was moved most by Crying in H Mart by Michelle Zauner and Der Gesang der Berge (The Mountains Sing) by Nguyễn Phan Quế Mai.</p>\n<p>I have spent the last couple of days reading through best books of 2022 lists and my queue is now filled to the brim again.</p>\n<ul>\n<li><a href=\"/blog/clayton-m-christensen-the-innovators-dilemma/\"><strong>The Innovator’s Dilemma: When New Technologies Cause Great Firms to Fail</strong></a> by Clayton M. Christensen ★★★★★</li>\n<li><strong>The Culture Map: Decoding How People Think, Lead, and Get Things Done Across Cultures</strong> by Erin Meyer ★★★★☆</li>\n<li><strong>Badass: Making Users Awesome</strong> by Kathy Sierra ★★★★★</li>\n<li><strong>Responsible JavaScript</strong> by Jeremy Wagner ★★★★★</li>\n<li><strong>Müll</strong> (Brenner, #9) by Wolf Haas ★★★☆☆</li>\n<li><strong>Die Geschichte der getrennten Wege</strong> (L'amica geniale, #3) by Elena Ferrante ★★★★☆</li>\n<li><strong>Die Geschichte des verlorenen Kindes</strong> (L'amica geniale, #4) by Elena Ferrante ★★★★★</li>\n<li><strong>Design for Safety</strong> by Eva PenzeyMoog ★★★★★</li>\n<li><strong>Der Gesang der Berge</strong> by Nguyễn Phan Quế Mai ★★★★★</li>\n<li><strong>Perhaps the Stars</strong> (Terra Ignota, #4) by Ada Palmer ★★★★★</li>\n<li><strong>The Beauty of the Husband: A Fictional Essay in 29 Tangos</strong> by Anne Carson ★★★☆☆</li>\n<li><strong>Erste Person Singular</strong> by Haruki Murakami ★★★★☆</li>\n<li><strong>Wolf Hall</strong> (Thomas Cromwell, #1) by Hilary Mantel ★★★★☆</li>\n<li><strong>Crying in H Mart</strong> by Michelle Zauner ★★★★★</li>\n<li><strong>Bring Up the Bodies</strong> (Thomas Cromwell, #2) by Hilary Mantel ★★★★☆</li>\n<li><strong>Conversations With Friends</strong> by Sally Rooney ★★★★★</li>\n<li><strong>Matrix</strong> by Lauren Groff ★★★☆☆</li>\n<li><strong>Moving Fast</strong> by M.C. Kaindl ★★★★☆</li>\n<li><strong>The Silmarillion</strong> by J.R.R. Tolkien ★★★★☆</li>\n<li><strong>Beautiful World, Where Are You</strong> by Sally Rooney ★★★★★</li>\n<li><strong>Circe</strong> by Madeline Miller ★★★★★</li>\n<li><strong>Dune</strong> (Dune, #1) by Frank Herbert ★★★☆☆</li>\n<li><strong>Unfinished Tales of Númenor and Middle-earth</strong> by J.R.R. Tolkien ★★★☆☆</li>\n<li><strong>The Gates of Europe: A History of Ukraine</strong> by Serhii Plokhy ★★★★☆</li>\n<li><strong>The Mirror And The Light</strong> (Thomas Cromwell, #3) by Hilary Mantel ★★★☆☆</li>\n<li><a href=\"/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/\"><strong>Engineering Management for the Rest of Us</strong></a> by Sarah Drasner ★★★★★</li>\n<li><strong>GRM: Brainfuck</strong> by Sibylle Berg ★★★★☆</li>\n<li><strong>Technology Strategy Patterns: Analyzing and Communicating Architectural Decisions</strong> by Eben Hewitt ★★★★☆</li>\n<li><strong>Serge</strong> by Yasmina Reza ★★★★☆</li>\n</ul>\n<p>Previously: <a href=\"/blog/books-2021/\">2021</a>, <a href=\"/blog/books-2020/\">2020</a>, <a href=\"/blog/books-2019/\">2019</a>, <a href=\"/blog/books-2018/\">2018</a>, <a href=\"/blog/books-2017/\">2017</a>, <a href=\"/blog/books-2016/\">2016</a></p>",
            "url": "/blog/book-report-2022/",
            "title": "Book Report 2022",
            "summary": "The list of books I've read in 2022.",
            "date_modified": "2022-12-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/budapest-december-2022/",
            "content_html": "<p>In December Marina and took the train to Budapest and stayed there for a couple of days. It was raining most of the time, but we made the best out of it and had some amazing food, great drinks and still managed to walk the streets of Budapest quite a bit.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYHAQT/xAAqEAABAwQBAwMDBQAAAAAAAAABAgMEAAUGESEHEkETFGEiUYExMjNisf/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAbEQACAwADAAAAAAAAAAAAAAAAAQIRMRITQf/aAAwDAQACEQMRAD8A70WyJu949GjTgHp1vAhuF9ewWj/EoJ8ngpJ0f0+a8/SiOxbsavLUttoNtXZ/uWpRQpKEaJIV8BP3qAxq3X7C82iNphvyRKPttRgVe4SeQE/2BAOj9vzVh1AtuSY5h9zakWdxhq6zFrLrD6Xg2HSCUK7eQo615B2eaSLtWDNMay66KyLJLhdX3FJ9y6VNpcOylscIH4SAKVbWfpVdZ8BEiU+Iji+fSLRWUjxs74PxSpcg9cn4VWFZfcxPaXJEeWr9+5Dfdzo8+Kt5WVSp8eQy7Dt6G/U7yG2e3f0g9u971vnilK1LBYu0Z9d8puSZyw2plKR49MH/AHdKUqIz0//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-1-960.jpg, /blog/budapest-december-2022/budapest-1-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-1-640.jpg, /blog/budapest-december-2022/budapest-1-1280.jpg 2x, /blog/budapest-december-2022/budapest-1-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-1-320.jpg, /blog/budapest-december-2022/budapest-1-640.jpg 2x, /blog/budapest-december-2022/budapest-1-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-1-320.jpg\" alt=\"Train platform, a train on each side of it and a lot of people walking towards the camera; the top half of the image is the roof of in a renaissance revival architecture\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Budapest Keleti train station</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQGBf/EACkQAAIBBAEEAQIHAAAAAAAAAAECAwAEBREhBhIiQVExcQcTFVJhgvD/xAAWAQEBAQAAAAAAAAAAAAAAAAAFAwT/xAAgEQACAgEDBQAAAAAAAAAAAAABAgADIQQRMQUTMkHw/9oADAMBAAIRAxEAPwDvZC6jtsFe5G8t5GtbdQ5UR9ztzoePxsjk8e6j/BrqPM5OS5l/Rb1MTcQLPHc3MoBeUcERD6MCPjQ8f5rXwCC4lvrU6dGRXlVl2rKdgofXO/pVOJxtth8LYY/HI6WtoO2Ne4kheeCT96D6cy1ozAmIXkudjLZOoYe7yVo29qyEEH7UrJR9dW+PBgy9h3XIOxIjaEi+m/3xStI1VzZUjaS7aDBkvR88lxZieXs/NuGZ5HCKCfI6GwN6AAHPoVrJ3ZEBVjwjnX9aUo1MUW/epoPks5fTai5wttNKAXYHfiP3GlKUavEq3M//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-2-960.jpg, /blog/budapest-december-2022/budapest-2-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-2-640.jpg, /blog/budapest-december-2022/budapest-2-1280.jpg 2x, /blog/budapest-december-2022/budapest-2-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-2-320.jpg, /blog/budapest-december-2022/budapest-2-640.jpg 2x, /blog/budapest-december-2022/budapest-2-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-2-320.jpg\" alt=\"Woman in a white wool coat, her hands in her pockets, standing on an escalator and slightly smiling into the camera\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Marina taking the escalator to Budavári Castle</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAcCBAUI/8QAKBAAAgEEAQIEBwAAAAAAAAAAAQIDAAQFERMSgSEiMWEGFSNSY3GS/8QAFwEAAwEAAAAAAAAAAAAAAAAAAgMEBf/EABkRAAIDAQAAAAAAAAAAAAAAAAABAhITMf/aAAwDAQACEQMRAD8AsPzD8CjvWosrCSwVU2p02nHgalbfHeK4yiYmSWMr52hlC67Hx965FveY+7+rAbhUY+Rl6G1+wfWq94vjJsZrqKiMpH9i/wBClTy+tLe1n4pczbxuoG1aNAaUVwann/FzOHuVB9E3vtXaWeRuoQoilKiNetfYnW6UrPiWs1e309xPyXDcshUbZySaUpTBZ//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-3-960.jpg, /blog/budapest-december-2022/budapest-3-1920.jpg 2x, /blog/budapest-december-2022/budapest-3-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-3-640.jpg, /blog/budapest-december-2022/budapest-3-1280.jpg 2x, /blog/budapest-december-2022/budapest-3-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-3-320.jpg, /blog/budapest-december-2022/budapest-3-640.jpg 2x, /blog/budapest-december-2022/budapest-3-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-3-320.jpg\" alt=\"View from a hill on the Danube and Budapest: in the front some buildings with the Danube behind them, in the distance there are some bridges and a boat\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The Danube from Budavári Castle</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAQIEBv/EACcQAAEDBAEDAwUAAAAAAAAAAAEAAgMEBREhBgcSQRMUkTFhgaGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAME/8QAGxEBAQABBQAAAAAAAAAAAAAAAAEUBBNBUWH/2gAMAwEAAhEDEQA/AL4fTnOnNP5WBA/wR8qoKjqFzytsbX2fi74a4PHf68Tu17MEEAEAtcSAR4xjakun1/5vUWy20l+t4bXsa+OonqW4LznLJMjR1o/xaJqZWfHvCzeyUawUXjKyycnmnL2VlK0Hw/LvjX0+yJkeGxe0dJFE3A9Jhzve1z5YZDiKIa8NRFCLtveVDdComAGgBK7X7REQf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-4-960.jpg, /blog/budapest-december-2022/budapest-4-1920.jpg 2x, /blog/budapest-december-2022/budapest-4-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-4-640.jpg, /blog/budapest-december-2022/budapest-4-1280.jpg 2x, /blog/budapest-december-2022/budapest-4-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-4-320.jpg, /blog/budapest-december-2022/budapest-4-640.jpg 2x, /blog/budapest-december-2022/budapest-4-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-4-320.jpg\" alt=\"Empty street, some people are sitting on a stone wall before a lawn and some bushes; a man is looking and walking towards a statue (out of frame); in the distance a church with three spines\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Budavári Castle</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.625%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgIH/8QALBAAAgEDAwEFCQEAAAAAAAAAAQIDAAQRBRIhQQYTIjFxBxQWIzJDYZLB8P/EABgBAAIDAAAAAAAAAAAAAAAAAAABAgME/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAERMUH/2gAMAwEAAhEDEQA/APY9OjlS1jW6uUuJl+9GgUfqDx+f5Up4mWHIjL7eNikZIz5DNUPxVYwXkFrfk2bzNsR51VULc4BYsSM4OMjmru9hh1C1OJZ0DqYxLbS7GIYdGH+8qomNDlNtyglUz7TnAXw4wcYIPXOaVgLj2S6NdTvNJqmty7zkE3zAj145Ockk9SaUhtSuz86a/wBm9K1fULW1a41bu/eI1j+WCFPKg/STk556nyqTpWjWena7rU9mssaCOJhB3rNErYzuCkkBvCORSlITxrIbMXatK008RLEERPtBx19aUpRepR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-5-960.jpg, /blog/budapest-december-2022/budapest-5-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-5-640.jpg, /blog/budapest-december-2022/budapest-5-1280.jpg 2x, /blog/budapest-december-2022/budapest-5-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-5-320.jpg, /blog/budapest-december-2022/budapest-5-640.jpg 2x, /blog/budapest-december-2022/budapest-5-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-5-320.jpg\" alt=\"View from the bottom into a dome, with human figures made out of mesh hanging in various poses around\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Hungarian National Gallery</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQHBQYI/8QAJxAAAQMDAgQHAAAAAAAAAAAAAQACEQMEBRIhBhMUMSJBUWFxkaH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQD/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAETYQP/2gAMAwEAAhEDEQA/ALgpVwwhrpk9gpPXjTDZC59t+Ic61rG9Bk4naahLfeAZKzdtl8u22eaNlkC8EAio+DpneC0blWT2iPNcJvi0wagHyioo8QZwE67O9qOnck/ndEN+Hx62d0zTbJgk+al2zTuNTvXuiLMEG5B5p8TvtERCmj//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-6-960.jpg, /blog/budapest-december-2022/budapest-6-1920.jpg 2x, /blog/budapest-december-2022/budapest-6-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-6-640.jpg, /blog/budapest-december-2022/budapest-6-1280.jpg 2x, /blog/budapest-december-2022/budapest-6-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-6-320.jpg, /blog/budapest-december-2022/budapest-6-640.jpg 2x, /blog/budapest-december-2022/budapest-6-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-6-320.jpg\" alt=\"View across a river, some houses and a church are facing the water and in the back there is another church, some other large buildings and two cranes on top of a hill; the weather is foggy\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Buda from the Pest side of Budapest</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwT/xAAoEAACAQIEBgEFAAAAAAAAAAABAgMAEQQFEjEGExQhIlEHMkJhgbH/xAAYAQACAwAAAAAAAAAAAAAAAAACBAADBf/EABsRAAICAwEAAAAAAAAAAAAAAAABAjEDBBFR/9oADAMBAAIRAxEAPwCuZRiLriYM4nTqUmKp4aRb1fbepLp4bfQbe7VnnCvEc74nHdVicMgdxIwkgV73NjYte2/8q05Xn+Jeez4uAQeenTFGEbe36/NZDwpOx2Ow+USTiENalR0+c5iHBTJI5wwuX5DsPXbSwFu1KtWIj2F4Ub4mRDxSyMiMvKk7ML/aa0qPDxQRZeIl08mKSNLHZWuSKUpxCEaO+TmCVwJW3G4U37D2KUpRBn//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-7-960.jpg, /blog/budapest-december-2022/budapest-7-1920.jpg 2x, /blog/budapest-december-2022/budapest-7-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-7-640.jpg, /blog/budapest-december-2022/budapest-7-1280.jpg 2x, /blog/budapest-december-2022/budapest-7-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-7-320.jpg, /blog/budapest-december-2022/budapest-7-640.jpg 2x, /blog/budapest-december-2022/budapest-7-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-7-320.jpg\" alt=\"Chain bridge at night, a boat is just below the bridge; there are lights on the bridge, the boat and other bank; the bridge is partly covered by construction\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Széchenyi Chain Bridge</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHBP/EACUQAAIBBAEEAQUAAAAAAAAAAAEDAgAEBRESBiExYbEHFCIyQf/EABcBAAMBAAAAAAAAAAAAAAAAAAMEBQH/xAAfEQEAAQMEAwAAAAAAAAAAAAABAAIDEQQhMfAFEoH/2gAMAwEAAhEDEQA/AKOHRHSojOeMtfsOcgd2bppO/PgH0O3ion6kdH3V7ZttMVklrtpwLZqdEykyfIaAIPyDVJkITyOFfaxdJLWa4tj3G9+v5Uwo3WFx75cV3d9wICuZ8b7mpF/WJTSBmUqNBbrqaque8TFmdDZ2EtC3VL2GgfNK0JeWu3gzuUxSwn9SKUJ1942wRg8fYTOXvyV1tdNZbXKuXGJ7fjXPk1C3XFyyTNyoie/BpSkFc4jAHsMk7iID2Ab0DSlKKTV3n//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-8-960.jpg, /blog/budapest-december-2022/budapest-8-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-8-640.jpg, /blog/budapest-december-2022/budapest-8-1280.jpg 2x, /blog/budapest-december-2022/budapest-8-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-8-320.jpg, /blog/budapest-december-2022/budapest-8-640.jpg 2x, /blog/budapest-december-2022/budapest-8-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-8-320.jpg\" alt=\"Rum in a small wine glass, standing on a table from dark wood, another glass is blurry in the background\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Rum at Enso</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHBAYI/8QAJxAAAgEEAQMDBQEAAAAAAAAAAQIDAAQFEQYHEjEhMkETImFxgcH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgD/xAAZEQEAAwEBAAAAAAAAAAAAAAAAAREhAjH/2gAMAwEAAhEDEQA/AOfMVipczkrPH2AR7m7lWGMFu0FmOhs/A2a2fK9NM/xjK2VtyGySI3pkSHslV1k7RvYI/wBqI4Bcw23UHByNIltbx30TNI7fagDAliaujrxmrSe94tNY5W1yEUUso3FKJAhI9N6/fiomcVVTStcrwTLRvB9LHyMjR7DeA2mYbH49KVP5rq7lGyU4x1vam1WR+wzxlmO2LfB0Pd4pRoVBbSNFMsi+5fG6lr6ZxFbKNACQN/aUp69MMVnPcaUpWD//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/budapest-december-2022/budapest-9-960.jpg, /blog/budapest-december-2022/budapest-9-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/budapest-december-2022/budapest-9-640.jpg, /blog/budapest-december-2022/budapest-9-1280.jpg 2x, /blog/budapest-december-2022/budapest-9-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/budapest-december-2022/budapest-9-320.jpg, /blog/budapest-december-2022/budapest-9-640.jpg 2x, /blog/budapest-december-2022/budapest-9-960.jpg 3x\" src=\"/blog/budapest-december-2022/budapest-9-320.jpg\" alt=\"Illuminated sign saying Izakaya and Ramen Bar and an arrow pointing left; the sign is reflected in a window, the surroundings are run-down and dark\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Enso</figcaption></figure><p></p>",
            "url": "/blog/budapest-december-2022/",
            "title": "Budapest in December",
            "summary": "In December 2022 Marina and took the train to Budapest and stayed there for a couple of days.",
            "date_modified": "2023-01-05T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/sibylle-berg-rce/",
            "content_html": "<p>In RCE (Remote Code Execution) Sibylle Berg tells the story of a world that is very similar to ours, but there is more violence, more greed, more surveillance, more AI, more unemployment, more inequality, more oppression, more sexism, more racism. In short, more capitalism and fascism. Nothing bad in the book is science fiction, all of the bad people behave like bad people in the real world, nothing of the broken system described in RCE is invented, everything is grounded in reality, but turned up to 100.</p>\n<p>The system is challenged when group of young hackers from England move into a remote village in Switzerland and start planning a revolution.</p>\n<p>RCE is a successor to GRM, but not a sequel. We know some of the characters (the friends plus Don and Karen) from GRM, but this time the group is no longer so naive to believe that just revealing how fucked up the system is, is enough to change it.</p>\n<p>★★★★★</p>\n<p><small>Also on <a href=\"https://bookwyrm.social/user/florianec/comment/801802#anchor-801802\">BookWyrm</a>.</small></p>",
            "url": "/blog/sibylle-berg-rce/",
            "title": "RCE by Sibylle Berg",
            "summary": "Review of RCE by Sibylle Berg",
            "date_modified": "2023-01-09T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favorite-albums-2022/",
            "content_html": "<p>Looking back at the albums I liked most of 2022, it was not a bad year for new music. Here are some of the albums I liked most.</p>\n<p><a href=\"https://mitski.bandcamp.com/album/laurel-hell\"></a></p><figure class=\"figure\"><a href=\"https://mitski.bandcamp.com/album/laurel-hell\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAUGBAcI/8QAJxAAAgICAQIEBwAAAAAAAAAAAQIDEQAEBQYhEkFRYQcTIiOBsvD/xAAZAQACAwEAAAAAAAAAAAAAAAADBAECBQb/xAAjEQABAwMCBwAAAAAAAAAAAAABAAIDBBEhMUEFEhMyUWGx/9oADAMBAAIRAxEAPwDz9wUZ5Lci0kg1pJmB+5sMwHndm+w885XPcTu9Oyg7fG67a+wPFHIpMkRrsfC1/wBeRuJnm0OTTaSkmiIamog/j0zuObYHUPw0TUmj1lmXcHy446V+yk2oJs2Pp9+2De8sI8JiGHqggaqV0TBBP07rvJw3EytbW+zqzux7mqKAgiq98ZB5LWPDbbacU0qRKiSIGYghXQMP2xkXJyFbkaMFQeG102eWjjlvwm7o1eaaeeTW045IXYPFKjKbvveMYOXvAWlw9oFM92+fgWv6x2XfqHYdliLOkTG4we5jX1GMYxS5XUU0ERhYS0aDb0v/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/mitski-laurel-hell-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/mitski-laurel-hell-320.jpg, /blog/favorite-albums-2022/mitski-laurel-hell-640.jpg 2x\" src=\"/blog/favorite-albums-2022/mitski-laurel-hell-320.jpg\" alt=\"Album cover of Laurel Hell\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Laurel Hell by Mitski</figcaption></a></figure><p></p>\n<p><a href=\"https://bigthief.bandcamp.com/album/dragon-new-warm-mountain-i-believe-in-you\"></a></p><figure class=\"figure\"><a href=\"https://bigthief.bandcamp.com/album/dragon-new-warm-mountain-i-believe-in-you\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAEFAAAAAAAAAAAAAAAAAAIBAwQFCP/EAB8QAAMAAgICAwAAAAAAAAAAAAABAgMxBCEREiNhcf/EABYBAQEBAAAAAAAAAAAAAAAAAAACAf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AOjHSW2ik5JpLw96TLfKxVkj43Kr7RiVx88Jerqqb770StsQQxz6wlrr9AYmAAAAA//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/big-thief-dragon-new-warm-mountain-i-believe-in-you-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/big-thief-dragon-new-warm-mountain-i-believe-in-you-320.jpg, /blog/favorite-albums-2022/big-thief-dragon-new-warm-mountain-i-believe-in-you-640.jpg 2x\" src=\"/blog/favorite-albums-2022/big-thief-dragon-new-warm-mountain-i-believe-in-you-320.jpg\" alt=\"Album cover of Dragon New Warm Mountain I Believe In You\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Dragon New Warm Mountain I Believe In You by Big Thief</figcaption></a></figure><p></p>\n<p><a href=\"https://angelolsen.bandcamp.com/album/big-time\"></a></p><figure class=\"figure\"><a href=\"https://angelolsen.bandcamp.com/album/big-time\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUHCAL/xAAkEAACAQQABgMBAAAAAAAAAAABAgMABAURBhITITFBB3HBYf/EABYBAQEBAAAAAAAAAAAAAAAAAAIBA//EAB4RAAIBAwUAAAAAAAAAAAAAAAACEQExUQMSITJh/9oADAMBAAIRAxEAPwC6cpncdHYXbW93A08cLuqdTlJIUkd/XiqI4G+aLy84rtLfPW9pBj7kiIyo7jok+GOydjf153VWJkJiZJHdkWEBnI7nyABrfs1CXLxSOzRhwGJOm127n81WCzkdW4sbVlz2I5zu/t9/dKxzb5+9ihSMyyMFGgeb1SrDZDu8O8vbrBZqQWZncbLH+E/tQ1KUdLqV7jVKUrUB/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/angel-olsen-big-time-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/angel-olsen-big-time-320.jpg, /blog/favorite-albums-2022/angel-olsen-big-time-640.jpg 2x\" src=\"/blog/favorite-albums-2022/angel-olsen-big-time-320.jpg\" alt=\"Album cover of Big Time\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Big Time by Angel Olsen</figcaption></a></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAYHCAT/xAAnEAACAQMEAgIBBQAAAAAAAAABAgMEBREABhIhBzFRYRMIIkGBof/EABcBAQADAAAAAAAAAAAAAAAAAAQBAgP/xAAcEQEAAgIDAQAAAAAAAAAAAAABAAIREgMhMmH/2gAMAwEAAhEDEQA/AM+WuVYpCzRpKOOOL5x/mrMk2BdJdti4lLZHUtEZloGLCf8AHjo/AJ/hSc9feNcXixqnbdmn3NwpxHUTrb4nliDuvRZihbIBJ4jOD6OpVJcL1c9wXC22mjkrJqogvUKwjjcAfuGPonoDB61Xk5bltakVk12zKQmBWQhgQR0QR601Jt82ma1X0wVnBKlo1eQKeuXonv5xn+9NKOyTV2Mk0J5A23a7B4vpLRbqbjR0NyVog7F2LFTyZifZOT9d9Aah36eZBX71hoa2OOeCamy/5Bk5HJvf2T386aaI+4Jc17+SxazxpYtz1ElbcWrVkjd4EWKUBVRXbAGQT1n50000kXEzrZDAz//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/girlpool-forgiveness-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/girlpool-forgiveness-320.jpg, /blog/favorite-albums-2022/girlpool-forgiveness-640.jpg 2x\" src=\"/blog/favorite-albums-2022/girlpool-forgiveness-320.jpg\" alt=\"Album cover of Forgiveness\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Forgiveness by Girlpool</figcaption></figure><p></p>\n<p><a href=\"https://thesmile.bandcamp.com/album/a-light-for-attracting-attention\"></a></p><figure class=\"figure\"><a href=\"https://thesmile.bandcamp.com/album/a-light-for-attracting-attention\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIDBQT/xAAqEAABAwMDAQcFAAAAAAAAAAABAgMEAAUREhMhBgcUIjFBUXEVMkJhkf/EABgBAAMBAQAAAAAAAAAAAAAAAAECBQME/8QAIhEAAQQBBAIDAAAAAAAAAAAAAQACAxEEBRIhMSJBUXHB/9oADAMBAAIRAxEAPwDas3TU+2dJ3CSWHt11veYIRk41ZB8j+OT8VGHa7tIt3fzbpC0h1ttxpbKwpZODrTk6cEEcAAV1zeqJltszUQlMyJMjBCQ4PMaSkpIHsD5iqk9pc5No7h9OhuIQEpSsrP3JIwSMegH9o4+nNfACBdm7/PpHK1Bzp3Oca46V4jOobQZDKmNY1ISsaSUZODj90rlkXZx+QttltuXHjhLDLjCfBpCEnAPrgkjJ5pUafT5BIdpFKhFmM2C+1kQIrMuTsS0bySEJSpZ8SB7JI5A+K07rZYEfhlgpwpsE7iiTlXOcmlK6sSaRrAA41fysciJjhZaL59KKk9wJahHYaV49CeRk/OaUpSO8jbuSnaKFBf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/the-smile-a-light-for-attracting-attention-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/the-smile-a-light-for-attracting-attention-320.jpg, /blog/favorite-albums-2022/the-smile-a-light-for-attracting-attention-640.jpg 2x\" src=\"/blog/favorite-albums-2022/the-smile-a-light-for-attracting-attention-320.jpg\" alt=\"Album cover of A Light For Attracting Attention\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">A Light For Attracting Attention by The Smile</figcaption></a></figure><p></p>\n<p><a href=\"https://wetleg.bandcamp.com/album/wet-leg\"></a></p><figure class=\"figure\"><a href=\"https://wetleg.bandcamp.com/album/wet-leg\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFAgj/xAAnEAABAwMDBAEFAAAAAAAAAAABAgMEAAURBhIhBxMxMnEiQUJRsv/EABcBAQEBAQAAAAAAAAAAAAAAAAQDAAH/xAAhEQACAgECBwAAAAAAAAAAAAAAAQIRMQMiEhNBUWFx8P/aAAwDAQACEQMRAD8Ah9GaOTeILsqS24qMlQbT21FKlLzjj91qdR+jNx0naYt4gy3JpJAltLSAWlHxgj2TxjnnOKtunvUyxWHSkJEq1FyW2CkJjLSfqzgFW8jaT54yOeKsn+pFin22S1dJzKkuHuILbZCEp8hHPJIx7eCfFSlGdykn68HNPl8KR5AfbIdJWktk87TStvV0yAq7BNn7i47baUKW4r2WM5IA+3ilZW1uySlSbUcG/pe0w5VsQ882VObo3O4/k8oH+E1zNlm0OyY8Zlhxs5QnvJ3lA3H1z8UpSq2fdw/UhLjMelSCp0pG3KUhKQkAZJxx8mlKUSqwLyf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/wet-leg-wet-leg-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/wet-leg-wet-leg-320.jpg, /blog/favorite-albums-2022/wet-leg-wet-leg-640.jpg 2x\" src=\"/blog/favorite-albums-2022/wet-leg-wet-leg-320.jpg\" alt=\"Album cover of Wet Leg\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Wet Leg by Wet Leg</figcaption></a></figure><p></p>\n<p><a href=\"https://warpaint.bandcamp.com/album/radiate-like-this\"></a></p><figure class=\"figure\"><a href=\"https://warpaint.bandcamp.com/album/radiate-like-this\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAQFBv/EACIQAAICAQMEAwAAAAAAAAAAAAABAgMEERIhBRVxkTFBgf/EABUBAQEAAAAAAAAAAAAAAAAAAAID/8QAGxEAAwADAQEAAAAAAAAAAAAAAAEDAhNRITH/2gAMAwEAAhEDEQA/ANrViQsaW5JEh4FSjy0zKYnVtXxJP9LDue6OvLXkm6UGpRf0lX4tSsfK9gp7s+ErG3GxeJAO2nRaIcMn097ZapIuY2y2fQAMn6VwSI0r56/EfQAJl0j/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/warpaint-radiate-like-this-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/warpaint-radiate-like-this-320.jpg, /blog/favorite-albums-2022/warpaint-radiate-like-this-640.jpg 2x\" src=\"/blog/favorite-albums-2022/warpaint-radiate-like-this-320.jpg\" alt=\"Album cover of Radiate Like This\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Radiate Like This by Warpaint</figcaption></a></figure><p></p>\n<p><a href=\"https://sharonvanetten.bandcamp.com/album/weve-been-going-about-this-all-wrong-deluxe-edition\"></a></p><figure class=\"figure\"><a href=\"https://sharonvanetten.bandcamp.com/album/weve-been-going-about-this-all-wrong-deluxe-edition\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYBBAcF/8QAKBAAAQMDAgUEAwAAAAAAAAAAAQIDBAARIQUTBhIxMkEUImFxI1GR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgUD/8QAIhEAAgEDAwUBAAAAAAAAAAAAAQIAAwQRBSFBEhMUUZHB/9oADAMBAAIRAxEAPwDmMLXlR07boaeCcoBOQfvrV7NjPuaPHk7TcbdsS4o9oPxXF4jDjkxtxtm6kuWKTn+5q5ma9PfjhmSXHG+0jBFvgW/VR76kajIV4lbS717UOFJGfUxqHqxJUEPqUnwQi1K24XEENqOluVHG4nHtwLeMeKUgqgY6YmvbknPcP0yS4b1KTKbKHlJKQQMJAv8AdutUzy/wrQEJAB5xjN6UrS7UBxgTTQ2JSoSefyeYvlcUSttJIxfNKUpqNhIt67eQ+/Jn/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/sharon-van-etten-weve-been-going-about-this-all-wrong-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/sharon-van-etten-weve-been-going-about-this-all-wrong-320.jpg, /blog/favorite-albums-2022/sharon-van-etten-weve-been-going-about-this-all-wrong-640.jpg 2x\" src=\"/blog/favorite-albums-2022/sharon-van-etten-weve-been-going-about-this-all-wrong-320.jpg\" alt=\"Album cover of We&#x27;ve Been Going About This All\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">We've Been Going About This All by Sharon Van Etten</figcaption></a></figure><p></p>\n<p><a href=\"https://sopharela.bandcamp.com/album/sometimes-forever\"></a></p><figure class=\"figure\"><a href=\"https://sopharela.bandcamp.com/album/sometimes-forever\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAwb/xAAoEAACAgIBAwIGAwAAAAAAAAABAgMEABEFBiExUXEHEhMVImKBodH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQA/8QAHREAAQQCAwAAAAAAAAAAAAAAAAEREiECAzJhgf/aAAwDAQACEQMRAD8AokfTky04bKP8qDTsm9kD1ztZ5JLvMRcesYaaKP6hiUa2pbQJbwN+QM1q9xa5ELsa8L9wpXsFJ7ayf8Zys9/4vcpx0ViQ046jIgUDQkUKd9/B/LziSuy2crz8PRXuS5WG08RdVCdgB6e48++M1vtNgABwCwGts4J/rGZ8QPq6MLk+oLZplmSuxAOtx7yY9D9R3KvWUOoqsktqKZZppI9ySEOWBLb3vsP4xjJnUnTiVWLqe9JGrMkBJ/U/7jGMDiKln//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/soccer-mommy-sometimes-forever-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/soccer-mommy-sometimes-forever-320.jpg, /blog/favorite-albums-2022/soccer-mommy-sometimes-forever-640.jpg 2x\" src=\"/blog/favorite-albums-2022/soccer-mommy-sometimes-forever-320.jpg\" alt=\"Album cover of Sometimes, Forever\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sometimes, Forever by Soccer Mommy</figcaption></a></figure><p></p>\n<p><a href=\"https://aldousharding.bandcamp.com/album/warm-chris\"></a></p><figure class=\"figure\"><a href=\"https://aldousharding.bandcamp.com/album/warm-chris\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcFBP/EACYQAAEEAQQBAwUAAAAAAAAAAAECAwQRAAUSITFBB1FxBhQiocH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAMAwEAAhEDEQA/ALrP+qNMiRnX1uOrbbSVqKGz0OzzWTuL6sSpsiU1G05lstubmy6SCW74sA0SR7HjNBRZd02Up5lyQhSC2lprlTpPY+K7OSlsmPPnH7UsNqUFIBJuq/Idno9/IzTWSKefUPUQpW6NAVZJF7wQPA4PPzjJg7PSFkDnGBvr1OVD1lxplw7HIZVSiSE0odDxe4375OU6lLmzZpkulYadUpKaFcAj+/oYxlR3NuW2k7U8i/OMYyD/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favorite-albums-2022/aldous-harding-warm-chris-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favorite-albums-2022/aldous-harding-warm-chris-320.jpg, /blog/favorite-albums-2022/aldous-harding-warm-chris-640.jpg 2x\" src=\"/blog/favorite-albums-2022/aldous-harding-warm-chris-320.jpg\" alt=\"Album cover of Warm Chris\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Warm Chris by Aldous Harding</figcaption></a></figure><p></p>\n<p>Previously: <a href=\"/blog/favourite-albums-2021/\">2021</a>, <a href=\"/blog/favourite-albums-2020/\">2020</a>, <a href=\"/blog/favourite-albums-2019/\">2019</a>, <a href=\"/blog/favourite-albums-2018/\">2018</a>, <a href=\"/blog/favourite-albums-2017/\">2017</a>.</p>",
            "url": "/blog/favorite-albums-2022/",
            "title": "My Favorite Albums of 2022",
            "summary": "Like every year I collect a couple of the albums I liked most in 2022.",
            "date_modified": "2023-01-11T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/andrew-s-grove-high-output-management/",
            "content_html": "<p>However influential and innovative this book has once been, it seems outdated now. Instead you should read a more modern management book that took its good ideas and brought them into the 21st century. ★★★☆☆</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 154.375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgMEB//EACcQAAIBAwMEAgIDAAAAAAAAAAEDAgAEEQUGEgcTITFBcSNhMlKh/8QAGQEAAgMBAAAAAAAAAAAAAAAAAgUDBAYH/8QAIxEAAQMCBQUAAAAAAAAAAAAAAQACEQMEEiIzkdEFExSBkv/aAAwDAQACEQMRAD8Apu6Nt3u2dbZa3ts+0s5SiFvnLlA5j/ISAGRkH9gfVZp2prHcIbp129bUyKZ20u4DPxx8xJ8HNW7X9wWG9em+panfYReadJ82Wkogwa90RCE4SJziI9D9HPwaofTHqWzabbO2vC1tq2IE2cwCkHxkZB8YGSKdVK7u0cRg8cqBrIdMSoe4t2IexT1zW2EjGcJgiUSPYIPo0qe3dcx1XU1Xyni4bcIhN7IDiCzH+njxyfk5pTFmZocq5dBhek22xdAnp81G1aFOIkxYuGCMjHOCRywSMnH2a4pdLtotaRPSyRAYH52eMeP7UpXLHXlw4DFUJ9lbfx6QJyDYLe7aejIn2l2mIQAAHcl6x90pSgPUbsHVd9HlGLO3jTbsF//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-640.jpg, /blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-320.jpg, /blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-640.jpg 2x, /blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-960.jpg 3x\" src=\"/blog/andrew-s-grove-high-output-management/andrew-s-grove-high-output-management-320.jpg\" alt=\"Cover of the book High Output Management by Andrew S. Grove\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><small>Also on <a href=\"https://bookwyrm.social/user/florianec/review/842812/s/outdated#anchor-842812\">BookWyrm</a></small></p>",
            "url": "/blog/andrew-s-grove-high-output-management/",
            "title": "High Output Management by Andrew S. Grove",
            "summary": "Review of High Output Management by Andrew S. Grove",
            "date_modified": "2023-01-18T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/",
            "content_html": "<p>With Engineering Management for the Rest of Us Sarah Drasner gives us a great\nstarting point for new managers. On approximately 200 pages Sarah gives us a\ntour of all of areas that managers need to think about.</p>\n<p>In chapter 1 Sarah starts with a quote from Ashley Willis, which sets the mood\nfor the rest of the book.</p>\n<blockquote>\n<p>The fact that you're worried that you're not a good manager is a key part of\nbeing a good manager.</p>\n</blockquote>\n<p>The book is split into four parts: Your Team, Collaboration, Helping Your Team\nDo Their Best Work, and Your Work. This is one of the great things of the book,\nthat it not just handles the managing and leading of people, but also how you\ncan do great work and have a full-filling career.</p>\n<p>For each of the topics that Sarah touches in Engineering Management for the\nRest of Us adds references to further readings, which gives you the opportunity\nto learn more about the topic.</p>\n<p>★★★★★</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwb/xAApEAABAwMCBQMFAAAAAAAAAAABAgMEAAURBiESMUFRYRQiM3GBodLh/8QAFQEBAQAAAAAAAAAAAAAAAAAABAP/xAAfEQACAQQCAwAAAAAAAAAAAAAAAQIDBBESIVEiMkH/2gAMAwEAAhEDEQA/AJWsIkWLa4RnxBMf+BC5Cgrh2zzIJ3xyzVFp63xlXqE3Ot0VuO+6GeD07e2Rsc474rpdZutyLUVJVkodQpIJPf8Atc7LkspLSmVIaeQsOHGACtO/3380W1ip022+RVfMZpJcGkJ0VZCMmC0Po0j9aVew5rUiK080sFtxIWk56EZpRNpfWUwujItQZcscsKUoezO3epGitI2+62xMqc5JcVzKQsJB69Bn80pTbL0Ye7fkjSbdBixoTTDMdtLTY4UgjOAPJpSlX1XRHLP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-960.jpg, /blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-1920.jpg 2x, /blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-640.jpg, /blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-1280.jpg 2x, /blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-320.jpg, /blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-640.jpg 2x, /blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-960.jpg 3x\" src=\"/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/engineering-management-for-the-rest-of-us-320.jpg\" alt=\"Engineering Management for the Rest of Us on a wooden table, parts of a laptop, keyboard and headphones are visible\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><small>Also on <a href=\"https://bookwyrm.social/user/florianec/review/917844/s/great-introduction-to-engineering-management#anchor-917844\">BookWyrm</a></small></p>",
            "url": "/blog/engineering-management-for-the-rest-of-us-sarah-drasner-2022/",
            "title": "Engineering Management for the Rest of Us by Sarah Drasner (2022)",
            "summary": "Review of the book Engineering Management for the Rest of Us by Sarah Drasner.",
            "date_modified": "2023-01-29T11:01:22.413Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/effective-remote-work-james-stanier-2022/",
            "content_html": "<p>I bought the book after I saw James speak about remote work at the Lead Dev\nconference in Berlin last November, but I was a bit disappointed from Effective\nRemote Work. I felt it was very basic at times and the examples he uses to start\neach chapter felt very artificially constructed. I just couldn't relate to the\npeople in these examples.</p>\n<p>The rating does not reflect the quality of the book, it is (apart from the\nstories at the beginning of each chapter) well written and contains a lot of\ngood advice, if you are working or are planning to work in a remote first\ncompany. It just happens that I work in a hybrid remote/office company and I\npersonally prefer working in an office, but I need to collaborate on a daily\nbasis with people that are remote (or just work in an office in a different\ncountry). This was not very well covered in Effective Remote Work.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFAwf/xAAlEAACAQMEAgEFAAAAAAAAAAABAgMABBEFBhIhIjEWQXGBkeH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEBQP/xAAeEQACAQQDAQAAAAAAAAAAAAAAAQIDBBEjIXGh0f/aAAwDAQACEQMRAD8AgviiwPE1yrXU8xLsEI8D12cnvNct07btLHS7i4WUM0YBKxAkHsDs+vrV1BuHTzHaTz6fKJbhW4xuO14jvPX2/dSe793xX1neafaWIZZIyjSZyF/tFp1qTXCbfgmdrKCw2keYy6eskrMR7NK0VbxHL3StssAUm/HZ9326MxKRw4Vc9DzA9VnauyRiFTFG3IkZORgfggUpQ7Za4lW7eyXfwwomZox5EYGOqUpS2ST/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-960.jpg, /blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-1920.jpg 2x, /blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-640.jpg, /blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-1280.jpg 2x, /blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-320.jpg, /blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-640.jpg 2x, /blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-960.jpg 3x\" src=\"/blog/effective-remote-work-james-stanier-2022/james-stanier-effective-remote-work-320.jpg\" alt=\"The book Effective Remote Work held in a hand above a closed notebook on a green sofa\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>★★☆☆☆</p>\n<p><small>Also on <a href=\"https://bookwyrm.social/user/florianec/comment/917967#anchor-917967\">BookWrym</a>.</small></p>",
            "url": "/blog/effective-remote-work-james-stanier-2022/",
            "title": "Effective Remote Work by James Stanier (2022)",
            "summary": "My review of Effective Remote Work by James Stanier",
            "date_modified": "2023-01-29T20:54:39.413Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/austrian-album-recommendations/",
            "content_html": "<p>I recently stumbled on the Bandcamp page of Vienna-based <a href=\"https://seayou.bandcamp.com/music\">Seeyou Records</a> and then spend too much money on music there. I thought a share a couple of albums from Austrian artists that I recently discovered.</p>\n<h2>Weightbearer by Squalloscope</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYDBwj/xAAmEAACAgEEAgEEAwAAAAAAAAABAgMEEQAFEiEGMRMHFEFRMkJx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQUG/8QAHREAAgICAwEAAAAAAAAAAAAAAQIAAwQREiEx4f/aAAwDAQACEQMRAD8A867DtlnyHdzSqSLG5DyM8svBVVQWYkn0AAdUW8ePVduqRfFM14SUGsfPDK6hZefShWAyoAwcjskkfjW30soNZn3mZI0kMNWR2BGQqemJ/QwfeqffaMtfxWvY3GzUhgtUpBDJyCrOQ38Uz3gfj/dWcbAqfG5MQD8k+7KdLuI8nJqdl0RwJHxyP9j+hprEKVZ+hgnIPrOms81YJlVW6lX4tut3bau5VKc3CDcE+3sqVU80yeux17PY1ruF+eSuKkjc69VeECsSfjGc9ZPWmmh7HG9EwQDclCnyMzMxznTTTSSYgdT/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/austrian-album-recommendations/squalloscope-weightbearer-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/austrian-album-recommendations/squalloscope-weightbearer-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/austrian-album-recommendations/squalloscope-weightbearer-320.jpg, /blog/austrian-album-recommendations/squalloscope-weightbearer-640.jpg 2x, /blog/austrian-album-recommendations/squalloscope-weightbearer-960.jpg 3x\" src=\"/blog/austrian-album-recommendations/squalloscope-weightbearer-320.jpg\" alt=\"Album cover of Weightbearer by Squalloscope, it is a drawing, the background looks space-like, in the foreground are two white kneeling figures and some bushes are growing out of them\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://squalloscope.bandcamp.com/album/weightbearer\">Bandcamp</a>\n<a href=\"https://music.apple.com/at/album/weightbearer/1618323846?l=en\">Apple Music</a></p>\n<h2>What Happened At The Social Club by Siamese Elephants</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwME/8QAKRAAAQMEAQIEBwAAAAAAAAAAAQIDBAAFERIhBiIHMUFREzJhcXKRsf/EABYBAQEBAAAAAAAAAAAAAAAAAAQFAv/EACIRAAEDAwMFAAAAAAAAAAAAAAEAAhEDBCFRYfASIjGR4f/aAAwDAQACEQMRAD8A6NdeWQAojs3KS5jlDURWR+8VFXd92ay3Oix3mVS4qwlLnYsarBA/LBVXub686pZuKXIVhZ1WjRKnl5CCTnKlpPyjt9M8cedSqvE1q12SelxC5l+Xu0pkwgpqQ9qO4qJOqACDj2BHNBumOqUy2oIB12ztonsc0HsMlZZcn5RkAWcPmOlISrK1khfqPp9qVT3rVN+IdpISokqOmyRknJ4pRjbMJkdPr6sBzwMytDu096PGgON6kuuBJBHA48wPeqDfLhKT1BOUh9adX14APA4A/gFKVYvgC2DzCLZ4dzVRzlymOKJXIWT5UpSp4ptjwmkmV//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/austrian-album-recommendations/siamese-elephants-what-happened-at-the-social-club-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/austrian-album-recommendations/siamese-elephants-what-happened-at-the-social-club-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/austrian-album-recommendations/siamese-elephants-what-happened-at-the-social-club-320.jpg, /blog/austrian-album-recommendations/siamese-elephants-what-happened-at-the-social-club-640.jpg 2x, /blog/austrian-album-recommendations/siamese-elephants-what-happened-at-the-social-club-960.jpg 3x\" src=\"/blog/austrian-album-recommendations/siamese-elephants-what-happened-at-the-social-club-320.jpg\" alt=\"Close-up of a person, roughly from knee to chest, holding a bowl of noodle soup, in the background is a globe on top of AV equipment on a desk\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://seayou.bandcamp.com/album/siamese-elephants-what-happened-at-the-social-club\">Bandcamp</a>\n<a href=\"https://music.apple.com/at/album/what-happened-at-the-social-club/1555113829?l=en\">Apple Music</a></p>\n<h2>Always by Rosa Rendl</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwj/xAAkEAABAwMEAgMBAAAAAAAAAAABAgMEAAURBhITITJBMVFhcf/EABcBAAMBAAAAAAAAAAAAAAAAAAEDBAL/xAAeEQACAQMFAAAAAAAAAAAAAAAAAQIDEjEEERMhQf/aAAwDAQACEQMRAD8AmnLtGsEJcubs4R12clR9AD7qAjQJWs0yZybZw7NpQGH0pKsjPefk1k2k7wrUuqIKdTTymFyE7T4N9dAD9OBXRd3vsSyaeM5iWlcmLHLaAkp2ukgAFQ6Jxjr8qSo+N7esupaaFWLlLBGw3kCM2lBICRtwvyBHo0rGW7/OeelPB1Z5XSvy+8Uo2MRZBdIytp1beNqsd1YrdMflqQiS4pwJGBuUTj+UpVU8gWCyxGUFo5HulKUswf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/austrian-album-recommendations/rosa-rendl-always-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/austrian-album-recommendations/rosa-rendl-always-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/austrian-album-recommendations/rosa-rendl-always-320.jpg, /blog/austrian-album-recommendations/rosa-rendl-always-640.jpg 2x, /blog/austrian-album-recommendations/rosa-rendl-always-960.jpg 3x\" src=\"/blog/austrian-album-recommendations/rosa-rendl-always-320.jpg\" alt=\"Close-up of a womans face, dark hair, looking directly in the camera, it looks like she is floating in water\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://seayou.bandcamp.com/album/rosa-rendl-always-2\">Bandcamp</a>\n<a href=\"https://music.apple.com/at/album/always-ep/1671176747?l=en\">Apple Music</a></p>\n<h2>The Less I know by Fuzzybrains</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIDBAf/xAAlEAABAwQBAgcAAAAAAAAAAAABAAIDBBEhMQVBsRIlYYKisuH/xAAXAQADAQAAAAAAAAAAAAAAAAABBAUG/8QAIBEAAgIBAwUAAAAAAAAAAAAAAAECAxESITEicXKx0f/aAAwDAQACEQMRAD8A4zxUEUkVTJIwPcxtmg6GDm3VVwxRmjnkLAXtsB6ZGVdxRDaacuNgXW+JVdMfFxtSB0I7/iXalql3RoYVRdNeyzpm/hlGkUWnG0TGCUmzXTG1DLbRcfqpUQ8trfb3REauZFOD6a/GXowDQRERJi4P/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/austrian-album-recommendations/fuzzybrains-the-less-i-know-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/austrian-album-recommendations/fuzzybrains-the-less-i-know-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/austrian-album-recommendations/fuzzybrains-the-less-i-know-320.jpg, /blog/austrian-album-recommendations/fuzzybrains-the-less-i-know-640.jpg 2x, /blog/austrian-album-recommendations/fuzzybrains-the-less-i-know-960.jpg 3x\" src=\"/blog/austrian-album-recommendations/fuzzybrains-the-less-i-know-320.jpg\" alt=\"An abstract image that reminds of a cliff, everything has a redish hue and the images glitches\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://seayou.bandcamp.com/album/fuzzybrains-the-less-i-know\">Bandcamp</a>\n<a href=\"https://music.apple.com/at/album/the-less-i-know/1647818329?l=en\">Apple Music</a></p>\n<h2>Big Delirium by Atzur</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwQI/8QAKhAAAQMDAwIEBwAAAAAAAAAAAQIDBAAFEQYHIRIxEyJBYRQVMlFxweH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEBQP/xAAfEQACAQQCAwAAAAAAAAAAAAABAgAFERIxAwQhQVH/2gAMAwEAAhEDEQA/AKHtZtnJ1YVSHlpjwm0pX1LBw6CSOkEdvpNWDcPbtxlybc4EVuFFbeajoinhawUcuD0wVA8f2pXaDW60aFuMeGygTIXQ22OAVNkZzjPooKJ9jWhSdU265W0ynoYVCDDRVKdXhKFAglGByO6vzVDlzzDrqJp1NPbQqPI9/RPNcjT06MUJdjqBUkLGOeDStY1HdbPc5jT1vdYchpaCGinB8oUrHce9KWvLcXtJz0chiMpnNzsUay6a+a2d2VCmk+GpbTyvMk8kHOeOBUncZ01vbKI18Y8pMlsrd6sZUc4A7dh9qUobbIiusSFJE47RCii2RsM48no4sfulKUgamDO19z//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/austrian-album-recommendations/atzur-big-delirium-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/austrian-album-recommendations/atzur-big-delirium-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/austrian-album-recommendations/atzur-big-delirium-320.jpg, /blog/austrian-album-recommendations/atzur-big-delirium-640.jpg 2x, /blog/austrian-album-recommendations/atzur-big-delirium-960.jpg 3x\" src=\"/blog/austrian-album-recommendations/atzur-big-delirium-320.jpg\" alt=\"A woman sitting on the floor, a man is kneeling next to her, she is wearing black and white checkered pants and he a white suit, everything looks very neony\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://seayou.bandcamp.com/album/atzur-big-delirium\">Bandcamp</a>\n<a href=\"https://music.apple.com/at/album/big-delirium-ep/1628986408?l=en\">Apple Music</a></p>",
            "url": "/blog/austrian-album-recommendations/",
            "title": "Some Album Recommendations From Austria",
            "summary": "A couple of albums from Austrian artists.",
            "date_modified": "2023-03-27T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/vienna-2023-05-17/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGCAIH/8QAJRAAAgEDAwMFAQAAAAAAAAAAAQIDAAQFBhExEhMhFSJBYXFR/8QAGAEAAgMAAAAAAAAAAAAAAAAAAAIBAwT/xAAZEQEBAAMBAAAAAAAAAAAAAAAAAQIRITH/2gAMAwEAAhEDEQA/AM6zWPeiKFrWKRG2VEIB2O3NaE0FozA4xMblcDkrOSaG0JyxuC5btyLyFHtUqR4I+VFR2En0lkp8jBbaWW6tQjLFKjL17sfczsTypC7Hf5NTFlkptM6VvI9U5Oa/tZrVMdAe3EOwp34CMS3kjn+Vlu7OHxmnlcmufTpJLSxaYW8TsEckO8g6iep2YEljvz+UqhZqGKHJTxxyOyK3hmA3P34JFKtk56TaTxVzLawlIHKIfcVBOxP5XV7f3EqFWkO1KUwV2UEOR1N4+6UpUh//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/vienna-2023-05-17/wien-1-960.jpg, /blog/vienna-2023-05-17/wien-1-1920.jpg 2x, /blog/vienna-2023-05-17/wien-1-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/vienna-2023-05-17/wien-1-640.jpg, /blog/vienna-2023-05-17/wien-1-1280.jpg 2x, /blog/vienna-2023-05-17/wien-1-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/vienna-2023-05-17/wien-1-320.jpg, /blog/vienna-2023-05-17/wien-1-640.jpg 2x, /blog/vienna-2023-05-17/wien-1-960.jpg 3x\" src=\"/blog/vienna-2023-05-17/wien-1-320.jpg\" alt=\"In the center a footpath leads to a passageway through a building, the building is light yellow, on the left are flower baskets and a tree, on the right there are benches and shrubs; the building is in the sun and light, the foreground is in the shadow and dark\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUGBAcI/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQIEAAMRBQYSISIxI0FhMlGBkcH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgMB/8QAHREAAgEEAwAAAAAAAAAAAAAAAAIRAQQSQTEyUf/aAAwDAQACEQMRAD8AtG1dfsa1aYqRblWsC9ZJ+kn3HxU3rGrxNO0iTLlMy2LI9S4jAFB4LDP2zXK+3dzStE1US4MnvYDmp6h1J8EfypneG6p+t6A0KybmFvNJuOGZiwPQrx8YGfelS7lYbklsp8hlEi8ElcwHbvuJ3Nkk5/OaVCm5aPlWY+5BIpUMW9GgyINw8u4BuuQDnp1FbE2VZWTuaDFOUskcmVDjlhc4PxmlKRuwbKxL0uPfnSnYMpN1uiYA/WKUpVaGn//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/vienna-2023-05-17/wien-2-960.jpg, /blog/vienna-2023-05-17/wien-2-1920.jpg 2x, /blog/vienna-2023-05-17/wien-2-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/vienna-2023-05-17/wien-2-640.jpg, /blog/vienna-2023-05-17/wien-2-1280.jpg 2x, /blog/vienna-2023-05-17/wien-2-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/vienna-2023-05-17/wien-2-320.jpg, /blog/vienna-2023-05-17/wien-2-640.jpg 2x, /blog/vienna-2023-05-17/wien-2-960.jpg 3x\" src=\"/blog/vienna-2023-05-17/wien-2-320.jpg\" alt=\"Building with a green turret with a clock on each side, most of the building is hidden by trees, but the turret is in clear view in the center\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAQIG/8QAJhAAAQQBBAEEAwEAAAAAAAAAAQIDBAUABhESITEHE0FRQmGRof/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwD/xAAZEQADAQEBAAAAAAAAAAAAAAAAARFRITH/2gAMAwEAAhEDEQA/ANdG2kpd/cTKesTNslEtTCiXuUL7A3HHYEEHofWNCWkgquBp6tblOuEolFuVvwdP5HdPno9eMgaDuHdKG9ck19g6/Zve6hSUEcCeXyf2r/Mz6X2j+jlWzk+usJKpi0OAttHrjy333+98jVpWPCBVaijxGnma5ppCA6r3EolE7Odb+U9fHWM5ORUWUmXJkMQXUtvOrdTx90dEk97J84wUFeFr6Z2E2zptQO2Mt6S5HSC0pwglB9tZ66+wP5kb0etZ91aWLFtLdltIipWlLp8Eq2+MYzNLoyfhT6s9Qrmo1PaV8REIx48hbbfNnc8Qeu98YxjxCVn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/vienna-2023-05-17/wien-3-960.jpg, /blog/vienna-2023-05-17/wien-3-1920.jpg 2x, /blog/vienna-2023-05-17/wien-3-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/vienna-2023-05-17/wien-3-640.jpg, /blog/vienna-2023-05-17/wien-3-1280.jpg 2x, /blog/vienna-2023-05-17/wien-3-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/vienna-2023-05-17/wien-3-320.jpg, /blog/vienna-2023-05-17/wien-3-640.jpg 2x, /blog/vienna-2023-05-17/wien-3-960.jpg 3x\" src=\"/blog/vienna-2023-05-17/wien-3-320.jpg\" alt=\"Facade of an Vienna Altbau building with flower baskets on the window sill and greener sprouting from it\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwb/xAAoEAABBAIABQIHAAAAAAAAAAABAgMEEQAFBhIiMVEhQRMUMmGBkcH/xAAYAQADAQEAAAAAAAAAAAAAAAACAwQABf/EAB8RAAIBAwUBAAAAAAAAAAAAAAABAgMREgQxMkHB4f/aAAwDAQACEQMRAD8AgbnQCbClzG0EyI6WwDZNp6rFefvnF8STEvaaAy0vnWGBzd/bmH8zYoERDnD81ciWmIQttwuKST0pBPYZU7fgqTtompD6RDjtRUttO/DCw4FdVp5e4o36+TnJ0zlJzT6fi+l1R2asVqA4IGvod4rZP6xnQ7LV/KPoitrJbjtpaSqq5gkVf574ynBgZIlcAyUx32G1xmZBeQQVvFRUOkA0QodwSM26BrYz0FgFHKlsJCEiiEUKFXdemMY6lxFVdzEdwgHZSCb+s+584xjMEf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/vienna-2023-05-17/wien-4-960.jpg, /blog/vienna-2023-05-17/wien-4-1920.jpg 2x, /blog/vienna-2023-05-17/wien-4-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/vienna-2023-05-17/wien-4-640.jpg, /blog/vienna-2023-05-17/wien-4-1280.jpg 2x, /blog/vienna-2023-05-17/wien-4-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/vienna-2023-05-17/wien-4-320.jpg, /blog/vienna-2023-05-17/wien-4-640.jpg 2x, /blog/vienna-2023-05-17/wien-4-960.jpg 3x\" src=\"/blog/vienna-2023-05-17/wien-4-320.jpg\" alt=\"Stone arcade, on the left are columns covered in yellow posters, the building is rather old, a couple of people are walking through the arcade with their back to the camera; the sun is shinning\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/vienna-2023-05-17/",
            "title": "Vienna, 17.05.2023",
            "summary": "A couple of pictures I took on a sunny Sunday in May 2023 in Vienna.",
            "date_modified": "2023-05-07T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/mykonos-july-2023/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMHAQQFBv/EACMQAAICAQMDBQAAAAAAAAAAAAECAAMRBSFRBBMxEnGBkaH/xAAYAQADAQEAAAAAAAAAAAAAAAABAwQAAv/EABsRAAIDAQEBAAAAAAAAAAAAAAABA1GhAhES/9oADAMBAAIRAxEAPwD1VS1MMqykcgyYJXyv3KeGqa0e+aupoqFpyQiAY4x7Sd9Y12yusG/prGTJDvWrH9GJQ+p61Ey5gvGW321PjESoH1nXSxL20EnfYekD4UgRB7PWnXzBeHHqvcIDtlskzeABrBwB5iI1sUkZVm3AZhjgxEQGP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1249-960.jpeg, /blog/mykonos-july-2023/DSCF1249-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1249-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1249-640.jpeg, /blog/mykonos-july-2023/DSCF1249-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1249-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1249-320.jpeg, /blog/mykonos-july-2023/DSCF1249-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1249-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1249-320.jpeg\" alt=\"Mykonos City seafront from across the bay, promenade with bars and restaurants, buildings are white and the light is orangish during dusk\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAwQFCP/EACYQAAIABgIBBAMBAAAAAAAAAAECAAMEBREhBhIxE0FhoRciMlH/xAAXAQEBAQEAAAAAAAAAAAAAAAAEAwAC/8QAGxEAAwACAwAAAAAAAAAAAAAAAAETAjEhMkL/2gAMAwEAAhEDEQA/AMdNzTj86+zrVLq8TUB6z2GJLsP6RW9z9H2ie0UpHTIZWH+g5A+IqnjJoZ9ytvrrJekE1SyTACvX5BiTcd5jdK+8vQrx5EpHwKVxUKrhVI7eoPGxvX35hl2uwWC8lgrSa8QjuU9OzS8ugU51hs6hGujmTPDdQrUhzTzpqHtjTkRvW/lV6ttTKm01wndxoFjkgHzvzCEDT0MZNfyRymjVEkXSb1ZQ+H/fB+Cc61CEIrkuSa0f/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1149-960.jpeg, /blog/mykonos-july-2023/DSCF1149-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1149-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1149-640.jpeg, /blog/mykonos-july-2023/DSCF1149-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1149-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1149-320.jpeg, /blog/mykonos-july-2023/DSCF1149-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1149-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1149-320.jpeg\" alt=\"Two windmills in front of a blue sky, each windmill is a simple round white building\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgP/xAAoEAACAQMDAgUFAAAAAAAAAAABAgMABBEFEiExQQYTImFxFFGhscH/xAAZAQACAwEAAAAAAAAAAAAAAAABAgAEBQb/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQITA1EEMZH/2gAMAwEAAhEDEQA/ALK81qW5z5FlAnUoFZsZ+zceoe3FUGuWkupC3c2csEkUm4LbXOxG+V46c85HXFToxPICYxFkDGSpH9ropkaMrKqCTtsLbfzn91LGu2CtaMoNM8QwPIttEtxGXLB3uVTryQFxwB2FK1LNIDiMJj3FKN72LRHRR3mqXv0pja5kKnkkn1Z+etT/AA9dyXeoJa3WJkfnc2dy89iKUrnOJlm5pOT9LTRu7WGGKBVWJD7sMmlKVtin/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1169-960.jpeg, /blog/mykonos-july-2023/DSCF1169-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1169-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1169-640.jpeg, /blog/mykonos-july-2023/DSCF1169-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1169-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1169-320.jpeg, /blog/mykonos-july-2023/DSCF1169-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1169-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1169-320.jpeg\" alt=\"Beach from above, top third is water, with some stones, mid is the beach with a cat sleeping and the bottom consists of green plants\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQHAwUG/8QAKBAAAgEEAAQFBQAAAAAAAAAAAQIDAAQRIQUSEzEGFCJRkUFhcYHR/8QAFgEBAQEAAAAAAAAAAAAAAAAABAEC/8QAGxEAAgIDAQAAAAAAAAAAAAAAAAECAxEUMVL/2gAMAwEAAhEDEQA/AOuuBbxq7SSxKqbYlh6d43+zio9xFEkSSOyrHIMozaDfg1WsPiZlhulMV4XcuUk6oJXKKB3UgHKnYGcH7VrbvxJc+Qt41kmN2ueo5nx8HGffv9KY77Y8QVU1S7LBY8t3w5W9V5bqTvbgUqtLrifB7qbrXfDbh5mA5mS6CKTgdhy0qbdvkmtV6IFzDz8rSSSthScc2B39hWERxqqBEVe+wN0pWpGYomrZRkbd/kfylKUdyeRCij//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1183-960.jpeg, /blog/mykonos-july-2023/DSCF1183-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1183-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1183-640.jpeg, /blog/mykonos-july-2023/DSCF1183-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1183-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1183-320.jpeg, /blog/mykonos-july-2023/DSCF1183-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1183-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1183-320.jpeg\" alt=\"White buildings, standing directly at the waters edge, with colorful Venetian balconies from acress the bay\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAYHCAQF/8QAKBAAAQMDAwMDBQAAAAAAAAAAAQIDBAAFEQYhMRIiYQdBURMVFiNC/8QAFgEBAQEAAAAAAAAAAAAAAAAABAYC/8QAGxEBAAMAAwEAAAAAAAAAAAAAAQACEQMEBSH/2gAMAwEAAhEDEQA/AK+07rOxuRUR3lqhllvl0dpx8Ee/vipvGQzJbaUw62orSFdHUAobA4x84IOPNUz6YaJuWs7+1GhNFEdv9jspYP02kgjnbuJ4CRua1pC03a4ce5yLeyiS6gvApU33BYSBhPnbGfNMPT5KAP2Bt51LajKzDAPG9K57pfWI8kdDKAhxIcSYoLiSD8kf1nII8Up9e/VNYO3RsObPbOtp9pnfbLbEt0WEwXUoaaZKEgJR1DABwNyeKk35JPnaJvEhwtoeTEfKVtggg9C8HnxSlS1ZRsyhBecjsBLK1IScKIScb4FKUpAuTNg2f//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1187-960.jpeg, /blog/mykonos-july-2023/DSCF1187-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1187-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1187-640.jpeg, /blog/mykonos-july-2023/DSCF1187-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1187-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1187-320.jpeg, /blog/mykonos-july-2023/DSCF1187-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1187-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1187-320.jpeg\" alt=\"Small Greek church, with a light blue dome\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwj/xAAoEAACAQQBAgUFAQAAAAAAAAABAgMABAURIQYSBzFCYXETIiMyQcH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAwH/xAAfEQABBAEFAQAAAAAAAAAAAAABAAIDEQQSEyEyUSL/2gAMAwEAAhEDEQA/AKPE9ZZXpnp/qLp6xvT9GO3ZoQR6tAOQfMb3vg/yrnDeJ+YxeB6LsmluLQPKDdTSt3MyE8ftvaEaI+ay1LLJXF3eXISKZZIe9o2kKtqTkLseoD/Kn49o8a+Oa9wuTeGzlMoR3WdX2CO0nz0N8fFaMdzmfQohTEwDuCurbfxMxk8CSS2M/cwB4KnilcxJ4hY6xijt5Yr0NGoX7owCde26UrRB6j7kvikqBBblIgFGhv34HJrO77J30WehZbqX8kpUqTxwRSlIyDQFKUAsm1H63k7M/IwVSZI0diRvZK0pSgS9yks6hf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1193-960.jpeg, /blog/mykonos-july-2023/DSCF1193-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1193-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1193-640.jpeg, /blog/mykonos-july-2023/DSCF1193-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1193-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1193-320.jpeg, /blog/mykonos-july-2023/DSCF1193-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1193-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1193-320.jpeg\" alt=\"Details of a church tower, through two arches the bell is visible; a yellow flag is blurred in the foreground\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMGBwX/xAAnEAACAQMDAwMFAAAAAAAAAAABAgMABBEFEiEGEzEHUdFBYZHB4f/EABYBAQEBAAAAAAAAAAAAAAAAAAQCBf/EAB4RAAICAQUBAAAAAAAAAAAAAAABAgMRBBIhIjIx/9oADAMBAAIRAxEAPwCk2nTbaB1loc0s8LRLcIykEA7uRjB+v6rX7fXWlmKydwFEVSHBHHOMe4rNfVvU5b2LT9Smhgje0vIZEWFCAQSffk+PaujBeyPrLiSVXzuAVBtCqPAAqNPbiHb6VdDM+C3rb2mobprtT3NxXhiOM/2lZ11d1Ne6PqaW9k2ImiEhwR5JPxSj2Yc2LrqbiiHr52lsJ43OQscDg+Oe4Pmp7aFYbpipLEbUy3PksPzSlIqS2MJN90U/1DnddeRcggQJjI+5pSlEl6Zq1eEf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1203-960.jpeg, /blog/mykonos-july-2023/DSCF1203-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1203-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1203-640.jpeg, /blog/mykonos-july-2023/DSCF1203-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1203-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1203-320.jpeg, /blog/mykonos-july-2023/DSCF1203-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1203-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1203-320.jpeg\" alt=\"Tiny street, white buildings, outdoor stairs leading to the first floors, small shops\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQGBf/EACUQAAICAgECBgMAAAAAAAAAAAECAxEABAUhQQYTIjFRoRJhcf/EABUBAQEAAAAAAAAAAAAAAAAAAAMC/8QAGxEAAgMBAQEAAAAAAAAAAAAAAAECETEhEhP/2gAMAwEAAhEDEQA/ANFMDLrMimiTQ+szW/rRiZgLtBQJoXec3xHvcnuNpx6E7akSSMdhYpirSKQPSGr9feRz8jyk8jrL5WvAKZArWxaxRY18fGM508DULWmW5XmIouS2Y2olJCvQnt/BjO9qajRxsC2u1uWsKpuz3vGD83LontR4VcbK+zpazyH1SRKzEdzXvlrxL5gT3HQ9cYxo4HLSvX43Vmj/ACeMXddAMYxiJIiz/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1208-960.jpeg, /blog/mykonos-july-2023/DSCF1208-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1208-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1208-640.jpeg, /blog/mykonos-july-2023/DSCF1208-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1208-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1208-320.jpeg, /blog/mykonos-july-2023/DSCF1208-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1208-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1208-320.jpeg\" alt=\"Three cats and a dog standing and laying on a street with a white building and stairs in the background\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQGBwj/xAAnEAACAQMDBAEFAQAAAAAAAAABAgMABBEFBhITITFBBxQiMnKB4f/EABUBAQEAAAAAAAAAAAAAAAAAAAMC/8QAHREBAQACAQUAAAAAAAAAAAAAAQAREgIDEzKBgv/aAAwDAQACEQMRAD8Aru/dw63aa1bnQjfpBa23KV4ULRM7EsM9iD2HurDt/wCTeruG10676MdvL01eXkYyrcAxZh+JHLIFQ9yGSHVUS3hgaJUX7mkdJFJ88Svbxj+1FvNPS61eSwni66RknrXIjlyAM47jkD590r1DOMQ9vl5Db3r3y9tHRL1ba6vJndkEitDAXUqc4IPvxSuINfu7h9VuFDN043aOMRklVUE4A80o1w1lrWpOzaumWbDMns++NSLq7li3ffqpBCrIRn9f9pSpF2+pUNfVQLuC36ufp4wWGTgsMkk9+xpSlOwX/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1216-960.jpeg, /blog/mykonos-july-2023/DSCF1216-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1216-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1216-640.jpeg, /blog/mykonos-july-2023/DSCF1216-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1216-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1216-320.jpeg, /blog/mykonos-july-2023/DSCF1216-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1216-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1216-320.jpeg\" alt=\"White building with a dark blue balcone and shutters in the first floor on the ground floor are two wodden doors\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYEBQcI/8QAJRAAAgICAgEEAgMAAAAAAAAAAQIDBAARBSETEjFBYQYHQlGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgQD/8QAHBEAAwACAwEAAAAAAAAAAAAAAAECERMDITEE/9oADAMBAAIRAxEAPwC+43m+NcK8dhPG/wDLRA1/e/bNnFylSy3ioTwz2TrUYJPz9DPN0DcryScLD+P1J2NCEJJL4iVZWYdgDZK6GzvOz8ZWuVLYuRxTVQYVBKr49n6HwOsoj6Fhy/TG+Jt5XhdvHKjsrVphr59PvjJ+aw8j+qV3dyO2YknGPbQdUkT+oY3g5azI9iaxI9aaT1TEErpl0BoDrvOk8zRgnvcbYZXWdZFCyI7KVDA7HR7H0d4xkKlS8Irfa7MZakd1RNIZUcjsRyMgP+A4xjNgH//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/mykonos-july-2023/DSCF1121-960.jpeg, /blog/mykonos-july-2023/DSCF1121-1920.jpeg 2x, /blog/mykonos-july-2023/DSCF1121-2880.jpeg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/mykonos-july-2023/DSCF1121-640.jpeg, /blog/mykonos-july-2023/DSCF1121-1280.jpeg 2x, /blog/mykonos-july-2023/DSCF1121-1920.jpeg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/mykonos-july-2023/DSCF1121-320.jpeg, /blog/mykonos-july-2023/DSCF1121-640.jpeg 2x, /blog/mykonos-july-2023/DSCF1121-960.jpeg 3x\" src=\"/blog/mykonos-july-2023/DSCF1121-320.jpeg\" alt=\"White buildings with the ocean in the background, there are many ships\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Last week we went to Mykonos on a summer vacation and the island is beautiful.\nMykonos City is very pretty and extremely photogenic (as you can see above) and\nthe beaches and the water are perfect.</p>\n<p>While life was good on the beach, getting there was risky. As it is typical for\ntiny touristy beach towns in southern Europe, the streets are narrow, there are\nno sidewalks and too many cars. Here the problem was exaggerated by the fact\nthat hotels were sending black minibuses to pick up their guests, tourists were\nrenting massive Jeeps and SUVs and for some reason quad bikes were very common\non the streets.</p>\n<p>The other thing, and I think this is not just a problem on Mykonos, but in all\nof Greece are illegal beach clubs. All beaches in Greece are public, but\nnevertheless beach clubs put sun loungers and parasols out and charge somewhere\nbetween 50 and 200 Euro per day for them. If you're lucky they leave 10 meters\nof public beach on the sides.</p>\n<p>On one day we were taking a boat to another beach and we passed a lot of boats\nand this was the first time I have ever seen super-yachts up close and wow, they\nare disgusting. These yachts are monstrosities, they are super dark and look\nless like pleasure crafts and more like warships. We were feeling guilty,\nbecause this was our second vacation by plane this year and here we\nwere watching the super rich blasting diesel into the ocean.</p>\n<p>In the end I spent four days on the most beautiful and cliché beaches you can\nimagine and this radicalised me further. Whatever we do about climate change,\nthe super rich don't give a fuck and we need to take their private jets and\nsuper-yachts, because they are not giving them up voluntary.</p>",
            "url": "/blog/mykonos-july-2023/",
            "title": "Mykonos, July 2023",
            "summary": "Photos from our trip to Mykonos, Greece in July 2023",
            "date_modified": "2023-08-03T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/wien-stadtwanderweg-4a/",
            "content_html": "<p>Last Sunday was a near perfect autumn day in Vienna and I took the chance to take some photos along <a href=\"https://www.wien.gv.at/umwelt/wald/freizeit/wandern/wege/wanderweg4a.html\">Stadtwanderweg 4a</a>.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwT/xAApEAACAQMDAgQHAAAAAAAAAAABAgMABBEFEjEhQQYTIlEUMlJhcZGx/8QAFwEBAQEBAAAAAAAAAAAAAAAABAUAA//EACIRAAIBAwIHAAAAAAAAAAAAAAECAAMRIRJhIjIzQlGBwf/aAAwDAQACEQMRAD8Az2nvbrdyRNkyRxDcPLLjDMcfjg9jVKR4rguRcLAuMhzD8qjkf3t3rJ6f4gEt1dlSUcbMsQACQPcV6F1qST4keUs6LKQQzBQfT16964VGfibbbbyPsyAWAMq3LOrKIobmZNvpeNlAI/RpXKy1oSW6tb740+gHcAce9KDrXuXPuKCC0xFlIY50KKoaUAs2OvFU9HjV4r4uN2bk8/dR1pSqdXkYwVPqCT2uXtz5ceAo45pSlUVRbDEGztc5n//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-005-320.jpg\" alt=\"Wooden sign saying “Stadtwanderweg 4a”, behind is a forest with leaves turning green yellow \" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgMEBf/EACgQAAIBAwIFBAMBAAAAAAAAAAECAwAEEQYSBSExQVETFCJhB3Fygf/EABUBAQEAAAAAAAAAAAAAAAAAAAME/8QAIBEAAgICAQUBAAAAAAAAAAAAAQIAEQQhAwUSInGR8f/aAAwDAQACEQMRAD8AkOooLWzsEDg+jbxbExkYGORH2KonVcdsl9NFBJ8JRvyrHG49x+6vbU8qy8J9uoechDJIFQOv8Y81QWq7iOGZrYKPkBJ52k9h4qPqPM3JlDsFCvv5EwECY5DGzcx4Z+O7ridkl1azgo3UBC2D4yP8pXXpzWdrwfhiWslncu4YsxU4Genj6pVClK8gb9w2Vr0dTYNf6ga1ksjdL6LxekTsG7AB79c8+tQpiWklJJ3YY5zz5ClKFiSdxkUKNCelAx9naswVi0QbmoPc0pSqBBn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-001-320.jpg\" alt=\"Tree crown from the ground up, the leaves are yellow and orange; around are more trees\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAgT/xAAnEAACAQQBAgUFAAAAAAAAAAABAgMABBEhBRJhExYxQcEycZGx0f/EABkBAAEFAAAAAAAAAAAAAAAAAAQAAQIDBf/EAB8RAAICAQQDAAAAAAAAAAAAAAABAhEhBBIxQRMUIv/aAAwDAQACEQMRAD8AzyXd9bzhXRXVsydasfpyR0gfcHVc+YIoJelQjzYy/rhTvQ7CvfZX081nLPx7W0ktyD4YJUvgE6x7HPxWUSx5CC5l6uOuhJvqYoTkn9jftQM9FHc30L7kqawW1uXkBcRSAscnJA3+aVDtppY0KTQTRODjDwsSe/pSn9RPoh4zRcOWgvSsLMhQF1ZTgqe1UoOTuo0aRHw2djGjnt/KUrajFVwEW8Frj5pLy1WaV2DHWmPzSlKGcVfBeng//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-002-320.jpg\" alt=\"Trees, on the left a tree with a thick trunk, on the right younger trees, a lot of leaves on the ground\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgIE/8QAJRAAAgEDBAEEAwAAAAAAAAAAAQIDAAQRBRIhMRMUIkFRYZHx/8QAGAEAAgMAAAAAAAAAAAAAAAAAAAMCBAX/xAAeEQACAgICAwAAAAAAAAAAAAAAAQIREzEEIRJS8P/aAAwDAQACEQMRAD8A8EWsXTRR+p8KIkbgsoJDAR8HB6/tVWuX0balozDxs1pGiDamNisccZ4+SapJrm7DeO3ucxLE7hwcDLELjnvAAqC7lknvYSZApklhG8N0MSH9ZA4rIxyUvK+qJSVrRrRfM1vbgTzBViVQu04UfQx8UqK11E+gtArWJKxBWMje7IJBz3Sq2J+7CkZm9v7hHknWQ70jES88bfrFUVzczTSWBklYlZFQfgbWpSn8dLf2hcmzu91C4hm2Iy4xnkUpSnKKrQRfR//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-003-320.jpg\" alt=\"Forest, the sun is shining through it, some leaves are still green, but some are turning yellow and orange; the ground is covered with green shrubs\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYDBQf/xAAnEAACAQMDAwMFAAAAAAAAAAABAgMABBEFITEGEhMHYXEiMkFRgf/EABcBAQEBAQAAAAAAAAAAAAAAAAIFAwT/xAAfEQACAQQCAwAAAAAAAAAAAAAAAQIDESExBCJxgcH/2gAMAwEAAhEDEQA/AOZ6FS2Fj6X9QSzqY5pbkSozbgBUCnG/uw/tY9M6ol7dSvHHFMwZ4lBYHknJ2/ODUV01qstj0GYQEDAuFJ5AY792fiselLkQ2UksUzh5JfI5yAv3DAGPipHNgp3m8WwZqbXVPZ6lfadFc3DTG5a1Z/qZJD3MSdy3H7NKjZL552L+Pyk8s2ck+9K441kl2Tv5A6ecMiUkJ0VoAqqiheBucjk109Ot0stKtkh7iGUMSxJ3JpSqPJ17+BmU+j263NoXd5AQxACtgAUpSo89jTP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-004-320.jpg\" alt=\"Tall tree, covered in ivy in a forest, most leaves are still green, but some are turning yellow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150.31249999999997%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYHBf/EACkQAAIBAwMCBAcAAAAAAAAAAAECAwAEEQUGIQcSE0FRYRUiIzFSkfH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAAP/xAAcEQEAAgMAAwAAAAAAAAAAAAABAAIDERIEITH/2gAMAwEAAhEDEQA/AMujuki0wPJKQ4ZQAoHnxx+q17o3vOTa+mXkurXCJp0xXw+/Hcz/AIgnAHGc88VgUkc0s9sWVjGpzkKcY9Krd46H8Vk0qCG5jtTLaqEMjnsLKDke33qpgXeoKpzbqdffHWm/1XcVxcWlw8VsMJGikABR/aVDxaMbQNBdWEdxKhwZUAZW9wRSlGG2vsnnfuU21bG3uNQVLhPFVE7gHJPNX19plrfWpimTAT5lK8FTjypSt/EBw7ZlhVpVZnc/1J37+SD259cUpSjlnUYhP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-006-320.jpg\" alt=\"Left side is a forest and trees, in the middle is a stone path and stairs and on the right some buildings\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAMAAwAAAAAAAAAAAAAAAAQFBgMHCP/EACUQAAIBBAICAgIDAAAAAAAAAAECAwAEESEFBhJBB1ETgWFxsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIDBP/EABoRAAMAAwEAAAAAAAAAAAAAAAABAgMEMSH/2gAMAwEAAhEDEQA/AO8eUubXhuKueQvm8LeBPNz/AIP2dV5T7p2TmeM+QrjuHGkWsc5KQF5FlkKMuB5Jn1jQ0Bgb+7runzFcdlu47NHNlxgUGWDAIkdTnZGyv8a9VhO5djPIcFbWMUMSW0Uv5JJFO3bLAAfYAI161T2M91SU8MergmJbrpmVJLSM8JndmLM+PZ3SooknQAR4K/Z90pj9K+Nizhid5x+q5+QnfwEOR4KzMP7pSoLpckwplTs6OKUpVgJI/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-960.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-1920.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-640.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-1280.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-320.jpg, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-640.jpg 2x, /blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-960.jpg 3x\" src=\"/blog/wien-stadtwanderweg-4a/stadtwanderweg-4a-007-320.jpg\" alt=\"Tall trees, on of them is hit with the last sunlight of the day\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/wien-stadtwanderweg-4a/",
            "title": "Stadtwanderweg 4a",
            "summary": "Photos from Stadtwanderweg 4a in Vienna on a sunny autumn day",
            "date_modified": "2023-11-13T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/iphone-gps-geo-tag-photos/",
            "content_html": "<p>I like to keep my photo library organised, which includes location information to all photos I take with my big camera. However, my cameras don't have GPS and connecting the camera to the horribly Fuji app is no fun. Instead I run a GPS tracker app while tacking pictures and then export a GPX file.</p>\n<p><a href=\"https://apps.apple.com/at/app/minimalist-gps-tracker/id704921899\">Minimalist GPS Tracker</a> is a super simple GPS tracker that uses barely any battery and can export GPX.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 108.43750000000001%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMGAQQFCP/EACgQAAICAQMCBAcAAAAAAAAAAAECAwQABRESEyEiUWFxFDEyQUJSof/EABcBAAMBAAAAAAAAAAAAAAAAAAABAwL/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIDESIh/9oADAMBAAIRAxEAPwD0pRryzeOZ4zFuwCiPiw79u++VzW0rpr0qPp9KdRxZ+pAhd+37FfQZbKMM1dmSWWNoz9CquxHck++amo6VXs3EllLcywI49vtt388nYpNck7FJrlnEipaPYQNJotPkvhPUqRAj+euMs8dJI1CoxA9AMYJTNrc9JJqdea3XsyxK09fl0nPzTkNjt7jIbLkTjb8SCMYyiHhn4p/JcYxjA//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/iphone-gps-geo-tag-photos/gps-tracker-960.jpg, /blog/iphone-gps-geo-tag-photos/gps-tracker-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/iphone-gps-geo-tag-photos/gps-tracker-640.jpg, /blog/iphone-gps-geo-tag-photos/gps-tracker-1280.jpg 2x, /blog/iphone-gps-geo-tag-photos/gps-tracker-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/iphone-gps-geo-tag-photos/gps-tracker-320.jpg, /blog/iphone-gps-geo-tag-photos/gps-tracker-640.jpg 2x, /blog/iphone-gps-geo-tag-photos/gps-tracker-960.jpg 3x\" src=\"/blog/iphone-gps-geo-tag-photos/gps-tracker-320.jpg\" alt=\"Left side shows a screenshot of the Minimalist GPS Tracker app in its default state, it shows track time, distance, speed and average pace with a value of 0 each and a green round Start button at the buttom; the right side shows a recorded route with a map at top and stats about the route at the bottom\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>After I'm done with taking photos I use the <a href=\"https://www.apple.com/shop/product/MJYT2AM/A/lightning-to-sd-card-camera-reader\">Lightning to SD Card Camera Reader</a> to import the photos to my iPhone and than use an app called <a href=\"https://apps.apple.com/at/app/geotag-photos-tagger-gpx/id975196640\">Geotag Photos Tagger (GPX)</a> to import the GPX file I recorded earlier and match the photos to the location using the timestamp. Because the mapping happens based on the timestamp it's important to set the correct time on the camera. If the time is off, I use the <em>Adjust Date &#x26; Time</em> functionality that the native Photos app added a couple of years ago.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 108.43750000000001%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAQDBQYH/8QAKRAAAQMEAQIEBwAAAAAAAAAAAQIDBAAFERIhBjETQVFhFBYicZGhwf/EABYBAQEBAAAAAAAAAAAAAAAAAAIDBP/EAB4RAAEDBQEBAAAAAAAAAAAAAAEAAgMEERJBkSEx/9oADAMBAAIRAxEAPwD2aP0vbwysLt8UqCuOM8fmpH7NZm7o3DVGhtvOEatlWCr7c10rmjbSklxCSTrnH6HvXI9WdNtXK9wpbrDM2MvVlxtw6lpIyQ42QQc5Iz7dqwyxgNFlkfTQhoGI4FvflK0q5+AjIB7DBP8AaVdY7dHs0NUdL0p9KllxPjLLmgIA1STyAMdj6k+dKWEe0hS0+2DgVZit6uZ2JCtuT3NYpUdCAgjJ+nzPalKrIBZV0qbI4ZURanAModU2MegOBSlKbficfrQv/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-960.jpg, /blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-640.jpg, /blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-1280.jpg 2x, /blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-320.jpg, /blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-640.jpg 2x, /blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-960.jpg 3x\" src=\"/blog/iphone-gps-geo-tag-photos/geotag-photos-tagger-320.jpg\" alt=\"Left side shows a screenshot of Geotag Photos Tagger app which shows a grid of tiles, each tile shows a map of the route and name and date; the right side shows the details of the route with the mapped photos overlayed the route and at the bottom it says 54 photos not geotagged and a green Tag button\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>Sometimes I forget to start the GPS tracker or I need to adapt some location manually and I find the <a href=\"https://apps.apple.com/at/app/metapho/id914457352\">Metapho</a> app very helpful in these situations. It allows me to filter my photos to show me only those with no location and add a location to photos based on the location of the pictures taking around the same time.</p>",
            "url": "/blog/iphone-gps-geo-tag-photos/",
            "title": "Record GPS tracks and Geo-tag Photos on iPhone",
            "summary": "Using a GPS tracker app to record tracks and geotag photos directly on an iPhone",
            "date_modified": "2023-11-19T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2023/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUGBAcI/8QAJxAAAQMDBAEDBQAAAAAAAAAAAQIDBAAFEQYSITFhB1FxExUiI0H/xAAXAQADAQAAAAAAAAAAAAAAAAADBAUC/8QAHBEAAgIDAQEAAAAAAAAAAAAAAAECERIhYRMi/9oADAMBAAIRAxEAPwCjWNE0XNu6rfjRXYkdUh0rVncodIVg5AUMjPyKsq9QQ7D9qW7BeEl1xp1DSlbQgEBxC84J5xjHioDScdFtsEu8ynokxao+VQnc/l+wYBI9hz13ipT1EWxNhRWIzMczoBaQtxplZKkFkZSVY5AUskZ5ABpaT+6rQ0ox8+mt77fZcm4uLjrGz+lbe4knk8nns0rLuOhtSRJrrcaE4+yTuS4hQSFD3wTkUomUOA6l06B0/EhBtTCIMRDZHIS0KlpshxmP9NsgJHjvyfNKVFbbWys0sivPpC3CVAE/ApSlZCn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-960.jpg, /blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-640.jpg, /blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-1280.jpg 2x, /blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-320.jpg, /blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-640.jpg 2x, /blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-960.jpg 3x\" src=\"/blog/favourite-albums-2023/caroline-polachek-desire-i-want-to-turn-into-you-320.jpg\" alt=\"Woman crawling in a public bus towards the camera; the back of the bus is very crimey, but towards the camera there is sand on the floor\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Desire, I Want To Turn Into You by Caroline Polachek</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwMF/8QAJRAAAQMEAQIHAAAAAAAAAAAAAQACAwQRITEFEiIGFBUyUWGR/8QAFgEBAQEAAAAAAAAAAAAAAAAABAMF/8QAIhEAAQMDBAMBAAAAAAAAAAAAAQACAwQREhMhMbEiUXGR/9oADAMBAAIRAxEAPwDKoYcaXYU9yRbIUgRSR1lPGBdkvbrS9uHhJ3SGNnUekizvreUeaq03C/G6tBTCSM+zayrnlT8Irg7hng+1EjWCHiVAY0etcdHbtJJP4VpHgOnZVRPfPd7ickoixazn96WjAfEfB2VaKvi6VsuI9gFERDje7Abqr2jIr//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/boygenius-the-record-960.jpg, /blog/favourite-albums-2023/boygenius-the-record-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/boygenius-the-record-640.jpg, /blog/favourite-albums-2023/boygenius-the-record-1280.jpg 2x, /blog/favourite-albums-2023/boygenius-the-record-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/boygenius-the-record-320.jpg, /blog/favourite-albums-2023/boygenius-the-record-640.jpg 2x, /blog/favourite-albums-2023/boygenius-the-record-960.jpg 3x\" src=\"/blog/favourite-albums-2023/boygenius-the-record-320.jpg\" alt=\"Three hands from three different woman raised into the her, the left hand is the most tattooed, the other two hands only have one small tattoo\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">the record by boygenius</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAICAwAAAAAAAAAAAAAAAAEEAgMGBwj/xAAjEAABAwQBBAMAAAAAAAAAAAABAAIDBAURIRIGMVFxB0HB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAID/8QAGREBAAIDAAAAAAAAAAAAAAAAAAIRASFB/9oADAMBAAIRAxEAPwDz1GY25Dw9xOmhvkq7dbbUWd8MV0oKqlfMwuYJmlpOyCfeRjH0qcMj4KmGeJgc+KRsjW+eJB/Fz/5T6ztXVtttjaKkqoq2KeWeV8xBwHgDhnOzruO+ApzdtIy1x1w4AnWwi2A8BgYRUzZMJz70olcS4ZOcaREE8QiIg//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/us-girls-bless-this-mess-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/us-girls-bless-this-mess-640.jpg, /blog/favourite-albums-2023/us-girls-bless-this-mess-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/us-girls-bless-this-mess-320.jpg, /blog/favourite-albums-2023/us-girls-bless-this-mess-640.jpg 2x, /blog/favourite-albums-2023/us-girls-bless-this-mess-960.jpg 3x\" src=\"/blog/favourite-albums-2023/us-girls-bless-this-mess-320.jpg\" alt=\"Black background with the words &#x22;Bless this Mess&#x22; in red written on it, below is the picture of a pregnant woman wearing an opened white shirt and a black not bound tie\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">U.S. Girls by Bless This Mess</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAMGAgUHCP/EACoQAAEDAgUDAgcAAAAAAAAAAAECAwQAEQUGBxIhCBMxImEUQVJxgbHR/8QAFQEBAQAAAAAAAAAAAAAAAAAAAwT/xAAZEQACAwEAAAAAAAAAAAAAAAAAAQIRMRP/2gAMAwEAAhEDEQA/AJc/a64zl3NeO4XDwbDnY+GSex3HHlBax8jt/lV6V1IZhjtMrcy7AQHU7kFTjg3Dxcfm9c91ujujVvND0dLxBmKBs2o34F7cWqtQGVyVvGZA7iXE2RuSsFBHixHI48cEe1Fzg9F6TR7e0ezU/nzJLGOTIzUR1x5xotMqKkjaq17nmlaLpeQW9J4yS2pq0yR6F+R6/sP1ShlVipujozkZt1e5V7+1YfAtD6iLWsTxSlTuKvClSaWk6EBCAlPgcClKUyBZ/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-960.jpg, /blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-640.jpg, /blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-1280.jpg 2x, /blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-320.jpg, /blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-640.jpg 2x, /blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-960.jpg 3x\" src=\"/blog/favourite-albums-2023/mitski-the-land-is-inhospitable-and-so-are-we-320.jpg\" alt=\"Light orange background with dark orange text &#x22;The Land Is Inhospitable and So Are We&#x22; that surrounds a picture of a woman sitting in ecstasy on the floor\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The Land Is Inhospitable and So Are We by Mitski</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEAQX/xAAkEAABAgYDAAIDAAAAAAAAAAABAgMABAURITEGEhNBYSJRkf/EABgBAAIDAAAAAAAAAAAAAAAAAAMFAQIE/8QAHREAAwABBQEAAAAAAAAAAAAAAAECEQMEEhMxUf/aAAwDAQACEQMRAD8AmpbjyHOMtqJSHVP2S5bPXefqNM1xaWemG3ESoQkDrZSiQs23nUYuP1pl0MMTl0pQ5+YSrYwNfzMVFQrVDaT3VOAFwpdQhwlSCQSPMqGrgDP3CvW3N80sDnR2sTDfpNTNKlGwyllfUeY7DrexhHnchrcvM1H0pEsJCV6JAZKvXOyb/G9QgyumvAfXH0jUuutBxxl5xtaSAChVsfqOTLzjy2fRZN5dII0DlXxCEEwskS314MPggAY2IQhFzKkj/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-960.jpg, /blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-640.jpg, /blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-1280.jpg 2x, /blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-320.jpg, /blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-640.jpg 2x, /blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-960.jpg 3x\" src=\"/blog/favourite-albums-2023/caroline-rose-the-art-of-forgetting-320.jpg\" alt=\"Woman sitting on a chair, wearing a plush jacket and a red blindfold; in one hand she has a cigarette, in the other a dring; in the background there is smoke\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The Art of Forgetting by Caroline Rose</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAgMHBP/EACYQAAEDAwQCAQUAAAAAAAAAAAECAwQABREGEiExB1GBIiNhkbH/xAAYAQADAQEAAAAAAAAAAAAAAAAAAQMCBP/EACARAAEEAgEFAAAAAAAAAAAAAAEAAgMRBBJxISIxkfD/2gAMAwEAAhEDEQA/AOn3KbITNkBLzoCXFAYcV1uPo14XLnIjpKnZLobGSVl5XX76qmXa6316+XdtudCjx2pLw3upwtKA4RndjFabhIlN6fEd+Xb0NrQVuPGQVlxPeR7z6HxXO/Ojj7XDryfvSceLu4W6hwuw6TmGbbFvIfU6gukJVuKugBwT+c0qA8VSnRplbWWn22XyhtxJICk7Uq6PWMkfFKiZNztXlVdGGEtabAWN38YWO5XCTKkPXAOPOqdUEPBKclWetvuo8+K7A2dyHJoKevrQf6mlKLNJq36V05Es1uXHiOPqbU6XPuFJIJAHGAOOKUpWShf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-640.jpg, /blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-320.jpg, /blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-640.jpg 2x, /blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-960.jpg 3x\" src=\"/blog/favourite-albums-2023/speedy-ortiz-rabbit-rabbit-320.jpg\" alt=\"Painting of a yellow pickup truck that has some kind of red blob on it; on top in yellow font the text says &#x22;Speedy Ortiz Rabbit Rabbit&#x22;\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Rabbit Rabbit by Speedy Ortiz</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAYHAgQFCP/EACQQAAICAQMDBQEAAAAAAAAAAAECAxEABBIhBQZhIjFBUXGB/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwQAAf/EAB4RAAICAAcAAAAAAAAAAAAAAAABAhEDEjFBcbHR/9oADAMBAAIRAxEAPwCGdO1wkCHTNCy/DyObv+cZYHZfcE+gkUTsJU3WssYq/BGVZ01qNTPGsnNBWsH9+s7Oj1jQeoExc+0p2X+3iRxXoiZwp2j0bpu5tJPCHWQUfNYyh4O4VhTZMVVwfh6vGKps2ZkbfbSS7Etqtdoo+2aq6l5I2ikVGT0tTC+TjGQxW/PRxeGcErJGFWq4IBF1x5xjGIm6FR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-960.jpg, /blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-640.jpg, /blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-1280.jpg 2x, /blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-320.jpg, /blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-640.jpg 2x, /blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-960.jpg 3x\" src=\"/blog/favourite-albums-2023/courtney-barnett-stella-mozgawa-end-of-the-day-320.jpg\" alt=\"Mountain with lot of green and a stay winding of the mountain all wearing light blue overalls\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">End Of The Day (music from the film Anonymous Club) by courtney barnett &#x26; Stella Mozgawa</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAgDBQcG/8QAJhAAAQMDBAEEAwAAAAAAAAAAAQIDBAAFEQYHEiExExRxgUFRkf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCmm2wQBXm7deLMLkITDkluS+SloSA5xeCfygqJBHn9ZxWg3o1rK0fo9qTbChM2XJTGbcWkKDYwVKOD5OBj7rhNg3Olydf2SZewyY6X2wQ0CPTSEhGRkn5P3QVO80C4ehSsjq08z2DSg5xuzFYum2l698yl0xYy5TJOQUOoB4qBHyf7UqaauL0i82ph1LJZjykKSkNgcjyT2ojtXXXZpSgtaXKcD6sEUpSg/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/blondshell-blondshell-960.jpg, /blog/favourite-albums-2023/blondshell-blondshell-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/blondshell-blondshell-640.jpg, /blog/favourite-albums-2023/blondshell-blondshell-1280.jpg 2x, /blog/favourite-albums-2023/blondshell-blondshell-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/blondshell-blondshell-320.jpg, /blog/favourite-albums-2023/blondshell-blondshell-640.jpg 2x, /blog/favourite-albums-2023/blondshell-blondshell-960.jpg 3x\" src=\"/blog/favourite-albums-2023/blondshell-blondshell-320.jpg\" alt=\"Woman standing on front of white wall, wearing a black pullover and pants on top the word &#x22;Blondshell&#x22;\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Blondshell by Blondshell</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgL/xAAoEAABAwMCBAcBAAAAAAAAAAABAgMEAAUREiEGMVFhFBUkQWKhseH/xAAXAQADAQAAAAAAAAAAAAAAAAACAwUE/8QAHxEAAgICAQUAAAAAAAAAAAAAAAEDIQIREhMUMZGh/9oADAMBAAIRAxEAPwC8YQtiSXG9Z31AJ9j1q5tr09CZDnhnHFO43O37zqREvcA7sNtpPxV/KzkHii9TXruhLMdKmJa0R1OKVgo2wNIxqx1zg5qxJNuniZ4o1HfP0T37Ky88tx23OBSjnCTilZuVduMTIWUybaBnb0JV9ldKT3mSrTC6UbvXxGRhXCSorIcKdPIA9u9T/MJDAZcbXhRcwe9KUzJ2T8TuTc5SnSS5vSlKFeBzP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-960.jpg, /blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-640.jpg, /blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-1280.jpg 2x, /blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-320.jpg, /blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-640.jpg 2x, /blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-960.jpg 3x\" src=\"/blog/favourite-albums-2023/black-belt-eagle-scout-the-land-the-water-the-sky-320.jpg\" alt=\"Woman pictured from the back walking into a lake holding a red string\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The Land, The Water, The Sky by Black Belt Eagle Scout</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBwQG/8QAJhAAAgEEAgEEAgMAAAAAAAAAAQIDAAQFERIhQQYTMWEiI1Jysf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAH/xAAaEQADAAMBAAAAAAAAAAAAAAAAAQIDETEh/9oADAMBAAIRAxEAPwCDEtl8pf5G3LYq1aAkRKLgFul5bZT+WiNePjdXOMhGaxd41vcRw3MEemHEsFkI6P8AXrYPkVj+ckltvUMWYnCokjcQqfi5ULrlv777Fam2RhzNlJD6fNrZXsUQldASqGJ0/WxbXgjzQXVTWmNxqana6UMF3aXFvFJ7wZio5Ejj356pXk54o8KI7W/urf3+Ac8GLDv719UqhVLXSZy0zglzF7NbwwSyK8MTIVRkB1oggb+ddVLcepMrd5GT3LrjGFOo0RQo0GA8d/J+d0pS6Hqml0ostLJkp45b6RpZEjEYY/xG9f7SlKwF+n//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2023/my-ugly-clementine-the-good-life-960.jpg, /blog/favourite-albums-2023/my-ugly-clementine-the-good-life-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2023/my-ugly-clementine-the-good-life-640.jpg, /blog/favourite-albums-2023/my-ugly-clementine-the-good-life-1280.jpg 2x, /blog/favourite-albums-2023/my-ugly-clementine-the-good-life-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2023/my-ugly-clementine-the-good-life-320.jpg, /blog/favourite-albums-2023/my-ugly-clementine-the-good-life-640.jpg 2x, /blog/favourite-albums-2023/my-ugly-clementine-the-good-life-960.jpg 3x\" src=\"/blog/favourite-albums-2023/my-ugly-clementine-the-good-life-320.jpg\" alt=\"Three woman, two standing and one sitting and all of them wearing colorful pants and there are two dogs, one white and one black\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The Good Life by My Ugly Clementine</figcaption></figure><p></p>",
            "url": "/blog/favourite-albums-2023/",
            "title": "My Favourite Albums of 2023",
            "summary": "The albums released in 2023 that I enjoyed most.",
            "date_modified": "2023-12-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/books-2023/",
            "content_html": "<p>In 2023 I have read 37 books, 24 of them were fiction and 13 non-fiction. These\nbooks have been written by 39 different authors, 29 were woman and 10 were men.</p>\n<ul>\n<li><strong>RCE</strong> by Sibylle Berg ★★★★★</li>\n<li><a href=\"/blog/andrew-s-grove-high-output-management/\"><strong>High Output Management</strong></a> by Andrew S. Grove ★★★☆☆</li>\n<li><strong>Second Place</strong> by Rachel Cusk ★★★★★</li>\n<li><a href=\"/blog/effective-remote-work-james-stanier-2022/\"><strong>Effective Remote Work. For Yourself, Your Team, and Your Company</strong></a> by James Stanier ★★☆☆☆</li>\n<li><strong>Detransition, Baby</strong> by Torrey Peters ★★★★★</li>\n<li><strong>Mission Economy: A Moonshot Guide to Changing Capitalism</strong> by Mariana Mazzucato ★★★☆☆</li>\n<li><strong>Harlem Shuffle</strong> by Colson Whitehead ★★★★★</li>\n<li><strong>Outline</strong> by Rachel Cusk ★★★★★</li>\n<li><strong>Invisible Women: Exposing Data Bias in a World Designed for Men</strong> by Caroline Criado Pérez ★★★★☆</li>\n<li><strong>Diary of a Void</strong> by Emi Yagi ★★★★☆</li>\n<li><strong>The Village of Eight Graves (Detective Kosuke Kindaichi, #3)</strong> by Seishi Yokomizo ★★★★★</li>\n<li><strong>Thessaly: The Complete Trilogy</strong> by Jo Walton ★★★★★</li>\n<li><strong>Designing for Sustainability: A Guide to Building Greener Digital Products and Services</strong> by Tim Frick ★★☆☆☆</li>\n<li><strong>Transit</strong> by Rachel Cusk ★★★★★</li>\n<li><strong>Normal People</strong> by Sally Rooney ★★★★★</li>\n<li><strong>Kudos</strong> by Rachel Cusk ★★★★☆</li>\n<li><strong>Heaven</strong> by Mieko Kawakami ★★★★☆</li>\n<li><strong>The Nickel Boys</strong> by Colson Whitehead ★★★★★</li>\n<li><strong>The Attention Merchants</strong> by Tim Wu ★★★★☆</li>\n<li><strong>Either/Or</strong> by Elif Batuman ★★★★★</li>\n<li><strong>No Filter</strong> by Sarah Frier ★★★★☆</li>\n<li><strong>README.txt</strong> by Chelsea Manning ★★★★★</li>\n<li><strong>Hamlet on the Holodeck</strong> by Janet H. Murray ★★★☆☆</li>\n<li><strong>Algorithms of Oppression</strong> by Safiya Umoja Noble ★★★★☆</li>\n<li><strong>The Change</strong> by Kirsten Miller ★★★★☆</li>\n<li><strong>Tomorrow, and Tomorrow, and Tomorrow</strong> by Gabrielle Zevin ★★★★☆</li>\n<li><strong>Tokyo Ueno Station</strong> by Yu Miri ★★★★★</li>\n<li><strong>The Once and Future Witches</strong> by Alix E. Harrow ★★★★★</li>\n<li><strong>Kink</strong> by R. O. Kwon ★★★★★</li>\n<li><strong>Revenge of the She-Punks</strong> by Vivien Goldman ★★★★☆</li>\n<li><strong>Rückkehr nach Polen</strong> by Emilia Smechowski ★★★★☆</li>\n<li><strong>The Opposite of Loneliness</strong> by Marina Keegan ★★★★☆</li>\n<li><strong>The Red Scholar's Wake</strong> by Aliette de Bodard ★★★☆☆</li>\n<li><strong>Intimacies</strong> by Katie Kitamura ★★★★☆</li>\n<li><strong>Sea of Tranquility</strong> by Emily St. John Mandel ★★★★★</li>\n<li><strong>The Hacienda</strong> by Isabel Cañas ★★★★★</li>\n<li><strong>American Prometheus</strong> by Kai Bird ★★★★☆</li>\n</ul>",
            "url": "/blog/books-2023/",
            "title": "Book Report 2023",
            "summary": "List of books I have read in 2023",
            "date_modified": "2023-12-30T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-plugin-pokedex/",
            "content_html": "<p>I like playing Pokémon and I'm a Pokédex completionist and I like to share\nthat with people. There are a couple of sites that allow you to share your Pokédex\nprogress, for example, <a href=\"https://pokedextracker.com\">Pokédex Tracker</a>, but this\nis not a sustainable business and any of these sites can go away at any time.\nInstead I want to have a page here, on my website, and therefore I have created\nan Eleventy plugin to add a Pokédex and now, over a year later I have finally\nfound the time to polish and publish it. You can see the plugin in action by\nvisiting the <a href=\"/pokedex\">Pokédex</a> section on this website and if you're ready\nto create your own Pokédex you can find detailed installation and configuration\ninstructions in the <a href=\"https://codeberg.org/fec/eleventy-plugin-pokedex/src/branch/main/README.md\">README</a>.</p>\n<p><strong>@fec/eleventy-plugin-pokedex</strong> • <a href=\"https://www.npmjs.com/package/@fec/eleventy-plugin-pokedex\">Package</a> • <a href=\"https://codeberg.org/fec/eleventy-plugin-pokedex\">Source Code</a></p>",
            "url": "/blog/eleventy-plugin-pokedex/",
            "title": "Pokédex Plugin for Eleventy",
            "summary": "Plugin to add a Pokédex to your Eleventy website",
            "date_modified": "2024-01-14T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/stadtwanderweg-1/",
            "content_html": "<p>Today I took advantage of the great weather and walked\n<a href=\"https://www.wien.gv.at/umwelt/wald/freizeit/wandern/wege/wanderweg1.html\">Stadtwanderweg 1</a>.\nStarting in Nussdorf the trail runs through vineyards and some woods up to\nKahlenberg. After enjoying the great view of Vienna, the Danube and the\nvineyards the path continues back down over Nussberg back to Nussdorf to the\nD tram.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYEB//EACoQAAEEAgADBgcAAAAAAAAAAAECAwQRAAUSIUEGBxMiMVEUMnFzgaHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgMB/8QAHREAAwEAAQUAAAAAAAAAAAAAAAECESEDEhMxQf/aAAwDAQACEQMRAD8An9Vsww1G4fM02pu+EUKBI/maO8zaRNjuNVKgtJD/AMKoqcVz5JVR6ch0/OR+nnytk4I0FrimWoKV6orjJBoewIyn3vd7tY2kQiC8qXtnh4KirypShV8dWaA5gel5DupS5bNybez8JZtnVRWWkzJ7UR9aA4ppxski+Y+nKsZjkd3e/W8pc1cbx1Vdq6AADp7DGJdeEs4D42XPYWGzA2iYkZNNtpS7ZAKlqom1HrXtnSUrcdU2VuufOkcjXqaP6OMZOfbLriUUaNJFUkFS5BP3DjGMzBH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-1-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-1-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-1-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-1-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-1-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-1-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-1-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-1-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-1-320.jpg\" alt=\"Footpath and on the right side is a fence and some trees and on the left side is a green railing separating the footpath from an embankment; the weather is sunny and there are some tiny specks of snow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Beethovengang leads from Nussdorf to the vineyards</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQGBwj/xAAoEAABAwMDBAAHAAAAAAAAAAABAgMEAAURBhIhEzFBoQciUWJxgcH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgME/8QAHBEAAgICAwAAAAAAAAAAAAAAAAECESFREzFB/9oADAMBAAIRAxEAPwCLFvFvtTq3JTc56fI2FLDzZb2bU7Uk7gEg4Gfr3qia119qVoHoNs29pZKEuxUlRIH3KyB6NWi/aotj0Zlm17ZMhGCWFArKk45yrkA58mob2nLhd4bDsWGVRn3AHmVrSQBnKik8bhgntnnGO1aJJ1SZNPZm8fWl5U0BhyTt46iy4pX7INK6qs2nrlEgNsWyxIZhI4aSnDfy4Hj++aUvGvZBt6KN8PtK2iHb7ZsipcXKebS446Ao4Kh2zx6rQXJKoE1aIyGUmK7sbUWwpX5Oe59UpVYrArJs0OGQouvvOrPJWtWSaUpVorAj7P/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-2-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-2-1920.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-2-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-2-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-2-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-2-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-2-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-2-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-2-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-2-320.jpg\" alt=\"A tiny stream running from the right to the left and there is a tiny waterfall, like 50 cm high, and some parts of the waterfall are frozen; snow lays on both sides of the stream\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The ice waterfalls of Nussberg</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAUCAwQGCAf/xAAqEAACAAUDAgQHAAAAAAAAAAABAgADBAURBhIhMlEHE0FhFCIjcYGRsf/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAcEQADAAMAAwAAAAAAAAAAAAAAAQIDERIhI1H/2gAMAwEAAhEDEQA/AIPRd0aZNkBakyzLbIVeo57e/vG46w8XZltpp1DQSmE6X9Ntw6eOfePOrxYjpqoSQ1XVS60csQibQeMgHJzjjn7xgvp0XmUalLw02qfrlugLLxjJ5z2jRjq3j5S8i3M97bKl13UMW3qWAPy4bbgdv7CIK46TrKKo8v4qTOyN25Vb1/EIl7UNuTq29aYtepLVm5SCXDlUdDhkwPQnOI5Vv6G3XOol0zuPJmMqtwG4PcYhCKsUsStXXeQgQT0cd3lhj+4QhBV19BpH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-3-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-3-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-3-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-3-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-3-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-3-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-3-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-3-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-3-320.jpg\" alt=\"An empty street, there is an embarkment on the left and the ride side and there are trees and on the left side also some street lights; the street curves to the right\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">For a tiny bit the path goes along Höhenstraße</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwQI/8QAKBAAAQMDAgYBBQAAAAAAAAAAAQIDBAAFESExBgcSEyJBFDJRcaHS/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwQBAv/EAB0RAAICAgMBAAAAAAAAAAAAAAECAAMEEhEhUUH/2gAMAwEAAhEDEQA/ALxxXckJtfYEgqZkjtqU0oAgKyAQazrku+/EnzJb0tSh9PQdlHTGcfmqrceKmjEUwgq8QRorGTrjNR1i4getMRK47hS73SvPrQADbX2f1VOTkK1qsp6EymttGDDuevojweYSs5ydyQRmlYDF5uPqjoDt0+K6gdK0FHUCfuNNsYpTi5T9g6GREvl3Z2jCw9OKpD6ULUXE5wdwPGul/gCzQbqi3oMtyO8ypZ63fJKgRqCAD622pSoio8jgmRz/ACwsi3Sr5NxBVrgPJ/mlKUuo8nPJn//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-4-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-4-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-4-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-4-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-4-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-4-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-4-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-4-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-4-320.jpg\" alt=\"A tower on the top of the hill, surrounded by trees and snow is on the ground; the tower is horizontally striped with yellow and red bricks\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Stefanie Warte: the highest point of the hike</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAcDBAUGCP/EACQQAAIBAwQCAgMAAAAAAAAAAAECAwAEEQUGEiExYSJBE3KR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQC/8QAHREAAgEEAwAAAAAAAAAAAAAAAAECAwQRIRITQf/aAAwDAQACEQMRAD8AsVje2cilmmVGABYE4IzXSt/aFb6/aXh0e6QS2EzrcKz9K4RWOO/iQMHI95rzltnfetLbNbSXhdy/ISsSXPYPbfyuf3TvLloWqwQyu95eM0kxXAAZhg5xj676q2V0pAdT8NQ6BfXUcV9czrGL1BcxK8iM/BvBbvpj2ce6VO01y8/FGrSE8FCZJPgeKVPzQmGUnSNn6VdWbSFJY5Ap+SP9+M4ORmsO4dnWFpBPJFcXnJ0HLLr31+tKUlSK1ozFsmU9rHHJxGSPZpSlTsQ//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-5-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-5-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-5-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-5-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-5-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-5-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-5-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-5-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-5-320.jpg\" alt=\"Church partly hidden by trees and a snowy ground and some benches and bushes\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Church on top of Kahlenberg</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAYHCAT/xAAoEAACAQMCBQMFAAAAAAAAAAABAgMABBEFBhITITFBFCJRFSNxgZH/xAAZAQACAwEAAAAAAAAAAAAAAAAAAQIDBAX/xAAcEQACAwADAQAAAAAAAAAAAAAAAQIREiExQVH/2gAMAwEAAhEDEQA/AM/XulTWN06fcMqsxLBcDhGRnHjz/K7907c1ra0dgdyaKLRJ244Zo3VmZeEZAwSM9QetW7f7es9JOdS0uBBIgfL3LuVz8+Cfb+OlS7de4dJ3TpVj9Zs2f0kvNt+TKwdZCvDxHBBORnxVdtdk6XhlBJ5GBPuYZ6E98Uq8Nd0i79aqWMVnaWkcapEgtOYSuO7FkJz+/FKNxDDNIXNtA2lyRcmIDlh+IIM9+2cdqhFtN6QkRRwYPUholPX57UpXVgk07MsnySkapcJDCDy3zGDl0BNKUpZXwds//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-6-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-6-1920.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-6-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-6-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-6-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-6-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-6-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-6-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-6-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-6-320.jpg\" alt=\"Stone benches with a bust of Queen Sissi and the words &#x22;Kaiserin Elisabeth Ruhe&#x22;, which means &#x22;Queen Elisabeth rest&#x22;\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Queen Elisabeth rest</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFCAT/xAAnEAABAwMEAQMFAAAAAAAAAAABAAIRAwQFBhITIUEUM2EyUXGBkf/EABgBAAIDAAAAAAAAAAAAAAAAAAAEAQIF/8QAGxEBAAICAwAAAAAAAAAAAAAAAAEREhMiMWH/2gAMAwEAAhEDEQA/AKXaanw7o5hVHy4hbNrqbT4j6/3C5X0RqHnuG0bi5pME+6+huDe478iVUy2wvKbODIMeR3FBocXDrxHyE/vyjstp8Wdmp8CWiHuA/ARROtaDcPTs5WQJc88ZnzIHX8RRxGDmbkfR6pPc2I7BhaNrqbNWbAy1yd3SYG7drahAj7Iiz7ozLy3GeytSpufkLomI9whERWsP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-7-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-7-1920.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-7-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-7-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-7-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-7-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-7-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-7-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-7-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-7-320.jpg\" alt=\"View from top of the mountain on the vineyards, the Danube and Vienna; it is a beautiful, sunny day and the vineyards are still covered in snow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View from Kahlenberg</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwb/xAAmEAACAgIBAwIHAAAAAAAAAAABAgMEABEhBQZBEhQTFjFRYaGx/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAQBBf/EAB4RAAICAgIDAAAAAAAAAAAAAAABAhEUFRIiMWGR/9oADAMBAAIRAxEAPwDsOj0K9es6oT638hef5k6DpbMEHpZwDsA+MxePuLrkCqz3LGiNjTEc/bLBe7O5IhHGltoyVLKC58fvOnsIp22S4sqpG3xULYQALoDx9cZinz13QCV96ylTogudg4zNjD18YxZlv0qpBfqB7CcRlvSiMVAJ3s8c85G9jDY65DRC/BrwwtIBEACxOwQSQTrWMZDJdSleSVPXq0JDBWqQLGOeVJO/zzjGMcULP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-8-960.jpg, /blog/stadtwanderweg-1/stadtwanderweg-8-1920.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-8-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-8-640.jpg, /blog/stadtwanderweg-1/stadtwanderweg-8-1280.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-8-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/stadtwanderweg-1/stadtwanderweg-8-320.jpg, /blog/stadtwanderweg-1/stadtwanderweg-8-640.jpg 2x, /blog/stadtwanderweg-1/stadtwanderweg-8-960.jpg 3x\" src=\"/blog/stadtwanderweg-1/stadtwanderweg-8-320.jpg\" alt=\"Vineyard in winter with snow in between the vines and in the background is the Danube river and the city\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Vineyards with the Danube in the background</figcaption></figure><p></p>",
            "url": "/blog/stadtwanderweg-1/",
            "title": "Stadtwanderweg 1",
            "summary": "Photagraphs from my hike on Stadtwanderweg 1 on a sunny winter day.",
            "date_modified": "2024-01-14T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/ios-default-browsers-eu-dma/",
            "content_html": "<p>On Friday <a href=\"https://www.apple.com/newsroom/2024/01/apple-announces-changes-to-ios-safari-and-the-app-store-in-the-european-union/\">Apple announced how they are going to implement the Digital Markets Act (DMA)</a> in the EU and one of the changes is the ability to set the default browser. <a href=\"https://www.macstories.net/news/apple-shares-list-of-alternate-browsers-that-will-be-available-to-eu-users-in-ios-17-4/\">MacStories shared the full list</a>, but I thought it would be nice to have an overview in table form.</p>\n<p>Firefox, DuckDuckGo, Brave, Chrome, Edge, Onion Browser, Opera and Safari (…) are available in all countries.</p>\n<p>It's also interesting to see how many of these browsers are privacy focused with ad blockers and VPNs integrated, which seem to be mostly targeted towards non-technical users, for which installing VPNs or Safari extensions is too complicated. Another batch of browsers seem to exist because it's not possible to change your default search engine to anything except a very small list provided by Apple.</p>\n<p>I also want to offer my deepest condolences to all countries that have Web@Work in their list of top 10 browsers. I'm sorry that corporate IT makes you use it.</p>\n<style>\n.ios-default-browsers-eu-dma {\n  font-size: 0.85rem;\n  overflow-x: scroll;\n}\n.ios-default-browsers-eu-dma tbody th {\n  font-weight: normal;\n  text-align: left;\n}\n\n.ios-default-browsers-eu-dma .unchecked {\n  background: var(--red);\n  color: var(--white);\n}\n.ios-default-browsers-eu-dma .checked {\n  background: var(--dark-green);\n  color: var(--white);\n  text-align: center;\n}\n</style>\n<div class=\"table-container ios-default-browsers-eu-dma\">\n  <table>\n    <thead>\n      <tr>\n        <th>Browser</th>\n        <th>AT 🇦🇹</th>\n        <th>BE 🇧🇪</th>\n        <th>BG 🇧🇬</th>\n        <th>HR 🇭🇷</th>\n        <th>CY 🇨🇾</th>\n        <th>CZ 🇨🇿</th>\n        <th>DK 🇩🇰</th>\n        <th>EE 🇪🇪</th>\n        <th>FI 🇫🇮</th>\n        <th>FR 🇫🇷</th>\n        <th>DE 🇩🇪</th>\n        <th>GR 🇬🇷</th>\n        <th>HU 🇭🇺</th>\n        <th>IE 🇮🇪</th>\n        <th>IT 🇮🇹</th>\n        <th>LV 🇱🇻</th>\n        <th>LT 🇱🇹</th>\n        <th>LU 🇱🇺</th>\n        <th>MT 🇲🇹</th>\n        <th>NL 🇳🇱</th>\n        <th>PL 🇵🇱</th>\n        <th>PT 🇵🇹</th>\n        <th>RO 🇷🇴</th>\n        <th>SK 🇸🇰</th>\n        <th>SL 🇸🇮</th>\n        <th>ES 🇪🇸</th>\n        <th>SE 🇸🇪</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <th>Aloha</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Avast</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"unchecked\"></td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>BlackBerry Access</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Brave</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Chrome</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>DuckDuckGo</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Ecosia</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Edge</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Firefox</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Onion Browser</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Opera</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Presearch</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"unchecked\"></td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>Private Browser Deluxe</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>Qwant</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"unchecked\"></td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>Safari</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"checked\">✔︎</td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n      <tr>\n        <th>Seznam.cz</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"unchecked\"></td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"unchecked\"></td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>Vivaldi</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"checked\">✔︎</td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"unchecked\"></td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"unchecked\"></td>\n        <td data-country=\"IT\" class=\"unchecked\"></td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"unchecked\"></td>\n        <td data-country=\"MT\" class=\"unchecked\"></td>\n        <td data-country=\"NL\" class=\"unchecked\"></td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"unchecked\"></td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>Web@Work</th>\n        <td data-country=\"AT\" class=\"unchecked\"></td>\n        <td data-country=\"BE\" class=\"unchecked\"></td>\n        <td data-country=\"BG\" class=\"unchecked\"></td>\n        <td data-country=\"HR\" class=\"checked\">✔︎</td>\n        <td data-country=\"CY\" class=\"unchecked\"></td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"unchecked\"></td>\n        <td data-country=\"EE\" class=\"unchecked\"></td>\n        <td data-country=\"FI\" class=\"unchecked\"></td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"unchecked\"></td>\n        <td data-country=\"HU\" class=\"checked\">✔︎</td>\n        <td data-country=\"IE\" class=\"unchecked\"></td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"unchecked\"></td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"unchecked\"></td>\n        <td data-country=\"PT\" class=\"unchecked\"></td>\n        <td data-country=\"RO\" class=\"unchecked\"></td>\n        <td data-country=\"SK\" class=\"checked\">✔︎</td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"unchecked\"></td>\n        <td data-country=\"SE\" class=\"unchecked\"></td>\n      </tr>\n      <tr>\n        <th>You.com</th>\n        <td data-country=\"AT\" class=\"checked\">✔︎</td>\n        <td data-country=\"BE\" class=\"checked\">✔︎</td>\n        <td data-country=\"BG\" class=\"checked\">✔︎</td>\n        <td data-country=\"HR\" class=\"unchecked\"></td>\n        <td data-country=\"CY\" class=\"checked\">✔︎</td>\n        <td data-country=\"CZ\" class=\"unchecked\"></td>\n        <td data-country=\"DK\" class=\"checked\">✔︎</td>\n        <td data-country=\"EE\" class=\"checked\">✔︎</td>\n        <td data-country=\"FI\" class=\"checked\">✔︎</td>\n        <td data-country=\"FR\" class=\"unchecked\"></td>\n        <td data-country=\"DE\" class=\"checked\">✔︎</td>\n        <td data-country=\"GR\" class=\"checked\">✔︎</td>\n        <td data-country=\"HU\" class=\"unchecked\"></td>\n        <td data-country=\"IE\" class=\"checked\">✔︎</td>\n        <td data-country=\"IT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LV\" class=\"checked\">✔︎</td>\n        <td data-country=\"LT\" class=\"checked\">✔︎</td>\n        <td data-country=\"LU\" class=\"checked\">✔︎</td>\n        <td data-country=\"MT\" class=\"checked\">✔︎</td>\n        <td data-country=\"NL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PL\" class=\"checked\">✔︎</td>\n        <td data-country=\"PT\" class=\"checked\">✔︎</td>\n        <td data-country=\"RO\" class=\"checked\">✔︎</td>\n        <td data-country=\"SK\" class=\"unchecked\"></td>\n        <td data-country=\"SL\" class=\"checked\">✔︎</td>\n        <td data-country=\"ES\" class=\"checked\">✔︎</td>\n        <td data-country=\"SE\" class=\"checked\">✔︎</td>\n      </tr>\n    </tbody>\n  </table>\n</div>",
            "url": "/blog/ios-default-browsers-eu-dma/",
            "title": "Default iOS Browsers in the EU (Thanks DMA)",
            "summary": "The EU requires Apple to open up iOS and allows us gratiously to set a default browser. These are the options.",
            "date_modified": "2024-01-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/a-man-walks-into-the-mp3-store/",
            "content_html": "<p>A couple of years ago I started to buy music again and as you might have seen from the links I share <a href=\"https://bandcamp.com\">Bandcamp</a> is my MP3 store of choice. While Bandcamp is the best option for artists, not everything is available there and my alternative is iTunes.</p>\n<p>It's weird to say this because I was using Apple Music and Music.app for so long, but the UX <strike>to buy music</strike> got so bad. Apple really wants you to rent the music instead of buying and it takes an extra click every time to get to the iTunes page to buy an album and then you have to get the files out of the <code class=\"language-text\">Music</code> folder and sometimes the ID3 tags for one or two songs are missing<sup><a href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1</a></sup> and the cover is never baked into the file. Overall buying music from iTunes is just a worse experience and in addition it feels like it could go away at any moment, so I was looking into alternatives and, oh person, it does not look great out there.</p>\n<p>In the table below you can see a couple of albums that I looked up on various platforms with the corresponding price. I looked up albums from four different eras: very recent (2024), streaming era (2015-2022), CD era (90s), and pre-CD era (before 1980). I checked each album on Bandcamp, iTunes, <a href=\"https://at.7digital.com/\">7digital</a>, <a href=\"https://www.qobuz.com/\">Qobuz</a> and Amazon.</p>\n<p>Before I say anything else, I want to repeat taht when an album is available on Bandcamp you should always buy it on Bandcamp! If you buy music instead of streaming it you probably want to support artists and Bandcamp, even under the new ownership, still pays artists the most money and the first Friday of each month is still Bandcamp Friday where all the money goes to the artist.</p>\n<p>When I looked at the prices I was not expecting so much fluctuation and differences in prices across various services and that there is not a cheap and a premium option. It really depends on the album which store is the cheapest. Usually either iTunes or Amazon had the best price, but with quite huge differences. For example, <em>Letting off the Happiness</em> by Bright Eyes is €4.99 at Amazon, but €8.99 at iTunes, while <em>Horses</em> by Patti Smith is €6.99 at iTunes and €10.32 at Amazon. Anyway, I try to avoid giving Jeff Bezos more money and I will continue to ignore Amazon, even if they are the cheapest option.</p>\n<p>Qobuz is directed towards audiophiles and their high prices reflect that. They also have a streaming service and members can buy music for a reduced price, which is always the price they feature prominently on their website and you need to click on the price to get the real price, which is very often the highest one. It's owned by a French company, some kind of media conglomerate, I don't know, their <a href=\"http://www.xandrie.com/en/about/\">about page</a> says nothing in so many words.</p>\n<p>Next up is 7digital, which was a MP3 store, but now is also some kind of B2B music licensing company from the UK. It still has that MP3 store, but I was not able to find all the albums, which is either because they don't sell them or their search is bad <span role=\"img\" aria-label=\"man shrugging\">🤷‍♂️</span> Their prices are usually somewhere in the middle and sometimes they match the best price.</p>\n<p>I want to mention two more MP3 stores: <a href=\"https://jam.coop\">jam.coop</a> and <a href=\"https://mirlo.space\">Mirlo</a>. Both are worker co-operatives, but their catalog is very limited and I could not find anything I wanted to buy there. I will keep an eye and see if their catalogues are continuing to grow.</p>\n<p>If I missed a MP3 store please let me know on <a href=\"https://constant.social/@florian\">Mastodon</a> or via <a href=\"/contact/\">email</a>.</p>\n<style>\n.mp3-price-comparison table {\n  border-spacing: 0;\n}\n.mp3-price-comparison thead th:first-child {\n  text-align: left;\n}\n.mp3-price-comparison tbody th {\n  font-weight: normal;\n  text-align: left;\n}\n.mp3-price-comparison th,\n.mp3-price-comparison td {\n  padding: 0 3px;\n}\n.mp3-price-comparison tbody tr:nth-child(2n+1) th,\n.mp3-price-comparison tbody tr:nth-child(2n+1) td {\n  background: #efefef;\n}\n.mp3-price-comparison .price {\n  font: var(--monospaceFontSize) var(--monospaceFont);\n  text-align: right;\n}\n</style>\n<div class=\"table-container mp3-price-comparison\">\n  <table>\n    <thead>\n      <tr>\n        <th>Album</th>\n        <th>Bandcamp</th>\n        <th>iTunes</th>\n        <th>7digital</th>\n        <th>qobuz</th>\n        <th>Amazon</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <th>TORRES — What an enormous room (2024)</th>\n        <td class=\"price\">€10.73</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€10.99</td>\n        <td class=\"price\">€12.59</td>\n        <td class=\"price\">€9.99</td>\n      </tr>\n      <tr>\n        <th>The Smile — Wall Of Eyes (2024)</th>\n        <td class=\"price\">€11.10</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€9.52</td>\n        <td class=\"price\">€13.99</td>\n        <td class=\"price\">€9.99</td>\n      </tr>\n      <tr>\n        <th>Sleater-Kinney — Little Rope (2024)</th>\n        <td class=\"price\">€11.10</td>\n        <td class=\"price\">€10.99</td>\n        <td class=\"price\">€14.19</td>\n        <td class=\"price\">€17.29</td>\n        <td class=\"price\">€10.99</td>\n      </tr>\n      <tr>\n        <th>The National — Sleep Well Beast (2017)</th>\n        <td class=\"price\">€9.24</td>\n        <td class=\"price\">€10.99</td>\n        <td class=\"price\">€10.49</td>\n        <td class=\"price\">€9.79</td>\n        <td class=\"price\">€9.99</td>\n      </tr>\n      <tr>\n        <th>Caroline Polachek — Pang (2019)</th>\n        <td class=\"price\">€12.02</td>\n        <td class=\"price\">€14.99</td>\n        <td class=\"price\">€11.49</td>\n        <td class=\"price\">€17.69</td>\n        <td class=\"price\">€9.99</td>\n      </tr>\n      <tr>\n        <th>Mitski — Be The Cowboy (2018)</th>\n        <td class=\"price\">€12.95</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€12.59</td>\n        <td class=\"price\">€9.99</td>\n      </tr>\n      <tr>\n        <th>Radiohead — OK Computer (1997)</th>\n        <td class=\"price\">€9.24</td>\n        <td class=\"price\">€10.99</td>\n        <td class=\"price\">€10.49</td>\n        <td class=\"price\">€9.79</td>\n        <td class=\"price\">€9.99</td>\n      </tr>\n      <tr>\n        <th>Alanis Morissette — Supposed Former Infatuation Junkie (1998)</th>\n        <td class=\"price\">n/a</td>\n        <td class=\"price\">€11.99</td>\n        <td class=\"price\">€11.49</td>\n        <td class=\"price\">€17.49</td>\n        <td class=\"price\">€11.99</td>\n      </tr>\n      <tr>\n        <th>Bright Eyes — Letting off the Happiness (1998)</th>\n        <td class=\"price\">€9.25</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€10.19</td>\n        <td class=\"price\">€4.99</td>\n      </tr>\n      <tr>\n        <th>Jimi Hendrix — Electric Ladyland (1968)</th>\n        <td class=\"price\">n/a</td>\n        <td class=\"price\">€9.99</td>\n        <td class=\"price\">n/a</td>\n        <td class=\"price\">€14.79</td>\n        <td class=\"price\">€10.99</td>\n      </tr>\n      <tr>\n        <th>Patti Smith — Horses (1975)</th>\n        <td class=\"price\">n/a</td>\n        <td class=\"price\">€6.99</td>\n        <td class=\"price\">n/a</td>\n        <td class=\"price\">€8.89</td>\n        <td class=\"price\">€10.32</td>\n      </tr>\n      <tr>\n        <th>X-Ray Spex — Germ Free Idolescents (1978)</th>\n        <td class=\"price\">n/a</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€8.99</td>\n        <td class=\"price\">€12.59</td>\n        <td class=\"price\">€8.99</td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n<section data-footnotes=\"\" class=\"footnotes\"><h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"user-content-fn-1\">\n<p>I use <a href=\"https://mp3tag.app/\">Mp3tag</a> by Florian Heidenreich to tag my music and to rename files based on ID3 tags. <a href=\"#user-content-fnref-1\" data-footnote-backref=\"\" class=\"data-footnote-backref\" aria-label=\"Back to content\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "/blog/a-man-walks-into-the-mp3-store/",
            "title": "A Man Walks Into The MP3 Store",
            "summary": "My journey into buying MP3s in the 2020 looking into various stores available and comparing some prices.",
            "date_modified": "2024-02-05T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/eleventy-plugin-asset-pipeline/",
            "content_html": "<p>If you like fast websites you probably also like Eleventy. Eleventy is my go to tool if I want to quickly build a fast and easy to maintain small website. Every time I create a new website I start with the simplest possible setup an expand it when required, which at some point also leads me to implement some kind of cache busting technique. Cache busting is necessary when you configure caching of static assets, such as CSS, JavaScript or images, and you want a way to tell the browser to load the newest version of these assets. Eleventy does not include any asset handling by default, this gives us the freedom to use whatever we want, but it also requires us to set something up. Max Böck describes a couple of different variants in his blog post <a href=\"https://mxb.dev/blog/eleventy-asset-pipeline/\">Asset Pipelines in Eleventy</a>.</p>\n<p>Another method is defining a custom template format, for example, described in the Eleventy documentation in the chapter on <a href=\"https://www.11ty.dev/docs/languages/custom/#using-inputpath\">custom template languages</a> and there are a couple of plugins that integrate one or the other asset toolchain with Eleventy (for example, <a href=\"https://github.com/bart-jaskulski/eleventy-postcss-extension\">PostCSS</a>), but none are dead-simple pure cache busting with the option to add a bit of processing later. This is why I created a plugin to do just that.</p>\n<p>I wanted to have one line configuration for the simple use case and the following line processes CSS and JavaScript files and it adds a hash based on the file content to the file name and in addition it will also save a <code class=\"language-text\">manifest.json</code> with a map from original to hashed file name.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">eleventyConfig<span class=\"token punctuation\">.</span><span class=\"token function\">addPlugin</span><span class=\"token punctuation\">(</span>cssPipelinePlugin<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">extensions</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'css'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'js'</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In our template we can link a JavaScript file by using the <code class=\"language-text\">hashFileName</code> filter:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">&#x3C;script src=\"{{ \"/assets/main.js\" | hashFileName }}\" async><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&#x3C;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>The plugin accepts an option called <code class=\"language-text\">compilerFns</code>, which is an object of functions that can compile a certain file type. For example, let's say we want to process CSS files with PostCSS:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">eleventyConfig<span class=\"token punctuation\">.</span><span class=\"token function\">addPlugin</span><span class=\"token punctuation\">(</span>cssPipelinePlugin<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">extensions</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'css'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'js'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">compilerFns</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function-variable function\">css</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">inputContent<span class=\"token punctuation\">,</span> inputFile</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n      <span class=\"token function\">postcss</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'postcss-import'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span>inputContent<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">from</span><span class=\"token operator\">:</span> inputFile <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> result<span class=\"token punctuation\">.</span>css<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>And just like before we can use the <code class=\"language-text\">hashFileName</code> in our templates:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\">&#x3C;link rel=\"stylesheet\" href=\"{{   \"/assets/main.css\" | hashFileName }}\" /></code></pre></div>\n<p>If you are interested you can install the plugin using the following command:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-D</span> fec/eleventy-plugin-asset-pipeline</code></pre></div>\n<p>You can find more information about the project on <a href=\"https://codeberg.org/fec/eleventy-plugin-asset-pipeline\">Codeberg</a> and <a href=\"https://www.npmjs.com/package/@fec/eleventy-plugin-asset-pipeline\">NPM</a>.</p>",
            "url": "/blog/eleventy-plugin-asset-pipeline/",
            "title": "@fec/eleventy-plugin-asset-pipeline: Better Cache Busting with Eleventy",
            "summary": "I have created an Eleventy plugin to easily implement cache busting and asset handling.",
            "date_modified": "2024-02-18T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/hiking-along-the-semmering-railway/",
            "content_html": "<p>One of the great joys of visiting family in Styria is the <a href=\"https://en.wikipedia.org/wiki/Semmering_railway\">Semmering railway</a>, which is the most scenic train in Austria. When the railway was completed in 1854 it was the first mountain railway built with standard gauge and used to connect Vienna to the port in Trieste. On Easter Sunday we decided to not just travel over Semmering, but get off and hike the <a href=\"http://www.semmeringbahn.at/bahnwanderweg.php\">railway trail</a>. The trail starts at the Semmering station and passes by various stations, which allows hikers to choose their preferred distance. We choose to hike until Payerbach-Reichenau (21 km), the other stations are Breitenstein (9 km), Klamm (15 km), and Gloggnitz (23 km).</p>\n<p>This is quite a long hike, but it is relatively easy (if the ground is dry), there are only a couple of steep passages. If you start at Semmering the trail goes up and down, but mostly down. The trail is superbly marked and there are quite a lot of plaques explaining the history of the Semmering railway. However, we were hiking the trail quite early in the season and we did not see a single open inn along the way. We didn't even encounter a drinking fountain anywhere on the 21 km track.</p>\n<p>On this years Easter Weekend half of Europe was covered in Sahara dust, this gave the scenery a surreal look, but it is beautiful in any way. There is definitely a reason why after the railway was built Semmering became a major tourist destination and multiple grand hotels were built. It's just a bit sad that they seem mostly empty now and are falling in disrepair. However, nature still delivers with its views. The one depicted in the third photo was even depicted on the 20 Schilling banknote for a couple of years.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcFBv/EACkQAAECBQIFBAMAAAAAAAAAAAECAwAEBREhEiIGBxNhcRRCUYExQZH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAgP/xAAdEQACAQQDAAAAAAAAAAAAAAAAAQIDBBETEjFB/9oADAMBAAIRAxEAPwCr8P8AEtJryQmRdR19Nyy4nSsePn6jbSlQG028GIGacJFbU8JpcshG8dPC05xbt3jbd5iVKlyzKJx6WmH3GUupW0LpybaVYG4fuIp3HJGc7ZweCwFlRyVf0wiBU3mvWGhM9Vxt3U+taSWwdIJwB2hGm1kaEdHMj13Cjj8xucS4q3xhIxY+ImVeUGzJtoSgNn22wPdj7UYQgVHwdPowpVsIaskqAJJ/PeEIQgOj/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-1-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-1-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-1-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-1-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-1-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-1-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-1-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-1-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-1-320.jpg\" alt=\"On the left a hiking trail leading towards a forrest, right next to it three train tracks next to each other and a bit bag a white house next to the tracks\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Rails near the trail head at Semmering station</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAMFBgT/xAAnEAACAQMCBQQDAAAAAAAAAAABAgMABBEFIQYSE3HBFCIxQVFhof/EABgBAAMBAQAAAAAAAAAAAAAAAAABAwIE/8QAHhEAAgEDBQAAAAAAAAAAAAAAAAIBAxExEiEyQVH/2gAMAwEAAhEDEQA/ANHHqsF+jQ6VYI8uASXkCYP0Bjcn+VbCxvYYJJFuwlxHGTJGyDBPyAD5rLx67bQqqixeeWE4M0kYUjfb9j5qeXi68adDcNEEcEKMe0Ab471C6rtccHfp91rN3bLMw6fMTgO5Q47Uqmn4q1GFgkD2yxcoKgoG2NKNaegV3G0jWutWfROAY9x2281nddYpFCYyVzvsSce/H3SlcVPnA37INfb0txbxxKOXoqd8/kjxSlKquIMzk//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-2-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-2-1920.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-2-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-2-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-2-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-2-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-2-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-2-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-2-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-2-320.jpg\" alt=\"A rock face with train tracks going through a tunnel, on top of the rock face are trees and the picture is taken from across the valley looking down to the rock face\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Semmering railway passes through Pollereswand</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwME/8QAJhAAAgEEAQMDBQAAAAAAAAAAAQIDAAQRIRIFIlEGMUETIzOB0f/EABcBAQEBAQAAAAAAAAAAAAAAAAIDAQX/xAAdEQACAgEFAAAAAAAAAAAAAAAAAQIhAxESEzFR/9oADAMBAAIRAxEAPwDS7L1NbTKSrBcDPFvf+Vxl9ZwW+7i2uERto5TKnxsHX7rIDfSS/kQRo2hwzgHwwOxXujkVII/qXNxHGT96Md3x2kZOPjxRbsmoov8Ac+vHWTtt8KRle4HIpVCF1AEVYeq3iKBjHBhvO/YeaUeSPotpWkvZ5YZZDJxdAACoAqPueq3kZVllILrzOvkHVKVy8duxNkKeq3U0kjyuGbkRk5pSlX0NXR//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-3-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-3-1920.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-3-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-3-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-3-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-3-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-3-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-3-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-3-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-3-320.jpg\" alt=\"In the foreground a densly forrested rock face with train tracks leading through a tunnel and across multiple viaducts and in the background are taller mountains that are still covered in snow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">20-Schilling-Blick: Viaduct across Kalte Rinne with Rax behind</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBAUH/8QAJBAAAgEDAwMFAAAAAAAAAAAAAQIDAAQRBRIhBxMxIkFRYXH/xAAXAQADAQAAAAAAAAAAAAAAAAACAwQA/8QAGxEAAwACAwAAAAAAAAAAAAAAAAERAhIhQkP/2gAMAwEAAhEDEQA/ANTpftttJF1L6UwIhtdwGwScsDwDn8qnluxdO8hk3qM454GKk+nrJqFlJbTrI0E0qIeyQuMtjd4qi161sI9LMcdvPH6JtjGQYQAgZP22fHtg1NteKFinKjg6jqwF5IqKWVSACB9UrhizdSQQW+CQpPj5NKOGjLTpxBHG9320VVQqoUAY5zz+1l6g3EkVrIUYDcCDwDSlSew7qefpM7IpLe1KUqwWf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-4-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-4-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-4-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-4-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-4-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-4-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-4-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-4-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-4-320.jpg\" alt=\"View through a gap in the trees to a viaduct which has a freight train currently travelling over it, in the background hills covered trees\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Freight train travelling over Adlitzgraben-Viadukt</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYHBQj/xAAnEAACAgIBAwMEAwAAAAAAAAABAgMEABEFBiFREiIxB2GBkRMVQf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAH/xAAbEQADAAIDAAAAAAAAAAAAAAAAARECEgMhUf/aAAwDAQACEQMRAD8AsPpL12eTqf1XUkwh5aPSxvL7f5l8b8jX5y46mZ4eBvNAsbOqA+5iAB6hsk/YZgk9areRWsuY5tEqwGmJBP532yhvc/yk3TVSjNcll3ciDSvGV3X7Ahm+G7n58YtZeg6tdGiVuoV5NGnoTJLCGK+sRaBI8bJOu4+cZ5sscnYqSlIZ2jU+4hXKjf7+2MNKozZGjXUWcASL/utjsc5lusaqpLFZs+xwwRpPUpI8g4xknC6PzJa5zVlLMiPHUmKkj1S1kZv3rGMZTEBT/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-5-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-5-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-5-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-5-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-5-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-5-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-5-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-5-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-5-320.jpg\" alt=\"Train tracks leading through a mountains area, on the left is a rock face with trees on top of it\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Tracks of Semmering railway near Adlitzgraben</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwIF/8QAKBAAAgEEAAQFBQAAAAAAAAAAAQIDAAQFERIhMUEGIlFhcRMUI5Gh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIB/8QAHBEAAgICAwAAAAAAAAAAAAAAAAECAyFBBBIx/9oADAMBAAIRAxEAPwCFJg4p4TLjJHUq22Mmyg124ta/deKIcljl+pcRMqll4JlPlHPZ0Ry6Vpt5Y3FoAbe5mijVCQInC60CAQPbe9dK6muIo7Y3OVgSSGbijMkarqfYIVHXpvmDxDprdBC9TwinSmZ1eZW6huGAniAbzAJGrD+ka+PWlRc7hLOO+/JGylkBAWE6121ogdqVHWOw8o0i8ytwUnlIjIV3jVOHyqAR29ao3h/J3WYyt099KX+0uDbwgDQRfj1pSs42xZNpIr3iiaO2yrLHaWxDKGPEpPM796UpVBv0/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-6-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-6-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-6-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-6-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-6-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-6-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-6-320.jpg\" alt=\"A red and black passenger train is passing over a viaduct that spans a valley, in the background we see a forrest\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">RailJet passes over Adlitzgraben-Viadukt</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFAQP/xAAnEAACAQMDAgYDAAAAAAAAAAABAgMABBEFEiEGURMiMTJhcRRCkf/EABcBAAMBAAAAAAAAAAAAAAAAAAACAwT/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIRAzESIVFh/9oADAMBAAIRAxEAPwCXTuh9MtrS0h6nvpLp7QMsa28vuyc89gMDv9VvCXS9PtgmkaRBEsY2iSXDNj1/apIVDN4cUbNKnm8SXyq5I9O/H1UE7R3Nw8Mh/IIzvRmwo74HqRWV5L0VWJL4J+oGllZnvXBzjkM38wcYpXjJLLA2yM2irj27wu34pRUn6Nwidi1C4cKNyru8p2qBxis29meC3MiEb3YhiQOQM8UpSJ9hLZFb2hlt45WubgM4JOGHcjt8UpStVEz/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-7-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-7-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-7-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-7-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-7-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-7-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-7-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-7-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-7-320.jpg\" alt=\"Picture taken from an embankment down to the tracks, the embankment is covered in alpine low-growth plants, behind the tracks there are trees\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAYEBwj/xAAqEAACAgEDAgQGAwAAAAAAAAABAgMEEQAFIRIxBiJBUQcTIzKBwXGhsf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAH/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQMRITECEhT/2gAMAwEAAhEDEQA/ALnZ/H3TF83cp61iuQv1K6lZFJ9DHnzY9cf3qur7jS3CsbNW3DLAoyzq/C/z7fnXPvh5Yr+02Lt6SKa8jukTKvUOrBC8Zx92DnHbOsvNuKskMgVZ5qzCR+jpEZyeyjvwSOfYanU9bNcdl7vPxMhpbhJBXggMScBrEjoze5ChTgZ7Z501qazRht2ZHSwZgCAXkYAkkAnj86aD0MHoWdLYqG3JGlaIhUkBGWPcnP71P+NLUtbfJ6kB6IUgQqAORkMT/mmmkJ3yyVSKlgjKczrVjbykvlj1KD6kfrTTTTkKWj//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-8-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-8-1920.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-8-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-8-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-8-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-8-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-8-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-8-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-8-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-8-320.jpg\" alt=\"A two story train viaduct from below surrounded by trees and rock walls\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Krauselklause-Viadukt</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUHBP/EACUQAAEDAwMFAAMAAAAAAAAAAAEAAgMEBREGEiETIjFRcWGRof/EABcBAQEBAQAAAAAAAAAAAAAAAAEEAgP/xAAZEQADAQEBAAAAAAAAAAAAAAAAARECEiH/2gAMAwEAAhEDEQA/AIWnorlYdQ2+7OkibDCRvbKS3IzhwIx5AK3B+qqcgOhg3sIyHdTg/wAWVXV8sltlhY55y0saRzuOM4Po+vin6TvEE9smFPOHUrHAZGR387hz4PAXLLqovPLhrUmrKgOPTghDfzkos5ddgxxbnx65RaAjUdZPuLt5zvI/S6YbZS0/RihjEccxa57WgAE5PpEUlKF6UKOzwuZJmWftkc0dw8A/EREDD//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-9-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-9-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-9-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-9-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-9-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-9-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-9-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-9-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-9-320.jpg\" alt=\"Train tracks leading into a tunnel on a very step mountain side, in the background forest-covered hills\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Tunnel near Breitenstein</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMHCAIG/8QAJxAAAgEDAwMDBQAAAAAAAAAAAQIDAAQRBRIhBjFRImGhBxNBcYH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAwX/xAAdEQACAQQDAAAAAAAAAAAAAAAAAQIDERNREjFS/9oADAMBAAIRAxEAPwC547qBBH9ySNd5wuWA3H281FddRaRaKxnuYht4IGSc+1Z6j0LXH2zF2398tPg5/pzXGs6H1TLblbW5swxGMyT+ofo4qOamu5Bxei67n6jaJDKUUyMB+Syr8E5pWb36N6hc5kW03dsi8HPxSnPS9BaWj37zSxxl1lfPbk8VCtzKzKS7Hc2DyfFKViIsHzvPqbv5pSlDbuB//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-10-960.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-10-1920.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-10-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-10-640.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-10-1280.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-10-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-10-320.jpg, /blog/hiking-along-the-semmering-railway/bahnwanderweg-10-640.jpg 2x, /blog/hiking-along-the-semmering-railway/bahnwanderweg-10-960.jpg 3x\" src=\"/blog/hiking-along-the-semmering-railway/bahnwanderweg-10-320.jpg\" alt=\"A meadow with hills covered in forrest in the background, larger mountains loom in the background\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/hiking-along-the-semmering-railway/",
            "title": "Hiking along the Semmering railway",
            "summary": "A couple of pictures from a hike along the Semmering railway on Easter Sunday.",
            "date_modified": "2024-04-07T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/11ty-content-env-variables/",
            "content_html": "<p>I had to deal with an extreme edge case in Eleventy today. Since I'm currently looking for a new job I have updated my <a href=\"/cv\">CV</a> recently and I decided to use the HTML version I have on this website as basis to generate a PDF that I can send to companies. When I generate the PDF I want to include my address and phone number on the CV, but I don't want to put them online and I don't want to commit them either, since the Git repository is also public.</p>\n<p>At first I put this off and manually added my address and phone number whenever I wanted to generate a new version, but then I remembered that this is <a href=\"https://www.11ty.dev\">Eleventy</a> and Eleventy is amazing and it's probably extremely easy to do this and I was right.</p>\n<p>I want to store private data in an environment variable, since these are not stored in Git and are not automatically deployed to my server. Whenever I want to make data available to templates in Eleventy, I reach for <code class=\"language-text\">.11tydata.js</code> files:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// site/cv.11tydata.js</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">cv_address</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">FEC_CV_ADDRESS</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">cv_phone</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">FEC_CV_ADDRESS</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now, in the template governing my CV, I can use <code class=\"language-text\">cv_address</code> and <code class=\"language-text\">cv_phone</code> to render these private values. If the variable has a value, I want to render these nicely:</p>\n<div class=\"gatsby-highlight\" data-language=\"nunjucks\"><pre class=\"language-nunjucks\"><code class=\"language-nunjucks\">// site/cv.njk\n{% if cv_address %}\n  &#x3C;li>&#x3C;strong>Address:&#x3C;/strong> {{ cv_address }}&#x3C;/li>\n{% endif %}\n{% if cv_phone %}\n  &#x3C;li>&#x3C;strong>Phone:&#x3C;/strong> {{ cv_phone }}&#x3C;/li>\n{% endif %}\n</code></pre></div>\n<p>I can set the environment variable in my shell before building my site using <code class=\"language-text\">export FEC_CV_ADDRESS=\"My address\"</code>, but it is cumbersome to type this every time. Luckily I can reach to a great library called <a href=\"https://github.com/motdotla/dotenv\">dotenv</a> that allows me to define the environment variables in a file that is ignored by Git.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token assign-left variable\">FEC_CV_ADDRESS</span><span class=\"token operator\">=</span><span class=\"token string\">\"My address\"</span>\n<span class=\"token assign-left variable\">FEC_CV_PHONE</span><span class=\"token operator\">=</span><span class=\"token string\">\"My phone number\"</span></code></pre></div>\n<p>In my Eleventy config I then import the package and call it to activate dotenv. Then everything defined in <code class=\"language-text\">.env</code> is available as an environment variable in Node.js.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// .eleventy.js</span>\n<span class=\"token keyword\">const</span> dotenv <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'dotenv'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ndotenv<span class=\"token punctuation\">.</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>",
            "url": "/blog/11ty-content-env-variables/",
            "title": "Using Environment Variables in Eleventy Content Pages",
            "summary": "Explains how you can use environment variables in Eleventy content pages",
            "date_modified": "2024-08-28T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/preact-iso-mock-uselocation/",
            "content_html": "<p>I'm currently working on an application that uses <a href=\"https://preactjs.com\">Preact</a> and <a href=\"https://github.com/preactjs/preact-iso\">preact-iso</a> for server-side rendering and routing. preact-iso provides the <code class=\"language-text\">useLocation()</code> hook to access the current URL in a component. When testing such a component I need to mock the location, but I was having troubles figuring out how I'm able to do this.</p>\n<p>After reading the source code of <a href=\"https://github.com/preactjs/preact-iso/blob/main/src/router.js#L73\"><code class=\"language-text\">LocationProvider</code></a> component I found an undocumented and wrong way to achieve this, but after creating an issue Ryan Christian, one of the Preact developers, <a href=\"https://github.com/preactjs/preact-iso/issues/41#issuecomment-2403372279\">pointed me to the correct solution</a>.</p>\n<p>But let's start at the beginning. We have a component that needs access to the current URL, for example, to check if a given URL is currently active:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Link</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> href<span class=\"token punctuation\">,</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> url <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useLocation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> isActive <span class=\"token operator\">=</span> url <span class=\"token operator\">===</span> href<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&#x3C;</span>a href<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>href<span class=\"token punctuation\">}</span> className<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>isActive <span class=\"token operator\">?</span> <span class=\"token string\">'active'</span> <span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>To test the logic in this component, we need to write two tests: one to check if the given <code class=\"language-text\">href</code> is active and a negative case. I am using <a href=\"https://vitest.dev\">vitest</a> and <a href=\"https://github.com/testing-library/preact-testing-library#readme\">@testing-library/preact</a>, but this should work with all testing frameworks.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Link should render active link with class'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&#x3C;</span>LocationProvider<span class=\"token operator\">></span>\n      <span class=\"token operator\">&#x3C;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/active\"</span><span class=\"token operator\">></span>My link<span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n    <span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>LocationProvider<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> link <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> screen<span class=\"token punctuation\">.</span><span class=\"token function\">findByRole</span><span class=\"token punctuation\">(</span><span class=\"token string\">'link'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>link<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Link should render not active link without class'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&#x3C;</span>LocationProvider<span class=\"token operator\">></span>\n      <span class=\"token operator\">&#x3C;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/not-active\"</span><span class=\"token operator\">></span>My link<span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n    <span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>LocationProvider<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> link <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> screen<span class=\"token punctuation\">.</span><span class=\"token function\">findByRole</span><span class=\"token punctuation\">(</span><span class=\"token string\">'link'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>link<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>not<span class=\"token punctuation\">.</span><span class=\"token function\">toHaveClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In order to make both tests pass, we need to mock the location by using the snippet that Ryan suggested to me:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">mockLocation</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">path</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  globalThis<span class=\"token punctuation\">.</span>location <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> u <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">URL</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'http://localhost'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> i <span class=\"token keyword\">in</span> u<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      globalThis<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">to[A-Z]</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span> <span class=\"token operator\">?</span> u<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>u<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">String</span><span class=\"token punctuation\">(</span>u<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now we can set the location before each test:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Link should render active link with class'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">mockLocation</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// Rest of the test...</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Link should render not active link without class'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">mockLocation</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// Rest of the test...</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>One thing that is super important to get this to work is that we have to wrap every component in <code class=\"language-text\">LocationProvider</code> since the provider is the one that actually picks up the location from the browser API. If we have a lot of tests that depend on the location and need to be wrapped in the provider, we can create a custom render function that always wraps the component in <code class=\"language-text\">LocationProvider</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> render <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@testing-library/preact'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">renderWithLocation</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ui<span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span>ui<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">wrapper</span><span class=\"token operator\">:</span> LocationProvider<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>options <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Our final test code is readable, stable, and allows us to test the full functionality of our application:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Link should render active link with class'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">mockLocation</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">renderWithLocation</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&#x3C;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/active\"</span><span class=\"token operator\">></span>My link<span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> link <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> screen<span class=\"token punctuation\">.</span><span class=\"token function\">findByRole</span><span class=\"token punctuation\">(</span><span class=\"token string\">'link'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>link<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Link should render not active link without class'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">mockLocation</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">renderWithLocation</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&#x3C;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/not-active\"</span><span class=\"token operator\">></span>My link<span class=\"token operator\">&#x3C;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> link <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> screen<span class=\"token punctuation\">.</span><span class=\"token function\">findByRole</span><span class=\"token punctuation\">(</span><span class=\"token string\">'link'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>link<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>not<span class=\"token punctuation\">.</span><span class=\"token function\">toHaveClass</span><span class=\"token punctuation\">(</span><span class=\"token string\">'active'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>",
            "url": "/blog/preact-iso-mock-uselocation/",
            "title": "Mocking useLocation in Isomorphic Preact",
            "summary": "I'm going to explain how you can mock useLocation() in a preact-iso app to test components using @testing-library/preact and vitest.",
            "date_modified": "2024-10-10T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/2024-10-19/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMHBAUG/8QAJRAAAQMDAgYDAAAAAAAAAAAAAQACAwQFEQYhEhMUMTJhUVJy/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAED/8QAFhEBAQEAAAAAAAAAAAAAAAAAABES/9oADAMBAAIRAxEAPwC8ubhDLsuIulzr56F0VFVtopiRidsYkIHoO2WmBvnDKG6jnbxdz00Zdn5yfWy00RZbpt+6KphFfWjA1XXn9QRkopojANbP9062fHkiKCF1ZNnyREQf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/2024-10-19/gmunden-1-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/2024-10-19/gmunden-1-640.jpg, /blog/2024-10-19/gmunden-1-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/2024-10-19/gmunden-1-320.jpg, /blog/2024-10-19/gmunden-1-640.jpg 2x, /blog/2024-10-19/gmunden-1-960.jpg 3x\" src=\"/blog/2024-10-19/gmunden-1-320.jpg\" alt=\"Lake on a very foggy day with limited visibility, from the right a half island extending into the lake with a white castle with a black roof, the rest of the half island is covered by trees, some of them hiding other buildings\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcIBv/EACYQAAEDAwMDBQEAAAAAAAAAAAECAwQABREhQVEHExQGEhYiMTL/xAAZAQACAwEAAAAAAAAAAAAAAAACBAABAwX/xAAdEQACAQUBAQAAAAAAAAAAAAAAAQIDESEiMQRB/9oADAMBAAIRAxEAPwDlOjXUGR6TvHiTHSq0TX/e8Fo+yM6dzPPP7oK1YmYhSEqQsKQoAhQOQRyKxuqwRbzdCzb2n3Zi14UkuapO6jgaDeq2ZHxOPbo1ycdetwbSz5BUR2lDYga4Ox23ofPWVs8JPbMS0qmIz/QpU6SbY8kOpffCVjIw8QCORgYpTl0Y3kT7pPFb8N2acl5ZLWuoAHG9dzfYjMuApmSgONqIyDvSlc6itEMr4Z8uF6ulhuEqBarjKjxEOkpbC8gZpSlGngqXT//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/2024-10-19/gmunden-2-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/2024-10-19/gmunden-2-640.jpg, /blog/2024-10-19/gmunden-2-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/2024-10-19/gmunden-2-320.jpg, /blog/2024-10-19/gmunden-2-640.jpg 2x, /blog/2024-10-19/gmunden-2-960.jpg 3x\" src=\"/blog/2024-10-19/gmunden-2-320.jpg\" alt=\"Lake promenade with the lake on the right side and a foot path in the middle separated from the water through a low height wall; on the left of the path are trees with orange leaves and green benches; in the background we can see a city built on the lake shore\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFBwH/xAAlEAABBAICAQMFAAAAAAAAAAABAAIDBAURBiESFDEyM0FRobL/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAEhEUH/2gAMAwEAAhEDEQA/AOvY7kMFmIExyRO+7XtIXuQ5ViqDK7rNsNFgbi8Gl/mPyNBTkWQZHF9QnQ32VNYJlHNYOpdviR08sQafCZ7QA0kDQB0OgF1t3Elx0uhnKGQrNsV7MboyS3twBBBI7B9vZFBegxbGta2DYA124n9lE06kXX7AZ8lk8KuTM4tj2td0GH+iiJ6y13ZCxv5oiKo//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/2024-10-19/gmunden-3-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/2024-10-19/gmunden-3-640.jpg, /blog/2024-10-19/gmunden-3-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/2024-10-19/gmunden-3-320.jpg, /blog/2024-10-19/gmunden-3-640.jpg 2x, /blog/2024-10-19/gmunden-3-960.jpg 3x\" src=\"/blog/2024-10-19/gmunden-3-320.jpg\" alt=\"Wooden stake coming out of the water with a headless female statue on top of it; in the background we can see wooden landing stages and a very small sailboat and in the very background is a white castle with dark roof that is covering a tiny island\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAcIAgUG/8QAJhAAAgEDBAEDBQAAAAAAAAAAAQIDAAQRBQYSITEHE0EVI5Gj0f/EABcBAAMBAAAAAAAAAAAAAAAAAAEDBAL/xAAcEQACAgIDAAAAAAAAAAAAAAAAAQIRITEDBEH/2gAMAwEAAhEDEQA/AM9neoR2ZrEukwxxNBJOPfc5zgnyO/jv8VM9zvm3tWhW5uraEzELGJJAvMnwBk91Wy21ywWR4oWQQ378p5bqNZQ8p8LgDITPg5zXNbz0zWPq/vX0c90t032ChLLhgOKKB4OCOqxwzq7yGSvJc+DcsDRgzFlf5AGaVEmzLTVTtbTBLJKZFhVG9xAWBHRBJPeCCM0qvD8FEJem9nDfbisorhcxiQPxHgnJ/gqwe240ezcMoOREP0pSlTdfbGS0aHRrBLqx5Sz3YKTTRjhcOgIWVwOgQM0pSktuyhI//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/2024-10-19/traunkirchen-1-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/2024-10-19/traunkirchen-1-640.jpg, /blog/2024-10-19/traunkirchen-1-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/2024-10-19/traunkirchen-1-320.jpg, /blog/2024-10-19/traunkirchen-1-640.jpg 2x, /blog/2024-10-19/traunkirchen-1-960.jpg 3x\" src=\"/blog/2024-10-19/traunkirchen-1-320.jpg\" alt=\"Boat house filled with boats out of dark wood on a lake on a very foggy day, there is a mountain in the background that is not really visible because of the fog; on the left of the boat house is a footpath that separates the water from a stone cliff, in the front two wooden boats are in the water\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcGAQP/xAAoEAABAwMEAQIHAAAAAAAAAAABAgMEABESBQYTIUExcQcUFzJRocH/xAAWAQEBAQAAAAAAAAAAAAAAAAADBAL/xAAcEQEBAQEAAgMAAAAAAAAAAAABAgARAyExUWH/2gAMAwEAAhEDEQA/ANf8L5UfY+xyvcspiJkoPL5Fm7WQAxV191x4r0+um0VSzHZVNePJxpW0zklX4I7v34HrULg751TW9LhNzm43IzIbeceuRngoKHQ6F/NbgaxpKHUSsGEOElaXixZWR9Te171RBESA+sV00qmuGg7iVrOnImp02ZDbcJwblpDbhA8lNzbz6+9KkzG6kraBblLWkdXCVn+UpCo+9jv5o3Gbbano4G0tJUoKxTewJ9613zL1ieRXt4pSpPJSTPHUwCvdyDuOYljFTcZeJIyUjv8ARFKUrZdc+cSHd//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/2024-10-19/traunkirchen-2-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/2024-10-19/traunkirchen-2-640.jpg, /blog/2024-10-19/traunkirchen-2-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/2024-10-19/traunkirchen-2-320.jpg, /blog/2024-10-19/traunkirchen-2-640.jpg 2x, /blog/2024-10-19/traunkirchen-2-960.jpg 3x\" src=\"/blog/2024-10-19/traunkirchen-2-320.jpg\" alt=\"Statue of a man on a pedestal, but the man is bending backwards by 90 degree by his knees; it is standing near the waters edge and in the background a parts of mountain is visible through the heavy fog\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwT/xAApEAACAQMCBAUFAAAAAAAAAAABAgMABBEFIRITMYEGQVFhcRYiIzSR/8QAGAEAAgMAAAAAAAAAAAAAAAAAAgMAAQT/xAAZEQEBAQEBAQAAAAAAAAAAAAABABExAjL/2gAMAwEAAhEDEQA/AM9bW9jcaBcGUTLfRq0kjk5HEWAVKhXFiPwuUxKhwu+1aHSRbHTL9JEla+OBFEoyGHmx8yRscfNd7bTn1KOdeY0TRQmXLL6ex36996xGuRYtl+RAv7EXFKd2JTO/9FKrcq/lJ4LZCF+3aYL79D80ohpjU5reP6emY5Z1EMgc9QTkmvLpmo3cGnXkonkkEKgokp4lGWHruOxpSq4GTX6K/B4es7qCKfiniLqGKo+2e4JpSlMAyH12/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/2024-10-19/traunkirchen-3-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/2024-10-19/traunkirchen-3-640.jpg, /blog/2024-10-19/traunkirchen-3-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/2024-10-19/traunkirchen-3-320.jpg, /blog/2024-10-19/traunkirchen-3-640.jpg 2x, /blog/2024-10-19/traunkirchen-3-960.jpg 3x\" src=\"/blog/2024-10-19/traunkirchen-3-320.jpg\" alt=\"Wall covered mostly in ivy with a wooden hand railing\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/2024-10-19/",
            "title": "19.10.2024",
            "summary": "Photos from around Traunkirchen and Gmunden",
            "date_modified": "2024-10-22T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/launchbar-action-kagi-search/",
            "content_html": "<p>Recently I switched back to using <a href=\"https://kagi.com\">Kagi</a> and since <a href=\"https://www.obdev.at/products/launchbar/index.html\">LaunchBar</a> is one the most essential parts of my computing life I wanted to have a better experience than just a custom search template.</p>\n<p>I have created an action that allows me to initiate Kagi searches from LaunchBar with search suggestions and thumbnails.</p>\n<p><img src=\"/blog/2024-10-27-launchbar-action-kagi-search/launchbar-action-kagi.gif\" alt=\"Animation showing the LaunchBar input box with the Kagi action and then &#x22;olivia rodrigo&#x22; is typed and the window fills with suggestions based on the input including small images\"></p>\n<p>It is based on an <a href=\"https://github.com/Ptujec/LaunchBar/tree/master/Search-Actions/Kagi.com.lbaction\">action</a> by <a href=\"https://github.com/Ptujec\">Christian Bender</a> that did a lot of things I wanted to have, but not everything.</p>\n<h2>Download</h2>\n<ul>\n<li><a href=\"https://drop.florian.ec/launchbar-action-kagi.lbaction\">launchbar-action-kagi.lbaction</a></li>\n</ul>\n<h2>Installation</h2>\n<ol>\n<li>Double click <code class=\"language-text\">launchbar-action-kagi.lbaction</code></li>\n<li>Click \"Install\"</li>\n<li>When you first trigger the Kagi action, you need to configure the Kagi API Token by following the instructions in the alert box</li>\n</ol>\n<h2>Change log</h2>\n<h3>Version 1.0.0 (27 October 2024)</h3>\n<ul>\n<li>Initial release</li>\n</ul>\n<h2>License and Source Code</h2>\n<p>You can find the <a href=\"https://codeberg.org/fec/launchbar-action-kagi\">source code on Codeberg</a> and it is licensed with the <a href=\"https://codeberg.org/fec/launchbar-action-kagi/src/branch/main/LICENSE.md\">MIT License</a>.</p>",
            "url": "/blog/launchbar-action-kagi-search/",
            "title": "Kagi Search Action for LaunchBar",
            "summary": "Initiate Kagi searches from LaunchBar with search suggestions and thumbnails.",
            "date_modified": "2024-10-27T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2024/",
            "content_html": "<p>It's a tradition now: here are my favourite albums of the year.</p>\n<h2>Tigers Blood by Waxahatchee</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAcIAgQF/8QAJxAAAQMDAwMEAwAAAAAAAAAAAQIDBAAFERIhMQcTQQYUInEVMqH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwEEBf/EACARAAICAQMFAAAAAAAAAAAAAAECAAMREhNSITJRYZH/2gAMAwEAAhEDEQA/ALD91DiNSyjuAggj7rju2mwWe6s3nuG2uFw6kNu6WXlqB5QdgTzlOM+c1FjnV11p1xH4fC2Yr8h0d0kktgbIGkHBJGCRUNdXPWNymXxuQ5LkLRIC1MtKThMdAUUhCQfORkkjk7Uuxwe0ZMBSwyBLI3jrf6OgTCyl6VKwMlxhr4g5O2+KVTEXWev5qQpxStyeP5Ska7/UjZt4yQoMpyBGX7TDa1oLJcH76SQSAeRwOKxkwo86U2qa0l9xKtWtzdWVHJOfvelKxmsYA4Ms2sWcknrNRyDFC1AR28ZPilKUIdvMHes5H7P/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/waxahatchee-tigers-blood-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/waxahatchee-tigers-blood-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/waxahatchee-tigers-blood-320.jpg, /blog/favourite-albums-2024/waxahatchee-tigers-blood-640.jpg 2x, /blog/favourite-albums-2024/waxahatchee-tigers-blood-960.jpg 3x\" src=\"/blog/favourite-albums-2024/waxahatchee-tigers-blood-320.jpg\" alt=\"A person is standing on grass, wearing jeans, a red bra, a flannel shirt and a trucker cap standing next to a flag pole\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>My Light, My Destroyer by Cassandra Jenkins</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQADAAAAAAAAAAAAAAAAAAYCBQf/xAApEAACAgECBAQHAAAAAAAAAAABAgMEAAURBhIhMRUiQaEjQlFhgZHB/8QAFwEBAQEBAAAAAAAAAAAAAAAABAUCBv/EAB4RAAICAgIDAAAAAAAAAAAAAAECAAMREhNBMlKR/9oADAMBAAIRAxEAPwC7n08N8uTE9eKxJZSNXDQuUYOhXcj1G/cffNlxFx/p1Vng0WI37C95G8sQ/rfj95K6JxOy6tYm1oPK1tV8yDpGBv0Vfp75SrduongcLsRMJqHxDsuMs0p1baiatLHJE3ZgwxihdD4E4TS1a0jISyOR0HMgyw0y94i3LZrVyQN+dQyt7HGMlMzDudJYi65xKetp0JiBDSjf0DnGMZkWv7GCNNefEfJ//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-960.jpg, /blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-1920.jpg 2x, /blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-640.jpg, /blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-1280.jpg 2x, /blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-320.jpg, /blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-640.jpg 2x, /blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-960.jpg 3x\" src=\"/blog/favourite-albums-2024/cassandra-jenkins-my-light-my-destroyer-320.jpg\" alt=\"Person wearing a silver jacket standing in front of a violent sky holding up a violet carpet\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Little Rope by Sleater‐Kinney</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQYH/8QAIhAAAQMEAgIDAAAAAAAAAAAAAQIDEQAEBSESMQZhE1GB/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgUGAAT/xAAeEQABBAEFAAAAAAAAAAAAAAABAAIDESEEEiJBUf/aAAwDAQACEQMRAD8A8Zt8egLsud1bst3HbilabAmeWtdVu5rDYq3tgrC+R2mWKUgutt6UkExI9Sa4pN6w6eCXWCeC457E8TH7MR7qNnl0YxpaVWzYeebSnk2sxpYO566pMYJHUQTfmMqgfri2VoaRs7WtkLNVtcfGtIKgkHRnsTSqb+ct1rBJQkx1NKwZJWQukyQE2HBcnbKIfQR91PIuKU/BOgBApSmtc1LlVwSdmlKUSML/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/sleater-kinney-little-rope-960.jpg, /blog/favourite-albums-2024/sleater-kinney-little-rope-1920.jpg 2x, /blog/favourite-albums-2024/sleater-kinney-little-rope-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/sleater-kinney-little-rope-640.jpg, /blog/favourite-albums-2024/sleater-kinney-little-rope-1280.jpg 2x, /blog/favourite-albums-2024/sleater-kinney-little-rope-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/sleater-kinney-little-rope-320.jpg, /blog/favourite-albums-2024/sleater-kinney-little-rope-640.jpg 2x, /blog/favourite-albums-2024/sleater-kinney-little-rope-960.jpg 3x\" src=\"/blog/favourite-albums-2024/sleater-kinney-little-rope-320.jpg\" alt=\"Woman sitting on a green chair, another woman floating in the air, the floor is green, behind the two woman is a doorframe into another room, with a green sofa and green curtains\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>My Method Actor by Nilüfer Yanya</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwf/xAAqEAABBAECAwcFAAAAAAAAAAABAAIDBBESIQUGQRMVIjFRccFhYnOBsf/EABcBAQEBAQAAAAAAAAAAAAAAAAQDAgX/xAAbEQEAAwADAQAAAAAAAAAAAAABAAIRAxIhMf/aAAwDAQACEQMRAD8Anv4rUtXrlJkEosVwT4dw4e/Q9FW5NimisX/BK2lNIOzZM7L2OIzj2wFO4BSsycyVrFiLsXGJwkaWEDBOzc4887LXziZl9uahjrsMcmo7nVq3dj009fquXqWN8i60q0evs593cXmfI6rfp14Q7DWOqGQ/s6x/EVqlMwMkGfJ5+ESxcmThqm5PQpgDEWlo0+nRZbmGKFnDXuZDGHGN+4H3ndEV+QEdh6qJkx1OR2qz+Z3wiIoHyPn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/nilufer-yanya-my-method-actor-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/nilufer-yanya-my-method-actor-640.jpg, /blog/favourite-albums-2024/nilufer-yanya-my-method-actor-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/nilufer-yanya-my-method-actor-320.jpg, /blog/favourite-albums-2024/nilufer-yanya-my-method-actor-640.jpg 2x, /blog/favourite-albums-2024/nilufer-yanya-my-method-actor-960.jpg 3x\" src=\"/blog/favourite-albums-2024/nilufer-yanya-my-method-actor-320.jpg\" alt=\"Nilüfer Yanya sitting on a sink looking at herself in the mirror\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>No Obligation by The Linda Lindas</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgL/xAAkEAACAgICAQUAAwAAAAAAAAABAgMRAAQFIUEGEiIxURRCgf/EABYBAQEBAAAAAAAAAAAAAAAAAAUEBv/EACARAAICAQQDAQAAAAAAAAAAAAECABEDBAUxUSFhkeH/2gAMAwEAAhEDEQA/ANTCRszctFy0jINXkWh1w72ShUG7bx8SR4oZ1x0/HPt7BMskWlEQP5TlPZZ67P0B/uVXPbrbm1zWnvq0MO3yB1AIoxYj9oIcmvNN331eQuG9N7M25JxJikg4WeVwdeSUFm9osWV7UGia6sAYXpHcY0AagPVxN8WAoXcWx45+mbyQvryPFDIjxqfixP2PBxifWi12XXRZGSBREpZrNAULPk4xS2luPR6QoCyi67/ZlfWbNDq8YISI22uRZZGVRZBRj+eKFXeWTmeOGDVj29hEihHyVgHfv+zVZ66+8YyPYVBweezBd0YqBRkNJWUUpr9Nkkn9J8nGMZooOOJ//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/the-linda-lindas-no-obligation-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/the-linda-lindas-no-obligation-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/the-linda-lindas-no-obligation-320.jpg, /blog/favourite-albums-2024/the-linda-lindas-no-obligation-640.jpg 2x, /blog/favourite-albums-2024/the-linda-lindas-no-obligation-960.jpg 3x\" src=\"/blog/favourite-albums-2024/the-linda-lindas-no-obligation-320.jpg\" alt=\"Four mouths, the rest of the face covered in a floral pattern, the band name is on the left, the album title on the bottom\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>What an enormous room by TORRES</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUGAQME/8QAJBAAAgEDAwQDAQAAAAAAAAAAAQIDABEhBBJxBRMyUSMxQbH/xAAXAQADAQAAAAAAAAAAAAAAAAABAgQF/8QAHREAAgICAwEAAAAAAAAAAAAAAAIBAxESITEyUf/aAAwDAQACEQMRAD8Aw/beKOaI722qrkfotg8j+cVHaqN1lWMkWaw3ZsOavGn6XOvT4llR4iVU225tUVqtK/fdVdvjI8lNjfOKiel5bOCqLFjiJKiep6iElNKZYYxiwXJPs4+6VMyQ7nLdxRfOFNKGj/AbqW+LXzzRFXbEdlFvVaZLt5MTzSlalvuSFejlaCNjcrmlKUgx/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/torres-what-an-enourmous-room-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/torres-what-an-enourmous-room-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/torres-what-an-enourmous-room-320.jpg, /blog/favourite-albums-2024/torres-what-an-enourmous-room-640.jpg 2x, /blog/favourite-albums-2024/torres-what-an-enourmous-room-960.jpg 3x\" src=\"/blog/favourite-albums-2024/torres-what-an-enourmous-room-320.jpg\" alt=\"Woman dancing in an enormous, but barren room\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>The World Is Louder by Oxford Drama</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGBP/EACkQAAEDAwIFAwUAAAAAAAAAAAECAwQABREhMQYSE0FRBxRxImFjgbH/xAAXAQEBAQEAAAAAAAAAAAAAAAAGBAMF/8QAIxEAAgIBAgYDAAAAAAAAAAAAAQIAAyEEERITFDFxsUFCgf/aAAwDAQACEQMRAD8AlepfDktq82K82lt0wcMoU00TkErJ1SOx8/at1AtLti4UfhT1xlyFtIaadaHMQ4pY+nG4A87kk1WmNQHFx83MIgx4hdcQMYKE4Kl58Jz3yNayXEMpuXOtz1pnwnba/O66nIiebqa5HOpOmhPf90Z1Qte1CDhQxOO+Nh8+Z2tLZsEUZPEPYk65RpsV8JfcQoqBKSPAUR/QaV1Xt9px9rlebXypUCUq/Io6+N6Vtp2ZqwWGfEf1sSoJEi8N3SfYuJ4UqHMeX7gBt1p0hTakqznTtsNsVqbjeHL/AGpYkxIUdMGb0WUxWumAhSSCCB8A/IpSqFJ5X5A1ajqFO32HuSJMJhCwEpIGM7mlKVJXY5UZjdWO3ef/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/oxford-drama-the-world-is-louder-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/oxford-drama-the-world-is-louder-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/oxford-drama-the-world-is-louder-320.jpg, /blog/favourite-albums-2024/oxford-drama-the-world-is-louder-640.jpg 2x, /blog/favourite-albums-2024/oxford-drama-the-world-is-louder-960.jpg 3x\" src=\"/blog/favourite-albums-2024/oxford-drama-the-world-is-louder-320.jpg\" alt=\"A woman in a green shirt and beige overalls and a man in a yellow t-shirt are sitting on a table on a street, the front house is red, house in the back yellow\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Bright Future by Adrianne Lenker</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAcFBv/EACgQAAEDAwMDBAMBAAAAAAAAAAIBAwQABREGEiEHE0ExYXGBIiRCUf/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAdEQACAgEFAAAAAAAAAAAAAAAAAQIRAxIhMTJR/9oADAMBAAIRAxEAPwCQ9Muns3U2uYtiuDL8IUy/K3gomLQ4zhF8rlERfer5rLpFK0/bW3+mnfacUtkiE893O7u4QxUvRR8+3Pipd071rq8dRxo0K5x1fVsgQpkYXUAeFwhcKicJ5xmqXrSffp2m5b1w1fIBttB3tw2xjjuzyOB/Ikxn+qRz0OrFjjeRN0TW9dGLsE4ll3y3uyTTe6qofBL6pnz80rJm3yeb36xuMMim0QIlJce6/wC0p6ZCpenEaYkyBuhE2+42agpKQ4yuOcfGUSqPMuEiRb4TTpqTcge44K8oq/fzSlRnyjXHrIw7hHFqSQgq4+qUpRIp7H//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/adrianne-lenker-bright-future-960.jpg, /blog/favourite-albums-2024/adrianne-lenker-bright-future-1920.jpg 2x, /blog/favourite-albums-2024/adrianne-lenker-bright-future-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/adrianne-lenker-bright-future-640.jpg, /blog/favourite-albums-2024/adrianne-lenker-bright-future-1280.jpg 2x, /blog/favourite-albums-2024/adrianne-lenker-bright-future-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/adrianne-lenker-bright-future-320.jpg, /blog/favourite-albums-2024/adrianne-lenker-bright-future-640.jpg 2x, /blog/favourite-albums-2024/adrianne-lenker-bright-future-960.jpg 3x\" src=\"/blog/favourite-albums-2024/adrianne-lenker-bright-future-320.jpg\" alt=\"Close-up of Adrianne Lenker out of focus, she is wearing a cowboy hat\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>The Past Is Still Alive by Hurray For The Riff Raff</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFBgj/xAArEAABAwMBBgUFAAAAAAAAAAABAgMEAAURIQYSEzFBYQcUFiNxIiRjkaH/xAAWAQEBAQAAAAAAAAAAAAAAAAADBAL/xAAdEQADAAICAwAAAAAAAAAAAAAAAQIRMRJRAxMU/9oADAMBAAIRAxEAPwCpxL1HDai7b3PYPukAfTrgdfipnstBbibYsuzLKnzCZLrnmCUlW6VrIBGeWFo1xoTWX6yv8y0mVBCW2nyoJ4SAhKlpGSnePMgcxWJbr5tY1FXJ4dyYkoxJdUhhRITuADHRIwk9sd6nu6yuTK/HEpPjo9EuKSpxX2StNNCBjFKhLPiRe1tguTXkn88cLWe+QP5Sk977C+eejm/C/aKa24bIsMvQCVLSl1GSgqBBx+zXVWuMu8xNol3CVIcTBbMZlreAQE7gJJGNTlI+OmBSlJWkzEbwRyNNk8IAvuHGmpzSlKFoVU8bP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-640.jpg, /blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-320.jpg, /blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-640.jpg 2x, /blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-960.jpg 3x\" src=\"/blog/favourite-albums-2024/hurray-for-the-riff-raff-the-past-is-still-alive-320.jpg\" alt=\"Woman sitting in an empty bathtub in a corner with windows on both sides, she is wearing a cowboy outfit, outside is prairie\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Mighty Vertebrate by Anna Butterss</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYDBAUH/8QAKxAAAQMDAQYFBQAAAAAAAAAAAQIDBAAFETEGEiFBYXETFCIjUSQlMqGx/8QAGAEAAgMAAAAAAAAAAAAAAAAABAUABgf/xAAjEQABAgUEAwEAAAAAAAAAAAABAAIDBBEhMRITQVEikaGx/9oADAMBAAIRAxEAPwD36c+tt1RLoQgAk4Og61KS1yE3mGzEfJcuBkeJjQbjQKSPjiBx6mt2deWnb2u2vIYbyXB4pdBwAT+Q5ccY71ynL47br7Z4fsLZXJWw47yDZRvDHXIGe3Wh5ubDnwixw01oe8G+cJdLSxZuB4q6lRyMi2Mqg2VROZtQTMkOPPb5JVvdqVgs10jSPPeUdYdjNyVIbWp0AkbqSf2TSj4T4RYCD9QsYR9x2oXrwLfi5d02atz18fnuIWqSlLikqKtCDwqTvFlzNa+4z/p5DbreVpODz1TxBydfmlKy2RGqYcHXorY4kNFFY7L7IWYQpDoi+p99Ti/UdcAfwClKU0lor9pvkfahaOl//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-960.jpg, /blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-1920.jpg 2x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-640.jpg, /blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-1280.jpg 2x, /blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-320.jpg, /blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-640.jpg 2x, /blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-960.jpg 3x\" src=\"/blog/favourite-albums-2024/anna-butterss-mighty-vertebrate-320.jpg\" alt=\"Drawing of a hourse standing on a checkered floor, the horse is upright and human hands (just hands, no body) are holding it&#x27;s front hooves; left of the horse is a skull with red-stripped eye and nose holes and right of the horse is an egg with a plant growing out of it, the flower is an explosion or fireworks\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<h2>Passe by Oruã</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwEI/8QAJhAAAgEDAgUFAQAAAAAAAAAAAQIDAAQRBRIGByExQRMiYXGBof/EABgBAAIDAAAAAAAAAAAAAAAAAAQFAQMG/8QAJBEAAQQBAgYDAAAAAAAAAAAAAQACAxEEIYESMUFRUnGRwfD/2gAMAwEAAhEDEQA/AMunmtWtIkS3jluML7DuOWyO489sftX+fl/p3qreRae6MhhY2bOzJlu46dcZq9WXBmkaZa7oFtxcxMGDhBuTr3LdyfupC6tZGJmF28UAOfe5Cr9Y6EHPn4oSZ5kqrG+qnDw24wPFTvY02/Beb+YtubfjHUI3jWABl2JEuFCbRt/mKVO81tMujxncyw20skMscbI6qWDDaF7j5BH5SiWOaGgWl0sE7nuLWEiz0K0jgjVLy4s79J5jIIvcN3UtnJwT5Ga5w/rE97p9ytxHC8cnrRumDtIAPjNKUG3kFssloEktdx9rPJOK9TCQx74iI0CAmMEkDyfmlKVUnwhj8R8L/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2024/orua-passe-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2024/orua-passe-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2024/orua-passe-320.jpg, /blog/favourite-albums-2024/orua-passe-640.jpg 2x, /blog/favourite-albums-2024/orua-passe-960.jpg 3x\" src=\"/blog/favourite-albums-2024/orua-passe-320.jpg\" alt=\"Drawing of a cat on a red ground and a dark green background, the cat is white and orange-y with thick brush strokes\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>",
            "url": "/blog/favourite-albums-2024/",
            "title": "My Favourite Albums of 2024",
            "date_modified": "2024-12-30T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/book-report-2024/",
            "content_html": "<ul>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/3463482/s/mixed-feelings-about-this-one\"><strong>Leaving the Atocha Station</strong></a> by Ben Lerner ★★★☆☆</li>\n<li><a href=\"https://bookwyrm.social/book/11984/s/wanderlust\"><strong>Wanderlust</strong></a> by Rebecca Solnit</li>\n<li><a href=\"https://bookwyrm.social/book/941445/s/cold-enough-for-snow\"><strong>Cold Enough for Snow</strong></a> by Jessica Au</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/3721398/s/weird-and-funny\"><strong>The Unconsoled</strong></a> by Kazuo Ishiguro ★★★★★</li>\n<li><a href=\"https://bookwyrm.social/book/1561487/s/things-become-other-things\"><strong>Things Become Other Things</strong></a> by Craig Mod</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/3887106\"><strong>Venomous Lumpsucker</strong></a> by Ned Beauman ★★★★☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/3887115\"><strong>Der europäische Traum</strong></a> by Aleida Assman ★★★★☆</li>\n<li><a href=\"https://bookwyrm.social/book/1578173/s/content\"><strong>Content</strong></a> by Elias Hirschl</li>\n<li><a href=\"https://bookwyrm.social/book/509520/s/chokepoint-capitalism\"><strong>Chokepoint Capitalism</strong></a> by Rebecca Giblin, Cory Doctorow</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/4063023\"><strong>Technopoly</strong></a> by Neil Postman ★★★★★</li>\n<li><a href=\"https://bookwyrm.social/book/842362/s/small-fires\"><strong>Small Fires</strong></a> by Rebecca May Johnson</li>\n<li><a href=\"https://bookwyrm.social/book/1555921/s/the-ethics-of-artificial-intelligence\"><strong>The Ethics of Artificial Intelligence</strong></a> by Luciano Floridi</li>\n<li><a href=\"https://bookwyrm.social/book/1089629/s/the-vaster-wilds\"><strong>The Vaster Wilds</strong></a> by Lauren Groff</li>\n<li><a href=\"https://bookwyrm.social/book/983184/s/monde-vor-der-landung\"><strong>Monde vor der Landung</strong></a> by Clemens J. Setz</li>\n<li><a href=\"https://bookwyrm.social/book/39513/s/flights\"><strong>Flights</strong></a> by Olga Tokarczuk</li>\n<li><a href=\"https://bookwyrm.social/book/446179/s/the-bradshaw-variations\"><strong>The Bradshaw Variations</strong></a> by Rachel Cusk</li>\n<li><a href=\"https://bookwyrm.social/book/700764/s/green-island\"><strong>Green Island</strong></a> by Shawna Yang Ryan</li>\n<li><a href=\"https://bookwyrm.social/book/1232331/s/how-infrastructure-works\"><strong>How Infrastructure Works</strong></a> by Deb Chachra</li>\n<li><a href=\"https://bookwyrm.social/book/210792/s/become-an-effective-software-engineering-manager\"><strong>Become an Effective Software Engineering Manager</strong></a> by James Stanier</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/5079692\"><strong>The Stolen Bicycle</strong></a> by Wu Ming-Yi ★★★★★</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/5079714/s/the-old-ways\"><strong>Learn Python 3 the Hard Way</strong></a> by Zed Shaw ★★★★★</li>\n<li><a href=\"https://bookwyrm.social/book/1676274/s/gebrauchsanweisung-fur-taiwan\"><strong>Gebrauchsanweisung für Taiwan</strong></a> by Stephan Thome</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/5112373\"><strong>Metronome</strong></a> by Tom Watson ★★★★☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/5167948\"><strong>Amaro</strong></a> by Brad Thomas Parsons ★★★★☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/6162237\"><strong>Hypermedia Systems</strong></a> by Carson Gross, Adam Stepinski, Deniz Akşimşek</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/6162241\"><strong>Slouching Towards Utopia</strong></a> by Bradford DeLong</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/6162263/s/not-really-worth-it\"><strong>Clean Architecture</strong></a> by Robert C. Martin ★★☆☆☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/6162278/s/so-much-fun\"><strong>Wizard of the Crow</strong></a> by Ngũgĩ wa Thiong'o ★★★★★</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/5464994/s/great-overview\"><strong>The Internet Con</strong></a> by Cory Doctorow ★★★★★</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/6162288\"><strong>Swift Cookbook</strong></a> by Keith Moon, Chris Barker, Daniel Bolella, Nathan Lawlor ★★★☆☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/5608991/s/not-worth-it\"><strong>Singularitäten</strong></a> by John Banville ★★☆☆☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/6162296\"><strong>The Engineering Leader</strong></a> by Cate Huston ★★★★☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/5882520/s/great-characters-great-world-building-but-too-many-plotholes\"><strong>The Genesis of Misery</strong></a> by Neon Yang ★★★☆☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/6162304\"><strong>Moby-Dick</strong></a> by Herman Melville</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/review/6115349/s/interesting-application-of-the-term-hacking\"><strong>A Hacker's Mind</strong></a> by Bruce Schneier ★★★★☆</li>\n<li><a href=\"https://bookwyrm.social/user/florianec/reviewrating/6162312\"><strong>Programming Language Concepts</strong></a> by Carlo Ghezzi, Mehdi Jazayeri</li>\n</ul>",
            "url": "/blog/book-report-2024/",
            "title": "Book Report 2024",
            "summary": "All the books that I have read in 2024.",
            "date_modified": "2025-01-03T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/south-korea-2025/",
            "content_html": "<p>This June we travelled to South Korea and we visited Jeju, Busan, Pohang, Sokcho and Seoul. We had an amazing time with great amounts of delicious food, beautiful landscapes and stunning culture.</p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwT/xAAmEAABAgYCAQQDAAAAAAAAAAABAgMABAUREiETQRQGIlFxMZGh/8QAFwEBAQEBAAAAAAAAAAAAAAAABAMABf/EAB4RAAIBBAMBAAAAAAAAAAAAAAABAgMREiEEIzGh/9oADAMBAAIRAxEAPwDEaSHZSSMz4hUgoKrHHYGrkHr4+YkKE7Mykm9VG02Yl3MXElYSMlfj22v3EBKVLEOuzDfIlQxTYkEg31rrcWT0xTvLo04t6YZLS+IqRmFFWj19QKFNYTlUQZXeiITWETJU8ueDSlG5S42FW+ieoRYmKdQWG8PBljskcq/d/YQF1IX1F/DYmcvHjmUoSBZTdz+outDdDNMlQhlkZMpJONib63aEIdyX1IpHw6p0YrRiSAUA2HUIQjnom3s//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-01-960.jpg, /blog/south-korea-2025/south-korea-01-1920.jpg 2x, /blog/south-korea-2025/south-korea-01-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-01-640.jpg, /blog/south-korea-2025/south-korea-01-1280.jpg 2x, /blog/south-korea-2025/south-korea-01-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-01-320.jpg, /blog/south-korea-2025/south-korea-01-640.jpg 2x, /blog/south-korea-2025/south-korea-01-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-01-320.jpg\" alt=\"A waterfall cascades into a dark pool, surrounded by lush green foliage and rocks, with more trees visible in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cheonjeyeon Falls on Jeju Island</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAQCBQcI/8QAKRAAAQMEAAUDBQEAAAAAAAAAAQIDBAAFESEGEhMxQQciURUWYXGxwf/EABYBAQEBAAAAAAAAAAAAAAAAAAIDAf/EABoRAAMAAwEAAAAAAAAAAAAAAAABEQIhMVH/2gAMAwEAAhEDEQA/AOl+i1h4d4TsKoqEx2rvDy3MkuqOVE4JKVKwOTYHt1ofirvsOzW283K7OqjPuvtFSY7MdtpZbCcEJAIBUSQQoAbx53Xmy23mbcnGvrkxyXBiOLUtaieaQ6spJTo7GhkD4Heq+NOOVTAw9yjrxwlDZbOwhJBCCD3SCAQMeKaeyc1TmvqTcUSuNLm7DYeYilw9Nl9IS42M5KVAazkn5/dKz4mS7dboq4uSnJS5g6ynHPcrJJyCfP8AnbxSi1l4askS2uS4Y7bRUemk5AycAnuaouuo7akjl5ycgaFKVRcA+mgFwkRSW2FgIznBSD/aUpRrKRH/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-02-960.jpg, /blog/south-korea-2025/south-korea-02-1920.jpg 2x, /blog/south-korea-2025/south-korea-02-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-02-640.jpg, /blog/south-korea-2025/south-korea-02-1280.jpg 2x, /blog/south-korea-2025/south-korea-02-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-02-320.jpg, /blog/south-korea-2025/south-korea-02-640.jpg 2x, /blog/south-korea-2025/south-korea-02-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-02-320.jpg\" alt=\"A stone bridge with ornate railings and lanterns ascends towards a bright sky, framed by dark tree branches.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seonim Bridge at Cheonjeyeon Falls park</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBwL/xAAnEAABAwMCBgIDAAAAAAAAAAABAgMEAAUREiEGFCIxQXGRwTJhgf/EABcBAAMBAAAAAAAAAAAAAAAAAAEDBQb/xAAeEQACAgICAwAAAAAAAAAAAAAAAQIREhMFISJBUf/aAAwDAQACEQMRAD8Ap258mal5UFUWM2+B0vNI1LVhQ3V5GSd/VUTt5lWl1bUxDDb7LZQcryl05xuPO1ctsXGDyjCJcmQypfUhTPV405x+/keqhcU8O3hp5c+WWVFSsJSgK0JB7dx996z+pZU3dk+cWq9kNi9ydJLWjQpRI6Tj+YHalU64s+KQyWVNqR+SSSN/VKdph8QrFG1cRqDsVxZQEOg6g42ShWQMg5BrOeI7rcoWYbVwlKjLwoocc1b5z9UpU3jm5Ly7ExbzIV1Y5q5SHHn5JVrxs8rYfNKUqhdAbdn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-03-960.jpg, /blog/south-korea-2025/south-korea-03-1920.jpg 2x, /blog/south-korea-2025/south-korea-03-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-03-640.jpg, /blog/south-korea-2025/south-korea-03-1280.jpg 2x, /blog/south-korea-2025/south-korea-03-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-03-320.jpg, /blog/south-korea-2025/south-korea-03-640.jpg 2x, /blog/south-korea-2025/south-korea-03-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-03-320.jpg\" alt=\"Two ornate streetlights and outdoor exercise equipment are nestled among lush green trees and tall grass in a park.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cheonjeyeon Falls park</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAQb/xAAlEAACAQQCAgEFAQAAAAAAAAABAgMABAUREiExQRMGFDJRUsH/xAAXAQEBAQEAAAAAAAAAAAAAAAADBAUG/8QAIBEAAgEDBAMAAAAAAAAAAAAAAQIAAxEhBBITMTJRkf/aAAwDAQACEQMRAD8AhOFyEksoiiVGlkbSlkBck9a36XXf+17KywxyWHiuwqQWUIkiEbSMCCNbJ3+9jqpfjElGTVuBVgwPH359VVsTj79fp+/+CORiz/IVI712T5qV9KpUlRmTlc2mXeXUEMoQXOzxHJmiG3OvPg+aVy6xsN3cPP8Adz6k0QAgAXodAehSoFpJbN/kXgk8S/nlmhJKrw/HioGu6oFvnMqMFOoyFxxl2XXl03R80pXQU/EwqnYmRBm7+GPik5A3/IpSlZ5poT1F3t7n/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-04-960.jpg, /blog/south-korea-2025/south-korea-04-1920.jpg 2x, /blog/south-korea-2025/south-korea-04-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-04-640.jpg, /blog/south-korea-2025/south-korea-04-1280.jpg 2x, /blog/south-korea-2025/south-korea-04-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-04-320.jpg, /blog/south-korea-2025/south-korea-04-640.jpg 2x, /blog/south-korea-2025/south-korea-04-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-04-320.jpg\" alt=\"A waterfall cascades into a dark pool surrounded by lush green trees and rocks.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cheonjeyeon Falls</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAYFB//EACcQAAEDAgUDBQEAAAAAAAAAAAIAAQMEEQUGEiExFFGxBxMiQVJh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAgEAA//EABoRAQEAAgMAAAAAAAAAAAAAAAABAiERMTL/2gAMAwEAAhEDEQA/AM30Swyjosl0tecEXUzyyTPKTXIWZ3Brdtmfjur5sQGol9kGuBMz6v5ffwuPZAzMQZDhiAJJTptUOgRa7/K+3H0991W4Zi2mqApBMWEbNtzdKTS27XpTXdFOPi4u+13RZeXD8gSEOWKlh2Z5j8Ct7C6iVq0G1vZh4REsenHL03eok/SIiJv/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-05-960.jpg, /blog/south-korea-2025/south-korea-05-1920.jpg 2x, /blog/south-korea-2025/south-korea-05-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-05-640.jpg, /blog/south-korea-2025/south-korea-05-1280.jpg 2x, /blog/south-korea-2025/south-korea-05-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-05-320.jpg, /blog/south-korea-2025/south-korea-05-640.jpg 2x, /blog/south-korea-2025/south-korea-05-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-05-320.jpg\" alt=\"A view from a cable car overlooking a city skyline and a bridge across a foggy bay, with other cable cars visible.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Songdo Cable Car, Busan</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgf/xAAnEAACAQQBBAAHAQAAAAAAAAABAgMABAURIQYSMUEHQ1FicZGhsf/EABUBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGhEBAQEBAAMAAAAAAAAAAAAAAQACEQMTUf/aAAwDAQACEQMRAD8A5xL0fj8jfZ+K274SsMMsXb6Zi+xrj2PHFWPWOBkwuJe6uzFNbXIt0bxuMr3ednXuo1grY2SV2vJSZFVXaafTEKSR459n91Y5vP43J2wtb9Zbm37dMquS3nfB0P7T9mcnKHi09WxiZOZkUKUdFUKpljRm0ANDZU0reD4b2skcb2l2I4WQFUlBLDj8UpGj7FG0th0FgYFR3t5LhifnSE+/oNVfWeIx1nGDa2NtEftjH+0pQAmrTxEj8kUpSrS//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-06-960.jpg, /blog/south-korea-2025/south-korea-06-1920.jpg 2x, /blog/south-korea-2025/south-korea-06-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-06-640.jpg, /blog/south-korea-2025/south-korea-06-1280.jpg 2x, /blog/south-korea-2025/south-korea-06-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-06-320.jpg, /blog/south-korea-2025/south-korea-06-640.jpg 2x, /blog/south-korea-2025/south-korea-06-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-06-320.jpg\" alt=\"A ginger cat rests under a clear umbrella on a wooden deck outside a building.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Cat at the Songdo Yonggung Suspension Bridge</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUGAwQHCP/EACgQAAEEAQMDAgcAAAAAAAAAAAECAwQRABIhQQUGMXGhByMkMlFhsf/EABcBAQEBAQAAAAAAAAAAAAAAAAQCAQP/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQIDERIhE//aAAwDAQACEQMRAD8AtfxQ7r6bHdktQY7BmOH6uS2kHUsJ022TxxfnPPnWHETZiZETWDqUXzQSk0STVeRWWhPb8+ZLQl5IVtSwFqLY8+SfTjJSZ2hEebajKWq2iFWydKa3sV+PfA+M5PaT6HVcp9ZyGfJuR8okI0itIFe+M7VD7a6KlkBUdtKhsQlI4Fc84xCoWClSlwlGU6WE0o/bqP7OYumq1ynG1DYDWDvd+P4cYzEKNxNqceSFFIbXpFVvsDZv1xjGdskH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-07-960.jpg, /blog/south-korea-2025/south-korea-07-1920.jpg 2x, /blog/south-korea-2025/south-korea-07-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-07-640.jpg, /blog/south-korea-2025/south-korea-07-1280.jpg 2x, /blog/south-korea-2025/south-korea-07-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-07-320.jpg, /blog/south-korea-2025/south-korea-07-640.jpg 2x, /blog/south-korea-2025/south-korea-07-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-07-320.jpg\" alt=\"A long outdoor staircase with a metal railing and a lamppost ascends a hill, surrounded by green trees and a rock wall.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAUHAwQGCP/EACUQAAEEAQQBBAMAAAAAAAAAAAECAwQRAAUSITEGBxMUQSJCof/EABgBAQADAQAAAAAAAAAAAAAAAAMAAQIE/8QAHhEAAgICAgMAAAAAAAAAAAAAAAECERIhAyJR4fD/2gAMAwEAAhEDEQA/APQz84Q9JM2Ykj22g44lBHdC6sgf3Ks8l9ZWIemThF09+LPSoJiokgKLyT+21JscXVX1kHqPrC7qni0WRpTcSNJJUzIYkgOpI2ilAd0CDV5UesSJy2y9IkRpSmQLUFKeVsPA2kjuux0MTkm66gpWQvluqa95Br0jUpkze69Rp9aUKQAKCdv0MZjRLmv7nGn3ggngJCAB9cWMZxrP5ezWLOfkyXmp4aadU2kr2fjwa4yRdmPfP+MVAoKSNxFq4B+8Yw5aSrwVezY019S4aCoIJ5slN3zjGMCU5JtJktn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-08-960.jpg, /blog/south-korea-2025/south-korea-08-1920.jpg 2x, /blog/south-korea-2025/south-korea-08-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-08-640.jpg, /blog/south-korea-2025/south-korea-08-1280.jpg 2x, /blog/south-korea-2025/south-korea-08-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-08-320.jpg, /blog/south-korea-2025/south-korea-08-640.jpg 2x, /blog/south-korea-2025/south-korea-08-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-08-320.jpg\" alt=\"A train with yellow and blue cars travels along an elevated track with a larger yellow train traveling on a lower level, next to a lush green hillside, with people on a nearby walkway and a communication tower in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Haeundae Beach Train in Busan</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAcIAwUG/8QAJhAAAgEEAgICAQUAAAAAAAAAAQIDAAQFEQYhEjETYTIHFFGBkf/EABgBAAIDAAAAAAAAAAAAAAAAAAEEAAID/8QAHBEAAgIDAQEAAAAAAAAAAAAAAAEREgJRoSIx/9oADAMBAAIRAxEAPwCboOd8cm5KuBiyaPk2HSqjFCdfj8mvHy+t7rqQeqofxLIPNy6wl/dzfO867+VwygqQxYjWz3373Vhcvm5F53h88MlGMZHbSQBDKVaZyGZiqnrWtEn0Nd+qllEmeOc/CQ8xwrEZW/kvLi0s5J5O3e5t1nYn6LehrQ0OuqVF99+sGKjn7iuQrqHRpbhYy6kbDAHvR/qlW8b4Gz101vEOO4rJ8kvrO7s4WitDE6sEAZ2ZA22P16AGgP433WHlcNueQ5y2FtAIrHETpAPH8R4H/aUpSXZjMKpWvKyGS7LygOxUdt7pSlFMXP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-09-960.jpg, /blog/south-korea-2025/south-korea-09-1920.jpg 2x, /blog/south-korea-2025/south-korea-09-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-09-640.jpg, /blog/south-korea-2025/south-korea-09-1280.jpg 2x, /blog/south-korea-2025/south-korea-09-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-09-320.jpg, /blog/south-korea-2025/south-korea-09-640.jpg 2x, /blog/south-korea-2025/south-korea-09-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-09-320.jpg\" alt=\"Two green monorail cars on an elevated track overlooking the ocean and a distant city, with trees in the foreground.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Haeundae Beach Train in Busan</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYEBQf/xAApEAACAQMDAgQHAAAAAAAAAAABAgMABBEFITEGEhMVQWEiMlFxgaHw/8QAFwEBAQEBAAAAAAAAAAAAAAAAAgQDBf/EAB8RAAICAQQDAAAAAAAAAAAAAAABAgMREiExQSIygf/aAAwDAQACEQMRAD8Ajbnqm8vuqb+Kedu6Oe3u7fu3AaNe0gZ4DK5z9hVt1H1bqz3dkdZuo205lcrE7AuiqB8TEDnk15JqWo2supalcW8kRKKqRME33I4Od+G9K32SS3WlwNL2Ml5LImC+SEATJ333wR+aqcvHD6yG+MdSafKS+rJ0tNsPM0m1K7h8Sa9kM5DntKAgBVx7KB+6Vwta62eyv3tdOSF4YR2Fm9WHOPalc6V1jezEqlgjrdzDbQsuCWGTkZ/ua0Jql3FazvHMy+FGyxqPlXOASB9felKpl6h7J+AmRCzc5pSlTPk2R//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-10-960.jpg, /blog/south-korea-2025/south-korea-10-1920.jpg 2x, /blog/south-korea-2025/south-korea-10-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-10-640.jpg, /blog/south-korea-2025/south-korea-10-1280.jpg 2x, /blog/south-korea-2025/south-korea-10-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-10-320.jpg, /blog/south-korea-2025/south-korea-10-640.jpg 2x, /blog/south-korea-2025/south-korea-10-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-10-320.jpg\" alt=\"A narrow, winding stairway ascends between colorful, weathered buildings in a bustling alleyway.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Gamcheon Cultural Village, Busan</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAQFAQMGCP/EACUQAAIBBAEDBAMAAAAAAAAAAAECAwAEBREhBhJBIjFRYXGBwf/EABYBAQEBAAAAAAAAAAAAAAAAAAMBBP/EABoRAAMBAAMAAAAAAAAAAAAAAAABAgMREkH/2gAMAwEAAhEDEQA/AJGH66sr1545bKOKdyIyneSrKV0QD+Kv+oszaTdP3UN7bRyWboEaIk6bkaHGvOj+q882t+kM0Zjl7lYBiQNa0Neass31MGxbQwytvXt8D5FbM8ZqU6AvVqmpM5dMVLl7w2+LtGgWTtTW+AFH3zzulcPBeiIOFkb1MWJB9zSi4QvY3LLIoBVyPHHFR7uaV008jEH7pSr4GQ5IEWV1G9A/wUpSoU//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-11-960.jpg, /blog/south-korea-2025/south-korea-11-1920.jpg 2x, /blog/south-korea-2025/south-korea-11-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-11-640.jpg, /blog/south-korea-2025/south-korea-11-1280.jpg 2x, /blog/south-korea-2025/south-korea-11-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-11-320.jpg, /blog/south-korea-2025/south-korea-11-640.jpg 2x, /blog/south-korea-2025/south-korea-11-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-11-320.jpg\" alt=\"A street with many overhead power lines and buildings on both sides leads into a hazy distance, with mountains in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Busan</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAEGBwME/8QAKRAAAgAFAgMJAQAAAAAAAAAAAQIAAwQRIQUSBkFRExQxMjM0YYGh4f/EABcBAAMBAAAAAAAAAAAAAAAAAAEEBQL/xAAdEQACAQQDAAAAAAAAAAAAAAAAAgEREhNhITGh/9oADAMBAAIRAxEAPwC5UvEOmT1uJxQ9HUgx0ma7pqNtaoRfk4EZJ37c5WWwZFGLN49MRDOSm6aAxXFguf2LWTZMtk1Y8Q6Vf3kowjGK7iVaWf2Qk0JCqLXpUJ+yRe8Izk36ChUzOeVUbEYjaVAbnnnEzNVqqZ5yS3G03wc4GLQhE5ma6eRmIg8Da3Ug+nI6+T+whCE2dq9hP//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-12-960.jpg, /blog/south-korea-2025/south-korea-12-1920.jpg 2x, /blog/south-korea-2025/south-korea-12-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-12-640.jpg, /blog/south-korea-2025/south-korea-12-1280.jpg 2x, /blog/south-korea-2025/south-korea-12-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-12-320.jpg, /blog/south-korea-2025/south-korea-12-640.jpg 2x, /blog/south-korea-2025/south-korea-12-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-12-320.jpg\" alt=\"An aerial view of a sprawling city with numerous high-rise buildings and a large stadium, surrounded by green hills under a hazy sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Busan from one of the hills scattered throughout the city</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAwT/xAAoEAABAwMCBQQDAAAAAAAAAAABAgMEAAURBkESFCExYRMigZFC4fD/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/xAAiEQEAAgIBAgcAAAAAAAAAAAABAAIDIREEBRUxUoGhwfD/2gAMAwEAAhEDEQA/AJHprTjEl1xNwL8ZgtOFLoYUsFSR0GPJwM+a8UXRlwmMqlMRUlnrgqcCSe+xPg1d0aat4Sn0myte4W7gD5+K4uabtodS48xwJT2UF/wNG3eKeTV+JMwtXl+5IrRpZUiKVcnIKkqKTwp7H7pVdctlpCsB89tx+6UfGK+l/e8Z01nZVZNtPzZU5uRHckuoQltS+JtWFkgD8u+21Zl/1FdoVwgx40+QhssKUv3klZHFgn62pStmTHQDUljsjpmzJlSxGgO85IK34yHl5Vn3EnOPHSlKUGpzKDqf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-34-960.jpg, /blog/south-korea-2025/south-korea-34-1920.jpg 2x, /blog/south-korea-2025/south-korea-34-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-34-640.jpg, /blog/south-korea-2025/south-korea-34-1280.jpg 2x, /blog/south-korea-2025/south-korea-34-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-34-320.jpg, /blog/south-korea-2025/south-korea-34-640.jpg 2x, /blog/south-korea-2025/south-korea-34-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-34-320.jpg\" alt=\"A wide shot of a baseball stadium at night, with players on the field, a large scoreboard displaying game information, and spectators in the stands, with city buildings visible in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Lotte Giants vs Kiweoom Heroes at Sajik Baseball Stadium</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYEBQgH/8QAJxAAAgEDBAECBwAAAAAAAAAAAQIDAAQRBRIhMUEGBxYiMlFhcZH/xAAYAQACAwAAAAAAAAAAAAAAAAADBQECBP/EAB4RAQABAwUBAAAAAAAAAAAAAAEAAhNhAxEUITEy/9oADAMBAAIRAxEAPwC9ufd70xbySRme5keMA7Y7djuBIGVzwRzWboXuFY6nJOCzvsPKCBkZCDjGD9Q6+auftM9OvbWAtZrmMtkyLvG4DwVB4/fVbW10PfeQXYuZI7yJdqmzcpxno95q3N7FSAtM6C+KLU8iCbH5QCleSML2AKt1JqgcjIImQhh9+BStV/Ei0ydKArdTjImiTMb97T3nB4/tVkFzLDcaY0TBRNEjSKFGGJHPjzSlL6QNGhMQx9sqJLC1mO6aFXYZALE8DJpSlNKQ2IJ9n//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-13-960.jpg, /blog/south-korea-2025/south-korea-13-1920.jpg 2x, /blog/south-korea-2025/south-korea-13-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-13-640.jpg, /blog/south-korea-2025/south-korea-13-1280.jpg 2x, /blog/south-korea-2025/south-korea-13-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-13-320.jpg, /blog/south-korea-2025/south-korea-13-640.jpg 2x, /blog/south-korea-2025/south-korea-13-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-13-320.jpg\" alt=\"An intricate, looping silver pedestrian bridge with people walking on it, overlooking a green island and the ocean with a lighthouse in the distance.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Pohang Space Walk</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAcBAgQFBgj/xAAoEAACAQMDAwIHAAAAAAAAAAABAgMABBEFBiESMVEHEzJBQmGRscH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAwQC/8QAHREAAgEEAwAAAAAAAAAAAAAAAAEDAgQTIRQiMf/aAAwDAQACEQMRAD8Axdgeqdlue+Gn3VmbO+bJjCEvGwAyefp/tSBLdwpGXaRFQd2J4rz/ALd2VFY83lst2svHXHKVdB58dq62DbOnpEsJRmgX4UZiSpznIP7qqi4aXYU4t6JDbWdP6iDew5H3pUevtLRmkZvYcFjnAmIH4+VKbyEYxMpYyNHcCEHKHzW06jSlRlkvpaXOe9KUoFn/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-14-960.jpg, /blog/south-korea-2025/south-korea-14-1920.jpg 2x, /blog/south-korea-2025/south-korea-14-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-14-640.jpg, /blog/south-korea-2025/south-korea-14-1280.jpg 2x, /blog/south-korea-2025/south-korea-14-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-14-320.jpg, /blog/south-korea-2025/south-korea-14-640.jpg 2x, /blog/south-korea-2025/south-korea-14-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-14-320.jpg\" alt=\"A wide sandy beach with a red life guard chair, a busker, and people walking on a promenade, with a city skyline and mountains in the background under a twilight sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Beach in Pohang</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQGCAf/xAAnEAABAwMCBAcAAAAAAAAAAAABAAIDBBESITEFBxNBBlFSYXGBsf/EABcBAAMBAAAAAAAAAAAAAAAAAAEDBAX/xAAYEQADAQEAAAAAAAAAAAAAAAAAAQIRMf/aAAwDAQACEQMRAD8Av5q4I4+o+aNrPUXCyjQ8aoZZumycX2uRYH7WbIOZBmxbWRy37ua64v8Aqnjxa3MSCpjbbtmtKHN8ZBd1L4aSMgGzXOHm0hFmyv5oVVHKyKhkhkjwBJdkbHXTQ/CJbuU80ata3Dkx3REUJUMvYIiIAP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-15-960.jpg, /blog/south-korea-2025/south-korea-15-1920.jpg 2x, /blog/south-korea-2025/south-korea-15-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-15-640.jpg, /blog/south-korea-2025/south-korea-15-1280.jpg 2x, /blog/south-korea-2025/south-korea-15-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-15-320.jpg, /blog/south-korea-2025/south-korea-15-640.jpg 2x, /blog/south-korea-2025/south-korea-15-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-15-320.jpg\" alt=\"Silhouetted mountains with jagged peaks and lush green forests are visible against a light blue, hazy sky, framed by dark trees in the foreground.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seoraksan National Park in Sokcho, Gangwon Province</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAgHBAb/xAAqEAABAwMDAgQHAAAAAAAAAAABAgMEAAURBhIhMaEHIkFRCBMyQnGx4f/EABYBAQEBAAAAAAAAAAAAAAAAAAQDAf/EAB0RAAICAQUAAAAAAAAAAAAAAAABAhEDBBMUIUL/2gAMAwEAAhEDEQA/ANpsGrLZdIxWX0RXUjKm3Vgce4Pr+64dW+I+mdMssKnXFEh59RS0xEIdcUce2ePTrjrUqSX9QxrYHrgzLgsnzFwtkKKcdQTwPzXgLituQ6dpe2AfU6vcT2HNJyaiHkFDDJupdFOz/iJjRJbjS9J3MAHy/MdCSR742mlTAl6U0kJbmTQjHAQ6QB3pUuQymxEs6XCiz4qmJbDbrR+1Q4rJvEHR1mhsqejxthXwQDj+96Urc6TEQVp2Z89YIiVDYp1IIzgbcDtSlKLSJUf/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-16-960.jpg, /blog/south-korea-2025/south-korea-16-1920.jpg 2x, /blog/south-korea-2025/south-korea-16-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-16-640.jpg, /blog/south-korea-2025/south-korea-16-1280.jpg 2x, /blog/south-korea-2025/south-korea-16-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-16-320.jpg, /blog/south-korea-2025/south-korea-16-640.jpg 2x, /blog/south-korea-2025/south-korea-16-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-16-320.jpg\" alt=\"A traditional Korean temple with ornate roofs and lush gardens, set against a backdrop of rugged mountains under a cloudy sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sinheungsa temple at Seoraksan National Park</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAQBAgMFBgf/xAAkEAACAgICAQQDAQAAAAAAAAABAgMEABEFIQYSIjFhcZGh8P/EABUBAQEAAAAAAAAAAAAAAAAAAAIE/8QAHBEAAwABBQAAAAAAAAAAAAAAAAECEQMhQWGh/9oADAMBAAIRAxEAPwCP4Jd5mOu8fNBnRgXWd5N7Pq1of0/rOgucpXr15J5pVSKNSzMT0AM8q422atWOEuyqg1228pd5aC1UngtqDWbpvcQW/H1lya0oxncinNPox855J4jY5KWZ4Ltxn9xkBIA+uz/t4zlY+J4twSV9fZ7d9HGRurfPiKFKJdm1KFUAgKx0Rr5zXzzSGNiW+W7GMYKAy9IV9CltsSN9nGMYRpI//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-17-960.jpg, /blog/south-korea-2025/south-korea-17-1920.jpg 2x, /blog/south-korea-2025/south-korea-17-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-17-640.jpg, /blog/south-korea-2025/south-korea-17-1280.jpg 2x, /blog/south-korea-2025/south-korea-17-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-17-320.jpg, /blog/south-korea-2025/south-korea-17-640.jpg 2x, /blog/south-korea-2025/south-korea-17-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-17-320.jpg\" alt=\"A dramatic mountain landscape with steep, rocky slopes covered in green foliage, a winding river in the valley below, and distant hazy mountains, framed by tree branches in the foreground.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Seoraksan National Park</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAUGB//EACoQAAEDAwMDAQkAAAAAAAAAAAECAwQABREhMWEGEkETBxUiMjNScYGR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIE/8QAGhEAAgMBAQAAAAAAAAAAAAAAAAECITERUf/aAAwDAQACEQMRAD8Ap1jslrhTIaLu2iXE7MtOuJ+gtWN07kZwON6z3ri1v27qCVHcS00UrUAlBwDyOK0t6/pbZYfltsPOBPplxJ7s/g7gnx4/lRF/jK6jh+9pbiG2oyPQUhScqJGickecHXb5T+xT7ZUo+GUKb9PAccwojOmtKnHbW6lQ1bdTj4VpA1HOu9Kqwiwe0W3xm7fEuTLYakPOhpwI0SvQnuI+7mpTpGS9Kss62SF98VUZUxQUASXARrnHNKVEsRoWspDcpb7YW4E9x3IyPNKUpEGf/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-18-960.jpg, /blog/south-korea-2025/south-korea-18-1920.jpg 2x, /blog/south-korea-2025/south-korea-18-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-18-640.jpg, /blog/south-korea-2025/south-korea-18-1280.jpg 2x, /blog/south-korea-2025/south-korea-18-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-18-320.jpg, /blog/south-korea-2025/south-korea-18-640.jpg 2x, /blog/south-korea-2025/south-korea-18-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-18-320.jpg\" alt=\"A narrow waterfall cascades down a steep, rocky cliff into a clear, dark green pool, surrounded by vibrant green foliage at the top and sides.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Waterfall in Seoraksan National Park</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGBwT/xAAiEAACAQQBBQEBAAAAAAAAAAABAgMABBEhBQYSMUFRYZH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAgP/xAAdEQACAgIDAQAAAAAAAAAAAAAAAQIRAzETFCFB/9oADAMBAAIRAxEAPwCmboYyT/TU+55y3jTMLpO+SMI4OMeSax3V13aMVRipuVOFIcgr7IO9a+1D47lbKaZUZo0Q67jOVY68KAPp9mnzy06QSML9Z1q3nZ4I2nAikKglCfFK5eOTftBhv71YjtM3PkfRlc4pUdiJXEzAdUTSy9RcgZZGciUqO45wAcAVMttyKCSRk6pShZPpotHsjd3jUs7fgBwBSlKI9ks//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-19-960.jpg, /blog/south-korea-2025/south-korea-19-1920.jpg 2x, /blog/south-korea-2025/south-korea-19-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-19-640.jpg, /blog/south-korea-2025/south-korea-19-1280.jpg 2x, /blog/south-korea-2025/south-korea-19-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-19-320.jpg, /blog/south-korea-2025/south-korea-19-640.jpg 2x, /blog/south-korea-2025/south-korea-19-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-19-320.jpg\" alt=\"An aerial view of a red lighthouse at the end of a pier, extending from a rocky coastline into the calm blue sea, with a traditional gazebo and pine trees on a green cliff in the foreground.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View from Naksansa Temple in Sokcho</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQH/xAAjEAACAQMEAQUAAAAAAAAAAAABAgADERIEBSEiMTJRYYHR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQQFAP/EAB4RAAIBAwUAAAAAAAAAAAAAAAABAgQFQREUFVFS/9oADAMBAAIRAxEAPwCgGW04xUzVq6fbagZa2nVgSFKm9jJnT7c9NEFFCtLoACePjzz9x1XSOYsWdDLDRgKQVBJufeJu002/AKmnpWXrynMQ8pDyzbB9orJQRSyjMXOV82/fHJllNHTChgagJ7esxEiMpIkugp9mD1RkciM+LxEQahP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-20-960.jpg, /blog/south-korea-2025/south-korea-20-1920.jpg 2x, /blog/south-korea-2025/south-korea-20-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-20-640.jpg, /blog/south-korea-2025/south-korea-20-1280.jpg 2x, /blog/south-korea-2025/south-korea-20-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-20-320.jpg, /blog/south-korea-2025/south-korea-20-640.jpg 2x, /blog/south-korea-2025/south-korea-20-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-20-320.jpg\" alt=\"A wide sandy beach with a large sign featuring Korean characters in the foreground, people walking, and a distant island with a lighthouse under a clear blue sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Sokcho Beach</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHAgQG/8QAKRAAAQMDBAAEBwAAAAAAAAAAAQIDBAAFEQYSITETIjKBFCNSYZGisf/EABcBAAMBAAAAAAAAAAAAAAAAAAMEBQH/xAAeEQACAgICAwAAAAAAAAAAAAABAgADEiERQQQFUf/aAAwDAQACEQMRAD8Ambdqxub8cQwiMhptZZU88kKcUBwMH24qIs2rJsi6x4DtwjqmLOVMthCztAyfTkD81AJgM3eHIhy4pSwTyp5AAVn6SocEYHI6rLSOmrTZp5mR28PM+han87cnGehwRkU/d7HhwvOojV4mSZdy25lpttwcQ9cJSkvbEp2iR4YSMdYH3yfelUjrSau5X56RFWotlKRgrwQQOuKUYXUnZYRMo40AZqTNZTmWvlxoIz2PDVz+1LXre5PyUtqYt6QePLHFKVJWtDsgSzkR3Owbu0x9O9biQevKhIH8pSlHwX5M5M//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-21-960.jpg, /blog/south-korea-2025/south-korea-21-1920.jpg 2x, /blog/south-korea-2025/south-korea-21-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-21-640.jpg, /blog/south-korea-2025/south-korea-21-1280.jpg 2x, /blog/south-korea-2025/south-korea-21-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-21-320.jpg, /blog/south-korea-2025/south-korea-21-640.jpg 2x, /blog/south-korea-2025/south-korea-21-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-21-320.jpg\" alt=\"A traditional Korean pavilion stands in the middle of a traffic circle, surrounded by modern glass skyscrapers under a clear blue sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Temple in the middle of a roundabout near Gyeongbokgung in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUIBgf/xAAnEAABBAIBAgUFAAAAAAAAAAABAgMEEQAFEiExBgdBUcETFCJCcf/EABgBAAIDAAAAAAAAAAAAAAAAAAEEAAIF/8QAIREAAgECBgMAAAAAAAAAAAAAAAECAxEEBRQVMVFBYZH/2gAMAwEAAhEDEQA/APUtqqNCaS5MfZjtqVwSp1YQCfaz65B30/X6qAqZPlNNR6sK5XyvtQHe8zh5j77beLp0aZsPs2pDDSWbjhaQ4R+xs1f8yD9G1ETJ9KSgIACS5dDtd9Bj26eIq4isL7NJQ97pZ7CX4+zi8Fei3AhQPsQeoOMzI7rXWl0lt1wH8uV184wrNO0vodMuzvPNphqDuYyYbaWEOtFSkt9BfI9ayIwkuNtKDjiFcepSrv07nGMxq0UqkrIchwhKLra0pEhwjiO6Un4xjGUSRGj/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-22-960.jpg, /blog/south-korea-2025/south-korea-22-1920.jpg 2x, /blog/south-korea-2025/south-korea-22-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-22-640.jpg, /blog/south-korea-2025/south-korea-22-1280.jpg 2x, /blog/south-korea-2025/south-korea-22-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-22-320.jpg, /blog/south-korea-2025/south-korea-22-640.jpg 2x, /blog/south-korea-2025/south-korea-22-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-22-320.jpg\" alt=\"A traditional Korean pavilion sits on an island in a calm lake with a white arched bridge, surrounded by lush trees and a mountain in the background under a clear sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Gyeongbokgung Palace in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAEFAQAAAAAAAAAAAAAAAAYBAgQFBwj/xAApEAABAgQGAQMFAAAAAAAAAAABAgMABAURBgcSITFBExRRcRYiQpGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgQF/8QAIBEAAgEDBAMAAAAAAAAAAAAAAQIABBEhAxKBkTHh8P/aAAwDAQACEQMRAD8Arhp5QwpIzs04VKMsHHFqXque/uue4j9Kx9KVPECqa9JFtt0hLTnmSQejsOb9abxDcv6zP1PDq8OUyVQl4rK2gCRqTuVq1lY0lO3At7xm1rLfEtFqcs8lplcwlAc8aHDxc7EpIvf5jU1K83UJzIVpcNu4m3xHgaaeqrrsvWZpplYBS36Yu6BxYqvvxCLZvM70im2UBpSktpCypopOrvYE2/ZhErVlGGNlPXuELrW8/dSMYbQ1K5vUyV9Ow6wiYShCHEDSkHe1k2H5HkfyOr5g4xq30HPVGWWzKTUvUWpRC2EWPjW26FAk3PW3tzzCERjIM0Hw2J5ecdU4sqcOpVyL9n5hCEGCf//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-23-960.jpg, /blog/south-korea-2025/south-korea-23-1920.jpg 2x, /blog/south-korea-2025/south-korea-23-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-23-640.jpg, /blog/south-korea-2025/south-korea-23-1280.jpg 2x, /blog/south-korea-2025/south-korea-23-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-23-320.jpg, /blog/south-korea-2025/south-korea-23-640.jpg 2x, /blog/south-korea-2025/south-korea-23-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-23-320.jpg\" alt=\"A multi-tiered traditional Korean pagoda with ornate roofs, framed by dark green foliage against a clear blue sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">National Folk Museum of Korea in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwj/xAAsEAABAwMCBAMJAAAAAAAAAAABAgMEAAURITEGBxJxFUFhFiNCUYGCkcHx/8QAFwEBAQEBAAAAAAAAAAAAAAAABAIAA//EABoRAAIDAQEAAAAAAAAAAAAAAAABAhEUIVH/2gAMAwEAAhEDEQA/AN8LfpUZcrpbbd1ifOixigdSg64EkDtvWF3Lm57QvpLdxVbWwchjJaKe5+I/WqTx8uJf5aH2o8nx10ZWuOkuNv8Al1qBOEK9QcH5CnOdKwSgm6Z0FM5kcHRn1NOXxhShuW0qWPyBSuQblBvMCWtlyO+jzSAQvTuNKVGlnTOiMKi0sIQdDv8AzapOBc5kP3caQtDe5RnKT9p0pSiQ7xiZelgt11kSYqXHA31ZI0BH7pSlQzI//9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-24-960.jpg, /blog/south-korea-2025/south-korea-24-1920.jpg 2x, /blog/south-korea-2025/south-korea-24-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-24-640.jpg, /blog/south-korea-2025/south-korea-24-1280.jpg 2x, /blog/south-korea-2025/south-korea-24-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-24-320.jpg, /blog/south-korea-2025/south-korea-24-640.jpg 2x, /blog/south-korea-2025/south-korea-24-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-24-320.jpg\" alt=\"Traditional Korean temple rooftops with ornate decorations are visible in the foreground, with a lush green mountain under a clear sky in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Temple in Gyeongbokgung Palace in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGBP/EACsQAAIBAwMBBgcBAAAAAAAAAAECAwAEEQUGIRITFDFBYZEHFUNRUoGxwf/EABgBAAIDAAAAAAAAAAAAAAAAAAEEAgUG/8QAGxEAAwEAAwEAAAAAAAAAAAAAAAECEQMhQaH/2gAMAwEAAhEDEQA/AMzt7ea7D1K9k0+9ur1JFCGN+qRenpBHUWIwQT7e1X9Y+I+5NbspBBcrY2E0RXvURVDg+Y54PBA9c1nrR7a7mv8AS7qOKeGdEmAUeOFCn9grnFde3tBu4rb5fp1rZ3sMoCzvI4B7NRx0q2Of9pW+a5jJ0nfHLrSZZd9mgDWbwC3zhHZ1QyD8ueTzkZ+4pUyVNdkuJkNvLGsLmJQMAYB8vTmlJbNdt/QKJa3S9CwM7AKgCnAwOfetlt+NeyZzksrhVJPhSlWV9Qw+mCutSue+3WX+q39pSlZ0T1n/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-25-960.jpg, /blog/south-korea-2025/south-korea-25-1920.jpg 2x, /blog/south-korea-2025/south-korea-25-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-25-640.jpg, /blog/south-korea-2025/south-korea-25-1280.jpg 2x, /blog/south-korea-2025/south-korea-25-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-25-320.jpg, /blog/south-korea-2025/south-korea-25-640.jpg 2x, /blog/south-korea-2025/south-korea-25-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-25-320.jpg\" alt=\"A narrow, winding street lined with traditional Korean houses with tiled roofs and green foliage, leading towards a modern city skyline with a tower in the distance.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Bukchon Hanok Village in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwII/8QAKBAAAgEDAwIFBQAAAAAAAAAAAQIDAAQRBRIxBiEHFCJBURMWMmHx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/8QAGxEAAgMAAwAAAAAAAAAAAAAAAAECE0EhMVH/2gAMAwEAAhEDEQA/ALD1t4r6D1foKWmm2mqw3MFzHOVuLcICBuBGdxHvXfQnVGmdO6k19rDm0sJISjT53qpJGMhcnntWH6Ek9vNdXGqtM0MeDGA+cL+LZ9IJ4zn+1aNT+r9t33lbgs6oWh2Kp3gHtnJIOc89uKSmnyugOOG3N469GLJIomuCqsQGCDDD5HfileT7u815XQJDZ90BbfEB6vfH6+KVWQ9KuRp6QxtcxI6hkf0lTwRipDyVrZ6ZdJbW0UaqpxtXHHzSlDBaRc9vCzKWiRjj3GaUpWGn/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-26-960.jpg, /blog/south-korea-2025/south-korea-26-1920.jpg 2x, /blog/south-korea-2025/south-korea-26-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-26-640.jpg, /blog/south-korea-2025/south-korea-26-1280.jpg 2x, /blog/south-korea-2025/south-korea-26-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-26-320.jpg, /blog/south-korea-2025/south-korea-26-640.jpg 2x, /blog/south-korea-2025/south-korea-26-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-26-320.jpg\" alt=\"A close-up of a smiling stone statue with a tall hat, set against a traditional Korean wall and tiled roof.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAYHAgQF/8QAKBAAAgEEAQMDBAMAAAAAAAAAAQIDAAQFETEGEiETIkEHFEJRYZGh/8QAFwEBAQEBAAAAAAAAAAAAAAAABAUCA//EAB8RAQACAQMFAAAAAAAAAAAAAAEAAgMSMVEREyMzof/aAAwDAQACEQMRAD8Ao3pMZPIZNLHFO80z77IHfyWA4U718cVJszi7qCdrS9llF3Aq+4yeQCo2NHewDusML9Oc5atHPcJDYs8g9FpLkRsXB+NDex/FSePoyfOdRZNLAGe4gUGTdwEIB8HQII5B/wA/dTst6i1rM9taKHErq2iggRlluA7dx8tCzEfHIH7BpVpRdJ3sgIWwS4ZD2MyX8K9pH4kKAAaUNzXXrofk5aLcSDdC5/K5/I/bZa+muEDAgs3ke5eP7NdK3uLi0z11PFPIHe69JuBtfcOR5PA5pSl3fOkp19ZNzD5XISXGVAvJ0CXjKAjdo12JSlKZXYh3ef/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-27-960.jpg, /blog/south-korea-2025/south-korea-27-1920.jpg 2x, /blog/south-korea-2025/south-korea-27-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-27-640.jpg, /blog/south-korea-2025/south-korea-27-1280.jpg 2x, /blog/south-korea-2025/south-korea-27-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-27-320.jpg, /blog/south-korea-2025/south-korea-27-640.jpg 2x, /blog/south-korea-2025/south-korea-27-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-27-320.jpg\" alt=\"An ornate stone fountain sprays water in a lush green garden with trees in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Water fountain in Changdeokgung Palace in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAcFAwb/xAAnEAABBAIBAwMFAQAAAAAAAAABAgMEEQAFEgYhQRMUUQciMWFxsf/EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAH/xAAfEQACAQMFAQAAAAAAAAAAAAAAAQIDESEEEhMxQVH/2gAMAwEAAhEDEQA/ANGJsoaI8xbr8ZlLLzhktJHMcUKP3kAXdGj8X/M577eaDSqinYSI6DITyaCGVk1+wLrJ71rHmdN7oSFvutmeXikxoqXUqaUvuFjkKsEd+5NeMyFdXydh7SDM2MtuPfpFTmvCeIJ8q5k0P8GKc5ZwBn0suo6i6fj69pU5evcU/bra/dLbBbJpNBNfHnvd4ydD6eTJKlOQSmSyaPrKSF+oSAeQJIsG/HbGSPVR+B2qeIpWu5ztxNS864ERUpQ2lKqBtNkn5OaIiRdhppSZcZpwoPYm7/P9xjNqN8jLIJbUeC0G22GvTPg6+Y7HhxpbjTTSaIQkV2FgnzjGMdHoGKVj/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-28-960.jpg, /blog/south-korea-2025/south-korea-28-1920.jpg 2x, /blog/south-korea-2025/south-korea-28-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-28-640.jpg, /blog/south-korea-2025/south-korea-28-1280.jpg 2x, /blog/south-korea-2025/south-korea-28-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-28-320.jpg, /blog/south-korea-2025/south-korea-28-640.jpg 2x, /blog/south-korea-2025/south-korea-28-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-28-320.jpg\" alt=\"The interior of a bright greenhouse filled with various green plants, featuring a tiled pathway and white railings.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Glass house in Changdeokgung Palace in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAYHCAX/xAAmEAACAQMEAAcBAQAAAAAAAAABAgMABBEFBhIhEyIxQVFhoRQy/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQMEAP/EAB0RAAMAAQUBAAAAAAAAAAAAAAABAhQDERIiQTL/2gAMAwEAAhEDEQA/ALD2vvrTtbEf8OoWkszIXMJlCuoGM9fXzUqhupbqPxIZU4+/A5/RWFNuXgh1EyRzpGH8vEk8uzn47qYyarPDLyg1S4tZlBPKGZhggepwcUM9w+8iHD2NfqzY83Bj8kd0rHzbo3cwV7fcl6sTAFQko/cn1pTc3TfoODK9aLwrZXR5AxBP+vTBrr6JD41nfXMskjSQOgQFuu856pSpL+GUT6WBb7cskDqj3Cjl7SfQpSlaIlym0FJH/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-29-960.jpg, /blog/south-korea-2025/south-korea-29-1920.jpg 2x, /blog/south-korea-2025/south-korea-29-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-29-640.jpg, /blog/south-korea-2025/south-korea-29-1280.jpg 2x, /blog/south-korea-2025/south-korea-29-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-29-320.jpg, /blog/south-korea-2025/south-korea-29-640.jpg 2x, /blog/south-korea-2025/south-korea-29-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-29-320.jpg\" alt=\"A traditional Korean building with a tiled roof and lush trees in the foreground, with the N Seoul Tower visible on a hill in the background under a cloudy sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Changdeokgung Palace in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUGAwT/xAAlEAACAQMDBAIDAAAAAAAAAAABAgMABBESITEFExRBUWFCcbH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwEEBv/EACARAAICAQMFAAAAAAAAAAAAAAECABEhAwRBEhQxYZH/2gAMAwEAAhEDEQA/AJEN0UDd69gdATtjZh+8UjhnLxvN4gEudOMsR8cbVkOnpEtsk087R6JcqHbCg/AA5PHrH3Vm46uvVrC4h8dmvFQSLPH24wuDwNxz9b1nn3BRqUWIS9LJZIvj388S1HGGjXF4GIGCQm2feN+KVhDDFbEpLPPISdQaM4BB3HIO9KeNUHNSr3LDBAnGfLShckLrQkD3zXivj2b2x7WUM0ZZyDucFcf00pULxEiUOoqfMk0vIu/4uRmlKUKnAgz/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-30-960.jpg, /blog/south-korea-2025/south-korea-30-1920.jpg 2x, /blog/south-korea-2025/south-korea-30-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-30-640.jpg, /blog/south-korea-2025/south-korea-30-1280.jpg 2x, /blog/south-korea-2025/south-korea-30-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-30-320.jpg, /blog/south-korea-2025/south-korea-30-640.jpg 2x, /blog/south-korea-2025/south-korea-30-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-30-320.jpg\" alt=\"A vibrant field of wildflowers with yellow black-eyed Susans in the foreground and red poppies and white flowers blurred in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Flower meadow in a park near Changdeokgung Palace</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGgABAAEFAAAAAAAAAAAAAAAAAAUDBAYHCP/EACQQAAEDBAEEAwEAAAAAAAAAAAECAwQABREhEgYxUWETI0GB/8QAGAEAAwEBAAAAAAAAAAAAAAAAAgQFAwf/xAAhEQACAQMDBQAAAAAAAAAAAAAAAQIDBCEFExQVIlFSgf/aAAwDAQACEQMRAD8Ayy7vs2qA5LkglCeyU91HwKgbJ1TFuc9qGqMtl10kIUVApPged1D3e8zeo+lwlMhAlpXhbSEBKTrIJODj87HBrXsW33m2T2n5D7HzMSOThDp5JSCN9hjROP76pi51StuxlRfZ8yIq2Si1JZOhRF9UqFi9XRnGuS5EY7ODwUMj81mlVOqW/sjDjz8FsxLK2wVMRvf0p3VCRHi8l4hRRnZw0nfnVKVzp4RWk2F2q2OBKl2yCpWMZ+EUpSiTYJ//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-31-960.jpg, /blog/south-korea-2025/south-korea-31-1920.jpg 2x, /blog/south-korea-2025/south-korea-31-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-31-640.jpg, /blog/south-korea-2025/south-korea-31-1280.jpg 2x, /blog/south-korea-2025/south-korea-31-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-31-320.jpg, /blog/south-korea-2025/south-korea-31-640.jpg 2x, /blog/south-korea-2025/south-korea-31-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-31-320.jpg\" alt=\"A large, leafy green tree stands in a field of tall grass, with modern buildings and a clear blue sky in the background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Park near Changdeokgung Palace</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgQH/8QAIxAAAgEEAgEFAQAAAAAAAAAAAQIRAAMSIQQTQQUxUWFxIv/EABgBAAMBAQAAAAAAAAAAAAAAAAEDBAUG/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAERYQITQf/aAAwDAQACEQMRAD8AvO2wfC1Hdayw2BA8V5hwvWjyLrILp68QVbM5HcHX7XXa9VuMSpyT7LTufn83Wws7OfieG5PUSYilYtOewBlMdn2kz96NKO6waqMhcRn5Zs9jKFQHJVUMcjsEx7fFScWyj8u8hyxt4kf0TMjzNKVHklCKOl9aIghlDRobIgQNaNKUpbbkZB//2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-32-960.jpg, /blog/south-korea-2025/south-korea-32-1920.jpg 2x, /blog/south-korea-2025/south-korea-32-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-32-640.jpg, /blog/south-korea-2025/south-korea-32-1280.jpg 2x, /blog/south-korea-2025/south-korea-32-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-32-320.jpg, /blog/south-korea-2025/south-korea-32-640.jpg 2x, /blog/south-korea-2025/south-korea-32-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-32-320.jpg\" alt=\"An aerial view of a sprawling city with numerous high-rise buildings, a river, and distant mountains under a hazy sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">View from N Seoul Tower</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 150%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAYFAwT/xAAoEAACAgIBAgUEAwAAAAAAAAABAgMEABEFEiExQWFxgQYTIlGRwfD/xAAVAQEBAAAAAAAAAAAAAAAAAAADBP/EABwRAAICAgMAAAAAAAAAAAAAAAABAhESMgMhQf/aAAwDAQACEQMRAD8Aluf5OLkuRntPKsxZghkUkg6H+88wLEQZmk1GyhvyH222PT9ZS8zWqx1aUNaOSG09YWiZGVjsAB12oHcAdXrpsmrEgk0HYIQDtQPA/wA/ODOFdiccrVLw6yvEjaIO9d9FtYzxSyLG56rcYLd+4G8YOKHyKr6xsyx83WaMhDHRewuh4OjKV+O5HsTmLz9eGny0piiQiMzaVhsEKisoPt1a9gMYyxaEMNiVhtS2IllbpDN5BR/eMYwkk0USbTP/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-33-960.jpg, /blog/south-korea-2025/south-korea-33-1920.jpg 2x, /blog/south-korea-2025/south-korea-33-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-33-640.jpg, /blog/south-korea-2025/south-korea-33-1280.jpg 2x, /blog/south-korea-2025/south-korea-33-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-33-320.jpg, /blog/south-korea-2025/south-korea-33-640.jpg 2x, /blog/south-korea-2025/south-korea-33-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-33-320.jpg\" alt=\"A large, multi-story library with towering bookshelves filled with books, an escalator, and people browsing and walking below.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">The library at COEX Mall in Seoul</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 133.4375%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQGBwIF/8QAJBAAAgEDAwQDAQAAAAAAAAAAAQIDAAQRBQZBEiExcSJRkTL/xAAWAQEBAQAAAAAAAAAAAAAAAAAEBQL/xAAfEQACAQMFAQAAAAAAAAAAAAABAgADEhMRISIyYUH/2gAMAwEAAhEDEQA/AM5bUJYrAWuZFikJ6nQdzx0k/VX7Z+72s4bUTvE6wABFmyQMeh65qq6NY6dqDm1hZFljAJWeT5HI48ZFXe0sduR2sFrrdoYIolEZnspCXcnlk+Q/PFDtUPp7Ka06+K8LsBM+3I1nc69fT2SIsEspdQucZPnGeM5pXrbl2ztafU2fR9W1AW3SARMighu+cfz28cUpORRAY3bfSSdK21p8727dMiOYyxZGwT7+6nPZRQ3Ijj6gCwfOe+SBzSlFToT7LLk5Avy2c68xhvuiPAAQcA5/aUpWn7GFQcRP/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-35-960.jpg, /blog/south-korea-2025/south-korea-35-1920.jpg 2x, /blog/south-korea-2025/south-korea-35-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-35-640.jpg, /blog/south-korea-2025/south-korea-35-1280.jpg 2x, /blog/south-korea-2025/south-korea-35-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-35-320.jpg, /blog/south-korea-2025/south-korea-35-640.jpg 2x, /blog/south-korea-2025/south-korea-35-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-35-320.jpg\" alt=\"A raw cut of marbled beef, a slice of onion, and a small dish on a grill with hot coals, under a copper exhaust hood.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Steak on a Korean barbecue grill</figcaption></figure><p></p>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 75%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBwQG/8QAIxAAAgICAgEEAwAAAAAAAAAAAQIDEQAEBSExBhITkUFRcf/EABYBAQEBAAAAAAAAAAAAAAAAAAQAA//EABsRAAICAwEAAAAAAAAAAAAAAAADERQCBFFh/9oADAMBAAIRAxEAPwDTp9qYFlTVarq/xlbtRbEiktHCAf3ni+C9c6LaDXHNrCMW3zswVfs9ZapzJnAAnAd+0pg1j7xK3sM2ayunS2vKTdEfw9YyhPK8jJ3DBDOvY+RJwAe8YizmHrL9M3SKORLdFPuUXY89ZHuBYNSSVET3RqWWx4NYxhpNSaONVQBbUeaBxjGUkf/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/south-korea-2025/south-korea-36-960.jpg, /blog/south-korea-2025/south-korea-36-1920.jpg 2x, /blog/south-korea-2025/south-korea-36-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/south-korea-2025/south-korea-36-640.jpg, /blog/south-korea-2025/south-korea-36-1280.jpg 2x, /blog/south-korea-2025/south-korea-36-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/south-korea-2025/south-korea-36-320.jpg, /blog/south-korea-2025/south-korea-36-640.jpg 2x, /blog/south-korea-2025/south-korea-36-960.jpg 3x\" src=\"/blog/south-korea-2025/south-korea-36-320.jpg\" alt=\"People gathered by a river at dusk, watching a bridge with a water fountain display under a colorful sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span><figcaption class=\"figure__caption\">Banpo Bridge in Seoul</figcaption></figure><p></p>",
            "url": "/blog/south-korea-2025/",
            "title": "South Korea in June 2025",
            "summary": "Photos from our trip to South Korea in June.",
            "date_modified": "2025-12-19T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/book-report-2025/",
            "content_html": "<ul>\n<li><strong>A Thousand Threads</strong> by Neneh Cherry ★★★☆☆</li>\n<li><strong>Zitronen</strong> by Valerie Fritsch ★★★★★</li>\n<li><strong>Thinking In Systems</strong> by Donella H. Meadows ★★★★☆</li>\n<li><strong>My Mother Laughs</strong> by Chantal Akerman ★★★☆☆</li>\n<li><strong>Brennende Felder</strong> by Reinhard Kaiser-Mühlecker ★★★★☆</li>\n<li><strong>Orlando</strong> by Virginia Woolf ★★★★★</li>\n<li><strong>Another Gaze 01</strong> by Daniella Shreir ★★★★☆</li>\n<li><strong>The Dawn of Everything</strong> by David Graeber and David Wengrow ★★★★★</li>\n<li><strong>Gebrauchsanweisung für Südkorea</strong> by Martin Hyun ★★☆☆☆</li>\n<li><strong>The Charisma Myth</strong> by Olivia Fox Cabane ★★★★☆</li>\n<li><strong>Counting Descent</strong> by Clint Smith ★★★★☆</li>\n<li><strong>Die Vegetarierin</strong> by Han Kang ★★★★★</li>\n<li><strong>On Photography</strong> by Susan Sontag ★★★☆☆</li>\n<li><strong>Die Wand</strong> by Marlen Haushofer ★★★★★</li>\n<li><strong>Klara and the Sun</strong> by Kazuo Ishiguro ★★★★★</li>\n<li><strong>South Of The Border, West Of The Sun</strong> by Haruki Murakami ★★★★★</li>\n<li><strong>Die Gabe</strong> by Suzumi Suzuki ★★★☆☆</li>\n<li><strong>Free</strong> by Lea Ypi ★★★★☆</li>\n<li><strong>Das siebte Kreuz</strong> by Anna Seghers ★★★★★</li>\n<li><strong>Die echtere Wirklichkeit</strong> by Raphaela Edelbauer ★★★★★</li>\n<li><strong>Deine kalten Hände</strong> by Han Kang ★★★★☆</li>\n<li><strong>Das Pen!smuseum</strong> by Mareike Fallwickl, Eva Reisinger ★★★★☆</li>\n<li><strong>Fischgrätentage</strong> by Elke Laznia ★★★★☆</li>\n<li><strong>Die Wut, die bleibt</strong> by Mareike Fallwickl ★★★★★</li>\n<li><strong>Babyjahre</strong> by Remo H. Largo ★★★★☆</li>\n<li><strong>Väter können das auch</strong> by Fabian Soethof ★☆☆☆☆</li>\n<li><strong>Die Unsterblichkeit</strong> by Milan Kundera ★★★☆☆</li>\n</ul>\n<p>These 27 books had 29 authors, of which 65% are women and 35% are men and they\nwere published in 9 different countries. Most in Austria (8), the UK (5) and the US and Germany (3 each).</p>",
            "url": "/blog/book-report-2025/",
            "title": "Book Report 2025",
            "summary": "Books I have read in 2025",
            "date_modified": "2026-01-25T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/favourite-albums-2025/",
            "content_html": "<h2>Double Infinity by Big Thief</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGwABAAICAwAAAAAAAAAAAAAAAAIDBAUGBwj/xAAoEAACAQMDAwIHAAAAAAAAAAABAhEAAwQFBhIhMVETYRQiIzJBcYH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEAAH/xAAZEQADAQEBAAAAAAAAAAAAAAAAAQIDMRH/2gAMAwEAAhEDEQA/APMuDg3sxvpI5QMFJUSZPYAfk1s8rb93Hw1vuLttW+0sJBPvHb99ayNuZga1j2S3E47XCOI6rzj55HWREeO0xXMNybqz9Z23pOjXNMt2vhh6K5Fm2FBBPVi/aYoO22k2lPAu2lzSUnVRBBIIggwRSrstw+VecNyDOTy8+/8AaU5cElIJUypIPkGpPcdxDu7DwWJpSt8IjSlKiP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/big-thief-double-infinity-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/big-thief-double-infinity-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/big-thief-double-infinity-320.jpg, /blog/favourite-albums-2025/big-thief-double-infinity-640.jpg 2x, /blog/favourite-albums-2025/big-thief-double-infinity-960.jpg 3x\" src=\"/blog/favourite-albums-2025/big-thief-double-infinity-320.jpg\" alt=\"A lime with its peel spiraling around it like orbital rings, against a black background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://bigthief.bandcamp.com/album/double-infinity\">Bandcamp</a></p>\n<h2>Choke Enough by Oklou</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAUGBwMI/8QAJxAAAQMEAgEDBQEAAAAAAAAAAQIDBAAFBhESIRMxQVEHFiKBwdH/xAAWAQEBAQAAAAAAAAAAAAAAAAAFAwT/xAAeEQACAgICAwAAAAAAAAAAAAABEQACAxIEgSIxQf/aAAwDAQACEQMRAD8A4T8TvlryGTZdha0LQEOMoCeaVAHY6JOveofOsFuFoZ+4fMlcq2NpeW1Kd1zQlwdDfqfX8ffup6f9SMkGYla5rk0WuGZD4hM8GgoK3txOj1w2Bs6CtE1DOwo+f5xeLu4hUmKJp8ZeSoJKNIKRxPx2Nf7V81vBJw/j0WQWBXUqt+ci3GU0/brW2mOWgUoaOko2Srj+uVK2hiwrQykRofFs7OkJOt79uqUYAQFpGSWXuJ5uw+6zIme2ksvKHnlMoeBOw4lSwCFfPRq4YJPlxcxurUeS8htUl0qSFHRPkI3SlbqehD8n3qa1Jvd0julDU54J0Do6P8pSlUUgzP/Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/oklou-choke-enough-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/oklou-choke-enough-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/oklou-choke-enough-320.jpg, /blog/favourite-albums-2025/oklou-choke-enough-640.jpg 2x, /blog/favourite-albums-2025/oklou-choke-enough-960.jpg 3x\" src=\"/blog/favourite-albums-2025/oklou-choke-enough-320.jpg\" alt=\"Double-exposed photo of a close-up face and a blue-tinted room scene with figures by a window.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://oklou.bandcamp.com/album/choke-enough\">Bandcamp</a></p>\n<h2>Year of the Slug by Caroline Rose</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQYH/8QAJhAAAQMDBAIBBQAAAAAAAAAAAQIDBAAFEQYSITETQQcicZGS0f/EABcBAAMBAAAAAAAAAAAAAAAAAAIEBQP/xAAjEQABBAEEAQUAAAAAAAAAAAABAAIDESESIjFhkQRBUXHB/9oADAMBAAIRAxEAPwDzu4rhI0vGdhqcfuLQQ65hJI8alDBKiBxz3/ajtNxuMK5z5E2At2NHiF5bC5Aa2biEhaTzlWSMYz396o6Zsc/UF2MSA5ETIZR50h5wqbcOd4Sf1xjquhvELUmtoUh272tVvu8NjxNpREcSZQzuCSdxGRjg49j1SLIw0mIm7s576+OU0XWBJVVQx1+8LCiXK8TYrS4DXiYQnYEpOce+STycEUrZNhbgsx0SpcGHJW0lbrC3A2pC8YII98julKH00XsweCqLHY3Oz9hXrdaoRblIEcJSGVp4UodK4PffNQ/F1nb1NZJirhJlNlMlpJMdYbUoEK4KgM4+kHAOKUq2cZChR7nAFZurHTZ9VXa1xUoUxCf8KHHhvcWNqTuWo9nn8YHqlKULJH6RkraSCPWdo8L/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/caroline-rose-year-of-the-slug-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/caroline-rose-year-of-the-slug-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/caroline-rose-year-of-the-slug-320.jpg, /blog/favourite-albums-2025/caroline-rose-year-of-the-slug-640.jpg 2x, /blog/favourite-albums-2025/caroline-rose-year-of-the-slug-960.jpg 3x\" src=\"/blog/favourite-albums-2025/caroline-rose-year-of-the-slug-320.jpg\" alt=\"Person with yellow hair leaning back in a chair on a busy city sidewalk, eyes closed.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://carolinerosemusic.bandcamp.com/album/year-of-the-slug\">Bandcamp</a></p>\n<h2>Alles Exhausted by Alles Exhausted</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAQFBgj/xAAoEAACAgEEAQMDBQAAAAAAAAABAgMRBAAFEiExBhNBFBVhIlGBkbH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A6DzYcqDOf6zNnOJICxMblWUBvih11QNV586xuz+oZd33eZn3PK9p/eaGKFwsaRqUpbHZb2+TE35BIqu7bf8AGz87cvpZ5slFbKEf6r9tozZABA6sAH8cfN96hfZMWKPPihfDhOLIkUCxRFC7Aq/EgWx+R0STZ/bQb3ZsyOTboQ+VHLIgCO/O+RHzfzfR/nTVT6VwScKdpDDJylsFbArgnXff96aCXv8AAZ9z21TNKilmIVaoMKIaiD2Pzqyw9vgxQCoMktsTLJRc2bPdf5ppoJEUUcKcYkVFsmlAAs+dNNNB/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/alles-exhausted-alles-exhausted-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/alles-exhausted-alles-exhausted-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/alles-exhausted-alles-exhausted-320.jpg, /blog/favourite-albums-2025/alles-exhausted-alles-exhausted-640.jpg 2x, /blog/favourite-albums-2025/alles-exhausted-alles-exhausted-960.jpg 3x\" src=\"/blog/favourite-albums-2025/alles-exhausted-alles-exhausted-320.jpg\" alt=\"Black-and-white hand-drawn illustration of two thumbs-up hands forming a face with droopy eyes.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://allesexhausted.bandcamp.com/album/alles-exhausted\">Bandcamp</a></p>\n<h2>Lux by Rosalía</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAcDBAUG/8QAKRAAAQMDAwEIAwAAAAAAAAAAAQIDBAAREgUGIUEHExQXMVJxgTJhwf/EABYBAQEBAAAAAAAAAAAAAAAAAAQCBf/EABsRAAIDAQEBAAAAAAAAAAAAAAABAgMRIVET/9oADAMBAAIRAxEAPwD1e3tE8eFypai1AZ/NfVZ9o/p6Vtaq/Bk6GrGEzCdbWkNNYYu2IuFKVzkCOnFvmuV2fb11HzIb27IkR2obUcdyytIuvIXuD7uD9ValswJDjzT0eO28+nFYKBdwWIB+r1F9s1au4kVRCHyfNbILalZHkFt5xsi+Cim9/W3FK0jPwl++CuLvyHMjOLakBAAWg2IxAII/d6s0jcmpato+lvy3QHg6paVtpxKSlI6j5pSgXJOyO+jam1CWeHKUbkk8k80pSnAj/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/rosalia-lux-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/rosalia-lux-640.jpg, /blog/favourite-albums-2025/rosalia-lux-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/rosalia-lux-320.jpg, /blog/favourite-albums-2025/rosalia-lux-640.jpg 2x, /blog/favourite-albums-2025/rosalia-lux-960.jpg 3x\" src=\"/blog/favourite-albums-2025/rosalia-lux-320.jpg\" alt=\"Woman in a white nun&#x27;s habit and form-fitting white top, eyes closed, against a pale blue sky.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://music.apple.com/at/album/lux/1848167516?l=en-GB\">Apple Music</a></p>\n<h2>Live at Sydney Opera House by Camp Cope</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMFBAYI/8QAJRAAAgEEAAYCAwAAAAAAAAAAAQIDAAQREgUGEyExQWFxIlGh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAwQCBv/EACARAAIBAwQDAAAAAAAAAAAAAAECAAMEERIhMZEyQVH/2gAMAwEAAhEDEQA/AOW4I1kkCvKkQ87PnH8BNTz2scUcjLe20jIwUKm2Wz7GR4qyteX2urASQzb3ZfAhCHBX97eM/FZs/KtwYYOjbskmxMm7+vQHbA+8980RrIOTLUsLhxlUJmq0q4u+A3MdzKluUkiViFZnVSR8jPalaFRT7hm0rg40HqXtrDpb7dWYqCAE6hCjP1Uk9ug4a94dmk7fizErSlRsTqnQ0gCm/wAMls+G21xFs8YyDr2pSlEWOeY60kI8R1P/2Q==); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/camp-cope-live-at-sydney-opera-house-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/camp-cope-live-at-sydney-opera-house-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/camp-cope-live-at-sydney-opera-house-320.jpg, /blog/favourite-albums-2025/camp-cope-live-at-sydney-opera-house-640.jpg 2x, /blog/favourite-albums-2025/camp-cope-live-at-sydney-opera-house-960.jpg 3x\" src=\"/blog/favourite-albums-2025/camp-cope-live-at-sydney-opera-house-320.jpg\" alt=\"Band performing on a warmly lit red stage to a seated audience in a grand concert hall.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://campcope.bandcamp.com/album/live-at-sydney-opera-house-2\">Bandcamp</a></p>\n<h2>West End Girl by Lily Allen</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAUGBwj/xAApEAABAwMDAgUFAAAAAAAAAAABAgMEAAURBhIhMXEHExUiYTJBUZGh/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwIB/8QAHREAAgEFAQEAAAAAAAAAAAAAAQIAAxESIXEiMf/aAAwDAQACEQMRAD8AwxbQwTirBqHSUywx48l51t+O8EgqQCNiiM4Oex/VXHwy0jFnOerXg7IbKwGUqICXFg8qOeMJ+eCe1aRKh266FhncxMbL581KHAsZKTncB+M/2oWmWGV5pcDU5nW2ArgUqV1NBRb71JjxtwZSo7A4MEDPFKNkKmxlBgReX3TRVI0jc4SlqS2VkhSfqT7AeCenPNSt6xoNtNr08kNsymFPOuOZU4VjGDu+3bpSlPSJzpjsJx4c8mQ3GS7NmuyJCtzriipR+SaUpRNsxF+T/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/lily-allen-west-end-girl-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/lily-allen-west-end-girl-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/lily-allen-west-end-girl-320.jpg, /blog/favourite-albums-2025/lily-allen-west-end-girl-640.jpg 2x, /blog/favourite-albums-2025/lily-allen-west-end-girl-960.jpg 3x\" src=\"/blog/favourite-albums-2025/lily-allen-west-end-girl-320.jpg\" alt=\"Painted portrait of a woman in an oversized blue polka-dot puffer jacket against a dark background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://music.apple.com/at/album/west-end-girl/1846342052?l=en-GB\">Apple Music</a></p>\n<h2>Pelle d'Oca by Ada Oda</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUGBP/EACkQAAEDAwIFAwUAAAAAAAAAAAECAwQABRExURITIUFhByJxBhQyQuH/xAAWAQEBAQAAAAAAAAAAAAAAAAAEBgX/xAAkEQACAQMBCQEAAAAAAAAAAAABAgADESFRBAYSEyKBkaGx8P/aAAwDAQACEQMRAD8Ax7Uc3RqPGgW4FxpPuLSSpTmnU7f2pb0RbMwx1NvNSM8PAMhR8b1p/Su6z22n1txyuFqpxCSpSiP184ru+sbpa1QlXdlKPvWlgBp9hS0rxjIJH4a9yOtC5DqRfErzvDRJZUXiUefcpwbBJjwY7T7jD7qUDjWsnOds98aZpU6wXK23i3iSl2RBUFFC2A8ohKhsduopTQKwFg4/dpHu2zuxZqRudBj7Jno5eZkqI9CfWlbMcYbJHUDb4rbX61Q7g04qQyOaUEcxHtVjYkajwc0pTgLpmZR6atxrMTdrZEtc9xiAzyWSArhBJGcAd/gUpSsMEkZlWQBgT//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/ada-oda-pelle-d-oca-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/ada-oda-pelle-d-oca-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/ada-oda-pelle-d-oca-320.jpg, /blog/favourite-albums-2025/ada-oda-pelle-d-oca-640.jpg 2x, /blog/favourite-albums-2025/ada-oda-pelle-d-oca-960.jpg 3x\" src=\"/blog/favourite-albums-2025/ada-oda-pelle-d-oca-320.jpg\" alt=\"A leg being tattooed, wrapped in cling film, held by black-gloved hands on a teal surface.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://music.apple.com/at/album/pelle-doca/1788552987?l=en-GB\">Apple Music</a></p>\n<h2>Sheepman by SodL</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQGAgX/xAAoEAACAQMEAAQHAAAAAAAAAAABAgMABAUREiFBEyIxoRQyYoGRsdH/xAAXAQADAQAAAAAAAAAAAAAAAAADBAUA/8QAJBEAAQMDAQkAAAAAAAAAAAAAAQACEQMFEiEEMUFRcYGx4fD/2gAMAwEAAhEDEQA/AI47BLmN4o5GZkfURsdeOeT7V6eNwmtwiyoHLr8icMAewpPVaDHJbW+OkeOxiEbShTMdPMSRxzz3VLY23ub4SwOzSBiEUBfTrU+vv1Qm3N9NhcdU6S1uhEnrCzGZxNjLdL4Ul15ECOTHoWYE8/qlbBcZlYxtMlu2ncibyfvSitu2AxHn0jZ7Pxn7uu58LBaXMawzXAQ6nbv41/FUWVpuhJE8yn6SP5SlRqYmqJUqoTMqv4cqAFmlVegCNB7UpSny0TuWDjzX/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/sodl-sheepman-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/sodl-sheepman-640.jpg, /blog/favourite-albums-2025/sodl-sheepman-1280.jpg 2x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/sodl-sheepman-320.jpg, /blog/favourite-albums-2025/sodl-sheepman-640.jpg 2x, /blog/favourite-albums-2025/sodl-sheepman-960.jpg 3x\" src=\"/blog/favourite-albums-2025/sodl-sheepman-320.jpg\" alt=\"Colorful pencil-drawn fantasy landscape with a ram-headed figure in a suit holding hands with a woman in a purple dress.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://music.apple.com/at/album/sheepman/1749966641?l=en-GB\">Apple Music</a></p>\n<h2>Unclouded by Melody's Echo Chamber</h2>\n<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 100%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAUHAgYI/8QAJRAAAgEDAwMFAQAAAAAAAAAAAQIDAAQRBQYhEjFBBwgTIlFh/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIDAf/EABkRAQEBAQEBAAAAAAAAAAAAAAEAAhEhUf/aAAwDAQACEQMRAD8AvvV7230nTbzUb65EFnahpJGZvA8DJ7nsP6agvTjcr7x2/JqHxrayR3DRFElMikABhzxz9gD/AEGon1q25cbl2k9pBMqRRTmeZTnqIVGCsAB9ulmBxxnHcVqPt4sRZya/aaXeziyR7dnMqr8mShJwOygknxkAAd+ai648mzgc9SvC3QEP1k9QYjljSsLOIJGyh2IDHknvStIDyhd6wK21dZdixYWkzA5xg9B/KpD2oqJBuNCAFzbyYH7hxSlFH5dFJmPIVjjOecUpSicb/9k=); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/favourite-albums-2025/melodys-echo-chamber-unclouded-960.jpg\" media=\"(min-width: 960px)\"><source srcset=\"/blog/favourite-albums-2025/melodys-echo-chamber-unclouded-640.jpg\" media=\"(min-width: 640px)\"><img srcset=\"/blog/favourite-albums-2025/melodys-echo-chamber-unclouded-320.jpg, /blog/favourite-albums-2025/melodys-echo-chamber-unclouded-640.jpg 2x, /blog/favourite-albums-2025/melodys-echo-chamber-unclouded-960.jpg 3x\" src=\"/blog/favourite-albums-2025/melodys-echo-chamber-unclouded-320.jpg\" alt=\"Woman in a black dress holding a cream Fender Mustang guitar, framed by a green Art Nouveau floral border on a white background.\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p><a href=\"https://melodysechochamber.bandcamp.com/album/unclouded\">Bandcamp</a></p>",
            "url": "/blog/favourite-albums-2025/",
            "title": "My Favourite Albums of 2025",
            "summary": "List of my favourite albums of 2025",
            "date_modified": "2026-03-11T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        },
        {
            "id": "/blog/hello-world/",
            "content_html": "<p></p><figure class=\"figure\"><span style=\"display: block; margin-left: auto; margin-right: auto; overflow: hidden; position: relative\"><span style=\"bottom: 0; display: block; filter: blur(50%); left: 0; padding-bottom: 66.875%; position: relative; background-image: url(data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAQFBgID/8QAJRAAAQMEAQMFAQAAAAAAAAAAAQIDBAAFESExBhITFCJBUWEj/8QAGAEAAgMAAAAAAAAAAAAAAAAAAwQAAQL/xAAdEQACAgIDAQAAAAAAAAAAAAAAAgERAyESIjFR/9oADAMBAAIRAxEAPwDLPdI3uz3BESVHQS5koeSsFsgc7+KnpizokfzhCHo6RkrbOcD7xzVr1/bupLy9FlWxHqSyjxOMFQQvtOzvhWcY1uqywXC/QlFm52aTHUg9z7z2kJTjScjOvwUFlqdDmNVZe07OmrqyUAqSc0r0XBt0hZdwcq2fGvtTn8HxSpxYFRvBt3w5PjX7SMnjipl4kOQLLIejq/o037SrfH390pTM+SVh26xPlwZ6eI7jwcchRFrWkKUpTQyTSlKzQPm30//Z); background-repeat: no-repeat; background-size: 100% 100%\"></span><picture class=\"\"><source srcset=\"/blog/hello-world/m-960.jpg, /blog/hello-world/m-1920.jpg 2x, /blog/hello-world/m-2880.jpg 3x\" media=\"(min-width: 960px)\"><source srcset=\"/blog/hello-world/m-640.jpg, /blog/hello-world/m-1280.jpg 2x, /blog/hello-world/m-1920.jpg 3x\" media=\"(min-width: 640px)\"><img srcset=\"/blog/hello-world/m-320.jpg, /blog/hello-world/m-640.jpg 2x, /blog/hello-world/m-960.jpg 3x\" src=\"/blog/hello-world/m-320.jpg\" alt=\"Close-up of a newborn baby&#x27;s tiny clenched fist resting on a white blanket with red polka dots\" class=\"\" loading=\"lazy\" style=\"height: 100%; left: 0; margin: 0; position: absolute; top: 0; vertical-align: middle; width: 100%\"></picture></span></figure><p></p>\n<p>April 8, 2026 ・ 11:36</p>",
            "url": "/blog/hello-world/",
            "title": "Hello World",
            "summary": "On April 8 my daughter was born",
            "date_modified": "2026-04-29T00:00:00.000Z",
            "author": {
                "name": "Florian Eckerstorfer",
                "url": "https://florian.ec"
            }
        }
    ]
}