<?xml version="1.0" encoding="utf-8"?>
<feed id="atom.dokucode.de" xmlns="http://www.w3.org/2005/Atom">
    <title type="text">dokucode.de: Blogposts</title>
    <updated>2021-02-25T13:26:07.378563+01:00</updated>

     <entry>
        <title type="text">Fernklausuren</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2021_02_20_Fernklausuren.html" />
        <id>urn:uuid:ca5d203a-346b-5540-9ace-8a90ccbc7883</id>
        <updated>2021-02-20T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Auch wenn es wenig überraschend war, als die Uni Hannover alle im Februar 2021 stattfindenden Präsenzklausuren abgesagt hat und die Durchführung von elektronischen Klausuren empfohlen hat, mussten schnell sinnvolle Lösungen gefunden werden.
Von einer Form der elektronischen Klausur, die mein Chef <a href="https://www.sra.uni-hannover.de/People/lohmann/">Daniel Lohmann</a> "Fernklausuren" getauft hat und die wir <a href="https://www.sra.uni-hannover.de/People/">gemeinsam am SRA</a> ausgearbeitet haben, will ich in diesem kurzen Artikel erzählen.</p>
<p>Vorneweg will ich aber sagen, dass jede Form der elektronischen Klausur, bei denen wir Prüfer*innen die Umgebung der Prüflinge nicht kontrollieren können, schlecht ist.
Es ist prinzipbedingt, durch den Zugang der Studierenden zum Internet und zu Kommunikationsmöglichkeiten, unmöglich kontrollierte Bedingungen zu schaffen, bei denen Unterschleif im gleichen Maße verhindert (oder zumindest erkannt) werden kann wie bei einer Präsenzklausur.
Andere Formen von Prüfungen, wie Hausarbeiten oder mündliche Prüfungen, sind zwar in dieser Hinsicht leichter ins Elektronische übertragbar, haben aber den Nachteil nicht zu skalieren.
Daher will ich mich hier nur mit der Klausur als Prüfungsform auseinandersetzten und unser Vorgehen beschreiben, wie wir versucht haben möglichst viele der guten Eigenschaften von Präsenzklausuren in "Fernklausuren" umzusetzen.
Unsere Zielsetzungen bei der Konzeptionierung waren dabei folgende Punkte:</p>
<ul>
<li>Geringe technische Anforderungen, welche die Student*innen erfüllen müssen.</li>
<li>Minimierung der Unterschleifmöglichkeiten.</li>
<li>Fehlertolerant gegenüber technischen Störungen während der Klausur.</li>
<li>Eine Prüfungsform, die den Studierenden bereits bekannt und die in dieser turbulenten Zeit einige gewisse Vertrautheit bietet.</li>
</ul>
<h1 id="das-vorgehen">Das Vorgehen</h1>
<p>Der erste Schritt bei der Durchführung einer Fernklausur ist es eine schriftliche Klausurvorlage zu erstellen, die randomisierbar ist.
Dabei muss man darauf achten, dass zum einen jede abgeleitete Klausur den gleichen Schwierigkeitsgrad hat und die Antworten auf die Fragen nicht trivial im Internet auffindbar sind.
Aus dieser randomisierbaren Klausur erstellen wir für Jeden eine ganz individuelle Klausur samt zugehöriger Musterlösung.
Auf diese Weise führt ein Austausch zwischen den Student*innen nur zu Chaos und Verwirrung.</p>
<p>Als zweites Verschlüsseln wir alle individuellen Klausuren (PDF-Dateien) mit dem gleichen Passwort und lassen verschicken die Dateien bereits im Vorfeld der eigentlichen Prüfung (24 Stunden vorher) an alle Angemeldeten. Auf diese Weise können sich alle die nötigen Dateien bereits im Vorfeld herunterladen und im Zweifel die Klausur auch in einer Hütte im Wald schreiben (was bei beengten Wohnverhältnissen durchaus eine praktikable Option auf einen ruhigen Ort sein kann). Zusammen mit der verschlüsselten Klausur kommt noch eine detaillierte Schritt-für-Schritt-Anleitung und ein Tool um einen SHA256-Hash einer Datei zu berechnen.</p>
<p>Am Tag der Klausur kommen alle Prüflinge in eine BigBlueButton-Session, in der sie 15 Minuten vor dem eigentlichen Klausurbeginn das Passwort für die Klausur erhalten.
Diese Zeit ist zum Entschlüsseln und gegebenenfalls Drucken der Klausur gedacht.
Da jeder Prüfling unterschiedlich lange für diesen Schritt brauchen wird, muss man dies bei der Erstellung der Klausur bedenken.
Zeit darf bei dieser Form der Klausur nicht der limitierende Faktor für die Bearbeitung sein.
Wenn ein Prüfling zu diesem Zeitpunkt kein Internet hat, haben wir in der Anleitung mehrere Telefonnummern angegeben, unter denen wir gegen Name und Matrikelnummer das Passwort herausgeben.</p>
<p>Im eigentlichen Prüfungszeitraum müssen die Student<em>innen die Prüfung </em>handschriftlich* bearbeiten.
Dies hat zum einen der Vorteil, dass wir die gewohnte Form der schriftlichen Klausur haben, aber auch dass wir mehrere Seiten an handschriftliche Proben haben, wenn es zu Zweifeln bezüglich Unterschleif kommen sollte.
Dabei haben wir 3 Möglichkeiten vorgesehen die Klausur zu Bearbeiten: (1) Ausfüllen am Tablet, (2) Ausfüllen auf einem Ausdruck der Klausur und (3) Bearbeitung auf Blanko-Papier.
Für die letztere Methode haben wir jedes auszufüllende Feld mit einer eindeutigen Nummer versehen.
Auf die Weise kann man Antwortfelder eindeutig vom Blank-Papier aus referenzieren.
Daher besteht bei Fernklausuren kein Bedarf an einem Drucker.</p>
<p>Während der Klausur verwenden wir den BigBlueButton-Raum nur als Möglichkeit zum technischen Support und um Ansagen machen zu können.
Dabei haben wir alle Studierenden zu je 50 Leute in Gruppen eingeteilt, die jeweils eigene Räume haben.
Während der Klausur sind alle betreuenden Mitarbeiter im ständigen Austausch, indem sie in einer gemeinsamen Telefonkonferenz sind.</p>
<p>Nach dem Ende der Zeit müssen die Student*innen einen Scan der Klausur erzeugen, falls die Bearbeitung auf Papier stattgefunden hat.
Dabei braucht es auch nicht unbedingt einen Scanner, ein modernes Smartphone und passende Scanner-Apps reichen völlig aus um ein Abgabe-PDF zu erzeugen.
Wenn alles klappt, muss man die eigene Abgabe nur noch auf der Lernplattform der Universität hochladen und ist fertig mit der Klausur. Für diesen Schritt nach der Klausur haben wir wieder 15 Minuten eingeplant.</p>
<p>Wenn zum Abgabezeitpunkt das Internet stirbt oder die eigene Internetleitung nicht dick genug ist um große Scans hochzuladen, haben wir noch die Möglichkeit vorgesehen eine Prüfsumme der Abgabe zu Erstellen. Dazu haben wir beim Verschicken eine HTML-Datei mitgegeben, die in den meisten modernen Browsern läuft, und mit deren Hilfe man einen SHA256 berechnen kann. Das Abgeben der Prüfsumme kann per Chat, Mail oder (von der Hütte im Wald aus) per Telefon geschehen.</p>
<h1 id="weitere-hinweise">Weitere Hinweise</h1>
<ul>
<li>Die randomisierte Klausurvorlage ist Code und muss unbedingt von mehreren Mitarbeitern begutachtet werden. Ein Fehler in der Vorlage würde zu einer Babylonischen Verwirrung führen.</li>
<li>Es ist Tooling zum Erstellen und Verschicken der Klausuren zwingend notwendig. Wir haben eine Mischung aus Jinja2-Templates, LaTeX, und der Stud.IP-API zum Klausurversand verwendet.</li>
<li>Ein Probelauf mit den Prüflingen einige Tage vor der eigentlichen Klausur ist wichtig. Auf diese Weise lernen alle Beteiligte das Prozedere kennen und sind zum richtigen Termin nicht so aufgeregt.</li>
<li>Manche Student*innen haben so großartige Smartphones, dass bei 10 Seiten Klausur 250MiB PDF-Dateien rausfallen. Es ist als von Vorteil eine Möglichkeit in der Hinterhand zu haben um große Dateien hochladen zu können. Dienste wie Seafile und Nextcloud bieten sich hier an.</li>
<li>Die Prüfsumme als Fallback wurde tatsächlich von einigen Student*innen verwendet, wenn auch für einige nur zum Beruhigen der eigenen Unsicherheit ("Habt ihr die Datei mit dem Hash xxx erhalten?").</li>
</ul>]]></content>
    </entry>
     <entry>
        <title type="text">Dynamic Scoping in C++</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2020-07-10-Dynamic-Scoping-in-CPP.html" />
        <id>urn:uuid:c0bbae5c-3b6e-5f34-b47b-54c492dc1039</id>
        <updated>2020-07-10T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>I always had a faible for dynamic scoping as it is implemented in
Common Lisp, Emacs Lisp, or LaTeX. To me, it seems that dynamic
scoping is an almost forgotten technique and dismissed technique in
modern programming. While it is more complex to understand and more
magically than lexical scoping, there are some applications that
benefit from dynamic scoping.</p>
<p>In lexical scoping, if you access a variable, your compiler will start
searching the declaration from the point of reference outwards in
lexical order. This means it searches first in the most inner scope,
and continoues to widen its search scope by the "closed-nested-scope
rule". For example, in the following code snippet, the call to <code>foo()</code>
would return 23, as the lexcially-closest declaration is the global variable.</p>
<div class="codehilite"><pre><span></span><span class="kt">int</span> <span class="n">config</span> <span class="o">=</span> <span class="mi">23</span><span class="p">;</span>

<span class="k">return</span> <span class="nf">foo</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">config</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">bar</span><span class="p">()</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">config</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\&quot;</span><span class="s">, foo());</span>
<span class="p">}</span>
</pre></div>


<p>With dynamic scoping, the world would look different as the closest
(time-wise) dynamic binding for a given name is found instead of
lexically closest. In the example, <code>foo()</code> would return 42, as the
binding in <code>bar()</code> happened more recently that the global binding.</p>
<p>You can think of a dynamically-scoped global variable as shadowable
global binding. By creating a new binding for the variable, we shadow
the old binding, and all references in child functions will now refer
to the new binding, although they have not received the value via an
argument transfer. Ergo, dynamically-scoped variables are shadowable
side-channels that can influence the behavior of a function.</p>
<p>For example, in Common Lisp, the variable <code>*standard-output*</code> is
dynamically scoped and functions <code>(print)</code> simply send there
characters to that variable. As it is dynamically scoped, we can just
redirect all output to a file by creating a new binding for
<code>*standard-output*</code>.</p>
<div class="codehilite"><pre><span></span><span class="p">(</span><span class="nb">with-open-file</span> <span class="p">(</span><span class="vg">*standard-output*</span> <span class="s">&quot;somefile.dat&quot;</span> <span class="ss">:direction</span> <span class="ss">:output</span>
                                   <span class="ss">:if-exists</span> <span class="ss">:supersede</span><span class="p">)</span>
   <span class="p">(</span><span class="nb">print</span> <span class="s">&quot;this goes into file&quot;</span><span class="p">))</span>
</pre></div>


<p>Wouldn't it be neat to do the same in, let's say, C++? Luckily, with
templates, the RAII pattern, and some template magic, we can write
code like this:</p>
<div class="codehilite"><pre><span></span><span class="n">DynamicScope</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">G</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

<span class="kt">void</span> <span class="nf">bar</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;bar &quot;</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">G</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">foo</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">DynamicScope</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">BindInstance</span> <span class="n">_</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
    <span class="n">bar</span><span class="p">();</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;main1 &quot;</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">G</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="n">foo</span><span class="p">();</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;main2 &quot;</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">G</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

<span class="p">}</span>
</pre></div>


<p>and end up with the output:</p>
<div class="codehilite"><pre><span></span><span class="err">main1 0</span>
<span class="err">bar 3</span>
<span class="err">main2 0</span>
</pre></div>


<p>The source for the <code>DynamicScope&lt;T&gt;</code> can be found here:    <a href="../../../../../../posts/2020-07-10-Dynamic-Scoping-in-CPP/dynamic_scope.cc">dynamic_scope.cc</a>
</p>
<h2 id="update-23092020-multi-threaded-programs">[UPDATE 23.09.2020] Multi-Threaded Programs</h2>
<p>After some discussion on
<a href="https://news.ycombinator.com/item?id=24544716">HackerNews</a> (which I
highly recommend to read), I was made aware that the previous
implementation has a problem with multi-threaded programs. As all
threads share the same global objects as a root to their dynamic-scope
value stack, bindings in one thread had an influence on the bindings
in another thread. Of coure, this would be a broken version of dynamic
scoping.</p>
<p>The problem can be circumvented by making the global variable thread local:</p>
<div class="codehilite"><pre><span></span><span class="k">thread_local</span> <span class="n">DynamicScope</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">G</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</pre></div>


<p>With this, every thread has its own version of the G object, which
internally is the head of a linked list of the shadowed values.
However, someone could forget the add the required thread_local attribute.</p>
<p>Unluckily, checking whether the storage class of a given variable is
thread_local is not that trivial. However, I came up with a rather
low-cost sanity check that ensures that a variable must be declared
<code>thread_local</code>. The updated version of <code>DynamicScope&lt;T&gt;</code>, as well as
some benchmarking code, can be found here:    <a href="../../../../../../posts/2020-07-10-Dynamic-Scoping-in-CPP/thread_dynamic_scope.cc">thread_dynamic_scope.cc</a>
</p>]]></content>
    </entry>
     <entry>
        <title type="text">Folien und Skript für PSÜ</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2020-06-26-Folien-und-Skript.html" />
        <id>urn:uuid:f5733b73-7a71-5cf9-9963-aea493b34e33</id>
        <updated>2020-06-26T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Für das Sommersemester 2020 habe ich die Veranstaltung "Programmiersprachen und Übersetzer" an der Leibniz Universität Hannover übernommen.
Im Vorfeld habe ich mich entschieden eigene Materialien zu erstellen, da ich einen anderen Fokus auf das Thema legen wollte als meine Vorgänger.
Es sollte weniger um Syntaxanalyse und Übersetzerbau wie wir ihn aus dem Drachenbuch kennen und mehr um die größeren Konzepte und Paradigmen von Programmiersprachen gehen.</p>
<p>Bei der Erstellung der Materialien (Folien, Skript) habe ich eine Reihe an Werkzeugen entwickelt, die mir immens dabei geholfen haben effizient meine Gedanken nieder zu schreiben.
Von dieser Toolchain werde ich in diesem Artikel beschreiben, vielleicht sind sie auch für andere nützlich.</p>
<h2 id="skript-schriftliche-ausarbeitung-der-vorlesung">Skript: Schriftliche Ausarbeitung der Vorlesung</h2>
<p>Ein Skript ist kein Lehrbuch.
Es kann kein Lehrbuch ersetzen und sollte dies auch nicht versuchen.
Ein Skript ist eine Unterstützende Materialsammlung, die es unseren Studierenden erleichtern soll sich selbstständig mit der Vorlesung auseinander zu setzen.
Vorlesung und Skript sollten also möglichst eng miteinander gekoppelt sein, damit die Studierenden nicht von einem Mismatch zwischen Skript und Folien in ihrer akuten Lernphase (aka 2 Tage vor der Klausur) noch mehr verwirrt werden als eh schon.</p>
<p>Um eine möglichst enge Bindung von Vorlesung habe ich mich entschieden Skript und Folien als ein <strong>integriertes und interaktives Dokument</strong> zur Verfügung zu stellen.
Das bedeutet, dass das Skript genau wie die Vorlesung strukturiert ist und die Folien als Bilder in das Skript eingewoben werden.
So kann ich zu jeder Folie bzw.
jeweils einem Bündel an Folien einen erklärenden, ergänzenden, und teilweise weiter ausufernden, Text formulieren, der Elemente der Folie erklärt.
Dadurch kommt es, hoffentlich, beim Studierenden weniger oft zur Frage "Was zur Hölle wollte der Dozent mir mit dieser Graphik sagen?".</p>
<p>Außerdem stelle ich sowohl Skript, als auch Folien der Öffentlichkeit zur Verfügung, und ihr findet es auf den <a href="https://www.sra.uni-hannover.de/Lehre/V_PS%C3%9C/skript/">Seiten des Fachbereich System- und Rechnerarchitektur</a>.
Schließlich werde ich aus öffentlichen Geldern bezahlt, dann kann ich meine Materialien auch öffentlich, als Creative Commons, zur Verfügung stellen. Und dank Corona gibt es dort nicht nur das Skript und die Folien, sondern auch eine Aufzeichnung der Vorlesung, wie ich sie im Sommersemester 2020 gehalten habe.</p>
<h2 id="skript-technik">Skript: Technik</h2>
<p>Aber kommen wir nun zur Technik des Skripts:
Technisches Rückgrat des Skripts ist der <a href="https://orgmode.org/">org-mode</a> von Emacs.
In a Nutshell ist der org-mode ein Dateiformat mit reichhaltigem Tooling innerhalb des Emacs Ökosystems.
Ursprünglich gedacht um Aufgaben zu verwalten, ist das Format zu einer vollständigen <a href="https://en.wikipedia.org/wiki/Lightweight_markup_language">Lightweight Markup Language</a> geworden.
Wichtig für mein Skript ist, dass org-mode die Möglichkeit hat Dateien als HTML zu exportieren und eingebettete Codeblöcke separat zu exportieren.</p>
<p><img alt="" src="2020-06-26-Folien-und-Skript/emacs-export.svg" /></p>
<p>Den Korpus des Skripts schreibe ich in org-mode und exportiere ihn schlussendlich in ein HTML Dokument.
Für die Erstellung der Folien verwende ich die LaTeX <a href="http://tug.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf">Beamer</a> Klasse und kann daher den Quellcode der Folien direkt als Codeblöcke innerhalb des org-mode Dokuments einbinden.
Wie das aussieht kann man auf <a href="https://github.com/luhsra/vorlesung-psu/blob/master/01-einleitung.org">Github</a> sehen, wo ich die Quelldateien des Skripts öffentlich entwickle.</p>
<p>Mittels Tangling, einer Technik aus dem Literate Programming, exportiere ich den LaTeX Quellcode als separates Dokument und übersetze es ganz regular zu einer PDF Datei.
Dabei erhalte ich die Information, welche Folie aus welchem Quellcodeblock stammt um später die Folien genau an dieser Stelle wieder einzufügen.
Das entstandene PDF verwende ich dann während der Vorlesung.</p>
<p>Für das Skript, zerteile ich die einzelnen Folien des PDFs, konvertiere sie nach SVG, und füge sie in das exportierte HTML des Skripts ein.
Dort sorgt dann ein bisschen JavaScript Code und Bootstrap Magie dafür, dass die Folien eines Codeblocks zu einem "Carousel" wird, welches die Studierenden einfach durchklicken können.
So behalten auch schrittweise Animationen und inkrementeller Folienaufbau ihren Nutzen im Skript. Etwas, dass mit einem reinem PDF Skript nicht möglich gewesen wäre.</p>
<p>Zusätzlich erlaubt es der org-mode auch exportierte Codeblöcke in anderen Sprachen (z.B.
Python), mittels <a href="https://github.com/viebel/klipse">Klipse</a> direkt ausführbar zu machen.
Das Codebeispiel wird dann mit einer JavaScript Version des jeweiligen Interpreters Live im Browser ausgeführt und die Studierenden können das Codebeispiel direkt editieren.</p>
<p>Insgesamt braucht das fertig exportierte Skript keine Infrastruktur auf dem Server und kann als rein statische Dateien zur Verfügung gestellt werden. Dies minimiert den dauerhaften Wartungsaufwand, bietet keine zusätzliche Angriffsfläche, und ist trivial archivierbar.</p>
<h2 id="folien-techniken">Folien: Techniken</h2>
<p>Um Folien mittels Beamer aufzubereiten habe ich einige Techniken entwickelt, die es mir leichter machen mich weniger mit LaTeX und mehr mit dem Stoff auseinander zu setzen.
Dabei ist das wichtigste Grundprinzip, dass das übersetzen der Folien nach PDF schnell sein muss. Nur so wartet man nicht ewig und drei Tage darauf, dass der gesamte Foliensatz wegen einer kleinen Änderung neu übersetzt werden muss. Dabei bringe ich zwei Techniken zum Einsatz.</p>
<p>Zum einen erlaubt mir meine org-mode Tangling Infrastruktur nur einzelne Quellcodeblöcke und damit einzelne Folienbündel zu exportieren. Damit reduziert sich die LaTeX Übersetzungszeit bereits maßgeblich und ich kann lokal an einer Stelle im Foliensatz arbeiten, ohne alles immer neu zu bauen.</p>
<p>Die andere wichtige Technik ist die separate Übersetzung von Graphiken.
Ich erstelle die meisten meiner Graphiken mit <a href="https://ctan.kako-dev.de/graphics/pgf/base/doc/pgfmanual.pdf">PGF/TikZ</a>, da ich darin meist am effektivsten bin und sehr leicht sich inkrementell aufbauende Graphiken erzeugen kann. Dazu aber später mehr. Was allerdings ein Problem an TikZ ist, dass es teilweise lange braucht um zu einem PDF übersetzt zu werden. Daher wende ich hier die Technik der separaten Übersetzung an.</p>
<h3 id="graphiken-schrittweise-animationen-mit-beamer-und-tikz">Graphiken: Schrittweise Animationen mit Beamer und TikZ</h3>
<p>Sobald man die steile Lernkurve hinter sich hat ist TikZ hervorragend geeignet um Vektorgraphiken zu erzeugen, da es im Prinzip eine Programmiersprache ist um Knoten und Kanten zu platzieren.
In Kombination mit Beamer und separater Übersetzung kann man damit relativ einfach sich aufbauende Graphiken erzeugen, die man dann in den Folien einbetten kann.
Die Grundidee dabei ist, die Graphik als ein <em>eigenständiges Beamerdokument</em> zu erzeugen, dass genau eine Folie mit einer TikZ Graphik enthält.
Mit den Mechanismen von Beamer können wir dann einzelne Knoten als Overlay überblenden. Für PSÜ habe ich dieses Vorgehen in der Klasse <a href="https://github.com/luhsra/vorlesung-psu/blob/master/texmf-local/lecturefig.cls">lecturefig</a> gebündelt. Eine einfache Animation kann dann wie folgt aussehen:</p>
<p><img alt="" src="2020-06-26-Folien-und-Skript/anim.gif" /></p>
<div class="codehilite"><pre><span></span><span class="k">\documentclass</span><span class="nb">{</span>lecturefig<span class="nb">}</span>
<span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span>
<span class="k">\begin</span><span class="nb">{</span>frame<span class="nb">}</span>[fragile]
  <span class="k">\begin</span><span class="nb">{</span>tikzpicture<span class="nb">}</span>[]
    <span class="k">\node</span><span class="na">[draw]</span> (a) <span class="nb">{</span>A<span class="nb">}</span>;

    <span class="k">\begin</span><span class="nb">{</span>visible<span class="nb">}</span>&lt;2-&gt;
      <span class="k">\node</span><span class="na">[draw,right=of a]</span> (b) <span class="nb">{</span>B<span class="nb">}</span>;
      <span class="k">\draw</span><span class="na">[-&gt;]</span> (a) -- (b);
    <span class="k">\end</span><span class="nb">{</span>visible<span class="nb">}</span>
  <span class="k">\end</span><span class="nb">{</span>tikzpicture<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>frame<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span>
</pre></div>


<p>Jeder Animationsschritt wird hierbei zu einer PDF Seite in der Graphik und kann dann in den Folien in unterschiedlichen Beamer Overlays eingebunden werden.</p>
<h3 id="graphiken-schrittweise-animationen-mit-svg">Graphiken: Schrittweise Animationen mit SVG</h3>
<p><img alt="" src="2020-06-26-Folien-und-Skript/inkscape.png" /></p>
<p>Da auch ich keine Lust habe jede Animation mit TikZ zu malen, habe ich noch das <a href="https://github.com/luhsra/vorlesung-psu/blob/master/bin/svgfig">svgfig</a> Werkzeug geschrieben, was ein Inkscape SVG in ein mehrseitiges PDF exportiert. Die einzelnen Animationsschritte kann ich dort mit Inkscape Layern bestimmen, die mit einer Beamer Overlay Specification benannt sind. Jeder Layer wird also genau auf den PDF Seiten angezeigt, die sein Overlay-Ausdruck angibt.</p>]]></content>
    </entry>
     <entry>
        <title type="text">Input &lt; Output</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2019-07-21-Input-smaller-Output.html" />
        <id>urn:uuid:a7f85587-171d-5290-8940-4c4334ee34d2</id>
        <updated>2019-07-21T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Das fortwährende Angebot an leckerer und energiereicher Nahrung ist an
mir in den letzten 10 Jahren nicht spurlose vorbei gegangen.
Insbesondere im Studium und nun während meiner Promotionszeit habe ich
veritable Energiespeicher, in Form von Fett, angelegt. Nun da das
<em>Buch</em> fertig ist, habe ich den Kopf wieder freier und habe das Thema
angegangen.</p>
<p>Im Zuge dessen habe ich mich mit Ernährung auseinander gesetzt und
einige Einsichten gewonnen, von denen ich hier ein berichten will.
Vielleicht für andere auch nützlich sind. Viele dieser Gedanken habe
ich aus dem Buch <a href="https://www.ullstein-buchverlage.de/nc/buch/details/fettlogik-ueberwinden-9783548376516.html">Fettlogik
überwinden</a>
von Nadja Herrmann, in dem sie Mythen über das Abnehmen anspricht und
die passenden wissenschaftlichen Referenzen dazu zusammen trägt. Ich
kann dieses Buch wirklich jedem nur wärmsten empfehlen, selbst wenn
man nicht übergewichtig ist.</p>
<h2 id="fett-ist-ehemals-verderbliche-nahrung">Fett ist ehemals verderbliche Nahrung</h2>
<p>So trivial es klingt, aber Fettgewebe ist der Energiespeicher des
Körpers. Mit 7000 kcal pro Kilogramm Fettgewebe ist es in der
Größenordnung von Butter. Dieses Gewebe kann vom Körper mit relativ
wenig Energieaufwand am Leben gehalten werden, da es im Grunde nur
geheizt werden muss. Ganz anders als Muskelgewebe, das bewegt sich ja
auch noch und gibt dabei Energie aus.</p>
<p>Evolutionstechnisch macht die Möglichkeit Fettgewebe anzulegen auch
viel Sinn, weil man damit Zeiten mit schwankender Nahrungszufuhr gut
ausgleichen kann. Wenn es im Herbst viel Obst und Nahrungsmitteln in
Fülle gibt, ist es sinvoll sich daran zu überfressen und so die
Kalorien als Fett rumzutragen, anstatt den Äpfeln beim verfaulen
zuzusehen. Mehr essen als man gerade braucht ist also eine ganz valide
Strategie der Nahrungsmittelkonservierung. Und weil verhungern
schlimmer ist als ein etwaig späterer Herzinfarkt hat sich das auch in
der Evolution durchgesetzt.</p>
<h2 id="der-korper-wirft-nichts-weg">Der Körper wirft nichts weg</h2>
<p>Viele Diätmythen erzählen einem das dieses oder jenes Nahrungsmittel
den Kreislauf ankurbelt und man damit ganz Mühelos schlank wird. Es
stellt sich aber die Frage, wie dieses "Kreislauf ankurbeln"
funktionieren soll? Bekommt man davon Fieber, oder wohin geht die
Energie, die dieser "angekurbelte" Kreislauf verbrauchen soll? Denn
solange die Energieerhaltung gilt, gibt es eigentlich nur die eine
Möglichkeit den Energiespeicher abzuschmelzen: <em>Weniger zuführen als
man verbraucht</em>. Das ist die eine und die einzige Methode Fettgewebe
zu verlieren (abgesehen von Operationen).</p>
<p>Ein Gedanke, den eine Freundin bei diesem Thema noch aufgebracht hat
ist di der <a href="https://de.wikipedia.org/wiki/Ketogene_Di%C3%A4t">Ketogenen
Diät</a>. Dabei bringt
man den Körper in eine Kohlenhydratmangelernährung (vgl. Low Carb).
Der Mechanismus dahinter funktionier in etwa so: Der Körper hat im
Grunde zwei große Stoffwechselwege für Energie, Glucose und
Ketonkörper. Bei einer Ketogenen Diät reduziert man seine
Kohlenhydrate soweit, dass die Zellen nun hauptsächlich Energie aus
Fetten (also auch aus dem Fettgewebe) über den Ketonstoffwechsel
verfeuern. Weil es aber eine Mangelernährung ist, hat es auch einige
blöde Seiteneffekte, wie erhöhtes Herzinfarktrisiko. Eine Annahme, die
hinter dieser gewollten Mangelernährung steht, wenn sie als Diät
angepriesen wird, ist, dass dieser Ketonstoffwechsel ineffizienter ist
als der Weg über die Glukose. Ein Beispiel für diese Idee in der
Realität ist Atkins Diät. Allerdings weiß die
<a href="https://en.wikipedia.org/wiki/Atkins_diet">Wikipedia</a> dazu folgendes
zu sagen:</p>
<blockquote>
<p>"In his early books such as Dr Atkins' New Diet Revolution, Atkins
made the controversial argument that the low-carbohydrate diet
produces a metabolic advantage because "burning fat takes more
calories so you expend more calories"; the Atkins diet was claimed
to be "a high calorie way to stay thin forever". He cited one study
in which he estimated this advantage to be 950 Calories (4.0 MJ) per
day. A review study published in Lancet concluded that there was no
such metabolic advantage and dieters were simply eating fewer
calories."</p>
</blockquote>
<p>Wenn wir mal einen Schritt zurück gehen, wäre das ein evolutionäre
Nachteil für einen Menschen, wenn der Umweg über den Fettspeicher so
massiv ineffizienter wäre als über direktes Verbrennen oder andere
Energiespeicher, wie der Glykogenspeicher in der Leber. Es ist daher
relativ naheliegend, das der Körper jedes einzelne Kalorien was man zu
sich führt mit maximaler Effizienz (irgendwann) verwenden will. Alles
was dieser Grundannahme widersprich ist erstmal konterintuitiv und
würde ich erst glauben, wenn ich die large-scale Studie dazu gesehen
habe. Alternativ auch gerne die Energiebilanz der zu Grunde liegenden
chemischen Reduktion.</p>
<h2 id="kaloriendefizit-hunger">Kaloriendefizit != Hunger</h2>
<p>Ich habe dafür argumentiert, dass ein ordentliches Kaloriendefizit die
<em>einzige</em> Strategie ist seinen Energiespeicher zu verringern. Aber was
erreichen dann eigentlich erfolgreiche Diäten?</p>
<p>Wenn ein Mensch mit einer Diät erfolgreich ist, hat er es über Diät
geschafft seinen Hunger zu managen während er ein Kaloriendefizit
gefahren hat. Dabei seh ich so zwei Richtungen mit denen das klappen
kann: es darf nicht mehr so sucken sich nicht mehr jeden Tag mit
KitKat vollzustopfen, und man kann psychologische Mechanismen
ausnutzen um weniger essen zu wollen.</p>
<p>Das erste kann man ganz gut damit erreichen, indem man auf die
Energiedichte seiner Nahrung achtet. Umso energiedichter ein
Nahrungsmittel ist, umso mehr kann ich davon essen bevor ich mich
vollgestopft fühle. Umgekehrt bedeutet das aber auch, dass ich mich
solange mit Gurken und Tomaten überfressen kann bis ich platze und
dennoch ein Energiedefizit erreichen kann. Das ist eine Strategie, die
bei mir ganz gut funktioniert hat. Esst mehr Tomaten, macht auch
<a href="https://academic.oup.com/beheco/article/28/2/570/2990210">attraktiver</a>.</p>
<p>Die zweite Strategie kennt mehrere Varianten: Eine ist Beispielsweise
eintöniger zu essen (sucks!). Wenn Menschen immer dasselbe bekommen,
haben sie darauf weniger Appetit und essen automatisch weniger. Eine
andere ist viele Proteine zu sich zu nehmen, weil der Körper
(anscheinend) bei einer hohen Zufuhr an Aminosäuren früher sagt: jo
passt schon, hör mal auf diesen Block Tofu zu essen.</p>
<p><a href="https://chaos.social/web/statuses/102483815153527014">Kommentare auf Mastodon</a></p>]]></content>
    </entry>
     <entry>
        <title type="text">Immutable SD Cards</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2019-01-25-Immutable-SD-Card.html" />
        <id>urn:uuid:7f3f0cce-44d6-576e-a8f4-586837681042</id>
        <updated>2019-01-25T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Today, I had a strange behavior of an micro SD card that I've found
around here. And with this blogpost, I will document this behavior as
I had a hard time to search for this phenomenon , as it is confused by
the "I physically switched by SD card to read-only mode, help!"
problem in forums.</p>
<p>The phenomenon manifests as an immuteable SD card. The operating
system thinks it is a fully working read-write block medium and the
card reports no error for a written block. However, the block is
silently dropped. And since the OS thinks that the write was
successful, the modified block is placed in the buffer cache.
Therefore, it looks like filesystem operations just work fine.
However, when I unplugged the card and replugged it, the card snapped
to its original state.</p>
<p>After wondering about this phenomenon on Mastodon, I got a lot of
answers that this "magic SD card reset" is a common failure mode for
SD cards. They switch into a (sometimes) silent read-only mode. As
people have sugested, this happens for example if the maximal number
of write cycles is reached and no erasure blocks are left.</p>
<p>PS: For this blogpost I tried to use as many googlable synonyms for
the problem, as I had really a hard time to find a conciese
description of the silent SD card failure.</p>]]></content>
    </entry>
     <entry>
        <title type="text">Mastodon Photostream on Static Websites</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2019-01-20-Mastodon-Photostream.html" />
        <id>urn:uuid:f2102aa2-a529-5319-9bc0-0fd7293dae4c</id>
        <updated>2019-01-20T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>During the rebuilt of this website, I had the wish to show a dynamic
<a  href="../../../../../../photostream.html" >Photostream</a> of the pictures that I posted on my Mastodon account over
at <a href="http://chaos.social/users/stettberger">@chaos.social</a>. After some fiddling around, I build a small
Javascript snippet that uses JQuery to fetch my status updates from
the public API and display them.</p>
<div class="codehilite"><pre><span></span><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">(</span><span class="s1">&#39;https://mastodon.social/api/v1/accounts/267185/statuses?only_media=true&amp;limit=40&#39;</span><span class="p">,</span> <span class="p">{</span>
        <span class="nx">dataType</span><span class="o">:</span><span class="s2">&quot;json&quot;</span><span class="p">,</span>
        <span class="nx">success</span><span class="o">:</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">$</span><span class="p">(</span><span class="nx">data</span><span class="p">).</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">toot</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
            <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">media_attachments</span><span class="p">).</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
                <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">preview_url</span><span class="p">;</span>
                <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#enclosures&#39;</span><span class="p">).</span><span class="nx">append</span><span class="p">(</span>
                    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;&lt;a&gt;&#39;</span><span class="p">,</span> <span class="p">{</span><span class="nx">href</span><span class="o">:</span> <span class="nx">toot</span><span class="p">.</span><span class="nx">uri</span><span class="p">})</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;height&#39;</span><span class="p">,</span> <span class="s1">&#39;260px&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;width&#39;</span><span class="p">,</span> <span class="s1">&#39;260px&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;display&#39;</span><span class="p">,</span> <span class="s1">&#39;inline-block&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;background-image&#39;</span><span class="p">,</span> <span class="s1">&#39;url(&#39;</span> <span class="o">+</span> <span class="nx">url</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;background-size&#39;</span><span class="p">,</span> <span class="s1">&#39;cover&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;background-repeat&#39;</span><span class="p">,</span> <span class="s1">&#39;no&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;background-position&#39;</span><span class="p">,</span> <span class="s1">&#39;50% 50%&#39;</span><span class="p">)</span>
                        <span class="p">.</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;padding&#39;</span><span class="p">,</span> <span class="s1">&#39;0&#39;</span><span class="p">)</span>
                <span class="p">);</span>
            <span class="p">});</span>
        <span class="p">});</span>
    <span class="p">}});</span>
<span class="p">});</span>
</pre></div>


<p>Somewhere on that page, you have to have an <code>&lt;div
id='encolsures'&gt;&lt;/div&gt;</code> tag and your user must allow cross-site access
to your Mastodon instance. If you want to use this snippet, you also
have to replace my Mastodon user id (267185) with your id on your
server. One kind of simple variant to find your id, is to grab the
JSON from the public timeline (e.g.
<a href="https://mastodon.social/api/v1/timelines/public">/api/v1/timelines/public</a>)
directly after you have posted some public test toot.</p>]]></content>
    </entry>
     <entry>
        <title type="text">Entwicklungsziele der Menschheit</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2015-10-24-Entwicklungsziele.html" />
        <id>urn:uuid:9844ace4-cf9e-539b-9d4a-c42093eaf2a1</id>
        <updated>2015-10-24T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Ich trage diesen Artikel schon mehrere Monate in meinem Kopf herum;
wälze einzelne Punkte hin und her und überlege was ich eigentlich
schreiben möchte. Es geht mir darum zu beleuchten, wie es mit der
Evolution des Menschen eigentlich weiter gehen könnte. Wo sind Punkte
an denen Gehirn und Körper des Menschen an eine Welt angepasst sind,
die es nicht mehr gibt?</p>
<p>Evolution ist ein Prozess, der nicht stillsteht. Es ist der Prozess
mit dem sich das Leben durch Zufallsexperimente an neue Gegebenheiten
anpasst. Millionen von zufälligen Mutationen; viele davon Schlecht und
manche davon mit evolutionärem Vorteil behaftet. Mit Glück propagieren
sich die hilfreichen fort.</p>
<p>Nun ist der Mensch in den meisten Dingen kein Spezialist, sondern ein
Generalist. Oder anders gesagt: wir sind nicht besonders gut, aber von
allem ein bischen. Die einzige Sache in der wir wirklich brillieren
ist das Denken. Es stellt sich da die Frage, ob das überhaupt eine
Spezialisierung ist oder eher eine spezialisierte Plattform für eine
generalisierte Methode Probleme durch denken zu lösen.</p>
<p>Der Mensch hat sich an seine Umgebung über viele hunderttausend Jahre
angepasst. Handlungsweisen und Instinkte haben sich entwickelt, die
ein Leben in kleinen Gruppen in der "Wildnis" bei ständiger
Nahrungsmittelknappheit erleichtern.</p>
<p>Nun hat sich aber die menschliche Gesellschaft schnell entwickelt und
hat in wenigen hundert Jahren massiv an Komplexität gewonnen. Es
stellt sich die Frage, was Mechanismen sind, die in der vorherigen
Gesellschaft sinnvoll waren und funktioniert haben, aber uns jetzt
behindern.</p>
<p>Ich will drei Punkte aufzählen, von denen ich mir vorstellen kann,
dass der Mensch sich evolutionär anpasst. Diese Veränderungen könnten
stattfinden, wenn weiterhin komplexe Gesellschaftsformationen bestehen
und viele Milliarden Menschen den Planeten bevölkern. Die Zeiträume
werden allerdings sehr groß sein. Aber eins ist sicher: Wieso sollte
uns das unbeeinflusst lassen?</p>
<h3 id="gier">Gier</h3>
<p>In der feindlichen Natur macht es Sinn Nahrung dann aufzunehmen, wenn
sie vorhanden ist. Wenn wir irgendwo Beeren gefunden haben, und sie
gerade reif sind, sollten wir am besten alle zu uns nehmen. Wer mehr
Nahrung zu sich nimmt und dabei fett wird, hat eine bessere Chance den
nächsten Winter zu überleben. Gier nach Nahrung macht Sinn. Umso mehr
ich habe, umso besser sind meine Chancen zu überleben und ich kann
meine Gene weiter geben.</p>
<p>Was ist nun anders in der stark arbeitsteiligen Gesellschaft, in der
wir Leben? Nahrung ist immer verfügbar. Kalorienreiche Nahrung ist
sogar billiger, als kalorienarme Nahrung. Wir sind zudem vor dem
Winter um ein vielfaches besser geschützt, als dies früher der Fall
war. Es gibt also keinen Grund mehr, mehr Nahrung aufzunehmen, als wir
bis zur nächsten Mahlzeit verstoffwechseln. Aber wir befinden uns
weiterhin in einem andauernden Exzess; und dafür ist unsere Gier nicht
ausgelegt.</p>
<p>Unsere Gier hat, in der Situation eines endlosen Nahrungsstroms, aber
erhebliche Nachteile. Unsere Körper werden Übergewichtig und in folge
davon
krank. <a href="http://resonator-podcast.de/2015/res050-diabetes-und-adipositas/">Diabetis und Adipositas</a>
werden epidemisch und belasten sowohl den einzelnen, als auch die
sozialen Strukturen.</p>
<p>Aber unsere Gier beschränkt sich nicht nur auf Nahrung, sondern auch
auf andere Konsumgüter. Ich bin mir nicht sicher inwiefern der Drang
nach mehr "haben wollen" eine Übertragung der Gier nach Nahrung auf
andere Güter ist. Aber man kann es sicherlich als Gier
beschreiben. Dadurch betreiben wir eine systematische Ausbeutung der
Ressourcen der Erde auf Kosten nachfolgender Generationen. Und wir tun
dies entgegen besseren Wissens! Evolutionär völliger Käse. Jedenfalls
in komplexen menschengefüllten Systemen.</p>
<h3 id="angst">Angst</h3>
<p>Angst macht Sinn. Angst bewahrt uns vor gefährlichen
Situationen. Angst bewahrt uns davor es für eine gute Idee zu halten
in ein Rudel von Löwen zu gehen und sich dazukuscheln zu wollen. Angst
schüttet Adrenalin aus und bereitet den Körper auf Flucht oder Kampf
vor. Meistens sitzt man eh unter einem Baum und schnitzt einen Stock
zu. Fliehen war die Ausnahme.  Macht auch alles Sinn; jedenfalls, wenn
es etwas gibt vor dem man flüchten oder gegen das man Kämpfen kann.</p>
<p>Aber wir werden nicht mehr von dem großen Teil der Flora und Fauna
tyranisiert, sondern das Blatt hat sich gewendet. Solange wir in
Gemeinschaft sind müssen wir keine Angst mehr vor den meisten Dingen
der Umgebung haben.</p>
<p>Der Mechanismus allerdings, der ist noch da. Und er springt an. Auf
viele Dinge. Angst vor Dingen die unsere Existenz garnicht in Frage
stellen. Angst vor der Präsentation. Angst den Job zu verlieren. Angst
verlassen zu werden. Angst das Studium nicht zu schaffen. Das sind,
ohne Frage, alles unangenehme Dinge die man gerne Vermeiden möchte,
aber sie werden einen in den seltensten Fällen direkt, oder auch nur
indirekt, umbringen.</p>
<p>Stress wird häufig als andauernder Angstzustand, als ständiges
angespannt sein, beschrieben. Und Stress belastet die
Gesundheit. Cortisol unterdruckt das Immunsystem. Wer unter Stress
stand, zeigt häufig erst dann Symptome, wenn der Stress abgeklungen
ist. Und wer einmal mit Menschen, die unter einer Angststörung leiden,
zu tun hatte, der weiss auch wie schlimm die Angst das Leben belasten kann.</p>
<p>In einer Welt, die komplex ist und die sich ständig verändert, in der
ständig tausend Reize auf uns einfluten, ist es evolutionär eine dumme
Idee einen ständigen Angstzustand auszulößen. Vor allem, wenn unsere
Existenz von den "Gefahren" garnicht wirklich bedroht ist. Evolutionär
könnten wir daher eine erhöhte Angstschwelle entwickeln.</p>
<h3 id="tod-und-lebensdauer">Tod und Lebensdauer</h3>
<p>Tod ist der evolutionäre Motor. Wer wengier angepasst ist, der hat
eine höhere Mortalitätsrate. Keinen Tod mehr zu haben würde den
Stillstand der Entwicklung bedeuten. Jedenfalls wenn wir von
Individuuen ausgehen, die ihre Gensequenz nicht maßgeblich während
ihrer Lebenszeit ändern.</p>
<p>Im Vergleich zu den meisten Tieren ist unsere Lebensspanne schon relativ
lange. Außerdem sterben menschliche Individuen nicht kurz nach ihrer
Zeugungsunfähigkeit
(<a href="https://de.wikipedia.org/wiki/Großmutter-Hypothese">Grossmutter-Hypothese</a>). Find
ich persöhnlich ja auch eine gute Sache, dass das so ist.</p>
<p>Aber unsere Lebensspanne ist nur relativ lange im Vergleich zum Zyklus
der Jahre auf der Erde. In dem Moment in dem wir die Erde verlassen
wollen, ist sie unsere größte Beschränkung. Das Universum lässt es
nicht zu, dass wir mit mehr als Lichtgeschwindigkeit reisen. Daher ist
eigentlich unsere einzige andere Stellschraube, wie wir interstellare
Reisen bei realistischen Geschwindigkeiten durchführen können, lange
zu leben.</p>
<p>Auf lange Sicht wird es ein evolutionärer Vorteil sein sich an die
Zeitskalen des Universums anzupassen. Dies mag dann sogar den Nachteil
des langsameren Evolutionsmechanismus ausgleichen. Außerdem zeigt sich
dann vielleicht auch ein höhreres Maß an Binnen-Evolution, bei der
sich einzelne mutierte Zellen innerhalb eines Organismus als
Vorteilhaft erweisen und sich durchsetzen.</p>]]></content>
    </entry>
     <entry>
        <title type="text">Vernunft- und Tatsachenwahrheiten</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2015-10-06-Vernunft-und-Tatsachenwahrheiten.html" />
        <id>urn:uuid:e13c31e4-9d42-5f47-bbd9-ceb048773101</id>
        <updated>2015-10-06T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Dieser Beitrag ist eine Erwiderung auf den Blogbeitrag von
<a href="https://blog.maxfragg.de/major-consensus-narrative/">Maxfragg</a> vom 5.
Oktober 2015. Er hat dort beleuchtet, dass wir bisher einen "Major
Consensus Narrative" <em>(MCN)</em> hatten, der durch die Medien vermittelt
wurde. Dieser MCN behauptet von sich die "Wahrheit" zu sein; die
"Tagesschauwahrheit".</p>
<p>Maxfragg stellte sich nun die Frage, was mit diesem MCN passiert, wenn
wir eine vielfältigere Berichterstattung haben. Jeder kann sich dann
seine ganz persöhnliche Wahrheit aus verschiedenen Quellen
zusammenstellen, die seine Realität beschreibt. Der eine ließt SPON und
schaut die Tagesschau, der andere ließt PI und glaubt an die
"Lügenpresse". Brauchen wir dann noch eine Wahrheit? Darauf will ich
einige Gedanken verwenden.</p>
<p>Zunächst will ich seinem Aufruf nachgehen, zu zeigen, dass es eine
"echte" Wahrheit geben muss. Danach will ich darauf eingehen, wie
Vernunft- und Tatsachenwahrheiten sich unterscheiden und die
"wissenschaftliche" Wahrheit sich von der "historischen" Wahrheit
unterscheiden. Das Ergebnis der Untersuchung wird sein, dass wir
zwischen Wahrheiten und Hypothesenräumen unterscheiden müssen und der
MCN ein Hypothesenraum ist, der die Wahrheit beinhalten kann.</p>
<p>Gibt es Wahrheit? Ist das überhaupt die richtige Frage? Wir tun uns
schwer damit, die Frage zu beantworten, daher beantworte ich zunächst
eine andere (in guter Sonnebornscher Manier): Gibt es das Gegenteil von
Wahrheit? Und da müssen wir doch sagen: ja, gibt es. Bei manchen Dingen
können wir uns sicher sein, dass sie nicht wahr sind, dass die Welt so
nicht beschaffen ist. Ein Beispiel: Der Satz "jeder Mensch kann ohne
Kopf Leben mehrere Jahre leben" ist nicht wahr. Es gibt mindestens ein
Gegenbeispiel. Der Satz kann nicht wahr sein.</p>
<p>  <img class="centered img-responssive d-block" src="posts/truth.png" alt="Zwei Hypothesenraeume"/>
</p>
<p>Es gibt also einen Bereich von Sätzen/Hypothesen/Aussagen die nicht wahr
sind. Wir haben über die letzten 2500 Jahre die wissenschaftliche
Methode entwickelt, um Hypothesen zu falsifizieren. Das Ergebnis dieser
Methode ist allerdings nicht die Wahrheit an sich, sondern ein Kreis der
sich immer Enger zieht. Außerhalb des Kreises sind all die
falsifizierten Aussagen, innen die bisher nicht bewiesenen aber noch
nicht wiederlegten Hypothesen. Die Menge innerhalb des Kreises ist ein
Hypothesenraum.</p>
<p>Das kleine Bildchen soll das Verhältnis von Wahrheit und Hypothesenraum
verdeutlichen. Die wissenschaftliche Methode ist nun ein Druck der von
Aussen der auf den Hypothesenraum drückt, und versucht den Kreis enger
zu ziehen. Innerhalb des Kreises nehmen wir mal einen Punkt an, der
beschreibt wie die Welt wirklich ist, wie sich das Universum verhält.
Also was denn tatsächlich passiert. Wir nennen diesen Punkt mal
"Wahrheit", auch wenn wir ihn nicht an sich ausmachen können; wir können
nur sagen wo er nicht ist.</p>
<p>Was sich daraus nicht direkt ergibt ist, ob es nur einen solchen Punkt
gibt, oder mehrere (rechte Bildhälfte). Aber geben muss es mindestens
einen, da das Universum sich ja irgendwie verhält. Bisher haben wir
keine Annahme zu glauben, dass das Universum sich <strong>gleichzeitig</strong> so
und so verhält. Es kann sich in jeder Situation anders verhalten, aber
zu einem Zeitpunkt verhält sich das Universum auf jeden Fall irgendwie.
Daher ist "eine Wahrheit" eine Hypothese, die sich bisher recht gut
macht.</p>
<p>Gut, soweit so kompliziert. Jetzt dieses MCN Konzept. Bei <a href="https://de.wikipedia.org/wiki/Hannah_Arendt">Hannah
Arendt</a> habe ich die
Unterscheidung zwischen Vernunftwahrheiten und Tatsachenwahrheiten
gelernt (<a href="https://de.wikipedia.org/wiki/Wahrheit_und_Politik">Wahrheit und Politik, H. Arendt,
1964</a>,
<a href="https://www.youtube.com/watch?v=helZc310GBM">Tonmitschnitt von
Arendt</a>).</p>
<p>Vernunftwahrheiten können durch Experiment und Nachdenken jederzeit
erkannt werden. In diesen Bereich fallen alle physikalischen Gesetze.
Würden wir heute die Relativitätstheorie verlieren, so könnte sie in
10.000 Jahren von eine Lebenwesen auf einem anderen Planeten wieder
entdeckt werden. Eine Vernunftwahrheit kann wiederholt untersucht
werden, denn sie gehören zur Stuktur des Universums. Man kann sie auch
"objektive Wahrheiten" nennen.</p>
<p>Tatsachenwahrheiten beziehen sich auf singuläre Ereignisse. So ist die
Aussage, dass Konrad Adenauer Bundeskanzler war, eine Tatsachenwahrheit.
Diese Klasse von Wahrheiten, sind viel leichter zu manipulieren. Arendt
bringt hier das Beispiel von der Rolle Trotzkis in der Russischen
Revolution. Dort hat sich Stalin an der Tatsachenwahrheit vergangen und
Trotzki aus den Geschichtsbüchern getilgt. Dieses Manipulation ist
besonders schändlich, da sie Wahrheiten für immer tilgt. Ein
historisches Ereignis kann nur einmal "gemessen" werden. Kein Mensch
kann eine Tatsachenwahrheit wiederbeleben, wenn erst einmal die perfekte
Lüge von allen Menschen geglaubt wird und alle Beweise gefälscht wurden.
Man könnte Tatsachenwahrheiten also auch "historische Wahrheiten"
nennen.</p>
<p>Der Verlust des MCNs ist nun das Vorhandensein mehrerer solcher Räume
die sich teilweise überlappen und unter Umständen die Tatsachenwahrheit
beinhalten. Das heisst aber nicht, dass es für eine Sache keine
Tatsachenwahrheit mehr gibt. Man ist nur leichter Bereit zu sagen: "ach,
ist doch eh alles egal, hat doch jeder seine Wahrheit". Aber dem ist
nicht so, nicht jeder hat seine Wahrheit, sondern jeder hat einen
anderen Hypothesenraum. Der Wahrheit tut das keinen Abbruch, den für
eine historische Wahrheit ist sicher: für den Zeitpunkt um den es geht
hat sich das Universum irgendwie verhalten.</p>
<p>Wenn Maxfragg also jetzt über den MCN schreibt, dann bezieht sich dieser
MCN meist auf historische Wahrheiten und ist ein Hypothesenraum. Dieser
MCN kann nun aktiv Aussagen vertreten, die Ausserhalb des aktuellen
Hypothesenraumes liegen; lügen wider besseren wissens. Der MCN übt
dadurch Druck aus und verschiebt den Hypothesenraum. Mittels der
perfekten Lüge verschiebt man den Raum soweit, dass die
Tatsachenwahrheit sich nicht mehr innerhalb befindet. Die
Tatsachenwahrheit ist für immer verloren, weil wir nicht nochmal messen
können.</p>
<p>Wir dürfen nicht zulassen, dass wir die Tatsachenwahrheiten verlieren,
denn einmal verloren, sind sie für immer vergangen.</p>]]></content>
    </entry>
     <entry>
        <title type="text">Technik, die begeistert</title>
        <author name="Christian Dietrich"/>
        <link rel="alternate" type="text/html" href="../../../../../../posts/2015-09-08-Technik-die-begeistert.html" />
        <id>urn:uuid:a89802ec-d928-5b10-b11f-3d2eaa6f5e13</id>
        <updated>2015-09-18T08:00:00Z</updated>
        <content type="html"><![CDATA[<p>Dieser Post ist das Ergebnis mehrerer Begegnungen mit meinen Kollegen
und es ist mein Ziel darzulegen, welche meine Beweggründe in einem
ganz speziellen, eng abgesteckten Bereich sind und wie ich hier zu
meinen Überzeugungen gekommen bin. Ziel ist es nicht meine Ansicht
anderen überzuhelfen, sondern nur sie verständlich zu machen.</p>
<p>An meiner Arbeitsstelle bekommen alle Mitarbeiter die Chance einen
Dienstlaptop zu kaufen. In den meisten Fällen fällt die Entscheidung
auf einen Apple Laptop. Und so stand auch ich am Beginn meiner
Anstellung als wissenschaftlicher Mitarbeiter vor der Frage, ob und
welchen mobilen Rechner ich mir zulegen will.</p>
<p>Allerdings habe ich mich aktiv gegen das Kaufen
entschieden. Stattdessen verwende ich seit geraumer Zeit ein mehrere
Jahre altes Gerät, dass einer meiner Kollegen durch ein Neues ersetzt
hat. Es funktioniert noch hervorragend, ist nur nicht mehr auf dem
"aktuellen Stand der Technik". Was ich mir habe leisten lassen war ein
Hardwareupgrade (RAM, Festplatte) für einige hundert Euro.</p>
<p>Meine bewusste Entscheidung gegen die Neuanschaffung hat mehrere
Gründe. Zum einen, ist der Stand der Technik von vor 5 Jahren für die
allermeisten meiner Anforderungen völlig ausreichend. Es hat seitdem
einfach nur in sehr begrenztem Maße bahnbrechende Verbesserungen
gegeben. Nur in einigen Bereichen (Retina-Displays, Akkulaufzeit) ist
eine wirkliche Verbesserung spürbar geworden. Brauche ich doch einmal
mehr Rechenleistung muss ich diese eh auf größere Infrastruktur
ausweichen.</p>
<p>Zum anderen sehe ich es nicht ein, ein völlig funktionsfähiges Gerät
auszumustern oder in den Schrank zu legen, nur weil es einige Jahre
alt ist. Alter ist kein Problem an sich. Selbstverständlich erhöht
sich das Ausfallrisiko einiger Komponenten mit den Jahren, was durch
vergangene Komponententauschungen bei diesem Gerät in geringerem Maße
zutrifft. Eine Neuanschaffung hingegen ist immer auch
Ressourcenverbrauch. Bei der Produktion wird sowohl Energie, als auch
andere endliche Ressourcen unseres Planeten verbraucht. Konkret diese
Ressourcen werden unsere Nachkommen nicht mehr haben. Und Menschen
müssen dafür Arbeiten, damit ich ein neues Gerät in Händen halten
kann.</p>
<p>Unser ständiger Wunsch nach den neusten Geräten ist mit einem enormen
Ressourcenverbrauch verbunden. Jedes neue technische Spielzeug, von
denen wir ja sehr viele haben und haben wollen, bindet
Ressourcen. Umso häufiger wir diese wechseln, umso höher wird der
Verbrauch. Und solange keine Not besteht, solange will ich diesen
Verbrauch hinauszögern soweit es geht.</p>
<p>Außerdem ist Konsum anstregend. Ich will mich nicht ständig mit den
neuesten Laptops, Handys, E-Book Readern, Smartwatches und
Bildschirmen auseinander setzen. Ich weiss besseres mit meiner Zeit
anzufangen. Für mich wiegt das kurzfristige Belohnungsgefühl beim Kauf
eines neuen Gerätes nicht mehr den Zeitaufwand der Anschaffung auf.</p>
<p>Ein anderer Grund der speziell für die Informatik ist und der über
dieses eine konkrete Gerät hinaus geht ist ein eher Ideelles. Mit
unendlichen Ressourcen kann ich in der Informatik das allermeiste
bewältigen. Probleme können häufig durch teurere Hardware erschlagen
werden. Aber wir wissen auch, dass alle Rechner prinzipiell gleich
mächtig sind, wenn wir sie einmal als angenäherte Turing-Maschine
begreifen. Die Kunst eines guten Programmiers ist es aus wenigen
Ressourcen alles rauszuholen was geht. Das ist Kunst: <em>aus (fast)
nichts (fast) alles machen</em>.</p>
<p>Und dies trifft auch gerade in dem Bereich der Informatik mit dem ich
mich beschäftige zu. Betriebssysteme will niemand haben; niemand will
seine kostbaren Rechenzyklen dafür hergeben, dass das Betriebssystem
irgendwelchen Quatsch berechnet. Am besten das Betriebssystem wäre
garnicht da. Hier, und noch viel mehr im Bereich der eingebetten
Systeme, kommt es im Besonderen darauf an Ressourceneffizient zu
arbeiten. Ich sehe allerdings, dass dieser Geist und diese Freude am
Minimalismus nicht mehr so populär ist.</p>
<p>Ich jedenfalls werde die Benutzung dieses Laptops solange ausdehen,
wie das nur überhaupt möglich ist.</p>]]></content>
    </entry>

</feed>
