<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Schauderbasis</title>
    <link>https://schauderbasis.de/</link>
    <description>Recent content on Schauderbasis</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 02 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://schauderbasis.de/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Visualizing the tree of life</title>
      <link>https://schauderbasis.de/posts/visualizing_the_tree_of_life/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/visualizing_the_tree_of_life/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: I made a website about how different species are related: &lt;a href=&#34;https://taxonomy.schauderbasis.de&#34;&gt;taxonomy.schauderbasis.de&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wanted my children to understand how species are related to each other:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how jellyfish, dolphins and fish are not related at all, even when they all live in the ocean (&lt;a href=&#34;https://taxonomy.schauderbasis.de/?entities=Q215760+Q26864+Q2346039&#34;&gt;visualization&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;that chimpanzees and humans are related in the same way that tigers and lions are (&lt;a href=&#34;https://taxonomy.schauderbasis.de/?entities=Q15978631+Q4126704+Q19939+Q140&#34;&gt;visualization&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Words can only get you so far with complicated topics, so I looked into visualizations of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Tree_of_life_(biology)&#34;&gt;tree of life&lt;/a&gt;.
There are some awesome websites out there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.onezoom.org/&#34;&gt;https://www.onezoom.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://labs.minutelabs.io/Tree-of-Life-Explorer&#34;&gt;https://labs.minutelabs.io/Tree-of-Life-Explorer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.evogeneao.com/en/explore/tree-of-life-explorer&#34;&gt;https://www.evogeneao.com/en/explore/tree-of-life-explorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was interesting, but I had a hard time finding something that fit the questions my children have.
They want to know about specific animal, those that they see in zoological garden.&lt;/p&gt;
&lt;p&gt;What I needed was an interactive website that would show a tree of life for those species that I am interested in.
I couldn&amp;rsquo;t find one.
But I did find &lt;em&gt;Wikidata&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Wikidata is like Wikipedia, but as a database.
A graph database with a lot of very interesting design decisions.
And it does have tons of taxonomy data in it
(&lt;a href=&#34;https://en.wikipedia.org/wiki/Taxonomy&#34;&gt;Taxonomy&lt;/a&gt; is the science of categorizing things, &lt;a href=&#34;https://en.wikipedia.org/wiki/Taxonomy_(biology)&#34;&gt;organisms&lt;/a&gt; in this case).
Each &lt;a href=&#34;https://www.wikidata.org/wiki/Property:P31&#34;&gt;instance of&lt;/a&gt; &lt;a href=&#34;https://www.wikidata.org/wiki/Q16521&#34;&gt;taxon&lt;/a&gt; (think of a taxon as a species) has a &lt;a href=&#34;https://www.wikidata.org/wiki/Property:P171&#34;&gt;parent taxon&lt;/a&gt;.
And that one has a parent taxon of its own, and so forth&amp;hellip; until you arrive at &lt;a href=&#34;https://www.wikidata.org/wiki/Q2382443&#34;&gt;Biota&lt;/a&gt;, the root of the tree.&lt;/p&gt;
&lt;p&gt;All the tree data I wanted was right there, under a free license and &lt;a href=&#34;https://query.wikidata.org/&#34;&gt;available through an open api&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So I made the interactive visualisation myself.
You can find it at &lt;a href=&#34;https://taxonomy.schauderbasis.de&#34;&gt;taxonomy.schauderbasis.de&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;project-goals&#34;&gt;Project goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Allow users to explore the tree of life&lt;/li&gt;
&lt;li&gt;Make the website as accessible as possible (for children, not-technical people and people who don&amp;rsquo;t know a lot biology)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;project-strategy&#34;&gt;Project strategy&lt;/h2&gt;
&lt;p&gt;I went for an agile approach (because that is the only way I know how to write software):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deploy early and continuously&lt;/li&gt;
&lt;li&gt;small, incremental improvements&lt;/li&gt;
&lt;li&gt;use feedback from users to decide what to work on next&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, I am doing this in my spare free time, so I need to choose carefully what I work on. Sooo&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if it is not fun anymore I will stop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point I am pretty done with the project.
I can&amp;rsquo;t think of anything I would like to add or remove.
But when inspiration strikes I will be happy to come back to work on this.&lt;/p&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;p&gt;I used the most basic setup possible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;after a short prototype in python I decided that a website would have the lowest entry barrier&lt;/li&gt;
&lt;li&gt;a static website with no dedicated backend&lt;/li&gt;
&lt;li&gt;wrote all the javascript, html and css by hand without a build system&lt;/li&gt;
&lt;li&gt;all the data is queried directly from the Wikidata api&lt;/li&gt;
&lt;li&gt;as few dependencies as possible:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://axios-http.com&#34;&gt;axios&lt;/a&gt;: for doing http requests to the Wikidata api&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://js.cytoscape.org/&#34;&gt;cytoscape.js&lt;/a&gt;: for visualizing the graph&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/chuckzel/cytoscape-tidytree&#34;&gt;cytoscape-tidytree&lt;/a&gt;: for a nice, planar layout without crossings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;vendored all (3) of the dependencies so I don&amp;rsquo;t have to deal with the npm&lt;/li&gt;
&lt;li&gt;functional programming with the courage to choose simplicity over dogma&lt;/li&gt;
&lt;li&gt;no tracking of users, no ads, nothing I wouldn&amp;rsquo;t like in a website&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course I only used free software and the project itself is also under a free license (&lt;a href=&#34;https://gitlab.com/Kaligule/taxonomy_explorer/-/blob/main/LICENSE&#34;&gt;GPL3&lt;/a&gt;).
I also made sure to track all the sources and licenses
of &lt;a href=&#34;https://gitlab.com/Kaligule/taxonomy_explorer/-/blob/main/vendor/LICENSES&#34;&gt;dependencies&lt;/a&gt;
and &lt;a href=&#34;https://gitlab.com/Kaligule/taxonomy_explorer/-/blob/main/static/sources.md?ref_type=heads&#34;&gt;assets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;files.png&#34; alt=&#34;gitlab view of the project&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;design-decisions&#34;&gt;Design decisions&lt;/h2&gt;
&lt;p&gt;I made a few design decisions that I am pretty proud of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;query parameters:&lt;/strong&gt;
I save the state of the tree in the query parameters.
This allows to revisit or share your tree without a backend saving a single bit about you.
Just copy the url and send it to a friend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;emojy button:&lt;/strong&gt;
For users that don&amp;rsquo;t want to type I have a button with an unicode character that represents a lifeform (like 🐅.,🍒 or 🐟).
When you click on it the name of the life form is fake-typed into the search bar and the life form is inserted into the tree.
You can click it multiple times to quickly insert a few species.
This is great for discovering what the site does.
It is also great for testing.&lt;/p&gt;
&lt;p&gt;Also it turns out that those species that have an emoji associated with them are &lt;em&gt;interesting&lt;/em&gt;.
There is no emoji for
&lt;a href=&#34;https://www.wikidata.org/wiki/Q37868&#34;&gt;algae&lt;/a&gt;,
&lt;a href=&#34;https://www.wikidata.org/wiki/Q127470&#34;&gt;sea cucumbers&lt;/a&gt;,
or &lt;a href=&#34;https://www.wikidata.org/wiki/Q127470&#34;&gt;plankton&lt;/a&gt;.
But there &lt;em&gt;are&lt;/em&gt; emojis for most big mammals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;translations:&lt;/strong&gt;
I query the names of the nodes in all supported languages and keep them in memory.
So when you change the language all existing nodes change their language as well.
I earned multipe approving &amp;ldquo;Ohhh&amp;hellip;&amp;rdquo; sounds when users discovered this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;emoji_button.png&#34; alt=&#34;A button with a lion emoji on it&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;accessibility&#34;&gt;Accessibility&lt;/h2&gt;
&lt;p&gt;I tried hard to make everything as accessible as possible.
This was hard because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is basically a website that shows the image of a tree - if you can&amp;rsquo;t see that image then there is not much I can give you.&lt;/li&gt;
&lt;li&gt;cytoscape.js does use a canvas to show the tree, not some fancy svg graphics that a screen reader could maybe work with.&lt;/li&gt;
&lt;li&gt;I am doing this without feedback from people that really need those accessibility features.
If you are such a person I would love to hear your feedback and suggestions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;graph-visualization-libraries&#34;&gt;Graph visualization libraries&lt;/h2&gt;
&lt;p&gt;There are not as many graph-visulisation libraries as I had expected.
And those I found are not as great for the visualizing trees as I wanted.&lt;/p&gt;
&lt;p&gt;In an earlier version I used &lt;a href=&#34;https://visjs.github.io/vis-network/docs/network/&#34;&gt;vis-network&lt;/a&gt; as a visalization library.
It has many excelent &lt;a href=&#34;https://visjs.github.io/vis-network/examples/&#34;&gt;examples&lt;/a&gt; and I liked how the tree was curvy and organic.
I wasn&amp;rsquo;t able to make it planar, though.
All the branches overlapped all the time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;curvy_tree.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;wikidata&#34;&gt;Wikidata&lt;/h2&gt;
&lt;p&gt;This project is definitely a love-letter to Wikidata.
I didn&amp;rsquo;t know it before and now I am obsessed with it.
What a great resource.&lt;/p&gt;
&lt;p&gt;Mastering the &lt;a href=&#34;https://en.wikipedia.org/wiki/SPARQL&#34;&gt;SPARQL query language&lt;/a&gt; was very hard though.
You to know a lot about the graph and the data it encodes.
Also, I find it impossible to predict which queries will be fast and which ones will never terminate.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;query.png&#34; alt=&#34;Querying wikidata for lifeforms with an associated emoji&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;taxonomy&#34;&gt;Taxonomy&lt;/h2&gt;
&lt;p&gt;It turs out that the world of taxonomy is not as clear as I had expected.
The tree of life is well defined in it&amp;rsquo;s basic form, but there are all sorts of open questions to consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sometimes it is not clear what the parent taxon of a taxon is (there are different opinions and Wikidata contains them all).&lt;/li&gt;
&lt;li&gt;Should viruses be included (Wikidata includes them even when they are not really alive)?&lt;/li&gt;
&lt;li&gt;And of course biology is always more complicated then you would expect it to be.
The tree of life is a model and the more you go into the details the more you see where the model doesn&amp;rsquo;t fit reality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem about uncertainty was one I could solve algorithmically.
I decided to remove all the connections that acted as shortcuts.
When there are two branches that could reach a taxon (one with many intermediate nodes and one with few) then I would always choose the one with more nodes, deleting the one with few nodes.
(The rationale here is that I wanted all the intermediate nodes but not all the complicated connections.)
This made the trees a lot cleaner. A LOT!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;trimmed_tree.png&#34; alt=&#34;Two trees with the same animals 3. The tree on the left has all the datapoints in it and looks like a swirly mess. The right tree is trimmed, it looks clean and straight&#34;&gt;&lt;/p&gt;
&lt;p&gt;Only a few cases remained where this algorithm couldn&amp;rsquo;t decide what to trim.
Thats ok, though.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;untrimmable.png&#34; alt=&#34;The ancestry of the influenca A virus is not a straight line - it splits and remerges&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;results&#34;&gt;Results&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;my children do understand how different species are related and talk about it themselves.&lt;/li&gt;
&lt;li&gt;I learned a lot about a lot of things:
&lt;ul&gt;
&lt;li&gt;javascript&lt;/li&gt;
&lt;li&gt;accessibility&lt;/li&gt;
&lt;li&gt;graph libraries&lt;/li&gt;
&lt;li&gt;graph databases&lt;/li&gt;
&lt;li&gt;SPARQL (Wikidatas query language)&lt;/li&gt;
&lt;li&gt;taxonomy in general&lt;/li&gt;
&lt;li&gt;some species especially&lt;/li&gt;
&lt;li&gt;responsiveness of websites&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I showed the website to a lot of people and got a lot of great feedback.
Most interesting was that every single person found their own species that they wanted to explore.
Some went all in on fruit, some into big cats, trees, monkeys, insects&amp;hellip;
And every single time it was interesting.&lt;/li&gt;
&lt;li&gt;I tried hard to be a good web-citizen:
&lt;ul&gt;
&lt;li&gt;make the website as accessible as I could&lt;/li&gt;
&lt;li&gt;make the website responsive&lt;/li&gt;
&lt;li&gt;don&amp;rsquo;t track your users&lt;/li&gt;
&lt;li&gt;treat the Wikidata backend well
All of this was a lot of work.
I am glad I did it, though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This is the second &amp;ldquo;big&amp;rdquo; vanilla-javascript project and I think I got to a point where I should consider a framework next time.
I am torn on this one though, because I don&amp;rsquo;t want to dive deep into the ever mutating world of frontend frameworks.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Geometrie im Sand</title>
      <link>https://schauderbasis.de/posts/geometrie_im_sand/</link>
      <pubDate>Thu, 28 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/geometrie_im_sand/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://de.wikipedia.org/wiki/Archimedes&#34;&gt;Archimedes&lt;/a&gt; soll ja seine geometrischen Beweise in den Sand gemalt haben.
Ich habe das heute mal probiert und versucht, den Satz vom &lt;a href=&#34;https://de.wikipedia.org/wiki/Fasskreisbogen&#34;&gt;Fasskreisbogen&lt;/a&gt; zu beweisen.&lt;/p&gt;
&lt;p&gt;Nur mit Sand war es nicht zu schaffen, es wird zu schnell ein großes Durcheinander.
Einzelene Punkte sind dann nicht mehr gut unterscheidbar.
Aber mit Steinen an den wichtigen Punkten ging es ganz ok.
Als ich den Kindern mehr dazu erklären wollte hat es sich gelohnt, die Linien mit Steinen und Stöcken auszulegen.&lt;/p&gt;
&lt;p&gt;Ich denke das ist allgemein richtig:
Um Ideen gut zu kommunizieren müssen die Diagramme so einfach wie möglich zu lesen sein. Wenn das Medium (Linien im Sand) nicht mehr passt, dann ist das ein großes Problem und es lohnt sich, etwas Besseres (Stöcke) zu suchen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;mittelsenkrechte.jpg&#34; alt=&#34;Zwei Punkte mit sich schneidenden Kreisen drum herum, durch die Schnittpunkte führt die Mittelsenkrechte. Die Kreise und Mittelpunkte sind mit Steinen ausgelegt, die Gerade mit Stöcken&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Git Zeitstempel zensieren</title>
      <link>https://schauderbasis.de/posts/git_zeitstempel_zensieren/</link>
      <pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/git_zeitstempel_zensieren/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Git Repositories enthalten jede Menge Informationen.
Nicht nur über den Code, auch meta-informationen wie die Namen und Emailaddressen der Comitter.
Solche Daten können durchaus sensibel sein - sie legen zum Beispiel offen&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;hellip; wann jemand Zeit zum Programmieren hat.&lt;/li&gt;
&lt;li&gt;&amp;hellip; in welcher Zeitzohne jemand  sich befindet/befand (anhand der Zeitoffsets).&lt;/li&gt;
&lt;li&gt;&amp;hellip; wann jemand im Urlaub war (wenn er in keinem seiner Arbeitsrepos gearbeitet hat, nur in privaten)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich habe sogar mal einen Talk darüber gehalten, wie man solche Daten aus Repos ausgraben kann: &lt;a href=&#34;https://talks.schauderbasis.de/&#34;&gt;Git archeology&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Die meisten meiner Git Repos sind öffentlich und das ist auch in Ordnung.
Aber in letzter Zeit sind mir diese Daten mehr ins bewusstsein geglangt.&lt;/p&gt;
&lt;p&gt;Für neue Repos zensiere ich deshalb ganz gerne zumindest die Commit-Uhrzeiten, bevor ich sie veröffentliche.
Ich schreibe dafür einfach die Git-Vergangenheit neu und setze alle Uhrzeiten auf eine Konstante.&lt;/p&gt;
&lt;p&gt;Das geht ganz einfach mit dem Program &lt;a href=&#34;https://github.com/newren/git-filter-repo&#34;&gt;git filter-repo&lt;/a&gt; und diesem Skript, das ich im git repo ausführe.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git filter-repo --commit-callback &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;import datetime
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# Decode the author and committer dates from bytes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;original_author_date_str = commit.author_date.decode(&amp;#34;utf-8&amp;#34;).split(&amp;#34; &amp;#34;)[0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;original_committer_date_str = commit.committer_date.decode(&amp;#34;utf-8&amp;#34;).split(&amp;#34; &amp;#34;)[0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# Convert to integer timestamps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;original_author_timestamp = int(original_author_date_str)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;original_committer_timestamp = int(original_committer_date_str)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# Get the original author and committer dates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;original_author_date = datetime.datetime.fromtimestamp(original_author_timestamp)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;original_committer_date = datetime.datetime.fromtimestamp(original_committer_timestamp)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# Set the new time to 00:00:01
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;new_time_author = original_author_date.replace(hour=0, minute=0, second=1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;new_time_committer = original_committer_date.replace(hour=0, minute=0, second=1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# Update the author and committer dates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;commit.author_date = f&amp;#34;{int(new_time_author.timestamp())} +0200&amp;#34;.encode(&amp;#34;utf-8&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;commit.committer_date = f&amp;#34;{int(new_time_committer.timestamp())} +0200&amp;#34;.encode(&amp;#34;utf-8&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wie immer gilt natürlich:
Wer so ein Skript auf seinem Repo ausführt, ohne ein Backup zu haben ist selbst schuld.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>In einem Haus schellt das Telefon</title>
      <link>https://schauderbasis.de/posts/in_einem_haus_schellt_das_telefon/</link>
      <pubDate>Sat, 19 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/in_einem_haus_schellt_das_telefon/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Als ich ein Kind war hat meine Mutter mich dafür bezahlt, Gedichte auswendig zu lernen.
Für meine Geschwister galt natürlich das gleiche Angebot.
Sie wollte, das wir Gedichte kannten und das war ihr Weg, uns zu motivieren.
Ich glaube es hat ganz gut geklappt, ich konnte einige Gedichte:
&lt;a href=&#34;https://www.projekt-gutenberg.org/antholog/schulged/chap156.html&#34;&gt;Das Huhn und der Karpfen&lt;/a&gt;
zum Beispiel, oder den
&lt;a href=&#34;https://www.projekt-gutenberg.org/fontane/gedichte/chap013.html&#34;&gt;Herr von Ribbeck auf Ribbeck im Havelland&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wir hatten nahezu freie Gedichtwahl, aber Liedtexte galten nicht, glaube ich.
(Das wäre zu einfach gewesen und hätte uns nicht zum lesen motiviert.)
Es gab ein Gedichtbuch aus dem alle Gedichte erlaubt waren.
Wir hätten aber auch andere vorschlagen können.
Der Wert eines Gedichtes maß sich an seiner Länge.
Pro Strophe gab es, glaube ich, 1 DM.&lt;/p&gt;
&lt;p&gt;Alles in allem finde ich das System gut und kann mir vorstellen, es auch bei meinen Kindern anzuwenden.&lt;/p&gt;
&lt;h2 id=&#34;ein-schlupfloch-im-regelwerk&#34;&gt;Ein Schlupfloch im Regelwerk&lt;/h2&gt;
&lt;p&gt;Natürlich versuchte ich einige Male, möglichst günstige Gedichte zu finden.
Also blätterte ich in besagtem Buch und fand eines, das lächerlich kurz war:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In einem Haus schellt das Telefon.&lt;br&gt;
Dann totenstille.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So ein Quatsch, das ist doch kein Gedicht!
Es reimt sich nicht und da passiert auch nichts.
Und es ist so kurz, das man es nicht lernen muss, man braucht es sich nur zu merken.&lt;/p&gt;
&lt;p&gt;Mit dem Stolz eines Anwalts, der eine Gesetzeslücke gefunden hat, präsentierte ich meiner Mutter meinen Fund.
Ich sagte das ganze Gedicht fehlerfrei und auswendig auf, verwies sie auf das Buch und verlangte 1 Mark, weil das Gedicht ja schließlich eine Strophe lang sei.
Meine Mutter hob die Augenbrauen, protestierte ein wenig und einigte sich mit mir auf 50 Pfennig.
In meinem Kopf ist das noch heute als Sieg verbucht.&lt;/p&gt;
&lt;p&gt;Es war aber auch klar, dass ich mit so etwas nicht noch einmal durchkommen würde -
sonst wäre ich wahrscheinlich tief in die Welt der Schüttelreime und Haikus eingetaucht.&lt;/p&gt;
&lt;p&gt;In den nächsten Jahren vergaß ich die Geschichte und die meisten der Gedichte.
Nur das Gedicht vom Haus vergaß ich nicht.
Wie auch, es war so kurz und simpel und war für mich mit einem Erfolgserlebnis verknüpft.&lt;/p&gt;
&lt;h2 id=&#34;merkwürdig&#34;&gt;Merkwürdig&lt;/h2&gt;
&lt;p&gt;Wenn ich heute an die Geschichte denke, frage ich mich warum ich das Gedicht nie näher mit jemandem besprochen habe.
Es war ein merkwürdiger Ausreißer in einem Buch voller &lt;em&gt;schöner und normaler&lt;/em&gt; Gedichte und ich verstand nicht wovon es handelt.
Jemand geht nicht ans Telefon, na und?
Passiert doch dauernd.&lt;/p&gt;
&lt;p&gt;Heute sehe ich das Gedicht mit anderen Augen - es gruselt mich fast, wenn ich daran denke.
Meine Gedanken gehen so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sind die Bewohner des Hauses einfach gerade nicht da?
Nein, denn &lt;em&gt;totenstille&lt;/em&gt; verweißt auf etwas Unheilvolles.
Sonst hieße es ja wohl &amp;ldquo;In einem Haus schellt das Telefon und keiner geht ran.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Ist das Haus verlassen oder die Bewohner längst tot?
Nein, sonst würde das Telefon ja nicht klingeln.
Es gibt wohl jemanden, der erwartet das da jemand rangehen könnte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Was ist also passiert?
Ich kann mir heute 3 Szenarien vorstellen, eine tragische, eine einsame und eine schaurige.&lt;/p&gt;
&lt;h3 id=&#34;tragisch&#34;&gt;tragisch&lt;/h3&gt;
&lt;p&gt;Jemand hat in dem Haus gelebt und ist kürzlich verstorben.
Ein Freund weiß noch nichts davon und ruft an.
Weil niemand rangeht wird er es vielleicht nochmal versuchen.
Erst später wird er herausfinden, das es für ein Gespräch für immer zu spät ist.&lt;/p&gt;
&lt;h3 id=&#34;einsam&#34;&gt;einsam&lt;/h3&gt;
&lt;p&gt;Das Haus ist kein Haus, es ist der Kopf einer Person mit Demenz.
Das Klingeln ist ein aufleuchtender Gedanke oder eine Erinnerung,
eine mögliche Verbindung an die echte Welt da draußen.
Aber es geht vorbei, und es wird wieder dunkel und still in dem Kopf.&lt;/p&gt;
&lt;h3 id=&#34;schaurig&#34;&gt;schaurig&lt;/h3&gt;
&lt;p&gt;In dem Haus lebt eine alte Person.
Sie ist gestürzt und kann nicht mehr selbstständig aufstehen.
Nun liegt sie da und braucht Hilfe.
(Das ist leider kein ungewöhnliches Szenario)&lt;/p&gt;
&lt;p&gt;Das Telefon klingelt!
Die Chance, Hilfe zu holen.
Die Person streckt die Hand zum Hörer.
Aber es ist zu weit weg oder zu hoch, um es zu erreichen.
Das Telefon verstummt.
Kraftlos sinkt die Hand.
Es kommt keine Hilfe.
Totenstille.&lt;/p&gt;
&lt;h2 id=&#34;ein-zweiter-blick&#34;&gt;Ein zweiter Blick&lt;/h2&gt;
&lt;p&gt;Das Gedicht erinnert mich heute an die &lt;a href=&#34;https://de.wikipedia.org/wiki/Bierdeckelgeschichte&#34;&gt;Tiny Tales von Florian Meimberg&lt;/a&gt;, nur etwas subtiler.&lt;/p&gt;
&lt;p&gt;Ich würde das Gedicht gerne noch einmal lesen.
Aber ich kann es im Internet nicht finden.
Leider weiß ich auch nicht mehr, welches Gedichtbuch wir damals verwendet haben.
Den Text oben habe ich es aus dem Gedächtnis aufgeschrieben (waren die 50 Pfennig nicht gut angelegt?),
aber es mag sein, dass ich ihn nicht genau richtig hinbekommen habe.
&amp;ldquo;schellt&amp;rdquo; das Telefon oder &amp;ldquo;klingt&amp;rdquo; oder &amp;ldquo;klingelt&amp;rdquo; es?
Ich wüsste auch gerne, wer es geschrieben hat und ob es mehr Informationen dazu gibt.&lt;/p&gt;
&lt;p&gt;Bis ich das rausgefunden habe kann es noch etwas dauern.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Die vielen Worte um Kubernetes</title>
      <link>https://schauderbasis.de/posts/die_vielen_worte_um_kubernetes/</link>
      <pubDate>Mon, 23 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/die_vielen_worte_um_kubernetes/</guid>
      <description>&lt;p&gt;Komplexe Themen lerne ich meistens erstmal nur so weit, wie es nötig ist.
Nur so viel es braucht, um das Problem zu lösen.
Das reicht meistens, ich muss ja auch verantwortungsvoll mit meiner Zeit umgehen.
Mit Teilwissen kann man lange Zeit sehr weit kommen.&lt;/p&gt;
&lt;p&gt;Irgendwann später, oft nach Wochen/Monaten/Jahren spüre ich dann:
Jetzt bin ich so weit, jetzt will ich das richtig verstehen.
Dann grabe ich mich rein, lese das Fachbuch, wühle mich durch die Dokumentation, aboniere die Blogs der Experten&amp;hellip;
Bis es sich richtig anfühlt.&lt;/p&gt;
&lt;p&gt;Neulich hatte ich diesen Moment mit Kubernetes.
Ich hatte ein solides Wissen über Docker.
Aber bei Kubernetes ist alles super kopliziert.
Selbst wenn man viel darüber weiß, heißt das nicht das man auch viel kapiert.
Immerhin konnte ich damit arbeiten.
Aber nun wollte ich das endlich richtig verstehen.&lt;/p&gt;
&lt;p&gt;Eines der großen Einstiegsprobleme sind die vielen Fachbegriffe.
Ich habe also angefangen, alle Fachbegriffe, über die ich gestolpert bin aufzuschreiben.
In den Definitionen kommen dann neue Fachbegriffe vor, die kommen auch auf die Liste.
Und wenn ich die Beziehung zwischen 2 Begriffen verstehe, dann bekommen sie einen beschrifteten Pfeil.
So entsteht eine Mindmap.&lt;/p&gt;
&lt;h2 id=&#34;mindmap-software&#34;&gt;Mindmap Software&lt;/h2&gt;
&lt;p&gt;Ich habe auf Papier angefangen, bin aber recht schnell auf den Rechner umgestiegen.
Für Mindmaps gibt es verschiedene tolle Programme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.freeplane.org&#34;&gt;Freeplane&lt;/a&gt; (Fork von Freemind, GUI-Program, &lt;a href=&#34;https://github.com/freeplane/freeplane&#34;&gt;Java&lt;/a&gt;, &lt;a href=&#34;https://github.com/freeplane/freeplane/blob/1.12.x/license.txt&#34;&gt;GPLv2&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://graphviz.org&#34;&gt;graphviz&lt;/a&gt; (dot, Diagram als Code, sehr generisch im Einsatzzweck, &lt;a href=&#34;https://gitlab.com/graphviz/graphviz&#34;&gt;C&lt;/a&gt;, &lt;a href=&#34;https://graphviz.org/license/&#34;&gt;Common Public License&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mermaid.js.org/&#34;&gt;mermaid.js&lt;/a&gt; (Diagram als Code, für Diagramme in Dokumentation, &lt;a href=&#34;https://github.com/mermaid-js/mermaid&#34;&gt;Javascript&lt;/a&gt;, &lt;a href=&#34;https://github.com/mermaid-js/mermaid/blob/develop/LICENSE&#34;&gt;MIT-Lizenz&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://d2lang.com/&#34;&gt;d2&lt;/a&gt; (Diagram as Code, für Entwicker, &lt;a href=&#34;https://github.com/terrastruct/d2/blob/master/LICENSE.txt&#34;&gt;MPL2 Lizenz&lt;/a&gt;, &lt;a href=&#34;https://github.com/terrastruct/d2&#34;&gt;JS+Go&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;D2 will ich in Zukunft öfter benutzen.
Es ist relativ neu - aber man merkt, dass es nicht nur Software ist, sondern ein echtes Softwareprojekt.
Es gibt Projektziele und Dokumentation, die Syntax ist konsistent und das Programm ist komfortabel zu benutzen.
Und man spürt, das d2 die besten Ideen von meermaid.js und graphviz kombinieren möchte.&lt;/p&gt;
&lt;p&gt;Besonders praktisch war für mich, dass man jedem Knoten einen tooltip und einen Link hinterlegen kann.
Den Tooltip habe ich für eine kurze Definition für den jeweiligen Begriff verwendet.
Und wenn man auf den Begriff klickt wird man zur jeweiligen Seite in der Dokumentation geleitet.&lt;/p&gt;
&lt;p&gt;Für mein Lernprojekt war d2 jedenfalls eine gute Wahl.&lt;/p&gt;
&lt;h2 id=&#34;man-muss-ja-nicht-alles-fertig-machen&#34;&gt;Man muss ja nicht alles fertig machen&lt;/h2&gt;
&lt;p&gt;Die Mindmap ist natürlich nicht fertig geworden.
Ich wollte ja auch keine Dokumente erstellen, sondern Begriffe und ihre Beziehungen erforschen.
Das ist auch gelungen, ich verstehe jetzt viel besser, was all die Teile von Kubernetes tun.&lt;/p&gt;
&lt;p&gt;Den Aufwand, das Diagram zu vervollständigen und auf Korrektheit zu prüfen, eine Legende zu erstellen und alles in Dokumentation einzubetten, diesen Aufwand spare ich mir jetzt.
Auch das gehört dazu, verantwortungsvoll mit Zeit umzugehen.
Das Work-Not-In-Progress-Anymore Diagram ist &lt;a href=&#34;kubernetes.svg&#34;&gt;hier&lt;/a&gt;, der d2-code &lt;a href=&#34;kubernetes.d2&#34;&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;kubernetes.svg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Im Rest dieses Posts schreibe ich über ein paar Erkenntnisse, die ich im Erstellungsprozess hatte.&lt;/p&gt;
&lt;h3 id=&#34;mehr-worte-als-erwartet&#34;&gt;Mehr Worte als erwartet&lt;/h3&gt;
&lt;p&gt;Um Docker zu verstehen braucht man nur ein paar Worte:
Dockerfile, Image, Registry und Container.
Wenn man in die Details gehen will kommen vielleicht nochmal 5-10 dazu.&lt;/p&gt;
&lt;p&gt;Aber bei Kubernetes hat man ruckzuck mit 30 Fachbegriffen zu kämpfen.
Das macht den Einstieg natürlich schwerer.&lt;/p&gt;
&lt;p&gt;Ich bin nicht sicher, woran das liegt.
Ist Kubernetes als Konzept so viel komplexer?
Habe ich vielleicht das System nicht ordentlich abgegrenzt und lerne hier mehrere Systeme gleichzeitig?
Aber wenn ja, was sollte ich herausnehmen?
Die Control Plane vielleicht, aber die Dokumentation ist voll mit Beschreibungen davon, was die Controller tun.&lt;/p&gt;
&lt;p&gt;Ich sehe keinen Weg, hier erstmal nur einen kleinen Teil zu lernen.&lt;/p&gt;
&lt;p&gt;Diese Überlegung hat natürlich die Annahme zur Grundlage, dass die Anzahl der Fachbegriffe eines Systems ein gutes Maß für seine Komplexität ist.&lt;/p&gt;
&lt;h3 id=&#34;unterschiede-herausarbeiten&#34;&gt;Unterschiede herausarbeiten&lt;/h3&gt;
&lt;p&gt;Die Begriffe &amp;ldquo;(Helm) Chart&amp;rdquo;, &amp;ldquo;Manifest&amp;rdquo; und &amp;ldquo;Spec&amp;rdquo; beschreiben &lt;em&gt;fast&lt;/em&gt; das gleiche, aber nicht ganz.
Leider habe ich keine einzige Website oder Dokumentationsabschnitt gefunden, die Gemeinsamkeiten und Unterschiede herausarbeitet.
Stat dessen muss man ersteinmal merken, das es hier Verwechslungsgefahr gibt und dann die Definitionen vergleichen (und dann die KI fragen, ob man das richtig verstanden hat)..&lt;/p&gt;
&lt;p&gt;Das ist schade, eine solche Erklärung hätte mir viel Verwirrung erspart.&lt;/p&gt;
&lt;h3 id=&#34;weil-dein-englisch-zu-schlecht-ist&#34;&gt;Weil dein Englisch zu schlecht ist&lt;/h3&gt;
&lt;p&gt;Ich kann gut Englisch - ich konsumieren Bücher, Filme, Podcasts, Hörbücher auf englisch, schreibe viele Texte und alle Programme auf englisch, ich kann Konversationen führen habe auch mit den meisten Dialekten kein Problem.
Trotzdem bin ich kein Native Speaker.
Sonst hätte ich wahrscheinlich weniger Schwierigkeiten mit Begriffen wie &amp;ldquo;Pod&amp;rdquo; oder &amp;ldquo;Ingress&amp;rdquo; gehabt.&lt;/p&gt;
&lt;p&gt;Ein &lt;em&gt;Pod&lt;/em&gt; ist eine Menge von Containern, die eng verknüpft sind uns sich Resourcen teilen.
Ich kannte das Wort nicht und habe diese Bedeutung &amp;ldquo;auswendig gelernt&amp;rdquo;.
Erst jetzt verstehe ich, warum man das so nennt:
&amp;ldquo;Pod of Peas&amp;rdquo; bedeutet übersetzt &amp;ldquo;Erpsenschote&amp;rdquo;.
Eine total gute Metapher, einfach zu merken.
Außer man kennt die Vokabel nicht.
So weit reicht mein Wortschatz nun auch wieder nicht.&lt;/p&gt;
&lt;p&gt;Bei Ingress (&lt;a href=&#34;https://www.linguee.de/englisch-deutsch/uebersetzung/ingress.html&#34;&gt;übersetzt Zugang&lt;/a&gt;) ging es mir genauso.
Inzwischen soll man wohl in Kubernetes lieber Gateways benutzen, das hätte ich sofort übersetzten können.&lt;/p&gt;
&lt;p&gt;Ich weiß nicht, ob es da jetzt eine gute Lektion drauß zu lernen gibt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pod_of_peas.jpg&#34; alt=&#34;Eine Erpsenschote&#34;&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
</description>
    </item>
    
    <item>
      <title>Möwenweg reimt sich auf Bullerbü</title>
      <link>https://schauderbasis.de/posts/moewenweg_reimt_sich_auf_bullerbue/</link>
      <pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/moewenweg_reimt_sich_auf_bullerbue/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;eine-modernere-kinderbuchreihe&#34;&gt;Eine modernere Kinderbuchreihe&lt;/h2&gt;
&lt;p&gt;Die Bullerbü Bücher (von Astrid Lindgren) &lt;a href=&#34;https://schauderbasis.de/posts/bullerbue_ist_ein_tolles_erstes_buch&#34;&gt;sind toll&lt;/a&gt;.
Aber man vergisst keine Seite lang, dass es in der Vergangenheit spielt.
Eine modernere Version ist die Reihe &amp;ldquo;Wir Kinder aus den Möwenweg&amp;rdquo; (von Kirsten Boie).&lt;/p&gt;
&lt;p&gt;Beide Buchreihen fühlen sich sehr ähnlich an:
Realistische Alltagsabenteuer einer Gruppen von Nachbarskindern, erzählt von einem 8/9 Jährigen Mädchen.
In beiden Erzählungen passieren deshalb ähnliche Dinge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Jungs und Mädchen spielen meistens gemeinsam, ärgern sich aber auch oft gegenseitig und legen sich gegenseitig rein.&lt;/li&gt;
&lt;li&gt;Die Kinder fahren Schlitten/Schlittschuh, pflücken Erdbeeren&lt;/li&gt;
&lt;li&gt;Sie arrangieren sich mit dem jüngsten Kind, lassen es manchmal mitspielen und manchmal nicht.&lt;/li&gt;
&lt;li&gt;Die Erzählerin erlebt Geburtstag, Ostern, Weihnachten und Silvester.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aber Möwenweg ist eine Geschichte für moderne Kinder, deshalb sind ein paar Grundtöne anders:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stat 3 Bauernhöfen (isoliert auf dem Land in Schweden) leben die Kinder
in einer Reihenhausreihe (wsl in einem ländlichen Vorort in Norddeutschland)&lt;/li&gt;
&lt;li&gt;Stat Lämmern und Hühnern haben die Kinder Kanninchen und Meerschweinchen&lt;/li&gt;
&lt;li&gt;Stat bei der Ernte helfen die Kinder im Haushalt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Übrigens spielt Möwenweg &lt;em&gt;nicht ganz&lt;/em&gt; in der Gegenwart, aber das merkt man kaum.
Hier sind die einzigen Hinweise auf die Zeit, die ich gefunden habe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Als der große Bruder Petja ein Handy zu Weinachten bekommt, beginnt er viele SMS zu versenden.&lt;/li&gt;
&lt;li&gt;Eine Frendin bringt einen &lt;em&gt;CamCorder&lt;/em&gt; mit und die Kinder drehen einen Film.
Die Videokamera ist aber so wertvoll, dass sie nicht an andere Kinder weitergegeben werden darf.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich würde die Möwenwegbücher deshalb auf die 2000er Jahre datieren - in dieser Zeit erschien auch das erste Buch der Reihe.&lt;/p&gt;
&lt;p&gt;Besonders toll an den Möwenwegbüchern sind auch die (ungekürzten) Hörbücher.
Jenny Mierau hat hier absolut fantastische Lesearbeit geleistet -
sie spricht natürlich, man hört die Stimmung und auch den Subtext heraus.
Wirklich gut.&lt;/p&gt;
&lt;h2 id=&#34;das-ist-doch-kein-zufall&#34;&gt;Das ist doch kein Zufall&lt;/h2&gt;
&lt;p&gt;Da beide Buchreihen bei uns tagein tagaus gelesen/gehört/nachgespielt werden, fallen auch einige ungewöhnliche Parallelen auf.&lt;/p&gt;
&lt;p&gt;Zum Beispiel gibt es in beiden Geschichten einen Großvater/Opa, der diese Rolle für alle Kinder der Bande einnimmt.
Für mich ist sehr klar das Kirsten Boie die Bullerbü Geschichten gut kennt und einige Motive aufgegriffen hat.&lt;/p&gt;
&lt;p&gt;Mir gefällt es aber am besten, wenn die Referenz ein bisschen besser versteckt ist:&lt;/p&gt;
&lt;h3 id=&#34;der-irreführende-name&#34;&gt;Der irreführende Name&lt;/h3&gt;
&lt;p&gt;Aus &amp;ldquo;Wir Kinder aus Bullerbü&amp;rdquo;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mitten zwischen Bullerbü und Storbü wohnt ein Schuhmacher, der heißt Nett.
Er heißt Nett, aber er ist kein bisschen nett, wirklich kein bisschen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Schuhmacher Nett ist ein Trinker, droht den Kindern mit Prügeln und misshandelt seinen Hund.&lt;/p&gt;
&lt;p&gt;Aus &amp;ldquo;Geburtstag im Möwenweg&amp;rdquo;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] unsere Lehrerin ist sehr alt und heißt Frau Streng.
Aber sie ist überhaupt nicht streng!
Sie ist sogar sehr nett.
Da müsste sie doch eigentlich Frau Nett heißen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Frau Nett ist witzig und organisiert immer wieder Spendenaktionen &amp;ldquo;für die armen Kinder in Afrika&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Die beiden Figuren haben also eigentlich nichts gemeinsam,
werden aber auf komplementäre Weiße eingeführt.&lt;/p&gt;
&lt;h3 id=&#34;der-nächtliche-überfall&#34;&gt;Der nächtliche Überfall&lt;/h3&gt;
&lt;p&gt;In Bullerbü wollen die Kinder in der Scheune übernachten, die Jungs in der einen Scheune und die Mädchen in der anderen.
Die Jungs schleichen sich hinüber und erschrecken Mädchen (erfolgreich).&lt;/p&gt;
&lt;p&gt;Im Möwenweg wollen die Kinder nach einem Straßenfest im Zelt schlafen, die Jungs in dem einen und die Mädchen im anderen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Wir Mädchen] konnten noch nicht gleich schlafen, weil doch klar war, dass die Jungs uns bestimmt überfallen würden.
[&amp;hellip;] Da mussten wir natürlich wachsam sein.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Als lange Zeit nichts passiert, schauen sie ins Jungszelt und entdecken, dass die Jungs schon eingschlafen sind.&lt;/p&gt;
&lt;h3 id=&#34;die-einkaufsliste&#34;&gt;Die Einkaufsliste&lt;/h3&gt;
&lt;p&gt;In Bullerbü werden Lisa und Inga zum einkaufen in den Dorfladen geschickt.
Sie wollen sich alles merken, was sie einkaufen sollen, aber sind &lt;em&gt;so&lt;/em&gt; viele Dinge.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wir waren ja ein wenig besorgt, ob wir das alles behalten würden,
und deshalb zählten wir uns anfangs immer wieder auf, was wir mitbringen sollten.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Trotzdem vergessen sie beim Einkauf immer wieder Sachen (Hefe zum Beispiel) und müssen zurück laufen.
(Es ist mein liebstes Kapitel von allen.)&lt;/p&gt;
&lt;p&gt;Auch im Möwenweng kaufen die Mädchen ein:
Sie sollen Hefe holen.&lt;/p&gt;
&lt;p&gt;Aus &amp;ldquo;Geburtstag im Möwenweg&amp;rdquo;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Tieneke hat] vorgeschlagen, dass wir uns die ganze Zeit immer aufsagen müssen was wir einkaufen sollen.
Sonst vergessen wir es noch.
In Geschichten vergessen Kinder nämlich immer die Hälfte, wenn sie alleine einkaufen gehen.
Ich habe aber nicht gewusst, wass wir vergessen konnten, wenn wir nur Hefe einkaufen sollten.
Trotzdem habe ich eine Weile mit Tieneke zusammen immerzu &amp;ldquo;Hefe, Hefe, Hefe&amp;rdquo; gesagt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;die-beste-art-der-anspielung&#34;&gt;Die beste Art der Anspielung&lt;/h2&gt;
&lt;p&gt;Ich liebe diese Art von Anspielung.
Wenn man sie findet, dann ist es als ob der Autor einem zuzwinkert:
&amp;ldquo;Hey, ich kenne Bullerbü auch&amp;rdquo;.
Ein Insiderwitz.&lt;/p&gt;
&lt;p&gt;Und trotzdem ist es nicht billig.
Kirsten Boie übernimmt nicht einfach nur Teile der Bullerbü Bücher.
Sie verändert sie und setzt sie kunstvoll in einen anderen Kontext.&lt;/p&gt;
&lt;p&gt;Es erinnert mich ein bisschen an das Video &lt;a href=&#34;https://www.youtube.com/watch?v=3GK_3KgZios&#34;&gt;&amp;ldquo;How to steal like Wes Anderson&amp;rdquo;&lt;/a&gt; von Thomas Flight.
Dort zeigt er, wie Anderson in &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Grand_Budapest_Hotel&#34;&gt;&amp;ldquo;The Grand Budapest Hotel&amp;rdquo;&lt;/a&gt; eine Szene des Films &lt;a href=&#34;https://en.wikipedia.org/wiki/Torn_Curtain&#34;&gt;&amp;ldquo;Torn Curtain&amp;rdquo;&lt;/a&gt; referenziert und so verändert, dass sie gleichzeitig vertraut und witzig anders wirkt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bullerbü ist ein tolles erstes Buch</title>
      <link>https://schauderbasis.de/posts/bullerbue_ist_ein_tolles_erstes_buch/</link>
      <pubDate>Wed, 09 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/bullerbue_ist_ein_tolles_erstes_buch/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Ich liebe es, meinen Kindern vorzulesen.
Die ersten Jahre funktionieren nur kurze Bilderbücher, die man in einem Rutsch durch bekommt.
Aber bei 3 Jahren habe ich vorsichtig angefangen, längere Geschichten mit wenig Bildern für sie zu lesen, mit mehreren Kapiteln.
Und das erste Buch war &amp;ldquo;&lt;a href=&#34;https://de.wikipedia.org/wiki/Wir_Kinder_aus_Bullerb%C3%BC#/media/Datei:Bullerbyn-dsc_2725.jpg&#34;&gt;Wir Kinder von Bullerbü&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Ich hatte das lange vorher geplant und bin im Nachhinein sehr glücklich mit dieser Wahl.&lt;/p&gt;
&lt;p&gt;Bullerbü ist fantastisch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Sprache ist kindgerecht und zieht auch mich als Erwachsenen an.&lt;/li&gt;
&lt;li&gt;Die Kapitel sind kurz (etwa 3 Doppelseiten).&lt;/li&gt;
&lt;li&gt;Die Kapitel bauen lose aufeinander auf, sind aber in sich geschlossen.&lt;/li&gt;
&lt;li&gt;Die Themen sind Altagsabenteuer von Kindern.&lt;/li&gt;
&lt;li&gt;Die Geschichten spielen in einer ziemlich heilen Welt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trotzdem ist das natürlich anstrengend für kleine Kinder und ich muss viel unterstützen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nach (und manchmal auch wärend) einer Geschichte besprechen wir, was passiert ist.&lt;/li&gt;
&lt;li&gt;Nach jedem Kapitel darf das Kind entscheiden, ob es noch eines will oder nicht.&lt;/li&gt;
&lt;li&gt;Oft müssen Begriffe erklärt werden (&amp;ldquo;Rüben verziehen&amp;rdquo;, &amp;ldquo;Hausmädchen&amp;rdquo;, &amp;ldquo;Landstreicher&amp;rdquo; &amp;hellip;).
Meistens kann man aber auch einfach darüber hinweg lesen - man braucht nicht alle Details, um Geschichten zu verstehen.&lt;/li&gt;
&lt;li&gt;Bullerbü spielt so vor 120 Jahren (Anfang des 20. Jahrhundersts) und wurde vor über 70 Jahren geschrieben.
Dafür ist die Sprache nicht schlecht gealtert, aber manches klingt schon seltsam für moderne Ohren.
Manchmal übersetze ich beim vorlesen direkt (zum Beispiel &amp;ldquo;es ist mir über&amp;rdquo; zu &amp;ldquo;es ist mir zu viel&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Einige Kapitel sind ein auserzählter Witz, den das Kind nicht überblicken kann.
&lt;!-- raw HTML omitted --&gt;
(&amp;ldquo;Die Kinder haben sich so Mühe gegeben, sich die Einkaufsliste zu merken. Aber immer vergessen sie was.&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Ich darf nicht enttäuscht sein, wenn das Kind sich direkt nach der Geschichte an nichts mehr erinnert (oder nichts wiedergeben kann).
Das wird schon, beim 3. oder 4. mal lesen.
Manchmal passiert auch das Gegenteil und 2 Tage später benutzt das Kind einen Satz aus dem Buch.&lt;/li&gt;
&lt;li&gt;Wenn das Kind Angst hat (oft an Stellen an denen das nun wirklich überhaupt keinen Sinn macht) dann erzähle ich was passieren wird und manchmal überspringen wir dann die Stelle oder das ganze Kapitel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Manchmal (aber zu selten) spielen wir auch Szenen nach.
Das geht dann meist in freies Spielen über und ist ein guter Abschluss für die Leserunde.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t be a cynic</title>
      <link>https://schauderbasis.de/posts/dont_be_a_cynic/</link>
      <pubDate>Fri, 16 Aug 2024 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/dont_be_a_cynic/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I was a cynic for most of my teenage years.
One day my drama teacher labeled this behavior:
&amp;ldquo;Ahhh, you are a cynic.&amp;rdquo;
That one sentence made me reflect and realise that I didn&amp;rsquo;t really like that about myself.
So I stopped.for a long time in school&lt;/p&gt;
&lt;p&gt;This turned out to be relevant to a lot of discussions.
Sometimes I discuss a difficult problem with someone and they say something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I put my personal information on all the platforms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes, smoking kills, but we all have to die one day.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Climate change is here anyway.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To me, these sentences feel like an attempt to escape the problem.
Make a joke about it and keep doing what you know is bad.&lt;/p&gt;
&lt;p&gt;In a group discussion, people always laugh at these sentences.
But I think it is not a happy laugh.
They laugh not because it is funny, but because they share the helplessness.&lt;/p&gt;
&lt;p&gt;I found that a good response is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Right, but I don&amp;rsquo;t want to be cynical about it.
This is a real problem that deserves a real solution.
So what can we do about it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As a result, many people tend to get much more serious.
Often they think a bit and then say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I know it is problematic, but right now the good outweighs the bad for me.
So I&amp;rsquo;m going to keep doing it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which is a much more helpful way to think about things in my opinion.&lt;/p&gt;
&lt;p&gt;And even if there is nothing we can do about a problem, then I will talk about that.
Don&amp;rsquo;t make a joke of it.
That&amp;rsquo;s what the Joker would do.
And I don&amp;rsquo;t want to be a cynic like the Joker.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Changelog 5</title>
      <link>https://schauderbasis.de/posts/changelog_5/</link>
      <pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/changelog_5/</guid>
      <description>&lt;p&gt;Here is what I worked on since the last changelog.&lt;/p&gt;
&lt;h2 id=&#34;tried-out-typst&#34;&gt;tried out typst&lt;/h2&gt;
&lt;p&gt;I tried a new typesetting system: &lt;a href=&#34;https://typst.app/docs/&#34;&gt;typst&lt;/a&gt;
It is so awesome.&lt;/p&gt;
&lt;p&gt;I love the command line interface.
I love how simple it is in comparison with LaTeX.
I love that it has a &lt;a href=&#34;https://typst.app/docs/reference/scripting/&#34;&gt;scripting language&lt;/a&gt; embedded.
And I love that it &lt;a href=&#34;https://typst.app/docs/reference/data-loading/&#34;&gt;invites&lt;/a&gt; you separate layout from data.&lt;/p&gt;
&lt;p&gt;There are &lt;a href=&#34;https://github.com/qjcg/awesome-typst&#34;&gt;lots&lt;/a&gt; of interesting templates.
But I didn&amp;rsquo;t find something that suited me well enough, so I just wrote my own.
This would be a big undertaking in LaTeX, but in typst I could just learn how to do it on the fly.&lt;/p&gt;
&lt;p&gt;My document is not completely done yet, but it is mainly a question of content at this point.
I will definitely use typst again, especially when creating documents programmaticly.&lt;/p&gt;
&lt;h2 id=&#34;reactivated-the-scraper&#34;&gt;Reactivated the Scraper&lt;/h2&gt;
&lt;p&gt;2 years ago I wrote a webscraper and automated it to run once a day.
The program &amp;hellip;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;scrapes all the job offers on a special website&lt;/li&gt;
&lt;li&gt;transforms them from html to org-mode&lt;/li&gt;
&lt;li&gt;saves the resulting files into a git repository&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I managed to implement all this into a gitlab CI job.
Also the repo of the scraper is the very repo where the data ends up, which I find elegant.
Even more elegant:
This means that the CI job creates a new commit on it&amp;rsquo;s own repository.
It wasn&amp;rsquo;t even that hard, here is the &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;stages&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;collect_data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;commit_and_push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;collect_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;stage&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;collect_data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;before_script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;pip install -r requirements.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;python scrape.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;find scraped_data | sort   &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# show off what we created&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;artifacts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;scraped_data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;expire_in&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;week&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Take the artifacts from the previous job and commit them as new data.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;commit_and_push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;stage&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;commit_and_push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;only&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;schedules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;git checkout data                &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# make sure to use the right branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;rm -rf data                      &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# remove current data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;rm -rf scraped_data/html         &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# remove stuff I don&amp;#39;t want in the repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;mv scraped_data data             &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# put the new data in place&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;git add --no-ignore-removal data &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# put all the changes in data on the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;git -c user.email=&amp;#34;$GITLAB_USER_EMAIL&amp;#34; -c user.name=&amp;#34;$GITLAB_USER_NAME&amp;#34; commit --allow-empty --message=&amp;#34;Added data_from $(date +%FT%T)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;git push &amp;#34;https://gitlab-ci-token:$GITLAB_PUSH_TOKEN@gitlab.com/$CI_PROJECT_PATH.git&amp;#34; &amp;#34;HEAD:$CI_COMMIT_BRANCH&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result of running this regularly is a versioned plain text job offerings.
This is awesome if you are interested in questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What offerings contain the word a certain word (like &lt;code&gt;python&lt;/code&gt; or &lt;code&gt;architect&lt;/code&gt;)? (just use &lt;code&gt;grep&lt;/code&gt;/&lt;code&gt;git grep&lt;/code&gt;/&lt;code&gt;ripgrep&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;How long has an offering been online yet? (just use &lt;code&gt;git log&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;How many offerings are added/removed from the website in a certain time frame? (just use &lt;code&gt;git diff --stat&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Do offerings change after their initial posting? (&lt;code&gt;git log&lt;/code&gt; again)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I find this insights fascinating.
Especially because the website itself answers none of this questions, yet scraping it over some time provides the answers seemlessly.&lt;/p&gt;
&lt;p&gt;&amp;hellip;unless the pipeline breaks that is.
I had not cared to fix the CI for some time.
But now I did and the fix was pretty trivial.&lt;/p&gt;
&lt;h2 id=&#34;improved-my-desktop&#34;&gt;Improved my desktop&lt;/h2&gt;
&lt;p&gt;I had some time to improve my desktop.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a new nerdy greeter: &lt;a href=&#34;https://github.com/apognu/tuigreet&#34;&gt;tuigreet&lt;/a&gt; on &lt;a href=&#34;https://sr.ht/~kennylevinsen/greetd/&#34;&gt;greetd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;implement a workflow where I can edit screenshots right after taking them.
I am still looking for a great tool to edit screenshots with.
Perhaps the incoming gimp 3?
But gimp has no good arrow-support :(&lt;/li&gt;
&lt;li&gt;allow mouse scrolling in tmux&lt;/li&gt;
&lt;li&gt;use more features of &lt;a href=&#34;https://github.com/Alexays/Waybar&#34;&gt;waybar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;add a shortcut to switch keyboard layouts&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Changelog 4</title>
      <link>https://schauderbasis.de/posts/changelog_4/</link>
      <pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/changelog_4/</guid>
      <description>&lt;p&gt;I like the concept of those changelog posts.
It makes me feel less pressure to write a full story and add pictures or so.
It also gives me a better sense of progress.&lt;/p&gt;
&lt;p&gt;I noticed that this post is longer then the older ones though.
That is something I need to keep an eye on.&lt;/p&gt;
&lt;p&gt;I am also not sure about the fact that almost every sentence contains the word &amp;ldquo;I&amp;rdquo;.
It is a consequence of the forat of course.
Every sentence is about something I wanted, decided, tried or did.&lt;/p&gt;
&lt;p&gt;Enough of this, here is what I did since the last changelog.&lt;/p&gt;
&lt;h2 id=&#34;merged-my-home-manager-config-into-my-nixos-config&#34;&gt;merged my home-manager config into my NixOs config&lt;/h2&gt;
&lt;p&gt;I used to have separate repos for my home-manager config and my NixOs config.
This was useful once when I was using macOs regularly.
But I haven&amp;rsquo;t touched a mac in years, so the split wasn&amp;rsquo;t helping me anymore.
On the other hand it meant that I needed to set up multiple repositories for every new computer.
So I decided to merge them.&lt;/p&gt;
&lt;p&gt;This was a lot more involved then I thought.
Merging 2 git repositories with unrelated histories is surprisingly hard.
Especially since I wanted one repo to be in a subdirectory of the other one.&lt;/p&gt;
&lt;p&gt;I recently wrote an article about how &lt;a href=&#34;https://schauderbasis.de/posts/do_not_use_this_software/&#34;&gt;git filter-branch wants you not to use it&lt;/a&gt;.
But filter-branch is exactly what you would normally use for such a task,
where the history of a repo is heavily edited.
Fortunately there is an external software-project,
&lt;a href=&#34;https://github.com/newren/git-filter-repo&#34;&gt;git-filter-repo&lt;/a&gt; that is much cleaner and better documented.&lt;/p&gt;
&lt;p&gt;I finally managed to do it with &lt;code&gt;git filter-repo --to-subdirectory-filter&lt;/code&gt; and then &lt;code&gt;git merge --allow-unrelated-histories&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A lot of backups were created that day.
Changing history is about as easy as scify movies make it sound.&lt;/p&gt;
&lt;h2 id=&#34;set-up-a-jellyfin-instance-on-the-server&#34;&gt;set up a Jellyfin instance on the server&lt;/h2&gt;
&lt;p&gt;I finally have a need for a media center:
The kids want to consume the same media again and again (as kids do).
I need an easy way for all family members to consume that media &lt;em&gt;with&lt;/em&gt; the them.&lt;/p&gt;
&lt;p&gt;After having had an eye on &lt;a href=&#34;https://kodi.tv/&#34;&gt;kodi&lt;/a&gt; and &lt;a href=&#34;https://www.plex.tv/&#34;&gt;plex&lt;/a&gt; for quite some time
I decided that I&amp;rsquo;d rather try out &lt;a href=&#34;https://jellyfin.org&#34;&gt;Jellyfin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jellyfin is really cool.
(Once it is running) it looks quite nice.
It fetches tons of metadata from &lt;a href=&#34;https://www.imdb.com/&#34;&gt;imdb&lt;/a&gt; or &lt;a href=&#34;https://www.themoviedb.org&#34;&gt;tmdb&lt;/a&gt;.
And it forces you to keep your media files in an orderly structure.&lt;/p&gt;
&lt;p&gt;Once again, figuring out how to do anything on NixOs was hard.
But I am getting better at it, especially since I am slowly getting the hang of nginx.
Also reading nix code is getting easier and easier.
So it didn&amp;rsquo;t take too long to get it running.&lt;/p&gt;
&lt;p&gt;The hardest thing was finding out why I couldn&amp;rsquo;t connect to the server.
It was set up, I could read it&amp;rsquo;s logs and all, but I just couldn&amp;rsquo;t connect to the Jellyfin server.
I rubberducked it to Sandra and to my astonishment she gave me the answer right away:
&amp;ldquo;Perhaps you need a restart, or it is the firewall or so?&amp;rdquo;
She is not a very technical person, so this was awesome advice.
I had forgotten to open the right ports&amp;hellip;&lt;/p&gt;
&lt;p&gt;This is what workes for me:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ lib&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; config&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt; }:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  jellyfinPort &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8096&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  jellyfinUrl &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MY_URL_FOR_JELLYFIN&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  services&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;jellyfin &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    enable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  services&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;nginx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    enable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    recommendedGzipSettings &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    recommendedOptimisation &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    recommendedProxySettings &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    recommendedTlsSettings &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    virtualHosts&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;jellyfinUrl&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      enableACME &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      forceSSL &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      locations&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;proxyPass &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://localhost:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;toString jellyfinPort&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      locations&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;proxyWebsockets &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  security&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;acme &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    acceptTerms &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    certs&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;jellyfinUrl&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;email &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MY_MAILADDRESS&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  networking&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;firewall&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;allowedTCPPorts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  networking&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;firewall&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;interfaces&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;wiregrill &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    allowedTCPPorts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [ jellyfinPort ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;set-up-jellyfin-again-but-on-a-local-server&#34;&gt;set up Jellyfin again, but on a local server&lt;/h2&gt;
&lt;p&gt;I later decided that I wanted to have my media server at home rather then on the internet.
So I set up my old raspberry pie 4 and installed NixOs on it.
My NixOs config is nice and modular, so I could just enable the module from above and everything worked just as on my server.
No problem at all.&lt;/p&gt;
&lt;p&gt;I love that so much about NixOs.&lt;/p&gt;
&lt;h2 id=&#34;used-mkoption-for-the-first-time&#34;&gt;used &lt;code&gt;mkOption&lt;/code&gt; for the first time&lt;/h2&gt;
&lt;p&gt;I finally found that it was time to add my own options into my NixOS config.
The documentation is fine here and there are plenty examples around.&lt;/p&gt;
&lt;p&gt;I need this because the config for backups is almost but not quite identical on my machines.
For example the paths of the directories that I want to back up vary.
So now I can write one general module that defines some options and every machine sets this option to it&amp;rsquo;s own value.&lt;/p&gt;
&lt;p&gt;Ideally every machine would only specify the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;backup &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  enable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  paths &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/johannes/SecretPlans/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/johannes/PublicPlans/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The rest (&amp;ldquo;Where is the backup server?&amp;rdquo;, &amp;ldquo;How often should backups be done?&amp;rdquo;, &amp;ldquo;How should they be encrypted?&amp;rdquo;) is defined in the backup-module.
That is also a good place to write down some documentation.&lt;/p&gt;
&lt;p&gt;This feels very clean to me.&lt;/p&gt;
&lt;p&gt;I still didn&amp;rsquo;t do monitoring of my backups.
This is dearly needed though.
I don&amp;rsquo;t want to find out I haven&amp;rsquo;t done backups for months.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Changelog 3</title>
      <link>https://schauderbasis.de/posts/changelog_3/</link>
      <pubDate>Sat, 23 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/changelog_3/</guid>
      <description>&lt;h2 id=&#34;addressbook-visualization-came-to-a-halt&#34;&gt;Addressbook visualization came to a halt&lt;/h2&gt;
&lt;p&gt;Previously I had tried to visualize my address book as a graph.
I stopped when I noticed that the vcf export I had didn&amp;rsquo;t include the photos.
This was a problem of the address book app I use on my phone,
so I &lt;a href=&#34;https://github.com/SimpleMobileTools/Simple-Contacts/issues/1054#issuecomment-1817994610&#34;&gt;filed a bug report&lt;/a&gt;.
This stopped my momentum to work on the project for the moment.&lt;/p&gt;
&lt;p&gt;Now that the Simple Mobile Tools
&lt;a href=&#34;https://github.com/SimpleMobileTools/General-Discussion/issues/241#issuecomment-1837102917&#34;&gt;have been sold and are likely to go in a different direction&lt;/a&gt;
I will probably have to replace most of my mobile apps anyway, though.&lt;/p&gt;
&lt;h2 id=&#34;work-on-video-streaming-solution&#34;&gt;Work on video streaming solution&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;empty_jellyfin.png&#34; alt=&#34;Jellyfin is running, but there is no media yet&#34;&gt;&lt;/p&gt;
&lt;p&gt;I installed Jellyfin (a video streaming) solution on my server.
It was reasonably easy (thanks to NixOS),
but I soon noticed that I don&amp;rsquo;t have enough storage space on my server to store all the movies and shows I want.
I monitored the &lt;a href=&#34;https://www.netcup.de/adventskalender/&#34;&gt;Netcup Adventskalender&lt;/a&gt; for cheap storage upgrades, but the right thing for me was not in there.&lt;/p&gt;
&lt;p&gt;So I will have to buy for the regular price soon.
It is not really expensive, so that is fine.
After that I will be able to continue the work on Jellyfin.&lt;/p&gt;
&lt;h2 id=&#34;backup-sandras-laptop&#34;&gt;Backup Sandra&amp;rsquo;s laptop&lt;/h2&gt;
&lt;p&gt;The one PC in our home that doesn&amp;rsquo;t run NixOS is Sandra&amp;rsquo;s laptop.
On NixOS automatic backups are just a question of a few lines of config of course.
But on Fedora I had to do everything by hand, including a systemd unit for triggering the backup.
I used a &lt;a href=&#34;https://fedoramagazine.org/automate-backups-with-restic-and-systemd/&#34;&gt;guide&lt;/a&gt; of course.&lt;/p&gt;
&lt;p&gt;The biggest problem I had after that was the initial backup,
which took so long that it failed for some reason.
The Laptop is a very weak one and I guess it was just too much for it.&lt;/p&gt;
&lt;p&gt;So I started out with excluding the big directories (Music and Images) from the backup.
Then, when the backup was successful I reincluded them gradually,
so only a few GB of data had to be added to backups.&lt;/p&gt;
&lt;p&gt;If this had been a work project I would have had to think of something better,
but for a private project doing this by hand was fine.&lt;/p&gt;
&lt;p&gt;And now we know to have working backups of all machines again, yea!&lt;/p&gt;
&lt;h2 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h2&gt;
&lt;p&gt;Wouldn&amp;rsquo;t it be nice if you got an email if there has not been a backup created for a few days?
Now that the backups run I would like to monitor them.
It is time to have monitoring.&lt;/p&gt;
&lt;p&gt;But boy this stuff is complicated.
Especially if you want to have it set up in a reproducible and documented way.&lt;/p&gt;
&lt;p&gt;Zabbix didn&amp;rsquo;t work for me, so I looked into Graphana.&lt;/p&gt;
&lt;p&gt;Graphana is cool in combination with Prometheus and Telegraf.
At some point I also had Loki, Promtail and InfluxDB running.
It is nice to see how well everything works together,
but I found it very hard to understand what I need.
Especially because I don&amp;rsquo;t even know what I want.&lt;/p&gt;
&lt;p&gt;It would probably be easier if I had a working setup to learn from.&lt;/p&gt;
&lt;p&gt;In the end I ended up with a selfmade dashboard that monitors my website (schauderbasis.de).
That is fine for now, I will try to expand on this at some point.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;monitoring_schauderbasis.png&#34; alt=&#34;Monitoring schauderbasis.de status code and response time&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;iopcc&#34;&gt;IOPCC&lt;/h2&gt;
&lt;p&gt;I found out I had won the &lt;a href=&#34;https://pyobfusc.com/&#34;&gt;IOPCC&lt;/a&gt;.
I was very proud and tried to explain the achievement to a few non-technical people.
All of them were very supporting,
but it was clear that I had not been able to get across the point of the contest.&lt;/p&gt;
&lt;p&gt;So I wrote a &lt;a href=&#34;https://schauderbasis.de/posts/winner_of_the_first_iopcc/&#34;&gt;blogpost&lt;/a&gt; about it.&lt;/p&gt;
&lt;h2 id=&#34;nixos-channel-update&#34;&gt;Nixos channel update&lt;/h2&gt;
&lt;p&gt;I noticed that my Laptops Nixos is running on an old channel,
so I updated it to the latest stable channel (from 22.11 to 23.11).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;nix_channel_status.png&#34; alt=&#34;current status of different nix channels&#34;&gt;&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&#34;https://superuser.com/a/1604695&#34;&gt;this guide&lt;/a&gt; to upgrade because I don&amp;rsquo;t do this very often.
It went uneventful.
Some config parameters had to be renamed and some software had to be replaced because it was not supported anymore (exa -&amp;gt; eza).&lt;/p&gt;
&lt;p&gt;I took the opportunity to run &lt;code&gt;nix-store --gc&lt;/code&gt;, for the first time in about a year.
Many GB of storage were freed.
But perhaps I shouldn&amp;rsquo;t have done it:
When I recompiled my system it took nearly an hour (instead of less than a minute, like normally).
I think a big chunk of that is building emacs from master.&lt;/p&gt;
&lt;p&gt;Worth it, though.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>winner of the first IOPCC</title>
      <link>https://schauderbasis.de/posts/winner_of_the_first_iopcc/</link>
      <pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/winner_of_the_first_iopcc/</guid>
      <description>&lt;p&gt;I am a big fan of the &amp;ldquo;&lt;a href=&#34;https://www.ioccc.org/&#34;&gt;The International Obfuscated C Code Contest&lt;/a&gt;&amp;rdquo; (IOCCC).
Their winners page is littered with creative and (in it&amp;rsquo;s own way) elegant code.
Unfortunately I know just enough C to appreciate the code there, I could never write anything like this myself.&lt;/p&gt;
&lt;p&gt;So I was on fire when I heard that there was a &lt;strong&gt;python-version&lt;/strong&gt; of the contest:
The &lt;a href=&#34;https://pyobfusc.com&#34;&gt;IOPCC&lt;/a&gt;.
I immediately started to work on a submission.&lt;/p&gt;
&lt;p&gt;It was a lot of fun on multiple levels.
I had wanted to do something with abstract syntax trees for a long time,
so I started fooling around with them until I had something sufficiently obscure.
Then I started to condense it, make it as obscure as I could and formed it into an ascii art image.&lt;/p&gt;
&lt;p&gt;When I was satisfied I submitted the code and waited.&lt;/p&gt;
&lt;h2 id=&#34;what-i-submitted&#34;&gt;What I submitted&lt;/h2&gt;
&lt;p&gt;Normally code I write would go into a repo,
but this is a piece of art, not a piece of work.
It won&amp;rsquo;t be iterated on anymore, there are no pipelines, no issues.
So I will just link the files here in this blogpost:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;main.py&#34;&gt;The code&lt;/a&gt; is save to run, but you should not trust my word of course.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;remarks.txt&#34;&gt;An explanation&lt;/a&gt; of what it does and how it does it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The output of the code looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;output.png&#34; alt=&#34;The output prints out it&amp;rsquo;s own code, then evaluates the code quality in terms of the zen of python. It gives itself a pretty bad score.&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-announcement&#34;&gt;The announcement&lt;/h2&gt;
&lt;p&gt;I waited and waited.&lt;/p&gt;
&lt;p&gt;A few months later &lt;a href=&#34;https://pyobfusc.com/#winners&#34;&gt;the winners are announced&lt;/a&gt;.
And I am one of them! Horray!&lt;/p&gt;
&lt;p&gt;Here is what the Judges said about my code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most Introspective.&lt;/p&gt;
&lt;p&gt;Very well put together, top-notch obfuscation.
Tongue-in-cheek, comments on itself (very meta, which we like).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This definitely goes into my resume.
If people see this award winning code they probably won&amp;rsquo;t hire me,
but I don&amp;rsquo;t care.
I am very proud.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Changelog 2</title>
      <link>https://schauderbasis.de/posts/changelog_2/</link>
      <pubDate>Wed, 01 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/changelog_2/</guid>
      <description>&lt;h2 id=&#34;git-showpast&#34;&gt;git showpast&lt;/h2&gt;
&lt;p&gt;I wanted to write a command-line program that would show you the history of some code within a git repository.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When/How/By whom was it written?&lt;/li&gt;
&lt;li&gt;When/How/By whom was it slightly changed?&lt;/li&gt;
&lt;li&gt;When/How/By whom was it moved?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I know &lt;code&gt;git blame&lt;/code&gt;, but this is tedious to use and I still haven&amp;rsquo;t got the hang of it.&lt;/p&gt;
&lt;p&gt;I spent some time deciding on which tools I would like to use for this project.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python, because it is the best to get something done?&lt;/li&gt;
&lt;li&gt;Haskell, because it is the best to write logic in.
This is one of the rare &amp;ldquo;much logic, little IO&amp;rdquo;-problems, which is where haskell normally shines.&lt;/li&gt;
&lt;li&gt;Rust, because I want to get better in rust.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I decided to go for rust (and the excellent &lt;a href=&#34;https://docs.rs/git2/latest/git2/&#34;&gt;git2&lt;/a&gt; crate).
Rust is so cool to work with, because of the strict compiler.
I really enjoy that.&lt;/p&gt;
&lt;p&gt;I even started reading the &lt;a href=&#34;https://lore.kernel.org/git/&#34;&gt;git mailing list&lt;/a&gt; a bit.
It was very interesting, but not ultimately useful to my course.&lt;/p&gt;
&lt;p&gt;The project died very early, though, with very little code to show for it.
Other projects got more interesting to me.&lt;/p&gt;
&lt;h2 id=&#34;music-streaming&#34;&gt;music streaming&lt;/h2&gt;
&lt;p&gt;I finally got &lt;a href=&#34;https://www.navidrome.org/&#34;&gt;navidrome&lt;/a&gt; on my server going.
It is a self-hosted music streaming service.&lt;/p&gt;
&lt;p&gt;I dislike the loss of control that streaming-services like Spotify etc bring with them.
But a selfhosted version?
I can get behind that.&lt;/p&gt;
&lt;p&gt;Navidrome is cool for multiple reasons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It only reads my music directory and doesn&amp;rsquo;t change it
(This is the best.
I can work with files and navidrome will discover changes and update it&amp;rsquo;s internal database.)&lt;/li&gt;
&lt;li&gt;There is a web UI, but every subsonic-compatible client will work (there are a lot of those).&lt;/li&gt;
&lt;li&gt;Installation on NixOs is just a few lines in the config.
Getting this right is hard (for me) but once it works it is so consistent, dense and elegant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;move all my music into one central place for navidrome to read&lt;/li&gt;
&lt;li&gt;add metadata to all the files because navidrome doesn&amp;rsquo;t really care for directories.
(&lt;a href=&#34;https://ibiblio.org/mp3info/&#34;&gt;mp3info&lt;/a&gt; is use useful for that)&lt;/li&gt;
&lt;li&gt;Install clients on all my devices&lt;/li&gt;
&lt;li&gt;Make it available to others in the house&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;address-book-analysis&#34;&gt;address book analysis&lt;/h2&gt;
&lt;p&gt;I wanted to do an analysis and visualization of my address book.
I wrote a &lt;a href=&#34;https://schauderbasis.de/posts/vcf_confusion/&#34;&gt;blog post&lt;/a&gt; about a mistake I made in that process.
There was a cool parser package for python once (&lt;a href=&#34;https://github.com/eventable/vobject&#34;&gt;vobject&lt;/a&gt;)
but it&amp;rsquo;s development has stalled many years ago.
So I wrote a basic parser myself and it was actually quite fun.&lt;/p&gt;
&lt;p&gt;I am looking forward to continuing with this project.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>vcf confusion</title>
      <link>https://schauderbasis.de/posts/vcf_confusion/</link>
      <pubDate>Mon, 30 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/vcf_confusion/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;The contacts in the address book  on your phone can be imported and exported using the &lt;a href=&#34;https://en.wikipedia.org/wiki/VCard&#34;&gt;vCard&lt;/a&gt; format.
This is basically a text file with a &lt;code&gt;.vcf&lt;/code&gt; file extention (for &lt;em&gt;v&lt;/em&gt;irtual &lt;em&gt;c&lt;/em&gt;ontact &lt;em&gt;f&lt;/em&gt;ile).
It is surprisingly readable, here is an example (slightly redacted example from &lt;a href=&#34;https://www.w3.org/2002/12/cal/vcard-examples/&#34;&gt;here&lt;/a&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-vcf&#34; data-lang=&#34;vcf&#34;&gt;BEGIN:VCARD
VERSION:3.0
N:Doe;John;;;
FN:John Doe
EMAIL;type=INTERNET;type=WORK;type=pref:johnDoe@example.org
TEL;type=WORK;type=pref:+1 617 555 1212
TEL;type=WORK:+1 (617) 555-1234
TEL;type=CELL:+1 781 555 1212
TEL;type=HOME:+1 202 555 1212
NOTE:John Doe has a long and varied history\, being documented on more police files that anyone else. Reports of his death are alas numerous.
CATEGORIES:Work,Test group
END:VCARD
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I mean, what is there even to explain?
You can just read it.
And if anything is unclear (perhaps why the name is there twice) you can just read all about it on the official standard
(&lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc6350&#34;&gt;RFC 6350&lt;/a&gt;).
And even that one is nice and readable.&lt;/p&gt;
&lt;p&gt;What an awesome format.&lt;/p&gt;
&lt;h2 id=&#34;i-want-to-analyze-my-address-book&#34;&gt;I want to analyze my address book&lt;/h2&gt;
&lt;p&gt;I wanted to do some data analysis on my address book&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I knew what I wanted to do with the data and had an idea what the result might look like.
So I exported it into a &lt;code&gt;.vcf&lt;/code&gt;-file and moved it to my computer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was tempting to write a parser for it myself.
But one of the things I learned over the last years is to not reinvent the wheel.
Especially if the alternative is just an import and reading a bit of documentation.&lt;/p&gt;
&lt;p&gt;So I &lt;a href=&#34;https://pypi.org/search/?q=vcf&#34;&gt;looked on pypi&lt;/a&gt; and was pleased to find &lt;em&gt;a lot&lt;/em&gt; of vcf packages.
445 - perhaps a bit more then you would expect.&lt;/p&gt;
&lt;p&gt;I just tried out one or two, but I got a strange error messages.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vcfpy.exceptions.IncorrectVCFFormat: Missing line starting with &amp;#34;#CHROM&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hmm, that&amp;rsquo;s right, there is no line starting with &lt;code&gt;#CHROM&lt;/code&gt; in my &lt;code&gt;.vcf&lt;/code&gt;-file.
Is my export broken?
Is the package outdated perhaps?&lt;/p&gt;
&lt;p&gt;So I tried another package, but I kept getting these error messages.
Strange&amp;hellip;
What does &lt;code&gt;$CHROM&lt;/code&gt; even mean?
Should I just add it to my file if the package wants it so desperately?&lt;/p&gt;
&lt;p&gt;I looked up the standard - there wasn&amp;rsquo;t anything about &lt;code&gt;#CHROM&lt;/code&gt;.
I looked up the error message on the internet - there definitely were people talking about &lt;code&gt;#CHROM&lt;/code&gt; in their &lt;code&gt;.vcf&lt;/code&gt;-files.
I looked up the documentation of the package - no really useful information.&lt;/p&gt;
&lt;p&gt;I kept reading and finally found it:
There are &lt;a href=&#34;https://en.wikipedia.org/wiki/VCF&#34;&gt;multiple file formats named VCF&lt;/a&gt;.
There is the one about contacts, but there is also the &amp;ldquo;Variant Cal Format&amp;rdquo; used for genome-data in bioinformatics.
No wonder there are so many vcf-packages out there.
And &lt;code&gt;#CHROM&lt;/code&gt; stands for chromosomes of course.&lt;/p&gt;
&lt;p&gt;I had been reading the wrong documentation all along. Guess I should have just reinvented the wheel.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wie Anfänger an Einfachem scheitern</title>
      <link>https://schauderbasis.de/posts/wie_anfaenger_an_einfachem_scheitern/</link>
      <pubDate>Mon, 09 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/wie_anfaenger_an_einfachem_scheitern/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&amp;ldquo;Snakes and ladders&amp;rdquo; ist ein so einfaches Spiel, dass es fast keine Regeln zu erklären gibt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Würfeln, laufen und wer als erstes ins Ziel kommt gewinnt. Wer auf einem markierten Feld landet kommt woanders raus.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ich wüsste wirklich nicht was man mehr erklären sollte.&lt;/p&gt;
&lt;p&gt;Im eigentlichen Sinn ist es nicht einmal ein Spiel:
Es gibt keine Entscheidungen, welche die Spieler treffen können,
keine Fähigkeiten werden unter Beweis gestellt - man würfelt und zieht.
Es ist mehr wie ein Protokoll, das abgearbeitet wird, um einen zufälligen Sieger zu bestimmen.
Kaum mehr als ein verkomplizierter Münzwurf.&lt;/p&gt;
&lt;p&gt;Aber wer versucht, es mit einem kleinen Kind zu spielen,
der kann sehen wie viel implizites Wissen hier vorausgesetzt wird.&lt;/p&gt;
&lt;p&gt;Hier ist eine Reihe von Schwierigkeiten, die ich beim Spielen mit kleinen Kindern hatte.
(Um die Situation zu vereinfachen hatten wir auf alle Schlangen verzichtet und das Spielbrett sorgsam aufgebaut.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sie wissen nicht, wer als nächstes dran ist.&lt;/li&gt;
&lt;li&gt;Sie wissen nicht, sie man würfelt.&lt;/li&gt;
&lt;li&gt;Der Würfel ist runter gefallen und unterm Sofa verschwunden.&lt;/li&gt;
&lt;li&gt;Sie wissen nicht, was die Zeichen auf dem Würfel bedeuten.&lt;/li&gt;
&lt;li&gt;Sie wollen lieber mit dem Würfel selbst spielen.&lt;/li&gt;
&lt;li&gt;Sie wissen nicht das jeder Spieler nur eine Spielfigur hat&lt;/li&gt;
&lt;li&gt;&amp;hellip; und diese nicht mitten im Spiel mit der eines anderen tauschen darf.&lt;/li&gt;
&lt;li&gt;Sie wissen nicht, wie weit sie laufen dürfen.&lt;/li&gt;
&lt;li&gt;Sie laufen in die falsche Richtung.&lt;/li&gt;
&lt;li&gt;Sie können sich nicht auf das Spiel konzentrieren, nicht mal während sie selbst dran sind.&lt;/li&gt;
&lt;li&gt;Die Spielfiguren sind verrutscht und keiner weiß mehr wo sie waren.&lt;/li&gt;
&lt;li&gt;Sie wissen nicht mehr welches ihre Spielfigur ist.&lt;/li&gt;
&lt;li&gt;Sie wollen nicht warten bis der Vorgänger mit seinem Zug fertig ist.&lt;/li&gt;
&lt;li&gt;Sie wissen nicht, wann das Spiel zu Ende ist.&lt;/li&gt;
&lt;li&gt;Sie wissen &lt;em&gt;sehr&lt;/em&gt; genau, wer gewonnen hat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich schreibe das alles voller Respekt.
Ich weiß sehr genau was es bedeutet, ein Anfänger zu sein.&lt;/p&gt;
&lt;p&gt;Das ist einer der Gründe, warum gute Dokumentation zu schreiben unglaublich ist:
Es ist sooo schwierig vorherzusagen, wie viel der Leser schon weiß.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>changelog</title>
      <link>https://schauderbasis.de/posts/changelog_1/</link>
      <pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/changelog_1/</guid>
      <description>&lt;p&gt;I do a lot of  personal computerstuff over the weeks.
Most of it ends up in a repository of some sort (if it is not in a repo, have you even done something?)
A few things end up in a database, which is fine, too.&lt;/p&gt;
&lt;p&gt;But I don&amp;rsquo;t write about most of it.
Apart from the git log there is no changelog, no releases (everything is released immediately) and no Retro.&lt;/p&gt;
&lt;p&gt;Thats mostly OK.
Most stuff I do is small and not aimed at the public
(even when I do it in the open,
&lt;a href=&#34;https://gitlab.com/Kaligule&#34;&gt;almost all of my code is on gitlab&lt;/a&gt;).
So if I do a commit or two every month there is not much to tell.&lt;/p&gt;
&lt;p&gt;But wouldn&amp;rsquo;t it be nice to have some document of accomplishment every once in a while? An opportunity for retrospection? Lets try that.&lt;/p&gt;
&lt;p&gt;So here is what I did in these days:&lt;/p&gt;
&lt;h2 id=&#34;talks&#34;&gt;talks&lt;/h2&gt;
&lt;p&gt;In the last weeks I have written a
&lt;a href=&#34;https://talks.schauderbasis.de/&#34;&gt;website for the talks I have held&lt;/a&gt;.
It was only the second site that I wrote completely from scratch.
I am quite proud of it.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&#34;https://gohugo.io/&#34;&gt;hugo&lt;/a&gt; as a site generator,
but wrote the theme completely myself.
I had an easier time figuring out the hugo templates, the HTML and the css.
&lt;a href=&#34;https://developer.mozilla.org&#34;&gt;MDN&lt;/a&gt; is a really good resource.&lt;/p&gt;
&lt;p&gt;The most difficult part was getting the css work for both mobile and desktop.&lt;/p&gt;
&lt;p&gt;This was a big project for me.&lt;/p&gt;
&lt;p&gt;There is still a lot to do content wise
(writing transcripts,
asking the rightholders for permission to distribute recordings of talks)
but I am comfortable having the site online already.&lt;/p&gt;
&lt;h2 id=&#34;elfeed&#34;&gt;elfeed&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/skeeto/elfeed&#34;&gt;Elfeed&lt;/a&gt; is a Feedreader for Emacs.
It has a great reputation within the community.
It fetches the feeds itself by default,
but with elfeed-protocol it can sync with different servers like &lt;a href=&#34;https://newsblur.com/&#34;&gt;Newsblur&lt;/a&gt; or &lt;a href=&#34;https://tt-rss.org/n&#34;&gt;ttrss&lt;/a&gt;.
&lt;a href=&#34;https://github.com/fasheng/elfeed-protocol&#34;&gt;Elfeed-protocol&lt;/a&gt;
has seen some critical improvements over the last few weeks,
so I tried it out once more.&lt;/p&gt;
&lt;p&gt;Elfeed sits in the intersection of 2 things I love:
emacs and RSS.
It&amp;rsquo;s gorgeous and I would love to use it,
but when I first tried it in 2020 it missed some (for me critical) features.
Those were resolved, some of them just a few weeks ago.&lt;/p&gt;
&lt;p&gt;But I am not sure the sync of the read-status works reliably.
I will have to try it some more.
I am also in the in the process of reading through the code.
This is bit hard for me because (e)lisp is still a bit hard for me to read.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>hello world in sh</title>
      <link>https://schauderbasis.de/posts/hello_world_in_sh/</link>
      <pubDate>Fri, 22 Sep 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/hello_world_in_sh/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;When I write a sh-script, this is how I start:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# usage: ./greeter Johannes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -eux
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -o pipefail  &lt;span style=&#34;color:#75715e&#34;&gt;# only works in bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;greet&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello &lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;greet &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Don&amp;rsquo;t forget to make the script executable: &lt;code&gt;chmod +x greeter&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;This template is useful because it encourages good standards.&lt;/p&gt;
&lt;p&gt;This post is here mainly so I can find the template whenever I want to write a quick script.
But since you are already here, lets go through it, line by line.&lt;/p&gt;
&lt;h2 id=&#34;what-is-in-the-template&#34;&gt;What is in the template&lt;/h2&gt;
&lt;h3 id=&#34;shebang&#34;&gt;Shebang&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It allows you to run the script directly (&lt;code&gt;./greeter Johannes&lt;/code&gt;) instead of with an interpreter (&lt;code&gt;sh greeter Johannes&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;usage-hint&#34;&gt;Usage hint&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# usage: ./greeter Johannes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A small reminder on how to use the script (because I will certainly forget it).&lt;/p&gt;
&lt;h3 id=&#34;defensive-programming&#34;&gt;defensive programming&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -eux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If there is an error the script should stop immediately.&lt;/p&gt;
&lt;p&gt;What it does (as described in &lt;code&gt;bash -c &amp;quot;help set&amp;quot;&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-e&lt;/code&gt;: Exit immediately if a command exits with a non-zero status.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt;: Treat unset variables as an error when substituting.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-x&lt;/code&gt;: Print commands and their arguments as they are executed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last one is great for debugging.
If you want to read more about these flags with more context, start reading &lt;a href=&#34;https://jmmv.dev/2018/03/shell-readability-strict-mode.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set -o pipefail  &lt;span style=&#34;color:#75715e&#34;&gt;# only works in bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a bit of an outsider, because it is bash specific.
I try to write my code as POSIX compliant as possible, but I don&amp;rsquo;t do so religiously.
So this can stay in my opinion.&lt;/p&gt;
&lt;p&gt;What it does is change the collective exit code of commands that are chained together by pipes.&lt;/p&gt;
&lt;p&gt;Lets say you want to list all the home-directories sorted by alphabet.
You would write &lt;code&gt;ls /home | sort&lt;/code&gt; and get an exit code of &lt;code&gt;0&lt;/code&gt;: All is fine.&lt;/p&gt;
&lt;p&gt;But what if you have a typo in it?
&lt;code&gt;ls /homee | sort&lt;/code&gt; will print &lt;code&gt;ls: cannot access &#39;/homee&#39;: No such file or directory&lt;/code&gt; to stderr,
but the exit code still indicates that all is fine.
That is because the exit code of the chain of commands is just the exit code of the last command - and &lt;code&gt;sort&lt;/code&gt; did just fine with no input.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;set -o pipefail&lt;/code&gt; will make this behave as expected:
The first nonzero status code will determine the status code of the whole chain
(and with the &lt;code&gt;-e&lt;/code&gt; from above the script will abort).
Only if every single command exits with &lt;code&gt;0&lt;/code&gt; then whole command will have exit code &lt;code&gt;0&lt;/code&gt; as well and the script will continue.
In our case we would get an exit code of &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;function-definition&#34;&gt;Function definition&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;greet&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello &lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Define a function in a POSIX compliant way.
The arguments are not declared in the breakets as in python (that would be cool).
Instead they are just assumed to be there and called with &lt;code&gt;$1&lt;/code&gt; (or &lt;code&gt;$2&lt;/code&gt; for the second argument, etc).&lt;/p&gt;
&lt;h3 id=&#34;function-call-and-script-arguments&#34;&gt;Function call and script arguments&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;greet &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Call the above function with an argument.
The argument could be any string (&lt;code&gt;greet &amp;quot;Sandra&amp;quot;&lt;/code&gt;), but I chose to use to forward the first argument of the script.&lt;/p&gt;
&lt;h2 id=&#34;script-done&#34;&gt;Script done&lt;/h2&gt;
&lt;p&gt;Now you can just script away.
By the way, make sure to check it for errors with the incredible &lt;a href=&#34;https://www.shellcheck.net&#34;&gt;shellcheck&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Do not sort your screws</title>
      <link>https://schauderbasis.de/posts/do_not_sort_your_screws/</link>
      <pubDate>Mon, 04 Sep 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/do_not_sort_your_screws/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I used to have a medium-sized toolbox in my basement.
Then recently I got my hands onto a relatively big amount of tools.
They were not sorted at all.&lt;/p&gt;
&lt;p&gt;From what I can tell the previous owners used to keep the tools in the whatever room they used them in last.
&amp;ldquo;Finished the sink?
Just put screwdivers and the leftover sealing rings in the kitchen-box.&amp;rdquo;
I guess it worked for them.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t work for me.
I threw all the piles together and spent multiple evenings sorting.
Tools, material, boxes…&lt;/p&gt;
&lt;p&gt;Sorting through your stuff is fun.
I have been a fan of Marie Kondo since I read her book the first time, so I wasn&amp;rsquo;t afraid to let go of a lot of stuff.
It is a joyfully way to spend a few hours.&lt;/p&gt;
&lt;p&gt;One thing I didn&amp;rsquo;t get sorted out were the screws.
There were just too many different ones.&lt;/p&gt;
&lt;h2 id=&#34;what-others-do&#34;&gt;What others do&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;drawers.jpg&#34; alt=&#34;many drawers and organizers, nicely labeld&#34;&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I looked up how other people sort their screws.
High shelves with small boxes, sorted by length, thickness, head type&amp;hellip;
There are selfmade tools that assist the sorting and big machines that do it all on their own.&lt;/p&gt;
&lt;p&gt;All those solutions don&amp;rsquo;t fit my situation.
My screws comes from many years of leftover screws, partly rescued from older furniture repuposed.
I don&amp;rsquo;t have 5 or 10 or 20 kinds of screws, more like 100.
At the same time, it is very seldom that I have 10 of the same kind.&lt;/p&gt;
&lt;p&gt;I also seldom need a very specific screw.
And if I did I probably wouldn&amp;rsquo;t have it in stock.
Most of the time I need &amp;ldquo;2 Wood screws around &lt;em&gt;this&lt;/em&gt; length, not &lt;em&gt;too&lt;/em&gt; thick&amp;rdquo; or &amp;ldquo;anything with a round head like &lt;em&gt;this&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;what-works-for-me&#34;&gt;What works for me&lt;/h2&gt;
&lt;p&gt;So everything got into a big pile, in a big open box.
Only those screws and dowels that are still in their original package were allowed to stay there.
All of this went into a drawer.&lt;/p&gt;
&lt;p&gt;This was not exactly a stroke of genius.
It was simply the thing that required the least amount of work.
For now I was fine with not making the problem worse.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pile_of_screws.jpg&#34; alt=&#34;A pile of different screws&amp;quot;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I turned out to work extremely well though.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;doesn&amp;rsquo;t take a lot of space&lt;/li&gt;
&lt;li&gt;very easy to maintain&lt;/li&gt;
&lt;li&gt;finding a fitting screw is fairly easy (although finding a single certain screw is hard)&lt;/li&gt;
&lt;li&gt;there are practically no sunken costs (no stacking boxes, no rack, no time invested into sorting thousands of small parts), so I am very open to improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;i-sorted-them-a-little-bit&#34;&gt;I sorted them a little bit&lt;/h2&gt;
&lt;p&gt;After using that system for some time I noticed that I could do a little better.
This was mainly because I found that my screws could be divided into two piles very naturally: Wood screws vs Metal screws.
So I separated them into two different containers.&lt;/p&gt;
&lt;p&gt;I think this works because of two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The division line is very clear (so both sorting and searching are easy)&lt;/li&gt;
&lt;li&gt;The resulting piles are about equal in size (roughly a relation 1:2), so the split really cuts down the search space.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For those reasons this divide increased searching speed without sacrificing the spirit of the system.
The advantages get hurt just a little bit, but the trade of is worth it in my opinion.&lt;/p&gt;
&lt;p&gt;I later split the bigger pile into long screws (&amp;gt;3cm) vs short screws (≤3cm), which works for the same reasons.
I don&amp;rsquo;t think more splits would improve the situation for me, though.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In some situations the best sorting system is not to sort at all. Keep in mind that this is a valid option, too.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Trying out StreetComplete</title>
      <link>https://schauderbasis.de/posts/streetcomplete/</link>
      <pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/streetcomplete/</guid>
      <description>&lt;p&gt;The other day I found that &lt;a href=&#34;https://f-droid.org/packages/de.westnordost.streetcomplete/&#34;&gt;StreetComplete&lt;/a&gt; is on F-Droid.
I had heard of that app when it came out but had totally forgotten about it.
Time to give it a try.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;The goal is to go outside and add information to OpenStreetMap from your phone.&lt;/p&gt;
&lt;p&gt;The app is probably the most modern app on my phone, it looks like it anyway.
You need to login with your OpenStreetMap account (I barely remembered having one).
Then you get a map and select an area where you would like to do quests.
Those are scattered around in the area and you can choose which one to take.
(You can also specify which kinds of quests you would like to do.
Personally I don&amp;rsquo;t like to decide on types of houses and don&amp;rsquo;t want to measure the width of roads, so I don&amp;rsquo;t.)&lt;/p&gt;
&lt;p&gt;After choosing one you get a simple question with some answers to choose from.
Sometimes you are asked to enter some text (a house number or the name of a shop).
But mostly the questions are multiple choice, with illustrated answers.
This makes deciding on the right answer &lt;em&gt;much&lt;/em&gt; easier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;quest.png&#34; alt=&#34;A quest with illustrated answers to choose from.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Common questions in my area (gnihihi) are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is there a sidewalk on that street?&lt;/li&gt;
&lt;li&gt;What kind of surface is here?&lt;/li&gt;
&lt;li&gt;Is there a bench/trashcan/streetlight at this bus stop?&lt;/li&gt;
&lt;li&gt;Is that sign still there?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have answered the question the answer is directly uploaded to OpenStreetMap.
You can even do it without mobile data!
Then the answers are uploaded when you have WiFi next time.
Awesome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;yes_or_no.png&#34; alt=&#34;A simple yes or no question: Is there a bench at this bus stop?&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-it-feels&#34;&gt;How it feels&lt;/h2&gt;
&lt;p&gt;It reminds me of those augmented reality games
(&lt;a href=&#34;https://en.wikipedia.org/wiki/Pokemon_Go&#34;&gt;Pokemon Go&lt;/a&gt; from 2016,
&lt;a href=&#34;https://en.wikipedia.org/wiki/Ingress_(video_game)&#34;&gt;Ingress&lt;/a&gt; from 2014)
that were very in a few years ago.
I never played those, but I imagine they felt similar to this.&lt;/p&gt;
&lt;p&gt;Everything about the app is fun.
Answering simple questions is fun,
getting outside to clear your area from quests is fun,
walking into random streets for some quest is fun.
The kids like it, too.
We were having a lot of fun with it.&lt;/p&gt;
&lt;p&gt;Once you uploaded your answers you can have a look on &lt;a href=&#34;https://www.openstreetmap.org&#34;&gt;OpenStreetMap&lt;/a&gt; and see them in the map right away.
This in turn made me do some editing on the Map in the browser as well.
OpenStreetMap&amp;rsquo;s Browser Editor (called &lt;a href=&#34;https://wiki.openstreetmap.org/wiki/ID&#34;&gt;&lt;em&gt;iD&lt;/em&gt;&lt;/a&gt;) is really good these days,
and so is the &lt;a href=&#34;https://wiki.openstreetmap.org/wiki/Key:bollard?uselang=en&#34;&gt;wiki&lt;/a&gt; where all the tags are explained in detail.
And iD will even link those wikipages on within the editor so you can look them up effortless.&lt;/p&gt;
&lt;p&gt;When I started contributing to OpenStreetMap I often was afraid that I would label something wrong and ruin the map for everyone.
But in StreetComplete the quests are well chosen.
The questions are direct and the options are clear, so you can answer confidently.
And if you think you did something wrong anyways you can undo your answer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;undo.png&#34; alt=&#34;an undo diaolg being specific about what will be undone&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;After 3 days with StreetComplete I now have cleaned up the small area where I commute regularly.
Some tasks can even be done from the bus, if you are quick.
On occasion I will have to explore other areas.&lt;/p&gt;
&lt;p&gt;StreetComplete does a good job at lowering the barrier of entry for mappers.
I love it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Annoyed with Sir Arthur Conan Doyle</title>
      <link>https://schauderbasis.de/posts/annoyed_with_sir_arthur_conan_doyle/</link>
      <pubDate>Sun, 14 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/annoyed_with_sir_arthur_conan_doyle/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;My wife and I read stories to each other.
It is a great way to go to sleep.
At some point we started to do the Sherlock Holmes books by Sir Arthur Conan Doyle.
A faithful translation of the originals.&lt;/p&gt;
&lt;p&gt;The books are fun.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The mysteries are interesting.&lt;/li&gt;
&lt;li&gt;Having read the originals (or a good translation) shines a new light on the many many adaptations that we are out there.
A lot of them play with the original texts.&lt;/li&gt;
&lt;li&gt;The moments where Holmes goes &amp;ldquo;I know everything about that person just from having a close look&amp;rdquo; are always fun.&lt;/li&gt;
&lt;li&gt;Sherlock Holmes is in public domain.
This gives me a feeling of opportunity - I could do everything with the material.
(It is more of a theoretical opportunity though, I am not in the business of adapting literary figures.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is clear that crime novels have come a long way since 1887.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some of the situations/conversation feel a bit set up.
Watson is constantly super-surprised about Holmes deductions.
One would expect that he would learn to expect them (even when he can&amp;rsquo;t do them himself).&lt;/li&gt;
&lt;li&gt;Some of the solutions feel trivial.
This is probably unfair against those stories,
but by today&amp;rsquo;s standards I expect a clever and complex solution to a mysterious problem.
&amp;ldquo;It was some guy who wanted the money, so he just did the next best thing&amp;rdquo; is just not interesting.&lt;/li&gt;
&lt;li&gt;Some ideas have been reiterated on so often that they feel old and predictable.
Once again, this is not the originals fault, more of an achievement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But there is one thing about the story structure that really annoyed us.&lt;/p&gt;
&lt;p&gt;It happens at the end of some cases.
The culprit has been found and arrested, it is more or less clear what happened.
Holmes has had all his moments of cleverness.
Now all we need is something to conclude the story.&lt;/p&gt;
&lt;p&gt;But then the culprit gets a backstory.
And that backstory is told in very much detail.
Either by himself or just by the narrator.
That&amp;rsquo;s fine and all, but it doesn&amp;rsquo;t add to the action.
It is just another plot, nearly completely unrelated to what the book is about.&lt;/p&gt;
&lt;p&gt;Examples would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chapter 12 of &lt;a href=&#34;https://www.gutenberg.org/ebooks/2097&#34;&gt;&amp;ldquo;The Sign of the Four&amp;rdquo;&lt;/a&gt; (1887)&lt;/li&gt;
&lt;li&gt;Chapter 1 to 5 of the second part of &lt;a href=&#34;https://www.gutenberg.org/ebooks/244&#34;&gt;&amp;ldquo;A Study in Scarlet&amp;rdquo;&lt;/a&gt; (1890)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(I will admit that this seems to be only a problem of the earlier books.)&lt;/p&gt;
&lt;p&gt;It feels like the author had thought of this backstory for the baddie
and - when he finished writing - noticed that he did never use it in the tale.
So instead of working it into the text he just pasted it in at the end, like an appendix.&lt;/p&gt;
&lt;p&gt;This takes away from the books flow, and it makes me sad because I like them a lot.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s fine though, the later books don&amp;rsquo;t have the problem (or at least to a lesser extend).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Do not use this software</title>
      <link>https://schauderbasis.de/posts/do_not_use_this_software/</link>
      <pubDate>Wed, 25 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/do_not_use_this_software/</guid>
      <description>&lt;p&gt;There is a piece of software on your computer that you shall not use.&lt;/p&gt;
&lt;p&gt;It is not broken or alpha-software, it works perfectly fine.
It is part of git after all, the basis of almost all modern and not so modern software.
But have a look at it&amp;rsquo;s manpage and you will find a big warning to please not use it.&lt;/p&gt;
&lt;p&gt;I am talking about the command &lt;code&gt;git filter-branch&lt;/code&gt;.
Just have a look at &lt;a href=&#34;https://git-scm.com/docs/git-filter-branch&#34;&gt;it&amp;rsquo;s manpage&lt;/a&gt;.
I quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WARNING&lt;/p&gt;
&lt;p&gt;git filter-branch has a plethora of pitfalls that can produce
non-obvious manglings of the intended history rewrite (and can leave
you with little time to investigate such problems since it has such
abysmal performance). These safety and performance issues cannot be
backward compatibly fixed and as such, its use is not recommended.
Please use an alternative history filtering tool such as git
filter-repo[1]. If you still need to use git filter-branch, please
carefully read the section called “SAFETY” (and the section called
“PERFORMANCE”) to learn about the land mines of filter-branch, and
then vigilantly avoid as many of the hazards listed there as
reasonably possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I read a lot of documentation: manpages, infopages, html-manuals, api-references, docstrings and (occasionaly) even as books.
But I don&amp;rsquo;t remember reading about a piece of software that tries so hard to convince you to not use it, while simultaneously being available on nearly every computer in the world.&lt;/p&gt;
&lt;p&gt;I found that quite amusing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hide the tmux statusbar if only one window is used</title>
      <link>https://schauderbasis.de/posts/hide_tmux_status_bar_if_its_not_needed/</link>
      <pubDate>Fri, 13 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/hide_tmux_status_bar_if_its_not_needed/</guid>
      <description>&lt;h2 id=&#34;what&#34;&gt;What?&lt;/h2&gt;
&lt;p&gt;I want the tmux statusbar to show only if I have multiple tmux-windows open.
When only one tmux-window is open, then the status bar should be hidden.&lt;/p&gt;
&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;
&lt;p&gt;I like tmux, it is awesome.
But I don&amp;rsquo;t use it in most shell sesssions.&lt;/p&gt;
&lt;p&gt;My window manager (&lt;a href=&#34;https://swaywm.org/&#34;&gt;swaywm&lt;/a&gt;)
is very good at creating and closing terminals.
I often spawn them for a quick command and close them after a few seconds.
So most of the time I do &lt;em&gt;not need&lt;/em&gt; tmux in my terminals.&lt;/p&gt;
&lt;p&gt;On the other hand, tmux features a big shiny green statusbar.
That is usefull if I want to manage multiple tmux-windows.
But if I don&amp;rsquo;t do that, then the status bar is distracting and takes up valueable space.
Therefore I do &lt;em&gt;not want&lt;/em&gt; that in every terminal I spawn.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;wasted_space.png&#34; alt=&#34;The statusbar is using up valuable space in my terminal.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Then again sometimes I am kneedeep into some project
and then would like to use some tmux features.
But at that time it is somewhat too late.&lt;/p&gt;
&lt;p&gt;The best solution would be to have tmux running in every terminal,
but have the status bar only show up if I start using multiple tmux-windows.&lt;/p&gt;
&lt;h2 id=&#34;how&#34;&gt;How?&lt;/h2&gt;
&lt;p&gt;Showing or hiding the statusbar permanently is as easy as
adding one of the following lines to the tmux config file:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;set -g status on
set -g status off
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;full_of_potential.png&#34; alt=&#34;The status bar is gone, the terminal is empty and full of potential&#34;&gt;&lt;/p&gt;
&lt;p&gt;I was supprised to find out that automatically hiding the status bar doesn&amp;rsquo;t seem to be a very common thing to want.
I didn&amp;rsquo;t find much on this, but it was quickly clear that I would have to
use &lt;a href=&#34;https://man.openbsd.org/OpenBSD-current/man1/tmux.1#HOOKS&#34;&gt;hooks&lt;/a&gt;
and &lt;a href=&#34;https://man.openbsd.org/OpenBSD-current/man1/tmux.1#FORMATS&#34;&gt;conditionals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then I found a &lt;a href=&#34;https://github.com/tmux/tmux/issues/659&#34;&gt;github issue&lt;/a&gt; about my very usecase.
The solution they suggested did only work half of the time unfortunatelly.
(It failed to hide the statusbar when you would
have multiple windows and start closing them from the left.)
But I did manage to get it working by adding more hooks.&lt;/p&gt;
&lt;p&gt;Here is the relevant part of my tmux.conf&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# only show status bar if there is more then one window
set -g status off
set-hook -g after-new-window      &amp;#39;if &amp;#34;[ #{session_windows} -gt 1 ]&amp;#34; &amp;#34;set status on&amp;#34;&amp;#39;
set-hook -g after-kill-pane       &amp;#39;if &amp;#34;[ #{session_windows} -lt 2 ]&amp;#34; &amp;#34;set status off&amp;#34;&amp;#39;
set-hook -g pane-exited           &amp;#39;if &amp;#34;[ #{session_windows} -lt 2 ]&amp;#34; &amp;#34;set status off&amp;#34;&amp;#39;
set-hook -g window-layout-changed &amp;#39;if &amp;#34;[ #{session_windows} -lt 2 ]&amp;#34; &amp;#34;set status off&amp;#34;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;multiple_windows.png&#34; alt=&#34;Multiple windows make the status bar show up.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hooks are a bit of a pain in tmux,
I wasn&amp;rsquo;t able to get a list of all active hooks.
Closing the tmux session wouldn&amp;rsquo;t reset the hooks already set.
So I had to reset the hooks by killing tmux (not just the session, tmux itself).&lt;/p&gt;
&lt;h2 id=&#34;done&#34;&gt;Done&lt;/h2&gt;
&lt;p&gt;So now I can have tmux active in every terminal I open.
It won&amp;rsquo;t show the status bar if it is not needed, only if I have more then one window.
I am quite happy with this new setup.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I quit Social Media</title>
      <link>https://schauderbasis.de/posts/i_quit_social_media/</link>
      <pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/i_quit_social_media/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I get addicted to social media quite easily.
It doesn&amp;rsquo;t do me good, I tend to sink a lot of time into it.&lt;/p&gt;
&lt;p&gt;I usually use only one network at a time.
I have had accounts on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Facebook&lt;/em&gt;: because all my classmates were there&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Twitter&lt;/em&gt;: because people there were so funny&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/App.net&#34;&gt;App.net&lt;/a&gt;&lt;/em&gt;: because Tim Pritlove promoted it&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Reddit&lt;/em&gt;: (because many interesting communities live there)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of those was hard for me to quit.&lt;/p&gt;
&lt;p&gt;I also tipped my toes into the Fediverse,
a collection of decentralized social networks:
&lt;a href=&#34;https://gnu.io/social/&#34;&gt;GNU social&lt;/a&gt; (almost the same as &lt;a href=&#34;https://joinmastodon.org/&#34;&gt;Mastodon&lt;/a&gt; today) and &lt;a href=&#34;https://friendi.ca/&#34;&gt;Friendica&lt;/a&gt; (which I even hosted myself).
While there were some very interesting communities there
(mostly nerds and trans-people) I never got hooked enough to stay.
The reason might be that those networks don&amp;rsquo;t work so hard to make you addicted to them,
which is a good thing.&lt;/p&gt;
&lt;h2 id=&#34;what-i-didnt-quit-yet&#34;&gt;What I didn&amp;rsquo;t quit yet&lt;/h2&gt;
&lt;p&gt;I still watch a lot of &lt;strong&gt;Youtube&lt;/strong&gt;, but I don&amp;rsquo;t &amp;ldquo;like&amp;rdquo;, &amp;ldquo;subscribe&amp;rdquo; or &amp;ldquo;comment&amp;rdquo; there,
so it is not really a &lt;em&gt;social&lt;/em&gt; medium for me, just a medium.
I use it as a portal for video-podcasts.
At some point I will probably have to reduce this, too.&lt;/p&gt;
&lt;p&gt;I read &lt;em&gt;a lot&lt;/em&gt; of &lt;strong&gt;Blogs&lt;/strong&gt; (and similars) via my feedreader.
The open web is just the best.
And I don&amp;rsquo;t think I will ever want to stop that.
My share of it is &lt;a href=&#34;https://schauderbasis.de&#34;&gt;this blog&lt;/a&gt; you are reading right now.&lt;/p&gt;
&lt;p&gt;I do use &lt;strong&gt;mail&lt;/strong&gt;, &lt;strong&gt;messenging&lt;/strong&gt; and &lt;strong&gt;phones&lt;/strong&gt;.
But those are not social media to me, I would call them social networks.&lt;/p&gt;
&lt;h2 id=&#34;how-to-quit&#34;&gt;How to quit&lt;/h2&gt;
&lt;p&gt;From time to time I realize that I have a problem with an addictive website. And some time later I get a &amp;ldquo;It&amp;rsquo;s time to quit&amp;rdquo;-moment.
What works for me then is quiting cold turkey, by doing some of those:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log out on every device&lt;/li&gt;
&lt;li&gt;Delete the account&lt;/li&gt;
&lt;li&gt;Delete the site from my browser history (so I don&amp;rsquo;t get suggestions when typing an url)&lt;/li&gt;
&lt;li&gt;Block the site via DNS&lt;/li&gt;
&lt;li&gt;Tell my wife/friends that I quit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This has worked well for me, and after a week or so I rarely feel the need to go back.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blogging on mobile</title>
      <link>https://schauderbasis.de/posts/blogging_on_mobile/</link>
      <pubDate>Fri, 05 Aug 2022 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/blogging_on_mobile/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I want to write and publish blog posts from my mobile (which is running Android).&lt;/p&gt;
&lt;h1 id=&#34;what-is-needed&#34;&gt;what is needed&lt;/h1&gt;
&lt;p&gt;Since this blog is being generated using a SSG in a CI from markdown files which life in a repo, this means I need to do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone a private repo from gitlab&lt;/li&gt;
&lt;li&gt;Add markdown/image files to the existing ones and edit them.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt; those files to the repo and &lt;code&gt;git push&lt;/code&gt; it to origin.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The CI will do the  building and publishing itself then.&lt;/p&gt;
&lt;p&gt;I want to use only free software if possible.
Especially I don&amp;rsquo;t want to use any google services like the Playstore.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go through the points inorder:&lt;/p&gt;
&lt;h2 id=&#34;1-clone-a-private-repo-from-gitlab&#34;&gt;1. Clone a (private) repo from gitlab&lt;/h2&gt;
&lt;p&gt;I was optimistic that there would be a capable git client on fdroid, but I couldn&amp;rsquo;t find anything suitable.
There are some vendor specific clients (like &lt;a href=&#34;https://f-droid.org/packages/org.mian.gitnex/&#34;&gt;GitNex for Gitea&lt;/a&gt;)
and &lt;a href=&#34;https://github.com/git-touch/git-touch&#34;&gt;git-touch&lt;/a&gt; looked promising (but turned out to be a tool for managing accounts, not repos)&lt;/p&gt;
&lt;p&gt;So I went for tmux (basically a terminal with a shell for Android) and installed git by hand.
It doesn&amp;rsquo;t feel very polished for mobile but at least it is a shell and I can do what I want there.&lt;/p&gt;
&lt;p&gt;To authenticate against gitlab I created a personal access token with the scope &amp;ldquo;read_repository&amp;rdquo; and &amp;ldquo;write_repository&amp;rdquo;.
Then I could use special &lt;a href=&#34;https://stackoverflow.com/a/47471056&#34;&gt;gitlab-magic-syntax&lt;/a&gt; to use this token in the branches path:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://gitlab-ci-token:{TOKEN}@gitlab.com/Kaligule/schauderbasis.git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There I had my repo.&lt;/p&gt;
&lt;h2 id=&#34;2-add-images-and-markdown-files&#34;&gt;2. Add images and markdown files&lt;/h2&gt;
&lt;p&gt;There are plenty of useful image-/markdown-editors on fdroid.
&lt;a href=&#34;https://billthefarmer.github.io/notes&#34;&gt;Notes&lt;/a&gt; seems to fit my usecase very well.&lt;/p&gt;
&lt;p&gt;I had some difficulties getting the paths right in tmux.
I chose to blame android and java for this.
&lt;a href=&#34;https://android.stackexchange.com/questions/166538/where-is-the-folder-that-termux-defaults-to#185949&#34;&gt;Long story&lt;/a&gt; short: I had to call&lt;/p&gt;
&lt;p&gt;&lt;code&gt;termux-setup-storage&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;in termux and move the repo into what android seems to use instead of a home directory.
Strange.
But now all the apps can agree on where the repo is.&lt;/p&gt;
&lt;h2 id=&#34;3-perform-a-git-add-and-git-push&#34;&gt;3. Perform a &lt;code&gt;git add&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;We basically did all the work in step 1.
Just fire up tmux and type.
I didn&amp;rsquo;t find an app that could even do these simple tasks.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;screenshot.png&#34; alt=&#34;screenshot&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;this-post-is-a-proof-of-concept&#34;&gt;this post is a proof of concept&lt;/h2&gt;
&lt;p&gt;Literally.
I did this whole post on my mobile.&lt;/p&gt;
&lt;h2 id=&#34;it-doesnt-feel-great&#34;&gt;it doesn&amp;rsquo;t feel great&lt;/h2&gt;
&lt;p&gt;Honestly, it works but it still sucks.
Working with a touch keyboard as the main driver on every step is no fun.
But at least everything is under control and I can replace the tools until I am happy with them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Write a program that reproduces itself</title>
      <link>https://schauderbasis.de/posts/quine/</link>
      <pubDate>Thu, 21 Jul 2022 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/quine/</guid>
      <description>
&lt;p&gt;
If you like to program, here is a neat little excercise:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write a program that outputs it&amp;#39;s own source code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
It is really fun, you should try it now.
For me it is the kind of excercise that won&amp;#39;t leave your head once you have written the first line of code.&lt;/p&gt;
&lt;p&gt;
Spoilers ahead.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
How I did it
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-2&#34;&gt;
Python
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
I am most fluent in python, so that&amp;#39;s what I tried first.
After some trial and error I had this, which got me pretty close:&lt;/p&gt;
&lt;div class=&#34;src src-python&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;var&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;x&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;var&lt;span style=&#34;color:#e6db74&#34;&gt;=}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;print(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;var&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&#34;example&#34;&gt;
var=&amp;#39;x&amp;#39;
print(x)
&lt;/pre&gt;
&lt;p&gt;
Now all I had to do was to find good value for &lt;code&gt;var&lt;/code&gt; and hope that the escaping would work out.
I ended up with this.&lt;/p&gt;
&lt;div class=&#34;src src-python&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;var&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;print(f&amp;#34;{var=}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{var}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;var&lt;span style=&#34;color:#e6db74&#34;&gt;=}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;var&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&#34;example&#34;&gt;
var=&amp;#39;print(f&amp;#34;{var=}\\n{var}&amp;#34;)&amp;#39;
print(f&amp;#34;{var=}\n{var}&amp;#34;)
&lt;/pre&gt;
&lt;p&gt;
You can check that this really does output it&amp;#39;s own source code by putting it into a file and running (in &lt;code&gt;bash&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diff code.py &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;python code.py&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Success&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This was fun, but I did use a bit of f-string magic.
Can we get a similar solution in another language?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
sh
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Solving a problem in a shell-script is either really easy or really hard.
Lets find out:&lt;/p&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;var&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;x&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;var=&amp;#39;&lt;/span&gt;$var&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\n&lt;/span&gt;$var&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&#34;example&#34;&gt;
var=&amp;#39;x&amp;#39;
x
&lt;/pre&gt;
&lt;p&gt;
The first attempt works reasonably well,
but when we replace the string &lt;code&gt;x&lt;/code&gt; with &lt;code&gt;echo -e &amp;#34;var=&amp;#39;$var&amp;#39;\n$var&amp;#34;&lt;/code&gt; then we get into trouble.&lt;/p&gt;
&lt;div class=&#34;src src-sh&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;var&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;echo -e &amp;#34;var=&amp;#39;&lt;/span&gt;$var&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\n$var&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;var=&amp;#39;&lt;/span&gt;$var&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\n&lt;/span&gt;$var&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&#34;example&#34;&gt;
var=&amp;#39;echo -e &amp;#34;var=
$var&amp;#34;&amp;#39;
echo -e &amp;#34;var=
$var&amp;#34;
&lt;/pre&gt;
&lt;p&gt;
As always when you work with complicated strings in shell scripts,
escaping special characters becomes unreasonable difficult.&lt;/p&gt;
&lt;p&gt;
In the end, I couldn&amp;#39;t get it to work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
How to google it
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
A program that prints it&amp;#39;s own source code is called a &lt;strong&gt;quine&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
You may now google it, or just read the &lt;a href=&#34;https://en.wikipedia.org/wiki/Quine_%28computing%29&#34;&gt;wikipedia article&lt;/a&gt; (which is great).
I especially enjoyed the &lt;em&gt;cheating&lt;/em&gt; section,
where it mentioned that an empty program is technically a valid quine,
as it outputs nothing when executed.&lt;/p&gt;
&lt;p&gt;
There is also &lt;a href=&#34;https://rosettacode.org/wiki/Quine&#34;&gt;rosetta code&lt;/a&gt;, which lists many solutions that I don&amp;#39;t understand and some cheats.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>How much control over the problem do you have?</title>
      <link>https://schauderbasis.de/posts/problem-under-control-scale/</link>
      <pubDate>Tue, 19 Jul 2022 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/problem-under-control-scale/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;There is a problem and a team who should do something about it.
That team wants to communicate to others &lt;strong&gt;how much control over the problem&lt;/strong&gt; they have.
So they draw a scale, we will call it the &lt;strong&gt;problem-under-control-scale&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here are some points they might mark on it (sorted roughly from bad to good):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We don&amp;rsquo;t know there is a problem.&lt;/li&gt;
&lt;li&gt;We suspect there is a problem.&lt;/li&gt;
&lt;li&gt;We know there is a problem.&lt;/li&gt;
&lt;li&gt;We know there is a problem and how bad it is.&lt;/li&gt;
&lt;li&gt;We know there is a problem and how to find out more about it.&lt;/li&gt;
&lt;li&gt;We know where the cause of the problem lies.&lt;/li&gt;
&lt;li&gt;We were able to reproduce the problem.&lt;/li&gt;
&lt;li&gt;We know the cause of the problem.&lt;/li&gt;
&lt;li&gt;We understand the problem.&lt;/li&gt;
&lt;li&gt;We are looking for solutions.&lt;/li&gt;
&lt;li&gt;We know there is a solution.&lt;/li&gt;
&lt;li&gt;We know where to find a solution.&lt;/li&gt;
&lt;li&gt;We have an idea how a solution might look like.&lt;/li&gt;
&lt;li&gt;We are choosing between multiple apparent solutions.&lt;/li&gt;
&lt;li&gt;We know how we want to solve the problem.&lt;/li&gt;
&lt;li&gt;We are implementing a solution.&lt;/li&gt;
&lt;li&gt;We are testing a solution.&lt;/li&gt;
&lt;li&gt;We have solved the problem for now.&lt;/li&gt;
&lt;li&gt;We have solved the problem.&lt;/li&gt;
&lt;li&gt;We have solved the problem and learned from it.&lt;/li&gt;
&lt;li&gt;We have solved the problem and documented our learnings.&lt;/li&gt;
&lt;li&gt;We made sure problems like this can be solved easily in the future.&lt;/li&gt;
&lt;li&gt;We made sure problems like this can not happen anymore.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(I am sure there are more possible steps.
For example, what if additional help is needed at any point?)&lt;/p&gt;
&lt;h2 id=&#34;what-to-use-the-problem-under-control-scale-for&#34;&gt;What to use the problem-under-control-scale for&lt;/h2&gt;
&lt;p&gt;I like this problem-under-control-scale, because it allows to think about problems in an abstract way.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of my favorite topics for talks/blogpost is &amp;ldquo;How we once improved our position on that scale&amp;rdquo;.
For example:
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;How we went from &lt;code&gt;We know there is a problem.&lt;/code&gt; to &lt;code&gt;We have solved the problem.&lt;/code&gt;.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In your teams&amp;rsquo; update meeting you probably like to talk about &lt;code&gt;We are choosing between multiple apparent solutions.&lt;/code&gt; or better.
But really important would be to talk about everything worse then &lt;code&gt;We understand the problem.&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Quite often people stop when they got to &lt;code&gt;We have solved the problem for now.&lt;/code&gt;,
when they really should push further down the scale.&lt;/li&gt;
&lt;li&gt;Open your favorite news-site.
Most of them articles will be about problems.
At which point are they on the problem-under-control-scale?&lt;/li&gt;
&lt;li&gt;You could also try to categorize posts on social media this way.&lt;/li&gt;
&lt;li&gt;Note how the first third of the scale doesn&amp;rsquo;t mention solutions at all.
Don&amp;rsquo;t jump to solutions straight away.
Sometimes knowing the problem might even be enough.&lt;/li&gt;
&lt;li&gt;Most ads try to sell you a solution to a problem you didn&amp;rsquo;t really have
(at least you made it so far without the advertised product).
So they have to get you from &lt;code&gt;We don’t know there is a problem.&lt;/code&gt; all the way to at least &lt;code&gt;We know where to find a solution.&lt;/code&gt;
(but not accidentally to &lt;code&gt;We have solved the problem for now.&lt;/code&gt; or better, because that wouldn&amp;rsquo;t sell anything).
Try to see how they manage that next time you see an ad.&lt;/li&gt;
&lt;li&gt;Most jobs pay so the employee solves some kind of problem.
When you get a problem to deal with, where is it on the &lt;code&gt;problem-under-control-scale&lt;/code&gt;?
Close to &lt;code&gt;We suspect there is a problem.&lt;/code&gt;?
(You are a detective then, cool!)
Or more at &lt;code&gt;We know how we want to solve the problem.&lt;/code&gt;?
(&amp;hellip; and we want you to implement that solution)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-else-could-we-do-with-the-scale&#34;&gt;What else could we do with the scale?&lt;/h2&gt;
&lt;p&gt;I think you could get some nice graphs if you pair the problem-under-control-scale with some other scale.
Time perhaps?
Or costs?
Expertise_needed?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;graph.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;You would then plot the the course of your problems on the resulting coordinate system.
This could help to answer questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which step in the problem solving journey takes the most time/effort?&lt;/li&gt;
&lt;li&gt;Where do you get stuck most often?&lt;/li&gt;
&lt;li&gt;Should you perhaps approach your problems in a different way to get stuck less often?&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Meine Quellen für die Welt der freien Software</title>
      <link>https://schauderbasis.de/posts/meine-quellen-fuer-freie-software/</link>
      <pubDate>Tue, 31 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/meine-quellen-fuer-freie-software/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Ich komme zur Zeit nicht viel zum schreiben.
Dafür gibts gute Gründe, aber manchmal macht es mir etwas aus.
Es ist auch nicht so, dass es nichts zu erzählen gäbe, aber die Zeit&amp;hellip;&lt;/p&gt;
&lt;p&gt;Naja, hier ist eine kurze Liste von Feeds,
mit denen ich mit der Welt der freien Software in Kontakt bleibe.
Selbst dann, wenn ich wenig Zeit habe.&lt;/p&gt;
&lt;p&gt;Blogs, die häufig geupdated werden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gnulinux.ch&#34;&gt;GNU/Linux.ch&lt;/a&gt;:
Meine Lieblingsnewseite zur Zeit.
Sehr offene Community, richtig stark.
Für mich ist es ein gefühlter Nachfolger von &lt;a href=&#34;https://www.pro-linux.de/&#34;&gt;Pro-Linux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxnews.de/&#34;&gt;Linux News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sachachua.com/blog/category/emacs-news/&#34;&gt;Emacs news&lt;/a&gt; (english):
Die Emacs Community ist stark, aber auf viele Plattformen verteilt.
Die unsterbliche Sacha Chua sammelt einmal die Woche alle interessante Sachen zusammen.
Podcasts:&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.binaergewitter.de/&#34;&gt;Binaergewitter&lt;/a&gt;:
Laberrunde mit fittem Team, die viel Informationen zusammentragen und einordnen.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pythonbytes.fm/&#34;&gt;Python bytes&lt;/a&gt; (english):
Die finden alles amazing, solange nur das Wort &amp;ldquo;Python&amp;rdquo; darin vorkommt.
In eigentlich jedem Podcast sind ein oder zwei feine Fundstücke drin.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.radiotux.de/&#34;&gt;Radio Tux&lt;/a&gt;:
Fühlt sich ein bisschen wie ein Magazin an.
Auf dem Radar:&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://lwn.net/&#34;&gt;LinuxWeeklyNews&lt;/a&gt; (english):
Einer der sehr wenigen bezahlten Feeds, die für mich attraktiv sind.
Sehr technisch und sehr in die Tiefe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Außerdem floge ich noch etwa 150 privaten Blogs
(zb
&lt;a href=&#34;https://xeiaso.net/blog&#34;&gt;Xe Iaso&lt;/a&gt;,
&lt;a href=&#34;https://drewdevault.com/&#34;&gt;Drew DeVault&lt;/a&gt;,
&lt;a href=&#34;https://blog.briancmoses.com&#34;&gt;Brian Moses&lt;/a&gt;
)
und den &amp;ldquo;offiziellen&amp;rdquo; Blogs von etwa 80 Projekten, die mich speziell interessieren
(zb
&lt;a href=&#34;https://godotengine.org/news&#34;&gt;Godot&lt;/a&gt;,
&lt;a href=&#34;https://blog.thunderbird.net/&#34;&gt;Thunderbird&lt;/a&gt;,
&lt;a href=&#34;https://neovim.io/news&#34;&gt;Neovim&lt;/a&gt;
)
Jeder schreibt selten, aber zusammengenommen gibt es jeden Tag was zu lesen.&lt;/p&gt;
&lt;p&gt;(So vielen Quellen gleichzeitig zu folgen ist natürlich nur möglich,
wenn man RSS/Atom-Feeds benutzt.)&lt;/p&gt;
&lt;p&gt;Wenn ich das hier so aufschreibe fällt mir auf,
dass fast alle deutschsprachig sind.
Eigentlich cool, dass es da so viel deutsches Material gibt.
Ich wäre aber auch an mehr guten englischsprachigen Blogs interessiert.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I wrote a hugo theme</title>
      <link>https://schauderbasis.de/posts/i_wrote_a_hugo_theme/</link>
      <pubDate>Wed, 12 Jan 2022 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/i_wrote_a_hugo_theme/</guid>
      <description>&lt;p&gt;I just love the concept of static site generators  (SSG) for websites.
They allow to separate content and presentation really cleanly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;content is defined in some textfiles using some markup language&lt;/li&gt;
&lt;li&gt;the presentation is defined in
&lt;ul&gt;
&lt;li&gt;a configuration file that sets some global metadata&lt;/li&gt;
&lt;li&gt;a theme, which is mainly a bunch of templates and css and potentially some JavaScript.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My blog has been generated using a SSG (namely hugo) for a long time, during which I switched between quite a few themes.&lt;/p&gt;
&lt;h2 id=&#34;the-most-minimal-theme&#34;&gt;the most minimal theme&lt;/h2&gt;
&lt;p&gt;I always wanted a blog-theme that was as simple as possible.
There are a lot to try, but I never found something that fitted me perfectly.
I don&amp;rsquo;t want Integration of Google Analytics or Disqus or any other third party.
I don&amp;rsquo;t want to need a cookie banner because I don&amp;rsquo;t use any cookies.
This is not a social media platform, it is a blog and I started it for a reason.&lt;/p&gt;
&lt;p&gt;But I was also aware of how little I know about JavaScript and CSS.
And about design.
So building a theme myself seemed to be out of reach for me.&lt;/p&gt;
&lt;p&gt;But then, some time ago I revisited
&lt;a href=&#34;https://motherfuckingwebsite.com/&#34;&gt;motherfuckingwebsite&lt;/a&gt;
(and it&amp;rsquo;s many &lt;a href=&#34;https://bettermotherfuckingwebsite.com/&#34;&gt;successors&lt;/a&gt;)
and even though I can see the satire I wanted my blog to be somewhat like that.
This seemed doable.&lt;/p&gt;
&lt;p&gt;So I wrote some html-templates.
It worked somewhat well but there was no denying that the black-and-white aesthetics of bare HTML was hard on the eyes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;bare_html.png&#34; alt=&#34;bare html is hard on the eyes&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;nice-css-that-i-dont-have-to-write-myself&#34;&gt;nice css that I don&amp;rsquo;t have to write myself&lt;/h2&gt;
&lt;p&gt;Around that time I rediscovered &lt;a href=&#34;https://github.com/dbohdan/classless-css&#34;&gt;classless css themes&lt;/a&gt;.
Basically a classless css theme is a bit of css that is designed to make generic HTML look good.
Generic HTML means that there don&amp;rsquo;t need to be special classes in it, just the standardized html5 tags.
There are quite a lot of these themes available on the internet, most under free licenses.
This was exactly what I needed.&lt;/p&gt;
&lt;p&gt;I added a single configuration setting to my theme:
It determines which classless theme you want to use.
I added a sensible default and documented everything.
I also let the user of the theme decide whether they want to load it from the web on each visit or whether they want to host it themselves.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;demo_site.png&#34; alt=&#34;nice css that I didn&amp;rsquo;t have to write myself&#34;&gt;&lt;/p&gt;
&lt;p&gt;And there we are: &lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog&#34;&gt;A theme for Hugo.&lt;/a&gt;
Flexible in it&amp;rsquo;s looks, minimal in it&amp;rsquo;s design and beautiful in my opinion.&lt;/p&gt;
&lt;h2 id=&#34;some-things-i-learned-on-the-way&#34;&gt;Some things I learned on the way&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTML is really expressive.
I had assumed that markdown was about as powerful as Markdown.
I was clearly wrong: there are &lt;a href=&#34;https://www.w3schools.com/tags/&#34;&gt;soo many HTML tags&lt;/a&gt; for all sorts of things.
My favourite finds include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.w3schools.com/tags/tag_abbr.asp&#34;&gt;&lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.w3schools.com/tags/tag_time.asp&#34;&gt;&lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.w3schools.com/tags/tag_summary.asp&#34;&gt;&lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gohugo.io/documentation/&#34;&gt;Hugo&amp;rsquo;s documentation&lt;/a&gt; is hard to use.
I really wish it was decided into different sections for what I assume are it&amp;rsquo;s three main target groups:
website-builders, theme-builders and hugo-developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I really wished to find a set of best-practices for building themes.
Instead you are on your own with all the opinions of the internet as your best guideline.
This also shows when you try to switch between themes:
You almost always have to adapt some config that is specific to the implementation of that theme only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The theme format and ecosystem of Hugo both have great parts that are simple and powerful
(like the &lt;code&gt;theme.toml&lt;/code&gt; or how the &lt;code&gt;layouts&lt;/code&gt; directory is structured).
Other parts look like the result of yearlong growth and people doing &amp;ldquo;whatever works&amp;rdquo;
(like the requirements for themes).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the demo site I needed some cool images.
I found a lot on &lt;a href=&#34;https://unsplash.com/&#34;&gt;unsplash&lt;/a&gt; and it was fun to collect unrelated images that fit together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is hard for me to know if a site is accessible or not.
There are some web services that will score your site automatically, but I &lt;a href=&#34;https://accessibility.blog.gov.uk/2017/02/24/what-we-found-when-we-tested-tools-on-the-worlds-least-accessible-webpage/&#34;&gt;don&amp;rsquo;t really trust those&lt;/a&gt;.
So for now I will just browse the site with a command line browser (lynx or w3m) and if that works well I feel like I have done enough.
I am especially happy about constructive feedback in the point.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;putting together a theme is one thing, finishing it as a project is a lot more work.
You know, like doing
a &lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog/&#34;&gt;public repository&lt;/a&gt;,
the &lt;a href=&#34;https://kaligule.gitlab.io/classless-blog&#34;&gt;demo site&lt;/a&gt;
with nice pictures under &lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog/-/blob/main/exampleSite/README.md#sources&#34;&gt;free licenses&lt;/a&gt;,
the &lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog/-/blob/main/Readme.md&#34;&gt;documentation&lt;/a&gt;,
a &lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog/-/blob/main/LICENSE&#34;&gt;license&lt;/a&gt;,
&lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog/-/merge_requests/1&#34;&gt;testing&lt;/a&gt;,
&lt;a href=&#34;https://gitlab.com/Kaligule/classless-blog/-/pipelines&#34;&gt;CI/CD&lt;/a&gt;
etc.
But having done all that also means that I can be sure that it will continue to be usefull AS it is,
not just a bunch oft dead code that nobody can get to work anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>reformat paragraph</title>
      <link>https://schauderbasis.de/posts/reformat_paragraph/</link>
      <pubDate>Fri, 27 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/reformat_paragraph/</guid>
      <description>
&lt;p&gt;
Lets say we have a paragraph&lt;sup class=&#34;footnote-reference&#34;&gt;&lt;a id=&#34;footnote-reference-1&#34; href=&#34;#footnote-1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;
of plain text - probably in a markup language like Markdown, Orgmode,
Asciidoc or LaTeX.&lt;/p&gt;
&lt;p&gt;
Then there are 4 sensible ways this paragraph can be formated:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;
unfilled
&lt;/dt&gt;
&lt;dd&gt;Everything is in one line. This can be achieved using the
function &lt;code&gt;unfill-paragraph&lt;/code&gt; in &lt;a href=&#34;https://github.com/purcell/unfill&#34;&gt;purcells unfill package&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;
filled
&lt;/dt&gt;
&lt;dd&gt;Every line has at most &lt;code&gt;x&lt;/code&gt; characters &lt;sup class=&#34;footnote-reference&#34;&gt;&lt;a id=&#34;footnote-reference-2&#34; href=&#34;#footnote-2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.
This makes a mass of text look uniform and prevents horizontal
scrolling. This can be achieved with the function &lt;code&gt;fill-paragraph&lt;/code&gt;.&lt;/dd&gt;
&lt;dt&gt;
one-sentence-per-line
&lt;/dt&gt;
&lt;dd&gt;This works very well for version controll,
especially if the text is in some markup language. Diffs of small
changes look very nice and readable. This format can be achieved
with the custom function fill-senteces-in-paragraph I wrote
below&lt;sup class=&#34;footnote-reference&#34;&gt;&lt;a id=&#34;footnote-reference-3&#34; href=&#34;#footnote-3&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/dd&gt;
&lt;dt&gt;
custom
&lt;/dt&gt;
&lt;dd&gt;If the author wants it in his very specific way then
nothing should stop him from formatting his text as they wants.
Obviously this can not be done by the editor.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Here is an example of how they would look like in a text:&lt;/p&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unfilled: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam. Quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filled: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ad minim veniam. Quis nostrud exercitation ullamco laboris nisi ut
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aliquip ex ea commodo consequat.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;One sentence per line: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ut enim ad minim veniam.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Custom: Lorem ipsum dolor sit amet,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;consectetur adipiscing elit.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sed do eiusmod tempor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;incididunt ut
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;labore et
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dolore magna
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aliqua. Ut enim ad
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;minim veniam. Quis nostrud
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;exercitation ullamco laboris nisi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ut aliquip ex ea commodo consequat.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
So the first 3 formates can be done by emacs directly. Building on the
results of the article &lt;a href=&#34;https://endlessparentheses.com/fill-and-unfill-paragraphs-with-a-single-key.html&#34;&gt;&amp;#34;Fill and unfill paragraphs with a single key&amp;#34;
on &lt;a href=&#34;https://endlessparentheses.com&#34;&gt;https://endlessparentheses.com&lt;/a&gt;&lt;/a&gt; I want a single keybinding (&lt;code&gt;M-q&lt;/code&gt;)
that cycles the paragraph through all of those fomattings.&lt;/p&gt;
&lt;p&gt;
This is great for 4 reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can keep my existing muscle memory where &lt;code&gt;M-q&lt;/code&gt; is
&lt;code&gt;fill-paragraph&lt;/code&gt;, because we are basically building an extention to
that command.&lt;/li&gt;
&lt;li&gt;We don&amp;#39;t loose functionality because there is no reason to call
&lt;code&gt;fill-paragraph&lt;/code&gt; multiple times in a row anyways&lt;sup class=&#34;footnote-reference&#34;&gt;&lt;a id=&#34;footnote-reference-4&#34; href=&#34;#footnote-4&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;I only have to commit a single keybinding for reformating
(keybindings are hard to remember well and short keybindings are
rare for emacs users).&lt;/li&gt;
&lt;li&gt;I can repeatedly press the &lt;code&gt;M-q&lt;/code&gt; until I like the formating. This
allows me to go through the formattings quickly and see what I like
best.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having one keybinding cycling the text through different states is not very common in emacs, but it is not unheared of either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;recenter-top-bottom&lt;/code&gt; (bound to &lt;code&gt;C-l&lt;/code&gt; by default) cycles through different views of the same buffer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;org-cycle&lt;/code&gt; (bound to &lt;code&gt;TAB&lt;/code&gt; in orgmode) does rotate through different views of subtrees.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So lets try to build this.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Get all the formating functions
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
First we need to have a funtion for each format that reformats the
current paragraph into that format.&lt;/p&gt;
&lt;p&gt;
The function &lt;strong&gt;fill-paragraph&lt;/strong&gt; is conviniently built into emacs.
For &lt;strong&gt;unfill-paragraph&lt;/strong&gt; we can just use this package.&lt;/p&gt;
&lt;div class=&#34;src src-emacs-lisp&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(use-package unfill)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now &lt;strong&gt;fill-sentences-in-paragraph&lt;/strong&gt; we will have to write ourselfs:&lt;/p&gt;
&lt;div class=&#34;src src-emacs-lisp&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun fill-sentences-in-paragraph ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Put a newline at the end of each sentence in the current paragraph.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (save-excursion
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (mark-paragraph)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;call-interactively&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fill-sentences-in-region&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun fill-sentences-in-region (start end)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Put a newline at the end of each sentence in the region maked by (start end).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*r&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;call-interactively&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;unfill-region&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (save-excursion
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;goto-char&lt;/span&gt; start)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (while (&lt;span style=&#34;color:#a6e22e&#34;&gt;&amp;lt;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;point&lt;/span&gt;) end)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (forward-sentence)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (if (looking-at-p &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (newline-and-indent)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Note that using &lt;code&gt;forward sentence&lt;/code&gt; means that emacs needs to know how your sentences look like.
Read &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/emacs/Sentences.html&#34;&gt;the documentation on sentences&lt;/a&gt;, especially the part where sentences are/aren&amp;#39;t followed by a double space&lt;sup class=&#34;footnote-reference&#34;&gt;&lt;a id=&#34;footnote-reference-5&#34; href=&#34;#footnote-5&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Cycling through the functions.
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
Now we need a function that behaves different on consequtive calls.&lt;/p&gt;
&lt;div class=&#34;src src-emacs-lisp&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defvar repetition-counter &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;How often cycle-on-repetition was called in a row using the same command.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun cycle-on-repetition (list-of-expressions)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Return the first element from the list on the first call,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   the second expression on the second consecutive call etc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (if (&lt;span style=&#34;color:#a6e22e&#34;&gt;equal&lt;/span&gt; this-command last-command)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (setq repetition-counter (&lt;span style=&#34;color:#a6e22e&#34;&gt;+&lt;/span&gt; repetition-counter &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)) &lt;span style=&#34;color:#75715e&#34;&gt;;; then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (setq repetition-counter &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;;; else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;nth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;color:#a6e22e&#34;&gt;mod&lt;/span&gt; repetition-counter (&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; list-of-expressions))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   list-of-expressions) &lt;span style=&#34;color:#75715e&#34;&gt;;; implicit return of the last evaluated value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
We can try this out by running &lt;code&gt;(cycle-on-perpitition &amp;#39;(&amp;#34;a&amp;#34; &amp;#34;b&amp;#34; &amp;#34;c&amp;#34;))&lt;/code&gt; a few times.
The result is (as expected): &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt; …&lt;/p&gt;
&lt;p&gt;
I especially like the thought that even though &lt;code&gt;repetition-counter&lt;/code&gt; is a
global variable and there is only one of them, we can use
&lt;code&gt;cycle-on-repetition&lt;/code&gt; in different commands and the &lt;code&gt;repetition-counter&lt;/code&gt;
will only ever count the repeats of the last envoked command. That is
because the switch is detected when &lt;code&gt;this-command&lt;/code&gt; and &lt;code&gt;last-command&lt;/code&gt;
are compared.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Putting it together
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Now we can use a list of &lt;em&gt;functions&lt;/em&gt; (functional programming, yeah!), cycle through those and call the result each time.&lt;/p&gt;
&lt;div class=&#34;src src-emacs-lisp&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(defun reformat-paragraph ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cycles the paragraph between three states: filled/unfilled/fill-sentences.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (interactive)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;funcall&lt;/span&gt; (cycle-on-repetition &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(fill-paragraph fill-sentences-in-paragraph unfill-paragraph)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
And finally we bind that to &lt;code&gt;M-q&lt;/code&gt;, to replace/extend emacs default behaviour.&lt;/p&gt;
&lt;div class=&#34;src src-emacs-lisp&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(global-set-key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (kbd &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;M-q&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;reformat-paragraph&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Badabing Badaboom, our function is live. I use it very often when writing texts (like this blogpost) in emacs.&lt;/p&gt;
&lt;img src=&#34;reformat_paragraph.gif&#34; alt=&#34;Cycling through the different formatings of a paragraph.&#34; title=&#34;reformat_paragraph.gif&#34;/&gt;
&lt;p&gt;
Some notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I am quite proud of &lt;code&gt;cycle-on-repetition&lt;/code&gt;, it is one of the first complex behavours that I implemented in emacs-lisp all by myself.&lt;/li&gt;
&lt;li&gt;my emacs config is &lt;a href=&#34;https://gitlab.com/Kaligule/emacs-config/-/blob/master/config.org&#34;&gt;public&lt;/a&gt; so you can have a look to see if this code is still part of it or not.&lt;/li&gt;
&lt;li&gt;If you liked this idea, &lt;del&gt;follow me on insta…&lt;/del&gt; then try to reimplement &lt;code&gt;recenter-top-bottom&lt;/code&gt; using &lt;code&gt;cycle-on-repetition&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;footnotes&#34;&gt;
&lt;hr class=&#34;footnotes-separatator&#34;&gt;
&lt;div class=&#34;footnote-definitions&#34;&gt;
&lt;div class=&#34;footnote-definition&#34;&gt;
&lt;sup id=&#34;footnote-1&#34;&gt;&lt;a href=&#34;#footnote-reference-1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;div class=&#34;footnote-body&#34;&gt;
&lt;p&gt;A paragraph is one or more senteces separated from the rest of the text by two or more newlines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;footnote-definition&#34;&gt;
&lt;sup id=&#34;footnote-2&#34;&gt;&lt;a href=&#34;#footnote-reference-2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;
&lt;div class=&#34;footnote-body&#34;&gt;
&lt;p&gt;&lt;code&gt;x&lt;/code&gt; is controlled by the variable &lt;code&gt;fill-column&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;footnote-definition&#34;&gt;
&lt;sup id=&#34;footnote-3&#34;&gt;&lt;a href=&#34;#footnote-reference-3&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;
&lt;div class=&#34;footnote-body&#34;&gt;
&lt;p&gt;There are many versions of similar functions around, I chose one that worked best for me.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;footnote-definition&#34;&gt;
&lt;sup id=&#34;footnote-4&#34;&gt;&lt;a href=&#34;#footnote-reference-4&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;
&lt;div class=&#34;footnote-body&#34;&gt;
&lt;p&gt;The article on endlessparentheses calls that a &amp;#34;free feature&amp;#34;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;footnote-definition&#34;&gt;
&lt;sup id=&#34;footnote-5&#34;&gt;&lt;a href=&#34;#footnote-reference-5&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;
&lt;div class=&#34;footnote-body&#34;&gt;
&lt;p&gt;This is a holy war I wasn&amp;#39;t aware of.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>entr should be part of every linux installation</title>
      <link>https://schauderbasis.de/posts/entr/</link>
      <pubDate>Tue, 27 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/entr/</guid>
      <description>&lt;p&gt;If you use the commandline as your IDE, then &lt;a href=&#34;https://eradman.com/entrproject/&#34;&gt;entr&lt;/a&gt; is super usefull.
As most unix programms, it does exatly one thing: &amp;ldquo;Run arbitrary commands when files change&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The syntax goes like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAMES_OF_FILES_TO_WATCH | entr ENTR_FLAGS COMMAND COMMAND_FLAGS
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;example-usage&#34;&gt;Example usage&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;entr&lt;/code&gt; &lt;a href=&#34;https://eradman.com/entrproject/&#34;&gt;website&lt;/a&gt; lists a bunch of usecases and examples, some are quite elaborate.
Here are some of the things I do with &lt;code&gt;entr&lt;/code&gt;:&lt;/p&gt;
&lt;h3 id=&#34;export-a-markdown-file-to-pdf-and-reexport-it-so-that-it-is-always-up-to-date&#34;&gt;Export a markdown file to pdf and reexport it so that it is always up to date&lt;/h3&gt;
&lt;p&gt;Many converter tools
(like &lt;a href=&#34;https://mg.readthedocs.io/latexmk.html&#34;&gt;latexmk&lt;/a&gt;, &lt;a href=&#34;https://gohugo.io/&#34;&gt;hugo&lt;/a&gt; and &lt;a href=&#34;https://archives.haskell.org/projects.haskell.org/diagrams/&#34;&gt;diagramms&lt;/a&gt;)
have a flag that makes them watch for changes in files (and do their thing then).
But this doesn&amp;rsquo;t feel like it should be in there.
Why would they all reimplement the same functionality?
Using &lt;code&gt;entr&lt;/code&gt; feels more natural and is more composable.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls thesis.md | entr pandoc --to pdf thesis.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find . -name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*.md&amp;#34;&lt;/span&gt; | entr -c hugo &lt;span style=&#34;color:#75715e&#34;&gt;# I am using this line while writing this blogpost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;have-a-self-updating-list-of-all-todos-in-my-org-file&#34;&gt;Have a self-updating list of all TODOs in my org-file&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;thesis.org&amp;#34;&lt;/span&gt; | entr -c rg TODO /_
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is nice when you are killing TODOs in your project and want to have a small &amp;ldquo;dashboard&amp;rdquo; of the remaining ones.
(the &lt;code&gt;/_&lt;/code&gt; will be with the name of the file that changed)&lt;/p&gt;
&lt;h3 id=&#34;run-the-testsuit-when-i-changed-the-code-or-tests&#34;&gt;Run the testsuit when I changed the code or tests&lt;/h3&gt;
&lt;p&gt;Whenever I have some tests failing I use this command so I don&amp;rsquo;t have to restart the test after every attempted.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find . -name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*.py&amp;#34;&lt;/span&gt; | entr python -m pytest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;continously-try-out-my-script&#34;&gt;continously try out my script&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls nondestructive_script.bash | entr -c bash /_
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will run the script whenever I change it (which is nice as long as I am sure that the script doesn&amp;rsquo;t do something terrible).
I can then examin the output and adapt the script.&lt;/p&gt;
&lt;h2 id=&#34;entr-is-very-unixoid&#34;&gt;&lt;code&gt;entr&lt;/code&gt; is very unixoid&lt;/h2&gt;
&lt;p&gt;I really wish it was preinstalled on all unixoid systems. It fits so well into the ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It works on files&lt;/li&gt;
&lt;li&gt;It works on text&lt;/li&gt;
&lt;li&gt;It doesn&amp;rsquo;t produce any output (unless you ask it to)&lt;/li&gt;
&lt;li&gt;it composes well with other programs as stdin (especially &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt; and &lt;code&gt;grep --files-with-matches&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The only strange thing is that the files to watch are specified through stdin.
The interface  doesn&amp;rsquo;t feel like a filter that way, a bit like &lt;code&gt;xargs cat&lt;/code&gt;
But one gets used to that.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;entr&lt;/code&gt; plays especially well with &lt;a href=&#34;https://www.gnu.org/software/make/&#34;&gt;make&lt;/a&gt; (because make only acts on files that have changed).&lt;/p&gt;
&lt;h2 id=&#34;entr-a-bit-more-meta-then-other-commands&#34;&gt;&lt;code&gt;entr&lt;/code&gt; a bit more Meta then other commands&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;entr&lt;/code&gt; is a meta command, it is intended to call other commands.
This distinguishes it from familiar programms like &lt;code&gt;tail&lt;/code&gt;, &lt;code&gt;wc&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, &lt;code&gt;uniq&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt; etc.
and puts it more in line with &lt;code&gt;watch&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;xargs&lt;/code&gt; and &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;entr-is-the-best&#34;&gt;&lt;code&gt;entr&lt;/code&gt; is the best&lt;/h2&gt;
&lt;p&gt;I really like to have &lt;code&gt;entr&lt;/code&gt; around. Luckily it is available for allmost all linux distros and even macOS.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I speak nix now</title>
      <link>https://schauderbasis.de/posts/i_speak_nix_now/</link>
      <pubDate>Thu, 08 Apr 2021 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/i_speak_nix_now/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;After living in a love-hate relationship with my nixos-configuration it finally came to the point that it became too big of a file to handle.
I already had it versioned (nearly everything I write is versioned).
But now the file approached a few hundred lines at I was going to loose my grip on it.&lt;/p&gt;
&lt;p&gt;A few hundred lines of code is nothing.
But a few hundred lines of config is a whole lot.
Especially if you don&amp;rsquo;t know the configuration language well.
Or if the config is about very different aspects of a complicated system.&lt;/p&gt;
&lt;p&gt;I know I had to find a solution. There were two obvious ones:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Manage the config in org-mode (literate-config-programming) as I do with my emacs config.&lt;/li&gt;
&lt;li&gt;Learn more about the nix-language and split the file up into modules.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I knew I would have to make a decision and I dragged it around with me for about a week.
Then a night came where I couldn&amp;rsquo;t sleep and I used it to read a lot about nix, especially &lt;a href=&#34;https://cbailey.co.uk/posts/drinking_the_nixos_kool_aid&#34;&gt;this article&lt;/a&gt;.
And finally it clicked.&lt;/p&gt;
&lt;h3 id=&#34;i-had-a-breaktrough&#34;&gt;I had a breaktrough.&lt;/h3&gt;
&lt;p&gt;When I finally understood how &lt;code&gt;import&lt;/code&gt; function works in nix I was blown away in a storm of motivation.
Over the next days I rewrote my config into a series of modules, nice and separated.
(I can only work in the evening on stuff like that, often no more then 20 minutes a day.)
I learned a lot about nix in the process, a lot of pieces fell into their place.
Now my laptop and my server share many modules and it is easy to add new ones without adding much complexity.&lt;/p&gt;
&lt;p&gt;It feels great.&lt;/p&gt;
&lt;p&gt;This has happened before.
I declared emacs-config-bankruptcy multiple times before I finally &lt;em&gt;got it&lt;/em&gt; and brought it all into a nice, organized format.
Since then the config grew and grew, is counts 2000 dense lines of config and holds over 40 chapters on minor-modes alone.
Yet I don&amp;rsquo;t fear touching anything in it.
I even read other peoples configs from time to time, taking good ideas from them.&lt;/p&gt;
&lt;p&gt;My emacs config is under control.
And now my nixos-config is, too.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Proof of concept: Backup from Unix to Nixos with Borg</title>
      <link>https://schauderbasis.de/posts/backup_from_unix_to_nixos_with_borg/</link>
      <pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/backup_from_unix_to_nixos_with_borg/</guid>
      <description>
&lt;p&gt;
I want to get a directory backed up with borg on my nixos-server (&lt;code&gt;regulus.fritz.box&lt;/code&gt;).
The client may just be a regular unixoid, doesn&amp;#39;t have to be nixos (I am using MacOS for testing).
All the commands (unless explicitly stated otherwise) are executed on the client.
Both systems have borg installed.
This is a tutorial, so most explaining will be about &lt;em&gt;what&lt;/em&gt; to do, not &lt;em&gt;why&lt;/em&gt; to do it.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Setup
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We first create the directory with our &lt;span style=&#34;text-decoration: underline;&#34;&gt;valuable&lt;/span&gt; data.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1234567890&amp;#34;&lt;/span&gt; &amp;gt; files_to_back_up/zahlen.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;abcdefghijklmnopqrstuvwxyz&amp;#34;&lt;/span&gt; &amp;gt; files_to_back_up/buchstaben.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
For borg to access the server without a password we need to create a keyfile pair (on the client).
Name it however you want.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -N &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; -t ed25519 -f key_backups_of_NUE-MAC-087_id_ed25519&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generating public/private ed25519 key pair.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your identification has been saved in key_backups_of_NUE-MAC-087_id_ed25519.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your public key has been saved in key_backups_of_NUE-MAC-087_id_ed25519.pub.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The key fingerprint is:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SHA256:KAkg+ve2A+D9TWYYdlshCIECDfP3SWAXAyml8NkZFPA jlippmann@NUE-MAC-087
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The key&amp;#39;s randomart image is:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--[ED25519 256]--+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|Oo.=@*+o         |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|+*+*.=... .      |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|..*.E .  . .     |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| ..o +oo. .      |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| ..o+.++So       |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  ..oo. =        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     oo=         |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     .o..        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|      ..         |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+----[SHA256]-----+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Have a look at the public key:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat key_backups_of_NUE-MAC-087_id_ed25519.pub&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE+u6Q/ycvxM1XG7JitWqla/nTKvT29rHS9IUjZMaPwH jlippmann@NUE-MAC-087&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now we tell the server about this key and what should be done with it.
Nixos will do all the complicated stuff for us (creating a user and paths, setting the rights correctly), we just have to add the following to the (server-)nixos-configuration.&lt;/p&gt;
&lt;div class=&#34;src src-nix&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  services&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;borgbackup&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;repos &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    my_borg_repo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      authorizedKeys &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# Here goes the public key we just created&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE+u6Q/ycvxM1XG7JitWqla/nTKvT29rHS9IUjZMaPwH jlippmann@NUE-MAC-087&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ] ;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# where the backup will be placed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/var/lib/my_borg_repo&amp;#34;&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Rebuild and switch. A user of the name borg has been created, has been assigned the mentioned directory and the key has been placed in the correct spot. You can check that this worked like this (still on the server):&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/ssh/authorized_keys.d/borg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;command=&amp;#34;cd &amp;#39;/var/lib/my_borg_repo&amp;#39; &amp;amp;&amp;amp; borg serve --restrict-to-repository .  &amp;#34;,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE+u6Q/ycvxM1XG7JitWqla/nTKvT29rHS9IUjZMaPwH jlippmann@NUE-MAC-087&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-2&#34;&gt;
Initialize the backup
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We will have a password, which is the password for our backup itself.
To be more precise: it is the password for a key stored in the backup-repo with which the backup wil be encrypted.
It has nothing to do with the keypair we created earlier (which is just for connecting to the server).
To safe time we will export this backup-passwort to a shell variable beforehand.
There are other ways, for example setting a BORG_PASSCOMMAND.
If you don&amp;#39;t you will be asked to enter the password each time interactively (which is nice for exploration but bad for scripting.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export BORG_PASSPHRASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now back on the client we can init the borg repo.
Note especially the trailing colon and dot in the adress.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg init --encryption&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;repokey-blake2 --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;By default repositories initialized with this version will produce security
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;errors if written to with an older version (up to and including Borg 1.0.8).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you want to use these older versions, you can disable the check by running:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg upgrade --disable-tam ssh://borg@regulus.fritz.box/./.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;See https://borgbackup.readthedocs.io/en/stable/changes.html#pre-1-0-9-manifest-spoofing-vulnerability for details about the security implications.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IMPORTANT: you will need both KEY AND PASSPHRASE to access this repo!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Use &amp;#34;borg key export&amp;#34; to export the key, optionally in printable format.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Write down the passphrase. Store both at safe place(s).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
To confirm that we indeed created the repository remotly we can check that the repo was created on the server:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /var/lib/my_borg_repo/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config  data  hints.1  index.1  integrity.1  nonce  README&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Back on the client again, lets do this key export that was mentioned after we initialized the repo.
I THINK that key is what the repo is encrypted with.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg key export --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:. test_export
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat test_export&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BORG_KEY ab6cb44a7ed5b13e6bb9fd62e93731d741de161d031aa74c5e903a7c1e9cb9ef
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hqlhbGdvcml0aG2mc2hhMjU2pGRhdGHaAZ5SR2ULbAiQQxcmb1tD+y99ZEzBll9Pe/D0C0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dlQAniuUFgHa2J/dCH3FNkT92QfzgQW3k/SP6obl5JOYRUJRGEPJNYa2RwcSquV9xpqnTg
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/QsOWNJQuQBX2dZIMWRiHYVKvXiK11jPI0HyO1c8SV9YgfH8mJtWd+0uX4eLnqCFGBWXfO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hTgKMdRTtkcV89HjZqYI4fW64AnSB6DLPyQutm0jXeRFdYtdZbujufS5SRb9rBYxcypOSu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8TT5zNcu+Sus2vr5gc303CXM9Ktv8wYiuErC6YlP5dClfU8N9ihqS91lIc32R1QbufTSgt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;h0yBEugYqGLRDr+ZVGVdwojshgQoyECH9l87FNyQnExvFXm2TNg0O8gWwnja+xNU+0yta5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DNG2tHmCi99Et10ezKton6MXIGcWBwErFlZ5E+vG1pmP3AiUVM7gtUCICp/foJWhoQKlf5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;U8xUDid/t34/YGv9kHAWpvXWVQej1lAC4kpaVQ+ZcyGOSN9VUKCniOmbF1ip2cymF0biYn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CnOR5G1Bwc+XSbLlVmUR/xwIJOakaGFzaNoAIAEIyyWhmLMISUJYyy2Iay4O9o7cffYSzR
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mUjalZJFK9qml0ZXJhdGlvbnPOAAGGoKRzYWx02gAgpY+xYO83BALtVodzGH4aJgpD6jzt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5Ao3IMLckcx5xeSndmVyc2lvbgE=&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
Create a backup
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Now we can do our first backup:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg create --stats --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.::01_first_backup files_to_back_up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;------------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Archive name: 01_first_backup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Archive fingerprint: e40e34c423ed1dba3ab1243840a3840b244f0f423f8bc96e50773879ae3184cd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time (start): Sat, 2020-12-26 22:13:26
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time (end):   Sat, 2020-12-26 22:13:26
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Duration: 0.04 seconds
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Number of files: 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Utilization of max. archive size: 0%
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;------------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       Original size      Compressed size    Deduplicated size
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This archive:                1.20 kB              1.12 kB              1.12 kB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;All archives:                1.20 kB              1.12 kB              1.12 kB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       Unique chunks         Total chunks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Chunk index:                       4                    4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;------------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Now we can see if it is realy there:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg list  --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01_first_backup                      Sat, 2020-12-26 22:13:26 [e40e34c423ed1dba3ab1243840a3840b244f0f423f8bc96e50773879ae3184cd]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
And see what is in it:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg list  --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.::01_first_backup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;drwxr-xr-x jlippmann 1728021072        0 Mon, 2020-12-21 07:48:10 files_to_back_up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r-- jlippmann 1728021072       11 Sat, 2020-12-26 22:04:13 files_to_back_up/zahlen.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r-- jlippmann 1728021072       27 Sat, 2020-12-26 22:04:13 files_to_back_up/buchstaben.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
change some files and back up again
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Now we add/change some files, create a new backup (without –stats this time) and check if it is there as well.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; files_to_back_up/buchstaben.txt &lt;span style=&#34;color:#75715e&#34;&gt;# change a file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gnu penguin chamaeleon&amp;#34;&lt;/span&gt; &amp;gt; files_to_back_up/animals.txt         &lt;span style=&#34;color:#75715e&#34;&gt;# add a new file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# new backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg create --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.::02_second_backup files_to_back_up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
List all the backups.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg list  --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01_first_backup                      Sat, 2020-12-26 22:13:26 [e40e34c423ed1dba3ab1243840a3840b244f0f423f8bc96e50773879ae3184cd]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;02_second_backup                     Sat, 2020-12-26 22:15:35 [7a9d60039583b5c01dbf50df4b3f11c7736f1f5701c8822cc80b97e90aa2d220]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Look into &lt;code&gt;02_second_backup&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg list --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.::02_second_backup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-text&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;drwxr-xr-x jlippmann 1728021072        0 Sat, 2020-12-26 22:15:33 files_to_back_up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r-- jlippmann 1728021072       11 Sat, 2020-12-26 22:04:13 files_to_back_up/zahlen.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r-- jlippmann 1728021072       54 Sat, 2020-12-26 22:15:33 files_to_back_up/buchstaben.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r-- jlippmann 1728021072       23 Sat, 2020-12-26 22:15:33 files_to_back_up/animals.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Looking at the size of the file &lt;code&gt;buchstaben.txt&lt;/code&gt; we see that it has grown.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Restore from backup
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
Next we loose our precious directory by accident…&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf files_to_back_up &lt;span style=&#34;color:#75715e&#34;&gt;# Oh no!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
… and want to get an old version of it back.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;borg extract --rsh &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh -i key_backups_of_NUE-MAC-087_id_ed25519&amp;#34;&lt;/span&gt; borg@regulus.fritz.box:.::01_first_backup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The files are back, as expected.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la files_to_back_up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;total &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;drwxr-xr-x   &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; jlippmann  &lt;span style=&#34;color:#ae81ff&#34;&gt;1728021072&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;128&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt; Dez 07:48 .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;drwxr-xr-x  &lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt; jlippmann  &lt;span style=&#34;color:#ae81ff&#34;&gt;1728021072&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;384&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt; Dez 22:40 ..
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r--   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; jlippmann  &lt;span style=&#34;color:#ae81ff&#34;&gt;1728021072&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt; Dez 22:04 buchstaben.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-rw-r--r--   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; jlippmann  &lt;span style=&#34;color:#ae81ff&#34;&gt;1728021072&lt;/span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt; Dez 22:04 zahlen.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>fun errors</title>
      <link>https://schauderbasis.de/posts/fun_errors/</link>
      <pubDate>Sun, 06 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/fun_errors/</guid>
      <description>&lt;p&gt;I am currently rewriting
&lt;a href=&#34;https://nullprogram.com/blog/2020/11/24&#34;&gt;Chris Wellons&amp;rsquo;s racing simulation&lt;/a&gt;
in rust as a training exercise.
His program is really nice in that it is visual, interesting and well under 500 lines of Code -
really inspiring.
(I wouldn&amp;rsquo;t have minded speaking variable names and comments though).&lt;/p&gt;
&lt;p&gt;Rust is still hard for me, I am mostly fighting the borrow checker.
But the extremely helpfully error-messages and Stackoverflow mostly help me get over it.&lt;/p&gt;
&lt;p&gt;There is a magical moment in creating simulations:
The point were errors don&amp;rsquo;t break the simulation, they just cause strange behavior.
The most famous example is probably the
&lt;a href=&#34;https://www.youtube.com/watch?v=6yWf6BHqiWM&#34;&gt;drunk cats in dwarf fortress&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In my simulation the problem was that
I just couldn&amp;rsquo;t get the driver to drive the course without hitting a wall.
It should steer into the direction that has the most free space
and adjust it&amp;rsquo;s speed according to how much free road is ahead (more on that later).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;fail.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;(The map is drawn by me and it is only 300x200, so it might look blury
on your screen.)&lt;/p&gt;
&lt;p&gt;These errors are so great because you can try to reason within the logic of the simulation.
Is the car going to fast/slow?
Is the turning radius to big?
Does the driver act too sudden on curves?
Or perhaps the map is to difficult and the turns are too sharp?&lt;/p&gt;
&lt;p&gt;After trying a few things out I decided to visualize the field of view of the the car.
As is in the original simulation, the car does 3 raycasts:
to the left, forwards and to the right.
It then decides how to steer the car based on how much space it has in each direction.&lt;/p&gt;
&lt;p&gt;Here is what the car sees on the course:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;visualized.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s immediately obvious that something is wrong here.
There was a sign error in the y-axis in the calculation for the raycasts.
It is a bit like the driver was looking at the street over a mirror.&lt;/p&gt;
&lt;p&gt;I love that kind of debugging.
Instead of error messages, stacktraces and debuggers
you think about the car, the map and what the driver sees.&lt;/p&gt;
&lt;p&gt;Here is the fixed version, just a minus sign away:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;fixed.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nix on macOS</title>
      <link>https://schauderbasis.de/posts/nix_auf_macos/</link>
      <pubDate>Thu, 26 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/nix_auf_macos/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Nix is packagemanager like nothing I have seen anywhere else (I have suspicion that &lt;a href=&#34;https://guix.gnu.org/&#34;&gt;Guix&lt;/a&gt; goes in a similar direction, but I haven&amp;rsquo;t tried it out yet). Using it is a bit similar to using a package manager for the first time: Once you have seen the light, there is no coming back.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why I have Nix running on 3 machines currently: My main Laptop, my &amp;ldquo;home-server&amp;rdquo;-raspberry-pi and (since this weeks) my MacBook for work (I am in the happy situation that my current employer allows devs much freedom on their work-devices).&lt;/p&gt;
&lt;p&gt;Nix can&amp;rsquo;t replace &lt;a href=&#34;https://brew.sh/&#34;&gt;brew&lt;/a&gt; completely yet, just because brew has so many packages that are not available via Nix. I am not yet at the point where I can create my own Nix-packages, so for more special things I still rely on brew. But for everything else&amp;hellip;&lt;/p&gt;
&lt;p&gt;After installing (two great blogposts about that: &lt;a href=&#34;https://wickedchicken.github.io/post/macos-nix-setup/&#34;&gt;1&lt;/a&gt;, &lt;a href=&#34;https://dev.to/louy2/installing-nix-on-macos-catalina-2acb&#34;&gt;2&lt;/a&gt;) there are two ways I make use of Nix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;listing &lt;code&gt;~/.nixpkgs/darwin-configuration.nix&lt;/code&gt; to list the packages I want (similar to NixOS)&lt;/li&gt;
&lt;li&gt;using &lt;code&gt;nix-shell&lt;/code&gt; to create development-environments (similar to &lt;code&gt;virtualenv&lt;/code&gt; in python.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have not yet suggested using nix to my coworkers, but if it continues to be amazing as it is, I think I will.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Install NIXOS on raspberry pi 4</title>
      <link>https://schauderbasis.de/posts/install_nixos_on_raspberry_pi_4/</link>
      <pubDate>Fri, 30 Oct 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/install_nixos_on_raspberry_pi_4/</guid>
      <description>
&lt;p&gt;
Given a raspberry pi 4 with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an ethernet connection&lt;/li&gt;
&lt;li&gt;a micro-sd card&lt;/li&gt;
&lt;li&gt;a usb-keyboard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;… this is how to set up the RP with nixos so that you can ssh into
it. We won&amp;#39;t need to attach a screen to it. All we need beyond above
is a computer with an internet connection that can write to the SD
card (using &lt;code&gt;dd&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;
This is not a tutorial, this is a howto (and cheat sheet for my future
self), so I won&amp;#39;t explain too much here. Also the commands might still
use some paths from my computer (like &lt;code&gt;/home/johannes/&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;
All of this is necessary as of the time of writing the RP4 is not
officially supported by NixOS. But I really fell in love with the
declarative configuration of NixOS, so I had to install it
anyway. Fortunatelly there is &lt;a href=&#34;https://nixos.wiki/wiki/NixOS_on_ARM/Raspberry_Pi_4&#34;&gt;some documentation&lt;/a&gt; from people who did
it before me, but I didn&amp;#39;t find a complete howto.&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-1&#34;&gt;
Install NixOS
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-2&#34;&gt;
Download the image
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
(for me it was
&lt;code&gt;nixos-sd-image-21.03pre249162.1dc37370c48-aarch64-linux.img&lt;/code&gt;) from
here:
&lt;a href=&#34;https://hydra.nixos.org/job/nixos/release-20.03/nixos.sd_image.aarch64-linux&#34;&gt;https://hydra.nixos.org/job/nixos/release-20.03/nixos.sd_image.aarch64-linux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
Make sure you check the hashes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-3&#34;&gt;
Prepare the SD card
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Put SD card into computer and write image on SD card.
CARFULL HERE, better check (with &lt;code&gt;lsblk&lt;/code&gt;) the &lt;code&gt;of&lt;/code&gt; is really the SD card.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dd &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;~/Downloads/nixos-sd-image-aarch64-linux.img of&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/dev/mmcblk0 status&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;progress&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-4&#34;&gt;
Boot into NixOS
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
Plug SD-card out and into the raspberry pi.
Connect it to power - it should boot into NixOS now.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
Set password for ssh login
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We have to set password (&lt;code&gt;mypassword&lt;/code&gt;) for default user &lt;code&gt;nixos&lt;/code&gt; to log
in via ssh, so plug in a usb keyboard and type:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;passwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENTER
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mypassword
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENTER
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mypassword
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENTER&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This is much easier with a display attached. But if you don&amp;#39;t have an
adapter for micro-hdmi (or a display), just do it blindly.&lt;/p&gt;
&lt;p&gt;
We won&amp;#39;t need the keyboard from now on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-6&#34;&gt;
Log in via ssh
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
In my setup the address of the pi is &lt;code&gt;nixos.fritz.box&lt;/code&gt;. So we should
be able to ssh in with the password set above.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh nixos@nixos.fritz.box&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
I will call this session the &amp;#34;remote&amp;#34; from here on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-7&#34;&gt;
Build NixOS from a config
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-8&#34;&gt;
Create the nixos config
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
First create a config, especially the &lt;code&gt;hardware-configuration.nix&lt;/code&gt;. On remote:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nixos-generate-config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
I wrote a &lt;a href=&#34;configuration.nix&#34;&gt;minimal config&lt;/a&gt; to save some time. It is a slimmed down
version of the config that is generated with nixos-generate-config. I
added the boot settings from &lt;a href=&#34;https://nixos.wiki/wiki/NixOS_on_ARM/Raspberry_Pi_4&#34;&gt;the NixOS Wiki&lt;/a&gt; and removed everything
that I understood well enough to be sure it is not necessary for
working on nixos via ssh.&lt;/p&gt;
&lt;p&gt;
Now &lt;code&gt;mv&lt;/code&gt; the minimal config to the pi:&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scp configuration.nix nixos@nixos.fritz.box:configration.nix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
On the pi, move it to the right place (replacing the generated one) …&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mv /home/nixos/configration.nix /etc/nixos/configuration.nix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
… and rebuild the OS from the config.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nixos-rebuild switch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-4&#34;&gt;
&lt;h4 id=&#34;headline-9&#34;&gt;
Profit
&lt;/h4&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-4&#34;&gt;
&lt;p&gt;
kill remote session (C-d) and log in again, but with your username and password set in the config file.&lt;/p&gt;
&lt;div class=&#34;src src-shell&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh johannes@nixos.fritz.box&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-10&#34;&gt;
Result
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
We should now be able to log into the pi, change the config and
rebuild the OS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Just play with the code</title>
      <link>https://schauderbasis.de/posts/just_play_with_the_code/</link>
      <pubDate>Thu, 30 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/just_play_with_the_code/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;When I want to do something for fun, this is what I do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plan it (find a date and time, ask people I want to participate)&lt;/li&gt;
&lt;li&gt;Prepare it (pack the necessary stuff, drive there, set up the
table/workspace)&lt;/li&gt;
&lt;li&gt;Do it&lt;/li&gt;
&lt;li&gt;Clean up (drive home, put everything back, remove tmp-files)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now that I think about it, the workflow is pretty similar to what I do
when I want to work on something not for fun.&lt;/p&gt;
&lt;h2 id=&#34;it-is-easier-for-babys&#34;&gt;It is easier for babys&lt;/h2&gt;
&lt;p&gt;While playing with my daughter I noticed that she does it
differently. She doesn&amp;rsquo;t plan or prepare anything, she just jumps from
&amp;ldquo;the idea of doing something&amp;rdquo; to &amp;ldquo;Do it&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This results in a number of games I couldn&amp;rsquo;t even have planed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Making noises with the gummi guiraffe every time her mother walks by&lt;/li&gt;
&lt;li&gt;Me patting her back to the rythm of &amp;ldquo;the lion sleeps tonight&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Climbing the ever growing mountain of cushions I built up to stop
her from falling from the bed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a way this is how I used to work on my side-coding-projects: I
would browse through the code and do to it whatever I thought of
doing.&lt;/p&gt;
&lt;p&gt;I would add features spontanously, refactor what I stumpled upon or
do research on how something works, just because my eye fell on
it.&lt;/p&gt;
&lt;p&gt;This workflow was not very productive in the sense of reaching goals
or finishing projects. But it was great for learning, relaxation and
gradually improving the codebase. If development is a discussion, this
is the smalltalk.&lt;/p&gt;
&lt;p&gt;And while my workflow changed a lot in the last years, I think this a
great way to get to know a codebase. Just play with it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lies keine Oden, lies die Ausgangsbeschränkungen</title>
      <link>https://schauderbasis.de/posts/lies_die_verordnungen/</link>
      <pubDate>Sat, 09 May 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/lies_die_verordnungen/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Die Ausgangsbeschränkungen (wegen
&lt;a href=&#34;https://de.wikipedia.org/wiki/COVID-19&#34;&gt;COVID-19&lt;/a&gt;) ändern sich ab und
zu und haben dann sofort große Auswirkungen auf unser Leben. Deshalb
sind dann Zeitungen und Radiosendungen voll mit Diskussionen und FAQs:
&amp;ldquo;Was ist nun erlaubt, was nicht?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Das ist ja auch in Ordnung. Es wäre aber schon wichtig zu wissen,
dass man auch die Verordnungen im Original lesen kann:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.stmgp.bayern.de/coronavirus/rechtsgrundlagen/&#34;&gt;https://www.stmgp.bayern.de/coronavirus/rechtsgrundlagen/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Am Ende gelten auch nicht die Regeln, die der Söder in der
Pressekonferenz erzählt, sondern das was im Gesetz (oder in diesem
Fall in der Verordnung) steht.&lt;/p&gt;
&lt;p&gt;Darum mein Plädoyer: Bevor du Abhandlungen über Gesetze liest, lies
vorher die Gesetze selbst.&lt;/p&gt;
&lt;p&gt;Sie sind genauer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sind alle Kreise gleich?</title>
      <link>https://schauderbasis.de/posts/einheiten/</link>
      <pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/einheiten/</guid>
      <description>&lt;p&gt;Das Verhältnis von Umfang und Fläche eines Kreises ändert sich mit der
Größe des Kreises. Aber sind nicht alle Kreise gleich/kongruent?
Sollte dann nicht auch das Verhältnis immer gleich sein? Bei Umfang zu
Durchmesser ist es ja auch für alle Kreise gleich.&lt;/p&gt;
&lt;p&gt;Ein Freund kam neulich mit dieser Frage zu mir. Er hatte sie mehreren
Leuten gestellt und alle konnten ihm die Formel für das Verhältnis
herleiten. Aber Formeln anschauen ist nicht das gleiche wie
verstehen. Tatsächlich ist es eine sehr gute Frage, die an die
Grundlagen des Messens heran reicht.&lt;/p&gt;
&lt;h3 id=&#34;gleiche-messgrößen&#34;&gt;Gleiche Messgrößen&lt;/h3&gt;
&lt;p&gt;Größen, die Dinge aus der gleichen &amp;ldquo;Kategorie&amp;rdquo; (zB Länge, Gewicht,
Geschwindigkeit) beschreiben kann man direkt zueinander ins
Verhältnis setzten (-&amp;gt; vergleichen). Zum Beispiel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dein Auto ist schneller als meines (Kategorie &lt;em&gt;Geschwindigkeit&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Umfang eines Kreises und sein Durchmesser (Definition von $\pi$ (pi), die Kategorie ist hier &lt;em&gt;Länge&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;unterschiedliche-messgrößen&#34;&gt;Unterschiedliche Messgrößen&lt;/h3&gt;
&lt;p&gt;Bei unterschiedlichen Kategorien kann man nicht direkt vergleichen&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bist du schwerer als du hoch bist?&lt;/li&gt;
&lt;li&gt;Sie ist so dumm wie die Nacht finster ist.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hier können wir verstehen, warum das Verhältnis Umfang zu Flächeninhalt eines Kreises nicht einfach so zu messen ist: Die Kategorien (Fläche und Länge) sind verschieden.&lt;/p&gt;
&lt;p&gt;In diesen Fällen muss man zuerst die einzelnen Größen &amp;ldquo;messen&amp;rdquo;,
also ins Verhältnis zu einer Einheit setzten (siehe den Exkurs unten).&lt;/p&gt;
&lt;p&gt;Hat man nun die beiden Größen ins Verhältnis zu ihren Einheit
gesetzt kann man diese Verhältnisse vergleichen. Man muss aber die
Einheit dazu nennen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 kg Mehl für 4 EUR -&amp;gt; 0,8 EUR/kg&lt;/li&gt;
&lt;li&gt;1 Liter Wasser hat eine Masse von 0,998 kg -&amp;gt; Die Dichte von Wasser ist 0,998 kg/l&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nun können wir also den Umfang und den Flächeninhalt vergleichen, wenn
wir uns vorher auf Maßeinheiten (zB cm und cm^2) festlegen. Sobald wir
das aber tun sind eben nicht mehr alle Kreise gleich: Sie
unterscheiden sich in ihren Radien. Das Verhältnis ist nicht
platonisch, es hat eine Einheit (1/cm).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;kurve.png&#34; alt=&#34;Des Verhältnis Umfang zu Fläche hat eine Einheit&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kongruenz kann man übrigens nicht als Argument heranziehen, dass
Umfang zu Fläche konstant sein sollten. Denn Kongruenz bedeutet nur,
dass die Verhältnisse von &lt;em&gt;Strecken&lt;/em&gt; konstant sind - und die sind
alle in der selben Kategorie.&lt;/p&gt;
&lt;h3 id=&#34;exkurs-einheiten-an-sich-selbst-messen&#34;&gt;Exkurs: Einheiten an sich selbst messen.&lt;/h3&gt;
&lt;p&gt;Eine Einheit sollte außerhalb des zu messenden Systems definiert sein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Er ist 1,80 Meter groß (Vergleich zum
&lt;a href=&#34;https://de.wikipedia.org/wiki/Urmeter&#34;&gt;Urmeter&lt;/a&gt;) und 90 kg schwer
(90 mal schwerer als das
&lt;a href=&#34;https://de.wikipedia.org/wiki/Kilogramm#Urkilogramm&#34;&gt;Urkilogramm&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Das Mehl kostet 4 Euro (Vergleich zu dem Wert, den wir einen Euro
nennen)&lt;/li&gt;
&lt;li&gt;Andromeda ist 2500000 Lichtjahre entfernt (Vergleich zur Strecke,
die Licht in einer gewissen Zeit zurücklegt).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn man stattdessen eine Einheit an dem definiert, das man messen
will, dann ist das Verhältnis trivial und die ist Messung nutzlos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Das Monster ist so groß, wie ein Monster groß ist.&lt;/li&gt;
&lt;li&gt;In einen Hefeteig soll so viel Mehl, wie in einen guten Hefeteig
rein kommt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So leicht lässt sich die Mathematik nicht austricksen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First step to NixOS</title>
      <link>https://schauderbasis.de/posts/first_step_to_nixos/</link>
      <pubDate>Sun, 08 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/first_step_to_nixos/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Given my OS history (Windows -&amp;gt; macOS -&amp;gt; Fedora -&amp;gt; Arch Linux) these
were the options I was interested in as a next one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gentoo&lt;/strong&gt; (but I have no interests in compiling everything myself)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GNU Hurd&lt;/strong&gt; (but I don&amp;rsquo;t think it is ready yet)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arch Linux&lt;/strong&gt; (There was nothing bad about it except the installation process)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manjaro&lt;/strong&gt; (because it is Arch with an installer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NixOS&lt;/strong&gt; (because I like writing configurations)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I decided on NixOS because I could see me using it for the next years
(other then Gentoo and GNU Hurd) and it would give me the opportunity
to learn something completely new (other then Arch and Manjaro that I
used for a few years now).&lt;/p&gt;
&lt;p&gt;Since my old laptop T440S was gone and beyond repair I got my hands on
an old T430S (which makes it amazingly easy to swap parts) and created
a bootable USB Stick. And then &amp;hellip;&lt;/p&gt;
&lt;p&gt;some wonderful things happened in my private live and I had no time to
go further.&lt;/p&gt;
&lt;p&gt;It has been a few months, but I finally could pick up my experiment
with NixOS. Booting from the stick was easy and before you know it you
get a Desktop Environment. There are some multiple tools to help you
get the disk in the shape you want before the real installation
begins.&lt;/p&gt;
&lt;p&gt;While I know how my way around the commandline the same can not be
said about partitioning, formating and file systems. It seems like
there are multiple definitions of &amp;ldquo;device&amp;rdquo; for different programms and
I wouldn&amp;rsquo;t even know how a good setup would look like. I clearly lack
knowledge in this area.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://nixos.org/nixos/manual/index.html#sec-installation-partitioning&#34;&gt;NixOS manual&lt;/a&gt;
uses a lot of commands that sounded obscure to me (&lt;code&gt;parted&lt;/code&gt;, &lt;code&gt;mkfs&lt;/code&gt;
and &lt;code&gt;mkswap&lt;/code&gt;) so I choose to follow a guide from
&lt;a href=&#34;https://alexherbo2.github.io/blog/nixos/install-guide/&#34;&gt;alexherbo2&lt;/a&gt;
that seemed more detailed and recommended &amp;ldquo;GParted for
discoverability&amp;rdquo;. Unfortunatelly I got stuck when creating new
partitions. I couldn&amp;rsquo;t assign any other filesystems then &amp;rsquo;linux-swap
and &amp;lsquo;minix&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Asking for help in the IRC (#nixos) got me some advice (from
colemickens, thanks a lot) - he encouraged me to give the commands
from the manual a try (because I didn&amp;rsquo;t have much to loose on that
machine). It turned out that they did work as advertised. When I typed
them in by hand I got a better understanding of what they did than
from just reading/copying/pasting them.&lt;/p&gt;
&lt;p&gt;The rest of the installation process went as expected. I had a little
trouble because I hadn&amp;rsquo;t installed the network-manager before
rebooting (so I couldn&amp;rsquo;t install it later because I had no
network-manager to get the wifi going) but fortunately the Ethernet
worked out of the box.&lt;/p&gt;
&lt;p&gt;So now I have a working NixOS on my Thinkpad. Having managed the
installation so far makes me a bit proud and I am looking forward to
learn the nix way. I really like it so far, but didn&amp;rsquo;t have much time
to play with it. Currently I only have &lt;code&gt;emacs&lt;/code&gt;, &lt;code&gt;network-manager&lt;/code&gt;,
&lt;code&gt;sway&lt;/code&gt; and &lt;code&gt;firefox&lt;/code&gt; installed, &lt;code&gt;qutebrowser&lt;/code&gt; will follow. That should
be enough to get along for a while, the next step is to migrate my old
data.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Newsblur&#39;s API</title>
      <link>https://schauderbasis.de/posts/using-newsblurs-api/</link>
      <pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/using-newsblurs-api/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Everybody should have a &lt;a href=&#34;https://schauderbasis.de/posts/rss-software/&#34;&gt;feedreader for RSS feeds&lt;/a&gt;. Lately I decided to
subscribe to some feeds of local organisations (like the zoo, some
local fablabs or the nearest police station). Things that take place
nearby are more interesting after all.&lt;/p&gt;
&lt;p&gt;So yesterday I found that our city administration provides some
RSS-feeds - many actually. They are all listed on &lt;a href=&#34;https://www.nuernberg.de/internet/stadtportal/feed.html&#34;&gt;this
website&lt;/a&gt;. So
I want to subscribe to all of them. I didn&amp;rsquo;t find an easy way to
subscribe to many feeds at once through the Newsblur web interface, so
I decided it was a good day to test out the &lt;a href=&#34;https://www.newsblur.com/api#&#34;&gt;Newsblur
api&lt;/a&gt;. (While the API is well
documented, I found that I missed having some examples to play around
with. So here is my example.)&lt;/p&gt;
&lt;p&gt;For authentication I got my session coockie like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --cookie-jar session.newsblur &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --data &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username=&lt;/span&gt;$MY_USERNAME&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --data &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password=&lt;/span&gt;$MY_PASSWORD&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    https://www.newsblur.com/api/login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that, the file &lt;code&gt;session.newsblur&lt;/code&gt; contains something that looks
like a sessionid:&lt;/p&gt;
&lt;p&gt;#HttpOnly_.newsblur.com	TRUE	/	FALSE	1601234874	newsblur_sessionid	xa3w22sometokenspecifictome6duds&lt;/p&gt;
&lt;p&gt;As a test I tried reading a list of all my feeds (the json_pp is just
for formating):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X GET &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --cookie session.newsblur &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.newsblur.com/reader/feeds&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    | json_pp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works just fine and contains information about my personal feeds,
so we know I did the authentication right.&lt;/p&gt;
&lt;p&gt;Next I want to subscribe to a single the feed
(&lt;code&gt;https://www.nuernberg.de/internet/newsfeed/stadtportal_ausstellungen.xml&lt;/code&gt;,
taken from the site mentioned above) and add it in the folder
&lt;code&gt;regional&lt;/code&gt;. The &lt;a href=&#34;https://www.newsblur.com/api#/reader/add_url&#34;&gt;documentation for this
command&lt;/a&gt; tells us we
will need to add the two arguments as url parameters. Since the url
contains suspicious caracters like &lt;code&gt;:&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt; and &lt;code&gt;\&lt;/code&gt; (that are
likely to break things) I will use the curl flag &lt;code&gt;--data-urlencode&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --cookie session.newsblur &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --data-urlencode &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url=https://www.nuernberg.de/internet/newsfeed/stadtportal_ausstellungen.xml&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --data-urlencode &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;folder=regional&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.newsblur.com/reader/add_url&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output again is some json, telling my information about the newly
subscribed feed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;subs&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;feed_link&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.nuernberg.de/internet/newsfeed/Stadtportal - Ausstellungen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;7686975&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;min_to_decay&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;240&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;updated_seconds_ago&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;15878&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;stories_last_month&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;favicon_text_color&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;white&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;fetched_once&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;search_indexed&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;last_story_seconds_ago&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;541185&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A look at the Newsblur&amp;rsquo;s website tells us that we really did
subscribe to the feed and it was placed in the correct folder. So we
are nearly there! Let&amp;rsquo;s get a list of all the feeds that are linked in
the site of the city administration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lynx -dump -listonly &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.nuernberg.de/internet/stadtportal/feed.html&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    | grep xml | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; &amp;gt; feeds_to_subscribe_to.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We get a file with one feed address per line (36 in sum). Now all that is left is
to loop over them and subscribe to them one by one.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat feeds_to_subscribe_to.txt | &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; read feed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        curl -X POST &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;            --cookie session.newsblur &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;            --data-urlencode &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url=&lt;/span&gt;$feed&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;            --data-urlencode &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;folder=regional&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.newsblur.com/reader/add_url&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sleep &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# don&amp;#39;t spam the api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And there we go: We subscribed to each of the feeds listed on the
website.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t have much opportunity to work with APIs, yet. But it was fun
to play around with this one, there is nothing to be afraid of.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rescue data from a Mac that won&#39;t start anymore</title>
      <link>https://schauderbasis.de/posts/rescue_data_from_a_mac_that_wont_start_anymore/</link>
      <pubDate>Wed, 09 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/rescue_data_from_a_mac_that_wont_start_anymore/</guid>
      <description>&lt;p&gt;
My wifes macbook didn&amp;#39;t start anymore, it tried but went into the same error again and again. This is how I got the data from the old hard drive.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get yourself a drive to rescue the files to (we will call it &lt;code&gt;LIFEBOAT&lt;/code&gt;). Connect it to the mac.&lt;/li&gt;
&lt;li&gt;Enter Recovery mode by pressing &lt;code&gt;CMD&lt;/code&gt; and &lt;code&gt;R&lt;/code&gt; at startup.&lt;/li&gt;
&lt;li&gt;Get yourself a terminal (in the upper menu under &amp;#34;Utilities&amp;#34;).&lt;/li&gt;
&lt;li&gt;Make sure &lt;code&gt;LIFEBOAT&lt;/code&gt; can be found under &lt;code&gt;/Volumes/LIFEBOAT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make sure your userdata is in &lt;code&gt;/Volumes/Macintosh HD/Users/YOURUSERNAME&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy the files you need to the &lt;code&gt;LIFEBOAT&lt;/code&gt; with a simple &lt;code&gt;cp -r&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Close the Terminal (&lt;code&gt;CMD-Q&lt;/code&gt;) and shut down the Mac.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The critical step is clearly step 5. If the data is not there, I have no idea what to do.&lt;/p&gt;
&lt;p&gt;
The mac I used was running an old version of OSX (&lt;a href=&#34;https://en.wikipedia.org/wiki/OS_X_Mavericks&#34;&gt;Mavericks&lt;/a&gt;) and I think in the newer ones the files might be encrypted.&lt;/p&gt;
&lt;p&gt;
I did have two backup plans:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try to find whatever is left from the files with &lt;a href=&#34;https://www.cgsecurity.org/wiki/Main_Page&#34;&gt;TestDisk&lt;/a&gt;, perhaps after copying the drive to make sure I don&amp;#39;t destroy anything by excident. This was a recommendation of Pascal and David.&lt;/li&gt;
&lt;li&gt;Pay someone to rescue as much data as possible. There are companies for this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the end I was very glad to get everything back.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>awk is a language</title>
      <link>https://schauderbasis.de/posts/awk_is_a_language/</link>
      <pubDate>Sat, 17 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/awk_is_a_language/</guid>
      <description>
&lt;p&gt;
Most of us know &lt;code&gt;awk&lt;/code&gt; as the program that you use when you want only
that one column of your output. Just pipe it through &lt;code&gt;awk &amp;#39;{print
$3}&amp;#39;&lt;/code&gt; and the third column you get.&lt;/p&gt;
&lt;p&gt;
Fewer people know that awk is a programming language. It is
specialized for processing structured input like tables.&lt;/p&gt;
&lt;p&gt;
As an example we will analyze this table of events at of the first
Quidditch match of the first Harry Potter book, Griffindor vs
Slytherin.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;player&lt;/th&gt;
&lt;th&gt;team&lt;/th&gt;
&lt;th class=&#34;align-right&#34;&gt;points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Johnson&lt;/td&gt;
&lt;td&gt;Griffindor&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spinnet&lt;/td&gt;
&lt;td&gt;Griffindor&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flint&lt;/td&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flint&lt;/td&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flint&lt;/td&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flint&lt;/td&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flint&lt;/td&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flint&lt;/td&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Potter&lt;/td&gt;
&lt;td&gt;Griffindor&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
You can run all the awk programs in this blogpost with &lt;code&gt;awk -F,
&amp;#39;PROGRAMM&amp;#39; quidditch.csv&lt;/code&gt; or by saving the awk-program into a file and
running &lt;code&gt;awk -F, -f &amp;#39;PROGRAMMFILE&amp;#39; quidditch.csv&lt;/code&gt;. The file can be
found &lt;a href=&#34;quidditch.csv&#34;&gt;here&lt;/a&gt;, it is the table from above with columns separated by &lt;code&gt;,&lt;/code&gt;.`&lt;/p&gt;
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
Get values from column 3
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
In &lt;code&gt;awk&lt;/code&gt; we think of the input as a sequence of &lt;em&gt;records&lt;/em&gt; (lines
normally) that consists of sequence of &lt;em&gt;fields&lt;/em&gt; (words). These fields
can be adressed by &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt; etc (and &lt;code&gt;$0&lt;/code&gt; is the whole record).&lt;/p&gt;
&lt;p&gt;
Lets extract the column &amp;#34;points&amp;#34;: The third field of each record.&lt;/p&gt;
&lt;div class=&#34;src src-awk&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-awk&#34; data-lang=&#34;awk&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Of course the header is not interesting here and we should remove it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
Remove the header
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
The syntax of &lt;code&gt;awk&lt;/code&gt; is a bit different from the programming languages
you might know. In &lt;code&gt;man awk&lt;/code&gt; we read:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An awk program is a sequence of patterns and corresponding
actions. When input is read that matches a pattern, the action
associated with that pattern is carried out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
So a program is a series of statements like this:&lt;/p&gt;
&lt;p&gt;
&amp;lt;script type=&amp;#34;text/javascript&amp;#34; src=&amp;#34;&lt;a href=&#34;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML&#34;&gt;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML&lt;/a&gt;&amp;#34;&amp;gt;
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;
$$\stackrel{\text{If the input matches this pattern ....}}{\overbrace{\text{pattern}}}\underset{\text{... then run this action on it}}{\underbrace{\left\{ \text{action}\right\} }}$$&lt;/p&gt;
&lt;p&gt;
In the case of our program above a special case zoccurs: If there is no
pattern given every record matches.&lt;/p&gt;
&lt;p&gt;
To remove the header of the results we can simply add a condition to
the program: Don&amp;#39;t act on the first line (the record where the record
number NR is 1).&lt;/p&gt;
&lt;div class=&#34;src src-awk&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-awk&#34; data-lang=&#34;awk&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NR&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; {&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&#34;align-right&#34;&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-3&#34;&gt;
Sum of a column …
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
Now lets get the sum of all the points scored by the players. Our first thought here
is to pipe the result into the program &lt;code&gt;sum&lt;/code&gt;. But interestingly enough
there is no such program in the world of commandlines as far as I
know. It seems like our ancestors with their great beards were fine
with writing their own version when they saw need to. And when they
did they probably used &lt;code&gt;awk&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;src src-awk&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-awk&#34; data-lang=&#34;awk&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NR&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+=$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END{&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&#34;example&#34;&gt;
230
&lt;/pre&gt;
&lt;p&gt;
Two things should be noted here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the line marked with &lt;code&gt;END&lt;/code&gt; is only triggered &lt;em&gt;after all the input has
been processed&lt;/em&gt;. There is a similar keyword (&lt;code&gt;BEGIN&lt;/code&gt;) which allows
code to be executed &lt;em&gt;before&lt;/em&gt; the rest of the code. (Dough!~)&lt;/li&gt;
&lt;li&gt;the variable &lt;code&gt;points&lt;/code&gt; did not have to be initialized. &lt;code&gt;awk&lt;/code&gt; is full
of sensible defaults and one of them is that a numerical variable
with no value is assumed to have the value &lt;code&gt;0&lt;/code&gt; if not stated
otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-4&#34;&gt;
… grouped by another column
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
To get the result of the Quidditch match we need to sum the points for
every team separately. We can use &lt;a href=&#34;https://www.gnu.org/software/gawk/manual/gawk.html#Arrays&#34;&gt;arrays&lt;/a&gt; (which would be called
&lt;code&gt;dict&lt;/code&gt; in other languages) for that.&lt;/p&gt;
&lt;div class=&#34;src src-awk&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-awk&#34; data-lang=&#34;awk&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NR&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END {&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;) { &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;]}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Griffindor&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;170&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
And here we have our final score of the game.&lt;/p&gt;
&lt;p&gt;
I really know only one other language which can do this sort of
processing with so little code: SQL. But SQL only works for databases
so it needs a big setup to be useful. So when I find myself with a
bunch of text files in a unixoid environment, then &lt;code&gt;awk&lt;/code&gt; is the way to
go.&lt;/p&gt;
&lt;p&gt;
Oh, and if you think Griffindor totally dominated this match, here is
how the score would have looked like if Harry hadn&amp;#39;t caught the snitch
(which happened more or less by luck).&lt;/p&gt;
&lt;div class=&#34;src src-awk&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-awk&#34; data-lang=&#34;awk&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NR&lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!~&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Potter&amp;#34;&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+=$&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END {&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;) { &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;points&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;]}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Griffindor&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slytherin&lt;/td&gt;
&lt;td class=&#34;align-right&#34;&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Remark</title>
      <link>https://schauderbasis.de/posts/remark/</link>
      <pubDate>Sat, 27 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/remark/</guid>
      <description>&lt;p&gt;Die letzten Tage habe ich auf der &lt;a href=&#34;https://de.pycon.org&#34;&gt;PyconGermany&lt;/a&gt;
in Karlsruhe verbracht. Die dominanten Themen waren Machine learning,
Docker und vielleicht noch ein bisschen BigData. Über Python2 redet
eigentlich keiner mehr, das ist schön.&lt;/p&gt;
&lt;p&gt;Ich habe viel gelernt und einige spannende Leute getroffen (schöne
Grüße an Corrie). Irgendwie schafft es die Pythoncommunity, ein
breiteres Feld als die üblichen Nerds anzusprechen (zu denen ich mich
selbst dazu zählen würde). Insbesondere das Verhaeltnis
Maenner:Frauen war erfreulich ausgeglichen, wenn auch noch nicht 1:1.&lt;/p&gt;
&lt;p&gt;Dort habe ich meinen ersten Lightningtalk gehalten. Ich war sehr
aufgeregt, zumal der Vortrag auf Englisch sein sollte. Aber es lief
sehr gut, ich habe das Zeitlimit eingehalten und die Aha-Momente sind
übergesprungen. Ich bin sehr zufrieden.&lt;/p&gt;
&lt;p&gt;Für die Slides habe ich &lt;a href=&#34;https://remarkjs.com/&#34;&gt;Remark.js&lt;/a&gt; verwendet:
Man hat eine html-Datei, den eigentlichen Inhalt schreibt man im
Markdownformat. Das wird dann vom Javascript in Folien umgewandelt,
wenn man die Datei im Browser öffnet. Das ist ein cleveres Format,
weil es mehrere Vorteile vereint:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Schreiben in Markdown&lt;/li&gt;
&lt;li&gt;Styling mit der Macht von HTML und CSS&lt;/li&gt;
&lt;li&gt;Code Highlighting mit highlight.js&lt;/li&gt;
&lt;li&gt;Nur ein einzelnes, schlankes Dokument (zumindest solange man keine
Bilder einbettet)&lt;/li&gt;
&lt;li&gt;Läuft auf jedem OS, das einen Browser hat.&lt;/li&gt;
&lt;li&gt;Es gibt ein minimales Interface für den Praesentierenden, in dem
Notitzen, ein Timer und die nächste Folie angezeigt wird. Hilfe
gibt es mit &lt;code&gt;h&lt;/code&gt; oder &lt;code&gt;?&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;interface.png&#34; alt=&#34;Interface fuer den Praesentierenden.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ein paar Schwierigkeiten habe ich aber noch:&lt;/p&gt;
&lt;p&gt;Es ist knifflig, offline zu präsentieren, weil Remark.js aus dem Netz
nachgeladen wird. Gerade auf Konferenzen ist stabiles Netz ja keine
Selbstverständlichkeit. Man kann das natürlich lösen, indem man das
Repo klont und die lokale Version lädt, aber dann ist es halt nicht
mehr so portabel.&lt;/p&gt;
&lt;p&gt;Außerdem habe ich ein bisschen die Allmacht von Orgmode vermisst,
Code einzubinden und den Output direkt generieren zu lassen. Aber das
ist ein Luxusproblem, wer Orgmode will muss eben Orgmode benutzen.&lt;/p&gt;
&lt;p&gt;Insgesamt war ich mit Remark.js sehr zufrieden und würde es für
Praesentationen wieder verwenden. Andererseits kenne ich mich gut
genug um zu wissen, dass ich selten zweimal das gleiche Setup für
meine Grafiken und Folien verwende. Es gibt einfach zu viele spannende
Tools.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Start videos from the commandline</title>
      <link>https://schauderbasis.de/posts/start-videos-from-the-commandline/</link>
      <pubDate>Sun, 16 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/start-videos-from-the-commandline/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tldr:&lt;/strong&gt; Just use &lt;code&gt;mpv VIDEOURL&lt;/code&gt; to start watching.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lets say you want to watch a video, how would you do it from the
commandline?&lt;/p&gt;
&lt;h2 id=&#34;local-video-file&#34;&gt;local video file&lt;/h2&gt;
&lt;p&gt;If the file you want to see is already on your computer, then this
can&amp;rsquo;t be too hard. Just go with your favorite video player (vlc in
this example):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vlc ~/Videos/Nyan_Cat.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;videos-from-the-internet&#34;&gt;videos from the internet&lt;/h2&gt;
&lt;p&gt;So what if the video isn&amp;rsquo;t already downloaded? Lets say we want to
look at this &lt;a href=&#34;https://www.youtube.com/watch?v=QH2-TGUlwu4&#34;&gt;YouTube Video: Nyan Cat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No problem, we can download it right away with
&lt;a href=&#34;https://github.com/rg3/youtube-dl&#34;&gt;youtube-dl&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;youtube-dl -o &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/Videos/Nyan_Cat.mkv&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.youtube.com/watch?v=QH2-TGUlwu4&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; vlc ~/Videos/Nyan_Cat.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The reason why we don&amp;rsquo;t use &lt;code&gt;curl&lt;/code&gt;/&lt;code&gt;wget&lt;/code&gt; here is that we don&amp;rsquo;t have
the url of the video file itself (and if we did, we could just
continue to feed it into vlc directly). The video is embedded into a
website and there is no trivial way to get its url. If we ask
youtube-dl nicely (with &lt;code&gt;--get-url&lt;/code&gt;) he will tell us, but at this
point we have used youtube-dl anyway, so what&amp;rsquo;s the point?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;get-url.jpg&#34; alt=&#34;The video that google uses has a really long url. Something tells me that is isn&amp;rsquo;t meant for direct use.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Youtube-dl is quite amazing. It supports a &lt;a href=&#34;https://rg3.github.io/youtube-dl/supportedsites.html&#34;&gt;great number of video
sites&lt;/a&gt; and file
formats. It also supports playlists, logins for private videos and
downloading the audio only. Being controlled from the commandline
makes it scriptable, but the best thing about it is that it has been
under &lt;a href=&#34;https://github.com/rg3/youtube-dl/graphs/commit-activity&#34;&gt;continuous
development&lt;/a&gt;
for many years now, catching up with all the api-changes from all the
supported websites.&lt;/p&gt;
&lt;h2 id=&#34;streaming-not-downloading&#34;&gt;streaming, not downloading&lt;/h2&gt;
&lt;p&gt;Downloading works, but what if we want to start to watch straight
away, waiting for the download to finish is unnecessary (especially if
the video is a big one, like the 10 hour version of the video above).&lt;/p&gt;
&lt;p&gt;Youtube-dl can write the file to stdout (&lt;code&gt;--output -&lt;/code&gt;) and tell the
video-player to play from stdin (&lt;code&gt;vlc -&lt;/code&gt; in this case).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;youtube-dl --output - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://www.youtube.com/watch?v=wZZ7oFKsKzY&amp;#39;&lt;/span&gt; | vlc -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unfortunatelly there is no easy way to jump positions in the videos itself.&lt;/p&gt;
&lt;h2 id=&#34;mpv-to-the-rescue&#34;&gt;mpv to the rescue&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;vlc&lt;/code&gt; has a big fanbase, but for quite some time I preferred to use
&lt;code&gt;mplayer&lt;/code&gt;, because it has the most minimal gui imaginable (a window
whith the video in it, nothing more) and is easier to use from the
keyboard. &lt;em&gt;Then&lt;/em&gt; I found &lt;a href=&#34;https://mpv.io/&#34;&gt;&lt;code&gt;mpv&lt;/code&gt;&lt;/a&gt;, a pimped version of
mplayer - and everything is perfect. Much like &lt;code&gt;feh&lt;/code&gt; for images, it does all I want and goes out of the way otherwise. I just love it.&lt;/p&gt;
&lt;p&gt;Mpv makes all the problems from above trivial.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mpv &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://www.youtube.com/watch?v=wZZ7oFKsKzY&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It uses youtube-dl, can show subtitles in different languages, jumps
between positions and has an easy syntax. It is free software (like
all the other programs I talked about in this post) and its
development continues steadily.&lt;/p&gt;
&lt;h2 id=&#34;why-not-use-a-browser-like-a-normal-person&#34;&gt;Why not use a browser, like a normal person?&lt;/h2&gt;
&lt;p&gt;Using a native video-player comes with some cool bonuses. You can
configure and finetune it, use media-keys on your keyboard, it plays
nicely with the rest of your setup and your window-manager etc.&lt;/p&gt;
&lt;p&gt;The only downside I see is that the resolution is not adjusted on the
fly if the connection is not good enough to stream in full
resolution. That&amp;rsquo;s why I still use a browser for twitch-streams.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wieder da</title>
      <link>https://schauderbasis.de/posts/wieder-da/</link>
      <pubDate>Sat, 08 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/wieder-da/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Ich bin wieder da. Der Blog hat lange geruht und jetzt habe ich Lust,
wieder zu schreiben.&lt;/p&gt;
&lt;p&gt;Der Blog war auch und vor allem deshalb fort, weil wir unseren
geliebten Server Gipfelsturm verloren haben. Da sind auch Sandras und
mein Ghostblog drauf gewesen und ich wollte erst wieder schreiben,
wenn ich beide Blogs wieder so weit habe, dass sie benutzt werden
können (Es wäre unfair gewesen, selbst weiter zu bloggen bevor ihr
Blog wieder läuft).&lt;/p&gt;
&lt;p&gt;Dazu musste ich aber aus schlechten Backups die meisten Artikel wieder
herzaubern (viel habe ich von archive.org und dem google-cache
gezogen, Viele Bilder hatten wir noch und einige konnten wir wieder
zuordnen) und eine ganz neue Bloginfrastrucktur aufbauen. Das war eine
lange Reise, aber jetzt bin ich ganz zufrieden. Vielleicht schreibe
ich später mehr zu den Details. Die Hauptsache ist, dass ich jetzt
große Kontrolle über den Blog habe (wenn was nicht geht kann ich es
wahrscheinlich reparieren) und es trotzdem einfach ist, zu bloggen.&lt;/p&gt;
&lt;p&gt;Es läuft wieder was in der Schauderbasis.&lt;/p&gt;
&lt;p&gt;PS: Der RSS-Feed funktioniert auch: &lt;a href=&#34;https://schauderbasis.de/index.xml&#34;&gt;https://schauderbasis.de/index.xml&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bilder aussortieren</title>
      <link>https://schauderbasis.de/posts/bilder-aussortieren/</link>
      <pubDate>Sun, 16 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/bilder-aussortieren/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Es gab eine Feier, jemand hat Fotos gemacht und rumgeschickt. Oder vielleicht habe ich selbst hundert mal den selbe Essen fotografiert. Jedenfalls sind da ein Haufen Bilder und ich will nur die guten behalten.&lt;/p&gt;
&lt;p&gt;Dieses Aussortieren macht wenig Spaß und soll deshalb schnell gehen. Wenn man es gut macht hat man danach nur noch 5-10% der Bilder. Der Lohn: Man kann den wenigen guten Bildern viel mehr Beachtung schenken.&lt;/p&gt;
&lt;p&gt;Erstaunlicherweise bietet der einfachste (und schnellste) mir bekannte Imageviewer dafür das beste Interface bereit: &lt;code&gt;feh&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;vorbereitung&#34;&gt;Vorbereitung&lt;/h2&gt;
&lt;p&gt;Wir bilden den Sortierprozess auf das Filesystem ab. Wärend dem sortieren haben wir 3 Haufen von Fotos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;die noch unsortierten Fotos (&lt;code&gt;~/Pictures/feier&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;die guten Fotos (&lt;code&gt;~/Pictures/feier/good&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;die schlechten Fotos (&lt;code&gt;~/Pictures/feier/bad&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ~/Pictures/feier
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/Pictures/feier
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv ~/Downloads/feier.zip .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir good bad
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unzip feier.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wir werden die schlechten Bilder erst wegwerfen wenn wir mit dem sortieren ganz fertig sind (so vermeiden wir unglückliche Versehen).&lt;/p&gt;
&lt;h2 id=&#34;sortieren&#34;&gt;Sortieren&lt;/h2&gt;
&lt;p&gt;Hier steckt die ganze Magie drin:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;feh --auto-zoom --scale-down --action1 &amp;#34;mv %f good/&amp;#34; --action2 &amp;#34;mv %f bad/&amp;#34; .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Übersetzt bedeutet das: &amp;ldquo;Zeige alle Bilder im aktuellen Verzeichnis (&lt;code&gt;.&lt;/code&gt;) nacheinander (als Slideshow) an, so gezoomt das man immer das ganze Foto sehen kann. Wenn ich die Taste &lt;code&gt;1&lt;/code&gt; drücke, verschiebe das aktuelle Bild ins Verzeichnis &lt;code&gt;good&lt;/code&gt;, wenn ich &lt;code&gt;2&lt;/code&gt; rücke verschiebe es nach &lt;code&gt;bad&lt;/code&gt;.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Nette Annehmlichkeiten sind dabei:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn man gerade nicht sicher ist, kann man mit den Pfeiltasten einfach zum nächsten Bild springen und die Entscheidung verschieben.&lt;/li&gt;
&lt;li&gt;Ein Bild, bei dem man eine Wahl getroffen hat wird nicht mehr angezeigt. Sind keine Bilder mehr übrig, wird das Programm beendet&lt;/li&gt;
&lt;li&gt;Will man unterbrechen, hilft die Taste &lt;code&gt;q&lt;/code&gt;, was man bisher sortiert hat bleibt auch sortiert.&lt;/li&gt;
&lt;li&gt;feh ist zwar schlank und klein, aber zum zoomen und Bilder richtig herum drehen reicht es noch.&lt;/li&gt;
&lt;li&gt;Wie die meisten Unix-workflows ist auch dieser sehr flexibel. Ideen, die man damit schnell verwirklichen könnte:
&lt;ul&gt;
&lt;li&gt;einen dritten Ordner (&lt;code&gt;bin_nicht_sicher&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;mehrere Sortierdurchläufe.&lt;/li&gt;
&lt;li&gt;Photos taggen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Das Interface ist so einfach wie nur irgend möglich: Man sieht nur das Bild und hat genau 2 Tasten für 2 Möglichkeiten.&lt;/li&gt;
&lt;li&gt;Es geht schnell. Wenn man mal ein bisschen drin ist hat man schnell einige Hundert Bilder sortiert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;bilder_sortieren_2.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;nachbereitung&#34;&gt;Nachbereitung&lt;/h2&gt;
&lt;p&gt;Zum Schluss (und wenn man sich sicher ist) wirft man die schlechten Fotos weg und behält die guten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm bad/* -f
mv good/* .
rmdir good bad
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>Hörbücher auf SailfishOS</title>
      <link>https://schauderbasis.de/posts/horbucher-auf-sailfishos/</link>
      <pubDate>Fri, 09 Sep 2016 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/horbucher-auf-sailfishos/</guid>
      <description>&lt;p&gt;Unterwegs höre ich sehr gerne Hörbücher - besonders in vollen öffentlichen Verkehrsmitteln, wo man ohnehin nicht viel anderes machen kann als Musik/Podcasts/Hörbüchern zu lauschen oder seinen Feedreeder durchzuarbeiten. Auf SailfishOS gibt es keinen nativen Client, aber die Standardapp &amp;ldquo;Medien&amp;rdquo; funktioniert wunderbar. Wie ist also der Workflow?&lt;/p&gt;
&lt;h1 id=&#34;umweg-über-den-rechner&#34;&gt;Umweg über den Rechner&lt;/h1&gt;
&lt;p&gt;Bestimmt geht das auch direkt auf dem Telefon, aber ehrlich gesagt habe ichs noch nicht ausprobiert. Außerdem geht es dank &lt;code&gt;ssh&lt;/code&gt;/&lt;code&gt;scp&lt;/code&gt; sehr flott auch von der Kommandozeile.&lt;/p&gt;
&lt;h2 id=&#34;hörbuch-finden&#34;&gt;Hörbuch finden&lt;/h2&gt;
&lt;p&gt;Ich könnte es gar nicht besser zusammenschreiben als es im &lt;a href=&#34;https://www.reddit.com/r/audiobooks/wiki/_/wiki/sources&#34;&gt;Wiki Audiobooks Subreddit&lt;/a&gt; steht.&lt;/p&gt;
&lt;p&gt;Für diesen Blogpost wählen wir &lt;a href=&#34;https://librivox.org/the-wrong-box-by-robert-louis-stevenson-and-lloyd-osbourne/&#34;&gt;The Wrong Box&lt;/a&gt; auf &lt;a href=&#34;https://librivox.org&#34;&gt;Librivox&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;hörbuch-herunterladen&#34;&gt;Hörbuch herunterladen&lt;/h2&gt;
&lt;p&gt;Hörbücher sind meistens mehrere Audiodateien, zum Beispiel eine für jedes Kapitel. Meistens bekommt man diese schön kompakt in einer zip-Datei, die lädt man herunter und entpackt sie. Manchmal sieht man aber auch nur eine Website voll mit Links zu dein einzelenen Dateien (wsl für Leute, die alles direkt im Browser konsumieren wollen). In diesem Fall hilft dieser Befehl.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lynx -dump https://librivox.org/the-wrong-box-by-robert-louis-stevenson-and-lloyd-osbourne/ | grep 64kb.mp3$ | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; | xargs -n1 wget
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In Worten: Schau dir alle Links der genannten Webseite an, nimm die die auf &amp;ldquo;64kb.mp3&amp;rdquo; enden und lade sie einzeln herunter. (Es könnte also schlau sein, das in einem leeren Ordner auszuführen.)&lt;/p&gt;
&lt;p&gt;Bei librivox ist das aber eigentlich nicht nötig, man kann alles direkt herunterladen (sogar per Torrent, wohooo!).&lt;/p&gt;
&lt;p&gt;Es macht übrigends alles (erheblich) einfacher, wenn die Dateien so benannt sind, dass die alphabetische und die logische Ordnung übereinstimmen.&lt;/p&gt;
&lt;h2 id=&#34;ssh-aufs-telefon&#34;&gt;ssh aufs Telefon&lt;/h2&gt;
&lt;p&gt;Testweise kann man sich schonmal aufs Telefon verbinden und den Ordner anlegen, wo die Dateien später liegen sollen. Ssh muss in den Einstellungen des Telefons unter &amp;ldquo;Entwicklermodus&amp;rdquo; aktiviert werden, dort findet man auch Passwort und IP-Adresse.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh nemo@192.168.178.29
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir Music/wrong_box
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;hörbuch-aufs-telefon&#34;&gt;Hörbuch aufs Telefon&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;20160909151535_2.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Da wir ja jetzt schon alles vorbereitet haben, reicht ein kurzes Befehl:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;scp *.mp3 nemo@192.168.178.29:/home/nemo/Music/wrong_box
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das wars schon.&lt;/p&gt;
&lt;h2 id=&#34;hören&#34;&gt;Hören&lt;/h2&gt;
&lt;p&gt;Wir können alles in der Medien-App anhören. Nach dem aktuellen Kapitel wird automatisch zum nächsten gesprungen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Firefox History in der Kommandozeile</title>
      <link>https://schauderbasis.de/posts/firefox-history-in-der-kommandozeile/</link>
      <pubDate>Mon, 23 May 2016 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/firefox-history-in-der-kommandozeile/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Firefox ist so bekannt geworden, weil man alles mögliche an ihm einstellen kann. Warum ist es dann so schwer, ihn von der Kommandozeile zu steuern?&lt;/p&gt;
&lt;p&gt;Ich würde wirklich gerne ein paar Skripte schreiben, welche die aktuell geöffneten Seiten von Firefox auswerten (zum Beispiel um die aktuelle Seite in eine Liste einzutragen, einen Eintrag in meinen Passwortmanager zu machen oder ähnliches).&lt;/p&gt;
&lt;p&gt;Leider ist das scheinbar sehr schwierig, denn dieser riesige Kloß von einem Browser kann scheinbar nicht nach außen kommunizieren (Ich arbeite gerade mit Mozilla Firefox 46). Folgenden Notbehelf habe ich gefunden:&lt;/p&gt;
&lt;h2 id=&#34;die-neuste-seite-ist-aktuell&#34;&gt;Die neuste Seite ist aktuell&lt;/h2&gt;
&lt;p&gt;Ich nehme vereinfachend an, dass ich mich nur für die Seite interessiere, die als letztes aufgerufen wurde. Dann muss man &lt;em&gt;nur&lt;/em&gt; in der Firefox History nachschauen, welche Seite die letzte war und sie ausgeben.&lt;/p&gt;
&lt;p&gt;Warum ist das leichter? Firefox speichert seine History, Bookmarks und noch ein paar andere Dinge in einer sqlite Datenbank: &lt;code&gt;$HOME/.mozilla/iwfal82r.default/places.sqlite&lt;/code&gt;. (Der Teil vor &amp;ldquo;default&amp;rdquo; sieht jedes mal ein bisschen anders aus, aber das findet man schon. Im Folgenden benutze ich ein Regexsternchen, so dass die Befehle bei jedem funktionieren sollten.) Da ich ja neulich schon &lt;a href=&#34;https://www.schauderbasis.de/ping-db/&#34;&gt;etwas Erfahrung mit Datenbanken&lt;/a&gt; gesammelt habe, wage ich mich da mal rein.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Geschichte.jpg&#34; alt=&#34;So sieht eine Datenbank von innen aus&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;in-der-datenbank&#34;&gt;In der Datenbank&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite3 $HOME/.mozilla/firefox/*.default/places.sqlite

SQLite version 3.13.0 2016-05-18 10:57:30
Enter &amp;#34;.help&amp;#34; for usage hints.
sqlite&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wir sind jetzt in der Datenbank (raus kommen wir mit Ctrl-D). Erstmal schauen wir was es hier für tables gibt:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; .tables
moz_anno_attributes  moz_favicons         moz_items_annos    
moz_annos            moz_historyvisits    moz_keywords       
moz_bookmarks        moz_hosts            moz_places         
moz_bookmarks_roots  moz_inputhistory  
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Tabelle die wir brauchen ist die &lt;code&gt;moz_places&lt;/code&gt;. Hier ist unsere gesamte Browserhistory drin (habe ich &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database&#34;&gt;hier&lt;/a&gt; rausgefunden). Wir schauen uns die Spalten der Tabelle an:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; pragma table_info(moz_places);
0|id|INTEGER|0||1
1|url|LONGVARCHAR|0||0
2|title|LONGVARCHAR|0||0
3|rev_host|LONGVARCHAR|0||0
4|visit_count|INTEGER|0|0|0
5|hidden|INTEGER|1|0|0
6|typed|INTEGER|1|0|0
7|favicon_id|INTEGER|0||0
8|frecency|INTEGER|1|-1|0
9|last_visit_date|INTEGER|0||0
10|guid|TEXT|0||0
11|foreign_count|INTEGER|1|0|0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Für uns sind &lt;code&gt;url&lt;/code&gt; und &lt;code&gt;last_visit_date&lt;/code&gt; wichtig (denn wir wollen ja die URL, die &lt;em&gt;zuletzt&lt;/em&gt; aufgerufen wurde). Wir tasten uns mal langsam ran:&lt;/p&gt;
&lt;h6 id=&#34;alle-urls-die-ich-je-aufgerufen-habe&#34;&gt;Alle URLS, die ich je aufgerufen habe&lt;/h6&gt;
&lt;p&gt;Alphabetisch sortiert.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; select url from moz_places;
...
&lt;/code&gt;&lt;/pre&gt;&lt;h6 id=&#34;alle-urls-die-ich-je-aufgerufen-habe-1&#34;&gt;Alle URLS, die ich je aufgerufen habe&lt;/h6&gt;
&lt;p&gt;Nach Datum sortiert.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; select url from moz_places order by last_visit_date;
...
&lt;/code&gt;&lt;/pre&gt;&lt;h6 id=&#34;wann-die-letzte-url-aufgerufen-wurde&#34;&gt;Wann die letzte URL aufgerufen wurde&lt;/h6&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; select max(last_visit_date) from moz_places;
1464029535578940
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hmm, eigentlich sollte hier ein Datum stehen. Laut table_info ist dieses als Integer kodiert. Das Internet hilft weiter.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; select max(last_visit_date) as raw_visit_date,datetime(last_visit_date/1000000,&amp;#39;unixepoch&amp;#39;) from moz_places;
1464029535578940|2016-05-23 18:52:15
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sieht doch gleich viel besser aus, die ISO 8601 lebe hoch. Aber irgendwie ist das um zwei Stunden falsch? Ach ja, Zeitzonen.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; select max(last_visit_date) as raw_visit_date,datetime(last_visit_date/1000000,&amp;#39;unixepoch&amp;#39;,&amp;#39;localtime&amp;#39;) from moz_places;
1464029535578940|2016-05-23 20:52:15
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Geht doch.&lt;/p&gt;
&lt;p&gt;Eigentlich brauchen wir diese schick formatierten Strings aber gar nicht, wir wollen ja nur nach Zeit sortieren. Deswegen orientieren wir uns am ersten Versuch.&lt;/p&gt;
&lt;h6 id=&#34;die-url-die-ich-als-letztes-besucht-habe&#34;&gt;Die URL, die ich als letztes besucht habe&lt;/h6&gt;
&lt;p&gt;Genau genommen fragen wir eher nach allen urls, die zu dem Zeitpunkt aufgerufen wurden, an dem wir zuletzt eine url aufgerufen haben.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlite&amp;gt; select url from moz_places where last_visit_date=(select max(last_visit_date) from moz_places);
https://www.schauderbasis.de/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hurra, es funktioniert!&lt;/p&gt;
&lt;h2 id=&#34;für-skripte&#34;&gt;Für Skripte&lt;/h2&gt;
&lt;p&gt;Damit wir uns nicht ständig in sqlite einloggen müssen, kann man das auch von außen tun.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sqlite3 $HOME/.mozilla/firefox/*.default/places.sqlite &amp;#34;select url from moz_places where last_visit_date=(select max(last_visit_date) from moz_places)&amp;#34;
https://www.schauderbasis.de/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So, da ist sie. Die letzte besuchte Url. Das funktioniert, auch sofort nach dem Aufrufen der Url oder wenn der Firefox aus ist.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An der Weboberfläche kratzen</title>
      <link>https://schauderbasis.de/posts/an-der-weboberflaeche-kratzen/</link>
      <pubDate>Mon, 25 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/an-der-weboberflaeche-kratzen/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Ich mag Programmieren, aber mit Netzwerk, Browser, Javascript und Webseiten kenne ich mich nicht gut aus. Wenn ich dann einen Fuß ins kalte Wasser halte, ist es schon spannend (für mich). Hier mein jüngstes Erlebnis:&lt;/p&gt;
&lt;h2 id=&#34;bilder-in-ghost&#34;&gt;Bilder in Ghost&lt;/h2&gt;
&lt;p&gt;Meine Freundin hat, wie ich, einen Ghostblog. Anders als ich schreibt sie dort regelmäßig und oft, mit vielen Bildern über Abenteuer in der Küche. Neulich konnte sie plötzlich keine Bilder mehr hochladen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;something_went_wrong.png&#34; alt=&#34;Something went wrong&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;fehlerjagd&#34;&gt;Fehlerjagd&lt;/h3&gt;
&lt;p&gt;Fehler eingrenzen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Fehlermeldung ist wenig hilfreich.&lt;/li&gt;
&lt;li&gt;So wenig hilfreich, das man nicht mal sinvoll danach googlen kann.&lt;/li&gt;
&lt;li&gt;Till und ich haben Blogs auf dem gleichen Server, können aber Bilder hochladen.&lt;/li&gt;
&lt;li&gt;Auf Sandras Blog kann man keine Bilder hochladen, egal ob von ihrem oder meinem Account.&lt;/li&gt;
&lt;li&gt;Firefox, Safari oder Chrome - kein Unterschied&lt;/li&gt;
&lt;li&gt;Verschiedene Dateitypen oder kleinere Bilder ändern nichts an der Fehlermeldung.&lt;/li&gt;
&lt;li&gt;Die offizielle Ghost Dokumentation ist lausig. Immerhin gibt es einen sehr kurzen Abschnitt über &lt;a href=&#34;https://support.ghost.org/troubleshooting/#image-upload-issues&#34;&gt;Image upload issues&lt;/a&gt;. Nichts Hilfreiches. Das angesprochene Cloudflair benutzen wir nicht.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ideen, woran es liegen könnte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sandras Blog ist von allen mir bekannten Ghostblogs der mit dem meisten Content, insbesondere der mit den meisten Bildern. Vielleicht gibt es da irgendwo ein Quota, dass erreicht ist?&lt;/li&gt;
&lt;li&gt;Sandras Blog ist der mit dem Umlaut in der url (&amp;ldquo;Gewürzrevolver&amp;rdquo;). So bitter es ist, das hat bis jetzt einige Probleme gemacht. Liegt es vielleicht daran?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mehr kann ich jetzt alleine nicht rausfinden, ab hier brauche ich Ansprechpartner.&lt;/p&gt;
&lt;h3 id=&#34;mal-fragen&#34;&gt;Mal fragen&lt;/h3&gt;
&lt;p&gt;Ich befrage Till (der Herr über den Server) und den Ghost Slack Channel &lt;a href=&#34;https://ghost.slack.com/messages/help/&#34;&gt;help&lt;/a&gt;, wo ein &lt;a href=&#34;https://ghost.slack.com/team/kevin&#34;&gt;Kevin&lt;/a&gt; mir freundlich zur Seite steht.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Gibt es auf unserem Server irgendeine Begrenzung des Speicherplatzes?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nein, Till weiß von keinem Quota und ein mysteriöses künstliches Quota bei Ghost scheint auch nicht zu existieren.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Wo soll ich nach Fehlern suchen?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Schau mal in den Web Inspektor.&lt;/p&gt;
&lt;p&gt;Wie immer, wenn ich mit dem Support spreche google ich nebenbei, was die Antworten bedeuten. Den Webinspektor ist das Tor in die Javascript-Hölle. &lt;em&gt;Here be dragons&lt;/em&gt;. Aber &lt;em&gt;here be also a log of what happens in your browser when you interact with a website&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Inspect_element.png&#34; alt=&#34;Webinspektor öffnen&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ich öffne also den Webinspector und versuche, ein Bild auf den Blog hochzuladen. Tatsächlich finde ich nach ein bisschen herumsuchen eine Fehlermeldung.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;webkonsole.png&#34; alt=&#34;So sieht ein Fehler auf einer Webseite aus&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;error.png&#34; alt=&#34;Die Fehlermeldung&#34;&gt;&lt;/p&gt;
&lt;p&gt;Die Fehler kommt in Form eines JSON Objektes, die entscheidende Zeile ist:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;EACCES, open &amp;#39;/var/www/ghost/revolver/content/images/2016/04/Organigram-svg.png&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sehr hilfreich sieht das erstmal nicht aus. Aber wenn man mal schaut, was EACCES überhaupt heißt, bekommt man heraus dass es sich wohl um einen permission error in dem angegebenen Ordner handelt. (Diese Schlussfolgerung zieht eigentlich der hilfreiche Kevin aus dem Ghost Chat, ich plappere das nur fleißig nach).&lt;/p&gt;
&lt;p&gt;Also nochmal dem Till geschrieben, mit der Bitte die Rechte in dem Ordner zu checken und - tatsächlich, das war es. Der Upload funktioniert jetzt wieder und Sandra kann ihren neuen Blogpost mit Bildern ausstatten (&lt;a href=&#34;https://gew%C3%BCrzrevolver.de/sie-sind-wieder-da-spargel-und-rhabarber/&#34;&gt;Spargel&lt;/a&gt;, Huäääääääh!).&lt;/p&gt;
&lt;h2 id=&#34;abschliessende-gedanken&#34;&gt;Abschliessende Gedanken:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fehlermeldungen sollten immer aus zwei (!) Teilen bestehen: Eine technische (für den Entwickler) und eine menschenlesbare für den User.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Something went wrong.&amp;rdquo; ist keine gute Fehlermeldung. Da ist &lt;em&gt;keine&lt;/em&gt; nützliche Information drin. Dass es nicht geklappt hat sieht der User auch so.&lt;/li&gt;
&lt;li&gt;Der Fehlersuche war &lt;em&gt;nicht&lt;/em&gt; qualvoll und nervig, denn alle waren geduldig und haben sich professionell verhalten. So macht das Spaß, danke an Till und Kevin.&lt;/li&gt;
&lt;li&gt;Wie so oft bei Computerproblemen gilt: Wenn du noch nicht wirklich selbst versucht hast, das Problem zu lößen, dann ist es nicht angebracht anderer Leute wertvolle Zeit dafür in Anspruch zu nehmen.&lt;/li&gt;
&lt;li&gt;Keiner weiß, wie das mit den Rechten passiert ist (mit den Rechten weiß man das nie so recht). Till war es nicht und auch sonst keiner. Auf dem Server spukt es.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Titelbild von &lt;a href=&#34;https://pixabay.com/en/cat-scratching-sun-pet-scratch-750259/&#34;&gt;hier&lt;/a&gt;, Pixabay ist eine tolle Quelle für freie Bilder)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ping Datenbank</title>
      <link>https://schauderbasis.de/posts/ping-db/</link>
      <pubDate>Mon, 25 Jan 2016 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/ping-db/</guid>
      <description>&lt;p&gt;Pingplot war als Vorbereitung für ein etwas größeres Projekt gedacht,
für das ich eine Datenbank einsetzen möchte. Also sollte ich erst mal
lernen, wie man mit Datenbanken arbeitet.&lt;/p&gt;
&lt;p&gt;Tatsächlich habe ich am Ende etwas mehr gelernt als gedacht und ein
bisschen älteres Wissen aufgefrischt.&lt;/p&gt;
&lt;h2 id=&#34;grundidee&#34;&gt;Grundidee&lt;/h2&gt;
&lt;p&gt;Daten, die laufend generiert werden sollen gesammelt und visualisiert
werden. Zum Üben nehme ich den Ping zu einer Website. Der eignet sich
weil es ein beständiger Strom von nicht zufälligen, aber auch nicht
voraussagbaren Datenpunkten ist.&lt;/p&gt;
&lt;p&gt;Es wird 4 zentrale Programme in unserem Setup geben:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Die Steuerzentrale&lt;/li&gt;
&lt;li&gt;Die Datenquelle&lt;/li&gt;
&lt;li&gt;Die Datenbank&lt;/li&gt;
&lt;li&gt;Die Datenaufbereitung&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;Organigram-svg-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Mir ist wichtig, das am Ende &lt;em&gt;alles&lt;/em&gt; auf Knopfdruck funktioniert. Der
Befehl, einen Plot zu erstellen ist nur &lt;em&gt;ein&lt;/em&gt; Befehl sein und es ist
keine weiteres Eingreifen meinerseits notwendig, erst recht kein hin-
und herkopieren von Daten. Dieses Prinzip hat sich bei meiner
Bachelorarbeit extrem gut bewährt - irgendwann drückt man nur noch auf
den Knopf und hat etwas später 50 Graphen und Diagramme, die man
analysieren kann.&lt;/p&gt;
&lt;h2 id=&#34;die-steuerzentrale---gnu-make&#34;&gt;Die Steuerzentrale - Gnu Make&lt;/h2&gt;
&lt;p&gt;Als ich zum ersten mal ein Makefile benutzt habe war ich wirklich
begeistert von der Idee: Wenn man in einem Directory ohnehin immer
wieder das gleiche macht, kann man das auch automatisieren. Und
tatsächlich habe ich beim Programmieren immer ein Terminal laufen, in
das ich permanent die selben Sachen eingebe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compilieren&lt;/li&gt;
&lt;li&gt;testcase mit den einen Parametern&lt;/li&gt;
&lt;li&gt;testcase mit den anderen Parametern&lt;/li&gt;
&lt;li&gt;Zwischenergebnisse aufräumen, um sie neu zu erstellen&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;temporäre Dateien aufräumen&amp;ndash; Ups, da war was Wichtiges dabei :(&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stattdessen schreibt man ein Makefile, indem das alles vorformuliert ist und gibt dann nur noch Befehle wie:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;make compile
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;oder&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;make plot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dank tab-completion geht das schneller und man vertippt sich nicht
ausversehen. Ich finde es ja allgemein ganz gut, wenn ein Programm
möglichst viel über sich selbst weiß und sich selbst quasi selbst
organisiert (Solange klar ist, das ich noch der Chef bin - die
Apple-Lösung mit diesen Mediathekformat, in das man nicht reinschauen
kann).&lt;/p&gt;
&lt;p&gt;Die Syntax von Makefiles ist erstmal sehr einfach. Man schreibt das
target auf, einen Doppelpunkt dahinter - und danach eingerückt die
Befehle, die ausgeführt werden sollen wenn das target aufgerufen wird.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;plot:
	gnuplot graph.plot
	feh --reload 1 ping.png &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mehr muss man erstmal nicht wissen.&lt;/p&gt;
&lt;h2 id=&#34;die-datenquelle---ein-kurzes-shell-skript&#34;&gt;Die Datenquelle - ein kurzes Shell-Skript&lt;/h2&gt;
&lt;p&gt;Um den Ping zu einer Website herauszufinden, reicht ein einfaches&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ping www.schauderbasis.de
PING www.schauderbasis.de (5.45.107.67) 56(84) bytes of data.
64 bytes from v22013121188416155.yourvserver.net (5.45.107.67): icmp_seq=1 ttl=61 time=29.9 ms
64 bytes from v22013121188416155.yourvserver.net (5.45.107.67): icmp_seq=2 ttl=61 time=37.2 ms
64 bytes from v22013121188416155.yourvserver.net (5.45.107.67): icmp_seq=3 ttl=61 time=28.2 ms
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Uns interessieren die Werte zwischen &lt;code&gt;time=&lt;/code&gt; und &lt;code&gt; ms&lt;/code&gt;. Um die
herauszubekommen hat für mich folgendes funktioniert:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nur noch ein Wert stat unendlich viele:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ping -c 1 www.schauderbasis.de
PING www.schauderbasis.de (5.45.107.67) 56(84) bytes of data.
64 bytes from v22013121188416155.yourvserver.net (5.45.107.67): icmp_seq=1 ttl=61 time=29.8 ms

--- www.schauderbasis.de ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 29.865/29.865/29.865/0.000 ms
    
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Nur noch die zweite Zeile, wo die wichtige Information drin steht:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ping -c 1 www.schauderbasis.de | sed -n 2p
64 bytes from v22013121188416155.yourvserver.net (5.45.107.67): icmp_seq=1 ttl=61 time=28.9 ms
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Davon die achte Spalte&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ping -c 1 www.schauderbasis.de | sed -n 2p | awk &amp;#39;{print $8}&amp;#39;
time=29.1
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Und dann alles ab dem sechsten Buchstaben:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ping -c 1 www.schauderbasis.de | sed -n 2p | awk &amp;#39;{print $8}&amp;#39; | cut -c 6-
29.6
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wunderbar.&lt;/p&gt;
&lt;h3 id=&#34;mehr-werte&#34;&gt;Mehr Werte&lt;/h3&gt;
&lt;p&gt;Damit wir nachher eine ordentliche Datenbasis haben, wollen wir viele
Werte hintereinander generieren. Eigentlich macht das &lt;code&gt;ping&lt;/code&gt; ja
schon selbst, aber wir bauen uns hier eine eigene Schleife, so das wir Daten sofort einlesen können.&lt;/p&gt;
&lt;p&gt;Optionale Argumente (wusste ich vorher auch nicht) gehen so:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# number of datapoints to generate: take first argument or 10 as default
n=${1:-10}
# sleeptime: take second argument or 1 as default
t=${2:-1}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Am Ende (mit ein bisschen Zeug aus dem nächsten Abschnitt) sieht das ganze so aus.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;database_name=&amp;#34;pingDB&amp;#34;
table_name=&amp;#34;pingtimes&amp;#34;
url=&amp;#34;www.schauderbasis.de&amp;#34;
dbdo=&amp;#34;mysql -u root -s $database_name -e&amp;#34;

# number of datapoints to generate: take first argument or 10 as
# default
n=${1:-10}
# sleeptime; take second argument or 1 as default
t=${2:-1}

for i in `seq $n`
do
    pingtime=$(ping -c 1 $url | sed -n 2p | awk &amp;#39;{print $8}&amp;#39; | cut -c 6-)
    $dbdo &amp;#34;insert into $table_name (Zeitpunkt, URL, Ping) values (NOW(), &amp;#39;$url&amp;#39;, $pingtime);&amp;#34;
    sleep $t
done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Gar nicht mal so hässlich, von bash bin ich schlimmeres gewohnt.&lt;/p&gt;
&lt;h2 id=&#34;die-datenbank---mariadb&#34;&gt;Die Datenbank - MariaDB&lt;/h2&gt;
&lt;p&gt;Es gibt verschiedene Datenbanken für verschiedene Zwecke. Ich habe
mich für MariaDB entschieden, hauptsächlich wegen dem Artikel im
&lt;a href=&#34;https://wiki.archlinux.org/index.php/MySQL&#34;&gt;Arch-Wiki&lt;/a&gt; zum aufsetzen
und dem
&lt;a href=&#34;https://mariadb.com/kb/en/mariadb/a-mariadb-primer/&#34;&gt;Tutorial&lt;/a&gt; auf
der Website von MariaDB, das mit genau so viel Information gegeben hat
wie ich als blutiger Anfänger brauchte.&lt;/p&gt;
&lt;p&gt;Beim Lernen hat mir wirklich sehr geholfen, das ich mit einem Makefile
arbeite. So konnte ich einfach Zeilen wie diese eintragen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;database_name = pingDB
table_name = pingtimes
general_do = mysql -u root -e
dbdo = mysql -u root $(database_name) -e

prepare_database:
	$(general_do) &amp;#34;create database if not exists $(database_name)&amp;#34;

prepare_table:
	$(dbdo) &amp;#34;create table if not exists $(table_name) (Zeitpunkt TIMESTAMP, URL VARCHAR(30), Ping FLOAT UNSIGNED)&amp;#34;;

show_table:
	$(dbdo) &amp;#34;select * from $(table_name)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Was man sich aufgeschrieben hat, kann man schon mal nicht wieder
vergessen.&lt;/p&gt;
&lt;p&gt;Tatsächlich ist die SQL-Syntax gar nicht so schlimm, solange man
relativ einfache Anfragen stellt. Das war bei mir zum Glück der Fall
und das bisschen was ich brauchte konnte ich dann auch relativ flott
auswendig.&lt;/p&gt;
&lt;p&gt;Am Ende hatte ich eine Datenbank mit einer Tabelle, die (mit dem
Skript von oben) so aussah:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ make show_table
mysql -u root pingDB -e &amp;#34;select * from pingtimes&amp;#34;
+---------------------+----------------------+------+
| Zeitpunkt           | URL                  | Ping |
+---------------------+----------------------+------+
| 2016-01-25 16:56:40 | www.schauderbasis.de | 29.8 |
| 2016-01-25 16:56:41 | www.schauderbasis.de | 30.1 |
| 2016-01-25 16:56:42 | www.schauderbasis.de | 29.0 |
| 2016-01-25 16:56:43 | www.schauderbasis.de | 32.2 |
| 2016-01-25 16:56:44 | www.schauderbasis.de | 28.8 |
| 2016-01-25 16:56:45 | www.schauderbasis.de | 29.6 |
| 2016-01-25 16:56:47 | www.schauderbasis.de | 30.1 |
| 2016-01-25 16:56:48 | www.schauderbasis.de | 29.8 |
| 2016-01-25 16:56:49 | www.schauderbasis.de | 28.6 |
| 2016-01-25 16:56:50 | www.schauderbasis.de | 29.2 |
+---------------------+----------------------+------+
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;die-datenaufbereitung---gnuplot&#34;&gt;Die Datenaufbereitung - Gnuplot&lt;/h2&gt;
&lt;p&gt;Eigentlich kam für mich kein anderes Tool in Frage, Gnuplot passt einfach zu gut. &lt;a href=&#34;https://www.schauderbasis.de/plotter/&#34;&gt;Ich habe schonmal was zu verschiedenen Plottern aufgeschrieben&lt;/a&gt; und hier war die Entscheidung klar.&lt;/p&gt;
&lt;p&gt;Das schwierigste war die Frage, wie man die Daten aus der Datenbank in Gnuplot hinein bekommt. Gut das Gnuplot alles kann:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Output from mysql is normaly formated as ascii-boxes,
# with the flag -B it is just tab-separated.
set datafile separator &amp;#34;\t&amp;#34;

plot &amp;#39;&amp;lt; mysql -u root -B pingDB -e &amp;#34;SELECT Zeitpunkt, Ping FROM pingtimes;&amp;#34;&amp;#39; using 1:2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im Prinzip wird hier die SQL-Abfrage direkt von Gnuplot ausgeführt. Kein Problem.&lt;/p&gt;
&lt;p&gt;Es ist gar nicht so klar, wie das mit der Zeit eingelesen werden soll. SQL liefert das Datum und die Uhrzeit schön nach &lt;a href=&#34;https://en.wikipedia.org/wiki/ISO_8601&#34;&gt;ISO 8601&lt;/a&gt;: 2016-01-25 16:56:40&lt;/p&gt;
&lt;p&gt;Gnuplot kommt von klugen Leuten, die wissen dass es auf der Welt sehr
viele sehr &lt;a href=&#34;https://xkcd.com/1179/&#34;&gt;schlimme Formate&lt;/a&gt; gibt, in der
Leute die Zeit angeben. Deswegen gibt man einfach an, in welchem
Format das Datum eingelesen und ausgegeben werden soll:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# time format used for reading input
set xdata time
set timefmt &amp;#34;%Y-%m-%d %H:%M:%S&amp;#34;

# time format used for printing on axis
set format x &amp;#34;%H:%M:%S&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Einfacher geht es nicht. Eine Aufschlüsselung der Variablen (falls nötig) gibt es im hervorragenden Handbuch. Es scheint aber das gleiche Format zu sein wie bei dem Programm &lt;code&gt;date&lt;/code&gt;, also reicht wsl auch die entsprechende manpage.&lt;/p&gt;
&lt;p&gt;Jetzt ist nur noch die Frage, wie der Graph aussehen soll. Ich habe mich entschieden, die Werte interpolieren zu lassen, damit der Graph schön glatt ist. Das Stichwort hier heißt &lt;code&gt;smooth&lt;/code&gt;, man sollte es in Gedanken aber immer &lt;em&gt;smooooooooth&lt;/em&gt; aussprechen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;ping.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;und-das-wars&#34;&gt;Und das wars&lt;/h2&gt;
&lt;p&gt;Eigentlich ziemlich einfach, hier funktionieren ein paar mächtige Werkzeuge sehr gut zusammen. Es hat Spaß gemacht und ich habe jede Menge über wichtige Standardwerkzeuge gelernt.&lt;/p&gt;
&lt;p&gt;Der Code liegt &lt;a href=&#34;https://gitlab.com/Kaligule/pingDB&#34;&gt;hier&lt;/a&gt; zur freien Verfügung (mit freier Lizenz natürlich).&lt;/p&gt;
&lt;h2 id=&#34;gedanken-zum-projekt&#34;&gt;Gedanken zum Projekt&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Für so ein kleines Projekt würde man normalerweise keine riesige
Datenbank anschmeißen. Matthias meinte, dass die meisten Leute die
nicht wissen welche Datenbank sie benutzen sollen mit sqlight
wahrscheinlich am besten bedient sind.&lt;/li&gt;
&lt;li&gt;Bash ist eine furchtbare Programmiersprache. Aber leider sehr
nützlich.&lt;/li&gt;
&lt;li&gt;Ich weiß nicht wer sich ausgedacht hat, dass Variablen in Make und
bash fast, aber nur &lt;em&gt;fast&lt;/em&gt; gleich aussehen und funktionieren. Was
soll das?&lt;/li&gt;
&lt;li&gt;Ich war erst ein bisschen genervt, dass man in SQL immer brüllen
muss: &amp;ldquo;CREATE TABLE IF NOT EXISTS pingtimes&amp;rdquo;. Dann habe ich gemerkt,
dass das gar nicht notwendig ist - die Sprache ist case insensitive:
&amp;ldquo;create table if not exists pingtimes&amp;rdquo;. Manche Sachen (zum Beispiel
die Datentypen) habe ich trotzdem in Caps gelassen, das sah
irgendwie richtiger aus.&lt;/li&gt;
&lt;li&gt;Wenn ich cooler wäre würde ich einen Cronjob einrichten, der das
Skript regelmäßig anstößt (~alle 5 Minuten?). Das könnten
interessante Graphen sein.&lt;/li&gt;
&lt;li&gt;Mit wenig Aufwand könnte man das Skript umbauen, so dass andere
Werte aufgezeichnet und verarbeitet werden. Zum Beispiel:
&lt;ul&gt;
&lt;li&gt;die Batterie (Wie viel Prozent habe ich im Schnitt noch übrig?)&lt;/li&gt;
&lt;li&gt;RAM und CPU&lt;/li&gt;
&lt;li&gt;Wie viele Wlans verfügbar sind (verschlüsselt vs. unverschlüsselt?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nachdem ich viel im Internet nach Gnuplotschnipseln gestöbert habe
entdeckte ich gegen Ende des Projektes, dass Gnuplot ein
&lt;a href=&#34;https://gnuplot.info/docs_5.0/gnuplot.pdf&#34;&gt;hervorragendes und ausführliches Handbuch&lt;/a&gt;
mit vielen Beispielen und Bildern hat. Nächstes mal weiß ich das
vorher.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Musik hören</title>
      <link>https://schauderbasis.de/posts/musik-hoeren/</link>
      <pubDate>Thu, 03 Dec 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/musik-hoeren/</guid>
      <description>&lt;p&gt;Wenn man irgendwann seine Musik gefunden hat, weiß man recht genau was einem gefällt (bei mir ist es Soundtrack Musik). Woher bekommt man die jetzt? Da fallen einem spontan mehrere Wege ein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kaufen&lt;/li&gt;
&lt;li&gt;piratisieren&lt;/li&gt;
&lt;li&gt;im Radio hören&lt;/li&gt;
&lt;li&gt;Streamingdienste&lt;/li&gt;
&lt;li&gt;Konzerte&lt;/li&gt;
&lt;li&gt;freie Musik&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gehen wir da mal kurz durch.&lt;/p&gt;
&lt;h2 id=&#34;kaufen&#34;&gt;kaufen&lt;/h2&gt;
&lt;p&gt;Ich habe keine Lust, mir eine große Musiksammlung anzulegen, indem ich einzelne CDs oder Alben kaufe. Das ist teuer und umständlich - und man hört immer wieder das selbe. Falls mich mal einzelne Lieder wirklich wegflashen mache ich das gerne.&lt;/p&gt;
&lt;h2 id=&#34;piratisieren&#34;&gt;piratisieren&lt;/h2&gt;
&lt;p&gt;Mag ich nicht. Das muss jeder erstmal mit sich selbst ausmachen.&lt;/p&gt;
&lt;h2 id=&#34;radio&#34;&gt;Radio&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;radio-1.jpg&#34; alt=&#34;Quelle: https://pixabay.com/en/radio-retro-transistor-radio-old-543122/&#34;&gt;&lt;/p&gt;
&lt;p&gt;Radio nervt mich, wegen Werbung und Moderatoren.
Für Musik habe ich noch keinen Radiosender gefunden, der mich nicht nach kürzester Zeit genervt hat. Aber es gibt ja auch noch Internet Radio&amp;hellip; Hier wird es interessant:&lt;/p&gt;
&lt;h2 id=&#34;internetradio&#34;&gt;Internetradio&lt;/h2&gt;
&lt;p&gt;Internet Radio besticht auf mehreren Ebenen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keine Werbung:&lt;/strong&gt; Die meisten Sender beschränken sich darauf, den Sendernamen alle halbe Stunde zwischen zwei Liedern in den Namen des Senders zu sagen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auswahl:&lt;/strong&gt; Es gibt ja soooooo viele Internet Radio Sender. Wer einen weiteren aufmachen will muss ja auch Frequenzen aufkaufen - es reicht eine IP-Adresse. Ich persönlich mag das &lt;a href=&#34;https://www.streamingsoundtracks.com/&#34;&gt;Soundtrackradio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skriptbar:&lt;/strong&gt; Oh ja, da geht viel. Unter anderm werden auch stets die Metadaten (zum Beispiel Name des Stücks, Komponist, Interpret&amp;hellip;) mit übertragen. Hier sei auf jeden Fall die Software &lt;a href=&#34;https://de.wikipedia.org/wiki/Streamripper&#34;&gt;streamripper&lt;/a&gt; erwähnt. Sie gehört zu den großen Schätzen in meiner Software-Repertoire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clients:&lt;/strong&gt; Es gibt quasi keinen Musikplayer, der mit Internetradio nichts angangen kann. Man hat also freie Auswahl.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn ich am Computer Musik hören will ist es also mit dieser Zeile getan:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mpd; mpc add https://209.9.229.206:80; mpc play
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(Naja, eigentlich steht die IP-Adresse in &lt;code&gt;/etc/hosts&lt;/code&gt; und für die Zeile gibt es einen Alias.)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Screenshot_2015-12-03_22-34-52.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;streamingdienste&#34;&gt;Streamingdienste&lt;/h2&gt;
&lt;p&gt;Zu Streamingdiensten (abseits von Internetradio) habe ich nie einen echten Zugang gefunden. Bestimmt ist das toll für viele, ich habs nie für mich entdeckt.&lt;/p&gt;
&lt;h2 id=&#34;konzerte&#34;&gt;Konzerte&lt;/h2&gt;
&lt;p&gt;Zählt nicht. Und selbst musizieren auch nicht. Livemusik hat andere Regeln, hier geht es um Musik, die sich in den Alltag integrieren lässt.&lt;/p&gt;
&lt;h2 id=&#34;freie-musik&#34;&gt;Freie Musik&lt;/h2&gt;
&lt;p&gt;Und dann gibt es da noch die freie Musik - Musik unter freien Lizenzen. Das macht es natürlich schön unkompliziert: Stücke aussuchen und runterladen und immer dann hören, wenn man mag.&lt;/p&gt;
&lt;p&gt;Es ist halt nicht so leicht, die zu finden. Ein guter Startpunkt kann die Website &lt;a href=&#34;https://www.jamendo.com/start&#34;&gt;Jamendo&lt;/a&gt; sein. Dort habe ich auch die Grundlage für das Intro der &lt;a href=&#34;https://echokammer.eu/&#34;&gt;Echokammer&lt;/a&gt; gefunden.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;speaker.jpg&#34; alt=&#34;Photo by Daniel Mav on Unsplash&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;fazit&#34;&gt;Fazit&lt;/h1&gt;
&lt;p&gt;Ich höre Musik &lt;a href=&#34;https://www.flavourjournal.com/content/4/1/25&#34;&gt;beim kochen&lt;/a&gt;, beim essen, beim Programmieren und auch dazwischen. (Unterwegs höre ich Podcasts). Und eigentlich ist höre ich immer Internetradio, das funktioniert für mich einfach am besten.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blogroll</title>
      <link>https://schauderbasis.de/posts/blogroll/</link>
      <pubDate>Mon, 28 Sep 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/blogroll/</guid>
      <description>&lt;h3 id=&#34;gewürzrevolverhttpsbloggewurzrevolverde&#34;&gt;&lt;a href=&#34;https://blog.gewurzrevolver.de/&#34;&gt;Gewürzrevolver&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Der Blog meiner Frau, es geht ums Kochen und Backen. Alle Rezepte haben wir selbst gekocht und probiert und dabei die Fotos gemacht. Und ich hatte sogar mal einen &lt;a href=&#34;https://gew%C3%BCrzrevolver.de/supergeheime-pfannkuchentorte/&#34;&gt;Gastbeitrag&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sandsturm</title>
      <link>https://schauderbasis.de/posts/sandsturm/</link>
      <pubDate>Sat, 12 Sep 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/sandsturm/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Server haben ist anstrengend und man muss viel Geheimwissen haben. Außerdem funktioniert dauernd was nicht und wenn man mal was austesten will muss man ewige Dokumentation lesen, bis etwas geht. Ich bin schon oft gescheitert.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://sandstorm.io/&#34;&gt;Sandstorm&lt;/a&gt; ist eine freie Software mit dem Ziel, Server so einfach zu machen wie Handys.&lt;/p&gt;
&lt;p&gt;Alles wird über eine Website geregelt, die Knöpfe sind groß und gut beschriftet. Konsolen, Deamons, Prozesse sucht man vergebens, statt dessen gibt es &amp;ldquo;Apps&amp;rdquo; und einen &amp;ldquo;App Market&amp;rdquo;. Zum installieren sucht man sich etwas aus und drückt auf &lt;em&gt;INSTALL&lt;/em&gt; &amp;hellip; und wenige Sekunden später ist alles fertig, wie von Magie.&lt;/p&gt;
&lt;p&gt;Ich setzte große Hoffnungen in Sandstorm. Die Entwickler schreiben kluge Sachen in &lt;a href=&#34;https://blog.sandstorm.io/&#34;&gt;ihren Blog&lt;/a&gt; und haben scheinbar wirklich verstanden, warum die meisten Leute keine Sachen selbst hosten. Außerdem ist Sandstorm freie Software. Hach&amp;hellip;
Es macht viel Freude das Projekt zu beobachten.&lt;/p&gt;
&lt;h2 id=&#34;welche-apps&#34;&gt;Welche Apps?&lt;/h2&gt;
&lt;p&gt;Im Moment ist hier nur freie Software vertreten. Das Angebot ist noch übersichtlich, aber es gibt schon jetzt einige Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com&#34;&gt;Gitlab&lt;/a&gt; - eine freie (und mächtigere) Alternative zu Github&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ghost.org/&#34;&gt;Ghost&lt;/a&gt; - dieses Blog läuft mit Ghost&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tt-rss.org/&#34;&gt;ttrss&lt;/a&gt; - habe ich &lt;a href=&#34;https://www.schauderbasis.de/rss-software/&#34;&gt;schonmal verbloggt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mediagoblin.com/&#34;&gt;Mediagoblin&lt;/a&gt; - ein bisschen wie flickr, aber dezentral und offen&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sharelatex.com/&#34;&gt;ShareLaTeX&lt;/a&gt; - online LaTeX, mit anderen gleichzeitig, ein bisschen wie Google Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://roundcube.net/&#34;&gt;Roundcube&lt;/a&gt; - freier Mailclient&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;Da findet sich schon viel Tolles. Außerdem kann man natürlich eigenes Zeug verwalten, es ist ja immerhin auch der eigene Server.&lt;/p&gt;
&lt;h2 id=&#34;zu-gast-in-der-oase&#34;&gt;Zu Gast in der Oase&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Und wenn ich keinen Server habe?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;Oasis.jpg&#34; alt=&#34;Bild von Matthew Paulson: https://www.flickr.com/photos/matthewpaulson/6728990349/in/photolist-bfBQoZ-bVeY97-ien8YV-hxnF1V-oR1pBo-97uBDx-i3mYgz-ozmMmN-caXPXS-oEuDH8-51i1C-frNDjN-ecxLgm-83Hxvk-7yWSbn-boqYmE-8D5fF3-pD3UnD-npCduL-hJucEG-d9z1bN-69a11F-eefMTq-c3Kno-ecPFAy-e91KsR-k8aRZx-fgT2sX-fXzsRx-6qjJyE-6tbPUX-fk61uu-d8346S-hM9J51-sL9wfm-hjS6iJ-pE6UGe-dUsKKX-etxp1K-piZpV8-prgwZ2-pegSdF-oqmzar-dMpFUd-a6vLv1-7fN8q2-djF9Vn-aWRAeR-d26jgJ-gjy6sB&#34;&gt;&lt;/p&gt;
&lt;p&gt;Man kann sich seinen Sandstorm auch hosten lassen. Das heißt dann &lt;a href=&#34;https://blog.sandstorm.io/&#34;&gt;Oasis&lt;/a&gt; und ist wärend der Beta-phase kostenlos.&lt;/p&gt;
&lt;h2 id=&#34;ein-beispiel-mit-ganz-vielen-bildern&#34;&gt;Ein Beispiel mit ganz vielen Bildern&lt;/h2&gt;
&lt;p&gt;Hier ist eine Anleitung, wie man Gitlab auf Sandstorm aufsetzt und ein bestehendes Repository hinzufügt. Es sind extra extra viele Bilder dabei&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Man begibt sich auf seine Sandstorm Instanz oder auf die &lt;a href=&#34;https://oasis.sandstorm.io/&#34;&gt;Oase&lt;/a&gt; und meldet sich an. Beim ersten Anmelden darf man eventuell noch ein Profil anlegen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wir sind drin und sehen ein paar Flächen, die recht selbst erklärend sind.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;Screenshot_2015-09-11_21-20-16_963x465.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Wir wollen Gitlab installieren, also klicken wir auf das große dicke &lt;strong&gt;+&lt;/strong&gt;
und sehen gelangen in den &lt;em&gt;App Market&lt;/em&gt;. Welche App darf es sein?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;App_Market.png&#34; alt=&#34;Welche App darf es sein?&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Wir entscheiden uns für &amp;ldquo;Gitlab&amp;rdquo; und bekommen nochmal eine Beschreibung der App.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;Gitlab_Beschreibung.jpg&#34; alt=&#34;Sieht schon extrem nach Appstore aus.&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Wir klicken auf &lt;em&gt;INSTALL&lt;/em&gt;.
Fertig. Weil wir ohnehin nur freie Software benutzten müssen wir uns nicht mit einem Zahlungsprozess aufhalten (Wir werden später eine Spende erwägen). Das wars. Mehr müssen wir nicht machen. Die App ist installiert und bereit zum benutzt werden.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;Gitlab_installiert.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Keiner dieser fünf Schritte unterscheidet sich vom installieren von Apps auf dem iPhone. Wir klicken noch auf das App Icon und sind direkt dabei:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Gitlab_inside.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;noch-ein-wort-zu-gitlab&#34;&gt;Noch ein Wort zu Gitlab&lt;/h4&gt;
&lt;p&gt;Um ein bestehendes Repository hinzuzufügen klickt man sucht man aus der Box die URL des Repos heraus, geht in den Ordner mit dem git Projekt und gibt diese beiden Befehle ein:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git remote add gitlab https://url-zu-meinem-repo.git
git push gitlab master
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das hat aber mit Sandstorm nun wirklich nichts zu tun.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;img src=&#34;into-the-desert.jpg&#34; alt=&#34;Ab in die Wüste!&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;tldr&#34;&gt;tldr:&lt;/h4&gt;
&lt;p&gt;Sandstorm ist könnte alles ändern. Mit diesem Userinterface könnten auch nicht-Nerds Server bedienen. Das Argument &amp;ldquo;Das ist mir alles viiiiell zu kompliziert&amp;rdquo; könnte ausgehebelt werden, denn es macht sogar Spaß, in den Apps herum zu stöbern.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Gastbeitrag beim Gewürzrevolver</title>
      <link>https://schauderbasis.de/posts/gastbeitrag-supergeheime-pfannkuchentorte/</link>
      <pubDate>Thu, 16 Jul 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/gastbeitrag-supergeheime-pfannkuchentorte/</guid>
      <description>&lt;p&gt;Ich habe einen Gastbeitrag auf &lt;a href=&#34;https://www.gew%C3%BCrzrevolver.de/&#34;&gt;www.gewürzrevolver.de&lt;/a&gt; veröffentlicht:&lt;/p&gt;
&lt;h4 id=&#34;die-supergeheime-pfannkuchentortehttpswwwgewürzrevolverdesupergeheime-pfannkuchentorte&#34;&gt;&lt;a href=&#34;https://www.gew%C3%BCrzrevolver.de/supergeheime-pfannkuchentorte/&#34;&gt;Die Supergeheime Pfannkuchentorte&lt;/a&gt;&lt;/h4&gt;
</description>
    </item>
    
    <item>
      <title>Going up</title>
      <link>https://schauderbasis.de/posts/going-up/</link>
      <pubDate>Wed, 20 May 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/going-up/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;5&#34;&gt;5&lt;/h2&gt;
&lt;p&gt;I I I I   I   I a I I   I a a I   a a   I   a a a   I I a   a   a a a   I I a I   a   I I I I   I I   I I I   I a I a I a&lt;/p&gt;
&lt;h2 id=&#34;150&#34;&gt;150&lt;/h2&gt;
&lt;p&gt;I can not talk about anything.&lt;/p&gt;
&lt;h2 id=&#34;200&#34;&gt;200&lt;/h2&gt;
&lt;p&gt;I try to not to say those things that I am told not say.&lt;/p&gt;
&lt;h2 id=&#34;300&#34;&gt;300&lt;/h2&gt;
&lt;p&gt;I may not say some things, but still try not to talk like a baby. It is a hell of a job.&lt;/p&gt;
&lt;h2 id=&#34;500&#34;&gt;500&lt;/h2&gt;
&lt;p&gt;This is my try to deal with the problem of telling what the problem is and not to say any word that is not one of the 500 that people use most. It is really hard. For every word that gets lost from your word set gets,  you need more words to say anything at all and it gets hard to understand what all this means, but I had help from a think-thing that does the some of the easy work. The idea came from a man, who&amp;rsquo;s work many people look at.&lt;/p&gt;
&lt;h2 id=&#34;1000&#34;&gt;1000&lt;/h2&gt;
&lt;p&gt;This is a test, where I try to explain the test in the 1000 words people use most. The less words you have the more you have to talk. I had help from one of those think-thing that does some of the easy work. The idea came from a man, who&amp;rsquo;s work many people look at.&lt;/p&gt;
&lt;h2 id=&#34;5000&#34;&gt;5000&lt;/h2&gt;
&lt;p&gt;This is an experiment, where I try to explain the experiment itself in the 5000 most common english words. It is actually pretty difficult not to use difficult terms, often you have to describe them. As a setup, I used a web based editor, that does the counting for me. The original idea is from a famous series of pictures from the Internet.&lt;/p&gt;
&lt;h2 id=&#34;infinity&#34;&gt;infinity&lt;/h2&gt;
&lt;p&gt;This is an experiment, where try I to explain the experiment itself in the &lt;a href=&#34;https://en.wiktionary.org/wiki/Wiktionary:Frequency_lists&#34;&gt;n most common English words&lt;/a&gt; (where n is now finaly infinity, so I can say what I want). As it turns out, shrinking down your own vocabulary is pretty hard and you have to go back to the definitions. As a setup, I used &lt;a href=&#34;https://splasho.com/upgoer6/&#34;&gt;a web based editor&lt;/a&gt; that does the counting for me. It was inspired by xkcd, a &lt;a href=&#34;https://xkcd.com/1133/&#34;&gt;famous webcomic&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Am Arch</title>
      <link>https://schauderbasis.de/posts/am-arch/</link>
      <pubDate>Sat, 02 May 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/am-arch/</guid>
      <description>&lt;p&gt;(Titelbild von &lt;a href=&#34;https://www.flickr.com/photos/olibac/&#34;&gt;olibac&lt;/a&gt; unter CC BY 2.0 von &lt;a href=&#34;https://www.flickr.com/photos/olibac/3244014009/in/photolist-5WEqm2-4CC585-4XqwWg-68m3oj-eVuUPq-4R8tKB-2aXbZN-9VwtLU-7Y1bKA-7ZVE4T-gEnMta-akjJ21-aLmkDe-d8AkrQ-ffmpFS-6RJA3T-aLmkn4-cZNDhu-7Ri7PA-6PjUKB-aeQ77h-4Qb97G-c7N3WA-bE4MuC-KskHA-dCkVCL-4t5WKe-hG6zrM-6JYAoe-qWUL62-6K3GEE-5Xw8BU-34zb6V-4MUeA3-qWTFVx-bmEVEv-aLmmai-pukvrR-ncmScD-ekbZ9d-72pFtq-7jfwxB-4yMDxK-8agbNi-asSLFM-nxmKdG-d7tUXu-3j7eG4-6vHhTY-6K3Fhq/&#34;&gt;hier&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Bei meiner Wahl der Distribution habe ich einen Fehler gemacht.&lt;/p&gt;
&lt;p&gt;Ich hatte &lt;a href=&#34;https://www.schauderbasis.de/eine-distribution-auswahlen/&#34;&gt;damals&lt;/a&gt; meine Auswahlkriterien folgendermaßen definiert:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;modern: wenn es neues Zeug und coole Erfindungen gibt, will ich davon profitieren&lt;/li&gt;
&lt;li&gt;stabil: so modern nun auch wieder nicht, dass ständig alles abstürzt&lt;/li&gt;
&lt;li&gt;einsteigerfreundlich: ein System, das man auch als angagierter Anfänger meistern kann, eine Anlaufstelle für meine großen Haufen von Fragen&lt;/li&gt;
&lt;li&gt;lebendig: ein System das beständig weiterentwickelt wird, mit Sicherheitsupdates, neuste Versionen und Kompatibilität für alles&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die Wahl fiel damit auf Fedora, und diese Konsequenz würde ich heute auch noch so ziehen. Aber meine Präferenzen haben sich geändert:&lt;/p&gt;
&lt;h2 id=&#34;hilfe-aus-dem-rl&#34;&gt;Hilfe aus dem RL&lt;/h2&gt;
&lt;p&gt;(Wer nicht weiß was das RL ist, der verbringt entweder zuwenig Zeit am Computer oder sehr viel zuviel.)
Manchmal bleibt man stecken und dann hilft einem die ganze schöne Dokumentation nicht. Dann helfen auch keine Wikis, Hilfeforen, dann nützt Stack Overflow nichts und Reddit versagt. Manchmal muss man &lt;em&gt;jemanden&lt;/em&gt; fragen. Ich rate also jedem, sich eind Distribution zu suchen, die in der unmittelbaren Umgebung auch schon benutzt wird.&lt;/p&gt;
&lt;p&gt;Bei uns in der Uni läuft ausschließlich Ubuntu in den Computerräumen. In meiner unmittelbaren Umgebung werden außerdem Debian, Arch und Mint eingesetzt. Künftig werde ich das in meine Entscheidungen mit einfließen lassen.&lt;/p&gt;
&lt;p&gt;Neues Kriterium:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RL-Support: zum über Dinge untehalten und sich gegenseitig Sachen zeigen kann&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Hätten wir unseren ursprünglichen Plan - gemeinsam auf Linux umzusteigen - direkt verwirklicht, dann wäre das kein Problem gewesen. Aber &lt;a href=&#34;https://blog.tillmail.de/ich-will-wieder-auf-windows-wechseln/&#34;&gt;Till wechselt seine Betriebsysteme sobald der Wind sich dreht&lt;/a&gt;, da muss ich also in andere Richtungen suchen.)&lt;/p&gt;
&lt;h2 id=&#34;stabilität-wird-teuer-erkauft&#34;&gt;Stabilität wird teuer erkauft&lt;/h2&gt;
&lt;p&gt;Kurz und gut: Die hoffnung ein &lt;strong&gt;modernes&lt;/strong&gt; aber &lt;strong&gt;stabiles&lt;/strong&gt; System zu bekommen war etwas zu optimistisch. Oft ist es mir schon passiert, dass ich von einer neuen Version eines Programmes gelesen habe, die dann aber nicht in den Repositorys aufgetaucht ist. Die Phrasen &amp;ldquo;gut abgehangen&amp;rdquo; und &amp;ldquo;bewährt&amp;rdquo; tauchen in diesem Zusammenhang immer wieder auf.&lt;/p&gt;
&lt;p&gt;Weil ich dazu neige, die wenigen Programme die ich benutze auch etwas weiter auszureizen (das Wort &amp;ldquo;Poweruser&amp;rdquo; ist ja inzwischen so ausgelutscht das man es wahrhafig nicht nocheinmal in den Mund zu nehmen braucht) habe ich es trotzdem immer wieder geschaft, die Programme gegen die Wand zu fahren. Das passiert einfach.&lt;/p&gt;
&lt;p&gt;Inzwischen weiß ich besser was ich will:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;~~ &lt;strong&gt;modern&lt;/strong&gt;: wenn es neues Zeug und coole Erfindungen gibt, will ich davon profitieren~~&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ich brauche nicht wirklich ein stabiles System. Ich brauche nur Backups und einen Packetmanager, der mir (auch gerne stündlich) die neusten Updates um die Ohren haut.&lt;/p&gt;
&lt;h2 id=&#34;konsequenz&#34;&gt;Konsequenz?&lt;/h2&gt;
&lt;p&gt;Ich bin weg von Fedora und komplett auf Arch Linux gewechselt. Zum Umzug später mehr.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sane defaults for navigation keys?</title>
      <link>https://schauderbasis.de/posts/sane-default-navigation/</link>
      <pubDate>Mon, 02 Mar 2015 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/sane-default-navigation/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;When I switched to Emacs, I thought there would be a consistent plan for navigation in a file (or buffer). I thought there would be a key for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;__c__haracter,&lt;/li&gt;
&lt;li&gt;__w__ord,&lt;/li&gt;
&lt;li&gt;__l__ine,&lt;/li&gt;
&lt;li&gt;__s__entence,&lt;/li&gt;
&lt;li&gt;__p__aragraph,&lt;/li&gt;
&lt;li&gt;the whole __f__ile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip;and so on. In addition (so I imagined) there would be a key for every standard function you could apply to such a text component, like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;__c__opy,&lt;/li&gt;
&lt;li&gt;__p__aste,&lt;/li&gt;
&lt;li&gt;__k__ill,&lt;/li&gt;
&lt;li&gt;__m__ark,&lt;/li&gt;
&lt;li&gt;jump __f__orward or __b__ackward,&lt;/li&gt;
&lt;li&gt;__r__eplicate,&lt;/li&gt;
&lt;li&gt;e__x__chage with neigbour,&lt;/li&gt;
&lt;li&gt;move __u__p and __d__own&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;etc.&lt;/p&gt;
&lt;p&gt;This way I would be able to build commands like &amp;ldquo;kill a word&amp;rdquo; (&lt;strong&gt;C-k w&lt;/strong&gt;), &amp;ldquo;duplicate line&amp;rdquo; (&lt;strong&gt;C-r l&lt;/strong&gt;) or &amp;ldquo;mark the paragraph&amp;rdquo; (&lt;strong&gt;C-m p&lt;/strong&gt;) etc. It wouldn&amp;rsquo;t be necessary to remember those shortcuts, you could easily derive them. Damn, you could even combine them (use (&lt;strong&gt;C-l C-w C-w k&lt;/strong&gt;) to delete one line and two words). And they would perfectly fit together with the universal argument (C-u).&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t even know why I expected it to be so. I just thought that the best editors (and Emacs claims to be on the top, no doubt) would have a concept like this (or better) with their shortcuts.&lt;/p&gt;
&lt;p&gt;Instead, there are these short, but hard to remember combinations. Wouldn&amp;rsquo;t it make sense to have similar shortcuts for similar tasks? In Emacs, this doesn&amp;rsquo;t seem to be the case. For example, &lt;em&gt;&amp;ldquo;Move to the beginning of the file&amp;rdquo;&lt;/em&gt; (&lt;strong&gt;M-&amp;lt;&lt;/strong&gt;) and &lt;em&gt;&amp;ldquo;Move to the beginning of this line&amp;rdquo;&lt;/em&gt; (&lt;strong&gt;C-a&lt;/strong&gt;) just don&amp;rsquo;t seem to be connected. Neither are &lt;em&gt;&amp;ldquo;Kill word&amp;rdquo;&lt;/em&gt; (&lt;strong&gt;M-d&lt;/strong&gt;) and &lt;em&gt;&amp;ldquo;Kill line&amp;rdquo;&lt;/em&gt; (&lt;strong&gt;C-k&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Of course, I am far away of being some good at Emacs. I don&amp;rsquo;t know any saints in the Church of Emacs to ask. There are two possibilities:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There is a deeper sense in the defaults, I just don&amp;rsquo;t see it. It would be so kind if someone could give me some hint (you can find my mail address in the impressum). At some point, I will achieve wisdom.&lt;/li&gt;
&lt;li&gt;The default keys were never designed, the just grew that way. And while this would be very disappointing, this is still Emacs, isn&amp;rsquo;t it? Nothing would stop me to define my own shortcuts, much better then the old ones. Perhaps someone did this before me and there is some module I should know?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am still not sure what I want it to be.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Plotter</title>
      <link>https://schauderbasis.de/posts/plotter/</link>
      <pubDate>Thu, 11 Dec 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/plotter/</guid>
      <description>&lt;p&gt;Im Mathestudium spielen Plots eine erstaunlich geringe Rolle (man möchte sich davor schützen, aus Bildern falsche Schlüsse zu ziehen). Trotzdem ist es manchmal nützlich/notwendig, es gibt hauptsächlich zwei Anwendungsfälle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mal schnell rausfinden, wie eine Funktion aussieht oder wie sich ein Parameter auswirkt&lt;/li&gt;
&lt;li&gt;Eine schicke Grafik für ein Skript oder eine Präsentation erstellen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mit guten Plots kann man prima angeben. Und deshalb möchte ich hier mal die besten Plotter vorstellen, die ich im Laufe meines Studiums kennen und schätzen gelernt habe.&lt;/p&gt;
&lt;p&gt;Um einen halbwegs sinnvollen Vergleich zu bekommen habe ich bei jedem Programm die Funktion &lt;code&gt;f(x)= sin(1/x)&lt;/code&gt; geplottet.&lt;/p&gt;
&lt;h2 id=&#34;schnell-und-flexibel&#34;&gt;Schnell und Flexibel&lt;/h2&gt;
&lt;p&gt;Für Zwischendurch und wenn man mal schnell eine Vorstellung oder Abschätzung des Graphen braucht.
Die Programme sollen schnell zu bedienen sein und fix arbeiten. Wenn man mit Parametern arbeitet will man diese verschieben können und der Plot verändert sich live mit.
Das Wort &lt;em&gt;kompilieren&lt;/em&gt; will man hier nicht hören.&lt;/p&gt;
&lt;h3 id=&#34;quick-graphhttpskzlabsme&#34;&gt;&lt;a href=&#34;https://kzlabs.me/&#34;&gt;Quick Graph&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;QucikGraph.png&#34; alt=&#34;Quick Graph&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;plattformen&#34;&gt;Plattformen:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;besondere-stärken&#34;&gt;Besondere Stärken:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;mal schnell was plotten&lt;/li&gt;
&lt;li&gt;großer Funktionsumfang auf mobilem Gerät&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich habe seit Jahren keine andere App zum plotten auf dem iPhone als Quick Graph.
Auf seinem Telefon will man ja meistens keine Wissenschaft machen sondern &amp;ldquo;mal schnell was rausfinden&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Gibts in einer &lt;a href=&#34;https://itunes.apple.com/us/app/id292412367&#34;&gt;kostenlosen&lt;/a&gt; und einer &lt;a href=&#34;https://itunes.apple.com/us/app/quick-graph+-your-scientific/id541477533?mt=8&#34;&gt;Bezahlversion&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;grapher&#34;&gt;Grapher&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;Grapher.jpg&#34; alt=&#34;Grapher&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;platform&#34;&gt;Platform:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Mac OS&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;besondere-stärken-1&#34;&gt;Besondere Stärken:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;vorinstalliert&lt;/li&gt;
&lt;li&gt;(2D-)Vektorgrafik Export&lt;/li&gt;
&lt;li&gt;Navigieren im Plot (verschieben, zoomen)&lt;/li&gt;
&lt;li&gt;starke Mathematische Funktionen&lt;/li&gt;
&lt;li&gt;Vektorfelder (2D und 3D)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;demos&#34;&gt;Demos:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;im Programmmenü unter Examples&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grapher ist das am meisten unterschätzte Programm auf dem Mac (finde ich).&lt;/p&gt;
&lt;p&gt;Graphers Schwächen liegen in der Bedienung bei komplizierteren Funktionen.
Bei schwierigeren Sachen muss man muss schon ein bisschen arbeiten, bis man das sieht was man wollte. Dafür funktionieren dann aber auch Dinge (Vektorfelder, Fallunterscheidungen, Spuren von Differetialgleichungen ect) die man sonst kaum findet.&lt;/p&gt;
&lt;p&gt;Man sollte sich deswegen auf jeden Fall die mitgelieferten Beispiele anschauen, außerdem gibt es &lt;a href=&#34;https://guides.macrumors.com/Grapher&#34;&gt;im Internet&lt;/a&gt; ein bisschen Dokumentation.&lt;/p&gt;
&lt;h3 id=&#34;graphing-calculatorwwwpacifictcom&#34;&gt;&lt;a href=&#34;www.pacifict.com&#34;&gt;Graphing Calculator&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;Graphing_Calculator.jpg&#34; alt=&#34;Graphing Calculator&#34;&gt;&lt;/p&gt;
&lt;p&gt;Plattformen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mac OS&lt;/li&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vorteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einfache Bedienung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Quick-Graph für den Desktop. Zum &amp;ldquo;schnell mal eben gucken&amp;rdquo; total gut. Starten, Funktion eintippen, Bild erscheint. Graphen exportieren geht leider nicht ordentlich.&lt;/p&gt;
&lt;p&gt;Quick-Graph ist nicht herausragend, aber er macht was er soll und braucht keine Eingewöhnungszeit.&lt;/p&gt;
&lt;h3 id=&#34;googlehttpswwwgoogledesearchhldeqplot20generatorgws_rdsslhldeqplot20sin2812fx29wolfram-alphahttpswwwwolframalphacominputisin2812fx29&#34;&gt;&lt;a href=&#34;https://www.google.de/search?hl=de&amp;amp;q=plot%20generator&amp;amp;gws_rd=ssl#hl=de&amp;amp;q=plot%20sin%281%2Fx%29&#34;&gt;Google&lt;/a&gt;/&lt;a href=&#34;https://www.wolframalpha.com/input/?i=sin%281%2Fx%29&#34;&gt;Wolfram Alpha&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;Google.png&#34; alt=&#34;Google&#34;&gt;
&lt;img src=&#34;WolframAlpha.png&#34; alt=&#34;Wolfram Alpha&#34;&gt;&lt;/p&gt;
&lt;p&gt;Platformen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vorteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verfügbarkeit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Geht natürlich auch. Wer nichts installieren will oder kann bekommt hier schnell was er braucht. Trotzdem würde ich nativen Programmen immer den Vorzug geben. Komplizierte Funktionen werden hier schnell knifflig und Parameter bekommt man nicht so einfach hin.&lt;/p&gt;
&lt;h2 id=&#34;seriös-und-elegant&#34;&gt;Seriös und elegant&lt;/h2&gt;
&lt;p&gt;Für Skripte, Präsentationen ect&amp;hellip;
Die Graphen sollen genau sein, gut aussehen, ordentlich beschriftet sein und wichtige Informationen vermitteln. Außerdem sollen verschiedene Ausgabeformate (pdf, svg, png..) unterstützt werden (Vektorgraphiken sind besser als Pixelgrafiken).
Dafür ist es auch gerechtfertigt, etwas mehr Arbeit und Zeit zu investieren.&lt;/p&gt;
&lt;p&gt;Weil es hier mehr um Programmieren als um Programme geht schreibe ich die Plattform nicht jedes mal dazu - auf Linux, OS X, BSD und Windows wird jedes der Programme laufen.&lt;/p&gt;
&lt;h3 id=&#34;gnuplothttpswwwgnuplotinfo&#34;&gt;&lt;a href=&#34;https://www.gnuplot.info/&#34;&gt;Gnuplot&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;Gnuplot.png&#34; alt=&#34;Gnuplot&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;demos-1&#34;&gt;Demos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gnuplot.sourceforge.net/demo&#34;&gt;offizielle Seite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.gnuplotting.org/&#34;&gt;der Gnuplotting Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;besondere-stärken-2&#34;&gt;Besondere Stärken:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Datenpunkte plotten&lt;/li&gt;
&lt;li&gt;programmierbar/automatisierbar&lt;/li&gt;
&lt;li&gt;Open Source&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich muss aber zugeben dass ich (damals) auf dem Mac Schwierigkeiten hatte Gnuplot zu installieren - gelohnt hat es sich trotzdem. Auf Linux hatte ich keine Probleme.&lt;/p&gt;
&lt;p&gt;Wer es nicht installieren will kann Gnuplot auch im Browser ausführen (auch wenn man dann die meisten Vorteile verliert). Zum Beispiel &lt;a href=&#34;https://plotshare.com/index.ws/plot/763911417&#34;&gt;hier&lt;/a&gt; oder &lt;a href=&#34;https://gnuplot.respawned.com/&#34;&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mit Gnuplot kann man hervorragend Messdaten visualisieren, plotten und diese Prozesse automatisieren. In meiner Bachelorarbeit musste ich den Verlauf eines chaotischen Algorithmuses nachvollziehen und hier kann man die Stärken des Programms wirklich ausspielen: Man lässt sich die Logdateien des Algorithmus ausgeben und lässt diese von Gnuplot auslesen und parsen. Auch bei großen Datenmengen ging das wunderbar, wo andere Programme schon in die Knie gegangen sind.&lt;/p&gt;
&lt;h3 id=&#34;rhttpswwwr-projectorg&#34;&gt;&lt;a href=&#34;https://www.r-project.org/&#34;&gt;R&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;R.png&#34; alt=&#34;R&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;demos-2&#34;&gt;Demos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.r-project.org/screenshots/screenshots.html&#34;&gt;offizielle Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://menugget.blogspot.de/&#34;&gt;Menugget&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;besondere-stärken-3&#34;&gt;Besondere Stärken:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Daten visualisieren&lt;/li&gt;
&lt;li&gt;Mit Zufallsdaten arbeiten&lt;/li&gt;
&lt;li&gt;Nicht-Funktionen-Plots&lt;/li&gt;
&lt;li&gt;programmierbar/automatisierbar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;R ist eigentlch ein Statistik Programm. Aber es ist auch super im Daten visualisieren, besonders wenn es nicht um normale Plots geht sondern um Histogramme, Kuchendiagramme, Punktdiagramme, gefittete Funktionen ect.&lt;/p&gt;
&lt;p&gt;Ich selbst kenne mich nicht so gut aus mit R (denn ich habe selten mit Wahrscheinlichkeitsrechnung zu tun), aber die Ergebnisse waren immer extrem gut.&lt;/p&gt;
&lt;p&gt;Ach ja, eines noch: Der Name ist extrem dumm. Der Nächste der vorschlägt, etwas nach einem Buchstaben zu benennen sollte sich vorher genau überlegen, wie man im Internet nach Dokumentation dafür suchen soll.&lt;/p&gt;
&lt;h3 id=&#34;latexhttpspgfplotssourceforgenet&#34;&gt;&lt;a href=&#34;https://pgfplots.sourceforge.net/&#34;&gt;LaTeX&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;pgfplot.png&#34; alt=&#34;PGFPlots&#34;&gt;&lt;/p&gt;
&lt;p&gt;Besondere Stärken:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;direktes Erzeugen im Latexdokument&lt;/li&gt;
&lt;li&gt;extrem detailfreudig wenn nötig&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Wer nicht weiß was LaTeX ist sollte jetzt wirklich aufhören diesen Artikel zu lesen und sich schleunigst damit beschäftigen (etwa &lt;a href=&#34;https://www.latex-tutorial.com/&#34;&gt;hier&lt;/a&gt;).)&lt;/p&gt;
&lt;p&gt;Wenn man ein Dokument mit Latex erstellt liegt es nahe, auch die Graphiken damit zu machen. Geht auch. Das Paket heißt &lt;a href=&#34;https://pgfplots.sourceforge.net/&#34;&gt;PGFPlots&lt;/a&gt; und basiert auf &lt;a href=&#34;https://en.wikipedia.org/wiki/PGF/TikZ&#34;&gt;TikZ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Vorteile liegen auf der Hand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;der Stil des Plots ist genau der des restlichen Dokumentes&lt;/li&gt;
&lt;li&gt;wenn sich die Daten nochmal ändern sollten muss man nicht alles neu plotten sonder nur einmal sein File neu kompilieren&lt;/li&gt;
&lt;li&gt;es gibt keine third-party, auf die man sich verlassen muss&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die &lt;a href=&#34;https://pgfplots.sourceforge.net/gallery.html&#34;&gt;Beispielseite&lt;/a&gt; zeigt auch recht deutlich, dass man es hier mit den Details wirklich ernst nimmt. Sehr (sehr) viele Varianten mit sehr feinen Unterschieden. Wer sich fragt ob man sich über Plots überhaupt so viele Gedanken machen kann, den bitte ich einfach einmal durch &lt;a href=&#34;https://pgfplots.sourceforge.net/pgfplots.pdf&#34;&gt;das Handbuch&lt;/a&gt; zu scrollen. (Man braucht es nicht lesen, einfach einmal von oben bis unten scrollen und ein paar Bilder anschauen.)&lt;/p&gt;
&lt;p&gt;Ich habe mit PGFPlots selbst noch nicht gearbeitet, aber TikZ selbst schon sehr viel. Es ist immer viel Arbeit, aber man hat die absolute Kontrolle über alles und die Ergebnisse sind immer großartig gewesen.&lt;/p&gt;
&lt;h3 id=&#34;pythonhttpsmatplotliborgindexhtml&#34;&gt;&lt;a href=&#34;https://matplotlib.org/index.html&#34;&gt;Python&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;xkcd.png&#34; alt=&#34;Python&#34;&gt;&lt;/p&gt;
&lt;p&gt;Mit den meisten Programmiersprachen kann man auf die eine oder andere Weise plotten. Matplotlib ist eine Python Bibliothek, die das halt auch kann.&lt;/p&gt;
&lt;p&gt;Besonders toll finde ich aber die &lt;a href=&#34;https://jakevdp.github.io/blog/2013/07/10/XKCD-plots-in-matplotlib/&#34;&gt;xkcd-Style Plots&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vor kurzem hat &lt;a href=&#34;https://www.chrisstucchio.com/blog/2014/why_xkcd_style_graphs_are_important.html&#34;&gt;dieser Artikel&lt;/a&gt; ein paar Wellen geschlagen. Es geht darum, warum es (manchmal) gut ist wenn Bilder/Diagramme wie gemalt wirken. Dann achtet man nämlich nicht mehr auf die genauen Werte, sondern nur noch auf den Verlauf der Kurve. Manchmal will man ja genau das.&lt;/p&gt;
&lt;p&gt;Und in Matplotlib ist das auch sehr einfach zu machen. Man ruft einfach vor dem plotten einmal &lt;code&gt;matplotlib.pyplot.xkcd()&lt;/code&gt; auf und alles sieht aus wie von &lt;a href=&#34;https://en.wikipedia.org/wiki/Randall_Munroe&#34;&gt;Randall Munroe&lt;/a&gt; persönlich  &lt;a href=&#34;https://xkcd.com/657/large/&#34;&gt;gezeichnet&lt;/a&gt;. Mein Script sieht so aus:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt
plt.xkcd()
x = np.linspace(-1.0, 1.0, 1000)
y = np.sin(1/x)
plt.plot(x, y, &amp;#39;r-&amp;#39;)
plt.title(&amp;#39;plotted in xkcd-style&amp;#39;)
plt.ylabel(&amp;#39;sin(1/x)&amp;#39;)
plt.show()
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;bilanz&#34;&gt;Bilanz&lt;/h2&gt;
&lt;p&gt;Und welchen Plotter soll ich jetzt nehmen?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;automatisiert Daten auswerten
&lt;ul&gt;
&lt;li&gt;Gnuplot&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;einzelne PLots für Folien und Skripte
&lt;ul&gt;
&lt;li&gt;Gnuplot (für weniger aufwendige Sachen)&lt;/li&gt;
&lt;li&gt;Python (für Folien, der xkcd-Style kommt im Vortrag gut an)&lt;/li&gt;
&lt;li&gt;Grapher (wenns ganz schnell gehen muss)&lt;/li&gt;
&lt;li&gt;LaTeX (wenns um ungewöhnliche Details geht)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;schnell eine Funktion anschauen
&lt;ul&gt;
&lt;li&gt;irgendwas&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Emacs lernen, Tag 3, 4 und 5</title>
      <link>https://schauderbasis.de/posts/emacs-lernen-tag-3-4-und-5/</link>
      <pubDate>Wed, 01 Oct 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/emacs-lernen-tag-3-4-und-5/</guid>
      <description>&lt;h1 id=&#34;emacs-lernen-tag-3&#34;&gt;Emacs lernen, Tag 3&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;bin wieder dabei, los gehts&lt;/li&gt;
&lt;li&gt;versuche, einen eingebauten Markdown-Mode zu finden. Es scheint keinen zu geben - wo kann ich Modes kennen lernen? Schau ich später nach, jetzt mach ich noch den Rest vom Tutorial zu Ende.&lt;/li&gt;
&lt;li&gt;Dokumentation zu Befehlen gibt es mit &lt;code&gt;C-h c&lt;/code&gt; für den Funktionennamen (was oft ausreicht) und mit &lt;code&gt;C-h k BEFEHL&lt;/code&gt; für ein ausführlichere Beschreibung.&lt;/li&gt;
&lt;li&gt;Heute komme ich nicht recht vorran, andere Sachen wollen erledigt werden.&lt;/li&gt;
&lt;li&gt;Tutorial ist fertig. Kam nichts Interesantes mehr.&lt;/li&gt;
&lt;li&gt;Was mache ich jetzt? Ich könnte mich wieder mit dem Handbuch beschäftigen. Oder ich schaue mal, welche Modes ich so brauchen könnte.&lt;/li&gt;
&lt;li&gt;Ich schau mal nach Modes. Für Haskell gibt es eine &lt;a href=&#34;https://github.com/serras/emacs-haskell-tutorial/blob/master/tutorial.md&#34;&gt;tolle Anleitung &lt;/a&gt;, aber die ist so lang, dass ich das nach hinten verschiebe. Erstmal Markdown.&lt;/li&gt;
&lt;li&gt;Ein Markdownpackage ist scheinbar nicht installiert, zumindest finde ich mit &lt;code&gt;M-x&lt;/code&gt; nichts. Auch der Packetmanager findet nichts, das auf &lt;em&gt;emacs&lt;/em&gt; und &lt;em&gt;markdown&lt;/em&gt; matcht.&lt;/li&gt;
&lt;li&gt;Es gibt ein Emacs-Wiki mit einem &lt;a href=&#34;https://www.emacswiki.org/emacs/MarkdownMode&#34;&gt;Eintrag zu einem Markdown Mode&lt;/a&gt;. Darin auch ein Link zur &lt;a href=&#34;https://jblevins.org/projects/markdown-mode/&#34;&gt;Website des Entwickler&lt;/a&gt; dieses Moduses.&lt;/li&gt;
&lt;li&gt;Aha, ich soll emacs-goodies installieren. Kein Problem.&lt;/li&gt;
&lt;li&gt;Der Emacs muss neu gestartet werden, damit die Completion den markdown modus kennt. Dann endlich ist es geschaft - ich hab Markdown-Syntax-Highlighting.&lt;/li&gt;
&lt;li&gt;Der Markdown-Modus ist nicht so schmeichelhaft wie ich erhofft hatte. Wenn ich eine Liste mache und enter drücke, muss ich das &lt;code&gt;* &lt;/code&gt; selbst tippen. Das ärgert mich ein bisschen. Immerhin gibt es nur 2 sinnvolle Dinge, die ich dann manchen wollen kann: Die Liste mit einem neuen Element fortsetzten (&lt;code&gt;* &lt;/code&gt;) oder die Liste beenden (zwei Newlines).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für heute muss ich Schluss machen, gibt viel zu tun.&lt;/p&gt;
&lt;h1 id=&#34;emacs-lernen-tag-4&#34;&gt;Emacs lernen, Tag 4&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;So, jetzt würde ich gerne etwas programmieren. In Haskell&lt;/li&gt;
&lt;li&gt;Mache ein neues File auf und fange an zu tippen.&lt;/li&gt;
&lt;li&gt;Nach zwei Zeilen merke ich, dass das ohne Syntaxhighlighting keinen Spaß macht.&lt;/li&gt;
&lt;li&gt;rufe [https://github.com/serras/emacs-haskell-tutorial/blob/master/tutorial.md](die Anleitung zum Haskellcodeschreiben im Emacs) auf. Hoffentlich funktioniert das jetzt schön flott.&lt;/li&gt;
&lt;li&gt;Ich soll &lt;code&gt;(find-file user-init-file)&lt;/code&gt; evaluieren. Nach dem dritten Versuch kommt mir, dass ich die Klammern mit tippen muss. Wahrscheinlich ist das so bei Lisp.&lt;/li&gt;
&lt;li&gt;Ich benutze heute mal den Graphischen Emacs um zumindest einer Menubar zu haben, mit der ich etwas anfangen kann.&lt;/li&gt;
&lt;li&gt;Installiere den Haskell mode. Tada!&lt;/li&gt;
&lt;li&gt;Beim Rumklicken im Menü stelle ich fest, dass es das Tutorium auch auf Deutsch gegeben hätte. Super.&lt;/li&gt;
&lt;li&gt;Programmiere hin und her. Mir fehlen noch viele der wichtigen Shortcuts, aber ich hab schon wirklich Schwierigkeiten mit dem Courser. Immer wieder springe ich an stellen, wo ich nicht hin wollte.&lt;/li&gt;
&lt;li&gt;Immerhin der Shortcut für Zwischenspeichern sitzt schon bombenfest. Das macht ja Hoffnung für den Rest.&lt;/li&gt;
&lt;li&gt;Es hilft auch nicht dass das, was ich gerne coden würde nicht funktioniert.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Pause&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;emacs-lernen-tag-5&#34;&gt;Emacs lernen, Tag 5&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Ein paar Tage sind vergangen seit ich das letzte mal einen Editor angefasst habe. Die Uni hat ein bisschen Zeit gefordert.&lt;/li&gt;
&lt;li&gt;Es ist seltsam: Ich kann mich seit dem letzten mal an kaum einen Shortcut erinnern, aber wenn ich sie brauche sind sie da. Eigentlich cool, hoffentlich klappt das ab jetzt ja immer so.&lt;/li&gt;
&lt;li&gt;Kein Syntaxhighlighting. Wie wechselt man nochmal den Modus?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x m&lt;/code&gt;, und der Editor erwartet von mir, dass ich eine Mail schreibe. Seltsam, das war es wohl nicht.&lt;/li&gt;
&lt;li&gt;Immer noch nicht gefunden, dafür (in der graphischen Variante) unter &amp;lsquo;Options&amp;rsquo; irgendwo Themes gefunden. Von den dort verfügbaren hat mir keines gut gefallen. Darum kümmere ich mich später.&lt;/li&gt;
&lt;li&gt;Schön: Der Schortcut &lt;code&gt;C-l&lt;/code&gt; scrollt so, dass der Courser in der Mitte ist - auch wenn das File noch gar nicht so lang ist. Wenn man einen Text schreibt ist das ganz angenehm: Oben das Geschriebene, unten noch leerer Platz. Das fühlt sich richtig an, ist für Code aber nicht nützlich.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;C-l.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Etwas Recherche: In &lt;code&gt;~/.emacs&lt;/code&gt; kann man auch konfigurieren, das Files mit bestimmten Endungen (.md oder .hs) in bestimmten modi geöffnet werden.&lt;/li&gt;
&lt;li&gt;Gleichmal alles mit git versionieren. Ich hab ja &lt;a href=&#34;https://blog.schauderbasis.de/meine-configs/&#34;&gt;schonmal geschrieben&lt;/a&gt;, dass ich meine Configs auf Github hochlade. Die .emacs &lt;a href=&#34;https://github.com/Kaligule/Configs-in-home/blob/master/.emacs&#34;&gt;liegt hier&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Arbeite jetzt zum ersten mal sinnvoll mit zweigeteiltem Editor. Einmal um diesen Text zu schreiben, der andere Teil ist für ein Haskellprogramm. Damit kann ich mir jetzt schön Stück für Stück meinen Haskellmode konfiguriern.&lt;/li&gt;
&lt;li&gt;Was sich als etwas schwieriger herausstellt als gedacht.&lt;/li&gt;
&lt;li&gt;Jetzt habe ich eine Promt im Emacs aufgemacht (cool, dass das geht) und bekomme den Rahmen nicht mehr zu.&lt;/li&gt;
&lt;li&gt;Habs jetzt doch geschafft. Man geht in den Befehlsmods (&lt;code&gt;M-x&lt;/code&gt;) und tippt &amp;ldquo;delete-window&amp;rdquo; ein. Bin ich sogar selbst drauf gekommen :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für mich reichts jetzt, ich geh ins Bett.&lt;/p&gt;
&lt;h1 id=&#34;bilanz-der-letzten-tage&#34;&gt;Bilanz der letzten Tage&lt;/h1&gt;
&lt;p&gt;Trotz längerer Pause habe ich das Gefühl, dass die zumindest die grundlegensten Befehle funktionieren. Emacs fühlt sich immernoch wie rießiges Monstrum an, dass ich nicht im Ansatz verstehe. Aber immerhin durfte ich schon ein bisschen von den Vorzügen kosten.
Ich werde jetzt mal meinen Primäreditor auf Emacs umstellen und sehen, ob sich das bewährt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Emacs lernen, Tag 2</title>
      <link>https://schauderbasis.de/posts/emacs-lernen-tag-2/</link>
      <pubDate>Tue, 23 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/emacs-lernen-tag-2/</guid>
      <description>&lt;h2 id=&#34;logbuch-tag-2&#34;&gt;Logbuch, Tag 2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Starte Emacs mit &lt;code&gt;emacs -nw&lt;/code&gt; wie gestern gelernt.&lt;/li&gt;
&lt;li&gt;Starte einen zweiten emacs, um das Logbuch mit zu tippen. Wie bekomme ich jetzt eine neue Datei? Hab keine Ahnung. Behelfe mich schließlich mit &lt;code&gt;emacs -nw Blogeintrag.mdown&lt;/code&gt;. Das geht noch besser.&lt;/li&gt;
&lt;li&gt;Weil die Pfeiltasten noch abgeklebt sind muss ich die Shortcuts benutzen um hin und her zu springen. Juhu!&lt;/li&gt;
&lt;li&gt;Bevor ich loslege sollte ich wahrscheinlich lernen, wie man eine Textdatei speichert. Sonst gibts nachher Tränen.&lt;/li&gt;
&lt;li&gt;Speichern geht mit &lt;code&gt;C-x C-s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Der erste Hammer des Tages: Paste ist nicht, wie erwartet &lt;code&gt;C-v&lt;/code&gt; sondern &lt;code&gt;C-y&lt;/code&gt; für __y__ank (großzügig übersetzt mit zurückreißen).&lt;/li&gt;
&lt;li&gt;Yank ist komplizierter als gedacht.&lt;/li&gt;
&lt;li&gt;Der Shortcut für &lt;em&gt;undo&lt;/em&gt; (&lt;code&gt;C-\&lt;/code&gt;macht auf amerikanischen Tastaturen mehr Sinn, weil dort das &lt;code&gt;\&lt;/code&gt; direkt unter dem Delete Key ist. Mist - ich habe eine Deutsche Tastatur an meinem Laptop und daran wird sich so bald auch nichts ändern.&lt;/li&gt;
&lt;li&gt;Lerne ich lieber &lt;code&gt;C-_&lt;/code&gt; dafür, da muss man sich nicht so verrenken.&lt;/li&gt;
&lt;li&gt;Undo wird erklärt, aber wie geht &lt;em&gt;redo&lt;/em&gt;? Wird hier nicht erklärt, hätte ich aber gerne.&lt;/li&gt;
&lt;li&gt;Warum ist &lt;em&gt;undo&lt;/em&gt; eigentlich nicht &lt;code&gt;C-z&lt;/code&gt;? &lt;strong&gt;AAAAAAAAAAAAAARrrrrrrgh!&lt;/strong&gt; Ich wollte es doch nur ausprobieren, nicht den Emacs schließen! Nein! und das letzte mal, dass ich das Logbuch gespeichert habe ist ewig her.&lt;/li&gt;
&lt;li&gt;Als ich die Datei wieder öffne und beginnen will, das verlorene wieder einzutippen, erhalte ich eine seltsame Nachricht:
&lt;img src=&#34;Hoffnung.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;
&lt;li&gt;Gibt es noch Hoffnung für meine Änderungen? Ich tippe &lt;code&gt;s&lt;/code&gt; und der Dialog verschwindet - ohne die erwünschte Wirkung. Mist, das wäre mal ein Feature gewesen das ich brauchen kann. (später lerne ich: Hätte man ins Terminal einfach fg getippt wäre alles ok gewesen. Tja)&lt;/li&gt;
&lt;li&gt;Viel zwischenspeichern ab jetzt. &lt;code&gt;C-x C-s&lt;/code&gt; &lt;code&gt;C-x C-s&lt;/code&gt; &lt;code&gt;C-x C-s&lt;/code&gt; &lt;code&gt;C-x C-s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ein Bisschen Theorie über Buffer. Alles wo Text drin steht ist ein Buffer.&lt;/li&gt;
&lt;li&gt;Man kann Buffer scheinbar wie Tabs benutzen, nur ohne die Tableiste. Dafür mit &lt;code&gt;C-x b&lt;/code&gt; und dann den Namen von dem Tab eingeben.&lt;/li&gt;
&lt;li&gt;Ein File öffnen geht mit &lt;code&gt;C-x C-f&lt;/code&gt;. Das steht angeblich für &amp;ldquo;_f_ind file&amp;rdquo;, aber ich merke mir einfach _f_ile.&lt;/li&gt;
&lt;li&gt;Mittagspause&lt;/li&gt;
&lt;li&gt;Mir wird erklärt, dass die Datei vorhin nicht wirklcih weg war, sondern &amp;ldquo;nur in den Hintergrund gerückt&amp;rdquo;. &lt;code&gt;C-z&lt;/code&gt; ist auch eigentlich kein Emacs-Befehl sondern geht direkt an das Terminal, in dem der Emacs läuft. Ich habe noch keinen Überblick über die vielen Schichten der Komplexen Programme, die hier laufen.&lt;/li&gt;
&lt;li&gt;Es gibt eine Art Notificationcenter (eigentlich ein Buffer), wo alle eingegangenen Nachrichten (in der unteren Zeile aufgeführt werden. Langsam wird mir klar, warum Leute Emacs als Betriebssystem verstehen.&lt;/li&gt;
&lt;li&gt;Nach dem ich 57% des Tutorials durchlaufen habe wird erklärt, wie man Emacs beendet. Ich habe es ja schon schmerzhaft selbst herausgefunden.&lt;/li&gt;
&lt;li&gt;Die Echo Area (letzte Zeile, wo die Tastencombos angezeigt werden die man bereits getippt hat) hat einen eingebauten Delay. Das finde ich schlecht, sobald ich weiß wie hier alles läuft mache ich den Weg.&lt;/li&gt;
&lt;li&gt;Zwischendurch was trinken, ist ja auch wichtig.&lt;/li&gt;
&lt;li&gt;Jetzt wird es spannend. Es gibt Modes. Für verschiedene Programmiersprachen verwendet man verschiedene Modi, die Dinge verändern (zum Beispiel, wie ein Kommentar aussieht oder was ein Paragraph ist)&lt;/li&gt;
&lt;li&gt;Es gibt Major-Modi und Minor-Modi. Man kann nur einen Major- aber mehrere Minor-Modi gleichzeitig benutzen.&lt;/li&gt;
&lt;li&gt;Ich wechsle sofort vom Fundamental-(Major-)Mode in den Text-(Major-)Mode.&lt;/li&gt;
&lt;li&gt;Fühle mich gleich besser. Es ist gut, wenn der Editor weiß, was ich tue (wenn ich es schon nicht immer weiß)&lt;/li&gt;
&lt;li&gt;Der Minor Mode Autofill nervt eher. Was ich nicht mag, wird nicht benutzt. Ha!&lt;/li&gt;
&lt;li&gt;Ich habe das Gefühl, ein großer Teil der Flexibilität von Emacs wird aus diesen Modes kommen.&lt;/li&gt;
&lt;li&gt;Mein Kopf brummt. Gut dass heute nicht viel los ist.&lt;/li&gt;
&lt;li&gt;Weiter machen: Searching&lt;/li&gt;
&lt;li&gt;Die Incremental search ist genau das, was bei Sublimetext das &lt;code&gt;Strg-I&lt;/code&gt; macht. Nur nicht fuzzy.&lt;/li&gt;
&lt;li&gt;fuzzy search wird überhaupt immernoch viel zu sehr unterschätzt, außer Sublimetext macht das kaum einer richtig.&lt;/li&gt;
&lt;li&gt;Mehrere Frames in einem Fenster. Den Teil überfliege ich nur, von sowas bin ich kein großer Freund. Schön, dass es geht.&lt;/li&gt;
&lt;li&gt;Shortcut des Tages: &lt;code&gt;&amp;lt;Esc&amp;gt; &amp;lt;Esc&amp;gt; &amp;lt;Esc&amp;gt;&lt;/code&gt; als ein &lt;em&gt;all-purpose &amp;ldquo;get out&amp;rdquo; command&lt;/em&gt;. Das ist gut, denn das drückt man sowieso meistens ganz panisch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bilanz-tag-2&#34;&gt;Bilanz, Tag 2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Diesen Text habe ich im Emacs getippt, Yeah! (und es ist mir nur einmal schief gegangen.&lt;/li&gt;
&lt;li&gt;Das Tutorium habe ich zu 90% durch, sehr gut. Morgen suche ich mir was anderes zum Üben.&lt;/li&gt;
&lt;li&gt;Leider hab ich, als es etwas zu Programmieren gab noch Schwierigkeiten gehabt und dann doch schnell Sublimetext genommen. Ein Moralischer Fehltritt.&lt;/li&gt;
&lt;li&gt;Vielleicht suche ich mir morgen ein paar Modes heraus, die mich beim Schreiben wirklich unterstützen - heute habe ich von ihnen kaum was gemerkt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich freu mich auf morgen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Emacs lernen,  Tag 1</title>
      <link>https://schauderbasis.de/posts/emacs-lernen-tag-1/</link>
      <pubDate>Mon, 22 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/emacs-lernen-tag-1/</guid>
      <description>&lt;p&gt;Auf der Suche nach einem Editor beschäftige ich mit Emacs. Auf Emacs selbst gehe ich später noch genauer ein, hier geht es um meine ersten Kontakte damit.&lt;/p&gt;
&lt;h2 id=&#34;logbuch-tag-1&#34;&gt;Logbuch, Tag 1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fange jetzt an, Emacs zu lernen. Ich google nach einem Handbuch und werde fündig: &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/emacs.html&#34;&gt;https://www.gnu.org/software/emacs/manual/emacs.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tippe &lt;code&gt;emacs&lt;/code&gt; in die Konsole. Eine Hässliche GUI geht auf. Die will ich nicht. Tipp meines Nachbarn: Mit &lt;code&gt;DISPLAY =emacs&lt;/code&gt; bekommt man einen Terminalbasierten Emacs. Schon besser. (Später lerne ich, dass es mit &lt;code&gt;emacs -nw&lt;/code&gt; besser geht)&lt;/li&gt;
&lt;li&gt;Außer mir sind noch andere Personen im Raum, die vergnügt Tipps geben Details aus Richard Stallmanns Leben rezitieren. Alle Tipps sind verwirrend.&lt;/li&gt;
&lt;li&gt;Das Handbuch erklärt erstmal, wie toll Emacs ist. Doof.&lt;/li&gt;
&lt;li&gt;Einer der Kollegen zieht aus seinem Schreibtisch zwei Seiten (klein gedruckte) Emacs Schortcuts: Die &lt;a href=&#34;https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf&#34;&gt;GNU Emacs Reference Card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Es gibt eine Tutorial, ähnlich dem &lt;code&gt;vimtutor&lt;/code&gt;. Dieser ist aber natürlich erst später eingeführt worden, Emacs war erster! Das Tutorial bekommt man in Emacs mit &lt;code&gt;C-h t&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Habe die letzten Minuten damit verbracht, Emacs abzuschießen (weil ich nicht mehr rauskam) und das Tutorial wieder aufzurufen. Wie man Emacs richig beendet habe ich noch nicht rausgefunden.&lt;/li&gt;
&lt;li&gt;Mittagspause&lt;/li&gt;
&lt;li&gt;Das Tutorial ist ganz gut. Manche von den Shortcuts kann ich sogar nachvollziehen. Ich lass das Handbuch beiseite und arbeitet mich durch das Tutorial.&lt;/li&gt;
&lt;li&gt;Die Shortcuts in Emacs werden auf eine bestimmte Weiße aufgeschreiben:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;M&lt;/code&gt; steht für &lt;em&gt;Meta&lt;/em&gt; (also &lt;em&gt;Alt&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C&lt;/code&gt; steht für &lt;em&gt;Controll&lt;/em&gt; (also &lt;em&gt;Strg&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&lt;/code&gt; trennt mehrere Tasten, die man gleichzeitig drückt (im Gegensatz zu Leerzeichen, wo Sachen hintereinander gedrückt werden)&lt;/li&gt;
&lt;li&gt;Kleine Buchstaben bedeuten die jeweilige Taste.&lt;/li&gt;
&lt;li&gt;Den Emacs verlässt man mit &lt;code&gt;C-x C-c&lt;/code&gt;. Das Bedeutet übersetzt: &amp;ldquo;Drücke erst &lt;code&gt;Strg&lt;/code&gt; und &lt;code&gt;X&lt;/code&gt; (gleichzeitig) und dann &lt;code&gt;Strg&lt;/code&gt; und &lt;code&gt;C&lt;/code&gt;(gleichzeitig). Dabei ist es kein Problem, wenn man &lt;code&gt;Strg&lt;/code&gt; nicht loslässt.&lt;/li&gt;
&lt;li&gt;Das Tutorial findet man mit &lt;code&gt;C-h t&lt;/code&gt;, als &lt;code&gt;Strg&lt;/code&gt; und &lt;code&gt;h&lt;/code&gt; gleichzeitig und dann (ohne andere Tasten) ein &lt;code&gt;t&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bis jetzt kann ich mit originalen Emacs Shortcuts: Ein(e)(n) Buchstaben/Wort/Zeile/Seite vor/zurück springen. Hat mit den alten Tasten ja auch viel zu lange gedauert. Schön: Die Shortcuts sind mit den Tasten &lt;code&gt;b&lt;/code&gt;ack, &lt;code&gt;f&lt;/code&gt;orward, &lt;code&gt;p&lt;/code&gt;revious, und &lt;code&gt;n&lt;/code&gt;ext belegt. Das kann man sich ja sogar merken :)&lt;/li&gt;
&lt;li&gt;Hmmm, &lt;code&gt;C-a&lt;/code&gt; und &lt;code&gt;C-e&lt;/code&gt; für __A__nfang/__E__nde der Zeile. Auf deutsch ganz gut zu merken, im Englischen sind mir die Shortcuts nicht gnaz so klar.&lt;/li&gt;
&lt;li&gt;Man kann Befehle mehrfach hintereinander ausführen lassen. Das kenne ich noch aus meinen wenigen Vim-Erfahrungen. Schön, dass es hier auch geht.&lt;/li&gt;
&lt;li&gt;Die Syntax dafür ist &lt;code&gt;C-u Anzahl Eigentlicher-Befehl&lt;/code&gt;. Ich merke mir mal u wie in __u__nit.&lt;/li&gt;
&lt;li&gt;Jonathan neben mir beginnt mit zu fiebern. Er tippt wild  Programme in Emacs, aber benutzt nicht genug Shortcuts. Ich klebe uns beiden die Pfeiltasten ab, um die Emacsshortcuts zu erzwingen.&lt;/li&gt;
&lt;li&gt;In Zeile 316 des Tutorials das erste mal ein Hinweis darauf, wie man text manipuliert: &amp;ldquo;If you want to insert text, just type the text.&amp;rdquo; Bisher bin nur vor und zurück gesprungen.&lt;/li&gt;
&lt;li&gt;Das Abkleben der verführerischen Tasten funktioniert: Selbst wenn man sie noch ein bisschen benutzen kann, fühlt man sich schlecht dabei.&lt;/li&gt;
&lt;li&gt;Im Gegensatz zu Vim scheint es keinen Commandmode zu geben. Daraus folgen Zwei Dinge:
&lt;ul&gt;
&lt;li&gt;Wenn man was tippen will kann man das einfach tun&lt;/li&gt;
&lt;li&gt;Wenn man Shortcuts benutzen will, sind diese länger (werden zum Beispiel mit &lt;code&gt;C-x&lt;/code&gt; eingeleitet).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Es gibt einen Unterschied zwischen &lt;em&gt;delete&lt;/em&gt; (einfach löschen) und &lt;em&gt;kill&lt;/em&gt; (nur ausschneiden, aber noch zum wieder einfügen in den Buffer legen). Manche Befehle machen das eine, andere das andere. Meine Güte, das wird kompliziert.&lt;/li&gt;
&lt;li&gt;Obwohl alle um mich herum Vi(m) benutzen, sind sie aufgeschlossen und fiebern mit. Der eine ehemalige Emacsuser gibt Ratschläge und entusiastisch vorgetragene Anekdoten zum besten.&lt;/li&gt;
&lt;li&gt;An den Commandmode hatte ich mich scheinbar mehr gewöhnt als gedacht. Ab und zu suche ich ihn noch und wundere mich, wenn komische Dinge passieren (oder nicht passieren)&lt;/li&gt;
&lt;li&gt;Mit &lt;code&gt;C-u 100 r&lt;/code&gt; kann man Hundert rs auf einmal schreiben :)&lt;/li&gt;
&lt;li&gt;rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr&lt;/li&gt;
&lt;li&gt;Dieses Log schreibe ich im Moment noch in Sublime Text, aber langsam fühle ich mich tatsächlich fit genug, das auch direkt in Emacs zu machen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bilanz-1-tag&#34;&gt;Bilanz, 1 Tag&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hat Spaß gemacht heute.&lt;/li&gt;
&lt;li&gt;Viele ungewohnte Shortcuts gelernt, auch für Dinge die ich schon vorher anders konnte. (Ich soll zum Beispiel kein Page Up/Down und keine Pfeiltasten benutzen)&lt;/li&gt;
&lt;li&gt;Einige Dinge kommen einem zuerst komisch vor, machen aber später Sinn. (Zum Beispiel werden einzelne Buchstaben immer gelöscht (&lt;em&gt;delete&lt;/em&gt;), ganze Worte, Sätze und Zeilen aber &lt;em&gt;gekillt&lt;/em&gt;, so dass man sie schnell an anderer Stelle wieder einfügen kann.)&lt;/li&gt;
&lt;li&gt;Das Tutorium ist besser geschrieben als der Vimtutor. Dort werden die Shortcuts hauptsächlich eingeführt, bei Emacs wird erklärt, warum sie sinnvoll sind. Das macht viel aus.&lt;/li&gt;
&lt;li&gt;Von der wahren Macht von Emacs habe ich noch nicht kosten dürfen. Alles bisherige kannte ich anders auch aus Sublimetext, abgesehen von dem &lt;code&gt;C-u&lt;/code&gt;, &lt;code&gt;C-l&lt;/code&gt;, &lt;code&gt;M-a&lt;/code&gt; und &lt;code&gt;M-e&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Morgen mache ich weiter und schreibe das Log in Emacs.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Digitaler Haushalt</title>
      <link>https://schauderbasis.de/posts/digitaler-haushalt/</link>
      <pubDate>Sun, 21 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/digitaler-haushalt/</guid>
      <description>&lt;p&gt;Wer nach dem Urlaub nach Hause kommt muss erstmal einiges an Haushalt erledigen: Sachen einräumen, den Kühlschrank auffüllen, Wäsche waschen, durchfegen, Blumen gießen, sich bei Nachbarn und Freunden melden und sich um die Post kümmern.&lt;/p&gt;
&lt;p&gt;Im Digitalen fallen erstaunlich ähnliche Dinge an. Nach einer Woche Offline-Abstinenz in Italien (nur gelegentlich unterbrochen von kurzen Netz-Momenten) geht es ans Liegengebliebene:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RSS-Nachrichten der letzten Tage durchgehen
&lt;ul&gt;
&lt;li&gt;zumindest grob, vielleicht war ja was interessantes dabei&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RSS-Feeds auffrischen
&lt;ul&gt;
&lt;li&gt;Von ein paar schönen Blogs habe auf der Heimfahrt gelesen, die kommen dazu.&lt;/li&gt;
&lt;li&gt;Ein paar Nachrichtenseiten gehen mir langsam zu sehr auf den Keks, weg damit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Späterlesendienst ausschütteln
&lt;ul&gt;
&lt;li&gt;auf der Fahrt habe ich zwar einiges weggelesen, aber mir ist aufgefallen dass ich schon seit Monaten kein Inbox Zero mehr hatte.&lt;/li&gt;
&lt;li&gt;Was ich in den letzten 8 Wochen nicht gelesen habe lese ich wohl nicht mehr. Hier darf großzügig gelöscht werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mails beantworten
&lt;ul&gt;
&lt;li&gt;Zum Glück nicht zu viele, dafür aber ein paar Wichtige.&lt;/li&gt;
&lt;li&gt;Ham zu Ham, Spam zu Spam&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sich in den Sozialen Netzwerken blicken lassen&lt;/li&gt;
&lt;li&gt;Urlaubsfotos archivieren
&lt;ul&gt;
&lt;li&gt;Alle Fotos von Allen Urlaubsteilnehmern sollen auch allen zur Verfügung stehen.&lt;/li&gt;
&lt;li&gt;Wird Zeit dass ich mal eine &lt;a href=&#34;https://mediagoblin.org/pages/campaign.html&#34;&gt;Mediagobblin&lt;/a&gt; Instanz aufsetzte. Hmmmm, später.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Frisch geplante Projekte müssen auf Tauglichkeit überprüft und in den Alltag eingebettet werden, ohne dass die Arbeit drunter leidet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tatsächlich ist es genau wie Hausarbeit: Es tut gut, mal alles liegen zu lassen. Dannach fängt man an und je mehr man tut desto mehr müsste man noch machen. Ganz sauber wird es nie, nur sauberer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Editoren</title>
      <link>https://schauderbasis.de/posts/editoren/</link>
      <pubDate>Fri, 05 Sep 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/editoren/</guid>
      <description>&lt;p&gt;Wer Code schreiben will, braucht einen Code-Editor. Es lohnt sich, sich einen Guten zu suchen, denn man wird viel Zeit mit ihm verbringen und er ist schnell ein essentieller Teil des Computers.&lt;/p&gt;
&lt;p&gt;Ich selbst bin noch immer auf der Suche nach einem Editor, der mich restlos zufrieden stellt.&lt;/p&gt;
&lt;h2 id=&#34;was-ich-will&#34;&gt;Was ich will&lt;/h2&gt;
&lt;p&gt;Ein Editor mit dem ich glücklich werde müsste ein paar &lt;strong&gt;Mindestanforderung&lt;/strong&gt; erfüllen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Erweiterbar&lt;/strong&gt; durch Plugins&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-Platform&lt;/strong&gt; zumindest für alle Unixoiden Systeme. Wer weiß schon was die Zukunft bringt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;schnell&lt;/strong&gt; (auch bei wirklich großen Files mit mehr als 100000 Zeilen)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;durchdacht&lt;/strong&gt; und nicht durchwachsen. Man merkt einem Programm an ob es designed wurde oder mit der Zeit gewachsen ist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Starken Language Support&lt;/strong&gt; für die Sprachen, die ich oft benutze. Das ist im Moment hauptsächlich Haskell und Markdown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Starke Shortcuts&lt;/strong&gt; die das editieren erleichtern und schneller machen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git Integration&lt;/strong&gt; gerne auch durch Plugin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt; um Code auch mal direkt im Editor auführen zu lassen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Außerdem gibt es noch ein paar &lt;strong&gt;Standardfeatures&lt;/strong&gt;, die ohnehin bei den meisten Editoren dabei sind, wie&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zeilennummern&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wortergänzung&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syntax Highlighting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Klammer Support&lt;/strong&gt; für runde, eckige, geschweifte, spitze Klammern und was für die jeweilige Sprache noch als Klammer dient (bei Markdown zum Beispiel auch &lt;code&gt;_&lt;/code&gt;, &lt;code&gt;__&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;**&lt;/code&gt; etc)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distractionfree Programming&lt;/strong&gt; (eher wenn man normalen Text schreibt und dafür keine Seitenleisten, Menüleisten, Vorschau&amp;hellip; braucht)&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;shortcuts&#34;&gt;Shortcuts&lt;/h3&gt;
&lt;p&gt;Shortcuts die ich besonders häufig verwende sind&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zeile löschen&lt;/li&gt;
&lt;li&gt;Zeile dublizieren&lt;/li&gt;
&lt;li&gt;Zeile verschieben (nach oben oder unten)&lt;/li&gt;
&lt;li&gt;Zeile markieren&lt;/li&gt;
&lt;li&gt;Wort markieren&lt;/li&gt;
&lt;li&gt;nächstes gleiches Wort markieren (Multicursor)&lt;/li&gt;
&lt;li&gt;zu Wort springen (mit fuzzy search oder regulären Ausdrücken)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich lerne langsam auch neue dazu (man muss sie ja dann auch verwenden), aber das braucht immer etwas Zeit. Im Idealfall finde ich einen Editor der all das erfüllt und verwachse so sehr mit ihm, dass alle Shortuts intuitiv werden.&lt;/p&gt;
&lt;p&gt;Besonders toll (auch wenn ich es nie gelernt habe) finde ich die modularen Shortcuts beim vim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;man tippt &lt;code&gt;3&lt;/code&gt; um den Befehl dreimal auszuführen, &lt;code&gt;d&lt;/code&gt; für &lt;em&gt;delete&lt;/em&gt; und &lt;code&gt;aw&lt;/code&gt; für &lt;em&gt;a word&lt;/em&gt;. Der Editor entfernt dann die nächsten 3 Worte.&lt;/li&gt;
&lt;li&gt;man tippt &lt;code&gt;d&lt;/code&gt; für &lt;em&gt;delete&lt;/em&gt; und &lt;code&gt;0&lt;/code&gt; für &lt;em&gt;Anfang der Zeile&lt;/em&gt;. Der Editor entfernt alles vom Anfang der Zeile bis zum Courser.&lt;/li&gt;
&lt;li&gt;man tippt &lt;code&gt;10&lt;/code&gt; für &lt;em&gt;zehnmal&lt;/em&gt; und &lt;code&gt;x&lt;/code&gt; für &lt;em&gt;delete Character&lt;/em&gt; und die nächsten 10 Buchstaben werden entfernt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wer das einmal verinnerlicht hat will das sicher nicht mehr missen.&lt;/p&gt;
&lt;h3 id=&#34;große-files&#34;&gt;große Files&lt;/h3&gt;
&lt;p&gt;Manchmal verprogrammiert man sich und erzeugt aus Versehen rießige Dateien. Manchmal muss man Logfiles anschauen und bearbeiten, die seit Jahren geschreiben werden. Manchmal muss man eine seltsame Datei im Editor aufmachen, weil man dann vielleicht versteht welches Format sie hat (funktioniert öfter als man denkt, probiert das mal mit PDF/Bilddateien/Websiten).&lt;/p&gt;
&lt;p&gt;Deshalb &lt;em&gt;muss&lt;/em&gt; mein Editor mit Files umgehen können, die seeeeeehr lang sind.&lt;/p&gt;
&lt;h3 id=&#34;language-support&#34;&gt;Language Support&lt;/h3&gt;
&lt;p&gt;Knifflig, da will man ja immer was anderes.&lt;/p&gt;
&lt;p&gt;Für &lt;strong&gt;Markdown&lt;/strong&gt; reicht mir eine Semi-Vorschau im Editor und ab und zu ein Blick auf das gerenderte (html-)Dokument im Browser. Immerhin ist Markdown  (Aktuelle Lösung: Sublimetext im Distraction Free Mode mit den Paketen MarkdownEditing (dark) und Markdown Priview und Firefox mit dem Plugin Auto Reload).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Distraction_Free_Mode.jpg&#34; alt=&#34;Da kann man sich konzentrieren.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Für &lt;strong&gt;Haskell&lt;/strong&gt; (und alle Sprachen die ich danach lerne) will ich die krasseste Unterstützung die auf diesem Planeten möglich ist, bitte. Ich wünsche mir&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Syntax Highlighting&lt;/li&gt;
&lt;li&gt;Qualifizierte Vorschläge und Ergänzungen&lt;/li&gt;
&lt;li&gt;Snippets&lt;/li&gt;
&lt;li&gt;Automatische Einrückung&lt;/li&gt;
&lt;li&gt;Cabal Support&lt;/li&gt;
&lt;li&gt;Linting&lt;/li&gt;
&lt;li&gt;Warungen bei unnötigen imports&lt;/li&gt;
&lt;li&gt;integrierte Documentation (auch zum offline abrufen)&lt;/li&gt;
&lt;li&gt;Benchmarking&lt;/li&gt;
&lt;li&gt;Automatische Berechnung von Signaturen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sprich, wenn ich Code schreibe soll mein Editor zur mächtigen IDE werden. Das ist alles möglich (und im ghc schon angelegt), also keine Ausreden!&lt;/p&gt;
&lt;h2 id=&#34;die-kandidaten&#34;&gt;Die Kandidaten&lt;/h2&gt;
&lt;p&gt;Es gibt ein paar Kandidaten die erstmal in die engere Auswahl kommen. Ich werde zu den Einzelnen noch etwas schreiben, vielleicht (hoffentlich) kommen ja noch was dazu. Bis jetzt habe ich auf dem Schirm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sublime Text&lt;/li&gt;
&lt;li&gt;Vim&lt;/li&gt;
&lt;li&gt;Atom&lt;/li&gt;
&lt;li&gt;Emacs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich habe schon einige Editoren getestet und mit den meisten bin ich nicht recht warm geworden. Von den vielen seien hier erwähnt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/limetext/lime&#34;&gt;Limetext&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://alpha.app.net/lukasepple/post/32818682&#34;&gt;Geany&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://duckduckgo.com/l/?kh=-1&amp;amp;uddg=http%3A%2F%2Fwww.haskell.org%2Fhaskellwiki%2FYi&#34;&gt;Yi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://leksah.org/&#34;&gt;leksah&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://eclipse.org/&#34;&gt;Eclipse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wer noch Tipps für mich hat, immer her damit. Die Mailadresse steht zum Beispiel im Impressum.&lt;/p&gt;
&lt;p&gt;To be continiued&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Meine Configs</title>
      <link>https://schauderbasis.de/posts/meine-configs/</link>
      <pubDate>Wed, 13 Aug 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/meine-configs/</guid>
      <description>&lt;p&gt;Viele Programme besonders unter Unix kann man sogenannten configs (&amp;ldquo;Konfigurationsdateien&amp;rdquo;) tunen. Es sind einfache Textfiles, in die man Anweisungen für das Programm aufschreibt und die man dann an eine bestimmte stelle im Dateisystem legt, wo sie das Programm dann auch findet.&lt;/p&gt;
&lt;p&gt;Es gibt ein paar Dinge, die einem recht schnell klar werden wenn man sich mit configs beschäftigt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In einer config kann sehr viel Arbeit drin stecken.&lt;/li&gt;
&lt;li&gt;Wenn man sich mit dem Programm noch nicht auskennt ist es oft nützlich Beispielconfigs zu haben.&lt;/li&gt;
&lt;li&gt;Die Syntax ist nicht einheitlich festgelegt. Zumindest kann man &lt;em&gt;meistens&lt;/em&gt; mit &lt;code&gt;#&lt;/code&gt; auskommentieren.&lt;/li&gt;
&lt;li&gt;configs können beliebig komplex und kompliziert werden.&lt;/li&gt;
&lt;li&gt;Bei manchen Programmen sind sehr nützliche Beispielconfigs gleich mitgeliefert.&lt;/li&gt;
&lt;li&gt;Es ist nicht immer klar, wo die config zu einem Programm liegen soll. Oft (naja, eher ab und zu) liegt sie unter ~/.config/&lt;em&gt;programmname&lt;/em&gt; oder direct im home. Dann heißt sie oft ._programmname_rc (das rc steht &lt;a href=&#34;https://kb.iu.edu/d/abdr&#34;&gt;angeblich&lt;/a&gt; für &amp;ldquo;run commands&amp;rdquo;, aber das halte ich für keinen guten Namen).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wer ein bestimmtes Programm oft verwenden will hat wahrscheinlich einen Vorteil, wenn er ein bisschen in dessen config rumspielt.&lt;/p&gt;
&lt;h2 id=&#34;beispiel&#34;&gt;Beispiel!&lt;/h2&gt;
&lt;p&gt;Meine bashrc (die die Kommandozeile an meine Bedürfnisse anpasst) sieht im Moment so aus:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# User specific aliases and functions

# ls: als detailierte Liste mit Indikatoren (*/=&amp;gt;@|) anzeigen
alias ls=&amp;#39;ls -F -l&amp;#39;

# bei rm und mv immer nachfragen, bevor man was kaput macht
alias rm=&amp;#39;rm -i&amp;#39;
alias mv=&amp;#39;mv -i&amp;#39;

# bei less soll die tablaenge immer 4 sein
alias less=&amp;#39;less --tabs=4&amp;#39;

# gramps soll auf Deutsch laufen
alias gramps=&amp;#39;LANG=de_DE.UTF-8 gramps&amp;#39;

# dump .o and .hi files in an extra directory
alias ghc=&amp;#39;ghc -outputdir=ghc_outputdir&amp;#39;

# rm .o and .hi files
alias ghcleanup=&amp;#39;rm *.o *.hi&amp;#39;

# very simple promt.
export PS1=&amp;#34;\[\e[00;31m\]\W\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;31m\]\\$\[\e[0m\]\[\e[00;37m\] \[\e[0m\]&amp;#34;

# my editor
export EDITOR=&amp;#34;subl -n -w&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;versionskontrolle-für-configs&#34;&gt;Versionskontrolle für configs&lt;/h2&gt;
&lt;p&gt;Mir ist relativ schnell bewusst geworden, dass ich meine configs mit git versionieren möchte. Deswegen liegt neben jeder config, mit der ich mich beschäfftigt habe eine .git Datei. (Wer sich mit git nicht auskennt, sollte sich mal damit beschäftigen. Wirklich)&lt;/p&gt;
&lt;p&gt;Das hat sich für mich schon das eine oder andere mal ausgezahlt, wie es halt mit Verionskontrolle so ist.&lt;/p&gt;
&lt;h2 id=&#34;freiheit-für-configfiles&#34;&gt;Freiheit für configfiles!&lt;/h2&gt;
&lt;p&gt;Ich finde, dass noch zu wenig configs im Internet stehen. Oft einmal hätte ich das eine oder andere Beispiel brauchen können und habe keines gefunden.&lt;/p&gt;
&lt;p&gt;Deshalb stelle ich alle meine configs öffentlich ins Netz und zwar &lt;a href=&#34;https://github.com/Kaligule&#34;&gt;auf Github&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;configs-auf-github&#34;&gt;Configs auf Github&lt;/h1&gt;
&lt;h2 id=&#34;warum-github&#34;&gt;Warum github?&lt;/h2&gt;
&lt;p&gt;Dafür gibt es ein paar einfache Gründe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ich versioniere mit git&lt;/li&gt;
&lt;li&gt;Ich mag die Website von Github&lt;/li&gt;
&lt;li&gt;Man bekommt dort beliebig viele öffentliche Repositorys&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;wie-macht-man-das&#34;&gt;Wie macht man das?&lt;/h2&gt;
&lt;p&gt;Es ist wirklich einfach, Github selbst liefert eine gute Anleitung (siehe Bild).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;remote.png&#34; alt=&#34;add remote&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ich schreibe die Schritte hier trotzdem nochmal übersichtlich auf.&lt;/p&gt;
&lt;h3 id=&#34;config-auf-github-hochladen&#34;&gt;config auf Github hochladen&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Schreibe und bearbeite ein configfile, hier als Beispiel die &lt;em&gt;.bashrc&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Versioniere es mit git&lt;/li&gt;
&lt;li&gt;Lege ein Konto auf Github an. Wenn es ok für dich ist, dass dein Code öffentlich ist reicht ein kostenloses Konto absolut aus.
&lt;img src=&#34;CreateRepo.png&#34; alt=&#34;Neues Repo&#34;&gt;&lt;/li&gt;
&lt;li&gt;Erstelle auf Github ein neues Repository (idealerweise gleich mit einer freien Lizens)&lt;/li&gt;
&lt;li&gt;Füge mit&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git remote add origin [PfadZuDeinemRepository]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dein neues Repository zu git hinzu.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Schiebe deinen aktuellen Stand zum Remote mit&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push origin master
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;oder (noch kürzer) mit&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;zu Github.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gib deinen Username und dein Passwort an.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configs-auf-github-aktualisieren&#34;&gt;configs auf Github aktualisieren&lt;/h3&gt;
&lt;p&gt;Wenn man später nocheinmal etwas an seiner Config ändert, so comittet man mit git und führt dannach noch einmal den Befehl&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;aus. Fertig.&lt;/p&gt;
&lt;h2 id=&#34;wo-liegen-die-configs-denn-jetzt&#34;&gt;Wo liegen die configs denn jetzt?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Kaligule?tab=repositories&#34;&gt;https://github.com/USERNAME&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ist-die-welt-dadurch-besser-geworden&#34;&gt;Ist die Welt dadurch besser geworden?&lt;/h2&gt;
&lt;p&gt;Ja, denn jetzt sind die configs&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;öffentlich einsehbar für alle, die sich gerade damit herumschlagen. Diesen Menschen hast du geholfen.&lt;/li&gt;
&lt;li&gt;auf Github vor Datenverlust geschützt. Wenn der Computer abschmiert kannst du sie dir einfach wieder hersyncen, selbst wenn du sie sonst nicht gebackupt hast.&lt;/li&gt;
&lt;li&gt;syncron auf allen deinen Rechnern und Geräten, denn du kannst, stat alles mehrmals zu schreiben einfach deine configs dorthin _pull_en, wo du sie hinhaben willst.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Client und Reader in einem</title>
      <link>https://schauderbasis.de/posts/client-und-reader-in-einem/</link>
      <pubDate>Thu, 19 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/client-und-reader-in-einem/</guid>
      <description>&lt;p&gt;Nachtrag zur &lt;a href=&#34;https://www.schauderbasis.de/rss-software/&#34;&gt;RSS Software&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Pritlove-1.png&#34; alt=&#34;Pritlove, dessen Frueher noch frueher ist als meines&#34;&gt;&lt;/p&gt;
&lt;p&gt;Na gut, ich sehe es ja ein&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;-ich-hab-was-vergessen&#34;&gt;&amp;hellip; ich hab was vergessen.&lt;/h2&gt;
&lt;p&gt;Wer nur ein Gerät hat auf dem er Nachrichten ließt oder wem Sync allgemein auf den Keks geht oder keine Lust hat irgendwas in der Cloud zu machen oder was weiß ich - der kann auch einfach alles in einem Programm haben. Man installiere dazu einen Newsreader auf einem seiner Geräte.&lt;/p&gt;
&lt;h3 id=&#34;der-workflow&#34;&gt;Der Workflow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ich finde eine interessante Website im Internet und aboniere sie in meinem Newsreader. Ab jetzt beobachtet mein Feedreader die Website.&lt;/li&gt;
&lt;li&gt;Ein Autor schreibt einen Artikel auf der Website.&lt;/li&gt;
&lt;li&gt;Wenn ich meinen Feedreader öffne erkennt er den neuen Inhalt, befreit ihn von dem Websitedesign (so gut wie möglich) und legt ihn zum lesen bereit.&lt;/li&gt;
&lt;li&gt;Ich lese die neuen Artikel von verschiedenen Websiten, alle in einem Programm gebündelt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Zwischenschritt über den RSS Reader fällt also weg.&lt;/p&gt;
&lt;h3 id=&#34;vorteile&#34;&gt;Vorteile&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Die Feeds liegen nicht in der Cloud&lt;/li&gt;
&lt;li&gt;Ich hab alles an einer Stelle und muss nicht hoffen, dass alle Programme gut aufeinander abgestimmt sind (oder evtl sogar mit Plugins nachhelfen)&lt;/li&gt;
&lt;li&gt;Die Einstiegshürde ist niedriger.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;nachteile&#34;&gt;Nachteile&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Kein Sync. Sobald ich auf mehreren Geräten gleichzeitig lesen will, funktioniert es nicht mehr.&lt;/li&gt;
&lt;li&gt;Der Newsreader muss jede abonierte Website selbst besuchen (und verbraucht dabei evtl wertvolles mobiles Datenvolumen). Er kann sich nicht einfach mit einem (!) Server verbinden, der das schon für ihn gemacht hat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zusammen führt das dazu, dass man (zumindest wenn man ab und zu auf dem Telefon Feeds lesen will) sich lieber nach einer Serverseitigen Lösung umsehen sollte. (Meine Meinung)&lt;/p&gt;
&lt;h3 id=&#34;clients&#34;&gt;Clients&lt;/h3&gt;
&lt;p&gt;Wer das ganze mal testen will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.netnewswireapp.com&#34;&gt;NetNewsWire&lt;/a&gt;:&lt;/strong&gt; für OSX, &lt;a href=&#34;https://alpha.app.net/timpritlove/post/32900911&#34;&gt;freundliche Empfehlung&lt;/a&gt; von &lt;a href=&#34;https://tim.pritlove.org/&#34;&gt;Tim Pritlove&lt;/a&gt; (der nach &lt;a href=&#34;https://alpha.app.net/timpritlove/post/32905276&#34;&gt;eigener Aussage&lt;/a&gt; zur Zeit kein RSS benutzt), sehr schick und wird gerade neu geschrieben (es gibt ne public Beta!), fühlt sich dabei sehr durchdacht an. NNW ist ein echtes Urgestein (&lt;a href=&#34;https://en.wikipedia.org/wiki/NetNewsWire&#34;&gt;seit 2002 dabei&lt;/a&gt;) und wird immernoch/wieder aktiv weiterentwickelt. Respekt. &lt;img src=&#34;NetNewsWire.png&#34; alt=&#34;Support bis in alle Ewigkeit&#34;&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.reederapp.com/ios/&#34;&gt;Reeder&lt;/a&gt;:&lt;/strong&gt; für iOS kann das auch. Spricht ja auch nichts dagegen, dass auch noch zu unterstützem - ich finde es auf dem Telefon halt nur halbgar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opera &amp;amp; Firefox:&lt;/strong&gt; Browser können auch RSS Feeds verarbeiten. Es macht irgendwie Sinn, soetwas in den Browser einzuarbeiten, aber ich konnte mich nie damit anfreunden. Danke an &lt;a href=&#34;https://alpha.app.net/fernsehmuell&#34;&gt;Fernsehmüll&lt;/a&gt; für den &lt;a href=&#34;https://alpha.app.net/fernsehmuell/post/32906426&#34;&gt;Tipp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;noch-mehr-software&#34;&gt;Noch mehr Software&lt;/h1&gt;
&lt;p&gt;Meine Blogartikel erhaben eigentlich nie den Anspruch auf Vollständigkeit. Feedback ist natürlich sehr willkommen (wirklich, ich freue mich dann).&lt;/p&gt;
&lt;p&gt;Eine sehr viel längere Liste für RSS-Software findet ihr &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_feed_aggregators&#34;&gt;hier&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RSS Software</title>
      <link>https://schauderbasis.de/posts/rss-software/</link>
      <pubDate>Thu, 19 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/rss-software/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tldr:&lt;/strong&gt; RSS gehört für mich zu den wichtigsten Bausteinen des Internets.
Ich finde jeder sollte davon wissen.
Es gibt große Auswahl an guter Software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eine Website besteht aus zwei Teilen:
Der &lt;strong&gt;Inhalt&lt;/strong&gt; &lt;em&gt;(RSS)&lt;/em&gt; und das &lt;strong&gt;Design&lt;/strong&gt; &lt;em&gt;(CSS)&lt;/em&gt;.
Bei vielen Websiten interessiert mich nur der Inhalt und eigentlich auch nur,
wenn etwas neues dazu kommt.
Bei Blogs zum Beispiel.&lt;/p&gt;
&lt;p&gt;Ein RSS-Reader ist wie eine Websiten-Überwachungsstation,
die Websiten beobachtet,
schaut was sich verändert und mir das wichtige (den neuen Inhalt) zuliefert.
Sehr praktisch ist das zum Beispiel für&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blogs,&lt;/strong&gt; weil da selten neue Artikel auftauchen, die dann aber meist sehr interessant sind&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nachrichtenseiten,&lt;/strong&gt; weil die sich permanent ändern und man per RSS nur den Inhalt übersichtlich aufgelistet bekommt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;totgesglaubte Seiten,&lt;/strong&gt; weil man sie ohne Mehraufwand weiterverfolgen kann und ein plötzliches wiederaufleben sofort mitbekommt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Podcasts,&lt;/strong&gt; denn das sind (technisch gesehen) Audioblogs, die sich sehr ähnlich verhalten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social Networks&lt;/strong&gt; die einen Newsstream anbieten, den man oft auch per RSS abonieren kann (zB: Github, App.net, reddit)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;workflow&#34;&gt;Workflow&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ich finde eine interessante Website im Internet und aboniere sie.
Ab jetzt beobachtet mein Feedreader die Website.&lt;/li&gt;
&lt;li&gt;Ein Autor schreibt einen Artikel auf der Website.&lt;/li&gt;
&lt;li&gt;Mein Feedreader erkennt den neuen Inhalt,
befreit ihn von dem Websitedesign (so gut wie möglich) und legt ihn zum lesen bereit&lt;/li&gt;
&lt;li&gt;Ich öffne den RSS-Client auf meinem Telefon oder Rechner.
Er fragt meinen Feedreader was es neues gibt und bekommt einen Haufen neuer Artikel.&lt;/li&gt;
&lt;li&gt;Ich lese die neuen Artikel von verschiedenen Websiten, alle in einem Programm gebündelt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;feed-reader&#34;&gt;Feed Reader&lt;/h1&gt;
&lt;p&gt;Die Websiten-Überwachungsstation.&lt;/p&gt;
&lt;h3 id=&#34;früher&#34;&gt;Früher&amp;hellip;&lt;/h3&gt;
&lt;p&gt;Es gab eine Zeit, da gab es in erster Linie einen Feed Reader:
Den &lt;a href=&#34;https://www.google.com/reader/about/&#34;&gt;Google Reader&lt;/a&gt;.
Er war wirklich toll und fast jeder hat ihn benutzt.
Kaum ein Client hat etwas anderen unterstützt, wozu auch?
Doch dann hat Google den Reader eingestampft und das war ein echter Schock damals.
Keiner wusste wirklich warum und niemand wusste, was man stat dessen benutzen sollte.&lt;/p&gt;
&lt;h3 id=&#34;heute&#34;&gt;Heute&amp;hellip;&lt;/h3&gt;
&lt;p&gt;Im Nachhinein betrachtet hat es dem Ökosystem aber gut getan.
Viele neue Dienste wurden aus dem Boden gestampft oder aus der Versenkung hervorgehohlt.
Besonders auffällig waren dabei (nach meiner Zuneigung sortiert)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://tt-rss.org/&#34;&gt;tiny tiny RSS&lt;/a&gt;:&lt;/strong&gt; (kurz: ttrss)
Open Source, muss man selbst hosten, Multiuser Support, konfigurierbar, langsame aber stabile Entwicklung - benutze ich selbst und kann es nur empfehlen &lt;img src=&#34;ttrss-1.png&#34; alt=&#34;ttrss im Browser mit dem Google-Reader Theme&#34;&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://feedafever.com/&#34;&gt;Fever&lt;/a&gt;:&lt;/strong&gt;
einmal kaufen, für immer besitzen, selbst hosten, fancy Features&amp;hellip;
der Entwickler antwortet leider nicht auf Emails, also hab ichs nicht weiter getestet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://feedwrangler.net/&#34;&gt;Feed Wrangler&lt;/a&gt;:&lt;/strong&gt;
19$/Jahr, ich habe nur Gutes gehört&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://feedbin.com/&#34;&gt;Feedbin&lt;/a&gt;:&lt;/strong&gt;
30$/Jahr, sieht ganz schnuffig aus, kann aber nicht viel dazu sagen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://feedly.com/&#34;&gt;Feedly&lt;/a&gt;:&lt;/strong&gt;
freemium, sehr viele User, schlechtes Userinterface, da war ich schnell wieder weg.
Vielleicht sind sie inzwischen besser geworden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die werden inzwischen von allen gängigen Rss-Clients unterstützt,
die Ausnahme ist leider ausgerechnet ttrss.
Deswegen hat sich jemand ein &lt;a href=&#34;https://github.com/dasmurphy/tinytinyrss-fever-plugin&#34;&gt;Plugin&lt;/a&gt; ausgedacht,
dass die Fever-Api nachimplementiert.
Das funktioniert hervorragend und deswegen kann man auch als Opensourceler alle schicken Clients voll ausnutzen.
Eine gute Anleitung für das Plugin findet man zum Beispiel &lt;a href=&#34;https://blog.renem.net/2013/07/24/mr-reader-and-reeder-sprechen-mit-tt-rss/&#34;&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;clients&#34;&gt;Clients&lt;/h1&gt;
&lt;h3 id=&#34;verbingung-zur-überwachungsstation&#34;&gt;Verbingung zur Überwachungsstation&lt;/h3&gt;
&lt;p&gt;Ich lese meine Feeds zu 95% auf dem Telefon
(Es geht zur Not auch auf der Website des Feedreaders).
Da der Client das Programm ist, das ich letztlich benutzte (oft mehrmals täglich) und auf dem ich auch lange Artikel lese zahlt sich hier gut designte Software besonders aus.&lt;/p&gt;
&lt;h3 id=&#34;getestet-und-für-gut-befunden&#34;&gt;Getestet und für gut befunden&lt;/h3&gt;
&lt;p&gt;&amp;hellip;
habe ich diese drei:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.reederapp.com/ios/&#34;&gt;Reeder&lt;/a&gt;:&lt;/strong&gt;
für iOS, einfach, schick, schnell zu bedienen.
Diese App benutze ich jeden Tag am häufigsten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://jaredsinclair.com/unread/&#34;&gt;unread&lt;/a&gt;:&lt;/strong&gt;
für iOS, fancy und schick, von einem &lt;a href=&#34;https://blog.jaredsinclair.com/&#34;&gt;Hardcoredesigner&lt;/a&gt; gemacht.
Unread fühlt sich irendwie undgewöhlich an.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.reederapp.com/mac/&#34;&gt;Reeder&lt;/a&gt;:&lt;/strong&gt;
für OSX, mit der Tastatur superschnell bedienbar und angenehm &lt;img src=&#34;ReederOSX-1.png&#34; alt=&#34;extrem schick und leicht zu bedienen. Wenn nur jeder Desktop Client so wäre wie Reeder&amp;hellip;&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sie alle funktionieren mit den oben genannten Feedreadern.&lt;/p&gt;
&lt;h3 id=&#34;weitere-clients&#34;&gt;Weitere Clients&lt;/h3&gt;
&lt;p&gt;&amp;hellip; für verschiedene Betriebssysteme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://lzone.de/liferea/&#34;&gt;Liferea&lt;/a&gt;:&lt;/strong&gt;
für Linux, mit GUI. Da scheint es mir wenig gute Alternativen zu geben.
Mir gefällt das Design nur so mittel und ich habe noch nicht rausgefunden wie ich es ändern kann,
aber eigentlich tut der schon das Richtige.
&lt;img src=&#34;Liferea-1.png&#34; alt=&#34;Liferea&#34;&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=org.fox.ttrss&#34;&gt;der offizielle ttrss-Client&lt;/a&gt;&lt;/strong&gt;
für Android,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.curioustimes.de/mrreader/&#34;&gt;Mr Reader&lt;/a&gt;:&lt;/strong&gt;
fürs iPad, mit netten Themes und einer ordentlichen Website.
Ich kenne Leute die sehr zufrieden damit sind.
Sieht gut aus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://twentyfivesquares.com/press/&#34;&gt;Press&lt;/a&gt;:&lt;/strong&gt;
für Android, der Till benutzt das und ist zufrieden&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://readkitapp.com/&#34;&gt;ReadKit&lt;/a&gt;:&lt;/strong&gt;
für OSX, Client für alle möglichen Dienste (unter anderem Pocket und eben Fever), ganz nett und eigentlich auch zuverlässig, offline nur mittelmäßig, irgendwie konnte ich mich nie so richtig damit anfreunden
&lt;img src=&#34;ReadKit.png&#34; alt=&#34;Leider kann man mit ReadKit offline nichts in Pocket reinschieben.&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;fazit&#34;&gt;Fazit&lt;/h1&gt;
&lt;p&gt;Mein Leben hat sich durch RSS ernsthaft vereinfacht.
Ich bin besser informiert und muss weniger Aufwand treiben.
Wenn jemand das auch mal ausprobieren möchte und Hilfe braucht kann er/sie mich gerne anschreiben.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bildschirmhelligkeit</title>
      <link>https://schauderbasis.de/posts/bildschirmhelligkeit/</link>
      <pubDate>Thu, 05 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/bildschirmhelligkeit/</guid>
      <description>&lt;p&gt;(Alles was in diesem Eintrag steht habe ich übrigends von Jonathan Krebs, danke.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aufgabenstellung:&lt;/strong&gt; Wir wollen die Bildschirmhelligkeit einstellen und dabei nur das Terminal verwenden.&lt;/p&gt;
&lt;h2 id=&#34;einfach&#34;&gt;Einfach&lt;/h2&gt;
&lt;p&gt;Das Programm xbacklight macht alles was wir wollen. Die Helligkeit wird in Prozent gemessen. Wir können sie abfragen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ xbacklight -get
70
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Und natürlich kann man den Wert selbst festlegen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ xbacklight -set 80
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mehr will man ja meistens garnicht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nachteil:&lt;/strong&gt; Die Helligkeitsstufen sind recht grob. Außerdem ist die niedrigste Helligkeit immer noch recht hell.&lt;/p&gt;
&lt;h2 id=&#34;schwer&#34;&gt;Schwer&lt;/h2&gt;
&lt;p&gt;Es geht auch über das Filesystem:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd /sys/class/backlight/intel_backlight/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wer den Pfad nicht findet kann es mal mit &lt;code&gt;find&lt;/code&gt; versuchen. Bei mir sah das so aus:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ find -name &amp;#39;backlight&amp;#39; 2&amp;gt;/dev/null~
./var/lib/systemd/backlight
./sys/devices/pci0000:00/0000:00:02.0/backlight
./sys/class/backlight
./usr/lib/modules/3.14.2-200.fc20.x86_64/kernel/drivers/video/backlight
./usr/lib/modules/3.11.10-301.fc20.x86_64/kernel/drivers/video/backlight
./usr/lib/modules/3.13.10-200.fc20.x86_64/kernel/drivers/video/backlight
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Irgendeiner der Ordner wird schon der sein, den wir brauchen, bei mir wars das dritte Ergebnis (ausprobieren).&lt;/p&gt;
&lt;p&gt;Hier angekommen schauen wir uns um (&lt;code&gt;ls -l&lt;/code&gt;) und sehen 2 wichtige Dateien:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;max_brightness&lt;/strong&gt; Hier steht genau eine Zahl drin (bei mir 851). Die Datei ist read only, auch für den root, hier kann man also nichts machen. Da es soetwas wie &lt;em&gt;min_brightness&lt;/em&gt; nicht gibt kann man annehmen, das die Untergerenze 0 sein wird.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;brightness&lt;/strong&gt; Die Zahl die hier drin steht bestimmt die Helligkeit. Heureka! Wir können sie als superuser leicht ändern.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ su
Password: 
# echo 400 &amp;gt; brightness 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Die Helligkeit ändert sich sofot. Wunderbar.
Und wenn wir mit xbacklight die Helligkeit neu einstellen, ändert sich die Zahl. Alles macht Sinn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; Wer glaubt, er muss die brightness hier einfach auf 0 setzten sollte sich &lt;em&gt;vorher&lt;/em&gt; überlegen, ob er das wieder rückgängig machen kann wenn der Bildschirm völlig schwarz ist.&lt;/p&gt;
&lt;h1 id=&#34;verspielt&#34;&gt;Verspielt&lt;/h1&gt;
&lt;p&gt;Wir schreiben in kurzes Python Skript (sinus.py) und legen es auf dem Desktop ab.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/python
# Gibt alle 0.05 Sekunden einen Wert auf einer Sinuskurve aus.
import math
import time, sys

# max_brightness
Max=851

while True:
	s=math.sin(time.time())
	print(int((s*Max/2)+Max/2))
	sys.stdout.flush()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dann gehen wir zurück zu unseren magischen Dateien &lt;em&gt;brightness&lt;/em&gt; und &lt;em&gt;max_brightness&lt;/em&gt; und führen als superuser aus:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python /home/johannes/Desktop/sinus.py  &amp;gt; brightness 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Ergebnis&lt;/strong&gt;: Die Helligkeit oszilliert mit einer Periode von etwa 6 Sekunden (Für die Besserwisser: 2*pi). Wenn man das Programm mit &lt;code&gt;Str&lt;/code&gt;+&lt;code&gt;C&lt;/code&gt; abbricht, bleibt die Helligkeit wie sie gerade ist.&lt;/p&gt;
&lt;p&gt;Und mal ganz ehrlich: Das ist es doch was wir die ganze Zeit wollten.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Computer umziehen</title>
      <link>https://schauderbasis.de/posts/computer-umziehen-noch-todos/</link>
      <pubDate>Thu, 22 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/computer-umziehen-noch-todos/</guid>
      <description>&lt;p&gt;Jetzt sitze ich also für kurze Zeit (meine Freundin steht in den Startlöchern, um den alten abzunehmen) auf 2 Laptops und soll mein Produktivsystem umstellen.&lt;/p&gt;
&lt;h2 id=&#34;dateien&#34;&gt;Dateien&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;alles was in Home liegt (außer den Ordnern &amp;ldquo;Owncloud&amp;rdquo;, &amp;ldquo;Dropbox&amp;rdquo; und &amp;ldquo;Downloads&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Meine PGP-Keys, vor allem die Privaten Schlüssel (und das soll ordentlich passieren, nicht über Dropbox)&lt;/li&gt;
&lt;li&gt;Bilder, Musik, Filme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Noch mehr? Ich weiß nicht genau. Wie viel information liegt in den Apps?&lt;/p&gt;
&lt;h2 id=&#34;programme&#34;&gt;Programme&lt;/h2&gt;
&lt;p&gt;Wenn man das Betriebssystem wechelt wechselt man fast alle seine Programme. Schwierig schwierig&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;konversation-table&#34;&gt;Konversation Table&lt;/h3&gt;
&lt;p&gt;Um nicht völlig unvorbereitet da zu stehen haben wir (Till und ich) eine gemeinsame Tabelle angelegt, in der wir im vorhinein mal Gedanken dazu machen. Im Moment sieht sie etwa so aus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dropbox -&amp;gt; Owncloud&lt;/li&gt;
&lt;li&gt;1Password	-&amp;gt; KeepassX2&lt;/li&gt;
&lt;li&gt;Mail -&amp;gt; Geary, Thunderbird&lt;/li&gt;
&lt;li&gt;Kalendersync -&amp;gt; Owncloud&lt;/li&gt;
&lt;li&gt;Kontaktesync -&amp;gt; Owncloud&lt;/li&gt;
&lt;li&gt;Kontakte Client -&amp;gt; Gnome Contacts&lt;/li&gt;
&lt;li&gt;Browser -&amp;gt; Firefox&lt;/li&gt;
&lt;li&gt;Podcast aufnehmen -&amp;gt; ardour (Empfehlung von &lt;a href=&#34;https://www.radiotux.de/index.php?/archives/7983-RadioTux-Sendung-Maerz-2014.html&#34;&gt;hier&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Maps -&amp;gt; Irgendwas mit OpenStreetMap&lt;/li&gt;
&lt;li&gt;Appstore -&amp;gt; Paketmanager, konkret yum&lt;/li&gt;
&lt;li&gt;Dasy-Disk -&amp;gt; baobab&lt;/li&gt;
&lt;li&gt;keyword search im Safarie -&amp;gt; Instant Quick Search&lt;/li&gt;
&lt;li&gt;Marked -&amp;gt; Firefox&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;im-detail&#34;&gt;Im Detail&lt;/h3&gt;
&lt;p&gt;Für beinahe jedes Programm muss ein angemessener Ersatz gefunden werden. Besondere Schwierigkeiten ergeben sich bei:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1Password:&lt;/strong&gt; Die Alternative (unserer Wahl) heißt &lt;a href=&#34;https://www.keepassx.org/&#34;&gt;KeePassX&lt;/a&gt;. Aber die Passworte umzuziehen stellt sich als nicht trivial heraus. 1Passwort kann als CVS Datei exportieren, aber das schluckt KeePassX nicht direkt. Vielleicht muss ich noch einen Converter schreiben. (Ich hab aber keine Lust)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Marked:&lt;/strong&gt; Ich schreibe diese Artikel alle in Markdown. &lt;a href=&#34;https://marked2app.com/&#34;&gt;Marked&lt;/a&gt; zeigt eine .md Datei gerendert an, wärend ich sie in einem anderen (beliebigen) Programm bearbeite. Das funktioniert Mac-typisch sehr schick. Für Linux habe ich soetwas noch nicht gesehen. Es gibt ein Firefox Plugin, das ähnlich arbeitet, aber die Ergebnisse sind nicht halb so schön und Umlaute funktionieren nicht.
&lt;img src=&#34;Bildschirmfoto-2014-05-12-um-10-32-09-1.png&#34; alt=&#34;OSX: Marked (rechts) rendert das .md-File wunderbar. Leider gibt es Version 2 nicht im App-Store, deshalb hier Version 1.&#34;&gt;
&lt;img src=&#34;Markdown_Firefox.png&#34; alt=&#34;Linux: Firefox versucht das .mdown-File anzuzeigen. Das Encoding funktioniert offensichtlich noch nicht perfekt.&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Editor:&lt;/strong&gt; Ich schreibe demnächst nochmal was zu Editoren, hier nur so viel: Wer einen mächtigen graphischen Editor unter Linux sucht und nicht die vi-Shortcuts lernen will hat echt ein Problem.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;backup&#34;&gt;Backup&lt;/h2&gt;
&lt;p&gt;Ich habe mir noch keine Backupstrategie für Linux überlegt. Ich weiß das das nicht gut ist, aber alles braucht seine Zeit. Backup mache ich, wenn ich nur noch einen Laptop habe. Gibt es Tipps?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Schreiben</title>
      <link>https://schauderbasis.de/posts/schreiben/</link>
      <pubDate>Thu, 15 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/schreiben/</guid>
      <description>&lt;pre&gt;&lt;code&gt;Wirtschaftsprofessor : &amp;quot;Also wenn Sie einen Text erstellen wollen, dann kommen Sie an den Microsoft Office Paketen nicht vorbei.&amp;quot;

Ach so ist das.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Als wir diesen Post in einem sozialen Netzwerk sahen mussten wir alle sehr lachen: Diese Wirtschaftler in ihrer kleinen Microsoft-Welt. So süß.&lt;/p&gt;
&lt;p&gt;Aber gerade weil diese Aussage aus einem akademischen Umfeld kommt, möchte ich diese Aussage auf keinen Fall so stehen lassen. Darum hier eine (sehr kleine) Auswahl aus dem Großen Feld der Programme, mit denen man hervoragend &amp;ldquo;einen Text schreiben&amp;rdquo; kann.&lt;/p&gt;
&lt;h2 id=&#34;latex&#34;&gt;Latex&lt;/h2&gt;
&lt;p&gt;Die klare Nummer 1. Mit Latex wird im Naturwissenschaftlichen Umfeld alles geschrieben, was auch nur Halbwegs professionell wirken soll: Wissenschaftliche Arbeiten, Skripte, Handouts, Beamerfolien&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;formeln&#34;&gt;Formeln&lt;/h3&gt;
&lt;p&gt;Die größte Stärke von Latex sind eindeutig Formeln - in keinem mir bekannten Programm werden diese auch nur annährend so gut unterstützt. Nicht nur wird jedes Zeichen (&lt;a href=&#34;https://www.tex.ac.uk/tex-archive/info/symbols/comprehensive/symbols-a4.pdf&#34;&gt;und sei es auch noch so absurd&lt;/a&gt;) unterstützt, die Formeln werden auch ordentlich und sauber dargestellt. Beispiele findet man unter anderen &lt;a href=&#34;https://www.mathjax.org/demos/tex-samples/&#34;&gt;hier&lt;/a&gt;. Man ist nicht auf einen abstrusen Formeleditor angewiesen, sondern kann sie direkt auf der Tastatur tippen. Und sie sehen immer gut aus.&lt;/p&gt;
&lt;h3 id=&#34;dokumentenklassen&#34;&gt;Dokumentenklassen&lt;/h3&gt;
&lt;p&gt;Da Latex wirklich weit verbreitet ist, gibt es eine große Anzahl von Vorlagen für alle möglichen Zwecke. Beispiele findet man &lt;a href=&#34;https://www.latextemplates.com/&#34;&gt;hier&lt;/a&gt;.
Weil für Beamerfolien und Skripte die gleiche Quelle verwendet werden kann sind diese  auch wunderbar kompatibel. Man muss in erster Linie die Dokumentenklasse ändern (zum Beispiel von &lt;code&gt;article&lt;/code&gt; auf &lt;code&gt;beamer&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;trennung-von-inhalt-und-format&#34;&gt;Trennung von Inhalt und Format&lt;/h3&gt;
&lt;p&gt;Texte schreiben ist Arbeit. Es ist schwierig, braucht Konzentration und man muss viel nachdenken.&lt;/p&gt;
&lt;p&gt;Dinge auf die ich beim schreiben achten will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mein Text&lt;/li&gt;
&lt;li&gt;meine Quellen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dinge auf die ich beim schreiben &lt;em&gt;nicht&lt;/em&gt; achten will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zeilenabstände&lt;/li&gt;
&lt;li&gt;Schriftgröße&lt;/li&gt;
&lt;li&gt;Schriftart&lt;/li&gt;
&lt;li&gt;Rechtbündige, Linkbündig, Mittig, Blocksatz&lt;/li&gt;
&lt;li&gt;Worttrennung, Zeilen und Seitenumbrüche&lt;/li&gt;
&lt;li&gt;Header und Footer&lt;/li&gt;
&lt;li&gt;Textbreite und Korrekturrand&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deswegen ist in Latex der Inhalt von der Formatierung getrennt. So kann man sich auf das konzentrieren, was wichtig ist.&lt;/p&gt;
&lt;h3 id=&#34;verfügbarkeit&#34;&gt;Verfügbarkeit&lt;/h3&gt;
&lt;p&gt;Latex ist nicht nur schon recht alt sondern auch &lt;a href=&#34;https://en.wikipedia.org/wiki/Open-source_software&#34;&gt;Opensource&lt;/a&gt; und kann auf allen denkbaren Systemen installiert werden. Das schließt Windows, MacOS X, Linux, Bsd und Solaris ein, aber aber auch Mobile Systeme (Android, iOS &amp;hellip;). Wer eine Wissenschaftliche Arbeit auf seinem Tablet oder gar Telefon schreiben will sollte zwar vielleicht nochmal über das Wort &amp;ldquo;Produktivität&amp;rdquo; nachdenken, aber möglich ist es.&lt;/p&gt;
&lt;h3 id=&#34;einfach-drucken&#34;&gt;Einfach drucken&lt;/h3&gt;
&lt;p&gt;Machen sie mal einen eifachen Test: Gehen sie in einen Copy-Shop (die Läden, wo man seine Arbeiten drucken und binden lassen kann) und fragen sie nach, welche pdfs mehr Probleme machen: Die mit MS-Word erstellten oder die mit Latex.
Microsoft hält sich nicht (nur so halb) an den PDF-Standard. Latex schon. Das merkt man zum Beispiel beim drucken, wo (auch explizit Windows-kompatible) Drucker regelmäßig scheitern.
Die Open Source Gemeinde dagegen ist gut im Einhalten von Standards, denn eine wichtige &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_philosophy#McIlroy:_A_Quarter_Century_of_Unix&#34;&gt;Unix-Grundregel&lt;/a&gt; lautet: &amp;ldquo;Programme sollen gut zusammen arbeiten können.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;lernkurve&#34;&gt;Lernkurve&lt;/h3&gt;
&lt;p&gt;Die Lernkurve bei Latex ohne Frage steiler als bei anderen Programmen (das Stichwort heißt hier: &lt;a href=&#34;https://de.wikipedia.org/wiki/WYSIWYM&#34;&gt;What You See Is What You Mean&lt;/a&gt;).
&lt;img src=&#34;https://imgs.xkcd.com/comics/types_of_editors.png&#34; alt=&#34;WYSIWYM ist nicht selbstverständlich. Quelle: https://xkcd.com/1341/&#34;&gt;
(Bildquelle: &lt;a href=&#34;https://xkcd.com/1341/&#34;&gt;https://xkcd.com/1341/&lt;/a&gt;)
Wem das zu schwierig ist, der sei auf &lt;a href=&#34;https://www.lyx.org/&#34;&gt;Lyx&lt;/a&gt; verwiesen, einem Editor der vielleicht mehr den Maßstäben eines Word-Anhängers genügt, aber dennoch einwandfreien Latex-Code erzeugt. Lyx ist übrigends auch der Editor meiner Wahl (zumindest wenn es um irgendetwas geht was jemand anderes nochmal lesen soll).&lt;/p&gt;
&lt;h3 id=&#34;austesten&#34;&gt;Austesten&lt;/h3&gt;
&lt;p&gt;Wer keine Lust hat sich was zu installieren kann Latex auch einfach mal &lt;a href=&#34;https://www.sharelatex.com/&#34;&gt;im Browser testen&lt;/a&gt;, inzwischen sogar collaborativ.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;All das führt dazu, dass (natur-) wissenschaftliche Arbeiten die nicht in Latex geschrieben sind oft sehr schräg von der Seite angeschaut werden.&lt;/p&gt;
&lt;h2 id=&#34;markdown&#34;&gt;Markdown&lt;/h2&gt;
&lt;p&gt;Markdown besticht durch Einfachheit. Man sucht sich irgendeinen Editor, tippt einfach drauf los und es kommt das heraus, was man meint. (TODO:Format Überprüfen) Einfache Beispiele:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aufzählungen:&lt;/strong&gt; für einfache Aufzählunen wie diese hier&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bli&lt;/li&gt;
&lt;li&gt;bla&lt;/li&gt;
&lt;li&gt;blub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;tippt man einfach&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;* bli 
* bla 
* blub
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Überschriften:&lt;/strong&gt; Man tippt &lt;code&gt;# Kartoffelsalat&lt;/code&gt; und bekommt eine Überschrift, schön groß und so.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hyperlinks:&lt;/strong&gt;
Keine Rechtsklick und seltsame Menüs - stat dessen tippt man mitten im Text &lt;code&gt;[lalala](www.google.de)&lt;/code&gt; und bekommt &lt;a href=&#34;www.google.de&#34;&gt;lalala&lt;/a&gt;. Gerade diese Syntax für Links ist gerad drauf und dran der de fakto (TODO: Prüfen) Standard in allen möglichen Bereichen zu werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn man dann seinen Text fertig hat kann man ihn mit einem der diversen Programme dafür in Pdf, Html oder sonst ein Format umwandeln lassen. Alle Inhalte dieses Blogs sind zum Beispiel in Markdown geschrieben. Und wer Formeln mag kann sie mittels &lt;a href=&#34;https://www.mathjax.org/&#34;&gt;MathJax&lt;/a&gt; auch im Latex-Format tippen.&lt;/p&gt;
&lt;p&gt;Die Vorteile sind bestechend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lernkurve: Flach, sehr flach. Eigentlich hat jeder schon mal eine Liste mit &lt;a href=&#34;https://en.wikipedia.org/wiki/Asterisk&#34;&gt;Asterisken&lt;/a&gt; (so heißten diese kleinen Sterne: * ) markiert.&lt;/li&gt;
&lt;li&gt;Schreibgeschwindigkeit: kein herumgeklicke und gesuche in komplizierten Menüs - man muss die Hände nicht von der Tastatur nehmen&lt;/li&gt;
&lt;li&gt;Vielfalt: Markdown kann in ziemlich jedes Format konvertieren&lt;/li&gt;
&lt;li&gt;Verbreitung: Es gibt eine Vielzahl von Editoren, die sich besonders gut für Markdown eignen (mit live-Vorschau, Formatierungshilfe ect). Ich empfehle hier mal &lt;a href=&#34;https://pad.haroopress.com/user.html&#34;&gt;Haroopad&lt;/a&gt;, der ist open Source und für alle Desktop-Betriebsysteme&lt;/li&gt;
&lt;li&gt;Mobil: Wegen der großen Einfachheit macht Markdown übrigends auch für Tablets und Telefone Sinn, passende Apps gibt es wie Sand am Meer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;libre-office--open-office&#34;&gt;Libre Office / Open Office&lt;/h2&gt;
&lt;p&gt;Ok, ich gebs zu: Latex und Markdown sind eigentlich keine Programme sondern Standards (sogenannte &lt;a href=&#34;https://de.wikipedia.org/wiki/Auszeichnungssprache&#34;&gt;Markaup languages&lt;/a&gt;), die in allen Möglichen Editoren geschrieben werden können.
Wer sich aber gar nicht vom Konzept der Officepakete losreißen kann sei auf Libre Office und Open Office verwiesen. Mit jedem dieser Pakete (die miteinander nur wenig zu tun haben) bekommt man einen Ersatz für Word, Excel und Powerpoint (Für den Mac gibts dann noch iWork). Der benutzte OpenDocument Standard ist teilweise auch kompatibel mit den Formaten die Microsoft verwendet.
Ich benutze sie selbst nicht aber ausprobieren kostet ja nichts. Hier sind die Links: (Libre Office)[https://de.libreoffice.org/] &amp;amp; (Open Office)[https://www.openoffice.org/de/]&lt;/p&gt;
&lt;h2 id=&#34;irgendein-editor&#34;&gt;irgendein Editor&lt;/h2&gt;
&lt;p&gt;Dir gefallen die alle nicht? Dann nimm doch einfach &lt;em&gt;irgendeinen Editor&lt;/em&gt;. Es gibt ja wahrhaftig genug. George R. R. Martin, der Autor der Vorlage der Serie &amp;ldquo;Game of Thrones&amp;rdquo; schreibt &lt;a href=&#34;https://www.youtube.com/watch?v=X5REM-3nWHg&#34;&gt;nach eigener Aussage&lt;/a&gt; zum Beispiel in &lt;a href=&#34;https://de.wikipedia.org/wiki/Wordstar&#34;&gt;WordStar 4.0&lt;/a&gt;, einem Editor von 1987.
Wer auf viele Features steht kann sich ja mal mit &lt;a href=&#34;https://de.wikipedia.org/wiki/Vi&#34;&gt;vi&lt;/a&gt;, &lt;a href=&#34;https://de.wikipedia.org/wiki/Vim&#34;&gt;vim&lt;/a&gt; und &lt;a href=&#34;https://de.wikipedia.org/wiki/Emacs&#34;&gt;emacs&lt;/a&gt; beschäftigen.&lt;/p&gt;
&lt;h2 id=&#34;und-warum-nicht-einfach-microsoft-office&#34;&gt;Und warum nicht einfach Microsoft Office?&lt;/h2&gt;
&lt;p&gt;Die vorgestellten Programme haben alle (bis auf WordStar) eine Gemeinsamkeit: Sie sind Open Source und basieren auf freien und offenen Standards. Das ist bei MSOffice nicht der Fall. Das hat mehrere wichtige Folgen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cross Platform:&lt;/strong&gt; (TODO:Rechtschreibung) Man kann sie auf jeder Platform (Windows, MacOS X, Linux&amp;hellip;) verwenden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kostenlos:&lt;/strong&gt; Man kann sie einfach runterladen und ausprobieren. Keine Lizenzkeys, keine Trialversionen. Man bekommt das volle Paket, einfach so. Eine Private Lizenz von Office (für genau 1 Computer) &lt;a href=&#34;https://office.microsoft.com/de-de/microsoft-office-2013-suiten-und-office-365-abonnements-kaufen-FX102886268.aspx&#34;&gt;kostet zur Zeit 70€&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frei:&lt;/strong&gt; Wissen muss frei sein, deswegen haben wir unabhängige Schulen und Universitäten. Für mich macht es Sinn dieses Wissen auch so abzulegen, dass es frei verfügbar ist - auch wenn man seine Soft- und Hardware nicht von Firmen aus den USA lizensieren lassen möchte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich finde dass sich die Aussage, man käme um die Microsoft Office Pakete nicht herum, nicht halten lässt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Laptop kaufen</title>
      <link>https://schauderbasis.de/posts/laptop-kaufen/</link>
      <pubDate>Sat, 10 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/laptop-kaufen/</guid>
      <description>&lt;h2 id=&#34;warum&#34;&gt;Warum?&lt;/h2&gt;
&lt;p&gt;Für mein Linux Projekt wollte ich einen neuen Computer. Mein treuer Begleiter bisher war ein 13 Zoll MacBook Pro (Early 2011). Der ist auch noch gut, für den Wechsel gab es aber mehrere Gründe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ich habe schon einmal (2010) Linux (Ubuntu 10.10) auf einem MacBook laufen gehabt. Es war die Katastrophe: Laut, schlechte Hardwareunterstützung und die Batterie hielt nur noch 2 Stunden. So etwas wäre also schade um die Hardware, die mit OSX noch hervoragend läuft.&lt;/li&gt;
&lt;li&gt;Meine Freundin braucht einen neuen Computer und möchte von Windows auf OSX umsteigen (dazu vielleicht ein andermal mehr). Das MacBook wird also weitergenutzt und ich spare mir das umständliche weiterverkaufen.&lt;/li&gt;
&lt;li&gt;Ein MacBook kann man quasi nicht upgraden. Ich möchte gerne einen Computer, bei dem das möglich ist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;wie-man-einen-laptop-auswählt&#34;&gt;Wie man einen Laptop auswählt&lt;/h2&gt;
&lt;p&gt;Ich habe &lt;a href=&#34;www.tillmail.de&#34;&gt;Till&lt;/a&gt; gefragt und er hat mit mir einen ausgesucht. Till kann so etwas sehr gut und ich beschreibe kurz den Vorgang:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Man überlegt sich &lt;em&gt;vorher&lt;/em&gt; worauf man Wert legt. In meinem Fall war das:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;möglichst viele Teile sollen austauschbar sein (Akku, Speicher, Festplatten, SSDs ect)&lt;/li&gt;
&lt;li&gt;Gewicht (ich bin viel unterwegs und nehme meinen Computer quasi immer mit)&lt;/li&gt;
&lt;li&gt;Bildschirm (ordentliche Auflößung, matt)&lt;/li&gt;
&lt;li&gt;13 Zoll hat sich in der Uni bewärt. Damit passt man auf jeden Tisch und die Bildschirm ist groß genug zum ordentlich arbeiten&lt;/li&gt;
&lt;li&gt;Weniger als 8 GB Ram sind 2014 lächerlich&lt;/li&gt;
&lt;li&gt;Wie viel will ich ausgeben?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Man sucht die Website &lt;a href=&#34;https://geizhals.at/?cat=nb&#34;&gt;Geizhalz&lt;/a&gt; auf. Dort hat man eine große Auswahl an Hardware und ein erstaunlich gut funktionierendes Filtersystem, mit dem man seine Wahl von 1. sehr genau einstellen kann.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Man betrachtet die übrig gebliebenen Geräte und trägt mögliche Kandidaten in eine Liste ein. Bei zu wenig Auswahl lockert man den Filter ein wenig, aber nicht zu sehr. Wenn man im Vorhinein schon Kandidaren hat kommen die auch auf die Liste.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Die Liste wird zur Tabelle erweitert. Technische Details werden von den offizillen Seiten zusammengsucht, Besonderheiten aufgeschrieben. Unterpunkte sind zum Beispiel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vorteile&lt;/li&gt;
&lt;li&gt;Nachteile&lt;/li&gt;
&lt;li&gt;Preis&lt;/li&gt;
&lt;li&gt;Auflösung&lt;/li&gt;
&lt;li&gt;Prozessor&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jetzt wird es schwierig. Bei mir blieben 3 Modelle zur Auswahl, bei anderen vielleicht mehr. Wir haben Testberichte gelesen und diskutiert. Welches Gerät passt am besten, welche Nachteile wiegen am schwersten? Wo bin ich am ehesten bereit für Abstriche? Hier ist es wirklich gut eine zweite Person dabei zu haben - besonders wenn sie einen kennt und technische Expertise hat.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Und zum Schluss schläft man eine Nacht drüber und bestellt ihn. So einfach ist das.&lt;/p&gt;
&lt;h2 id=&#34;noch-ein-paar-anmerkungen&#34;&gt;Noch ein paar Anmerkungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Die vorgestellte Methode hat mir sehr geholfen aus der unüberschaubaren Flut von angeboten eine Wahl zu treffen, mit der ich zufrieden bin. Ich empfehle sie hiermit weiter.&lt;/li&gt;
&lt;li&gt;Es hilft, im Elektronikmarkt auch mal ein paar Geräte angeschaut zu haben.&lt;/li&gt;
&lt;li&gt;Als Student bekommmt man Rabatte, als Berufstätiger kann man das Gerät eventuell absetzen.&lt;/li&gt;
&lt;li&gt;Die Rechnungen hebt man in jedem Fall gut auf.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Eine Distribution auswählen</title>
      <link>https://schauderbasis.de/posts/eine-distribution-auswahlen/</link>
      <pubDate>Thu, 08 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/eine-distribution-auswahlen/</guid>
      <description>&lt;p&gt;Also Linux, na toll. Und da gibt es ja auch nur unendlich viele davon (Statistiken gibts auf &lt;a href=&#34;https://distrowatch.com&#34;&gt;Distro Watch&lt;/a&gt;). Natürlich kann man auch im Nachhinein wechseln, aber es wäre ja schon gut, wenn man was hätte, wo man sich wohl fühlt. Wie also auswählen?&lt;/p&gt;
&lt;h2 id=&#34;meine-kriterien&#34;&gt;Meine Kriterien&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;modern:&lt;/strong&gt; wenn es neues Zeug und coole Erfindungen gibt, will ich davon profitieren&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;stabil:&lt;/strong&gt; so modern nun auch wieder nicht, dass ständig alles abstürzt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;einsteigerfreundlich:&lt;/strong&gt; ein System, das man auch als angagierter Anfänger meistern kann, eine Anlaufstelle für meine großen Haufen von Fragen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lebendig:&lt;/strong&gt; ein System das beständig weiterentwickelt wird, mit Sicherheitsupdates, neuste Versionen und Kompatibilität für alles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mehr oder weniger nimmt so ziemlich jede Distribution für sich in Anspruch, das alles zu erfüllen. Ein guter Startpunkt für die Recherche ist vielleicht &lt;a href=&#34;https://distrowatch.com/dwres.php?resource=major&#34;&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Auf &lt;a href=&#34;https://blog.tillmail.de/&#34;&gt;Tills&lt;/a&gt; Vorschlag hin haben wir uns erstmal für Fedora entschieden.&lt;/p&gt;
&lt;h2 id=&#34;warum-ausgerechnet-fedora&#34;&gt;Warum ausgerechnet Fedora?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fedora ist das Testvehikel von &lt;a href=&#34;https://de.redhat.com/fedora/&#34;&gt;Red Hat Enterprise Linux&lt;/a&gt;. Deswegen gibts da immer den heißen Scheiß der vielleicht auch mal in Red Hat reinkommt. (+)&lt;/li&gt;
&lt;li&gt;Das bedeutet für mich auch, dass die Entwicklung nicht morgen eingestellt wird, weil es an Geld mangelt. (+)&lt;/li&gt;
&lt;li&gt;Außerdem ist die Führung der Distribution an eine unabhängige Institution abgegeben worden, die sind also nicht morgen &lt;em&gt;evil&lt;/em&gt; und bauen jede Menge Backdoors und Werbung ein. (+)&lt;/li&gt;
&lt;li&gt;Fedora ist eine von den größeren Distributionen, die von vielen Leuten (sogut man das halt feststellen kann) als Desktopumgebung benutzt wird. Da gibt es also eine Community. (+)&lt;/li&gt;
&lt;li&gt;Bei einem ersten Reinschnuppern macht alles eine ganz gute Figur. Besonders fällt auf, das OwnCloud out of the Box unterstützt wird. Cool! (+)&lt;/li&gt;
&lt;li&gt;Der Updatezyklus ist 6 Monate. Der Support für eine Version dauert 12 Monate, man kann also (nur) eine Version gefahrlos überspringen. Klingt fair. (+-)&lt;/li&gt;
&lt;li&gt;Red Hat ist eine Distribution für Unternehmen. Entsprechend ist Fedora nicht in erster Linie als Desktopumgebung entworfen worden. Wir werden sehen, wie sich das auswirkt. (-)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Insgesammt klingt das recht vielversprechend. Mal sehen wie sich die Punkte bewahrheiten werden&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Marinieren</title>
      <link>https://schauderbasis.de/posts/marinieren/</link>
      <pubDate>Fri, 02 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/marinieren/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; Seit ich das Fleisch vor dem anbraten noch mariniere hat sich meine Lebensqualität erhöht.&lt;/p&gt;
&lt;p&gt;Ich wollte nur darauf hinweißen, dass mariniertes Fleisch nochmal so gut schmeckt. (Marinieren heißt quasi &amp;ldquo;in würzige Sauce einlegen&amp;rdquo;. Ich kannte es nicht bevors meine Freundin mir gezeigt hat, drum erwähne ichs lieber noch mal.)&lt;/p&gt;
&lt;h2 id=&#34;rezept&#34;&gt;Rezept&lt;/h2&gt;
&lt;p&gt;Ich hab keines genaues, darum gings hier eigentlich auch nicht.
Ich nehme&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ein paar Asiatische Soßen&lt;/li&gt;
&lt;li&gt;Senf&lt;/li&gt;
&lt;li&gt;Essig&lt;/li&gt;
&lt;li&gt;Peffer+Salz&lt;/li&gt;
&lt;li&gt;eine geschnittene Chillishote (wenn mans scharf mag)&lt;/li&gt;
&lt;li&gt;einen kleinen Schluck Wasser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip;in &lt;em&gt;irgendeinem&lt;/em&gt; Verhältnis. Einmal umrühren bis sich alles gelößt hat, das Fleisch dazu und ab in den Kühlschrank.&lt;/p&gt;
&lt;p&gt;Im Internet stehen auch noch tollere Rezepte.&lt;/p&gt;
&lt;h2 id=&#34;einfache-grungregeln&#34;&gt;Einfache Grungregeln&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Zwischen Einlegen und Zubereiten sollte Zeit vergehen, damit der Geschmack auch einziehen kann. 30 min - 6 Stunden&lt;/li&gt;
&lt;li&gt;Man braucht weniger Marinade als man denkt&lt;/li&gt;
&lt;li&gt;Wenn man zuviel gemacht hat kann man den Rest immernoch super zum anbraten benutzen und bekommt noch viel guten Geschmack heraus.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;aufwandseinschätzung&#34;&gt;Aufwandseinschätzung&lt;/h2&gt;
&lt;p&gt;Extrem niedrig. Die Marinade macht man in 2 Minuten. Man muss nur dran denken es ein paar Stunden vor dem Kochen zu machen.&lt;/p&gt;
&lt;h2 id=&#34;tipp-zum-schluss&#34;&gt;Tipp zum Schluss&lt;/h2&gt;
&lt;p&gt;Nicht nur Fleisch eingelegt werden, da geht noch mehr:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zwiebeln&lt;/li&gt;
&lt;li&gt;Tofu&lt;/li&gt;
&lt;li&gt;Nudeln&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Webserver</title>
      <link>https://schauderbasis.de/posts/webserver/</link>
      <pubDate>Sun, 27 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/webserver/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Langfristiges Ziel:&lt;/strong&gt;
So viel wie möglich Infrastruktur auf dem eigenen Server hosten. Dazu sollen gehören&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eigene Website mit Blog&lt;/li&gt;
&lt;li&gt;RSS und ein Späterlesen-Dienst&lt;/li&gt;
&lt;li&gt;Mail&lt;/li&gt;
&lt;li&gt;Kalender und Adressbuch&lt;/li&gt;
&lt;li&gt;Cloudstorage&lt;/li&gt;
&lt;li&gt;Chatten (Jabber?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Grundidee:&lt;/strong&gt; Webspace anmieten. Das ist vorerst sinnvoller als in Hardware zu inverstieren und sehr viel billiger.&lt;/p&gt;
&lt;h2 id=&#34;gehostete-websiten&#34;&gt;Gehostete Websiten&lt;/h2&gt;
&lt;p&gt;Ich habe mir mal bei &lt;a href=&#34;https://www.netcup.de/bestellen/produkt.php?produkt=354&#34;&gt;Netcup&lt;/a&gt; eine gehostete Website gemietet. Die Kosten sind minimal&lt;!-- raw HTML omitted --&gt;[&lt;!-- raw HTML omitted --&gt;1&lt;!-- raw HTML omitted --&gt;]&lt;!-- raw HTML omitted --&gt;, der Funktionsumfang aber auch. Es ist &lt;a href=&#34;https://www.schauderbasis.de&#34;&gt;eine Domain&lt;/a&gt; dabei, ich darf  meine Mailadresse da haben und MySQL-Datenbanken anlegen. Es reicht also für ein Wordpress Blog.&lt;/p&gt;
&lt;p&gt;Für mehr aber auch nicht. Recht schnell kommt man an die Grenzen seines Vertrages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kein Comandline Accses zum Server hinter dem ganzen&lt;/li&gt;
&lt;li&gt;Mehrere MySQL Datenbanken, aber nur ein Passwort für alle&lt;/li&gt;
&lt;li&gt;Confixx ist vom ersten Moment an unsympathisch und stinkt&lt;/li&gt;
&lt;li&gt;Es kann fast nur Software installiert werden, die von Netcup auch vorgesehen ist.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Im Verlauf des Jahres werde ich also einen richtigen Webserver brauchen, der mir diese Probleme hoffentlich vom Hals schafft. Eventuell ist es sinnvoll, das mit Freunden zusammen zu tun, denn die Preis-Leistungskurve wächst in diesen Preisklassen scheinbar exponentiell&lt;!-- raw HTML omitted --&gt;[&lt;!-- raw HTML omitted --&gt;2&lt;!-- raw HTML omitted --&gt;]&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;Einiges habe ich aber schon gelernt, das meiste von Till. Seine Ausführungen liegen glücklicherweise in &lt;a href=&#34;https://tillmail.de/echokammer/wordpress/?p=437&#34;&gt;diesem Podcast&lt;/a&gt; (ab 1:26:50) vor und haben mich mehrmals sehr weitergebracht (Hörempfehlung). Außerdem ist ein Passwortmanager nützlich, sonst dreht man durch.&lt;/p&gt;
&lt;p&gt;Bilanz: An dieser Stelle muss ich später weiterforschen. Für die hohen Ziele habe ich zu kurz gegriffen. Die Erfahrung war es aber wert, man lernt sehr viel über Websiten.&lt;/p&gt;
&lt;h2 id=&#34;dropbox&#34;&gt;Dropbox&lt;/h2&gt;
&lt;p&gt;Dropbox hat sich in den letzten Jahren als sehr zuverlässig erwiesen. Daten gehen eigentlich nie verloren und das Syncing ist schnell, bequem und problemlos. Aber langsam verlieren sie (bei mir) ihr makelloses Image:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;es gibt keine Kontrolle über die Daten
&lt;ul&gt;
&lt;li&gt;ich weiß nicht ob sie verschlüsselt werden&lt;/li&gt;
&lt;li&gt;Dropbox könnte mir Dateien unterschieben&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.threatagent.com/2013/09/three-reasons-why-dropbox-previews-are.html&#34;&gt;die Dateien werden geöffnet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dropbox schluckt gute Dienste
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.mailboxapp.com/blog/#/posts/45426605131&#34;&gt;Mailbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://readmill.com/epilogue&#34;&gt;Readmill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.loom.com/loom-is-joining-dropbox-2/&#34;&gt;Loom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Condoleezza Rice wird plötzlich &lt;a href=&#34;https://www.theguardian.com/technology/2014/apr/11/dropbox-condoleezza-rice-privacy-surveillance&#34;&gt;in den Vorstand einberufen&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&amp;hellip; das ist die mit dem &lt;a href=&#34;https://de.wikipedia.org/wiki/Waterboarding&#34;&gt;Waterbording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Dropbox Idee ist genial, aber die Firma wird mir langsam unheimlich. Je schneller ich da weg komme desto besser.&lt;/p&gt;
&lt;h2 id=&#34;owncloud&#34;&gt;OwnCloud&lt;/h2&gt;
&lt;p&gt;OwnCloud ist wie eine Kombination aus iCloud und Dropbox in Open Source. Man kann sie selbst hosten oder irgendwo anmieten und sie synct so ziemlich alles zwischen allen Geräten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dateien&lt;/li&gt;
&lt;li&gt;Kalender&lt;/li&gt;
&lt;li&gt;Kontakte&lt;/li&gt;
&lt;li&gt;To-Do-Listen&lt;/li&gt;
&lt;li&gt;Musik&lt;/li&gt;
&lt;li&gt;Photos&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alles kann verschlüsselt abgelegt, gesynct und geshared werden, bei Bedarf auch passwortgeschützt geshared. Es gibt ein Webinterface und wenn man einzelne Funktionen nicht mag, kann man das Modul einfach rauswerfen. Außerdem wird OwnCloud von vielen Linuxen nativ unterstützt. Klingt ja alles sehr vielversprechend&lt;!-- raw HTML omitted --&gt;[&lt;!-- raw HTML omitted --&gt;3&lt;!-- raw HTML omitted --&gt;]&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;Bildschirmfoto-2014-04-27-um-11-59-53.png&#34; alt=&#34;Webinterface unserer Owncloud&#34;&gt;&lt;/p&gt;
&lt;p&gt;Till hat auf dem Server, auf dem auch &lt;a href=&#34;https://tillmail.de/echokammer/wordpress/&#34;&gt;unsere Podcasts&lt;/a&gt; liegen eine OwnCloud installiert, die wir Drei von der Echokammer (und inzwischen auch ein paar andere) benutzen. Es ist schon der zweite Versuch, beim ersten Mal ging irgendetwas kaputt und wir haben abgebrochen. Aber OwnCloud wird permanent weiterentwickelt und im Moment sieht es gut aus.&lt;/p&gt;
&lt;h1 id=&#34;ausblick&#34;&gt;Ausblick&lt;/h1&gt;
&lt;p&gt;Wir trauen OwnCloud noch nicht wirklich und haben von allem irgendwo ein Backup - aber sie läuft jetzt schon längere Zeit (3 Monate) sehr gut und ist ein großer Schritt in die richtige Richtung.
Später noch mehr dazu.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;1. 17,91€ für 12 Monate. Till hatte noch einen 5€ Gutschein für mich. Insgesamt viel billiger als ich dachte. &lt;!-- raw HTML omitted --&gt;↩&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;2. Das ist gut wenn man viel mietet (und sehr gut wenn man noch mehr mietet). &lt;!-- raw HTML omitted --&gt;↩&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;3. Wer möchte kann sich auch mal &lt;a href=&#34;https://seafile.com/en/home/&#34;&gt;Seafile&lt;/a&gt; anschauen.&lt;!-- raw HTML omitted --&gt;↩&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Woher und wohin</title>
      <link>https://schauderbasis.de/posts/woher-und-wohin/</link>
      <pubDate>Sat, 26 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/woher-und-wohin/</guid>
      <description>&lt;h1 id=&#34;von-apple&#34;&gt;Von Apple&amp;hellip;&lt;/h1&gt;
&lt;p&gt;Ich bin Mathematikstudent. Seit 2011 benutze ich ein MacbookPro und seit 2012 ein iPhone 4S, ich bin gut eingelebt in der Applewelt. Es gibt vieles, was sehr einfach funktioniert, wenn man nur Appleprodukte verwendet. In den letzten Jahren habe ich mir keine Gedanken machen müssen über:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treiber&lt;/li&gt;
&lt;li&gt;Festplattendefragmentierung&lt;/li&gt;
&lt;li&gt;wo man Sachen einstellt&lt;/li&gt;
&lt;li&gt;das Innere meines Computers&lt;/li&gt;
&lt;li&gt;Viren&lt;/li&gt;
&lt;li&gt;wie man etwas mit der Konsole macht (außer ich wollte es)&lt;/li&gt;
&lt;li&gt;Kompatibilität&lt;/li&gt;
&lt;li&gt;woher ich Software bekomme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Einen Teil davon, vielleicht sogar alles, werde ich in der nächsten Zeit aufgeben müssen und ich habe schon ein wenig Angst.&lt;/p&gt;
&lt;h1 id=&#34;-zu-linux&#34;&gt;&amp;hellip; zu Linux&lt;/h1&gt;
&lt;p&gt;Es wird schwierig, unbequem und ein Haufen Arbeit. Manches/vieles/alles wird komplizierter werden und nicht so gut funktionieren wie davor - zumindest in der ersten Zeit.&lt;/p&gt;
&lt;p&gt;Ich bin bereit, mich da reinzuhängen, aber nicht uneingeschränkt. Wenn sich alles als zu schwierig herausstellen sollte werde ich zurückrudern. Wenn Sachen nicht funktionieren, muss ich auf meine alten Systeme zurückgreifen.&lt;/p&gt;
&lt;p&gt;Im Idealfall bekomme ich ein mächtiges und schnelles System mit genau dem, was ich für nötig halte und mit großer Kontrolle über die einzelnen Komponenten. Im schlimmsten Fall muss ich das gesamte Projekt als Fehlschlag verzeichnen und kehre zurück zu alten Gewohnheiten.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Auf zu sicheren Ufern</title>
      <link>https://schauderbasis.de/posts/auf-zu-sicheren-ufern/</link>
      <pubDate>Fri, 25 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/posts/auf-zu-sicheren-ufern/</guid>
      <description>&lt;p&gt;Es wird Zeit, proprietärer Software den Rücken zuzukehren. Endlich. Die Gründe dafür sind einfach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sicherheit:&lt;/strong&gt; Seit den Snowdenleaks (spätestens) sollte klar sein, warum man Software nicht mehr trauen kann, deren Quellcode man nicht sehen darf. Zeit, ein bisschen Courage zu zeigen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux:&lt;/strong&gt; Das Linux Universum hat durchaus seine Reize. Paketmanagment, Freaksoftware und irgendwie waren die coolen Leute auch schon immer irgendwie bei Linux.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proof of Concept:&lt;/strong&gt; Ich bin jung, halbwegs intelligent und beschäftige mich gerne mit Computern. Wenn ich das nicht schaffe, ist Linux für den Otto-Normaluser wohl noch nicht reif.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Welche Bereiche meines digitalen Lebens betrifft das nun? Wie sich herausstellt, beinahe alle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webdienste:&lt;/strong&gt; Google, Dropbox, iCloud, Facebook…&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kommunikation:&lt;/strong&gt; Verschlüsseln. Und selber hosten. Und ganz viel verschlüsseln.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handy:&lt;/strong&gt; kein iPhone mehr, alles wird anders&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desktop-PC:&lt;/strong&gt; Linux. Beinahe alle Workflows, die ich bisher benutzt habe werden neu überdacht werden müssen…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das kann man natürlich nicht alles auf einmal lösen. Aber vielleicht Schritt für Schritt. Und darum soll es hier gehen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Impressum &amp; Disclaimer</title>
      <link>https://schauderbasis.de/impressum/</link>
      <pubDate>Fri, 11 Apr 2014 14:07:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/impressum/</guid>
      <description>&lt;p&gt;Johannes Lippmann
Lotzestraße 5
90443 Nürberg
Telefon: 015115288589
E-Mail: &lt;a href=&#34;mailto:johannes.lippmann@schauderbasis.de&#34;&gt;johannes.lippmann@schauderbasis.de&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verantwortlich für den Inhalt&lt;/strong&gt; (gem. § 55 Abs. 2 RStV):&lt;/p&gt;
&lt;p&gt;Johannes Lippmann
Lotzestraße 5
90443 Nürberg
Deutschland&lt;/p&gt;
&lt;h2 id=&#34;quellenangaben-für-die-verwendeten-bilder-und-grafiken&#34;&gt;Quellenangaben für die verwendeten Bilder und Grafiken:&lt;/h2&gt;
&lt;p&gt;Titelbild  von &lt;a href=&#34;https://www.flickr.com/photos/dolmansaxlil/&#34;&gt;Sharon Drummond&lt;/a&gt; gefunden auf &lt;a href=&#34;https://www.flickr.com/photos/dolmansaxlil/6623785211/in/photolist-b6jCzi-aoHyNx-7pug4m-6fhCZU-4FZ6BA-7ce2wa-fAoSrZ-6fhbxZ-bkpu9V-7ViK4u-vx2pZ-6H3kZJ-mksK93-8vUXut-pXeJJC-7hJQY8-n3NgK8-3yUhPb-8kdFKP-mWwTL-zTkaw-ofkQA8-mEf3J4-862X2t-p4Wxy-fAE3EL-f3PirR-8qfQkN-ziYi9-pjmeu6-6LURX-2Xa2E-3MpRde-6xW1Vx-qtGbca-5xir7R-btC1Ko-dYw4Mn-5Jowug-ds3fm5-4AWqMz-58YakC-oVJWd5-oWSJq3-5JowJa-77LKan-hCKP8c-7QU6Wr-6C4ptY-5CuHBc&#34;&gt;flickr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;##Disclaimer – rechtliche Hinweise&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;§ 1 Haftungsbeschränkung&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die Inhalte dieser Website werden mit größtmöglicher Sorgfalt erstellt. Der
Anbieter übernimmt jedoch keine Gewähr für die Richtigkeit, Vollständigkeit
und Aktualität der bereitgestellten Inhalte. Die Nutzung der Inhalte der
Website erfolgt auf eigene Gefahr des Nutzers. Namentlich gekennzeichnete
Beiträge geben die Meinung des jeweiligen Autors und nicht immer die Meinung
des Anbieters wieder. Mit der reinen Nutzung der Website des Anbieters kommt
keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;§ 2 Externe Links&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Diese Website enthält Verknüpfungen zu Websites Dritter (&amp;ldquo;externe Links&amp;rdquo;).
Diese Websites unterliegen der Haftung der jeweiligen Betreiber. Der
Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden
Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem
Zeitpunkt waren keine Rechtsverstöße ersichtlich. Der Anbieter hat keinerlei
Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der
verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich
der Anbieter die hinter dem Verweis oder Link liegenden Inhalte zu Eigen
macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne
konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von
Rechtsverstößen werden jedoch derartige externe Links unverzüglich gelöscht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;§ 3 Urheber- und Leistungsschutzrechte&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die auf dieser Website veröffentlichten Inhalte unterliegen dem deutschen
Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und
Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen
schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies
gilt insbesondere für Vervielfältigung, Bearbeitung, Übersetzung,
Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken
oder anderen elektronischen Medien und Systemen. Inhalte und Rechte Dritter
sind dabei als solche gekennzeichnet. Die unerlaubte Vervielfältigung oder
Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und
strafbar. Lediglich die Herstellung von Kopien und Downloads für den
persönlichen, privaten und nicht kommerziellen Gebrauch ist erlaubt.&lt;/p&gt;
&lt;p&gt;Die Darstellung dieser Website in fremden Frames ist nur mit schriftlicher
Erlaubnis zulässig.&lt;/p&gt;
&lt;p&gt;§ 4 Besondere Nutzungsbedingungen&lt;/p&gt;
&lt;p&gt;Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den
vorgenannten Paragraphen abweichen, wird an entsprechender Stelle
ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen
Einzelfall die besonderen Nutzungsbedingungen.
Quelle: &lt;a href=&#34;https://www.experten-branchenbuch.de/&#34;&gt;Anwälte vor Ort&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;##Datenschutzerklärung:
&lt;strong&gt;Datenschutz&lt;/strong&gt;
Nachfolgend möchten wir Sie über unsere Datenschutzerklärung informieren. Sie finden hier Informationen über die Erhebung und Verwendung persönlicher Daten bei der Nutzung unserer Webseite. Wir beachten dabei das für Deutschland geltende Datenschutzrecht. Sie können diese Erklärung jederzeit auf unserer Webseite abrufen.&lt;/p&gt;
&lt;p&gt;Wir weisen ausdrücklich darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen und nicht lückenlos vor dem Zugriff durch Dritte geschützt werden kann.&lt;/p&gt;
&lt;p&gt;Die Verwendung der Kontaktdaten unseres Impressums zur gewerblichen Werbung ist ausdrücklich nicht erwünscht, es sei denn wir hatten zuvor unsere schriftliche Einwilligung erteilt oder es besteht bereits eine Geschäftsbeziehung. Der Anbieter und alle auf dieser Website genannten Personen widersprechen hiermit jeder kommerziellen Verwendung und Weitergabe ihrer Daten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Personenbezogene Daten&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sie können unsere Webseite ohne Angabe personenbezogener Daten besuchen. Soweit auf unseren Seiten personenbezogene Daten (wie Name, Anschrift oder E-Mail Adresse) erhoben werden, erfolgt dies, soweit möglich, auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben. Sofern zwischen Ihnen und uns ein Vertragsverhältnis begründet, inhaltlich ausgestaltet oder geändert werden soll oder Sie an uns eine Anfrage stellen, erheben und verwenden wir personenbezogene Daten von Ihnen, soweit dies zu diesen Zwecken erforderlich ist (Bestandsdaten). Wir erheben, verarbeiten und nutzen personenbezogene Daten soweit dies erforderlich ist, um Ihnen die Inanspruchnahme des Webangebots zu ermöglichen (Nutzungsdaten). Sämtliche personenbezogenen Daten werden nur solange gespeichert wie dies für den geannten Zweck (Bearbeitung Ihrer Anfrage oder Abwicklung eines Vertrags) erforderlich ist. Hierbei werden steuer- und handelsrechtliche Aufbewahrungsfristen berücksichtigt. Auf Anordnung der zuständigen Stellen dürfen wir im Einzelfall Auskunft über diese Daten (Bestandsdaten) erteilen, soweit dies für Zwecke der Strafverfolgung, zur Gefahrenabwehr, zur Erfüllung der gesetzlichen Aufgaben der Verfassungsschutzbehörden oder des Militärischen Abschirmdienstes oder zur Durchsetzung der Rechte am geistigen Eigentum erforderlich ist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kommentarfunktionen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Im Rahmen der Kommentarfunktion erheben wir personenbezogene Daten (z.B. Name, E-Mail) im Rahmen Ihrer Kommentierung zu einem Beitrag nur in dem Umfang wie Sie ihn uns mitgeteilt haben. Bei der Veröffentlichung eines Kommentars wird die von Ihnen angegebene Email-Adresse gespeichert, aber nicht veröffentlicht. Ihr Name wird veröffentlich, wenn Sie nicht unter Pseudonym geschrieben haben.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datenschutzerklärung für das Facebook-Plugin („Gefällt mir“)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Diese Webseite nutzt Plugins des Anbieters Facebook.com, welche durch das Unternehmen Facebook Inc., 1601 S. California Avenue, Palo Alto, CA 94304 in den USA bereitgestellt werden. Nutzer unserer Webseite, auf der das Facebook-Plugin („Gefällt mir“-Button) installiert ist, werden hiermit darauf hingewiesen, dass durch das Plugin eine Verbindung zu Facebook aufgebaut wird, wodurch eine Übermittlung an Ihren Browser durchgeführt wird, damit das Plugin auf der Webseite erscheint.&lt;/p&gt;
&lt;p&gt;Des Weiteren werden durch die Nutzung Daten an die Facebook-Server weitergeleitet, welche Informationen über Ihre Webseitenbesuche auf unserer Homepage enthalten. Dies hat für eingeloggte Facebook-Nutzer zur Folge, dass die Nutzungsdaten Ihrem persönlichen Facebook-Account zugeordnet werden.&lt;/p&gt;
&lt;p&gt;Sobald Sie als eingeloggter Facebook-Nutzer aktiv das Facebook-Plugin nutzen (z.B. durch das Klicken auf den „Gefällt mir“ Knopf oder die Nutzung der Kommentarfunktion), werden diese Daten zu Ihrem Facebook-Account übertragen und veröffentlicht. Dies können Sie nur durch vorheriges Ausloggen aus Ihrem Facebook-Account umgehen.&lt;/p&gt;
&lt;p&gt;Weitere Information bezüglich der Datennutzung durch Facebook entnehmen Sie bitte den datenschutzrechtlichen Bestimmungen auf Facebook unter &lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;https://de-de.facebook.com/policy.php&#34;&gt;https://de-de.facebook.com/policy.php&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datenschutzerklärung für den Webanalysedienst Google Analytics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Diese Website benutzt Google Analytics, einen Webanalysedienst der Google Inc. (&amp;ldquo;Google&amp;rdquo;). Google Analytics verwendet sog. &amp;ldquo;Cookies&amp;rdquo;, Textdateien, die auf Ihrem Computer gespeichert werden und die eine Analyse der Benutzung der Website durch Sie ermöglichen. Die durch den Cookie erzeugten Informationen über Ihre Benutzung dieser Website werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert. Wir haben die IP-Anonymisierung aktiviert. Auf dieser Webseite wird Ihre IP-Adresse von Google daher innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um Ihre Nutzung der Website auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen. Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Sie können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Sie können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf Ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: &lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;https://tools.google.com/dlpage/gaoptout?hl=de&#34;&gt;https://tools.google.com/dlpage/gaoptout?hl=de&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datenschutzerklärung für den Webanzeigendienst Google Adsense&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Diese Website benutzt Google Adsense, einen Webanzeigendienst der Google Inc., USA (&amp;ldquo;Google&amp;rdquo;). Google Adsense verwendet sog. &amp;ldquo;Cookies&amp;rdquo; (Textdateien), die auf Ihrem Computer gespeichert werden und die eine Analyse der Benutzung der Website durch Sie ermöglicht. Google Adsense verwendet auch sog. &amp;ldquo;Web Beacons&amp;rdquo; (kleine unsichtbare Grafiken) zur Sammlung von Informationen. Durch die Verwendung des Web Beacons können einfache Aktionen wie der Besucherverkehr auf der Webseite aufgezeichnet und gesammelt werden. Die durch den Cookie und/oder Web Beacon erzeugten Informationen über Ihre Benutzung diese Website (einschließlich Ihrer IP-Adresse) werden an einen Server von Google in den USA übertragen und dort gespeichert. Google wird diese Informationen benutzen, um Ihre Nutzung der Website im Hinblick auf die Anzeigen auszuwerten, um Reports über die Websiteaktivitäten und Anzeigen für die Websitebetreiber zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen zu erbringen. Auch wird Google diese Informationen gegebenenfalls an Dritte übertragen, sofern dies gesetzlich vorgeschrieben oder soweit Dritte diese Daten im Auftrag von Google verarbeiten. Google wird in keinem Fall Ihre IP-Adresse mit anderen Daten der Google in Verbindung bringen. Das Speichern von Cookies auf Ihrer Festplatte und die Anzeige von Web Beacons können Sie verhindern, indem Sie in Ihren Browser-Einstellungen &amp;ldquo;keine Cookies akzeptieren&amp;rdquo; wählen (Im MS Internet-Explorer unter &amp;ldquo;Extras &amp;gt; Internetoptionen &amp;gt; Datenschutz &amp;gt; Einstellung&amp;rdquo;; im Firefox unter &amp;ldquo;Extras &amp;gt; Einstellungen &amp;gt; Datenschutz &amp;gt; Cookies&amp;rdquo;); wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website voll umfänglich nutzen können. Durch die Nutzung dieser Website erklären Sie sich mit der Bearbeitung der über Sie erhobenen Daten durch Google in der zuvor beschriebenen Art und Weise und zu dem zuvor benannten Zweck einverstanden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datenschutzerklärung für das soziale Netzwerk Google Plus&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Diese Webseite verwendet die sog. „G +1“-Schaltfläche des sozialen Netzwerkes Google Plus, welches von der Google Inc., 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States betrieben wird („Google“). Die Schaltfläche ist an dem Zeichen „G +1“ zu erkennen. Wenn Sie bei Google Plus registriert sind, können Sie mit der „G +1“ Schaltfläche Ihr Interesse an unserer Webseite ausdrücken und Inhalte von unserer Webseite auf Google Plus teilen. In dem Falle speichert Google sowohl die Information, dass Sie für einen unserer Inhalte ein „G +1“ gegeben haben, als auch Informationen über die Seite, die Sie dabei angesehen haben. Ihre „G +1“ können möglicherweise zusammen mit Ihrem Namen (ggf. auch mit Foto - soweit vorhanden) bei Google Plus in weiteren Google-Diensten, wie der Google Suche oder Ihrem Google-Profil, eingeblendet werden.&lt;/p&gt;
&lt;p&gt;Zweck und Umfang der Datenerhebung und die weitere Verarbeitung und Nutzung der Daten durch Google sowie Ihre diesbezüglichen Rechte und Einstellungsmöglichkeiten zum Schutz Ihrer Privatsphäre entnehmen Sie bitte Googles Datenschutzhinweisen:&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;https://www.google.com/intl/de/policies/privacy/&#34;&gt;https://www.google.com/intl/de/policies/privacy/&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datenschutzerklärung für die Nutzung von dem Webmessagedienst twitter.com&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wir haben auf unserer Webseite auch den Webmessagedienst twitter.com integriert. Dieser wird durch die Twitter Inc., 1355 Market St, Suite 900, San Francisco, CA 94103, USA bereitgestellt. Twitter bietet die sog. „Tweet“ – Funktion an. Damit kann man 140 Zeichen lange Nachrichten auch mit Webseitenlinks in seinem eigenen Twitteraccount veröffentlichen. Wenn Sie die „Tweet“-Funktion von Twitter auf unseren Webseiten nutzen, wird die jeweilige Webseite mit Ihrem Account auf Twitter verknüpft und dort ggf. öffentlich bekannt gegeben. Hierbei werden auch Daten an Twitter übertragen.&lt;/p&gt;
&lt;p&gt;Von dem Inhalt der übermittelten Daten und deren Nutzung durch Twitter erhalten wir keine Kenntnis. Konsultieren Sie daher für weitere Informationen die Datenschutzerklärung von Twitter: &lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;https://twitter.com/privacy&#34;&gt;https://twitter.com/privacy&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;Twitter bietet Ihnen unter nachfolgendem Link die Möglichkeit, Ihre Datenschutzeinstellungen selbst festzulegen: &lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;https://twitter.com/account/settings&#34;&gt;https://twitter.com/account/settings&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auskunftsrecht&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sie haben das jederzeitige Recht, sich unentgeltlich und unverzüglich über die zu Ihrer Person erhobenen Daten zu erkundigen. Sie haben das jederzeitige Recht, Ihre Zustimmung zur Verwendung Ihrer angegeben persönlichen Daten mit Wirkung für die Zukunft zu widerrufen. Zur Auskunftserteilung wenden Sie sich bitte an den Anbieter unter den Kontaktdaten im Impressum.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Über mich</title>
      <link>https://schauderbasis.de/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://schauderbasis.de/about/</guid>
      <description>&lt;p&gt;Ich heiße Johannes Lippmann und finde Mathematik und freie Software spannend.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&#34;https://schauderbasis.de&#34;&gt;Schauderbasis&lt;/a&gt; ist mein Blog.
Mehr über meine Arbeit findet man auf &lt;a href=&#34;https://cv.schauderbasis.de&#34;&gt;https://cv.schauderbasis.de&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
