<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title type="html">Elektrubadur</title>
  <subtitle type="html">Personal web page of Björn Lindström</subtitle>
  <link href="https://elektrubadur.se/feed.xml" rel="self" type="application/atom+xml" title="Elektrubadur"/>
  <link href="https://elektrubadur.se/" rel="alternate" type="text/html" title="Elektrubadur"/>
  <updated>2026-03-14T09:43:18+00:00</updated>
  <rights>© 2010–2026 Björn Lindström</rights>
  <author>
    <name>Björn Lindström</name>
    <email>bkhl@elektrubadur.se</email>
  </author>
  <id>https://elektrubadur.se/</id>
  <entry>
    <title type="html">Converting Sources of This Blog to Org format</title>
    <link href="https://elektrubadur.se/posts/converting_blog_to_org/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/converting_blog_to_org/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2023-05-28T00:00:00+02:00</published>
    <updated>2023-05-28T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;It looks a bit bad that the last entry here was three years ago and was about how the site generation works, and here is another one on the same topic. However, it&amp;rsquo;s in the interest of making it more enjoyable for me to write more that I&amp;rsquo;ve switched from &lt;a href="https://www.getzola.org/"&gt;Zola&lt;/a&gt; to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; in order to be able to keep the sources in Org format.&lt;/p&gt;
&lt;p&gt;Here I&amp;rsquo;ll just share &lt;a href="/posts/converting_blog_to_org/convert.py
"&gt;the script&lt;/a&gt; I made to do the format conversion, in case it&amp;rsquo;s useful for anyone else. Actually, half the reason I&amp;rsquo;m even writing this entry is that I will need to later on repeat this process for another page I manage, and this way I have the script and some notes for then.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;It looks a bit bad that the last entry here was three years ago and was about how the site generation works, and here is another one on the same topic. However, it&amp;rsquo;s in the interest of making it more enjoyable for me to write more that I&amp;rsquo;ve switched from &lt;a href="https://www.getzola.org/"&gt;Zola&lt;/a&gt; to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; in order to be able to keep the sources in Org format.&lt;/p&gt;
&lt;p&gt;Here I&amp;rsquo;ll just share &lt;a href="/posts/converting_blog_to_org/convert.py
"&gt;the script&lt;/a&gt; I made to do the format conversion, in case it&amp;rsquo;s useful for anyone else. Actually, half the reason I&amp;rsquo;m even writing this entry is that I will need to later on repeat this process for another page I manage, and this way I have the script and some notes for then.&lt;/p&gt;
&lt;p&gt;At the same time I&amp;rsquo;ve moved the sources from &lt;a href="https://gitlab.com/"&gt;GitLab&lt;/a&gt; to &lt;a href="https://sr.ht/"&gt;Sourcehut&lt;/a&gt; [Update 2024-11-05: I have since moved them to &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t delve deeper into the reasons for that, but I thought I&amp;rsquo;d post the Python script I used for the conversion in case it&amp;rsquo;s useful for anyone else. It&amp;rsquo;s not particularly pretty and has special casing for various things that were particular to my Zola theme, so if anyone else were to use it, they would in all likelyhood need to do some changes. I made a few manual fixes in the Org source after the conversion, of things that occurred to rarely to mke it worth automating.&lt;/p&gt;
&lt;p&gt;The script does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clears out the target content directory. That&amp;rsquo;s the &lt;code&gt;content/&lt;/code&gt; directory under your current working directory.&lt;/li&gt;
&lt;li&gt;Copy any non-Markdown files into the same location from the old content directory, assumed to be &lt;code&gt;content.old/&lt;/code&gt; in your current working directory.&lt;/li&gt;
&lt;li&gt;Extract TOML front matter from the old source files and convert into Org front matter.&lt;/li&gt;
&lt;li&gt;Run the remainder of the Markdown file through &lt;a href="https://pandoc.org/"&gt;Pandoc&lt;/a&gt; to convert it from Markdown to Org.&lt;/li&gt;
&lt;li&gt;Apply various substitutions to the body to fix some things Pandoc doesn&amp;rsquo;t handle, or just according to my preferences.&lt;/li&gt;
&lt;li&gt;Write some metadata that can not be nicely encoded as Org front matter and put it in a &lt;code&gt;config.toml&lt;/code&gt; file next to the Org file instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I just needed to go ahead and write a Hugo templates that works with this new content directory. Getting the same general structure of the page as in Zola isn&amp;rsquo;t difficult, as Zola is inspired by Hugo and uses a lot of the same conventions. I didn&amp;rsquo;t have to do much to be able to preserve mostly the same hierarchy of the source files for equivalent output.&lt;/p&gt;
&lt;p&gt;If you are curious about the Hugo templates used to render this page, they are in &lt;a href="https://github.com/bkhl/elektrubadur.se/"&gt;the repository with the sources for this page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, if you want to use the script I&amp;rsquo;ve been talking about, you can download it here: &lt;a href="/posts/converting_blog_to_org/convert.py
"&gt;convert.py&lt;/a&gt;&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="programming" label="Programming"/>
    <category scheme="https://elektrubadur.se/tags" term="www" label="WWW"/>
    <category scheme="https://elektrubadur.se/tags" term="markdown" label="Markdown"/>
    <category scheme="https://elektrubadur.se/tags" term="org" label="Org"/>
    <category scheme="https://elektrubadur.se/tags" term="hugo" label="Hugo"/>
    <category scheme="https://elektrubadur.se/tags" term="python" label="Python"/>
    <category scheme="https://elektrubadur.se/tags" term="emacs" label="Emacs"/>
  </entry>
  <entry>
    <title type="html">How This Blog Works</title>
    <link href="https://elektrubadur.se/posts/how_this_blog_works/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/how_this_blog_works/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2020-05-03T00:00:00+02:00</published>
    <updated>2020-05-03T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;This blog is created using the &lt;a href="https://www.getzola.org/"&gt;Zola static site engine&lt;/a&gt;. I use a combination of &lt;a href="https://docs.gitlab.com/ci/"&gt;GitLab CI&lt;/a&gt; and &lt;code&gt;cron&lt;/code&gt; to automatically upload it to my web server whenever I merge a change to the &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; &lt;code&gt;master&lt;/code&gt; branch of the home page.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;elektrubadur.se&lt;/code&gt; source code is kept &lt;em&gt;here in GitLab&lt;/em&gt; &lt;em&gt;[Update 2024-11-05: &lt;a href="https://github.com/bkhl/elektrubadur.se/"&gt;elektrubadur.se source code since moved to GitHub&lt;/a&gt;]&lt;/em&gt;. While writing a post I just run &lt;code&gt;zola serve&lt;/code&gt; on my computer and can look at a dynamically updated website on a local web server.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;This blog is created using the &lt;a href="https://www.getzola.org/"&gt;Zola static site engine&lt;/a&gt;. I use a combination of &lt;a href="https://docs.gitlab.com/ci/"&gt;GitLab CI&lt;/a&gt; and &lt;code&gt;cron&lt;/code&gt; to automatically upload it to my web server whenever I merge a change to the &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; &lt;code&gt;master&lt;/code&gt; branch of the home page.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;elektrubadur.se&lt;/code&gt; source code is kept &lt;em&gt;here in GitLab&lt;/em&gt; &lt;em&gt;[Update 2024-11-05: &lt;a href="https://github.com/bkhl/elektrubadur.se/"&gt;elektrubadur.se source code since moved to GitHub&lt;/a&gt;]&lt;/em&gt;. While writing a post I just run &lt;code&gt;zola serve&lt;/code&gt; on my computer and can look at a dynamically updated website on a local web server.&lt;/p&gt;
&lt;p&gt;Once ready, I commit on a branch and push it to GitLab, and then make a merge request. This might seem a bit silly for a one-man project, but this way I can disable pushes to the &lt;code&gt;master&lt;/code&gt; branch entirely, which can help prevent an accident.&lt;/p&gt;
&lt;p&gt;The repository includes the separate repository &lt;a href="https://gitlab.com/bkhl/web-build"&gt;web-build&lt;/a&gt; as a submodule. It contains some scripts used to build and publish the web site.&lt;/p&gt;
&lt;p&gt;My website is hosted at &lt;a href="https://hcoop.net/"&gt;HCoop&lt;/a&gt;, a hosting cooperative. Because it uses AFS, passwordless login requires the use of Kerberos, so I can&amp;rsquo;t just push the page using a deploy key.&lt;/p&gt;
&lt;p&gt;So, rather than pushing the website there, I&amp;rsquo;m pulling. I&amp;rsquo;ve put the script &lt;code&gt;fetch_website.py&lt;/code&gt; from &lt;a href="https://gitlab.com/bkhl/web-build"&gt;web-build&lt;/a&gt; on the target host, and makes it run it as a cron job:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-crontab" data-lang="crontab"&gt;*/5 * * * * k5start -qtUf &amp;#34;/etc/keytabs/user.daemon/$USER&amp;#34; -- &amp;#34;$HOME/scripts/fetch_website.py&amp;#34; &amp;#34;https://gitlab.com/bkhl/elektrubadur.se/-/jobs/artifacts/master/download?job=build&amp;#34; &amp;#34;$HOME/www/elektrubadur.se&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;k5start&lt;/code&gt; thing is another thing needed because of the use of AFS and Kerberos. The point here is that you give the script a URL to a GitLab artifact, and a target directory, and it will deploy it if there&amp;rsquo;s been any change.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gitlab.com/bkhl/web-build/-/blob/f76df73fd337b43452e7cb934347357b5c9aafa7/fetch_website.py"&gt;The entire script&lt;/a&gt; is a bit long to post here, but it basically checks if there is a new artifact in GitLab for the website, built from the &lt;code&gt;master&lt;/code&gt; branch, and if there is downloads and deploys it. It saves the ETag in a file, so that it can compare to that and skip downloading unless there has been a change.&lt;/p&gt;
&lt;p&gt;Credits for tools used making this page, inspirations for the design &amp;amp;c. are also on &lt;a href="/about_page/"&gt;About This Page&lt;/a&gt;.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="software" label="Software"/>
    <category scheme="https://elektrubadur.se/tags" term="www" label="WWW"/>
    <category scheme="https://elektrubadur.se/tags" term="hcoop" label="HCoop"/>
    <category scheme="https://elektrubadur.se/tags" term="git" label="Git"/>
    <category scheme="https://elektrubadur.se/tags" term="automation" label="Automation"/>
  </entry>
  <entry>
    <title type="html">Vimwiki + Nextcloud Notes</title>
    <link href="https://elektrubadur.se/posts/vimwiki_and_nextcloud/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/vimwiki_and_nextcloud/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2020-05-02T00:00:00+02:00</published>
    <updated>2020-05-02T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;I&amp;rsquo;ve been using &lt;a href="http://vimwiki.github.io/"&gt;Vimwiki&lt;/a&gt; for a while, which lets me keep interlinked plain text notes on my computer with minimal hassle.&lt;/p&gt;
&lt;p&gt;For a while I&amp;rsquo;ve also kept these synced to my phone via the &lt;a href="https://apps.nextcloud.com/apps/notes/"&gt;Nextcloud Notes&lt;/a&gt; application. I have a self-hosted &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; instance, and simply point Vimwiki on my computer to the same directory in the directory that I have synchronized with Nextcloud.&lt;/p&gt;
&lt;p&gt;The Nextcloud Notes app uses Markdown, so I have to configure Vimwiki to use that syntax, which is fine with me. One quirk of the Nextcloud Notes app is that rather than letting you name files independently, it will change filenames to whatever the first line of your note is. Until today that meant I had to keep making sure in Vimwiki to add those headers, but I&amp;rsquo;ve now finally automated that.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I&amp;rsquo;ve been using &lt;a href="http://vimwiki.github.io/"&gt;Vimwiki&lt;/a&gt; for a while, which lets me keep interlinked plain text notes on my computer with minimal hassle.&lt;/p&gt;
&lt;p&gt;For a while I&amp;rsquo;ve also kept these synced to my phone via the &lt;a href="https://apps.nextcloud.com/apps/notes/"&gt;Nextcloud Notes&lt;/a&gt; application. I have a self-hosted &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; instance, and simply point Vimwiki on my computer to the same directory in the directory that I have synchronized with Nextcloud.&lt;/p&gt;
&lt;p&gt;The Nextcloud Notes app uses Markdown, so I have to configure Vimwiki to use that syntax, which is fine with me. One quirk of the Nextcloud Notes app is that rather than letting you name files independently, it will change filenames to whatever the first line of your note is. Until today that meant I had to keep making sure in Vimwiki to add those headers, but I&amp;rsquo;ve now finally automated that.&lt;/p&gt;
&lt;p&gt;To start with, I added the function &lt;code&gt;SetWikiHeader&lt;/code&gt; to &lt;a href="https://github.com/bkhl/dotfiles/blob/c122d0b5016a9e4cfc29947ff7ecb9741ab4d11e/.vim/plugin/config/vimwiki.vim"&gt;my ~/.vim/plugin/config/vim.wiki&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vim" data-lang="vim"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nx"&gt;runtimepath&lt;/span&gt; &lt;span class="p"&gt;!~&lt;/span&gt;? &lt;span class="s2"&gt;&amp;#34;vimwiki&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nx"&gt;finish&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; My main wiki.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;:&lt;span class="nx"&gt;vimwiki_list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; [{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            \&lt;span class="s2"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;~/Documents/Notes/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            \&lt;span class="s2"&gt;&amp;#34;syntax&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;markdown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ext&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;.md&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            \}]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; Disable creation of temporary wikis.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;:&lt;span class="nx"&gt;vimwiki_global_ext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; Function to set header of current file to match filename.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; This helps interoparability with Nextcloud Notes, which assumes that&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; the first line of the file matches the filename.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;SetWikiHeader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;first_line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%:t:r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;# &amp;#34;&lt;/span&gt; . &lt;span class="nx"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;first_line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;        &amp;#34; First line is already correct.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        :
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="nx"&gt;first_line&lt;/span&gt; &lt;span class="p"&gt;=~&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;^#*\s*\V&amp;#39;&lt;/span&gt; . &lt;span class="nx"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; . &lt;span class="s1"&gt;&amp;#39;\m\s*$&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;        &amp;#34; First line matches filename but has wrong header format.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;        &amp;#34; Reformat to have proper format.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;setline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;# &amp;#34;&lt;/span&gt; . &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;        &amp;#34; First line not matching filename at all. Prepend lines with&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;        &amp;#34; filename as a header.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;first_line&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;# &amp;#34;&lt;/span&gt; . &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;endfunction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vim script is pretty weird, had to search in documentation for how to do most things in there. Props to people who write entire programs in it, like let&amp;rsquo;s say &lt;a href="https://github.com/orgs/vimwiki/people"&gt;those people that wrote Vimwiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, to make this run whenever I open a Vimwiki file, or before saving it, I put this in &lt;a href="https://github.com/bkhl/dotfiles/blob/c122d0b5016a9e4cfc29947ff7ecb9741ab4d11e/.vim/plugin/config/vimwiki.vim"&gt;my ~/.vim/ftplugin/vimwiki.vim&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vim" data-lang="vim"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; Set header to match filename when opening or saving file, for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;#34; interoperability with Nextcloud Notes.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;SetWikiHeader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;autocmd&lt;/span&gt; &lt;span class="nx"&gt;BufWritePre&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;SetWikiHeader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The end result is pretty nice. The only big catch is that I can&amp;rsquo;t rename files in Nextcloud Notes if they have a lot of links to them, since those links only get updated if I use the rename function in Vimwiki, but then that&amp;rsquo;s not something I do very often.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="programming" label="Programming"/>
    <category scheme="https://elektrubadur.se/tags" term="vim" label="Vim"/>
    <category scheme="https://elektrubadur.se/tags" term="vimwiki" label="Vimwiki"/>
    <category scheme="https://elektrubadur.se/tags" term="nextcloud" label="Nextcloud"/>
    <category scheme="https://elektrubadur.se/tags" term="notes" label="notes"/>
  </entry>
  <entry>
    <title type="html">First Month with Fedora Silverblue</title>
    <link href="https://elektrubadur.se/posts/first_month_with_fedora_silverblue/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/first_month_with_fedora_silverblue/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2020-02-08T00:00:00+01:00</published>
    <updated>2020-02-08T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;I decided during my midwinter vacation that I&amp;rsquo;d try out &lt;a href="https://fedoraproject.org/atomic-desktops/silverblue/"&gt;Fedora Silverblue&lt;/a&gt; on my desktop, and I liked it, so here I am still using it on my work laptop.&lt;/p&gt;
&lt;p&gt;Silverblue is a version of Fedora using &lt;a href="https://coreos.github.io/rpm-ostree/"&gt;rpm-ostree&lt;/a&gt; to provide a minimal and immutable base OS, providing a platform for running applications in containers.&lt;/p&gt;
&lt;p&gt;Previously I was using Ubuntu with a lot of Ansible playbooks for installing things both globally and in my home directory. I used to keep those playbooks in the same directory as my &lt;a href="https://github.com/bkhl/dotfiles"&gt;dotfiles&lt;/a&gt;, but after the switch to Fedora I removed them. If anyone is curious about what that looked like, &lt;a href="https://gitlab.com/bkhl/workstation-playbooks/tree/065ce9ca0547ca4d9c1e574407ba6373fcc99b69"&gt;they are here&lt;/a&gt;.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I decided during my midwinter vacation that I&amp;rsquo;d try out &lt;a href="https://fedoraproject.org/atomic-desktops/silverblue/"&gt;Fedora Silverblue&lt;/a&gt; on my desktop, and I liked it, so here I am still using it on my work laptop.&lt;/p&gt;
&lt;p&gt;Silverblue is a version of Fedora using &lt;a href="https://coreos.github.io/rpm-ostree/"&gt;rpm-ostree&lt;/a&gt; to provide a minimal and immutable base OS, providing a platform for running applications in containers.&lt;/p&gt;
&lt;p&gt;Previously I was using Ubuntu with a lot of Ansible playbooks for installing things both globally and in my home directory. I used to keep those playbooks in the same directory as my &lt;a href="https://github.com/bkhl/dotfiles"&gt;dotfiles&lt;/a&gt;, but after the switch to Fedora I removed them. If anyone is curious about what that looked like, &lt;a href="https://gitlab.com/bkhl/workstation-playbooks/tree/065ce9ca0547ca4d9c1e574407ba6373fcc99b69"&gt;they are here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The benefits I was hoping for was&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make my laptop setup more &amp;ldquo;out of the box&amp;rdquo;, to get away from having a big collection of Ansible roles for varied purposes, that all have to work together on my laptop.&lt;/li&gt;
&lt;li&gt;Simplifying my base OS by moving development stuff and applications into containers.&lt;/li&gt;
&lt;li&gt;Plain Gnome desktop without custom themes.&lt;/li&gt;
&lt;li&gt;RPM-based. This is not an advantage in itself, but makes things a bit easier as I mostly deal with RHEL and Centos for work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Applications&lt;/h2&gt;
&lt;p&gt;For applications, I&amp;rsquo;m using mostly Flatpak. I found after a while that applications I had installed from the Fedora Flatpak repository was more buggy than the ones I had from &lt;a href="https://flathub.org/en"&gt;Flathub&lt;/a&gt;, so at one point I made a switch to get all my applications from Flathub.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the entire command line to get &lt;code&gt;rpm-ostree&lt;/code&gt; into the current state of my laptop:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm-ostree reset
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm-ostree install &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  fedora-workstation-repositories &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  ffmpeg-libs &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  google-chrome-stable &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  gparted &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  krb5-workstation &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  langpacks-en &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  langpacks-en_GB &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  langpacks-sv &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  langpacks-th &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  libgnome-keyring &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  NetworkManager-fortisslvpn-gnome &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  nextcloud-client &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  qemu &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  thai-arundina-sans-fonts &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  thai-arundina-sans-mono-fonts &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  thai-arundina-serif-fonts &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  vim-enhanced &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  vim-X11 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  virt-manager &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  wl-clipboard
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm-ostree install &lt;span class="s1"&gt;&amp;#39;https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-31.noarch.rpm&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm-ostree install &lt;span class="s1"&gt;&amp;#39;https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-31.noarch.rpm&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rpm-ostree install fuse-exfat exfat-utils
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see, there&amp;rsquo;s just a few things that has to be added as RPMs. Not a lot, considering that in the default installation, Silverblue just comes with a terminal, a file manager, and Firefox, in terms of applications.&lt;/p&gt;
&lt;h2&gt;Development environments&lt;/h2&gt;
&lt;p&gt;The main thing I&amp;rsquo;ve done so far to make it convenient for me to use as a development system is to create container images for use with &lt;a href="https://github.com/containers/toolbox"&gt;Toolbox&lt;/a&gt;. I keep these images &lt;a href="https://gitlab.com/bkhl/toolboxes"&gt;here in GitLab&lt;/a&gt;. I&amp;rsquo;ll write more about that in a future article.&lt;/p&gt;
&lt;p&gt;For now I&amp;rsquo;ll summarize it by saying I&amp;rsquo;ve created some Toolbox environments for various languages, configured to keep caches and such in the container, rather than my &lt;code&gt;$HOME&lt;/code&gt;, and it&amp;rsquo;s working quite nicely so far.&lt;/p&gt;
&lt;h2&gt;Gnome&lt;/h2&gt;
&lt;p&gt;I used the default Ubuntu desktop before, so this is not a dramatic change, but I like the look and feel of the default Gnome desktop. I also get a somewhat newer version of it, which is nice.&lt;/p&gt;
&lt;p&gt;A few weeks after the switch, Tobias Bernard (Gnome developer) posted the article &lt;a href="https://blogs.gnome.org/tbernard/2020/01/17/doing-things-that-scale/"&gt;Doing Things That Scale&lt;/a&gt;, which resonated with me. While I&amp;rsquo;ve done some hacking to set up my development environments &amp;ldquo;just right&amp;rdquo; as described above, I&amp;rsquo;m trying to think of how to make that work more usable for others, maybe by contributing back to the &lt;a href="https://github.com/containers/toolbox"&gt;Toolbox&lt;/a&gt; project, or by making some sort of GUI wrapper to manage a set of development environment toolboxes.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="software" label="Software"/>
    <category scheme="https://elektrubadur.se/tags" term="linux" label="Linux"/>
    <category scheme="https://elektrubadur.se/tags" term="fedora" label="Fedora"/>
    <category scheme="https://elektrubadur.se/tags" term="silverblue" label="Silverblue"/>
    <category scheme="https://elektrubadur.se/tags" term="containers" label="containers"/>
  </entry>
  <entry>
    <title type="html">Simple Nextcloud To-Do List Automation with Python and WebDAV</title>
    <link href="https://elektrubadur.se/posts/nextcloud_to_do_automation/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/nextcloud_to_do_automation/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2019-05-05T00:00:00+02:00</published>
    <updated>2019-05-05T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;I keep a task list in a &lt;a href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt; format in
&lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt;. They are simply kept as two text
files, &lt;code&gt;todo.txt&lt;/code&gt; and &lt;code&gt;done.txt&lt;/code&gt; in the root of my Nextcloud user
directory.&lt;/p&gt;
&lt;p&gt;Some clients already have the option to move tasks from &lt;code&gt;todo.txt&lt;/code&gt; to
&lt;code&gt;done.txt&lt;/code&gt; when you mark a task as done. However, I would prefer they
stick around in the &lt;code&gt;todo.txt&lt;/code&gt; for a while, in case I change my mind.&lt;/p&gt;
&lt;p&gt;At first I thought I&amp;rsquo;d just write a script to run as a cronjob on the
server hosting Nextcloud, but that won&amp;rsquo;t work with syncrhonization, as
it won&amp;rsquo;t let Nextcloud know the files have changed. I then thought there
must be an API to read/write files to Nextcloud, and then quickly
realized that this API is
&lt;a href="https://tools.ietf.org/html/rfc2518"&gt;WebDAV&lt;/a&gt;. So, I should be able to
make a Python script to do this, using
&lt;a href="https://pypi.org/project/requests/"&gt;requests&lt;/a&gt;. A more full-featured
WebDAV library would be overkill for this.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I keep a task list in a &lt;a href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt; format in
&lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt;. They are simply kept as two text
files, &lt;code&gt;todo.txt&lt;/code&gt; and &lt;code&gt;done.txt&lt;/code&gt; in the root of my Nextcloud user
directory.&lt;/p&gt;
&lt;p&gt;Some clients already have the option to move tasks from &lt;code&gt;todo.txt&lt;/code&gt; to
&lt;code&gt;done.txt&lt;/code&gt; when you mark a task as done. However, I would prefer they
stick around in the &lt;code&gt;todo.txt&lt;/code&gt; for a while, in case I change my mind.&lt;/p&gt;
&lt;p&gt;At first I thought I&amp;rsquo;d just write a script to run as a cronjob on the
server hosting Nextcloud, but that won&amp;rsquo;t work with syncrhonization, as
it won&amp;rsquo;t let Nextcloud know the files have changed. I then thought there
must be an API to read/write files to Nextcloud, and then quickly
realized that this API is
&lt;a href="https://tools.ietf.org/html/rfc2518"&gt;WebDAV&lt;/a&gt;. So, I should be able to
make a Python script to do this, using
&lt;a href="https://pypi.org/project/requests/"&gt;requests&lt;/a&gt;. A more full-featured
WebDAV library would be overkill for this.&lt;/p&gt;
&lt;h2&gt;Outline&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what the script will do.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get the &lt;code&gt;todo.txt&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;If there are any completed tasks in there, get the &lt;code&gt;done.txt&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Strip the completed tasks from &lt;code&gt;todo.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Append the completed tasks to the content from &lt;code&gt;done.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;todo.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If there was no problem updating &lt;code&gt;todo.txt&lt;/code&gt;, update &lt;code&gt;done.txt&lt;/code&gt;. This
step has to be retried in case of a conflict, because now the only
copy of those done tasks is in the script&amp;rsquo;s memory.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This still leaves room for some issues if the script crashes in the
middle of running, but I figured if it happens I&amp;rsquo;d get a mail from cron,
and there&amp;rsquo;s a file history in Nextcloud so I can sort it out then. After
running this a few months now it still hasn&amp;rsquo;t happened.&lt;/p&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Starting with imports and stuff of course:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;configparser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In &lt;a href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt;, tasks are marked as done by
prepending the token &lt;code&gt;x&lt;/code&gt; at the start of the line. For this purpose,
that&amp;rsquo;s really all we need to do, so I just create regexp to match these
lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DONE_LINE_RE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;^x\b&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it for the parsing.&lt;/p&gt;
&lt;p&gt;Now, as this script will update two files, and I don&amp;rsquo;t want to lose any
tasks, I need to worry about race conditions. In other words, I&amp;rsquo;ll need
to use &lt;a href="https://tools.ietf.org/html/rfc7232"&gt;ETags&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the structure of the script, I at first wrote it using the
&lt;a href="https://plumbum.readthedocs.io/en/latest/cli.html"&gt;Plumbum CLI
application&lt;/a&gt;, but later found that it was adding so little benefit I
didn&amp;rsquo;t want that dependency. Instead I&amp;rsquo;ll use &lt;code&gt;configparser&lt;/code&gt; and
&lt;code&gt;argparse&lt;/code&gt; for the same thing. For error handling, I&amp;rsquo;ll have functions
return one of these values, and translate them to return codes at the
end.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SUCCESS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FAILURE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s time for the &lt;code&gt;main&lt;/code&gt; function.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;# Parse command line arguments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;argument_parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;argument_parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;configuration filename&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argument_parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;config_filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;# Parse configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;config_parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;configparser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;config_parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config_filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config_parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Connection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config_parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Connection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config_parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Connection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hostname&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;configparser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="s1"&gt;&amp;#39;Missing configuration in &amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#34;.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="n"&gt;config_filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;FAILURE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;# Perform maintenance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;archive_done_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows you to pass a command line argument pointing you to a
configfile containing something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Connection]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;your.nextcloud.instance.net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;your_user_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;v3ris3curep4ssworð&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, the function that&amp;rsquo;s the meat of the script, which actually gets and
updates the files, and moves the completed tasks over.&lt;/p&gt;
&lt;p&gt;The first loop will get the &lt;code&gt;todo.txt&lt;/code&gt;, then put it back after filtering
out the completed tasks.&lt;/p&gt;
&lt;p&gt;If the initial GET fails, it will return successfully, since that
probably means the server is unavailable, and we are better off just
waiting for the next time cron triggers the script.&lt;/p&gt;
&lt;p&gt;The next loop will retry up to ten times, because at that point
&lt;code&gt;todo.txt&lt;/code&gt; has been updated, so we should try a bit harder to get
&lt;code&gt;done.txt&lt;/code&gt; into a correct state.&lt;/p&gt;
&lt;p&gt;This function is a bit long and would benefit from refactoring. (Pull
requests accepted.)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;archive_done_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;base_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;/remote.php/dav/files/&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;todo_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;/todo.txt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;done_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;/done.txt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;todo_put&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todo_put&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;todo_put&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;todo_get&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todo_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="c1"&gt;# If the first GET fails, just return and wait for next&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="c1"&gt;# time script is run.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;todo_get&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;todo_lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;todo_get&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;updated_todo_lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;added_done_lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;todo_lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;DONE_LINE_RE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="n"&gt;added_done_lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="n"&gt;updated_todo_lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;added_done_lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="c1"&gt;# Nothing to do.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;todo_put&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="n"&gt;todo_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updated_todo_lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;If-Match&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;get_etag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todo_get&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;done_put&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;done_put&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;done_put&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;done_get&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;done_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;done_get&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;done_lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;done_get&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;done_put&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="n"&gt;done_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;done_lines&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;added_done_lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;If-Match&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;get_etag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;done_get&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="c1"&gt;# Retry this a few times since we updated todo.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="c1"&gt;#  and want to get done.txt into a correct state.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the helper function to get the etag from a &lt;code&gt;requests.Response&lt;/code&gt;
object. I found that the ETags from Nextcloud has a content type suffix,
so had to make another regexp to remove that :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ETAG_RE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;^&amp;#34;(.*)-gzip&amp;#34;$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_etag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ETAG_RE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;etag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, we call the main function like this. The &lt;code&gt;SUCCESS&lt;/code&gt; and &lt;code&gt;FAILURE&lt;/code&gt;
objects are converted into status codes and the script exits
accordingly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;FAILURE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is &lt;a href="./todo_maintenance.py"&gt;the entire script&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is just a start, if you want more advanced automation, handy things
that could be added include (again, pull requests accepted):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parse tags indicating repeating tasks. When those are completed, move
the current one to &lt;code&gt;done.txt&lt;/code&gt;, but create a new task for the next
occurance at the same time.&lt;/li&gt;
&lt;li&gt;Change it to keep completed tasks in &lt;code&gt;done.txt&lt;/code&gt; for a certain numer of
days after the completion date.&lt;/li&gt;
&lt;/ul&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="programming" label="Programming"/>
    <category scheme="https://elektrubadur.se/tags" term="nextcloud" label="Nextcloud"/>
    <category scheme="https://elektrubadur.se/tags" term="planning" label="planning"/>
  </entry>
  <entry>
    <title type="html">Suphan Buri</title>
    <link href="https://elektrubadur.se/posts/suphan-buri/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/suphan-buri/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2018-12-10T00:00:00+01:00</published>
    <updated>2018-12-10T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;I went on a work outing to Suphan Buri a little while back, here comes
some photos. Most of the pictures are from the buffalo themed resort
where we stayed.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I went on a work outing to Suphan Buri a little while back, here comes
some photos. Most of the pictures are from the buffalo themed resort
where we stayed.&lt;/p&gt;
&lt;figure&gt;
  
    &lt;img src="buffalo.jpeg" alt="Buffalo"&gt;
  
  
  &lt;figcaption&gt;Buffalo&lt;/figcaption&gt;
  
&lt;/figure&gt;

&lt;figure&gt;
  
    &lt;img src="deer.jpeg" alt="Deer"&gt;
  
  
  &lt;figcaption&gt;Deer&lt;/figcaption&gt;
  
&lt;/figure&gt;

&lt;figure&gt;
  
    &lt;img src="houses.jpeg" alt="Houses"&gt;
  
  
  &lt;figcaption&gt;Accomodations&lt;/figcaption&gt;
  
&lt;/figure&gt;

&lt;figure&gt;
  
    &lt;img src="peacock.jpeg" alt="Peacock"&gt;
  
  
  &lt;figcaption&gt;Peacock&lt;/figcaption&gt;
  
&lt;/figure&gt;

&lt;figure&gt;
  
    &lt;img src="river.jpeg" alt="River"&gt;
  
  
  &lt;figcaption&gt;River flowing past nearby Sam Chuk market&lt;/figcaption&gt;
  
&lt;/figure&gt;</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Traffic</title>
    <link href="https://elektrubadur.se/posts/traffic/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/traffic/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-09-15T00:00:00+02:00</published>
    <updated>2017-09-15T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Lower Parel, Mumbai.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Lower Parel, Mumbai.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Gecko on Window</title>
    <link href="https://elektrubadur.se/posts/gecko-on-window/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/gecko-on-window/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-05-31T00:00:00+02:00</published>
    <updated>2017-05-31T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Gecko climbing outside of my window.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Gecko climbing outside of my window.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Frog</title>
    <link href="https://elektrubadur.se/posts/frog/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/frog/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-05-11T18:00:00+07:00</published>
    <updated>2017-05-11T18:00:00+07:00</updated>
    <summary type="html">&lt;p&gt;Bathroom decoration on Koh Lanta.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Bathroom decoration on Koh Lanta.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Cow</title>
    <link href="https://elektrubadur.se/posts/cow/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/cow/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-05-11T12:00:00+07:00</published>
    <updated>2017-05-11T12:00:00+07:00</updated>
    <summary type="html">&lt;p&gt;Resort cow.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Resort cow.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Ants</title>
    <link href="https://elektrubadur.se/posts/ants/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/ants/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-05-08T00:00:00+02:00</published>
    <updated>2017-05-08T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Fruit on the porch attracting ants.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Fruit on the porch attracting ants.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Hermit Crab</title>
    <link href="https://elektrubadur.se/posts/hermit-crab/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/hermit-crab/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-05-06T00:00:00+02:00</published>
    <updated>2017-05-06T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Hermit crab on the beach.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Hermit crab on the beach.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Bat Yam at Night</title>
    <link href="https://elektrubadur.se/posts/bat-yam-at-night/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/bat-yam-at-night/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-29T00:00:00+02:00</published>
    <updated>2017-04-29T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Bat Yam night time skyline.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Bat Yam night time skyline.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Jaffa</title>
    <link href="https://elektrubadur.se/posts/jaffa/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/jaffa/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-22T00:00:00+02:00</published>
    <updated>2017-04-22T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Port of Jaffa.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Port of Jaffa.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Pigeon on Pillar</title>
    <link href="https://elektrubadur.se/posts/pigeon-on-pillar/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/pigeon-on-pillar/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-11T14:00:00+02:00</published>
    <updated>2017-04-11T14:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Pidgeon on stoa pillar.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Pidgeon on stoa pillar.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Minaret</title>
    <link href="https://elektrubadur.se/posts/minaret/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/minaret/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-11T12:00:00+02:00</published>
    <updated>2017-04-11T12:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Mosque of Omar minaret, Jerusalem.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Mosque of Omar minaret, Jerusalem.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Pigeon by Sea</title>
    <link href="https://elektrubadur.se/posts/pigeon-by-sea/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/pigeon-by-sea/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-10T00:00:00+02:00</published>
    <updated>2017-04-10T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Pidgeon by the Eastern Mediterranean Sea.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Pidgeon by the Eastern Mediterranean Sea.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Bat Man</title>
    <link href="https://elektrubadur.se/posts/bat-man/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/bat-man/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-08T18:00:00+02:00</published>
    <updated>2017-04-08T18:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Bat Man in Bat Yam.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Bat Man in Bat Yam.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Paramotoring</title>
    <link href="https://elektrubadur.se/posts/paramotoring/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/paramotoring/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-08T10:00:00+02:00</published>
    <updated>2017-04-08T10:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Powered paraglider over Bat Yam beach.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Powered paraglider over Bat Yam beach.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Bat Yam Beach</title>
    <link href="https://elektrubadur.se/posts/bat-yam-beach/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/bat-yam-beach/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-04-07T00:00:00+02:00</published>
    <updated>2017-04-07T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Bat Yam beach.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Bat Yam beach.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">ACME</title>
    <link href="https://elektrubadur.se/posts/acme/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/acme/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-03-22T00:00:00+01:00</published>
    <updated>2017-03-22T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Selfie outside of ACME building, Bangkok.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Selfie outside of ACME building, Bangkok.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Grasshopper</title>
    <link href="https://elektrubadur.se/posts/grasshopper/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/grasshopper/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-03-20T00:00:00+01:00</published>
    <updated>2017-03-20T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Urban grasshopper, Bangkok.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Urban grasshopper, Bangkok.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Morning Coffee</title>
    <link href="https://elektrubadur.se/posts/morning-coffee/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/morning-coffee/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-03-19T00:00:00+01:00</published>
    <updated>2017-03-19T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Morning coffee at hotel ฟ้าใส, Buriram.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Morning coffee at hotel ฟ้าใส, Buriram.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Road Trip</title>
    <link href="https://elektrubadur.se/posts/road-trip/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/road-trip/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-03-18T00:00:00+01:00</published>
    <updated>2017-03-18T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Isan road trip.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Isan road trip.&lt;/p&gt;
&lt;figure&gt;
  
    &lt;img src="road-trip.jpeg" alt="Road Trip"&gt;
  
  
  &lt;figcaption&gt;Road Trip&lt;/figcaption&gt;
  
&lt;/figure&gt;

&lt;figure&gt;
  
    &lt;img src="road-trip-in-rain.jpeg" alt="Road Trip in Rain"&gt;
  
  
  &lt;figcaption&gt;Road Trip in Rain&lt;/figcaption&gt;
  
&lt;/figure&gt;</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Strawberries</title>
    <link href="https://elektrubadur.se/posts/strawberries/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/strawberries/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-02-13T00:00:00+01:00</published>
    <updated>2017-02-13T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Brought some strawberries home from Korea.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Brought some strawberries home from Korea.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Turtle</title>
    <link href="https://elektrubadur.se/posts/turtle/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/turtle/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-02-11T00:00:00+01:00</published>
    <updated>2017-02-11T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Turtle at Sealife aquarium, Busan.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Turtle at Sealife aquarium, Busan.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Cold Beach</title>
    <link href="https://elektrubadur.se/posts/cold-beach/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/cold-beach/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-02-10T00:00:00+01:00</published>
    <updated>2017-02-10T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Busan beach in winter.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Busan beach in winter.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Spillt Coffee</title>
    <link href="https://elektrubadur.se/posts/spillt-coffee/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/spillt-coffee/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2017-01-12T00:00:00+01:00</published>
    <updated>2017-01-12T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Spillt coffee on my desk.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Spillt coffee on my desk.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Street Map</title>
    <link href="https://elektrubadur.se/posts/street-map/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/street-map/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-12-19T00:00:00+01:00</published>
    <updated>2016-12-19T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;My neighbourhood has these maps drawn on pavements, walls, street
cabinets &amp;amp;c. I&amp;rsquo;m curious to know what they are for.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;My neighbourhood has these maps drawn on pavements, walls, street
cabinets &amp;amp;c. I&amp;rsquo;m curious to know what they are for.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Rubber Band Ball</title>
    <link href="https://elektrubadur.se/posts/rubber-band-ball/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/rubber-band-ball/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-10-27T00:00:00+02:00</published>
    <updated>2016-10-27T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Home made rubber band ball.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Home made rubber band ball.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Water Fight</title>
    <link href="https://elektrubadur.se/posts/water-fight/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/water-fight/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-08-18T15:00:00+02:00</published>
    <updated>2016-08-18T15:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Dogs playing in water.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Dogs playing in water.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Valley</title>
    <link href="https://elektrubadur.se/posts/valley/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/valley/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-08-18T12:00:00+02:00</published>
    <updated>2016-08-18T12:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;View of Ragunda valley.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;View of Ragunda valley.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Crows</title>
    <link href="https://elektrubadur.se/posts/crows/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/crows/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-07-31T15:00:00+05:30</published>
    <updated>2016-07-31T15:00:00+05:30</updated>
    <summary type="html">&lt;p&gt;Crows by Mumbai promenade.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Crows by Mumbai promenade.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Cows</title>
    <link href="https://elektrubadur.se/posts/cows/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/cows/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-07-31T12:00:00+05:30</published>
    <updated>2016-07-31T12:00:00+05:30</updated>
    <summary type="html">&lt;p&gt;Cows in Mumbai.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Cows in Mumbai.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Bridge at Night</title>
    <link href="https://elektrubadur.se/posts/bridge-at-night/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/bridge-at-night/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-07-11T00:00:00+02:00</published>
    <updated>2016-07-11T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Sydney Harbour Bridge at night.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Sydney Harbour Bridge at night.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Playground</title>
    <link href="https://elektrubadur.se/posts/playground/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/playground/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-07-03T12:00:00+05:30</published>
    <updated>2016-07-03T12:00:00+05:30</updated>
    <summary type="html">&lt;p&gt;Playground in Mumbai.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Playground in Mumbai.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Windy Beach</title>
    <link href="https://elektrubadur.se/posts/windy-beach/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/windy-beach/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-07-03T09:00:00+05:30</published>
    <updated>2016-07-03T09:00:00+05:30</updated>
    <summary type="html">&lt;p&gt;Bandra beach, Mumbai.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Bandra beach, Mumbai.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Football</title>
    <link href="https://elektrubadur.se/posts/football/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/football/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-06-22T00:00:00+02:00</published>
    <updated>2016-06-22T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Osotspa football club fans visiting Muangthong.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Osotspa football club fans visiting Muangthong.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Gecko</title>
    <link href="https://elektrubadur.se/posts/gecko/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/gecko/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-05-12T00:00:00+02:00</published>
    <updated>2016-05-12T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Gecko in paper envelope.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Gecko in paper envelope.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Swim</title>
    <link href="https://elektrubadur.se/posts/swim/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/swim/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-05-02T00:00:00+02:00</published>
    <updated>2016-05-02T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;With my parents on Koh Samet.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;With my parents on Koh Samet.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Greenery</title>
    <link href="https://elektrubadur.se/posts/greenery/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/greenery/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-04-03T00:00:00+02:00</published>
    <updated>2016-04-03T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;It is nice that my new flat has a bit of a view.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;It is nice that my new flat has a bit of a view.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Muay Thai Night</title>
    <link href="https://elektrubadur.se/posts/muay-thai-night/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/muay-thai-night/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-04-02T00:00:00+02:00</published>
    <updated>2016-04-02T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;A photo I took while waiting for someone at the National Stadium
station.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A photo I took while waiting for someone at the National Stadium
station.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Fire Extinguisher</title>
    <link href="https://elektrubadur.se/posts/fire-extinguisher/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/fire-extinguisher/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2016-01-29T00:00:00+01:00</published>
    <updated>2016-01-29T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Fire extinguisher on public van.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Fire extinguisher on public van.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Loi Krathong</title>
    <link href="https://elektrubadur.se/posts/loi-krathong/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/loi-krathong/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-11-26T00:00:00+01:00</published>
    <updated>2015-11-26T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Celebrating Loi Krathong.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Celebrating Loi Krathong.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Toast</title>
    <link href="https://elektrubadur.se/posts/toast/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/toast/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-11-08T00:00:00+01:00</published>
    <updated>2015-11-08T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Toast with coin for scale.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Toast with coin for scale.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Lake</title>
    <link href="https://elektrubadur.se/posts/lake/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/lake/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-10-11T00:00:00+02:00</published>
    <updated>2015-10-11T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;View from my parents&amp;rsquo; cottage.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;View from my parents&amp;rsquo; cottage.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Fogged up</title>
    <link href="https://elektrubadur.se/posts/fogged-up/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/fogged-up/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-10-05T00:00:00+02:00</published>
    <updated>2015-10-05T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Fogged up glasses.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Fogged up glasses.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">China</title>
    <link href="https://elektrubadur.se/posts/china/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/china/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-09-27T00:00:00+02:00</published>
    <updated>2015-09-27T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Collage of a trip to China.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Collage of a trip to China.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Peafowl</title>
    <link href="https://elektrubadur.se/posts/peafowl/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/peafowl/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-08-17T00:00:00+02:00</published>
    <updated>2015-08-17T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Peafowl on Koh Munnork.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Peafowl on Koh Munnork.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Grill</title>
    <link href="https://elektrubadur.se/posts/grill/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/grill/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-07-25T00:00:00+02:00</published>
    <updated>2015-07-25T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Grilling seafood.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Grilling seafood.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Seafood</title>
    <link href="https://elektrubadur.se/posts/seafood/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/seafood/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-06-30T00:00:00+02:00</published>
    <updated>2015-06-30T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Seafood, ready to be grilled.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Seafood, ready to be grilled.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Rain</title>
    <link href="https://elektrubadur.se/posts/rain/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/rain/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-06-16T00:00:00+02:00</published>
    <updated>2015-06-16T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;View from my office, with rain coming.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;View from my office, with rain coming.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Elephants</title>
    <link href="https://elektrubadur.se/posts/elephants/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/elephants/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-06-08T00:00:00+02:00</published>
    <updated>2015-06-08T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Painted elephants.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Painted elephants.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Dog on Back Seat</title>
    <link href="https://elektrubadur.se/posts/dog-on-back-seat/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/dog-on-back-seat/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-05-16T00:00:00+02:00</published>
    <updated>2015-05-16T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Dog riding on motorcycle back seat.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Dog riding on motorcycle back seat.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Singapore</title>
    <link href="https://elektrubadur.se/posts/singapore/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/singapore/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-04-05T00:00:00+02:00</published>
    <updated>2015-04-05T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Singapore skyline.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Singapore skyline.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Racks</title>
    <link href="https://elektrubadur.se/posts/racks/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/racks/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-04-04T00:00:00+02:00</published>
    <updated>2015-04-04T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Some server room.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Some server room.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Open Mall</title>
    <link href="https://elektrubadur.se/posts/open-mall/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/open-mall/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-29T00:00:00+01:00</published>
    <updated>2015-03-29T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Open-air mall in Bangkok.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Open-air mall in Bangkok.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Van</title>
    <link href="https://elektrubadur.se/posts/van/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/van/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-27T00:00:00+01:00</published>
    <updated>2015-03-27T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Inside of public van.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Inside of public van.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Sunbird</title>
    <link href="https://elektrubadur.se/posts/sunbird/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/sunbird/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-26T00:00:00+01:00</published>
    <updated>2015-03-26T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Olive-backed sunbird nesting on my balcony.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Olive-backed sunbird nesting on my balcony.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Soekarno–Hatta</title>
    <link href="https://elektrubadur.se/posts/soekarno-hatta/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/soekarno-hatta/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-12T00:00:00+01:00</published>
    <updated>2015-03-12T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Soekarno&amp;ndash;Hatta International Airport, Jakarta.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Soekarno&amp;ndash;Hatta International Airport, Jakarta.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Jakarta</title>
    <link href="https://elektrubadur.se/posts/jakarta/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/jakarta/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-09T00:00:00+01:00</published>
    <updated>2015-03-09T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Jakarta skyline.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Jakarta skyline.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Corridor</title>
    <link href="https://elektrubadur.se/posts/corridor/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/corridor/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-08T00:00:00+01:00</published>
    <updated>2015-03-08T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;A corridor somewhere.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A corridor somewhere.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Semla</title>
    <link href="https://elektrubadur.se/posts/semla/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/semla/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-03-01T00:00:00+01:00</published>
    <updated>2015-03-01T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Semla at Hotel Rembrandt, Bangkok.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Semla at Hotel Rembrandt, Bangkok.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Pole</title>
    <link href="https://elektrubadur.se/posts/pole/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/pole/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-02-22T00:00:00+01:00</published>
    <updated>2015-02-22T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Painted pole by beach on Koh Samet.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Painted pole by beach on Koh Samet.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Yard</title>
    <link href="https://elektrubadur.se/posts/yard/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/yard/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-02-21T00:00:00+01:00</published>
    <updated>2015-02-21T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Yard of resort, Koh Samet.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Yard of resort, Koh Samet.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Mall</title>
    <link href="https://elektrubadur.se/posts/mall/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/mall/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-02-14T00:00:00+01:00</published>
    <updated>2015-02-14T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Inside of a mall.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Inside of a mall.&lt;/p&gt;
&lt;figure&gt;
  
    &lt;img src="mall.jpeg" alt="Mall"&gt;
  
  
  &lt;figcaption&gt;Mall&lt;/figcaption&gt;
  
&lt;/figure&gt;

&lt;figure&gt;
  
    &lt;img src="another-mall.jpeg" alt="Another Mall"&gt;
  
  
  &lt;figcaption&gt;Another Mall&lt;/figcaption&gt;
  
&lt;/figure&gt;</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Coffee</title>
    <link href="https://elektrubadur.se/posts/coffee/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/coffee/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2015-01-04T00:00:00+01:00</published>
    <updated>2015-01-04T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Coffee in painted cup.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Coffee in painted cup.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">That Look</title>
    <link href="https://elektrubadur.se/posts/that-look/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/that-look/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2011-01-18T00:00:00+01:00</published>
    <updated>2011-01-18T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;This is an update on my ongoing project of close-up portraits made with my &lt;em&gt;ЛОМО Т-43 40 mm f/4&lt;/em&gt; lens, &lt;a href="/posts/agonizing/"&gt;mentioned here&lt;/a&gt;. I have a fair collection of portraits by now, I few of which are good enough to probably make the final series. This might be my favourite so far. Watch this space.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;This is an update on my ongoing project of close-up portraits made with my &lt;em&gt;ЛОМО Т-43 40 mm f/4&lt;/em&gt; lens, &lt;a href="/posts/agonizing/"&gt;mentioned here&lt;/a&gt;. I have a fair collection of portraits by now, I few of which are good enough to probably make the final series. This might be my favourite so far. Watch this space.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Family Portrait</title>
    <link href="https://elektrubadur.se/posts/family-portrait/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/family-portrait/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-12-06T00:00:00+01:00</published>
    <updated>2010-12-06T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;A family portrait I made for a couple of friends.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A family portrait I made for a couple of friends.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Attention</title>
    <link href="https://elektrubadur.se/posts/attention/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/attention/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-12-05T00:00:00+01:00</published>
    <updated>2010-12-05T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;I have been working a lot in black and white portraits lately. Here is a
vaguely Hitchcockian self-portrait from a couple of days ago.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I have been working a lot in black and white portraits lately. Here is a
vaguely Hitchcockian self-portrait from a couple of days ago.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Open</title>
    <link href="https://elektrubadur.se/posts/open/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/open/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-12-01T00:00:00+01:00</published>
    <updated>2010-12-01T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;A bit of honest street photography. I only had to wait a few minutes in
front of this somewhat busy scene before the right moment appeared.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A bit of honest street photography. I only had to wait a few minutes in
front of this somewhat busy scene before the right moment appeared.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Horse 52375</title>
    <link href="https://elektrubadur.se/posts/horse-52375/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/horse-52375/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-11-21T00:00:00+01:00</published>
    <updated>2010-11-21T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;Anonymous horse.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Anonymous horse.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Giant</title>
    <link href="https://elektrubadur.se/posts/giant/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/giant/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-11-11T00:00:00+01:00</published>
    <updated>2010-11-11T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;I photographed this river valley on my way home from Jämtland, a couple
of months ago.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I photographed this river valley on my way home from Jämtland, a couple
of months ago.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Agonizing</title>
    <link href="https://elektrubadur.se/posts/agonizing/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/agonizing/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-11-05T00:00:00+01:00</published>
    <updated>2010-11-05T00:00:00+01:00</updated>
    <summary type="html">&lt;p&gt;I just acquired a &lt;em&gt;ЛОМО Т-43 40 mm f/4&lt;/em&gt; lens. It&amp;rsquo;s a very nice glass
lens from the &lt;em&gt;Leningradskoe Optiko Mechanichesckoe Objedinenie&lt;/em&gt;. Sadly,
the farthest I can focus it on my SLR without colliding with the mirror
is a couple of decimeters, giving this field of view. This self-portrait
is the start of a project I plan to undertake with this very limited
setup. More on that later.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I just acquired a &lt;em&gt;ЛОМО Т-43 40 mm f/4&lt;/em&gt; lens. It&amp;rsquo;s a very nice glass
lens from the &lt;em&gt;Leningradskoe Optiko Mechanichesckoe Objedinenie&lt;/em&gt;. Sadly,
the farthest I can focus it on my SLR without colliding with the mirror
is a couple of decimeters, giving this field of view. This self-portrait
is the start of a project I plan to undertake with this very limited
setup. More on that later.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Duet</title>
    <link href="https://elektrubadur.se/posts/duet/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/duet/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-10-23T00:00:00+02:00</published>
    <updated>2010-10-23T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;A playful portrait of a friend meant for advertising her music business.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A playful portrait of a friend meant for advertising her music business.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Flautist Amputee</title>
    <link href="https://elektrubadur.se/posts/flautist-amputee/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/flautist-amputee/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-10-17T00:00:00+02:00</published>
    <updated>2010-10-17T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;A fountain sculpture in the Uppsala town garden.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A fountain sculpture in the Uppsala town garden.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Tied Together</title>
    <link href="https://elektrubadur.se/posts/tied-together/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/tied-together/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-10-10T00:00:00+02:00</published>
    <updated>2010-10-10T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;I went for a photographic dog walk with an acquaintance. Here posing on
a bicycle path on Uppsala&amp;rsquo;s east side.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I went for a photographic dog walk with an acquaintance. Here posing on
a bicycle path on Uppsala&amp;rsquo;s east side.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">An Education</title>
    <link href="https://elektrubadur.se/posts/an-education/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/an-education/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-17T00:00:00+02:00</published>
    <updated>2010-09-17T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Friend&amp;rsquo;s daughter reading an improving comic book.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Friend&amp;rsquo;s daughter reading an improving comic book.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Aerial</title>
    <link href="https://elektrubadur.se/posts/aerial/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/aerial/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-16T00:00:00+02:00</published>
    <updated>2010-09-16T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Jackdaws flocking at dusk.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Jackdaws flocking at dusk.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Rebecka, Rebecka, Rebecka</title>
    <link href="https://elektrubadur.se/posts/rebecka-rebecka-rebecka/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/rebecka-rebecka-rebecka/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-14T00:00:00+02:00</published>
    <updated>2010-09-14T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Another composite with a small acquaintance.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Another composite with a small acquaintance.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Receiving All Things She Never Departs from Her Own Nature</title>
    <link href="https://elektrubadur.se/posts/receiving-all-things-she-never-departs-from-her-own-nature/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/receiving-all-things-she-never-departs-from-her-own-nature/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-12T00:00:00+02:00</published>
    <updated>2010-09-12T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;A composite group portrait, made in the botanical garden of Uppsala.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A composite group portrait, made in the botanical garden of Uppsala.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Off-road</title>
    <link href="https://elektrubadur.se/posts/off-road/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/off-road/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-11T00:00:00+02:00</published>
    <updated>2010-09-11T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Me and a sporty French car on a field outside of Uppsala.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Me and a sporty French car on a field outside of Uppsala.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Lost and Found</title>
    <link href="https://elektrubadur.se/posts/lost-and-found/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/lost-and-found/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-07T00:00:00+02:00</published>
    <updated>2010-09-07T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;This is a line for hanging lost gloves and such in Uppsala&amp;rsquo;s English
garden. While I was taking the picture a lady took time out of her day
to stay and point out to me what an eyesore the arrangement is.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;This is a line for hanging lost gloves and such in Uppsala&amp;rsquo;s English
garden. While I was taking the picture a lady took time out of her day
to stay and point out to me what an eyesore the arrangement is.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">The Light of Learning</title>
    <link href="https://elektrubadur.se/posts/the-light-of-learning/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/the-light-of-learning/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-09-03T00:00:00+02:00</published>
    <updated>2010-09-03T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Portrait with Uppsala&amp;rsquo;s grand university library, taken with a
make-shift tilt-shift lens, made from a regular 50 mm lens and som
bicycle inner-tube.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Portrait with Uppsala&amp;rsquo;s grand university library, taken with a
make-shift tilt-shift lens, made from a regular 50 mm lens and som
bicycle inner-tube.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">White Water and Colourful Mist</title>
    <link href="https://elektrubadur.se/posts/white-water-and-colourful-mist/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/white-water-and-colourful-mist/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-30T00:00:00+02:00</published>
    <updated>2010-08-30T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Hällingsåfallet is a waterfall in northern Jämtland, falling into a
canyon, probably formed by the end of the last ice age.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Hällingsåfallet is a waterfall in northern Jämtland, falling into a
canyon, probably formed by the end of the last ice age.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Unknown Soldier</title>
    <link href="https://elektrubadur.se/posts/unknown-soldier/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/unknown-soldier/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-27T00:00:00+02:00</published>
    <updated>2010-08-27T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;By a lake in Jämtland, while waiting for a fish to bite. Made with two
stacked 50 mm lenses&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;By a lake in Jämtland, while waiting for a fish to bite. Made with two
stacked 50 mm lenses&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Small Country Church</title>
    <link href="https://elektrubadur.se/posts/small-country-church/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/small-country-church/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-25T00:00:00+02:00</published>
    <updated>2010-08-25T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;The 15th century church of Ragunda parish, Jämtland, through an aperture
in its bell tower.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;The 15th century church of Ragunda parish, Jämtland, through an aperture
in its bell tower.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Flowering Head</title>
    <link href="https://elektrubadur.se/posts/flowering-head/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/flowering-head/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-18T00:00:00+02:00</published>
    <updated>2010-08-18T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Man and flower in the Uppsala botanical garden.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Man and flower in the Uppsala botanical garden.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Flocking</title>
    <link href="https://elektrubadur.se/posts/flocking/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/flocking/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-11T00:00:00+02:00</published>
    <updated>2010-08-11T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;Jackdaws flocking over Uppsala.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Jackdaws flocking over Uppsala.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Harvest</title>
    <link href="https://elektrubadur.se/posts/harvest/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/harvest/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-07T00:00:00+02:00</published>
    <updated>2010-08-07T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;The bumblebees favour these blue flowers in Uppsala&amp;rsquo;s Botanical Garden.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;The bumblebees favour these blue flowers in Uppsala&amp;rsquo;s Botanical Garden.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Sales Pitch</title>
    <link href="https://elektrubadur.se/posts/sales-pitch/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/sales-pitch/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-04T00:00:00+02:00</published>
    <updated>2010-08-04T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;My friend Zrajm wants to sell you his
&lt;a href="https://klingonska.org/dict/"&gt;pocket dictionary of Klingon&lt;/a&gt;. Clearly a
must have for anyone with too much time on their hands.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;My friend Zrajm wants to sell you his
&lt;a href="https://klingonska.org/dict/"&gt;pocket dictionary of Klingon&lt;/a&gt;. Clearly a
must have for anyone with too much time on their hands.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Sheep 641</title>
    <link href="https://elektrubadur.se/posts/sheep-641/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/sheep-641/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-08-03T00:00:00+02:00</published>
    <updated>2010-08-03T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;I did this long hand held capture using the technique of zooming in
during the exposure.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I did this long hand held capture using the technique of zooming in
during the exposure.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">Arch</title>
    <link href="https://elektrubadur.se/posts/arch/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/arch/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-07-28T00:00:00+02:00</published>
    <updated>2010-07-28T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;I did this long hand held capture using the technique of zooming in
during the exposure.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I did this long hand held capture using the technique of zooming in
during the exposure.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
  <entry>
    <title type="html">In the Pink</title>
    <link href="https://elektrubadur.se/posts/in-the-pink/" rel="alternate" type="text/html"/>
    <id>https://elektrubadur.se/posts/in-the-pink/</id>
    <author>
      <name>Björn Lindström</name>
    </author>
    <published>2010-07-26T00:00:00+02:00</published>
    <updated>2010-07-26T00:00:00+02:00</updated>
    <summary type="html">&lt;p&gt;This was made looking for pink subjects for an assignment.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;This was made looking for pink subjects for an assignment.&lt;/p&gt;
</content>
    <category scheme="https://elektrubadur.se/categories" term="photos" label="Photos"/>
  </entry>
</feed>
