<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Daniels Blog</title><link href="https://www.dj-bauer.de/" rel="alternate"/><link href="https://www.dj-bauer.de/feeds/all.atom.xml" rel="self"/><id>https://www.dj-bauer.de/</id><updated>2025-10-19T20:38:00+02:00</updated><entry><title>Netbox as ansible inventory plugin</title><link href="https://www.dj-bauer.de/netbox-as-ansible-inventory-plugin-en.html" rel="alternate"/><published>2025-10-19T20:38:00+02:00</published><updated>2025-10-19T20:38:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-10-19:/netbox-as-ansible-inventory-plugin-en.html</id><summary type="html">&lt;p&gt;After documenting all my infrastructure in Netbox the next logical step is using my Source of Truth to automate configuration application&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm using the community edition of &lt;a href="https://github.com/netbox-community/netbox"&gt;Netbox&lt;/a&gt;
to document all my &lt;em&gt;IPAM&lt;/em&gt; (IP-Address-Management), DNS and general infrastructure.
The long-term goal is to deploy as much of the configuration from Netbox to reality through
different means.&lt;/p&gt;
&lt;p&gt;The first Configuration via Netbox should be my Bind9 DNS-Server,
where I deploy it via Ansible.
For that Ansible uses the Netbox-Plugin to fill the dynamic inventory.
Many guides simply paste the sample inventory without any explanation and show
how to run it.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;netbox.netbox.nb_inventory&lt;/span&gt;
&lt;span class="nt"&gt;validate_certs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="nt"&gt;group_by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;device_roles&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;sites&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I created a readonly API-Key.
The Netbox-Url and Key are set via the Environment variables &lt;strong&gt;NETBOX_TOKEN&lt;/strong&gt; and &lt;strong&gt;NETBOX_API&lt;/strong&gt; for the URL, like &lt;code&gt;https://netbox.homelab.internal&lt;/code&gt;.
The inventory can me checked with &lt;code&gt;ansible-inventory --list -i netbox_inv.yaml&lt;/code&gt;
and uses the environment variables for accessing the instance.&lt;/p&gt;
&lt;p&gt;To further inspect all the data provided by the netbox-inventory use &lt;code&gt;ansible-inventory -i netbox_inv.yml --host &amp;lt;hostname&amp;gt;&lt;/code&gt;.
Any more informations have to be registered as variables through api-calls via ansible.&lt;/p&gt;
&lt;p&gt;I'm also using config contexts in Netbox.
By default the ansible inventory plugin only shows local context configs.
For my config contexts to show up in the inventory &lt;code&gt;config_context: true&lt;/code&gt; needs to be set in the inventory-configuration.&lt;/p&gt;</content><category term="Selfhosting"/><category term="selfhosting"/><category term="ansible"/><category term="netbox"/><category term="automation"/></entry><entry><title>Basic LLM Crawler block in NGINX using User-Agents</title><link href="https://www.dj-bauer.de/basic-llm-crawler-block-in-nginx-using-user-agents-en.html" rel="alternate"/><published>2025-09-27T16:28:00+02:00</published><updated>2025-09-27T16:28:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-09-27:/basic-llm-crawler-block-in-nginx-using-user-agents-en.html</id><summary type="html">&lt;p&gt;Most web traffic on my blog was obviously caused by crawlers. And most of those still use proper User-Agents which can be blocked very simply.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This solution is by far not perfect and can be improved/automated/updated in
many different ways.
It took me only 10 minutes to implement though and basically reduce my web traffic by 80%.&lt;/p&gt;
&lt;p&gt;I simply use the &lt;code&gt;ngx_http_map_module&lt;/code&gt;, which allows me to have a variable
depend on the value of another variable.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;map $http_user_agent $blocked_user_agent {
  default 0;
  ~*amazonbot 1;
  ~*openai 1; 
  ~*chatgpt 1; 
  ~*gptbot 1; 
  ~*claudebot 1; 
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The nginx expression &lt;em&gt;~*term&lt;/em&gt; matches case-insensitively for the occurence of
the string at any position.
This map finds its place somewhere in the http-section in my &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I simply checked my nginx access-files to find the most commonly used crawlers
in the user agent.&lt;/p&gt;
&lt;p&gt;To then apply and test for the filter I run a simple if-statement before returning any files or proxying in the server.
The error code i have selected is &lt;a href="https://http.cat/450"&gt;450&lt;/a&gt;, but any code can be really used.&lt;/p&gt;
&lt;p&gt;For example&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;server {
    ....
    location / {
        if ($blocked_user_agent) {
            return 450; # Blocked by Windows Parental Controls
        }
        try_files ...;
    }
}
&lt;/pre&gt;&lt;/div&gt;</content><category term="Selfhosting"/><category term="selfhosting"/><category term="server"/><category term="nginx"/></entry><entry><title>DIY Selfbuilt Reflow-Soldering Oven</title><link href="https://www.dj-bauer.de/diy-selfbuilt-reflow-soldering-oven-en.html" rel="alternate"/><published>2025-09-24T12:57:00+02:00</published><updated>2025-09-24T12:57:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-09-24:/diy-selfbuilt-reflow-soldering-oven-en.html</id><summary type="html">&lt;p&gt;As my journey into hardware development and manufacturing methods get more serious I wanted to move away from my small DIY hotplate and build my own serious reflow oven for precise soldering.&lt;/p&gt;</summary><content type="html">&lt;p&gt;My journey through electronics manufacturing has brought me from THT-soldering
to SMD-soldering to assembly-services and now reflow-soldering.
Reflow-soldering is the process of applying soldering paste either by hand or through a stencil onto a circuit board to then place all the components on top.
That assembly will then be evenly heated up for the soldering paste to liquify and solder everything through.
This method allows for very fine contacts (0402 resistors are still doable with a steady hand to place) and high component counts.
In the past I have used a Hotplate, that would heat up the soldering past to the required temperature.&lt;/p&gt;
&lt;p&gt;I decided mostly for the joy of it, secondary for a finer temperature control to build a DIY
reflow oven.
A fully encased converted Toaster-Oven that can follow a predefined temperature curve to match the soldering pastes specification as best as i can.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The reflow oven after it has followed a temperature profile" src="https://www.dj-bauer.de/images/20250924_oven_cooling.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I decided to use the &lt;a href="https://reflowmasterpro.com/"&gt;Unexpected Makers Reflow Master&lt;/a&gt;.
But instead of buing the new fancy version i wanted to assemble my own controller, so i took a look at the now Open-Source predecessor ReflowMaster.
I converted his project into kicad and added SWD flashing pins and USB-C into my own &lt;a href="https://codeberg.org/dj-bauer/ReflowMaster"&gt;Fork&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The electrical layout is almost identical.
I ordered all the parts of LCSC and the PCBs at JLCPCB and procrastinated many
months before finally assembling everything in fear of having made an expensive mistake.
I assembled everything on &lt;a href="https://github.com/DerSpatz/PCB-reflow-solder-heat-plate"&gt;this&lt;/a&gt; DIY hotplate.
&lt;img alt="DIY PCB base hotplate" src="https://www.dj-bauer.de/images/20250924_hotplate.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Luckily everything worked out of the box including the SWD bootloader and firmware flashing
and my controller is now flashable via USB-C.
&lt;img alt="The reflow controlle board on a Yellow PCB" src="https://www.dj-bauer.de/images/20250924_controller.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The rest of the hardware is relatively simple and mostly described in other guides for the ReflowMaster.
A display on aliexpress, K-Type temperature probes and a solid-state-relay to PWM-control 230V AC using 3.3V DC TTL.
The Oven is just a regular Toaster Oven.
I found this one for 55€ during a sale of a Supermarket in Germany and with 1.5kW it has
just enough power to heat.
I covered the inside of the oven in Gold-Foil to reflect as much heat as possible.
Without additional insulation-padding between the inside and outside wall the outside oven will not get uncomfortably hot, although a piece of glaswoll or similar would propably improve heating performance.&lt;/p&gt;
&lt;p&gt;At this point the oven if functional and passes the firmware tests and I will soon start creating the first test PCBs with it.&lt;/p&gt;
&lt;p&gt;If anybody is interested in more details about the electrical design, flashing, assembly or else, please shoot me an email and I'll expand on it&lt;/p&gt;</content><category term="Hardware"/><category term="electronics"/><category term="diy"/><category term="openSource"/><category term="soldering"/></entry><entry><title>Homeassistant Unwetternotifications auf Smartclock</title><link href="https://www.dj-bauer.de/homeassistant-unwetternotifications-auf-smartclock.html" rel="alternate"/><published>2025-06-11T21:58:00+02:00</published><updated>2025-06-11T21:58:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-06-11:/homeassistant-unwetternotifications-auf-smartclock.html</id><summary type="html">&lt;p&gt;Die Ulanzi Smartclock ist über Awtrix in MQTT in Homeassistant einbindbar. So habe ich ein einfaches Unwetter-Notifications gebastelt und nebenbei ein universelles Notification-Template geschrieben.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Uhransicht einer Ulanzi Smartclock mit Awtrix Firmware" src="https://www.dj-bauer.de/images/20250612_PXL_20250611_195856113.MP.jpg" /&gt;
Dieses Projekt ist durch &lt;a href="https://github.com/jc-23/home-assistant/tree/main"&gt;jc-23&lt;/a&gt; inspiriert.&lt;/p&gt;
&lt;p&gt;Ich setze vorraus, dass in Homeassistant MQTT  eingerichtet und erreichbar ist.
Auch benutzt die später eingesetzte Blueprint die NINA-Integration.
Für die soll also auch ein Sensor eingerichtet werden.&lt;/p&gt;
&lt;p&gt;Der erste Schritt ist es &lt;a href="https://blueforcer.github.io/awtrix3/#/flasher"&gt;Awtrix3&lt;/a&gt; auf die Smartclock zu flashen und einzurichten. 
Das ist auf Youtube und ganz vielen anderen Seiten schon zahlreich dokumentiert.&lt;/p&gt;
&lt;h2 id="homeassistant-script"&gt;Homeassistant Script&lt;/h2&gt;
&lt;p&gt;Awtrix hat eine Vielzahl an &lt;a href="https://blueforcer.github.io/awtrix3/#/api"&gt;API&lt;/a&gt;-Endpoints über MQTT anzubieten.
Die Grundlage für alles stelle ich mit meinem Homeassistant-Script &lt;a href="https://www.dj-bauer.de/files/awtrix-script.yaml" download&gt;Homeassistant-Script&lt;/a&gt; dar.
Dazu muss man in Homeassistant ein Script erstellen und kann im YAML-Editor
einfügen.
Dieses Script ist ein gutes General-Purpose-Interface um mit der Smartclock zu interagieren.
Apps (permanent und rotierende Notifications) sind noch nicht implementiert,
sollte aber in der Zukunft folgen.
In den Entwickleroptionen kann man die ganzen Funktionen von diesem Skript sehen.&lt;/p&gt;
&lt;h2 id="icons-auf-die-uhr-installieren"&gt;Icons auf die Uhr installieren&lt;/h2&gt;
&lt;p&gt;Ursprünglich bin ich erst durch &lt;a href="https://github.com/jc-23/home-assistant/tree/main"&gt;dieses Projekt&lt;/a&gt; inspiriert worden.
Da mir allerdings nicht auf Anhieb funktioniert hat, habe ich meine eigene Blueprint geschrieben.
Jedoch verwenden wir weiterhin sein &lt;a href="https://raw.githubusercontent.com/jc-23/home-assistant/master/icons/upload_icon.sh"&gt;Skript zur Installation&lt;/a&gt; von den entsprechenden icons auf der Uhr.
Das muss einmal auf den lokalen Computer runtergeladen werden und ausgeführt werden.&lt;/p&gt;
&lt;h2 id="unwetter-blueprint"&gt;Unwetter-Blueprint&lt;/h2&gt;
&lt;p&gt;Zuguterletzt muss nur noch in Homeassistant eine neue Blueprint hinzugefügt werden.
Im Yaml Editor soll der Code &lt;a href="https://www.dj-bauer.de/files/awtrix_warnungen.yaml" download&gt;dieses files&lt;/a&gt; eingefügt werden.
Wenn wir nun diese Blueprint instantiaten brauchen wir die ID der awtrix-uhr.
Diese sollten wir bei der installation von awtrix im webinterface gefunden haben.
Als warnungs-source benutze ich den Nina-Sensor.&lt;/p&gt;</content><category term="Smarthome"/><category term="homeassistant"/></entry><entry><title>RHEL10 als daily driver</title><link href="https://www.dj-bauer.de/rhel10-als-daily-driver.html" rel="alternate"/><published>2025-05-29T17:24:00+02:00</published><updated>2025-05-29T17:24:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-05-29:/rhel10-als-daily-driver.html</id><summary type="html">&lt;p&gt;Nachdem mir Artix-Linux als Daily-Driver auf meinem Laptop zu langweilig wurde wollte ich eine neue Distro ausprobieren. Aus diversen Gründen bin ich bei RHEL gelandet.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nachdem ich die letzten 6 Jahre lang &lt;a href="https://artixlinux.org"&gt;Artixlinux&lt;/a&gt; (ein Fork von Archlinux ohne SystemD)
benutzt habe wollte ich etwas neues ausprobieren und weiter lernen.
Ich hatte zwischendurch einige male mit &lt;a href="/my-gentoo-build-setup-en.html"&gt;Gentoo&lt;/a&gt; geliebäugelt, jedoch nie warm geworden.
Da ich beruflich immer mehr mit RHEL-Derivaten in Berührung komme wollte ich nun
vollständig das Redhat-Ökosystem ausprobieren.
Nachdem ich von der Redhat Developer Lizenz erfahren habe, 
habe ich mich also an einem Wochenende nach einem ordendlichen letzten Backup 
kurzerhand dazu entschlossen meinen Laptop mit RHEL10 neu zu installieren, 
da ich diesen besonders in der Uni die längste Zeit am Tag verwende.&lt;/p&gt;
&lt;p&gt;Obwohl ich erst vor nicht so langer Zeit zu Wayland mit &lt;a href="https://hyprland.org"&gt;Hyprland&lt;/a&gt;
gewechselt bin, wollte ich meine Hyprland-Konfiguration allem drum-und-dran mitnehmen
Mir war von Begin an klar, dass dieser Bleeding-Edge-Desktop ein starker Widerspruch 
zu den konservativen Packeten von RHEL.
Ich habe das als Challenge genommen.&lt;/p&gt;
&lt;p&gt;Der Anaconda-Installer ist immer noch einer der einfachsten und simpelsten
Installer die ich kenne, auch wenn ich in der Vergangenheit viel Zeit in dessen
manueller Partitionierung verbracht habe.
Dieses mal aber gar kein Problem.
Der einzige Unterschied zu einer Almalinux-Installation war die Eingabe meines
RedHat-Accounts.
Da ich ein großer Anhänger von Terminal-Applikationen und tiling Window-Manager
bin, war mir klar, dass ich einiges selber bauen werden muss.
Um mit einer möglichst minimalen Basis anzufangen habe ich deshalb das 
&lt;strong&gt;Minimal-Server&lt;/strong&gt; Installationprofil gewählt.&lt;/p&gt;
&lt;h1 id="tag-1"&gt;Tag 1&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Tag 1&lt;/strong&gt; bestand dann hauptsächlich daraus sich mit dnf und rpmbuild vertraut zu machen 
und das erste Hello-World Packet zu bauen.
Der gesammte Prozess ist in der RedHat Wissensbasis wirklich besser 
dokumentiert als irgendwelche (oft KI-generierten) Blog-Artikel.
Ebenfalls habe ich direkt angefangen ein eigenes &lt;a href="https://rpm.dj-bauer.de"&gt;RPM-Repository&lt;/a&gt;
einzurichten um mir das Packet-Management einfacher zu machen.&lt;/p&gt;
&lt;h2 id="beispiel-paket-spezifikation"&gt;Beispiel-Paket Spezifikation&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gh"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hello_world
&lt;span class="gh"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;1.0
&lt;span class="gh"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;1&lt;span class="nv"&gt;%{?dist}&lt;/span&gt;
&lt;span class="gh"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;simple&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;world&lt;span class="w"&gt; &lt;/span&gt;program

&lt;span class="gh"&gt;License&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GPLv3+
&lt;span class="gh"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;http://dj-bauer.de/rhel10-als-daily-driver.html
&lt;span class="gh"&gt;Source0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;%{name}&lt;/span&gt;-&lt;span class="kc"&gt;%{version}&lt;/span&gt;.tar.gz

&lt;span class="gh"&gt;BuildRequires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gcc

%Description
A&lt;span class="w"&gt; &lt;/span&gt;simple&lt;span class="w"&gt; &lt;/span&gt;Hello&lt;span class="w"&gt; &lt;/span&gt;World&lt;span class="w"&gt; &lt;/span&gt;programm&lt;span class="w"&gt; &lt;/span&gt;written&lt;span class="w"&gt; &lt;/span&gt;in&lt;span class="w"&gt; &lt;/span&gt;C.

&lt;span class="nd"&gt;%prep&lt;/span&gt;
&lt;span class="k"&gt;%setup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-q

&lt;span class="nd"&gt;%build&lt;/span&gt;
gcc&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;hello.c

&lt;span class="nd"&gt;%install&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;$RPM_BUILD_ROOT&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;$RPM_BUILD_ROOT&lt;/span&gt;/&lt;span class="kp"&gt;%{_bindir}&lt;/span&gt;
install&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;0755&lt;span class="w"&gt; &lt;/span&gt;hello&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;$RPM_BUILD_ROOT&lt;/span&gt;/&lt;span class="kp"&gt;%{_bindir}&lt;/span&gt;

&lt;span class="nd"&gt;%clean&lt;/span&gt;
rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;$RPM_BUILD_ROOT&lt;/span&gt;

&lt;span class="nd"&gt;%files&lt;/span&gt;
&lt;span class="kp"&gt;%{_bindir}&lt;/span&gt;/hello

&lt;span class="nd"&gt;%changelog&lt;/span&gt;
&lt;span class="gu"&gt;*  Mon May 26 2025 DJ&lt;/span&gt;
-&lt;span class="w"&gt; &lt;/span&gt;First&lt;span class="w"&gt; &lt;/span&gt;Release
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="tag-2"&gt;Tag 2&lt;/h1&gt;
&lt;p&gt;An &lt;strong&gt;Tag 2&lt;/strong&gt; habe ich einiges zu &lt;em&gt;rpmbuild&lt;/em&gt; gelernt und angefangen mich an den
Abhängigkeiten von Hyprland entlangzuhangeln bis ich irgendwann am Ende des Tages
Firefox starten konnte.
Bis dahin habe ich entweder zuhause per ssh von einem Desktop oder in der Bahn
mit tmux im TTY auf dem Laptop packetiert.
Das hat sich auch immer noch nicht geändert, weil ich mir als Ziel gesetzt habe
als nächstes den Terminal-Emulator foot zu packetieren.&lt;/p&gt;
&lt;h1 id="tag-3"&gt;Tag 3&lt;/h1&gt;
&lt;p&gt;Dies ist mir folglich an &lt;strong&gt;Tag 3&lt;/strong&gt; gelungen und so konnte ich dann quasi in der
Uni produktiv arbeiten.
Mit einem Terminal und webbrowser konnte ich erstaunlich viel machen.
Die nächsten Ziele waren RSS-Reader (irgendwie muss ich mich ja jetzt selbstständig
über die Programm-updates informieren) und &lt;a href="/once-forever-mutt-configuration-en.html"&gt;neomutt&lt;/a&gt;, mein Mailclient.&lt;/p&gt;
&lt;h1 id="tag-4"&gt;Tag 4&lt;/h1&gt;
&lt;p&gt;Heute ist &lt;strong&gt;Tag 4&lt;/strong&gt; und ich habe vorrangig die desktop-Konfiguration mittels Ansible verbessert,
und Paket-Abhängigkeiten repariert.
In meinen Paketen sind höchstwarscheinlich immer noch einige Fehler drinne, 
welche ich mit der Zeit beheben werde.
Falls irgendjemand das Repo nutzen sollte oder ausprobiert, immer gerne Feedback.
Die nächsten Schritte werden die Vervollständigung von Mail mit &lt;em&gt;offlineimap&lt;/em&gt; und &lt;em&gt;notmuch&lt;/em&gt;, Matrix mit &lt;em&gt;iamb&lt;/em&gt;, auf das epel warten, dass Gnucash von fedoras Seite aus paketiert wird und mehr.&lt;/p&gt;
&lt;h1 id="fazit"&gt;Fazit&lt;/h1&gt;
&lt;p&gt;Grundsätzlich ist aber meine minimale Installation vollständig Nutzbar und sollte dem Universitäts-Alltag entsprechen.
Falls es Menschen geben sollte, die sich die Pakete anschauen möchten, so findet sich &lt;a href="https://rpm.dj-bauer.de"&gt;hier&lt;/a&gt; das Repository der Pakete und die .spec Definionen liegen auf &lt;a href="https://codeberg.org/dj-bauer"&gt;Codeberg&lt;/a&gt;
Es wird aber sicherlich noch um einiges weitergehen und ich bin gespannt welche über welche Hürden ich stolpern werde.&lt;/p&gt;</content><category term="Ricing"/><category term="RHEL"/><category term="rpm"/><category term="RHEL10"/></entry><entry><title>IntelNUC CEC-Mod</title><link href="https://www.dj-bauer.de/intelnuc-cec-mod-en.html" rel="alternate"/><published>2025-05-21T12:14:00+02:00</published><updated>2025-05-21T12:14:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-05-21:/intelnuc-cec-mod-en.html</id><summary type="html">&lt;p&gt;Intel NUCs eigenen sich hervorragend als Kodi-Media Center. Jedoch unterstützen diese nicht das volle HDMI-CEC Protokoll.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="#schwierigkeiten-mit-hyperion"&gt;Problem mit Hyperion CEC&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ich hoste Kodi mit einem normalen &lt;strong&gt;LibreELEC&lt;/strong&gt; auf einem NUC 8th gen.
Damit Kodi mit der Fernbedienung kontrolliert werden kann braucht der Computer CEC-Support.
RaspberryPis sind dafür bekannt von Werk aus die erforderlichen CEC-Funktionen zu haben.
Ansonsten haben fast keine anderen Geräte CEC-Support.&lt;/p&gt;
&lt;p&gt;Intel-NUCs teils an CEC zu unterstützen, allerdings wird dabei nur eine Teilmenge der Funktionen unterstützt.
Damit Kodi mit der Fernbedienung gesteuert werden kann braucht es einen CEC-Adapter.
&lt;a href="https://www.pulse-eight.com/p/154/intel-nuc-hdmi-cec-adapter"&gt;Pulse-Eight&lt;/a&gt; bietet neben einem USB-Modul einen Adapter, den man in den NUC einbauen kann und somit ganz verschwindet.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Der CEC-Stecker am NUC eingesteckt" src="https://www.dj-bauer.de/images/20250521_PXL_20250521_100548413.MP.jpg" /&gt;
Die Installation ist ganz einfach der Herstellerdokumentation zu folgen.
Es müssen zwei Stecker in den NUC eingesteckt werden.
&lt;img alt="Der USB-Stecker am NUC eingesteckt" src="https://www.dj-bauer.de/images/20250521_PXL_20250521_100548413.MP.jpg" /&gt;
Die Kleine Platine habe ich einfach an den Gehäusedeckel geklebt und noch mit Isolierband für den Fall der Fälle abgesichert.
&lt;img alt="Der CEC-Adapter ins Gehäuse geklebt" src="https://www.dj-bauer.de/images/20250521_PXL_20250521_100559492.MP.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="schwierigkeiten-mit-hyperion"&gt;Schwierigkeiten mit Hyperion&lt;/h2&gt;
&lt;p&gt;Bei mir ist ein &lt;strong&gt;Problem&lt;/strong&gt; aufgetreten, dass beim Starten von Kodi die folgende Fehlermeldung aufgetreten ist.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Couldn't initialise the CEC adapter. Please check your settings&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Zuerst dachte ich, dass es an irgendwelchen &lt;a href="https://www.reddit.com/r/kodi/comments/gwdspi/failed_to_initialize_pulse_eight_adapter/"&gt;USB-Berechtigungen&lt;/a&gt; liegen könnte.
Jedoch hat mir &lt;code&gt;echo "on 0" &amp;gt; /dev/ttyACM0&lt;/code&gt; als Fehler geworfen, dass das USB-Device nicht gelocked werden könnte
Daraufhin &lt;code&gt;lsof | grep /dev/tty&lt;/code&gt; sehen, dass &lt;em&gt;hyperiond&lt;/em&gt; das Serielle Device benutzt.
&lt;strong&gt;Hyperion&lt;/strong&gt; ist ein Ambilight-Daemon, womit ich die Hintergrund-Beleuchtung von einem Fernseher Kontrolliere.
Im Webinterface von der Hyperion-Instanz konnte ich dann unter &lt;strong&gt;"System &amp;gt; Event Services"&lt;/strong&gt; die CEC Funktionalität von Hypertion deaktivieren, sodass Kodi den Adapter benutzen konnte und das Problem damit gelöst war.&lt;/p&gt;
&lt;p&gt;Alles in allem eine sehr einfache Installation abgesehen von der kleinen Fehlersuche durch Third-Party-Zusatzkomponenten.&lt;/p&gt;</content><category term="Hardware"/><category term="NUC"/><category term="Kodi"/><category term="LibreELEC"/><category term="Hyperion"/></entry><entry><title>Asus RS702D-E6 Bios update</title><link href="https://www.dj-bauer.de/asus-rs702d-e6-bios-update.html" rel="alternate"/><published>2025-04-14T21:18:00+02:00</published><updated>2025-04-14T21:18:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-04-14:/asus-rs702d-e6-bios-update.html</id><summary type="html">&lt;p&gt;Hier meine Notes um auf einem solchen Bladserver ein BIOS + BMC update zu machen&lt;/p&gt;</summary><content type="html">&lt;h1 id="bios-bmc-updaten"&gt;BIOS &amp;amp; BMC updaten&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;In FreeDOS reinbooten. (ggf. muss der stick reingesteckt werden und dann als Boot-Prio ausgewählt werden&lt;/li&gt;
&lt;li&gt;BMC passwort resetten: &lt;code&gt;cd BMC&lt;/code&gt; &amp;amp; &lt;code&gt;ASMC4 -adm_password admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;BMC updaten &lt;code&gt;FLASH1.bat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bios updaten &lt;code&gt;cd BIOS&lt;/code&gt; &amp;amp; &lt;code&gt;afudos.exe /iZ8&amp;lt;...&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="bios-einstellungen"&gt;BIOS einstellungen&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Unter Advanced -&amp;gt; PCI/PnP Settings&lt;ul&gt;
&lt;li&gt;Onboard LAN1 boot aus iSCSI setzen&lt;/li&gt;
&lt;li&gt;Onboard LAN2 boot auf PXE setzen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rebooten &amp;amp; mit Ctrl-D für den unteren Eintrag (Device 2) iSCSI komplett dhcp konfigurieren&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nach reboot in den Boot Prioritäten iSCSI über PXE auswählen&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setze IP für LAN3 auf DHCP setzen. (Direkt MAC addresse notieren)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Datum setzen. (Wenn default date mit Jan 1 2009 ist, dann funktioniert debian installation nicht)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In der DHCP-konfig ordentliche Reservation für die MAC setzen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bei mir im Ansible neue reservation erstellen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="hyperrack"/><category term="server"/><category term="sysadmin"/><category term="bios"/></entry><entry><title>Prusa i3 Mk2 MMU1 Part List</title><link href="https://www.dj-bauer.de/prusa-i3-mk2-mmu1-part-list.html" rel="alternate"/><published>2025-01-21T14:58:00+01:00</published><updated>2025-01-21T14:58:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-01-21:/prusa-i3-mk2-mmu1-part-list.html</id><summary type="html">&lt;p&gt;Ich überlege meinem alten Prusa i3 MK2S noch das Multi-Material-Upgrade zu geben. Hier versuche ich alle Teile zu listen und die Anleitung zu restoren.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Die originelle Bauanleitung findet man noch &lt;a href="https://help.prusa3d.com/wp-content/uploads/2021/05/Original-Prusa-i3-MK2S-to-MMU1.pdf"&gt;hier&lt;/a&gt;.
Ich weiß aber nicht wie lange dieser Link noch funktionieren wird, daher empfehle ich die pdf selber abzuspeichern.&lt;/p&gt;
&lt;h1 id="3d-gedruckte-teile"&gt;3D-Gedruckte Teile&lt;/h1&gt;
&lt;p&gt;46 Stück&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unvollständige Liste an Teilen, die offensichlich in der Anleitung vorkommen&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extruder-adaptor-MM&lt;/li&gt;
&lt;li&gt;Extruder Cover&lt;/li&gt;
&lt;li&gt;Y-Splitter&lt;/li&gt;
&lt;li&gt;2x Extruder Body MM&lt;/li&gt;
&lt;li&gt;2x Extruder idler MM left&lt;/li&gt;
&lt;li&gt;2x Extruder idler MM right&lt;/li&gt;
&lt;li&gt;2x E-Motor-Holder&lt;/li&gt;
&lt;li&gt;Stepper Switch Case (2-Teilig)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="sonstige-teile"&gt;Sonstige Teile&lt;/h1&gt;
&lt;p&gt;Generell sollten die allermeisten Teile auch beliebig auf Aliexpress verfügbar sein, wenn man es günstiger haben möchte.&lt;/p&gt;
&lt;h2 id="prusa-super-switch-mk42"&gt;Prusa Super Switch mk4.2&lt;/h2&gt;
&lt;p&gt;Kann nicht mehr bestellt werden
Kicad Repo ist &lt;a href="https://github.com/prusa3d/MK2mm_Stepper_switch"&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="schrittmotoren"&gt;Schrittmotoren&lt;/h2&gt;
&lt;p&gt;Man braucht 3 weitere, weil der Extruder Motor weiterverwendet werden kann.
Ersatzteilshop &lt;a href="https://www.prusa3d.com/de/produkt/stepper-motor-e-axis-extruder-mk3-s-mk2-5-s-mk2-s/"&gt;hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Es sind im Endeffekt einfache Nema-17 Schrittmotoren können daher auch einfach auf Ali oder sonstwo hergenommen werden.&lt;/p&gt;
&lt;h2 id="neues-multi-material-hotend"&gt;Neues Multi-Material Hotend&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt; Keine Ahnung wo das herkommt
Nachdem ich mich einige Zeit mit dem Mitgelieferten MMU-Hotend beschäftigt habe,
scheint das MMU Hotend einfach nur das E3D v6 Hotend mit einer verbesserten Heatbrake zu sein,
die mit der des &lt;a href="https://www.prusa3d.com/product/hotend-heatbreak-mk3-s-mk2-5-s-mmu2s/"&gt;Mk3&lt;/a&gt; identisch ist und noch so verkauft wird.&lt;/p&gt;
&lt;p&gt;Daher gehe ich davon aus, dass noch das alte Hotend weiterverwendet werden kann.&lt;/p&gt;
&lt;h2 id="kabel"&gt;Kabel&lt;/h2&gt;
&lt;p&gt;Es gibt 2 Kabel.
Einmal ein 5-4 Poliges und einmal ein 4-4 poliges.
Diese kann man einfach selber krimpen.
Auf die polarisierung muss man dann halt selber aufpassen.&lt;/p&gt;
&lt;h2 id="schrauben-und-muttern"&gt;Schrauben und Muttern&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2x M3n Mutter&lt;/li&gt;
&lt;li&gt;14x M3nS Mutter&lt;/li&gt;
&lt;li&gt;12x M3x10 Schraube&lt;/li&gt;
&lt;li&gt;6x M3x18 Schraube&lt;/li&gt;
&lt;li&gt;3x M3x20 Schraube&lt;/li&gt;
&lt;li&gt;1x M3x25 Schraube&lt;/li&gt;
&lt;li&gt;18x M3x30 Schraube&lt;/li&gt;
&lt;li&gt;8x M3x40 Schraube&lt;/li&gt;
&lt;li&gt;24x M3w Unterlegscheibe&lt;/li&gt;
&lt;li&gt;8x 5x15s &lt;a href="https://www.prusa3d.com/product/idler-spring/"&gt;Feder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;4x Steel Tube 25x3x1.9mm&lt;/li&gt;
&lt;li&gt;4x Pulleys with screw (with bearings for idlers)&lt;/li&gt;
&lt;li&gt;4x Pulleys without screw (without bearings for motors)&lt;/li&gt;
&lt;li&gt;8x Shaft for pulleys&lt;/li&gt;
&lt;li&gt;3x PTFE Schlauch&lt;/li&gt;
&lt;li&gt;8x QSM fittings&lt;/li&gt;
&lt;li&gt;8x QSM-M5 Einlassmutter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die gesammten Extruder-Drive-Teile konnte ich billig für etwa 5$ das stück auf Aliexpress als Bondtech-Dual-drive klone finden.&lt;/p&gt;</content><category term="3d-print"/><category term="prusa"/><category term="i3"/><category term="3d-print"/><category term="mmu"/></entry><entry><title>Hyperperformer Cryptoparty 2025</title><link href="https://www.dj-bauer.de/hyperperformer-cryptoparty-2025.html" rel="alternate"/><published>2025-01-21T10:42:00+01:00</published><updated>2025-01-21T10:42:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-01-21:/hyperperformer-cryptoparty-2025.html</id><summary type="html">&lt;p&gt;Alle Infos zur hyperperformer cryptoparty&lt;/p&gt;</summary><content type="html">&lt;h1 id="themen-die-ich-behandeln-will"&gt;Themen die ich behandeln will&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Recap asymetrische Verschlüsselung und signierungen&lt;/li&gt;
&lt;li&gt;Wie funktioniert das ganze in Unternehmen mit &lt;em&gt;S/MIME&lt;/em&gt; und zentralen Trust-Authorities? &lt;/li&gt;
&lt;li&gt;Was sind diese Zertifikate eigentlich und die funktioniert das signieren?&lt;/li&gt;
&lt;li&gt;Wie machen wir das dezentral in cool😎 mit PGP (&lt;em&gt;Pretty good Privacy&lt;/em&gt;) und dessen &lt;strong&gt;gnuPG&lt;/strong&gt; implementierung?&lt;/li&gt;
&lt;li&gt;Unterschiede zwischen Web of trust &amp;amp; Trust-authorities.&lt;/li&gt;
&lt;li&gt;GPG-Key Erstellung &amp;amp; management&lt;/li&gt;
&lt;li&gt;Subkeys &amp;amp; Revocation-Zertifikate&lt;/li&gt;
&lt;li&gt;Speicherung von keys&lt;/li&gt;
&lt;li&gt;Einrichten von Email-Verschlüsselung&lt;/li&gt;
&lt;li&gt;Signieren von anderen publickeys &amp;amp; Keyserver&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="zeit-und-location"&gt;Zeit und Location&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Den genauen Zeitpunkt weiß ich noch nicht, allerdings wird das ganze nach der ersten Klausurenphase für mich stattfinden.
Daher irgendwann im Februar nach dem 17.2.2025
Die Location weiß ich noch nicht genau, je nachdem wie viele kommen müssen wir schauen.&lt;/p&gt;
&lt;h1 id="q-a"&gt;Q &amp;amp; A&lt;/h1&gt;
&lt;h3 id="warum-will-ich-das"&gt;Warum will ich das?&lt;/h3&gt;
&lt;p&gt;Ich bin ein großer Crypto-Fan (nein, ohne coins), sondern von verschlüsselten Emails mit GPG.
In den letzten 6 Jahren verfolge ich relativ aktiv die best practices würde gerne mal anderen zeigen wie das geht.Was würden wir machen?
Ich würde zeigen, welche Best-practices ich habe um keys langfristig sicher (in allen ITSI-aspekten) und nachhaltig zu halten, wie sub-keys und expiration-extends und key-signing.
Natürlich kommt auch das erstellen und einrichten von keys in die mailclients nicht zu kurz.&lt;/p&gt;
&lt;h3 id="warum-ist-das-jetzt-eine-party"&gt;Warum ist das jetzt eine Party?&lt;/h3&gt;
&lt;p&gt;Und zu guter letzt (warum das ganze eine Party ist) müssen wir auch bisl Hash(es) austauschen. Wir wollen unsere DNA/fingerabdrücke teilen und gegenseitig schlüssel signieren.
Warum das signieren von anderen Schlüsseln geil ist werde ich dann auch noch erklären und wie das Web-of-trust funktioniert&lt;/p&gt;
&lt;h3 id="weitere-fragen"&gt;Weitere Fragen&lt;/h3&gt;
&lt;p&gt;Wenn du weitere Fragen oder Themenvorschläge hast, dann schicke ne mail an &lt;a href="mailto:daniel.bauer+cryptoparty@caserio.de"&gt;mich&lt;/a&gt;&lt;/p&gt;</content><category term="crypto"/><category term="crypto"/><category term="gpg"/><category term="keysigning"/></entry><entry><title>Meine Crypto-Learnings</title><link href="https://www.dj-bauer.de/meine-crypto-learnings.html" rel="alternate"/><published>2025-01-13T16:09:00+01:00</published><updated>2025-01-13T16:09:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2025-01-13:/meine-crypto-learnings.html</id><summary type="html">&lt;p&gt;Immer wieder beschäftige ich mich mit Cryptographie und deren tools, wie OpenSSL, gpg und anderen buzzwords, wie PKCS oder X509. Hier will ich alles geordnet für mich oder andere festhalten&lt;/p&gt;</summary><content type="html">&lt;h1 id="crypto"&gt;Crypto? 💰&lt;/h1&gt;
&lt;p&gt;Nein, hier geht es nicht um Energieverschwendende Scams.&lt;/p&gt;
&lt;h1 id="buzzwords"&gt;Buzzwords&lt;/h1&gt;
&lt;h2 id="pkcs"&gt;PKCS&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/PKCS"&gt;PKCS&lt;/a&gt; ist eine Reihe von Standards, die von einem Unternehmen (&lt;em&gt;RSA Security LLC&lt;/em&gt;) festgelegt wurden. 
Einige sind mittlerweile in &lt;em&gt;RFC&lt;/em&gt;-Standarts übernommen worden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PKCS#1&lt;/strong&gt; RSA public-key Verschlüsseungsverfahren. (&lt;em&gt;RFC8017&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS#3&lt;/strong&gt; Diffie-Hellman Schlüsselaustausch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS#7&lt;/strong&gt; Cryptographische Verschlüsseungs-Syntax (Basis für S/MIME) &lt;strong&gt;TODO&lt;/strong&gt; Noch weiter erklärhren.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS#10&lt;/strong&gt; &lt;a href="#certifikat-singing-request"&gt;Zertifizierungs-request&lt;/a&gt;. Schickt man an Let's Encrypt und bekommt ein signiertes Zertifikat zurück&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS#11&lt;/strong&gt; Cryptographic Token Interface. An API defining a generic interface to cryptographic tokens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS#12&lt;/strong&gt; Personal Information Exchange Syntax. Ein packet, was Private-key und public-key zertifikat bündelt (&lt;em&gt;RFC 7292&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKCS#15&lt;/strong&gt; Cryptographic Token Information Format Standard. Allowing users of cryptographic tokens to identify themselves to applications independent of the applications API.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="certifikat-singing-request"&gt;Certifikat Singing-Request&lt;/h1&gt;
&lt;p&gt;Enthält den Publik-Key für das Zertifikat &amp;amp; weitere Informationen, die enthalten sein sollen, wie Name, Land etc.&lt;/p&gt;
&lt;p&gt;Man kann easy um mit einem erstellen Schlüssel einen request erzeugen.
&lt;code&gt;openssl req -new -key key.pem -out request.csr&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="beispiel-workflow"&gt;Beispiel Workflow&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://johndalesandro.com/blog/create-self-signed-smime-certificates/"&gt;Hier&lt;/a&gt; ist ein echt guter Blog-Beitrag, wie man Testweise eine eigene CA zum signieren eigener Zertifikate erstellen kann.&lt;/p&gt;
&lt;h2 id="distinguished-names"&gt;Distinguished Names&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DN&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CN&lt;/td&gt;
&lt;td&gt;Domain Name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;Organisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OU&lt;/td&gt;
&lt;td&gt;Organization Subsection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Stadt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ST&lt;/td&gt;
&lt;td&gt;Staat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Land als ISO Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EMAIL&lt;/td&gt;
&lt;td&gt;Email addresse&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="x509-zertifikat"&gt;X.509 Zertifikat&lt;/h1&gt;
&lt;p&gt;Ein großer Container, der ganz viele Dinge vereinigt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kryptographischer Public-Key von z.B. RSA, DSA, ECDSA, ED25519&lt;/li&gt;
&lt;li&gt;Addressen von &lt;em&gt;Revocation Lists&lt;/em&gt; auf denen veröffentlicht wird, wenn dieses Zertifikat vorzeitig zurückgezogen wird.&lt;/li&gt;
&lt;li&gt;Signaturen von Zertifizierten Authorities, die die Validität des Zertifikates bezeugen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ca-erneuerung"&gt;CA-Erneuerung&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt;: Wie funktioniert das erneuern von Privat-keys von Root-Zertifikaten&lt;/p&gt;</content><category term="crypto"/><category term="pkcs"/><category term="crypto"/><category term="til"/></entry><entry><title>5 Jahre Beziehung</title><link href="https://www.dj-bauer.de/5-jahre-beziehung.html" rel="alternate"/><published>2024-11-11T11:11:00+01:00</published><updated>2024-11-11T11:11:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2024-11-11:/5-jahre-beziehung.html</id><summary type="html">&lt;p&gt;Seit nun 5 Jahren sind meine Freundin und ich in einer Fernbeziehung. Was eine lange Zeit!&lt;/p&gt;</summary><content type="html">&lt;p&gt;Tatsächlich ist diese Geschichte aber noch etwas tiefer gehend.
Als wir am Veteransday 2019 zusammengekommen sind, war ich im Schüleraustausch in Iowa und habe dort Maddie kennengelernt.
Dementsprechend waren es davon quasi 4.5 Jahre Fernbeziehung über Signal-Calls.
In dieser Zeit hat sie mich zu Weihnachten und im Sommer besucht, und ich sie zweimal besucht.
Alleine schon diese Reisen zusammen und die rare Zeit zu genießen sind unvergessliche Momente.&lt;/p&gt;
&lt;h3 id="warum-teile-ich-diese-geschichte"&gt;Warum teile ich diese Geschichte?&lt;/h3&gt;
&lt;p&gt;Wenn wir den meisten Menschen von unserer Geschichte erzähle, 
bekommen wir eine Reaktion in etwa "Also ich könnte das nicht" oder "ist das nicht schwer?".
Aber ist eine "normale" Beziehung zu halten nicht auch schwer? 
Jede Beziehung braucht Arbeit und besonders ganz viel Kommunikation.
Und das haben wir zusammen gelernt, erprobt und ich freue mich auf noch mehr Jahre mit dir Maddie &amp;lt;3&lt;/p&gt;</content><category term="privates"/></entry><entry><title>2t Blechbüchse aber keine Ahnung</title><link href="https://www.dj-bauer.de/2t-blechbuchse-aber-keine-ahnung.html" rel="alternate"/><published>2024-06-07T09:09:00+02:00</published><updated>2024-06-07T09:09:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2024-06-07:/2t-blechbuchse-aber-keine-ahnung.html</id><summary type="html">&lt;p&gt;Heute morgen den größen Fall von Porsche-Ignoranz mit absoluter Wissenslosigkeit erlebt.&lt;/p&gt;
&lt;p&gt;Ich fahre mit dem Rad mit 37km/h auf einer 50er Vorfahrtsstraße auf eine Kreuzung zu.
20-30m vor mir biegt noch gerade so ein SUV ab und folgt der straße im Schneckentempo voll auf dem Fahrradschutzstreifen fahrend ca. 30m …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Heute morgen den größen Fall von Porsche-Ignoranz mit absoluter Wissenslosigkeit erlebt.&lt;/p&gt;
&lt;p&gt;Ich fahre mit dem Rad mit 37km/h auf einer 50er Vorfahrtsstraße auf eine Kreuzung zu.
20-30m vor mir biegt noch gerade so ein SUV ab und folgt der straße im Schneckentempo voll auf dem Fahrradschutzstreifen fahrend ca. 30m.
Dort hält er und will auf der linken Fahrbahnhälfte halten.
Weil er wegen Gegenverkehr warten muss, kann ich ihn Links überholen.
Ratet mal wer rumheult, dass ich auf dem "Radweg" fahren muss.
Ja klar Herr Platzverschwendung, wenn du mit 2t Blechdose rechtswidrig mir den Weg versperrst, darfst du dir auch noch irgendwelche Regeln ausdenken oder wie???&lt;/p&gt;
&lt;p&gt;Ich habe mitlerweile eine recht hohe Toleranz gegenüber Arschlöchern im Straßenverkehr und Menschen, 
die wirklich die STVO nicht können, aber einen Fahrradschutzstreifen behindern und dann heulen ist halt echt Krabbelgruppe niveau.
STVO Prüfungen alle 3 Jahre ab jetzt!&lt;/p&gt;</content><category term="fahrrad"/><category term="fahrrad"/><category term="stvo"/></entry><entry><title>🔈Sonos ZP90 Netzteil Ersatz</title><link href="https://www.dj-bauer.de/sonos-zp90-netzteil-ersatz.html" rel="alternate"/><published>2024-05-11T12:15:00+02:00</published><updated>2024-05-11T12:15:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2024-05-11:/sonos-zp90-netzteil-ersatz.html</id><summary type="html">&lt;p&gt;Kaputte Netzteile legen meist das ganze Gerät lahm. 
Vor allem bei teurer Hardware, wie Sonos-Player kann das  ärgerlich sein. 
Ich habe in diesem Fall einen einfachen Weg der Reparatur gegangen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die Rückseite des Sonos ZP90 mit eingeklebter Klinkenbuchse" src="https://www.dj-bauer.de/images/20240511_fertig.jpg" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#warnung"&gt;⚡WARNUNG!⚡&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#das-problem"&gt;Das Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#die-losung"&gt;Die Lösung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fazit"&gt;Fazit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="warnung"&gt;⚡WARNUNG!⚡&lt;/h1&gt;
&lt;p&gt;Die Sonosplayer haben ungeschützte Netzteile eingebaut.
Diese haben Kondensatoren, die noch lange Spannung …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kaputte Netzteile legen meist das ganze Gerät lahm. 
Vor allem bei teurer Hardware, wie Sonos-Player kann das  ärgerlich sein. 
Ich habe in diesem Fall einen einfachen Weg der Reparatur gegangen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die Rückseite des Sonos ZP90 mit eingeklebter Klinkenbuchse" src="https://www.dj-bauer.de/images/20240511_fertig.jpg" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#warnung"&gt;⚡WARNUNG!⚡&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#das-problem"&gt;Das Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#die-losung"&gt;Die Lösung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fazit"&gt;Fazit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="warnung"&gt;⚡WARNUNG!⚡&lt;/h1&gt;
&lt;p&gt;Die Sonosplayer haben ungeschützte Netzteile eingebaut.
Diese haben Kondensatoren, die noch lange Spannung halten.
Bevor du einen Kiste aufschraubst, stelle sicher, dass der Player lange genug
ausgeschaltet ist.
Ich persönlich gehe auf Nummer sicher mit 12-24h. 
Es ist mir egal, ob das viel zu lange ist, aber ich bin kein Elektriker.&lt;/p&gt;
&lt;h1 id="das-problem"&gt;Das Problem&lt;/h1&gt;
&lt;p&gt;Meistens ist der Grund für ein kaputtes Gerät das Netzteil, spezifischer die
Kondensatoren darauf.
Daher war der erste Schritt der Problemidentifikation das Aufschrauben des
Players.
Da ich keine Erfahrung mit dem Design von Netzteilen habe und die Kondensatoren
nicht grob beschädigt aussahen, habe ich gar nicht erst versucht das original
Netzteil zu finden.
Da ich im Internet keine direkten Ersatznetzteile gefunden habe, bin ich die 
DIY-Route gegangen.&lt;/p&gt;
&lt;h1 id="die-losung"&gt;Die Lösung&lt;/h1&gt;
&lt;p&gt;Das Mainboard des Players braucht 2 Spannungen: 12V und 3.3V.
Nachdem ich den Player provisorisch an mein Labornetzteil angeschlossen habe,
konnte ich sehen, dass er im Idle etwa 0.8A auf der 3.3V Schiene verbraucht.
Nun war ich also auf dem richtigen Weg. 
Ich brauche eine Stromversorgung, die 12V und 3.3V liefert. 
Am besten jeweils 2-3A um auch Nummer sicher zu gehen.
Auf Amazon habe ich die folgende Kombo gefunden, die zumindest machbar aussah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.de/dp/B0CJFJQ4L8/"&gt;12V 3.3V 3A Spannungswandler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.de/dp/B0C536WGT7"&gt;24V 3A Netzteil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Spannungswander sind zwar etwas überdimensioniert, 
da das PCB auch noch einen Variablen Spannungsausgang und 5V liefert.
Das Spannungswandler-Board ist sehr simpel aufgebaut.
Im Endeffekt befinden sich darauf 4x die gleiche Schaltung 
für unterschiedliche Spannungen.
Die Gesamtleistung ist für 5A ausgelegt, was ich für ausreichend gehalten habe.&lt;/p&gt;
&lt;p&gt;Das Zerlegen des ZP90 ist relativ einfach, nachdem man die Folie/Schaum von der
Unterseite abzieht.
Intern gab es einen dicken Stecker, der das Netzteil mit dem Mainboard verbunden hat.
Nachdem alles auseinander genommen war, habe ich einfach das Kabel vom Netzteil
abgeschnitten und Verlängerungen daran gelötet.
Diese wurden dann in die Spannungswandler-Platine geschraubt.
Nach einem schnellen Anschluss an einen Verstärker konnte ich wieder Musik über
das Netzwerk abspielen. YAY!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die Spannungswandler neben dem rohen Player-Mainboard auf meiner Werkbank" src="https://www.dj-bauer.de/images/20240511_testbench.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Witzigerweise war unter der Audio-Platine im Gehäuse noch so viel Platz,
dass ich nach abknipsen von zwei Abstandshaltern die Spannungswandler mit Sekundenkleber
einkleben konnte.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Spannungswanderplatine im Gehäuse eingebaut" src="https://www.dj-bauer.de/images/20240511_eingebaut.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Natürlich durfte bei so einem DIY-Projekt auch der Heißkleber nicht fehlen,
also wurde so die Strom-Buchse montiert.
Alles wieder zusammengesteckt und Labels drauf, und der ZP90 ist wieder im Einsatz.&lt;/p&gt;
&lt;h1 id="fazit"&gt;Fazit&lt;/h1&gt;
&lt;p&gt;Die Box funktioniert wieder wie vorher.
Jedoch kann man definitiv ein Spulenfiepen der Spannungswandler hören.
Dies könnte je nach Einsatzzweck und Person als Störend empfunden werden.&lt;/p&gt;</content><category term="Hardware"/><category term="electronics"/><category term="repair"/><category term="diy"/></entry><entry><title>⌨️ Eigene Tastatur bauen</title><link href="https://www.dj-bauer.de/eigene-tastatur-bauen.html" rel="alternate"/><published>2024-04-24T12:54:00+02:00</published><updated>2024-05-06T21:44:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2024-04-24:/eigene-tastatur-bauen.html</id><summary type="html">&lt;p&gt;&lt;img alt="Die Fertige low-profile Split-Keyboard mit blauen Keycaps" src="https://www.dj-bauer.de/images/20240506_fertig_schraeg.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Projekt &lt;strong&gt;Keyboard from Scratch&lt;/strong&gt;: 
Mit einer Gruppe von Freunden haben wir uns in der Uni getroffen um eine
Open Source Tastatur zu bauen.
Ziel war es zusammen als Sammelbestellungen Teile zu kaufen,
die Gehäuse mit 3d-Druckern zu drucken und die Platinen bei JLCPCB zu bestellen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#das-projekt"&gt;Über das Projekt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#gallerie-der-montage"&gt;Bildergallerie der …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Die Fertige low-profile Split-Keyboard mit blauen Keycaps" src="https://www.dj-bauer.de/images/20240506_fertig_schraeg.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Projekt &lt;strong&gt;Keyboard from Scratch&lt;/strong&gt;: 
Mit einer Gruppe von Freunden haben wir uns in der Uni getroffen um eine
Open Source Tastatur zu bauen.
Ziel war es zusammen als Sammelbestellungen Teile zu kaufen,
die Gehäuse mit 3d-Druckern zu drucken und die Platinen bei JLCPCB zu bestellen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#das-projekt"&gt;Über das Projekt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#gallerie-der-montage"&gt;Bildergallerie der Montage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#software"&gt;Die Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#fazit"&gt;Fazit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1 id="das-projekt"&gt;Das Projekt&lt;/h1&gt;
&lt;p&gt;Grundlage war das Projekt &lt;a href="https://github.com/ianmaclarty/ik"&gt;Ian's Keyboard&lt;/a&gt;.
Dieses ist komplett Open Source mit allen Quellcode-Dateien auf GitHub verfügbar.&lt;/p&gt;
&lt;p&gt;Über einen längeren Zeitraum haben wir mit über 10 Menschen Sammelbestellungen 
für die üblichen Komponenten des Projekts geplant und organisiert.
Von der Fertigung der PCBs zur Organisation wer wem ein Gehäuse in welcher
Farbe druckt, über die kleineren elektronischen Bauteilen bis hin zu Switches.
Mit 10 Menschen sind hohe Versandkosten, wie 18€ Digikeys einfach zu tragen.
Auch größere Stückzahlen, wie 1000 Dioden sind für einen Groupbuy gut tragbar.
Manche besondere Teile, wie 4-Polige Klinkenstecker 
sind verdammt schwierig zu finden und bieten eine extra-Challenge bei Bestellen.&lt;/p&gt;
&lt;p&gt;Der Zusammenbau lief dann größtenteils an einem Nachmittag/Abend ab.
&lt;img alt="Ein großer Schreibtisch von mit Monitoren, Thinkpads und Lötmaterial zum basteln" src="https://www.dj-bauer.de/images/20240506_ganzer_schreibtisch.jpg" /&gt;&lt;/p&gt;
&lt;h1 id="gallerie-der-montage"&gt;Gallerie der Montage&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Ein noch unbestücktes weißes PCB der Tastatur" src="https://www.dj-bauer.de/images/20240506_noch_unfertig.jpg" /&gt;
Jeder fing mit blanken Platinen an.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Das weiße PCB nun mit Dioden und einem Mikrocontroller draufgelötet" src="https://www.dj-bauer.de/images/20240506_erstes_pcb.jpg" /&gt;
Für viele der Gruppe waren dies die ersten Löterfahrungen und es war toll
mit so vielen verschiedenen Erfahrungsstufen zusammen zu basteln.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Die linke und rechte Hälfte der Tastatur nun bestückt" src="https://www.dj-bauer.de/images/20240506_pcbs_verloetet.jpg" /&gt;
Natürlich wurden die PCBs auch ausreichend getestet😉, bevor es mit den Switchen
weiterging.
Denn sobald man die Frontplatte drauflegt und den ersten Switch einlötet,
kommt man nicht mehr an die Dioden ran&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein paar Low-Profile Switche auf dem PCB mit Frontplatte draufgelötet" src="https://www.dj-bauer.de/images/20240506_erste_switche.jpg" /&gt;
Ich habe mich für die &lt;strong&gt;Nuphy Cowberry Switche&lt;/strong&gt; entschieden.
Diese haben mit 38g Anschlaggewicht meiner Meinung nach einen wirklich sehr
angenehmen Druckpunkt und fühlen sich als lineare Switche wirklich toll an.&lt;/p&gt;
&lt;h1 id="software"&gt;Software&lt;/h1&gt;
&lt;p&gt;Die Tastaturen verwenden den RP2040 Mikrocontroller, welche sehr einfach zu flashen sind.
Dies hat es uns ermöglicht eine regelrechte Produktionsstraße zum Bespielen einzurichten.
Dieser 32-Bit ARM Cortex ist vermutlich von der Leistung überdimensioniert, 
ist aber sehr einfach zu programmieren und hat eine gute Größe.&lt;/p&gt;
&lt;p&gt;Als Software hatte ich zuerst die von Ian zurechtgestellte QMK-Konfiguration
verwendet.
&lt;em&gt;QMK&lt;/em&gt; (Quantum Mechanical Keyboard) ist ein Framework womit einfach Firmware
für Tastaturen konfiguriert werden kann.&lt;/p&gt;
&lt;p&gt;Mittlerweile ist VIA bzw. &lt;a href="https://get.vial.today"&gt;VIAL&lt;/a&gt; aber der heiße scheiss.
Nach eine paar Tagen habe ich dann auch die &lt;a href="https://github.com/pinpox/vial-qmk"&gt;Vial-Konfiguration&lt;/a&gt; von &lt;a href="https://pablo.tools"&gt;Pablo&lt;/a&gt; verwendet.
Damit kann man entweder in Chromium per HID-Passthrough (sehr spannende Technik)
oder mit einem lokalen Programm die genaue Tastaturbelegung mit Shortcuts
zur Laufzeit festlegen.&lt;/p&gt;
&lt;h1 id="fazit"&gt;Fazit&lt;/h1&gt;
&lt;p&gt;Wir wussten im vor hinein, dass diese Tastatur eine starke Umstellung von
gewohnten Tastaturen ist.
Daher ist der Umstieg schon eine deutliche Gewöhnung nötig,
die mir auch noch fehlt.
Jedoch benutzen manche die Tastatur schon als Daily-Driver.
Ich werde auch dran bleiben und solange üben, 
bis ich 90WPM Tippgeschwindigkeit erreicht habe.
Die Flachen Tasten mit linearem aber kurzen Weg fühlen sich schliesslich
verdammt gut an!&lt;/p&gt;
&lt;p&gt;Alles in allem war es aber ein echt tolles Projekt, was uns allen sehr viel Spaß
gemacht hat.
Von der initalen Planung, bis zur schlussendlichen Umsetzung hatten wir 
auch noch spannende Zwischenschritte, wie ein CAD-Workshop von &lt;a href="https://mayniklas.de/"&gt;Niklas&lt;/a&gt;.
Dabei haben wir mit FreeCad oder Ondsel als Beispiel-Projekt 
einen Keyswitch-Tester designed, um uns zwischen den verschiedenen Switchen
entscheiden zu können.
Dieses Projekt kann als ideales Einsteigerprojekt zum Löten und 3d-Drucken dienen.&lt;/p&gt;
&lt;p&gt;Pro Person hatten wir Kosten von 26€ für die Bauteile ohne Gehäuse,
Switche und Tastaturkappen.
Durch die Sammelbestellung konnten wir viele Preise sehr gut aufteilen und drücken.
Insgesammt habe ich knapp 60€ ausgegeben.
Ein sehr guter Preis für ein Bastelprojekt mit funktionierender mechanischer
Tastatur am Ende finden wir!&lt;/p&gt;</content><category term="Hardware"/><category term="3d-print"/><category term="electronics"/><category term="keyboard"/><category term="openSource"/></entry><entry><title>Meine Avocados, 3 Jahre Fortschritt</title><link href="https://www.dj-bauer.de/meine-avocados-3-jahre-fortschritt.html" rel="alternate"/><published>2024-04-09T12:06:00+02:00</published><updated>2024-04-09T12:06:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2024-04-09:/meine-avocados-3-jahre-fortschritt.html</id><summary type="html">&lt;p&gt;Wie viele andere, habe ich auch wärend des Lockdowns ein neues Hobby angefangen. Und Irgendwie hält es immer noch an.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Auch dieses Jahr habe wurden die Avocados umgetopft.
Nachdem letztes Jahr eine und im Winter eine weitere Pflanze gestorben sind sind es jetzt nur noch 4.
Hoffentlich werden die Pflanzen diesen Sommer stark genug und reduzieren sich nicht weiter.
&lt;img alt="4 Avocados in 65L Töpfen" src="https://www.dj-bauer.de/images/20240409_avocado_24.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Angefangen hat das ganze 2021 mit dem klassischen Avocado-Kern im Glass.
Und irgendwie habe ich das ganze dann immer weiter durchgezogen.
In 3-4 Jahren sollte ich dann wissen, ob ich Früchte ziehen kann.&lt;/p&gt;
&lt;p&gt;Noch vor einem Jahr waren die Avocados vergleichsweise klein.
&lt;img alt="6 Avocados in kleinen Töpfen" src="https://www.dj-bauer.de/images/20240409_avocado_23.jpg" /&gt;&lt;/p&gt;</content><category term="Garten"/></entry><entry><title>Blutspende</title><link href="https://www.dj-bauer.de/blutspende.html" rel="alternate"/><published>2023-10-20T18:02:00+02:00</published><updated>2023-10-20T18:02:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2023-10-20:/blutspende.html</id><summary type="html">&lt;p&gt;Heute war ich schon zum 7ten mal Blutspenden. Wann bist du wieder dran?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jetzt fange ich auch mal an nach jeder Blutspende Menschen daran zu erinnern.
Also: &lt;/p&gt;
&lt;h1 id="wann-spendest-du-wieder"&gt;Wann spendest du wieder?&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Stockimage zur Blutspende Bildunterschrift: jede Spende zählt" src="https://www.dj-bauer.de/images/20231020_jede-blutspende-zaehlt-feed.png" /&gt;
&lt;em&gt;&lt;a href="https://www.blutspende.de/ehrenamt/downloads?f%5B0%5D=kategorie%3A165"&gt;Bildquelle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content><category term="social"/><category term="blutspende"/><category term="blood"/></entry><entry><title>C strlen comparisons</title><link href="https://www.dj-bauer.de/c-strlen-comparisons-en.html" rel="alternate"/><published>2023-10-12T12:18:00+02:00</published><updated>2023-10-12T12:18:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2023-10-12:/c-strlen-comparisons-en.html</id><summary type="html">&lt;p&gt;In a recent learning project i was implementing a XML-parser in c.
After benchmarking my naive implementation on a 12M XML-file i stumbled over something very interesting.
The function using 99% of my time was &lt;code&gt;strlen&lt;/code&gt; even though it was only called in a couple of locations.
I could figure …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In a recent learning project i was implementing a XML-parser in c.
After benchmarking my naive implementation on a 12M XML-file i stumbled over something very interesting.
The function using 99% of my time was &lt;code&gt;strlen&lt;/code&gt; even though it was only called in a couple of locations.
I could figure out, that it was called on really large substrings for every token.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot eines Hotspot performance profilers, der zeigt, die strlen 95% der Laufzeit einnimmt" src="https://www.dj-bauer.de/images/20231012_slow.png" /&gt;&lt;/p&gt;
&lt;p&gt;Because i did not really care for the actual length but just compared it 
i decided to try out a naive implementation which would directly compare the length of a string 
instead of calculating it hoping it would
abort faster than the glibc &lt;code&gt;strlen&lt;/code&gt; function takes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I need to note, that the code was compiled without any optimization and with address sanitizer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because I haven't seen this behavior anywhere else addressed, 
I came up with the following functions.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;inline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;strlen_gt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;inline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;strlen_ge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Normal &lt;strong&gt;unoptimizeed&lt;/strong&gt; &lt;code&gt;strlen&lt;/code&gt; has the runtime len(str) 
whereas this implementation has the runtime min(len(str), cmp).
Especially for cases with really long strings 
and smaller values to be compared to the benefits this implementation shine.&lt;/p&gt;</content><category term="Programming"/><category term="c"/><category term="programming"/><category term="optimization"/><category term="coding"/></entry><entry><title>Dezimalzahlen zu IEEE-754</title><link href="https://www.dj-bauer.de/dezimalzahlen-zu-ieee-754.html" rel="alternate"/><published>2023-03-27T19:54:00+02:00</published><updated>2023-03-27T19:54:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2023-03-27:/dezimalzahlen-zu-ieee-754.html</id><summary type="html"/><content type="html">&lt;h1 id="32-bit"&gt;32-Bit&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Die 32 Bit sind folgendermaßen aufgebaut&lt;ol&gt;
&lt;li&gt;1-Bit Vorzeichen&lt;/li&gt;
&lt;li&gt;8-Bit Charakteristik&lt;ul&gt;
&lt;li&gt;Das ist der Exponent + 127&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;23-Bit Mantisse&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Zahl in Ganzzahl and Nachkommastellen aufteilen&lt;/li&gt;
&lt;li&gt;Ganzzahl in Binär umwandeln&lt;/li&gt;
&lt;li&gt;Nachkommazahl in Binär umwandeln&lt;/li&gt;
&lt;li&gt;Ganzzahl und Nachkommazahl mit Komma in der dazwischen hintereinanderschreiben&lt;/li&gt;
&lt;li&gt;Binärzahl in Base-2 Exponentialschreibweise schreiben.&lt;ul&gt;
&lt;li&gt;Das Komma nach Rechts oder Links verschieben, sodass es direkt nach der ersten 1 kommt&lt;/li&gt;
&lt;li&gt;Dabei die Verschiebungen als Exponent zählen (links ist exponent +1, rechts ist Exponent -1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vorzeichenbit setzen&lt;ul&gt;
&lt;li&gt;1 ist Negativ&lt;/li&gt;
&lt;li&gt;0 ist Positiv&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;127 (Bias) mit Exponenten (die Anzahl an shifts) addieren = Charakteristik&lt;/li&gt;
&lt;li&gt;Charakteristik in Binär umwandeln&lt;/li&gt;
&lt;li&gt;Mantisse ausrechnen&lt;ul&gt;
&lt;li&gt;Die 1 vor dem Komma wegfallen lassen.&lt;/li&gt;
&lt;li&gt;Der Rest ist die Mantisse&lt;/li&gt;
&lt;li&gt;Hier mit Perioden runden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kombinieren&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="beispiel"&gt;Beispiel&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Dezimal: 12.1234
Ganzzahl: 1100₂
Nachkommazahl: 10011010010₂
1100.10011010010₂
1.10010011010010₂ x 2³
Vorzeichen: 0
Charakteristik: 3₁₀ + 127₁₀ = 130₁₀ = 10000010₂
Mantisse: 10010011010010₂
Ergebniss: 0 10000010 1001001101001000000000
&lt;/pre&gt;&lt;/div&gt;</content><category term="2023"/><category term="binary"/><category term="informatik"/></entry><entry><title>My advances using OpenSCAD as a graphing tool</title><link href="https://www.dj-bauer.de/my-advances-using-openscad-as-a-graphing-tool-en.html" rel="alternate"/><published>2023-02-08T18:45:00+01:00</published><updated>2023-02-08T18:45:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2023-02-08:/my-advances-using-openscad-as-a-graphing-tool-en.html</id><summary type="html">&lt;p&gt;On my way to implement every possible container in C++ I started debugging data structures using OpenSCAD an open source CAD software.&lt;/p&gt;</summary><content type="html">&lt;p&gt;After an epic fail in nearest-neighbor-search in a kd-Tree I wanted to implement a simple data-structure in C++.&lt;/p&gt;
&lt;p&gt;So I tried a Max-Heap.
Shouldn't be to difficult i thought.
Well, and it wasn't.
In 75% of my test cases.
I actually wrote a test-assertion, which checks if the max-heap is still not broken and of course it fails in some cases.
So because I am to lazy to actually sit down and dig through the code I started creating a proper interface  library to OpenSCAD.
Library might be the wrong word.
It's basically just a bunch of simple macros, which assist me in outputting an OpenSCAD document,
which then plots in this case my heap.
&lt;img alt="Simple screenshot of my auto-generated OpenSCAD code and it's corresponding render of a max-heap on the right" src="https://www.dj-bauer.de/images/20230208_openscad.png" /&gt;&lt;/p&gt;
&lt;p&gt;I even started to fiddle around with animations.
&lt;img alt="A screenshot of OpenSCAD plotting a max-heap with an animation of two nodes switching" src="https://www.dj-bauer.de/images/20230208_scad.gif" /&gt;
Maybe after some work I can animate full operations using this.&lt;/p&gt;</content><category term="Programming"/><category term="OpenSCAD"/><category term="c++"/><category term="coding"/><category term="programming"/></entry><entry><title>Thinkpad x230 classic Tastatur</title><link href="https://www.dj-bauer.de/thinkpad-x230-classic-tastatur.html" rel="alternate"/><published>2022-12-26T17:16:00+01:00</published><updated>2022-12-26T17:16:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-12-26:/thinkpad-x230-classic-tastatur.html</id><summary type="html">&lt;p&gt;Der Thinkpad x230 gehört zur ersten Generation von Thinkpads, welche eine neue Tastatur bekommen haben. Doch die beliebten Classic-keyboards lassen sich dort auch noch nutzen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Es gibt immernoch einige Menschen, welche die alten "Classic"-Thinkpad Tastaturen besser finden.
Dazu gehöre ich auch.
Das Gefühl ist einfach viel besser und auch nach mehreren Stunden tippen tun einem  nicht die Hände weh, was bei den neuen Modellen zu mindest bei mir der Fall ist.
Glücklicherweise ist das Austauschen der neuen Tastatur mit einer alten Classic-Tastatur recht einfach.&lt;/p&gt;
&lt;p&gt;Um einen X230 umzurüsten benötigt man im Grunde genommen nur eine &lt;strong&gt;X220-Ersatz-Tastatur&lt;/strong&gt;.
Es gibt &lt;strong&gt;drei Schritte&lt;/strong&gt; für den Einbau, wobei der dritte optional und nicht für die Funktionalität notwendig ist.
Ohne den dritten Schritt des Keyboard-Flashens funktionieren nicht alle Tasten wie beschrieben, sondern wie auf der alten Tastatur aufgedruckt.
Aufgefallen ist mir bisher:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dass die Home-Taste nicht geht&lt;/li&gt;
&lt;li&gt;Das Thinklight ist auf Fn-Space und nicht wie aufgedruckt&lt;/li&gt;
&lt;li&gt;Screenlock taste liegt auf Fn-F3 und nicht Fn-F2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Im Grunde genommen habe ich mich einfach an die Anleitung aus dem &lt;a href="https://www.thinkwiki.org/wiki/Install_Classic_Keyboard_on_xx30_Series_ThinkPads"&gt;Think-Wiki&lt;/a&gt; gehalten.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Thinkpad X230 mit Classic-Keyboard" src="https://www.dj-bauer.de/images/20221226_x230_keyboard_1.jpg" /&gt;&lt;/p&gt;
&lt;h1 id="elektrische-kompatibilitat"&gt;Elektrische Kompatibilität&lt;/h1&gt;
&lt;p&gt;Zwischen den x230 und x220 Tastaturen gibt es einen kleinen Unterschied in den elektrischen Anschlüssen.
Würde man die x220 Tastatur ohne Modifikation in den x230 einbauen könnte es zu einem Kurzschluss und Erhitzen der Tastatur kommen.
Dazu muss man die Blende der Lautstärketasten und Power-Knopf oben links mit einem Schraubendreher leicht herausdrücken.
Danach kann man die Anpressleisten einfach herausschrauben, welche das zweiseitige Flachband, mit der Tastatur verbindet.
&lt;img alt="Keyboard mit offem Flachbandkabel" src="https://www.dj-bauer.de/images/20221226_x230_keyboard_2.jpg" /&gt;
Wenn man dieses Flachband herauslößt, klebt man auf dem unterem Band die Pins 25,27 und 29 ab.
Das heißt, wenn die Tastatur wie man sie bedienen würde vor einem liegt und das Flachband nach oben gehalten ist, sodass man die normalerweise nach unten zeigenden Anschlüsse sieht, sind das der zweite, dritte und vierte Pin von links.
Welche und genau wie ist sehr gut im Wiki-Artikel beschrieben.
Wenn diese abgeklebt sind, kann das ganze wieder zusammengepresst/geschraubt werden.&lt;/p&gt;
&lt;p&gt;Nun kann man schon die alte Tastatur ausbauen und die neue verbinden und testen, ob alles elektrische funktioniert.&lt;/p&gt;
&lt;h1 id="mechanische-kompatibilitat"&gt;Mechanische Kompatibilität&lt;/h1&gt;
&lt;p&gt;Es fällt recht schnell auf, dass die Tastatur noch nicht ganz in das Gehäuse passt.
Die Noppen unten an der Tastatur, sind auf der Classic-Tastatur deutlich dicker und vorher gab es gar keine Noppen unter den Maustasten.
Hierbei hat man zwei Möglichkeiten.
Die einfachste ist es sich eine x220 Handballenablage zu haufen.
Die andere Möglichkeit ist es diese Halte-Noppen abzufeilen(an der Maustaste notwendig oder bei den anderen die Öffnungen in der Handballenauflage vergrößern. 
Dies ist nicht ganz leicht, weshalb das Abfeilen an der Tastatur einfacher ist.&lt;/p&gt;
&lt;h1 id="software-kompatibilitat"&gt;Software Kompatibilität&lt;/h1&gt;
&lt;p&gt;Es gibt einen Firmware-Patch für den Keyboard-Controller um alle neuen Tasten wie aufgedruckt zu nutzen.&lt;/p&gt;
&lt;p&gt;Dies habe ich bisher noch nicht gemacht, ist aber im Wiki verständlich und ausführlich erklährt.
Sobald ich meinen Laptop so neu geflasht habe, werde ich diese Sektion updaten.&lt;/p&gt;</content><category term="2022"/><category term="thinkpad"/><category term="keyboard"/><category term="hacks"/></entry><entry><title>Mit dem Fahrrad von Bonn zum Mont Saint Michel</title><link href="https://www.dj-bauer.de/mit-dem-fahrrad-von-bonn-zum-mont-saint-michel.html" rel="alternate"/><published>2022-07-08T13:52:00+02:00</published><updated>2022-07-08T13:52:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-07-08:/mit-dem-fahrrad-von-bonn-zum-mont-saint-michel.html</id><summary type="html"/><content type="html">&lt;p&gt;To be continued...&lt;/p&gt;</content><category term="Reisen"/><category term="Fahrrad"/><category term="Reisen"/><category term="Zelten"/></entry><entry><title>USB Fahrrad-ladegerät</title><link href="https://www.dj-bauer.de/usb-fahrrad-ladegerat.html" rel="alternate"/><published>2022-06-13T11:30:00+02:00</published><updated>2022-06-13T11:30:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-06-13:/usb-fahrrad-ladegerat.html</id><summary type="html">&lt;p&gt;Unterwegs auf dem Fahrrad sein Handy zu laden ist praktisch. In diesem Fall ist DIY deutlich günstiger, als viele kaufbare Lösungen.&lt;/p&gt;</summary><content type="html">&lt;h1 id="warum"&gt;Warum?&lt;/h1&gt;
&lt;p&gt;In Vorbereitung auf meinen nächste Fahrradtour bin ich auf der Suche um mein Handy unterwegs laden zu können.
Neben einem kleinen Solarpanel möchte ich auch wärend der Fahrt etwas Strom generieren.
Ich bezweifle, dass es viel Strom sein wird, da die Schaltung nicht gerade sehr effezient schein, jedoch kann das kleine Gerät nicht schaden und ist ohnehin ein nettes Einsteigerprojekt in die Welt der Elektronik.
Conrad Elektronik hat vor 4 Jahren auf ihrem Youtube-Channel ein &lt;a href="https://www.youtube.com/watch?v=Ve58MqAyUg0&amp;amp;t=151s"&gt;Video&lt;/a&gt; gemacht, um einen solchen Lader zu bauen.
Allerdings sind die Resourcen, wie Schaltplan, Teileliste etc. nur umständlich zu erreichen.
Darum dieser Artikel.&lt;/p&gt;
&lt;h1 id="teileliste-und-schaltplan"&gt;Teileliste und Schaltplan&lt;/h1&gt;
&lt;p&gt;Die Anzahl an Bauteilen ist relativ kurz.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Teilnummer&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LM2575T-5G&lt;/td&gt;
&lt;td&gt;5V 1A Festspannungsregler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B80C3700-WW+&lt;/td&gt;
&lt;td&gt;Brückengleichrichter 3,7A &lt;br&gt;(überdimensioniert, aber der kleinste für mich verfügbare)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;330µH Spule&lt;/td&gt;
&lt;td&gt;Stehende Induktivität hat bei mir funktioniert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1N5819&lt;/td&gt;
&lt;td&gt;Schottkydiode 40V 1A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100µF Elko&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;330µF Elko&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB-A Buchse&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2x 2-Schraubklemmen&lt;/td&gt;
&lt;td&gt;5mm Raster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Wie oben angemerkt, ist der Schaltungsaufbau aus dem Youtube-Video. Schematik etc, sind aber selbst erstellt.
&lt;img alt="Schaltplan" src="https://www.dj-bauer.de/images/20220613_schaltplan.svg" /&gt;&lt;/p&gt;
&lt;h1 id="entwicklung"&gt;Entwicklung&lt;/h1&gt;
&lt;p&gt;Zuerst habe ich einen Prototypen auf Lochraster gebau, welcher auch funktioniert hat. Auf Grund der dicken Beinchen des Gleichrichters, musste dieser einfach auf dem Board draufgelötet werden.
&lt;img alt="Erster Prototyp auf Lochraster" src="https://www.dj-bauer.de/images/20220613_prototyp.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Nach diesem Testen habe ich den oben gezeigten Schaltplan in KiCad zu einer Platine entworfen.
&lt;img alt="PCB in KiCad Screenshot" src="https://www.dj-bauer.de/images/20220613_pcb_screenshot.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Diesen habe ich dann bei einem der zahlreichen chinesischen PCB-Herstellern fertigen lassen und mir 5 schicke schwarze pcbs nach hause liefern lassen.
Dieser ganze Prozess ist erstaunlich günstig.
Ich glaube ich habe so um die 10€ für 5 gezahlt mit etwa eineinhalb Wochen Lieferzeit.
Hauptsächlich war die Zeit natürlich mit Versand aus Shenzen gefüllt.&lt;/p&gt;
&lt;p&gt;Als die Platinen dann ankamen konnte ich in sehr kurzer Zeit 4 fertige solche Geräte fertigen.
&lt;img alt="Fertige bestückte Platine" src="https://www.dj-bauer.de/images/20220613_board_1.jpg" /&gt;
Das bestücken von einer solchen simplen Platine ist schon deutlich angenehmer, als sich mit Lochraster rumzuschlagen.
Vor allem wenn man bedenkt, dass das Gerät während der Fahrt auch Vibrationen ausgesetzt wird fühle ich mich damit sicherer, dass sich dabei nichts löst.&lt;/p&gt;
&lt;h1 id="anschluss-an-das-fahrrad"&gt;Anschluss an das Fahrrad&lt;/h1&gt;
&lt;p&gt;In diesem Punkt enden warscheinlich die meisten Hobby-Elektronik-Projekte.
Ein fertiges Projekt landet in einer Kiste oder in einer Schublade und wartet darauf eingesetzt zu werden.&lt;/p&gt;
&lt;p&gt;Zuerst brauchen wird einen Anschluss an den Dynamo vom Fahrrad. 
Dafür habe ich mir ein Verlängerungskabel für diese bekannten 12V-Netzteile mit dem Stecker, wo innen der 12V-Pol ist gekauft.
Welchen stecker man benutzt ist eigentlich egal.
Einfach ein Verlängerungskabel ca. 15-20 cm vor der Buchse auseinanderschneiden.
Das Kurze kabel mit der Buchse habe ich dann hinten vor dem Rücklicht in das Stromkabel meines Fahrrads eingelötet.
Die Buchse habe ich dann irgendwie mit Kabelbinder befestigt.
Das längere Ende des Kabels mit dem Stecker wird dann an die Platine Geschraubt.
Dafür wird die Platine einfach in eine klassische Elektrodose geklebt, aus welcher der USB-Port bei Bedarf ausgeschnitten wird.
&lt;img alt="Die Platine in eine Wasserdichte elektro-dose geklebt" src="https://www.dj-bauer.de/images/20220613_box.jpg" /&gt;&lt;/p&gt;
&lt;h1 id="leistung"&gt;Leistung&lt;/h1&gt;
&lt;p&gt;Bei meinen Testfahrten mit Multimeter konnte ich mit meinem Fahrrad bei 20 km/h 4.6V erreichen.
&lt;img alt="Multimeter ans Fahrrad geklebt" src="https://www.dj-bauer.de/images/20220613_multimeter.jpg" /&gt;
Welche tatsächliche Leistung sich aus dem Gerät nun ergibt und wie gut es wirklich lädt wird sich bei mir in der Praxis ergeben.
Ein Update sollte dann folgen.&lt;/p&gt;
&lt;p&gt;Die KiCad-Dateien könnt ihr &lt;a href="/files/fahrradlader.zip" id="tddownload download"&gt;hier&lt;/a&gt; runterladen&lt;/p&gt;</content><category term="Fahrrad"/><category term="Fahrrad"/><category term="Elektronik"/></entry><entry><title>Iocage jail updaten</title><link href="https://www.dj-bauer.de/iocage-jail-updaten.html" rel="alternate"/><published>2022-06-03T11:46:00+02:00</published><updated>2022-06-03T11:46:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-06-03:/iocage-jail-updaten.html</id><summary type="html">&lt;p&gt;Nun muss ich auch mal meine Jails updaten, welche auf meinem Home-Server laufen. Doch das ging dann schneller als gedacht&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seit nun knapp einem Jahr oder so habe ich einen alten Thinkpad x201 auf dem Dachboden stehen, wo er meine Homeassistant-Instanz, die dazugehörige Datenbank, einen CUPS-server und noch ein paar andere Sachen hostet.&lt;/p&gt;
&lt;p&gt;Nun wird es mal Zeit die jails zu updaten, was aber mit iocage auf ZFS erstaunlich einfach ist.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# Alle vergangenen Snapshots anzeigen
iocage snaplist db-homeassistant
# Erstellt automatisch einen snapshot und updated die security patches
iocage update db-homeassistant
# Versionsupgrade
iocage upgrade -r 13.0-RELEASE db-homeassistant
# Nicht vergessen alle pakete zu updaten
iocage console db-homeassistant
pkg update &amp;amp;amp;&amp;amp;amp; pkg upgrade
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So langsam wird auch für mich als Hobby-Admin ZFS sehr angenehm.
Aber ich sollte mal darüber nachdenken die Lüfter zu reinigen. In so einem staubigen Ort wundert es mich nicht, wenn der computer sich wegen überhitzung ausschaltet.&lt;/p&gt;</content><category term="Admin"/><category term="FreeBSD"/><category term="Server"/><category term="Iocage"/></entry><entry><title>Fahrradstadt Bonn</title><link href="https://www.dj-bauer.de/fahrradstadt-bonn.html" rel="alternate"/><published>2022-05-01T16:06:00+02:00</published><updated>2022-05-01T16:06:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-05-01:/fahrradstadt-bonn.html</id><summary type="html">&lt;p&gt;Seitdem Katja Dörner in Bonn im Amt ist tut sich in Sachen Fahrradfreundlichkeit einiges...&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seitdem Katja Dörner in Bonn als Bürgermeisterin im Amt ist tut sich in Sachen Fahrradfreundlichkeit einiges.
Zum Beispiel wurde in den letzten Monaten stückchenweise die Radwege zwischen Bonn Lengsdorf nach Röttgen bis jetzt sogar nach Meckenheim erneuert.
Vorher war der Fahrradweg eher eine Buckelpiste von Wurzel zu Wurzel.
Doch der neue Radweg lässt wirklich sehr wenig zu wünschen übrig.
Komplett glatte Piste, befestigte Radwegseiten und überhängende Büsche entfernt UND reflektierende Begrenzungsstreifen.
Darauf macht es wirklich nochmal Spaß entlang der Landstraße zu fahren und, dass man auch mal ohne große Probleme 40kmh auf ebener Strecke erreichen kann macht das ganze natürlich nur besser.
&lt;img alt="Bild vom Radweg" src="https://www.dj-bauer.de/images/20220501_fahrradstrecke.jpg" /&gt;
DANKE Stadt Bonn. Es tut gut auch mal Ergebnisse zu sehen!&lt;/p&gt;</content><category term="2022"/><category term="Fahrrad"/></entry><entry><title>Das RSA-Verfahren</title><link href="https://www.dj-bauer.de/das-rsa-verfahren.html" rel="alternate"/><published>2022-03-27T12:00:00+02:00</published><updated>2022-03-27T12:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-03-27:/das-rsa-verfahren.html</id><summary type="html">&lt;p&gt;Wie wir schon im &lt;a href="diffie-hellman-protokoll.html"&gt;Diffie-Hellman-Protokoll&lt;/a&gt; gelernt haben, soll unsere Einwegfunktion in eine Richtung einfach sein, und in die andere Richtung sehr aufwendig/unmöglich sein.
Eine andere Variante ist als das RSA-Verfahren bekannt.
Dabei haben wir keinen gemeinsammen geheimen Schlüssel, sonderen nur noch unsere öffentlichen und privaten Schlüssel.&lt;/p&gt;
&lt;h2 id="schlusselgenerierung"&gt;Schlüsselgenerierung&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Wähle die …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;Wie wir schon im &lt;a href="diffie-hellman-protokoll.html"&gt;Diffie-Hellman-Protokoll&lt;/a&gt; gelernt haben, soll unsere Einwegfunktion in eine Richtung einfach sein, und in die andere Richtung sehr aufwendig/unmöglich sein.
Eine andere Variante ist als das RSA-Verfahren bekannt.
Dabei haben wir keinen gemeinsammen geheimen Schlüssel, sonderen nur noch unsere öffentlichen und privaten Schlüssel.&lt;/p&gt;
&lt;h2 id="schlusselgenerierung"&gt;Schlüsselgenerierung&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Wähle die Primzahlen &lt;strong&gt;p&lt;/strong&gt; und &lt;strong&gt;p&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Berechne &lt;strong&gt;N = p * q&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Berechne &lt;strong&gt;r = (p-1)*(q-1)&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Wähle &lt;strong&gt;e&lt;/strong&gt;, sodass &lt;strong&gt;e&lt;/strong&gt; und &lt;strong&gt;r&lt;/strong&gt; keine gemeinsammen Teiler haben&lt;/li&gt;
&lt;li&gt;Wähle &lt;em&gt;d&lt;/em&gt;, sodass &lt;strong&gt;e*d % r = 1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Gib &lt;strong&gt;N und e&lt;/strong&gt; weiter. &lt;strong&gt;d&lt;/strong&gt; ist der geheime Schüssel&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="verschlusseln-der-nachricht-m"&gt;Verschlüsseln der Nachricht m&lt;/h2&gt;
&lt;p&gt;Die Nachricht m wird über &lt;strong&gt; c = M^e % N &lt;/strong&gt; verschlüsselt.&lt;/p&gt;
&lt;h2 id="entschlusseln-des-geheimtextes-c"&gt;Entschlüsseln des Geheimtextes c&lt;/h2&gt;
&lt;p&gt;Wie auch schon bei Diffie-Hellman entschlüsseln wir über die gleiche Operation &lt;strong&gt; m = c^d % N &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Es ist erkennbar, dass sich RSA und Diffie-Hellman im Grunde genommen nur über die Schlüsselberechnung unterscheiden, wobei der gemeinsamme geheime Schlüssel bei Diffie-Hellman dem Klartext entspricht. 
Wir haben auch hier wieder unsere Potenz mit anschschließendem Modulo-Nehmen.&lt;/p&gt;
&lt;h2 id="implementierung-in-java"&gt;Implementierung in Java&lt;/h2&gt;
&lt;p&gt;Der Einfachheit halber habe ich hier nur die Implementierung, um integer zu verschlüsseln abgebildet.
Jedoch kann man sich denken, dass man so auch mit wenig Mehraufwand Text verschlüsseln kann.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KeyPair&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KeyPair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;N&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Einfach ein e finden, was keinen gemeinsammen Teiler mit r hat.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkHasGGT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inv_euklid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;N&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;otherN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;otherE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;otherE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;otherN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// x ist der größte gemeinsamme Teiler, den es zu prüfen gilt.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;checkHasGGT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;extended_euklid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Rekursive Implementierung des Euklidischen Algorithmus, um den ggT zu berrechnen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;extended_euklid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;extended_euklid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;inv_euklid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Da ich mich nicht so tief im Thema CAS (Computer-Algebra-Systeme auskenne, um eine gleichung dazu komplett umzuformen, lasse ich diese Funktion einach als Blackbox, welche das X aus der Gleichung 1 = x * r + y * e zurückgibt&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="lernblog"/></entry><entry><title>Diffie-Hellman Protokoll</title><link href="https://www.dj-bauer.de/diffie-hellman-protokoll.html" rel="alternate"/><published>2022-03-27T12:00:00+02:00</published><updated>2022-03-27T12:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-03-27:/diffie-hellman-protokoll.html</id><summary type="html">&lt;h1 id="warum"&gt;Warum?&lt;/h1&gt;
&lt;p&gt;Das große Problem bei symmetrischen Verschlüsselungsverfahren, die Cäsar oder Vigenere ist der Schlüsselaustausch.
Es ist halt einfach schwierig einen Schlüssel zu verteilen und dann auch noch sicher zu halten.
Besonders ist uns ja bei Vigenere aufgefallen, dass es uns als Angreife mit steigender Menge an Nachrichten immer einfacher wird …&lt;/p&gt;</summary><content type="html">&lt;h1 id="warum"&gt;Warum?&lt;/h1&gt;
&lt;p&gt;Das große Problem bei symmetrischen Verschlüsselungsverfahren, die Cäsar oder Vigenere ist der Schlüsselaustausch.
Es ist halt einfach schwierig einen Schlüssel zu verteilen und dann auch noch sicher zu halten.
Besonders ist uns ja bei Vigenere aufgefallen, dass es uns als Angreife mit steigender Menge an Nachrichten immer einfacher wird,
den Schlüssel zu knacken.
Daher wurden assymetrische Schlüsselverfahren entwickelt, in denen man einen öffentlichen Schlüssel and den Gegenüber geben kann und dieser muss nicht geheim gehalten werden.
Diese Nachricht kann dann nur durch den geheimen privaten Schlüssel wieder entschlüsselt werden.&lt;/p&gt;
&lt;h1 id="ansatz"&gt;Ansatz&lt;/h1&gt;
&lt;p&gt;Am einfachsten ist dies mit dem Diffie-Hellman Protokoll veranschaulichbar indem man die Schlüssel durch Farben darstellt.
&lt;img alt="Diagram" src="https://www.dj-bauer.de/images/lernblog/diffie_hellman.svg" /&gt;
Dabei haben die folgenden Farben folgende Funktionen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hellblau&lt;/strong&gt; ist eine gemeinsamme Farbe. Diese ist öffentlich und wird vorher abgesprochen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rot&lt;/strong&gt; und &lt;strong&gt;Gelb&lt;/strong&gt; sind die geheimen Farben. Diese behalten Bob und Alice ganz für sich.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blau&lt;/strong&gt; und &lt;strong&gt;Grün&lt;/strong&gt; sind die öffentlichen Farben/Schlüssel. Diese werden ausgetauscht.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Braun&lt;/strong&gt; ist der gemeinsamme geheime Schlüssel. Diesen haben nun sowohl Bob und Alice, aber keiner, der den Austausch abhört kommt darauf, solange das Verfahren richtig benutzt wird.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Annahme, ohne die das gesammte Verfahren nicht sicher ist ist, dass die Funktion zum Mischen der Farben nicht umkehrbar ist.
Nicht umkehrbar kann hierbei aber auch einfach ein in nicht absehbarer Zeit knachbar sein bedeuten.
Mit dem gemeinsammen geheimen Schlüssel kann nun symmetrisch die Kommunikation verschlüsselt werden z.B. mit Vigenere.
Wäre die Einwegfunktion nicht umkehrbar, könnte man, da man Dunkelblau und Hellblau abfangen kann auch Rot berechnen.
Daher ist es so wichtig eine gute Einwegfunktion zu haben.&lt;/p&gt;
&lt;h1 id="welche-einwegfunktion-nun"&gt;Welche Einwegfunktion nun?&lt;/h1&gt;
&lt;p&gt;Dafür benutzten wir die Modulo Operation in Kombination mit Potenzen.
Das ganze läuft folgendermaßen ab:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Alice und bob einigen sich auf eine Primzahl &lt;em&gt;p&lt;/em&gt; und eine natürliche Zahl &lt;em&gt;n&lt;/em&gt;, wobei &lt;em&gt;n &amp;lt; p&lt;/em&gt; gilt. Dies ist unser Hellblau&lt;/li&gt;
&lt;li&gt;Alice wählt eine geheime natürliche Zahl &lt;em&gt;a&lt;/em&gt;, wobei &lt;em&gt;a &amp;lt; p-1&lt;/em&gt; und Bob wählt &lt;em&gt;b &amp;lt; p-1&lt;/em&gt;. Dies sind Rot und Gelb.&lt;/li&gt;
&lt;li&gt;Alice berechnet &lt;em&gt;A = g^a % p&lt;/em&gt; und schickt &lt;em&gt;A&lt;/em&gt; an Bob. Also Berechnet Alice nun Blau&lt;/li&gt;
&lt;li&gt;Bob tut nun das selbe für Grün mit &lt;em&gt;B = g^b % p&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Alice und Bob berechnen nun &lt;em&gt;x = B^a&lt;/em&gt; bzw. &lt;em&gt;x = A^b&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Je größer die Primzahl p ist, desto sicherer ist das Verfahren, da nun mehr Primzahlen gebruteforced werden müssen.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Vigénere Verfahren</title><link href="https://www.dj-bauer.de/vigenere-verfahren.html" rel="alternate"/><published>2022-03-26T12:00:00+01:00</published><updated>2022-03-26T12:00:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-03-26:/vigenere-verfahren.html</id><summary type="html">&lt;h1 id="ansatz"&gt;Ansatz&lt;/h1&gt;
&lt;p&gt;Im Grunde genommen ist das Vigénere-Verfahren eine Erweiterung von &lt;a href="casar-verschlusselung.html"&gt;Cäsar&lt;/a&gt;.
Dabei Verschlüsseln wir nicht mit einem konstanten offset, wie bei Cäsar, sondern mit einem Schlüsselwort.
Dabei wird dann das Schlüsselwort so lange hintereinandergeschrieben, bis es die Länge des zu verschlüsselnden textes erreicht.
Dann wird dabei der Index des Schlüssel-Buchstaben …&lt;/p&gt;</summary><content type="html">&lt;h1 id="ansatz"&gt;Ansatz&lt;/h1&gt;
&lt;p&gt;Im Grunde genommen ist das Vigénere-Verfahren eine Erweiterung von &lt;a href="casar-verschlusselung.html"&gt;Cäsar&lt;/a&gt;.
Dabei Verschlüsseln wir nicht mit einem konstanten offset, wie bei Cäsar, sondern mit einem Schlüsselwort.
Dabei wird dann das Schlüsselwort so lange hintereinandergeschrieben, bis es die Länge des zu verschlüsselnden textes erreicht.
Dann wird dabei der Index des Schlüssel-Buchstaben, an der entsprechenden Stelle jedes Klartextbuchstaben zur Cäsarverschlüsselung benutzt.
Da nun nicht mehr der gesammte Text mit einer einzigen Verschiebung verschlüsselt wird, funktioniert hierbei, solange die Schlüsselwortlänge nicht 1 ist, eine normale Häufigkeitsanalyse nicht mehr.
Genau wie bei Cäsar ist hier die Verschlüsselung die gleiche Methodik, wie die Entschlüsselung, abgesehen von der entegengesetzte Richtung bei der Verschiebung&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Text&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;6&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;8&lt;/th&gt;
&lt;th&gt;9&lt;/th&gt;
&lt;th&gt;10&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Schlüssel&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Klartext&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ciffertext&lt;/td&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Vverschluesseln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pKlartext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pSchluesselwort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pSchluesselwort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pSchluesselwort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key_index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;pKlartext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key_index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pSchluesselwort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key_index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pKlartext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pSchluesselwort&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key_index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;key_index&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="knacken"&gt;Knacken&lt;/h1&gt;
&lt;p&gt;Wie oben schon angesprochen kann man Vigenere nicht mehr über eine einfache Häufigkeitsanalyse knacken.
Jedoch lässt sich eine Häufigkeitsanalyse durchführen, wenn man die Länge des Schlüssels besitzt.
Denn dann kann man eine Häufigkeitsanalyse auf jeden Buchstaben des Schlüssels anwenden und dadurch den jeweiligen Versatz herausfinden.
Deshalb ist auch ein Bruteforcen durch längere Schlüssel immer weniger effizient.&lt;/p&gt;
&lt;h2 id="kasiski-test"&gt;Kasiski-Test&lt;/h2&gt;
&lt;p&gt;Der erste Ansatz die Schlüsselwortlänge zu bestimmen ist der s.g. Kasiski Test.
Dabei versuchen wir Glück zu haben und gleiche Schlüsselwortbuchstaben auf gleiche Klartextbuchstabenfolgen mehrmals treffen zu lassen.
Als Beispiel kann man sich das vorstellen, dass z.B. das Wort &lt;em&gt;Die&lt;/em&gt; relativ häufig in einem Satz vorkommt.
Daher gibt es eine warscheinlichkeit, dass an mehreren Stellen z.B. das &lt;em&gt;hal&lt;/em&gt; aus dem Schlüssel &lt;em&gt;Hallo&lt;/em&gt; genau dieses Wort veschlüsselt.
Dies sehen wir dann anhand von Mustern im Ciffertext.
Daher ist Vigenere bei kürzeren Schlüsseln relativ unsicher.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;EYRYCFWL JHFHSIUB HMJOUCSE GTNEERFL JLVSXMVY SSTKCMIK ZSJHZVBF XMXKPMMV WOZSIAFC RVFTNERH
MCGYSOVY VFPNEVHJ AOVWUVYJ UFOISHXO VUSFMKRP TWLCIFMW VZTYOISU UIISECIZ VZVYVFPC QUCHYRGO
MUWKVBNX VBVHHWIF LMYFFNEV HJAOVWUL YERAYLER VEEKSOCQ DCOUXSSL UQVBFMAL FEYHRTVY VXSTIVXH
EUWJGJYA RSILIERJ BVVFBLFV WUHMTVUA IJHPYVKK VLHVBTCI UISZXVBJ BVVPVYVF GBVIIOVW LEWDBXMS
SFEJGFHF VJPLWZSF CRVUFMXV ZMNIRIGA ESSHYPFS TNLEHUYR
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wenn man sich nun Muster heraussucht und deren Abstände misst, so kann man diese Abstände per Primfaktorzerlegung zerlegen.
Und diese Faktoren geben einem Rückschlüsse auf die schlüssellänge.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Folge&lt;/th&gt;
&lt;th&gt;Abstand&lt;/th&gt;
&lt;th&gt;Primfaktoren&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TNE&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;2 * 2 * &lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FCRV&lt;/td&gt;
&lt;td&gt;275&lt;/td&gt;
&lt;td&gt;7 * &lt;strong&gt;5&lt;/strong&gt; * &lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEVHJAOVWU&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;3 * 3 * 2 * 2 * &lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VWU&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;3 * &lt;strong&gt;5&lt;/strong&gt; * 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OIS&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;5 * &lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Da wir als Primfaktoren nun eine extrem hohe Anzahl an fünfen finden können wir als Resultat des Kasiski-Testes Fünf als &lt;strong&gt;Potenzielle Schlüssellänge ansehen&lt;/strong&gt;.
Dies ist aber keine Garantie.&lt;/p&gt;
&lt;h2 id="friedman-test"&gt;Friedman-Test&lt;/h2&gt;
&lt;p&gt;Der Friedman-Test nimmt einen Mathematischen Ansatz auf Basis der Warscheinlichkeiten, dass ein zufälligges Buchstabenpaar aus dem Klartext aus den gleichen Buchstaben besteht.
Wenn unser Text aus einer komplett zufälligen Buchstabenfolge besteht ist die Anzahl der gleichen Paare
&lt;img alt="Formula 1" src="https://www.dj-bauer.de/images/lernblog/friedman_1.svg" /&gt;
Daher ist die Warscheinlichkeit, dass dies Auftritt hiermit berechnen. (Einfach durch die anzahl der möglichen Fälle von Buchstabenkombinationen teilen und weiter umformen.
&lt;img alt="Formula 2" src="https://www.dj-bauer.de/images/lernblog/friedman_2.svg" /&gt;
Diese Warscheinlichkeit wird auch der Friedmansche Koinzidenzindex &lt;em&gt;I&lt;/em&gt; genannt und ist für jede Sprache verschieden.
Im Deutschen ist dieser &lt;code&gt;I_d = 0.0762&lt;/code&gt;.
Als Angreifer berechnen wir nun den Index &lt;em&gt;I&lt;/em&gt; für unseren Text.
Je länger das Schlüsselwort wird, desto geringer ist diese Warscheinlichkeit von Mustern.
Daher wird dabei unser &lt;em&gt;I&lt;/em&gt; immer kleiner.
Daraus lässt sich die Formel für die Schlüsselwortlänge &lt;em&gt;h&lt;/em&gt; herleiten.
&lt;img alt="Formula 3" src="https://www.dj-bauer.de/images/lernblog/friedman_3.svg" /&gt;
Diese ist eine dezimalzahl und ist daher nur gerundet nutzbar und ist natürlich auch wieder nicht garantiert.&lt;/p&gt;
&lt;h1 id="meine-eigene-losung"&gt;Meine Eigene Lösung&lt;/h1&gt;
&lt;p&gt;Ich habe eine recht coole eigene C++ Applikation unter dem Namen &lt;a href="https://www.gitlab.com/dj-bauer/dj-crypt"&gt;DJ-Crypt&lt;/a&gt; geschrieben, um den Kasiski und Friedman Test fast automatisch durchzuführen. 
Es bietet mehrere Werkzeuge, um die Schlüssellänge und über Häufigkeitsanalyse auch den Schlüssel zu finden.
&lt;img alt="Screenshot" src="https://www.dj-bauer.de/images/lernblog_dj_crypt.png" /&gt;&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Kryptologie</title><link href="https://www.dj-bauer.de/kryptologie.html" rel="alternate"/><published>2022-02-15T16:15:00+01:00</published><updated>2022-02-15T16:15:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-02-15:/kryptologie.html</id><summary type="html">&lt;p&gt;Kryptologie beschreibt die Kommunikation zwischen zwei Parteien ohne die Inteferenz oder das Mitlesen von Dritten&lt;/p&gt;</summary><content type="html">&lt;p&gt;Das Ziel der &lt;strong&gt;Kryptographie&lt;/strong&gt; ist es Nachrichten auszutauschen, und dabei die Authentität der Nachricht und die Geheimhaltung der Nachricht zu gewärleisten
Ein Beispiel dafür wäre der &lt;a href="casar-verschlusselung.html"&gt;Cäsar&lt;/a&gt; Verschlüsselungsalgorithmus.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Graph für die Kryptologie" src="https://www.dj-bauer.de/images/lernblog_krypto.svg" /&gt;&lt;/p&gt;
&lt;p&gt;Dabei ist es von Vorteil, wenn der Empfänger den verschlüsselten Text auch wieder eindeutig entschlüsseln kann.
Am besten noch in akzeptabler Laufzeit.&lt;/p&gt;
&lt;p&gt;Bei der &lt;strong&gt;Kryptoanalyse&lt;/strong&gt; dagegen geht es darum verschlüsselte Texte/Daten wieder zu entschlüsseln und die Methoden oder Schlüssel zu knacken.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Kryptgraphie + Kryptoanalyse = Kryptologie&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ein solches System, wie der &lt;a href="casar-verschlusselung.html"&gt;Cäsar-Algorithmus&lt;/a&gt; kann man dabei durch einen 5-Tupel &lt;code&gt;S=(P,C,K,E,D)&lt;/code&gt; darstellen mit den folgenden Elementen&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;P&lt;/em&gt; ist die endliche Menge von Klartexten&lt;/li&gt;
&lt;li&gt;&lt;em&gt;C&lt;/em&gt; ist die endliche Menge an Chiffretexten&lt;/li&gt;
&lt;li&gt;&lt;em&gt;K&lt;/em&gt; ist eine endliche Menge an Schlüsseln&lt;/li&gt;
&lt;li&gt;&lt;em&gt;E&lt;/em&gt; ist die Menge der Verschlüsselungsfunktionen mit e&lt;sub&gt;k&lt;/sub&gt; ∀ k ∈ K&lt;/li&gt;
&lt;li&gt;&lt;em&gt;D&lt;/em&gt; sind die Funktionen zur Entschlüsselung mit d&lt;sub&gt;k&lt;/sub&gt; ∀ k ∈ K&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Selbstverständlich gibt die Entschlüsselungsfunktion mit Verschlüsselungsfunktion vom Text T als Eingabe wieder den Text T zurück.&lt;/p&gt;
&lt;p&gt;Daher gilt: d&lt;sub&gt;k&lt;/sub&gt;(e&lt;sub&gt;k&lt;/sub&gt;(x)) = x ∀ k ∈ K&lt;/p&gt;
&lt;h2 id="beispiel"&gt;Beispiel&lt;/h2&gt;
&lt;p&gt;Als Beispiel ist hier das Kryptosystem für Cäsar mit der Verschiebung 5:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;P = {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z}&lt;/li&gt;
&lt;li&gt;C = {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z}&lt;/li&gt;
&lt;li&gt;K = {0 ≤ k ≤ 26}&lt;/li&gt;
&lt;li&gt;Siehe Tabelle&lt;/li&gt;
&lt;li&gt;Siehe Tabelle von unten nach oben ;)&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;a&lt;/th&gt;
&lt;th&gt;b&lt;/th&gt;
&lt;th&gt;c&lt;/th&gt;
&lt;th&gt;d&lt;/th&gt;
&lt;th&gt;e&lt;/th&gt;
&lt;th&gt;f&lt;/th&gt;
&lt;th&gt;g&lt;/th&gt;
&lt;th&gt;h&lt;/th&gt;
&lt;th&gt;i&lt;/th&gt;
&lt;th&gt;j&lt;/th&gt;
&lt;th&gt;k&lt;/th&gt;
&lt;th&gt;l&lt;/th&gt;
&lt;th&gt;m&lt;/th&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;th&gt;o&lt;/th&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;th&gt;q&lt;/th&gt;
&lt;th&gt;r&lt;/th&gt;
&lt;th&gt;s&lt;/th&gt;
&lt;th&gt;t&lt;/th&gt;
&lt;th&gt;u&lt;/th&gt;
&lt;th&gt;v&lt;/th&gt;
&lt;th&gt;w&lt;/th&gt;
&lt;th&gt;x&lt;/th&gt;
&lt;th&gt;y&lt;/th&gt;
&lt;th&gt;z&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;J&lt;/td&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="lernblog"/></entry><entry><title>Cäsar Verschlüsselung</title><link href="https://www.dj-bauer.de/casar-verschlusselung.html" rel="alternate"/><published>2022-02-15T15:53:00+01:00</published><updated>2022-02-15T15:53:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-02-15:/casar-verschlusselung.html</id><summary type="html">&lt;p&gt;Die Cäsar Verschlüsselung ist eine der einfachsten Verschlüsselungsarten&lt;/p&gt;</summary><content type="html">&lt;p&gt;Das Cäsar-Verfahren ist ein simples Verfahren zum Verschlüsseln von Texten, welches zur Zeit von Cäsar bekannt wurde.
Jedoch ist nicht bewiesen ob Cäsar es erfunden oder benutzt hat.&lt;/p&gt;
&lt;p&gt;Die Grundlegende Idee ist es das Alphabet um einen festen Betrag(&lt;em&gt;n&lt;/em&gt;) zu verschieben.
So kann bei &lt;em&gt;n=3&lt;/em&gt; ein &lt;code&gt;A&lt;/code&gt; zu einem &lt;code&gt;D&lt;/code&gt; werden oder ein &lt;code&gt;Z&lt;/code&gt; zu einem &lt;code&gt;C&lt;/code&gt;.
Dies bedeutet, dass Überträge wieder am anderen Ende des Alphabets weitergehen.
Darum kann dieses Verfahren einfach mit zwei mechanischen Scheiben umgesetzt werden.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cäsar Scheibe" src="https://www.dj-bauer.de/images/lernblog_caesar.svg" /&gt;
&lt;em&gt;&lt;a href="https://openclipart.org/detail/298847/ceasar-cipher-tepmlate"&gt;Quelle&lt;/a&gt; (Editiert)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Man verdreht einfach die innere Scheibe um n Stellen, um die Verschiebung herauszufinden.
Wenn man sich vorher einigt welche Scheibe den Klartext und welche den verschlüsselten Text kann man genau ablesen welche Buchstaben in welche umgewandelt werden.&lt;/p&gt;
&lt;p&gt;Das Cäsar verfahren nennt man &lt;strong&gt;Monoalphabetisch&lt;/strong&gt;, da unser bekanntes Alphabet in ein anderes mit dem selben Muster umgewandelt wird.
Dies ist problematisch, da es dadurch nur 25 (26Buchstaben - 1Startposition) mögliche Verschiebungen gibt, welche es recht einfach machen das Verfahren zu knacken.
Daher gibt es ebenfalls &lt;strong&gt;Polyalphabetische&lt;/strong&gt; Verfahren, in denen mithilfe einer Tabelle ein Buchstabe durch einen anderen ausgetauscht wird.
Dadurch kann man noch nicht direkt durch herausfinden eines Buchstabens auf die anderen schließen.&lt;/p&gt;
&lt;p&gt;Jedoch haben beide Verfahren das Problem der einfachen Knackbarkeit durch eine &lt;strong&gt;Häufigkeitsanalyse&lt;/strong&gt;.
Dabei wird das vorkommen der Buchstaben im Text gezählt.
Es ist in jeder Sprache bekannt, welche Buchstaben im Schnitt welchen Anteil haben.
So lassen sich die häufigsten Bustaben durch z.B &lt;em&gt;E&lt;/em&gt; oder &lt;em&gt;N&lt;/em&gt; ersetzen.
Durch ein bisschen knobeln und ausprobieren kommt man so immer schneller an die richtigen Buchstaben und kann den Text entschlüsseln.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Dijkstra-Algorithmus</title><link href="https://www.dj-bauer.de/dijkstra-algorithmus.html" rel="alternate"/><published>2022-02-14T17:45:00+01:00</published><updated>2022-02-14T17:45:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-02-14:/dijkstra-algorithmus.html</id><summary type="html">&lt;p&gt;Der Dijkstra ist ein bekannter und belibter greedy pathfinding-Algorithmus&lt;/p&gt;</summary><content type="html">&lt;h1 id="grundlegende-idee"&gt;Grundlegende Idee&lt;/h1&gt;
&lt;p&gt;Häufig steht man vor der Herausforderung den kürzesten Weg zwischen zwei Knoten in einem Graph zu finden.
Dazu bietet sich der Dijkstra-Algorithmus, oder manchmal auch als Ameisenalgorithmus bekannt, an.
Wenn es sich bei dem Graphen um einen ungewichteten handelt, bringt die Breitensuche zu einem bestimmten Knoten einem schon den kürzesten Weg.
Dijkstra dagegen kann in einem gewichteten Graphen (mit nichtnegativen Gewichten) den kürzesten Weg bestimmen.&lt;/p&gt;
&lt;p&gt;Für Dijkstra bekommt jeder Knoten zusätzlich zu seinem bisherigen Attributen noch ein Gewicht und eine Referenz auf den vorherigen Knoten dazu.
Das Gewicht repräsentiert dabei die Summe der Gewichte der Kanten, welche den kürzesten Weg zu diesem Knoten vom Start aus bilden.
Der vorherige Knoten ist dabei der Knoten, welcher auf der kürzesten Verbindung zum Startknoten vor diesem liegt.&lt;/p&gt;
&lt;h1 id="algorithmus"&gt;Algorithmus&lt;/h1&gt;
&lt;p&gt;Der Dijkstra basiert auf der Funktionsweise, dass man die Kante mit der kürzesten Verbindung am bisher abgelaufenen Graphen betrachtet, und sich überlegt, ob diese Kante einen Knoten besser(also mit geringerer Kantensumme) mit dem Startknoten verbindet.
Dabei kann man noch nicht "entdeckte" Knoten sehen, als hätten diese ein unendlich hohes Gewicht.
Zuallererst müssen wir also die Knoten, welche durch vom Startknoten ausgehende Kanten erreichbar sind betrachten.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;PriorityQueue&lt;/span&gt; &lt;span class="n"&gt;pq&lt;/span&gt;
&lt;span class="n"&gt;StartKnoten&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;StartKnoten&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="n"&gt;StartKnoten&lt;/span&gt; &lt;span class="n"&gt;zu&lt;/span&gt; &lt;span class="n"&gt;pq&lt;/span&gt;
&lt;span class="n"&gt;SOLANGE&lt;/span&gt; &lt;span class="n"&gt;pq&lt;/span&gt; &lt;span class="n"&gt;nicht&lt;/span&gt; &lt;span class="n"&gt;leer&lt;/span&gt;
    &lt;span class="n"&gt;nimm&lt;/span&gt; &lt;span class="n"&gt;den&lt;/span&gt; &lt;span class="n"&gt;obersten&lt;/span&gt; &lt;span class="n"&gt;Knoten&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="n"&gt;aus&lt;/span&gt; &lt;span class="n"&gt;pq&lt;/span&gt;
    &lt;span class="n"&gt;WENN&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="n"&gt;IST&lt;/span&gt; &lt;span class="n"&gt;ZielKnoten&lt;/span&gt;
        &lt;span class="n"&gt;ENDE&lt;/span&gt;
    &lt;span class="n"&gt;WENN&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WEIGHT&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;BerechneGewicht&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;Für&lt;/span&gt; &lt;span class="n"&gt;alle&lt;/span&gt; &lt;span class="n"&gt;Nachbarn&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="n"&gt;von&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;
            &lt;span class="n"&gt;WENN&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WEIGHT&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WEIGHT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Distanz&lt;/span&gt; &lt;span class="n"&gt;zwischen&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="n"&gt;und&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WEIGHT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Distanz&lt;/span&gt; &lt;span class="n"&gt;zwischen&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="n"&gt;und&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;
                &lt;span class="n"&gt;Füge&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="n"&gt;zu&lt;/span&gt; &lt;span class="n"&gt;pq&lt;/span&gt; &lt;span class="n"&gt;hinzu&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="implementierung"&gt;Implementierung&lt;/h1&gt;
&lt;p&gt;Daher können wir auch wieder eine Priority-Queue benutzen, um die Knoten mit dem geringsten Gewicht abzuspeichern.
Da wir die tollen Java-Klassen des Landes NRW benutzen müssen, musste man bei der Implementierung gewisse merkwürdige "Hacks" anwenden, wie bei mir die Hashmap zum zuordnen von Gewicht/Vorgänger zu den Knoten.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;dijkstra2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DijkstraData&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllEdgeMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllVertexMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DijkstraData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;BinarySearchTree&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;VertexEntry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BinarySearchTree&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VertexEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DijkstraData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;VertexEntry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getMinV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pq&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;pq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ve&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNeighbours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new_weight&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getWeight&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DijkstraData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new_weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;pq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VertexEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new_weight&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DijkstraData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;graphA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zeichnen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retrace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Das Gewicht ist: &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVertices&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEdges&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;retrace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DijkstraData&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="lernblog"/></entry><entry><title>Wie unglaublich nett doch Autofahrer sein können</title><link href="https://www.dj-bauer.de/wie-unglaublich-nett-doch-autofahrer-sein-konnen.html" rel="alternate"/><published>2022-01-27T14:16:00+01:00</published><updated>2022-01-27T14:16:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-01-27:/wie-unglaublich-nett-doch-autofahrer-sein-konnen.html</id><summary type="html">&lt;p&gt;Gedächnisprotokoll 45min später&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ist mir gerade direkt nach der Schule passiert.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: &lt;em&gt;Sehe Autofahrer direkt vor dem Schulausgang auf dem Fahrradschutzstreifen warten. Gehe hin und mache optisch auf mich aufmerksam.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: &lt;em&gt;Fährt die Scheibe runter&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: Sie wissen, dass das hier ein Fahrradschutzstreifen ist, oder?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: Ja, ich bin a nicht blöd.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: Dann wissen Sie ja, dass Sie hier nicht drauf dürfen&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: &lt;strong&gt;Hat man dir ins Gehirn geschissen oder was?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: Sie wollten hier wegfahren.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: Jaaa, im laufe des Tages, wenn mein Sohn kommt fahre ich hier weg.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: Dann wissen Sie ja auch, dass die Schulleitung Sie angewiesen hat Ihre Kinder im 150m Umkreis abzuholen. Das hier sind 8 Meter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: &lt;em&gt;Fährt die Scheibe wieder hoch&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: &lt;em&gt;Bleibe stehen und mache Handzeichen, dass er wegfahren soll&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: &lt;em&gt;Fährt die Scheibe wieder runter&lt;/em&gt; &lt;strong&gt;Was soll den das Arschloch?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: Sie wollen hier wegfahren.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: &lt;em&gt;Murmelt irgendwelche Beleidigungen&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ich&lt;/strong&gt;: Gut, dann gibt's halt ne Anzeige. &lt;em&gt;Hole mein Handy raus&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autofahrer&lt;/strong&gt;: &lt;em&gt;Fährt unter &lt;strong&gt;vierfachem Mittelfinder&lt;/strong&gt; Zeigen weg&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dies ist direkt vor dem Haupteingang der Schule passiert, an welchem es nicht ohne Grund eine Kette gibt, um Kinder am Ein- und Aussteigen zu hindern.
Lohnt sich hierbei ne Anzeige wegen Beleidigung?
Also ich meine die 3 Beschimpfungen wären im Straßenverkehr jeweils ja schon 200-400€.&lt;/p&gt;</content><category term="2022"/><category term="Fahrrad"/><category term="Autofahrer"/></entry><entry><title>Ohne fremde Cloud von Android Backups machen</title><link href="https://www.dj-bauer.de/ohne-fremde-cloud-von-android-backups-machen.html" rel="alternate"/><published>2022-01-24T19:21:00+01:00</published><updated>2022-01-24T19:21:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-01-24:/ohne-fremde-cloud-von-android-backups-machen.html</id><summary type="html">&lt;p&gt;Unter Android ist es ganz einfach möglich seine sein Telefon auf einen eigenen Nextcloud server zu sichern.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nachdem ich von &lt;a href="/"&gt;Nokia mit meinem alten Telefon enttäuscht wurde&lt;/a&gt; habe ich mir nun ein Google Pixel 3a gekauft, da ich dort einfach ein LineageOS mit MicroG "draufklatschen" konnte und mir keine Gedanken mangelnden Support in den nächsten Jahren machen muss.
Dort ist mir dann erstmals die &lt;strong&gt;Seedvault&lt;/strong&gt; ins Auge gefallen.
Dies ist eine native Android-App, welche es erlaubt ganz einfach Backups in die Nextcloud oder auf einen per OTG angeschlossenen USB-Stick zu machen.
Mann muss einfach nur die normale Nextcloud app installiert und konfiguriert haben und dann die entsprechenden zu sichernden Optionen auswählen.
Dazu muss man in den Einstellungen auf &lt;strong&gt;System -&amp;gt; Advanced -&amp;gt; Backup -&amp;gt; Seedvault Backup&lt;/strong&gt; gehen und die location auswählen.
Wenn das Backup bei einem nicht automatisch startet, dann klickt man oben rechts auf die drei Punkte und kann dort &lt;strong&gt;Backup now&lt;/strong&gt; auswählen.&lt;/p&gt;</content><category term="2022"/><category term="Android"/><category term="Nextcloud"/><category term="Backup"/></entry><entry><title>Mein neues Fahrrad</title><link href="https://www.dj-bauer.de/mein-neues-fahrrad.html" rel="alternate"/><published>2022-01-24T18:16:00+01:00</published><updated>2022-01-24T18:16:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-01-24:/mein-neues-fahrrad.html</id><summary type="html">&lt;p&gt;Seit Jahren ist es mein Traum nach dem Abi eine lange Radtour zu machen. Deshalb habe ich letztes Jahr ein neues Fahrrad gekauft und nach den ersten 600 km will ich nun meine Erfahrung berichten.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seit meiner Rückkehr aus dem Ausland plane ich eine lange Fahrradtour zu machen.
Dafür musste ein Fahrrad her, was den Belastungen und Strapazen einer solchen Reise standhalten kann.
Nach längerer Recherche und Beratung habe ich mich dazu entschlossen mir ein Randonneur zuzulegen.
Dies ist quasi eine Mischklasse aus Rennrad und Gravelbike.
Dabei kann man durch die Wahl der Komponenten den Grad von Offroad-Fähigkeiten und schnellem Reisen bestimmen.&lt;/p&gt;
&lt;p&gt;Als Hersteller fiel meine Wahl auf &lt;a href="https://www.poison-bikes.de"&gt;Poison Bikes&lt;/a&gt;.
Dort wurde ich vor Ort äußerst kompetent beraten.
Ich habe mich für ein Cyanit Randonneur aus Stahl entschieden.
Dabei habe ich darauf geachtet die Komponenten so auszuwählen, dass das Fahrrad auf lange Strecken mit viel Gepäck getrimmt ist.
Deshalb habe ich mich für eine 22-Gang Shimano GRX600 Schaltung entschieden, um es gerade beim Anfahren auf Hängen  leichter zu haben.
Darum waren auch Gepäckträger und Lowrider (also welche vorne) ein muss.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bild vom Fahrrad" src="https://www.dj-bauer.de/images/20220124_fahrrad.jpg" /&gt;.&lt;/p&gt;
&lt;p&gt;Bisher hatte ich noch kein so hochwertiges Fahrrad und ich muss sagen, dass zwischen einem einfachen und so einem Fahrrad Welten liegen.
Das Fahrgefühl, besonders über Wurzeln unter den hervorragend gepflegten Fahrradwegen, wird mit dem Stahlramen massiv abgefedert, wenn man es mit einem Alu-Rad vergleicht.&lt;/p&gt;
&lt;p&gt;Was jedoch unabhängig vom Fahrrad jeder ausprobieren sollte ist ein solcher ergonomischer Sattel z.B. von SQlab.
So einen Sattel kauft man genau an den richtigen Hüftknochenabstand angepasst.
So sitzen die Hüftknochen genau auf den ablagen und das gesammte Gewicht lastet auf diesen anstatt auf die weicheren Teile zu gehen.&lt;/p&gt;
&lt;p&gt;Es ist ganz erstaunlich, wie viel schneller so ein Fahrrad ist, als ein klassisches Trecking-Stadtrad.&lt;/p&gt;</content><category term="2022"/><category term="Fahrrad"/></entry><entry><title>Spannbäume</title><link href="https://www.dj-bauer.de/spannbaume.html" rel="alternate"/><published>2022-01-23T00:07:00+01:00</published><updated>2022-01-23T00:07:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-01-23:/spannbaume.html</id><summary type="html">&lt;p&gt;Ein Spannbaum ist in der Graphentheorie ein Teilgraph eines ungerichteten Graphen, der ein Baum ist und alle Knoten dieses Graphen enthält.&lt;/p&gt;</summary><content type="html">&lt;h1 id="was-ist-ein-spannbaum"&gt;Was ist ein Spannbaum?&lt;/h1&gt;
&lt;p&gt;Ein Spannbaum ist in der Graphentheorie ein Teilgraph eines ungerichteten &lt;a href="grundlagen-der-graphentheorie.html"&gt;Graphen&lt;/a&gt;, der ein Baum ist und alle Knoten dieses Graphen enthält.
&lt;img alt="Bild eines Spannbaumes" src="https://www.dj-bauer.de/images/lernblog_spannbaum.png" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein Graph kann mehrere Spannbäume haben.&lt;/li&gt;
&lt;li&gt;So kann ein vollständiger Graph nach dem Satz von Cayley bis zu &lt;em&gt;n^(n-2)&lt;/em&gt; Spannbäume haben.&lt;/li&gt;
&lt;li&gt;Ebenfalls hat jeder zusammenhängende Graph mindesten einen Spannbaum, da man von jedem Knoten über (Um)-Wege jeden anderen Knoten erreichen kann. Somit kann man über diese Verbindungen einen Baum erzeugen.
Man kann einen Spannbaum z.B über die Breitesuche oder Tiefensuche erzeugen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="breitensuche"&gt;Breitensuche&lt;/h2&gt;
&lt;p&gt;Bei der Breitensuche geht man von einem Startknoten aus und geht dann von diesem nacheinander alle Kinderknoten ab.
Nachdem diese Kinderknoten abgesucht werden, werden deren Kinder abgesucht und so weiter.
Der Rekursive Algorithmus in Java implementiert und mit einer Queue relativ trivial implementiert.
Jeder noch abzulaufende Knoten wird einfach zu der &lt;a href="stacks-queues-und-listen.html#queue"&gt;Queue&lt;/a&gt; hinzugefügt.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;breitensuche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pZiel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;pGraph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pGraph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllVertexMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pGraph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllEdgeMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pZiel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;())){&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;tfBreitendurchlauf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pStart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;front&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pGraph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNeighbours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isMarked&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pZiel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="tiefensuche"&gt;Tiefensuche&lt;/h2&gt;
&lt;p&gt;In der Tiefensuche werden zuerst alle Kinder und dessen ersten Kindes eines Startknoten abgelaufen bevor das nächste Kind abgesucht wird.
Rekursiv ist die Implementierung recht simpel.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tiefensucheRek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ziel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllVertexMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllEdgeMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;tiefenSchritt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ziel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;tiefenSchritt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getID&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNeighbours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isMarked&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;tiefendurchlauf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;neighbours&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="minimaler-spannbaum"&gt;Minimaler Spannbaum&lt;/h1&gt;
&lt;p&gt;Wenn man einen Graphen mit &lt;strong&gt;gewichteten Kanten&lt;/strong&gt; hat, dann kann man bei der Erstellung des Spannbaumes die Summe der Gewichte der benutzten Kanten nehmen.
Diese Summe nennt man das Gewicht des Spannbaumes.
Daher ist ein minimaler Spannbaum ein Spannbaum eines Graphen mit der &lt;strong&gt;minimalen Summe der Kantengewichte&lt;/strong&gt;.
&lt;img alt="Ein Markierter minimaler Spannbaum" src="https://www.dj-bauer.de/images/lernblog_spannbaum.svg" /&gt;
Wird zu:
&lt;img alt="Ein Minimaler Spannbaum" src="https://www.dj-bauer.de/images/lernblog_min_spannbaum.svg" /&gt;&lt;/p&gt;
&lt;h2 id="der-algorithmus-von-prim"&gt;Der Algorithmus von Prim&lt;/h2&gt;
&lt;p&gt;Schon in 1930 hat der Tschechische Mathematiker Jarkník den Algorithmus gefunden, welcher von Prim in 1957 bekannt gemacht wurde.
Dieser geht folgendermaßen vor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Man wählt einen beliebigen Knoten als Startknoten und fügt diesen zum Ergebnissgraphen hinzu&lt;/li&gt;
&lt;li&gt;Man wählt die Kante mit dem geringsten Gewicht, welche einen Knoten des Ergebnisgraphen mit einem noch nicht entdeckten Knoten verbindet.&lt;/li&gt;
&lt;li&gt;Man fügt die Kante und den Knoten zum Ergebnisgraphen hinzu&lt;/li&gt;
&lt;li&gt;Dies führt man solange durch, bis alle Knoten entdeckt sind.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Man könnte das ganze in Pseudocode folgendermaßen notieren&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Markiere Startknoten V
Füge V zum Ergebnisgraphen E hinzu
Solange noch nicht alle Knoten markiert
    Kante K mit kleinstem Gewicht zu unmarkiertem Knoten U
    Markiere K und U
    Füge K und U zu E hinzu
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dieser Algorithmus findet immer einen minimalen Spannbaum, da es auch mehrere geben kann.
Ein Nachteil ist, dass dieser Algorithmus bei einem nicht-zusammenhängenden Graphen nicht terminiert und nicht funktioniert.
Prim startet also bei einem Startknoten und arbeitet sich von diesem Graphen stück-für-Stück weiter vor und erweitert immer weiter den Graphen, bis alle Knoten enthalten sind.
Allerdings ist der Ansatz sehr intuitiv, genauso wie die Implementierung in Java.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;BinarySearchTree&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;EdgeEntry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to_discover&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BinarySearchTree&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllEdgeMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAllVertexMarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Die Kanten des Start-Vertex zur Queue hinzufügen&lt;/span&gt;
&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVertices&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start_edges&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEdges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;start_edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;to_discover&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EdgeEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;start_edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;allVerticesMarked&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Die Kante mit dem geringsten Gewicht rausziehen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EdgeEntry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getMin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_discover&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to_discover&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVertices&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getVertices&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Vertex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to_add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isMarked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isMarked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isMarked&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;to_add&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addVertex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_add&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Alle Kanten des neu gefundenen Knotens hinzufügen&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Edge&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEdges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_add&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFirst&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;to_discover&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EdgeEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="der-algorithmus-von-kruskal"&gt;Der Algorithmus von Kruskal&lt;/h2&gt;
&lt;p&gt;1956 hat Joseph Kruskal einen weiteren Weg veröffentlicht einen minimalen Spannbaum eines Graphen zu erstellen.
Dazu hat er den folgenden Pseudocode&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Probiere solange wie möglich
    Markiere von den noch nicht markierten Kanten die Kante mit dem geringsten Gewicht, welche auch keinen Kreis bildet
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Oder auch:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;V = ungenutzte Knoten
E = ungenutzte Kanten
MST = Neue Kanten (Leer)
sortiere E aufsteigend
für jede Kante e in E:
    entferne aus E
    wenn MST mit e keine Kreise enthält:
        Füge e zu MST hinzu
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dadurch werden zuerst aller kleinen Kanten hinzugefügt und später die immer längeren.
Sobald ein Kreis entstehen würde, wissen wir, dass wir diese Kante nicht brauchen würden, da wir alle beteiligten Knoten schon im Baum verbunden haben.
Dadurch baut er einen Spannbaum Stück für Stück auf, bis er alle Knoten enthält.
Dies berücksichtigt auch nicht-zusammenhängende Graphen, da er keinen Start-Knoten hat und damit unabhängig von der existierenden Verbindungen im Graphen versucht den Ergebnisgraphen zu bauen.
Ebenfalls muss der Ergebnisgraph vor vollendung des Algorithmus nicht zusammenhängend sein.
Es kann sein, dass sich an verschiedenen Stellen verschiedenen Kanten hinzufügen, bis diese irgendwann verbunden werden.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Grundlagen der Graphentheorie</title><link href="https://www.dj-bauer.de/grundlagen-der-graphentheorie.html" rel="alternate"/><published>2022-01-20T08:13:00+01:00</published><updated>2022-01-20T08:13:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2022-01-20:/grundlagen-der-graphentheorie.html</id><summary type="html">&lt;p&gt;Der Aufbau eines Computers ist seit den ersten Modellen weitestgehend unverändert. Auch wenn sich innerhalb der einzelnen Komponenten einiges geändert hat, bleibt der Aufbau des Computers gleich und auch im kleinen Modell nachvollziehbar.
Ein Graph ist eine Menge von Knoten, welche durch Kanten verbunden werden. Und damit kann man eine Menge tolle Dinge machen. :)&lt;/p&gt;</summary><content type="html">&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;

&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;

&lt;h1 id="definition-und-begriffe"&gt;Definition und Begriffe&lt;/h1&gt;
&lt;p&gt;Ein &lt;strong&gt;Graph&lt;/strong&gt; ist eine &lt;strong&gt;Menge&lt;/strong&gt; von Knoten, welche durch &lt;strong&gt;Kanten&lt;/strong&gt; verbunden sind.
Daher kann er auch mit dem Tupel &lt;code&gt;G(V, E), mit V={Knoten}, E={Kanten}&lt;/code&gt; definiert werden.
&lt;div class="mermaid"&gt;
graph LR
linkStyle default interpolate basis
    A((A)) --- B((B))
    A --- C((C))
    B --- D((D))
    C --- E((E))
    D --- E
    C --- B
    B --- E
    C --- D
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="begriffe"&gt;Begriffe&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Der &lt;strong&gt;Grad&lt;/strong&gt; d&lt;sub&gt;G&lt;/sub&gt;(u) des Knoten u im Graphen G ist die Anzahl der an diesen Knoten angebundenen Kanten.&lt;/li&gt;
&lt;li&gt;Zwei Knoten sind &lt;strong&gt;adjazent&lt;/strong&gt;, wenn diese durch eine Kante direkt verbunden sind&lt;/li&gt;
&lt;li&gt;Wenn ein Knoten mit einer Kante verbunden sind, dann sind diese &lt;strong&gt;inzident&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Eine &lt;strong&gt;Kantenfolge&lt;/strong&gt; ist ein Ablauf von Knoten mit Kanten bei dem Kanten und Knoten auch mehrfach vorkommen dürfen&lt;/li&gt;
&lt;li&gt;Ein &lt;strong&gt;Kantenzug&lt;/strong&gt; ist eine Kantenfolge, bei der jede Kante nur einmal vorkommen darf&lt;/li&gt;
&lt;li&gt;Ein &lt;strong&gt;Weg&lt;/strong&gt; ist ein Kantenzug, bei dem jeder Knoten nur einmal passiert wird.&lt;/li&gt;
&lt;li&gt;Ein Graph ist zusammenhängend, wenn zwischen jedem Knoten ein Weg existiert, also dass man von jedem Knoten (über Umwege) zu jeder anderem Knoten kommt&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="spezialfalle"&gt;Spezialfälle&lt;/h1&gt;
&lt;h2 id="typen-von-graphen"&gt;Typen von Graphen&lt;/h2&gt;
&lt;p&gt;Es kann &lt;strong&gt;gerichtete&lt;/strong&gt; oder &lt;strong&gt;ungerichtete&lt;/strong&gt; Graphen geben.
Bei einem gerichteten Graphen, ist eine Verbindung zwischen zwei Knoten gerichtet, dass heißt es kann zwei Kanten zwischen zwei Knoten geben.
Einen hin- und eine zurück.
Ebenfalls kann man Kanten ein Gewicht zuweisen, was meistens als Arbeit oder Länge des Pfades gewertet wird.
Dies ist dann ein &lt;strong&gt;gewichteter&lt;/strong&gt; Graph.
&lt;div class="mermaid"&gt;
graph LR
linkStyle default interpolate basis
subgraph Gewichteter
    I((A)) --- |2| J((B))
    J --- |3| K((C))
    I --- |5| K
end
subgraph Gerichteter
    E((A)) --&amp;gt; F((B))
    E((A)) --&amp;gt; G((C))
    G --&amp;gt; E
    F --&amp;gt; H((D))
    H --&amp;gt; G
end
subgraph Ungerichteter
    A((A)) --- B((B))
    A --- C((C))
    B --- D((D))
    C --- D
end
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="baum"&gt;Baum&lt;/h2&gt;
&lt;p&gt;Ein Baum ist eine Sonderform des Graphen, in der es keine Kreise gibt.
&lt;div class="mermaid"&gt;
graph LR
A((A)) --- B((B))
A --- C((C))
A --- D((D))
B --- E((E))
C --- F((F))
C --- G((G))
D --- H((H))
H --- I((I))
H --- J((J))
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="binarbaum"&gt;Binärbaum&lt;/h2&gt;
&lt;p&gt;Ein Binärbaum ist wiederum eine Sonderform des Baumes, in der jeder Knoten maximal zwei Kindesknoten, also maximal drei Nachbarknoten hat.
Binärbäume sind als Datenstruktur recht beliebt, da diese zum Beispiel als Priority queue eingesetzt werden können, wie später im &lt;a href="dijkstra-algorithmus.html"&gt;Dijkstra&lt;/a&gt; Algorithmus zu sehen ist.
&lt;div class="mermaid"&gt;
graph TD
A((A)) --- B((B))
A --- C((C))
B --- D((D))
B --- E((E))
C --- F((F))
C --- G((G))
D --- H((H))
&lt;/div&gt;&lt;/p&gt;
&lt;h1 id="eulerkreis-und-eulertour"&gt;Eulerkreis und Eulertour&lt;/h1&gt;
&lt;p&gt;Ein &lt;strong&gt;Eulerweg&lt;/strong&gt; ist eine &lt;em&gt;Kantenfolge&lt;/em&gt;, in der alle Kanten des Graphen abgelaufen werden. Dabei spielt es keine Rolle auf welchem Knoten man beginnt und auf welchem Knoten man endet.
Ein Beispiel dafür wäre das Haus vom Nikolaus.
Dies ist jedoch bei einem &lt;strong&gt;Eulerkreis&lt;/strong&gt; wichtig, da in dieser der Startknoten auch der Endknoten sein muss.&lt;/p&gt;
&lt;p&gt;Schon Leonard Euler hat in 1735 den Eulerweg mit dem Königsberger Brückenproblem entdeckt.
Dabei ging es darum in der Stadt eine Rundweg zu finden, welcher über jede Brücke &lt;strong&gt;genau einmal&lt;/strong&gt; führt.
Dabei kann man die Brücken als Kanten und die Stadtteile als Knoten ansehen.
So darf man in diesem Rundweg nur genau einmal jede Kante/Brücke passieren, jedoch die Knoten/Stadtteile mehrmals betreten.
&lt;div class="mermaid"&gt;
graph LR
linkStyle default interpolate basis
A((A)) --- B((B))
A --- C((C))
C --- B
C --- D((D))
C --- D
B --- D
A --- C
&lt;/div&gt;
Aus dem Graphen ist es abzulesen, dass kein Eulerweg existiert, da für diese alle Knoten eine ungerade Anzahl an Nachbarknoten haben.&lt;/p&gt;
&lt;p&gt;Daraus lernen wir die folgenden Kriterien für den Eulerkreis/tour:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Für den &lt;strong&gt;Eulerweg&lt;/strong&gt; darf es &lt;strong&gt;maximal 2 Knoten mit ungeradem Grad&lt;/strong&gt; geben.&lt;/li&gt;
&lt;li&gt;Für den &lt;strong&gt;Eulerkreis&lt;/strong&gt; müssen &lt;strong&gt;alle Knoten einen geraden Grad&lt;/strong&gt; haben&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Daraus lässt sich ableiten, dass jede Eulertour auch ein Eulerkreis ist.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Grundlagen eines Computers</title><link href="https://www.dj-bauer.de/grundlagen-eines-computers.html" rel="alternate"/><published>2021-12-21T18:20:00+01:00</published><updated>2021-12-21T18:20:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-12-21:/grundlagen-eines-computers.html</id><summary type="html">&lt;p&gt;Der Aufbau eines Computers ist seit den ersten Modellen weitestgehend unverändert. Auch wenn sich innerhalb der einzelnen Komponenten einiges geändert hat, bleibt der Aufbau des Computers gleich und auch im kleinen Modell nachvollziehbar.&lt;/p&gt;</summary><content type="html">&lt;h2 id="komponenten"&gt;Komponenten&lt;/h2&gt;
&lt;p&gt;Ein Computer lässt sich auf die folgenden Komponenten reduzieren:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine CPU&lt;/li&gt;
&lt;li&gt;Diese hat ein Steuerwerk, welche Befehle annehmen und ausführen oder an die ALU weitergeben kann.&lt;/li&gt;
&lt;li&gt;Das Rechenwerk(&lt;abbr title="Arithmetic Logical Unit"&gt;ALU&lt;/abbr&gt;) kann Rechnen oder andere mathematische Operationen.&lt;/li&gt;
&lt;li&gt;Speicher, welcher Programme und Daten enthält.&lt;/li&gt;
&lt;li&gt;evtl. Peripherie, wie Ein oder Ausgabegeräte&lt;/li&gt;
&lt;li&gt;Einen Bus, welcher den Prozessor, Speicher und Peripherie verbindet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Von Neuman Architektur" src="https://www.dj-bauer.de/images/lernblog_neuman.svg" /&gt;&lt;/p&gt;
&lt;p&gt;Solch eine Architektur wird auch &lt;em&gt;Von-Neuman-Architektur&lt;/em&gt; genannt.
Eine einfachste Abstraktion davon hat einen Speicher, einen Datenbus, einen Addressbus, und einen Akkumulator.
Der Speicher hat 1000 Zellen mit den Adressen von 0 bis 999, welche einen Zahlenwert speichern können.
Um eine Speicherzelle schreiben oder lesen zu können wird dessen Adresse über den Addressbus ausgewählt.
Der Datenbus kann einen Wert schreiben oder lesen.&lt;/p&gt;
&lt;p&gt;Der Akkumulator speichert einen Wert und kann diesen verändern.
Er kann aus dem Datenbus den Wert laden, Addieren oder subtrahieren.
Ebenfalls kann man diesen Wert wieder in den Datenbus reinschreiben.
So kann man Werte aus dem Speicher laden und manipulieren
Diese Operationen kann mit Programmen im Speicher ausführen.&lt;/p&gt;
&lt;p&gt;Über das genaue Laden und Ausführen von Befehlen beschäftigen wir uns nicht in der Tiefe, aber der Prozessor hat einen sogenannten &lt;em&gt;Program Counter&lt;/em&gt;, welcher die genaue Speicheradresse beinhaltet und sich nach Abarbeiten eines Befehls erhöht um den nächsten auszuführen.
Neben den direkten Speicherbefehlen gibt es noch von der Architektur abhängig weitere Befehle.
Der Simulator aus dem Unterricht hat die folgenden Befehle:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Befehl&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JMP &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Springt zur angegebenen Adresse (Setzt den PC auf den angegebenen Wert)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TST &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Falls die angegebene Adresse gleich 0 ist wird der nächste Befehl übersprungen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAVE &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Setzt den Speicher auf den Akkumulator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADD &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Addiert den Akkumulator um den im Speicher liegenden Wert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUB &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Subtrahiert den im Speicher liegenden Wert vom Akkumulator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INC &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Erhöht den Wert im Speicher um 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEC &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Erniedrigt den Wert im Speicher um 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HLT&lt;/td&gt;
&lt;td&gt;Stoppt das Program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NULL &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Setzt die Adresse auf 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TAKE &amp;lt;Addr&gt;&lt;/td&gt;
&lt;td&gt;Der Wert aus dem Speicher wird auf den Akkumulator geschrieben&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="lernblog"/></entry><entry><title>Grenzen der Automatisierbarkeit</title><link href="https://www.dj-bauer.de/grenzen-der-automatisierbarkeit.html" rel="alternate"/><published>2021-12-21T17:20:00+01:00</published><updated>2021-12-21T17:20:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-12-21:/grenzen-der-automatisierbarkeit.html</id><summary type="html">&lt;p&gt;Schon Alan Turing hat sich darüber Gedanken gemacht, welche Problem sich automatisiert lösen lassen, und ob man für jedes Problem eine Maschine bauen könnte.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Schon Alan Turing hat sich darüber Gedanken gemacht, welche Problem sich automatisiert lösen lassen, und ob man für jedes Problem eine Maschine bauen könnte.
Dabei hat er die &lt;a href="turingmaschine.html"&gt;Turingmaschine&lt;/a&gt; entwickelt.&lt;/p&gt;
&lt;h2 id="viel-zu-viele-entscheidungen"&gt;Viel zu viele Entscheidungen.&lt;/h2&gt;
&lt;p&gt;Automaten basieren auf der grundlegenden Funktionsweise von Entscheidungsfragen.
Ein Automat kann in seiner Quintessenz ein Wort akzeptieren oder es nicht akzeptieren.
Er kann also entscheiden, ob die Eingabe valide oder nicht valide ist.
Zum Beispiel kann ein Automat einfach entscheiden, ob eine Zahl gerade oder ungerade ist (Er prüft einfach die letzte Ziffer).
Solche Probleme, welche ein Automat ganz einfach lösen kann heißen &lt;strong&gt;Entscheidbar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Als Gegenbeispiel wäre dagegen die Frage, ob eine bestimmte Mathematische Funktion eine Lösung besitzt.
Dabei müsste dann der Automat jede Zahl testen, bis er eine Lösung gefunden hat.
Sobald der Computer eine Lösung findet, ist die Frage einfach mit &lt;strong&gt;Ja&lt;/strong&gt; zu beantworten.
Jedoch können wir solange wir keine Lösung haben nicht sagen, dass es keine gibt.
Vielleicht ist ja schon die übernächste Zahl eine Lösung.
In so einem Fall können wir also nur in einem Teil der Fälle eindeutig eintscheiden, ob die Aussage wahr oder falsch ist.
Solche Probleme sind dann &lt;strong&gt;Semi-Entscheidbar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Und als dritte Klasse gibt es dann noch die &lt;strong&gt;Nicht-Entscheidbaren&lt;/strong&gt; Probleme, für welche es keinen weg gibt in polynomischer Laufzeit, (also nicht exponentiell) eine Lösung zu finden.
Also kann ein Computer keine schlaue Berechnung zum Lösen anstellen, sonder muss jede Möglichkeit einzeln durchprobieren.
Ein prominentes Problem dabei ist dann das &lt;a href="#halteproblem"&gt;Halteproblem&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="halteproblem"&gt;Halteproblem&lt;/h2&gt;
&lt;p&gt;Das Halteproblem versucht zu bestimmen, ob ein Program existiert, welches eindeutig feststellen kann, ob ein anderes Program Terminiert, also hält, oder unendlich lange weiterläuft.
Turing stellt sich nun vor, dass es eine Maschine &lt;em&gt;H&lt;/em&gt; gibt, welche bei einem Halten des Eingabeprogrammes ja ausgibt und bei unendlichem weiterlaufen Nein.&lt;/p&gt;
&lt;p&gt;Nun wird &lt;em&gt;H+&lt;/em&gt; als Erweiterung von &lt;em&gt;H&lt;/em&gt; definiert, welche bei einem Ja von &lt;em&gt;H&lt;/em&gt; unendlich weiter läuft und bei einem Nein stoppt.
Weil unsere Maschine &lt;em&gt;H+&lt;/em&gt; genauso wie &lt;em&gt;H&lt;/em&gt; jedes Maschine als Eingabe nehmen kann, kann man ihr auch sich selber mit einem anderen Eingabeprogram geben.&lt;/p&gt;
&lt;p&gt;Nun füttert man also &lt;em&gt;H1+&lt;/em&gt; mit &lt;em&gt;H2+&lt;/em&gt; und einer Eingabe &lt;em&gt;E&lt;/em&gt; für &lt;em&gt;H2+&lt;/em&gt; 
Dies würde bedeuten, dass, wenn &lt;em&gt;E&lt;/em&gt; terminiert, dann &lt;em&gt;H2+&lt;/em&gt; Ja ausgibt, nicht terminiert und unendlich weiter läuft.
Damit gibt dann &lt;em&gt;H1+&lt;/em&gt; ebenfalls Nein aus, da &lt;em&gt;H2+&lt;/em&gt; ja nicht terminiert.
Somit kommt es zu einem Widerspruch und die These ist widerlegt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Das Halteprobem als Paradox" src="https://www.dj-bauer.de/images/lernblog_haltproblem.svg" /&gt;&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Turingmaschine</title><link href="https://www.dj-bauer.de/turingmaschine.html" rel="alternate"/><published>2021-12-21T16:49:00+01:00</published><updated>2021-12-21T16:49:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-12-21:/turingmaschine.html</id><summary type="html">&lt;p&gt;Die Turingmaschine ist der nächste Schritt in unserer Reise durch die Automaten. Mit einer Turingmaschine kann man schon sehr vortgeschrittene Probleme lösen, deren Grenzen eigentlich nur an die Grenzen unserer modernen Computer stoßen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Der Anlass für die Turingmaschine war das so genannte &lt;a href="grenzen-der-automatisierbarkeit.html"&gt;Halteproblem&lt;/a&gt;, mit welchem sich Alan Turing befasste.
Um dieses zu lösen entwarf er eine gedankliche Maschine, mit welcher er einen Beweis liefern konnte.
Diese gedankliche Maschine ist als Turingmaschine bekannt.
In den allgemeinen Funktions-Komponenten ist eine Turingmaschine mit heutigen Computern zu vergleichen.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#aufbau"&gt;Aufbau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#beispielprogram"&gt;BeispielProgram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#syntax"&gt;Syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="aufbau"&gt;Aufbau&lt;/h2&gt;
&lt;p&gt;Im Grunde genommen ist jede Komponente aus einem &lt;a href="grundlagen-eines-computers.html"&gt;modernen Computer&lt;/a&gt; auch in der Turingmaschine zu finden.
Eine Turingmaschine hat ein Band, auf das es Lesen und schreiben kann.
Dieses Band ist unendlich groß in jede Richtung und besteht aus einzelnen Zellen.
In jeder Zelle kann ein bestimmter Wert drinnen stehen.
Welche Werte alle drinnen stehen können, wird im Eingabealphabet festgelegt.
Ein unbeschriebenes Feld wird, wie beim &lt;a href="kellerautomat.html"&gt;Kellerautomaten&lt;/a&gt; durch ein Leerzeichen, wie in unserem Fall dem &lt;strong&gt;|&lt;/strong&gt; dargestellt.
Dies ist heute als Speicher, wie RAM oder Festplatte zu finden.&lt;/p&gt;
&lt;p&gt;Ebenfalls hat die Maschine einen Lesekopf, welcher sich auf dem Band hin-und-her bewegen kann.
Dabei kann er den Wert auf dem Band einlesen und einen neuen Wert schreiben.&lt;/p&gt;
&lt;p&gt;Gesteuert wird der Lese- und Schreibkopf von der Steuereinheit, welche ein vorher bestimmtes Programm ausführt.
So ein Programm wird wieder als Folge von Zuständen mit Übergängen, also als Automat dargestellt.
Dabei kann der Automat bei jedem Übergang ein Zeichen einlesen, ein (neues) Zeichen schreiben und dann den Kopf nach Links, Rechts, oder gar nicht bewegen.&lt;/p&gt;
&lt;p&gt;Im Unterschied zum Kellerautomaten kann eine Turingmaschine auch Kontextfreie Grammatiken akzeptieren, da diese auf das gesammte Eingabewort zugreifen kann und nicht nur auf das oberste Kellersymbol beschrängt ist.&lt;/p&gt;
&lt;h2 id="beispielprogram"&gt;Beispielprogram&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Eine Turingmaschine" src="https://www.dj-bauer.de/images/lernblog_turing.png" /&gt;&lt;/p&gt;
&lt;p&gt;Den Automaten kann man auch wieder als Tabelle von Übergängen darstellen:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zeichen &lt;br&gt; Zustand&lt;/th&gt;
&lt;th&gt;|&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;+&lt;/th&gt;
&lt;th&gt;=&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;&lt;sub&gt;0&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;1 R q&lt;sub&gt;&lt;sub&gt;0&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;1 R q&lt;sub&gt;&lt;sub&gt;0&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;| L q&lt;sub&gt;&lt;sub&gt;1&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;&lt;sub&gt;1&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;| N q&lt;sub&gt;&lt;sub&gt;2&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;&lt;sub&gt;2&lt;/sub&gt;&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;/h2&gt;
&lt;p&gt;Ein Übergang ist durch folgende Syntax definiert:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ZuLesendesZeichen&lt;strong&gt;;&lt;/strong&gt;ZuSchreibendesZeichen&lt;strong&gt;,&lt;/strong&gt;Kopfbewegung&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="lernblog"/></entry><entry><title>Kellerautomat</title><link href="https://www.dj-bauer.de/kellerautomat.html" rel="alternate"/><published>2021-10-27T20:00:00+02:00</published><updated>2021-10-27T20:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-10-27:/kellerautomat.html</id><summary type="html">&lt;p&gt;Ein Kellerautomat ist eine Erweiterung des endlichen Automatens, welcher über einen Speicher verfügt.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ein Kellerautomat ist eine Erweiterung des endlichen Automatens, welcher über einen Speicher verfügt.
Dadurch kann er auch &lt;strong&gt;kontextfreie Grammatiken&lt;/strong&gt; darstellen.
Bei dem Speicher handelt es sich um einen Stack, wobei in jedem Schritt das oberste Element destruktiv ausgelesen wird.
Der Boden des Kellers ist durch das Zeichen &lt;strong&gt;#&lt;/strong&gt; markiert.
&lt;img alt="Graph von Kellerautomat" src="https://www.dj-bauer.de/images/lernblog_keller.svg" /&gt;&lt;/p&gt;
&lt;p&gt;In abhängigkeit des aktuellen Zustandes und der Position im Eingabewort(Zustand) und des obersten Kellersymbols, wechselt der Automat seinen Zustand und legt neue Symbole in den Keller.
Der Automat akzeptiert ein Wort, wenn er wieder im Endzustand steht.&lt;/p&gt;
&lt;h1 id="definition"&gt;Definition&lt;/h1&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;A = (Q, Σ, Γ, 𝛿, q0, #, F )
Q ist die Menge an Zuständen (endlich)
Σ ist das Eingabealphabet
Γ ist das Kelleralphabet (Eingabealphabet muss nicht = Kelleralphabet sein)
q0 ist der Startzustand
# ist das Zeichen, das einen auf einem leeren Stack zuweist
F ist die Menge der Endzustände (Teilmenge von Q also auch endlich)
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="schritte"&gt;Schritte&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Wir lesen die Eingabe&lt;/li&gt;
&lt;li&gt;Wir lesen und zerstören das obere Stackelement&lt;/li&gt;
&lt;li&gt;Wir schreiben auf den Stack&lt;/li&gt;
&lt;li&gt;Wir wechseln den Zustand&lt;/li&gt;
&lt;/ol&gt;</content><category term="lernblog"/></entry><entry><title>Grammatiken und formale Sprachen</title><link href="https://www.dj-bauer.de/grammatiken-und-formale-sprachen.html" rel="alternate"/><published>2021-10-27T17:30:00+02:00</published><updated>2021-10-27T17:30:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-10-27:/grammatiken-und-formale-sprachen.html</id><summary type="html">&lt;p&gt;Jede Sprache ist nach bestimmten Regeln aufgebaut. Grammatiken beschreiben diese.&lt;/p&gt;</summary><content type="html">&lt;h1 id="formale-sprachen"&gt;Formale Sprachen&lt;/h1&gt;
&lt;p&gt;Eine Sprache definiert eine Menge von Wörtern, welche zur Sprache gehören.&lt;/p&gt;
&lt;h3 id="beispiel"&gt;Beispiel:&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;L(A) = {abba} 
    Akzeptiert nur abba
L(A) = {a^nb | n aus N}
    Akzeptiert beliebieg viele &amp;#39;a&amp;#39; mit &amp;#39;b&amp;#39; am Ende, wie aaaab aab oder auch nur &amp;#39;b&amp;#39;, da n auch =0 sein kann.
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="grammatiken"&gt;Grammatiken&lt;/h1&gt;
&lt;p&gt;Jede Sprache ist nach bestimmten Regeln aufgebaut.
Sprachen bestehen aus der &lt;em&gt;Syntax&lt;/em&gt;(Form der Wörter) und &lt;em&gt;Semantik&lt;/em&gt;(Bedeutung).
Die Syntax wird durch die Grammatik definiert.
Sprich, man kann eine formale Sprache durch eine Grammatik beschreiben&lt;/p&gt;
&lt;p&gt;Eine Grammatik besteht aus &lt;strong&gt;Terminalsymbolen&lt;/strong&gt; und &lt;strong&gt;Nichtterminalsymbolen&lt;/strong&gt;.
Jedes Wort der Sprache besteht aus einer Folge von Terminalsymbolen.
Nichtterminalsymbole werden von der Grammatik weiter zu anderen Nichtterminalsymbolen oder Terminalsymbolen abgeleitet.
&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;
&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;
&lt;div class="mermaid"&gt;
graph TD
    A(Satz) --&amp;gt; B(Prädikat)
    A --&amp;gt; C(Substantiv)
    A --&amp;gt; D(Objekt)
    D --&amp;gt; E(Artikel)
    D --&amp;gt; F(Substantiv)
    E --&amp;gt; G[Der]
    F --&amp;gt; H[Hund]
    B --&amp;gt; I[erschreckt]
    C --&amp;gt; J(Objekt)
    J --&amp;gt; K(Artikel)
    J --&amp;gt; L(Substantiv)
    K --&amp;gt; M[die]
    L --&amp;gt; N[Katze]
    X(Nichtterminalsymbol) --&amp;gt; Y[Terminalsymbol]
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="definition"&gt;Definition&lt;/h2&gt;
&lt;p&gt;Eine &lt;strong&gt;Grammatik G&lt;/strong&gt; ist gegeben durch die folgenden vier Bestandteile &lt;code&gt;G = (N, T, R, S)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N ist eine endliche Menge von Nichtterminalsymbolen&lt;/li&gt;
&lt;li&gt;T ist eine endliche Menge von Terminalsymbolen&lt;/li&gt;
&lt;li&gt;R ist eine endliche Menge von Ableitungsregeln&lt;/li&gt;
&lt;li&gt;S ist eine Nichtterminalsymbol, das das Startsymbol ist&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Eine &lt;strong&gt;Grammatik&lt;/strong&gt; heißt &lt;strong&gt;regulär&lt;/strong&gt;, wenn alle Ableitungsregeln von der Form&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A -&amp;gt; xB oder A -&amp;gt; x sind.
Eine &lt;strong&gt;Sprache&lt;/strong&gt; heißt &lt;strong&gt;regulär&lt;/strong&gt;, wenn sie von einer regulären Grammatik erzeugt wird.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jede reguläre Sprache kann von einem passenden endlichen Automaten akzeptiert werden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine &lt;strong&gt;Grammatik erzeugt&lt;/strong&gt; eine Sprache&lt;/li&gt;
&lt;li&gt;Ein &lt;strong&gt;Automat prüft&lt;/strong&gt; eine Sprache&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="grammatik-zu-endlichem-automaten"&gt;Grammatik zu endlichem Automaten&lt;/h1&gt;
&lt;p&gt;Wenn man einen &lt;strong&gt;endlichen Automaten&lt;/strong&gt; aus einer regulären Grammatik konstruieren will, muss man mehrere Regeln beachten:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Die Menge der &lt;strong&gt;Terminalsymbole&lt;/strong&gt; der Grammatik ist das &lt;strong&gt;Alphabet&lt;/strong&gt; des Automaten&lt;/li&gt;
&lt;li&gt;Die Menge der &lt;strong&gt;Nichtterminalsymbole&lt;/strong&gt; der Grammatik ist zumindest ein Teil der &lt;strong&gt;Zustände&lt;/strong&gt; des Automaten&lt;/li&gt;
&lt;li&gt;Das &lt;strong&gt;Startsymbol&lt;/strong&gt; der Grammatik ist der &lt;strong&gt;Startzustand&lt;/strong&gt; des Automaten&lt;/li&gt;
&lt;li&gt;Zu jeder Ableitungsregel &lt;code&gt;A -&amp;gt; xB&lt;/code&gt; wird ein Übergang &lt;code&gt;(A) --x--&amp;gt; (B)&lt;/code&gt; gebildet.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Die Endzustände des Automaten kommen von den Übergängen der Grammatik in denen auf der rechten Seite nur ein Terminalsymbol steht, also &lt;code&gt;A -&amp;gt; x&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="beispiel_1"&gt;Beispiel:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;T = {a, b}&lt;/li&gt;
&lt;li&gt;N = {S, U, V, W}&lt;/li&gt;
&lt;li&gt;R = {S -&amp;gt; aS|bU, U -&amp;gt; aV, V -&amp;gt; aU|bW, W-&amp;gt;b}&lt;/li&gt;
&lt;li&gt;Startsymbol ist S&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wir wissen schon direkt, dass W der einzige Endzustand ist und S der Startzustand ist.
&lt;img alt="Graph von Automat" src="https://www.dj-bauer.de/images/lernblog_eda3.svg" /&gt;&lt;/p&gt;
&lt;h1 id="kontextfreie-grammatiken"&gt;Kontextfreie Grammatiken&lt;/h1&gt;
&lt;p&gt;Eine Grammatik ist eine weiter gefasste reguläre Grammatik.
Sie ist nicht mehr von dem entsprechenden Kontext(Zustand des Automaten) Abhängig.
Sie können durch &lt;a href="kellerautomat.html"&gt;Kellerautomaten&lt;/a&gt; dargestellt werden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sie ist nicht mehr durch einen &lt;a href="automaten.html"&gt;EDA&lt;/a&gt; darstellbar&lt;/li&gt;
&lt;li&gt;Sie kann auch Übergänge, wie &lt;code&gt;A -&amp;gt; xBC&lt;/code&gt; oder &lt;code&gt;A -&amp;gt; xAx&lt;/code&gt; enthalten&lt;/li&gt;
&lt;/ul&gt;</content><category term="lernblog"/></entry><entry><title>Automaten</title><link href="https://www.dj-bauer.de/automaten.html" rel="alternate"/><published>2021-10-26T10:00:00+02:00</published><updated>2021-10-26T10:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-10-26:/automaten.html</id><summary type="html">&lt;p&gt;Ein endlicher deterministischer Automat(DEA) hat eine endliche Anzahl an Zuständen, von welchen er einen immer als aktuellen Zustand hat.&lt;/p&gt;</summary><content type="html">&lt;h1 id="was-ist-ein-endlicher-deterministischer-automat"&gt;Was ist ein endlicher deterministischer Automat?&lt;/h1&gt;
&lt;p&gt;Ein endlicher deterministischer Automat(DEA) hat eine endliche Anzahl an Zuständen, von welchen er einen immer als aktuellen Zustand hat.
Mit hilfe von Übergängen kann er durch verschienen Eingaben seinen Zustand wechseln.
Dabei hat ein Zustand einen Eindeutigen zustandswechsel bei einer Eingabe, es sei denn diese Eingabe führt in eine Senke.
Bei der Eingabe ist jedes Element teil des Alphabetes und die Eingabe als ganzes ist ein Wort.
Wenn nach Ende der Eingabe der Automat einen Endzustand erreicht hat, dann akzeptiert der Automat dieses Wort.
&lt;img alt="Graph von Automat" src="https://www.dj-bauer.de/images/lernblog_eda.svg" /&gt;&lt;/p&gt;
&lt;h1 id="formale-definition"&gt;Formale Definition&lt;/h1&gt;
&lt;p&gt;Die definision für den oben genannten Automaten wäre die folgende:&lt;/p&gt;
&lt;p&gt;Der Automat wird über einen &lt;em&gt;Fünf-Tupel&lt;/em&gt; definiert.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;A = (Q, Σ, δ, q~0~, F)
&lt;/pre&gt;&lt;/div&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Funktion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;Endliche Zustandsmenge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Σ&lt;/td&gt;
&lt;td&gt;Alphabet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;δ&lt;/td&gt;
&lt;td&gt;Übergangsfunktion (delta:Q x Σ -&amp;gt; Q)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;Startzustand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;Endliche Menge an Endzuständen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="beispiel"&gt;Beispiel&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Annahme&lt;/strong&gt;: Alle nicht aufgeführten Übergänge führen in eine "Senke".&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q = {q0, q1, q2}&lt;/li&gt;
&lt;li&gt;δ = {a, b}&lt;/li&gt;
&lt;li&gt;F = {q2}&lt;/li&gt;
&lt;li&gt;δ :&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zustand&lt;/th&gt;
&lt;th&gt;a&lt;/th&gt;
&lt;th&gt;b&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Senke&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Senke&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="indeterministischer-automat"&gt;Indeterministischer Automat&lt;/h1&gt;
&lt;p&gt;Ein deterministischer Automat, wie oben erwähnt hat einen klaren Zustandsübergang von Zustand zu Zustand.
Es gibt allerdings auch indeterministische Automaten (IEA), welche für einem Zustand mehrere Eingaben in verschiedene Übergänge erlaubt.
Bei diesem ist der genaue Pfad, den der Automat nimmt nicht Eindeutig, da der Automat mehrere Pfade gleichzeitig verfolgt.
Ein Automat akzeptiert hierbei ein Wort, wenn es in irgendeinem Fall zu einem akzeptierten Endzustand führt.
Ein Beispiel für einen indeterministische Automaten ist gleich bei der Umwandlung zu sehen.&lt;/p&gt;
&lt;h2 id="ida-zu-dea-umwandeln"&gt;IDA zu DEA umwandeln&lt;/h2&gt;
&lt;p&gt;Man kann allerdings immer jeden Indeterministischen Automat in einen deterministischen Automaten umwandeln.
Dabei fängt man mit einer Tabelle mit allen Übergängen des IDA an.
Dabei gibt es allerdings nur eine Zelle pro Zustand/Eingabe Kombination und mehrere Zustände werden in einen neuen Zustand zusammengefasst.
Besonders gut ist die im Beispiel unten sichtbar.
Danach werden die kombinierten Übergänge auch verfolgt und deren Folgezustände zusammengefasst.
Dies wird solange gemacht, bis alle Übergänge notiert sind.
Danach kann man Duplikate entfernen.
Dies geschieht, wenn die Zeile von Zustand in einer Anderen vollständig enthalten ist und beide Zeilen entweder Endzustand sind oder nicht.
Beide müssen dabei die Eigenschaft Endzustand (ja/nein) gleich haben.&lt;/p&gt;
&lt;h3 id="beispiel_1"&gt;Beispiel&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Graph von Automat" src="https://www.dj-bauer.de/images/lernblog_ida.svg" /&gt;&lt;/p&gt;
&lt;h4 id="1-tabelle-mit-allen-initialen-ubergangen"&gt;1. Tabelle mit allen initialen Übergängen&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;01&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;02&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;4&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;34&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;4&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;4&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;23&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="2-tabelle-mit-allen-ubergangen"&gt;2. Tabelle mit ALLEN Übergängen&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;01&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;02&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;01&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;013&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;02&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;02&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;01&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;024&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;34&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;34&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;34&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;013&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;024&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;013&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(q&lt;sub&gt;1&lt;/sub&gt;, q&lt;sub&gt;2&lt;/sub&gt;, q&lt;sub&gt;3&lt;/sub&gt;, q&lt;sub&gt;4&lt;/sub&gt; werden nicht mehr aufgenommen, da diese nicht mehr von q&lt;sub&gt;0&lt;/sub&gt;/Startzustand erreichbar sind und damit irrelevant sind)&lt;/p&gt;
&lt;h4 id="3-duplikate-entfernen-und-umbenennen"&gt;3. Duplikate entfernen und umbenennen&lt;/h4&gt;
&lt;p&gt;Da q&lt;sub&gt;0124&lt;/sub&gt; und q&lt;sub&gt;0234&lt;/sub&gt; beide Endzustände sind und die gleichen Übergänge haben, kann man diese auch zusammenfassen.
So wird man dann eine Zeile los.
Man kann allerdings nicht auch noch q&lt;sub&gt;013&lt;/sub&gt; mit-löschen, da dieser kein Endzustand ist und damit nicht identisch ist.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0234&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;---------------&lt;/td&gt;
&lt;td&gt;---------&lt;/td&gt;
&lt;td&gt;-------------&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0134&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;strong&gt;1&lt;/strong&gt;34&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;4&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;5&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;5&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;5&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q&lt;sub&gt;4&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;(E)&lt;/strong&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;td&gt;q&lt;sub&gt;6&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="4-fertig"&gt;4. Fertig&lt;/h4&gt;
&lt;p&gt;Die einzelnen Zustände kann man nun wieder umbenennen und den deterministischen Graphen wieder zeichnen.
&lt;img alt="Graph von Automat" src="https://www.dj-bauer.de/images/lernblog_eda2.svg" /&gt;&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Das Marine-Ehrenmahl in Laboe</title><link href="https://www.dj-bauer.de/das-marine-ehrenmahl-in-laboe.html" rel="alternate"/><published>2021-10-11T18:03:00+02:00</published><updated>2021-10-11T18:03:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-10-11:/das-marine-ehrenmahl-in-laboe.html</id><summary type="html">&lt;p&gt;Auf Kursfahrt waren wir unter anderem in dem Ehrenmahl der Marine in Laboe.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Letzte Woche waren wir mit insgesammt 3 LKs auf Kursfahrt als Abschlussfahrt vor dem Abitur.
Dabei haben wir neben dem U-Boot in Laboe auch das Ehrenmahl zu Ehren der auf See Gebliebenen aller Länder besucht.
Die ganze Anlage ist dabei riesengroß und umspannt noch weit mehr, als "nur" der bekannte 85m hohe Turm.
Dabei soll das Mahl auch ein Mahnmal zur friedlichen Seefahrt darstellen.
Insgesammt ist die gesammte Anlage sehr informativ und definitiv einen Abstecher wert.&lt;/p&gt;
&lt;p&gt;Was mich und viele andere auch nur tierisch aufgeregt hat, ist wie frech die deutsche Marine auf der dritten Etage oder so meint eine zweistöckige Werbeveranstaltung zu haben.
Auf zwei Etagen stehen Infotafeln über die Notwendigkeit der Marine, welche Schiffe diese hat, welche Einsätze sie Arbeitet und wie die Ausbildung/Karriere dabei aussieht.
Und dabei reißt mir dann doch die Wutschnur.
Was kann man sich erlauben in einem Mahnmahl für friedliche Seefahrt, wo angehörige von verlorenen zum Trauern hingehen dazu missbrauchen Werbung für sich zu machen?&lt;/p&gt;</content><category term="2021"/></entry><entry><title>Mit dem Fahrrad den Elbe-Müritz Radweg entlang</title><link href="https://www.dj-bauer.de/mit-dem-fahrrad-den-elbe-muritz-radweg-entlang.html" rel="alternate"/><published>2021-08-10T19:47:00+02:00</published><updated>2021-08-10T19:47:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-08-10:/mit-dem-fahrrad-den-elbe-muritz-radweg-entlang.html</id><summary type="html">&lt;p&gt;In Mecklenburg-Vorpommern gibt es einige Radwanderwege. Einen davon sind mein Vater und ich zusammen gefahren.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mein Ziel ist es schon seit etwas längerer Zeit nach dem Abitur nächstes Jahr eine große Fahrradtour zu machen.
Mit groß meine ich ab zwei Wochen und alles darüber, weshalb eine Übungstour nicht schlecht sein sollte.
Diese habe ich auch zum Anlass genommen in ein "richtiges" Fahrrad zu investieren, welches allerdings aufgrund der aktuellen Situation noch einige Zeit zur Auslieferung braucht.&lt;/p&gt;
&lt;p&gt;Dann ging es also Ende der Sommerferien in nach Mecklenburg Vorpommern auf den Elbe-Müritz-Radweg, der als Rundweg von der Elbe um die Müritz und zurück geht.
Die Strecke ist mit 413km für gut eine Woche bemessen, was ziemlich gut hinkahm.
Ein weiterer Pluspunkt ist der Fakt, dass das Wildzelten in Mecklenburg Vorpommern für eine Nacht erlaubt ist.&lt;/p&gt;
&lt;p&gt;Die Strecke ist fast immer flach mit ein paar Hügeln und weitestgehend durch Felder und Mais/-Getreidefelder.
Ein Großteil der Wege waren Wald oder Fahrradwege, wobei wir auch öfters über Landstraßen gefahren sind, welche allerdings fast keinen Verkehr hatten.
Ganz selten gab es aber auch "Sandpisten", welche leider meist mit steilen Hängen verbunden waren, wo dann das Schieben notwendig war.&lt;/p&gt;
&lt;p&gt;Ein paar Highlights auf der Strecke waren die riesige Dampflokomotive in Meyenburg.
Ebenfalls ist der Hafen in Waren ein Must-Have.
Rührstädt hat scheint so in etwa die Hauptstadt der Störche zu sein, und hat sogar einen eigenen Verein dazu. Auch ein sehr interessantes Dorf.
Und als letzten POI würde ich noch Lindenberg notieren, welche eine eigene Schmalspurbahn nach Mesendorf hat und eine kleine Bimmelbahn für Kinder hat. Wir sind dort irgendwie in ein Sonntags-Dorffest reingestolpert oder so.&lt;/p&gt;
&lt;p&gt;Was uns besonders überrascht hat war der doch sehr hoch scheinende Wohlstand, den wir von der ländlichen Ost-Grenzregion nicht erwartet hätten.
Es gab quasi nur Neubauten und frisch renovierte Häuser und kaum Ruinen und vor allem überdurchschnittlich viele dicken Autos sowie SUVs.
Ebenfalls ist die Fahrradfreundlichkeit von Autofahrern deutlich höher als in NRW, was sehr angenehm war.&lt;/p&gt;
&lt;p&gt;Da meinem Vater kurz vor Waren auch noch die Gangschaltung kaputt gegangen ist, hatten wir am Abend noch einmal Fahrradwerkstatt-time.
Die Ersatzteile konnten wir dank OpenStreetmap und Telefon direkt abholen.&lt;/p&gt;
&lt;p&gt;Wir haben die gesammte Reise auf die Karten von &lt;a href="https://www.openstreetmap.org"&gt;OpenStreetMap&lt;/a&gt; vertrauen können und dank &lt;a href="https://www.osmand.net"&gt;OsmAnd&lt;/a&gt; auch auf dem Telefon haben.
Wirklich ein phänomenales Katenprojekt und eine gute Android-App dazu.
Auf der Reise habe ich dann auch meine ersten Beiträge zu der Karte getätigt.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Unsere Fahrräder" src="https://www.dj-bauer.de/images/20210810_fahrraeder.jpg" /&gt;
Vor dem Start der Reise&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dampflokomotive" src="https://www.dj-bauer.de/images/20210810_dampflock.jpg" /&gt;
Die Dampflokomotive in Meyenburg&lt;/p&gt;
&lt;p&gt;&lt;img alt="Sonnenblumen" src="https://www.dj-bauer.de/images/20210810_sonnenblumen.jpg" /&gt;
Durch ein Desktop-Wallpaper Fahrrad fahren&lt;/p&gt;
&lt;p&gt;&lt;img alt="Kopfsteinpflaster" src="https://www.dj-bauer.de/images/20210810_kopfstein.jpg" /&gt;
Diese Straßen machen allerdings keinen Spaß&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ein Storch" src="https://www.dj-bauer.de/images/20210810_storch.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Unterwegs auf dem Radweg" src="https://www.dj-bauer.de/images/20210810_unterwegs.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wildcampen" src="https://www.dj-bauer.de/images/20210810_zeltplatz1.jpg" /&gt;
In Mecklenburg Vorpommern gibt es wunderschöne Zeltplätze&lt;/p&gt;</content><category term="Reisen"/><category term="Fahrrad"/><category term="Reisen"/><category term="Zelten"/></entry><entry><title>Whiteboard utility holder</title><link href="https://www.dj-bauer.de/whiteboard-utility-holder.html" rel="alternate"/><published>2021-07-20T00:00:00+02:00</published><updated>2021-07-20T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-07-20:/whiteboard-utility-holder.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Urheberrecht</title><link href="https://www.dj-bauer.de/urheberrecht.html" rel="alternate"/><published>2021-06-16T17:40:00+02:00</published><updated>2021-06-16T17:40:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-06-16:/urheberrecht.html</id><summary type="html">&lt;p&gt;Im Internet hat jedes digitale Werk irgendeinen Besitzer. Und dieser kann über seine Werke Berechtigungen verteilen, wie er will. Um dies zu vereinfachen gibt es Lizenzen, wie das Creative Commons Modell, wo dann immer jeder am Namen erkennen kann, was man darf und was nicht.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Im Internet hat jedes digitale Werk irgendeinen Besitzer. Und dieser kann über seine Werke Berechtigungen verteilen, wie er will. Um dies zu vereinfachen gibt es Lizenzen, wie das Creative Commons Modell, wo dann immer jeder am Namen erkennen kann, was man darf und was nicht.&lt;/p&gt;
&lt;p&gt;Das Creative Commons Modell bestimmt aus bestimmten Lizenzteilen, die man sich zusammenstecken kann, wie man will.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kürzel&lt;/th&gt;
&lt;th&gt;Erläuterung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CC0&lt;/td&gt;
&lt;td&gt;Public domain(Kein Copyright) (Man darf alles machen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BY&lt;/td&gt;
&lt;td&gt;Namensnennung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BY-SA&lt;/td&gt;
&lt;td&gt;Namensnennung + Weitergabe unter gleichen Bedingungen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BY-ND&lt;/td&gt;
&lt;td&gt;Namensnennung + Keine Verbreitung von Veränderungen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BY-NC&lt;/td&gt;
&lt;td&gt;Namensnennung + Keine kommerzielle Verwendung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BY-NC-SA&lt;/td&gt;
&lt;td&gt;Namensnennung + Keine kommerzielle Verwendung + gleiche Weitergabe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BY-NC-ND&lt;/td&gt;
&lt;td&gt;Namensnennung + Nich kommerziell + Keine Veränderung&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In Deutschland gibt es rein juristisch gesehen kein Public Domain, da jedes Werk einen Author hat, der &lt;strong&gt;IMMER&lt;/strong&gt; das Urheberrecht an dem Werk besitzt.
Um anderen Menschen kenntlich zu machen, was diese mit einem Werk machen dürfen, gibt man eine Lizenz and und wer der Author(im Fall einer Erstveröffentlichung man selbst) an.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Grundlagen der Datenübertragung</title><link href="https://www.dj-bauer.de/grundlagen-der-datenubertragung.html" rel="alternate"/><published>2021-06-16T17:30:00+02:00</published><updated>2021-06-16T17:30:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-06-16:/grundlagen-der-datenubertragung.html</id><summary type="html">&lt;p&gt;Um Daten über eine digitale Verbindung übertragen zu können, muss sich auf einen code geeignet werden.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wenn man eine codierung z.B. für buchstaben gefunden hat und die payload in einsen und nullen übersetzt hat, müssen diese nur noch über das Kabel verschicht werden. &lt;/p&gt;
&lt;p&gt;Dazu gibt es drei verbreitete Codes.&lt;/p&gt;
&lt;h1 id="nrz-code"&gt;NRZ-Code&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Es gibt eine Takt- und eine Datenleitung&lt;/li&gt;
&lt;li&gt;Die Taktleitung wechselt jeden Takt von 0 auf 1&lt;/li&gt;
&lt;li&gt;Jedes bit braucht einen takt und ist 1, wenn die Datenleitung 1 ist und umgekehrt mit 0&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="nrzi-code"&gt;NRZI-Code&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Es gibt wieder einen Takt- und eine Datenleitung&lt;/li&gt;
&lt;li&gt;Die Taktleitung wechselt wieder jeden Takt von 0 auf 1&lt;/li&gt;
&lt;li&gt;Wenn eine 1 übertragen wird, wechselt die Datenleitung den Pegel und bei einer 0 bleibt sie wie sie ist&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="manchester-code"&gt;Manchester-Code&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Man braucht nur eine Datenleitung und keine Taktleitung&lt;/li&gt;
&lt;li&gt;In der Taktmitte wechselt die Datenleitung den Pegel.&lt;/li&gt;
&lt;li&gt;Wenn eine 1 übertragen werden soll, wechselt sie von 0 auf 1&lt;/li&gt;
&lt;li&gt;Wenn eine 0 übertragen werden soll, wechselt sie von 1 auf 0&lt;/li&gt;
&lt;/ul&gt;</content><category term="lernblog"/></entry><entry><title>Netzwerktopologien</title><link href="https://www.dj-bauer.de/netzwerktopologien.html" rel="alternate"/><published>2021-06-16T00:00:00+02:00</published><updated>2021-06-16T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-06-16:/netzwerktopologien.html</id><summary type="html">&lt;p&gt;Netzwerke haben verschiedene Formen und damit einhergehende Vor- und Nachteile&lt;/p&gt;</summary><content type="html">&lt;p&gt;Netzwerke können verschiedene Formen haben.
Dabei sind manche nur noch begrenzt oder gar nicht mehr genutzt.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Art&lt;/th&gt;
&lt;th&gt;➕Vorteile&lt;/th&gt;
&lt;th&gt;➖Nachteile&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sterntopologie&lt;/td&gt;
&lt;td&gt;Zentraler Router, Einfaches Hinzufügen von neuen Endgeräten&lt;/td&gt;
&lt;td&gt;Nicht ausfallsicher, da zentraler Rechner notwendig ist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ringtopologie&lt;/td&gt;
&lt;td&gt;Keine&lt;/td&gt;
&lt;td&gt;Gar nicht ausfallsicher, Mehrere Schritte (N/2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bustopologie&lt;/td&gt;
&lt;td&gt;Einfache Kabelverlegung, Relativ ausfallsicher&lt;/td&gt;
&lt;td&gt;Crashen von Paketen möglich&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baumtopologie&lt;/td&gt;
&lt;td&gt;Einfach erweiterbar, Ausfall von Kindern möglich&lt;/td&gt;
&lt;td&gt;Verteiler sind kritische Infrastruktur, Hohe Latenz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vermaschtes Netz&lt;/td&gt;
&lt;td&gt;Selbstheilend (Kann Daten umleiten), Dezentral, Leistungsfähig durch Lastverteilung&lt;/td&gt;
&lt;td&gt;Viele Geräte sind verteiler -&amp;gt; Stromverbrauch, Komplex zu verstehen und daten weiterzuleiten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lineares Netz&lt;/td&gt;
&lt;td&gt;Wenig Kabel, Leicht erweiterbar&lt;/td&gt;
&lt;td&gt;Lange strecken (bis zu O(n)=n) Gar nicht ausfallsicher&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="anwendungen"&gt;Anwendungen&lt;/h1&gt;
&lt;p&gt;Das Internet ist weitgehend ein &lt;strong&gt;vermaschtes Netz&lt;/strong&gt;.
Die Provider verteilen dann meisten die Haushalte in einer &lt;strong&gt;Baumtopologie&lt;/strong&gt;, die wiederum intern eine &lt;strong&gt;Sterntopologie&lt;/strong&gt; haben.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Internettopologien" src="https://www.dj-bauer.de/images/20210616_netzwerktopologien.png" /&gt;&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Use tables in pelican markdown</title><link href="https://www.dj-bauer.de/use-tables-in-pelican-markdown-en.html" rel="alternate"/><published>2021-06-15T18:41:00+02:00</published><updated>2021-06-15T18:41:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-06-15:/use-tables-in-pelican-markdown-en.html</id><summary type="html">&lt;p&gt;Some might know, that I use pelican to build my static blog.
I therefore write my blogposts in markdown.
I finally got a way working to use markdown tables in my blog by getting pelican to use the builtin markdown-table plugin.
To achieve this there is only a slight modification …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Some might know, that I use pelican to build my static blog.
I therefore write my blogposts in markdown.
I finally got a way working to use markdown tables in my blog by getting pelican to use the builtin markdown-table plugin.
To achieve this there is only a slight modification of the config file neccessary.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown.extensions.tables&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TableExtension&lt;/span&gt;
&lt;span class="n"&gt;MARKDOWN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;extensions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TableExtension&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;    
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The dictionary called &lt;em&gt;MARKDOWN&lt;/em&gt; is used by pelican to configure the markdown engine.
I therefore give the engine the Table extension found in the standard python markdown library.&lt;/p&gt;
&lt;p&gt;Now I can write wonderfull tables like this one:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Test | Foo
---- | ---
Bla  | Hello
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Which ends up being like this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Foo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bla&lt;/td&gt;
&lt;td&gt;Hello&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="Python"/><category term="markdown"/><category term="pelican"/><category term="python"/></entry><entry><title>OSI-Schichtenmodell</title><link href="https://www.dj-bauer.de/osi-schichtenmodell.html" rel="alternate"/><published>2021-06-15T00:00:00+02:00</published><updated>2021-06-15T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-06-15:/osi-schichtenmodell.html</id><summary type="html">&lt;p&gt;Den Datenverkehr über Netzwerke kann man mit dem OSI-Schichtenmodell abstrakt darstellen und verschiedenen Ebenen verschiedene Aufgaben zuordenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Schicht&lt;/th&gt;
&lt;th&gt;Ebene&lt;/th&gt;
&lt;th&gt;Aufgabe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Anwendung&lt;/td&gt;
&lt;td&gt;Kommunikation zwischen Programmen (&lt;strong&gt;HTTP, IMAP, SMTP&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Präsentation&lt;/td&gt;
&lt;td&gt;Übersetzung zwischen Anwendungs- und Netzwerkformaten (&lt;strong&gt;SSL&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Sitzung&lt;/td&gt;
&lt;td&gt;Verbindungen können gemanaged werden (zwischen server und client) (Wird von TCP auch …&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</summary><content type="html">&lt;p&gt;Den Datenverkehr über Netzwerke kann man mit dem OSI-Schichtenmodell abstrakt darstellen und verschiedenen Ebenen verschiedene Aufgaben zuordenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Schicht&lt;/th&gt;
&lt;th&gt;Ebene&lt;/th&gt;
&lt;th&gt;Aufgabe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Anwendung&lt;/td&gt;
&lt;td&gt;Kommunikation zwischen Programmen (&lt;strong&gt;HTTP, IMAP, SMTP&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Präsentation&lt;/td&gt;
&lt;td&gt;Übersetzung zwischen Anwendungs- und Netzwerkformaten (&lt;strong&gt;SSL&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Sitzung&lt;/td&gt;
&lt;td&gt;Verbindungen können gemanaged werden (zwischen server und client) (Wird von TCP auch geregelt)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Daten&lt;/strong&gt; versenden (&lt;strong&gt;TCP&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Netzwerk&lt;/td&gt;
&lt;td&gt;Packete können weitergeleitet werden (Addressierung) (&lt;strong&gt;IP&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Link-Layer&lt;/td&gt;
&lt;td&gt;Zwei Geräte können daten teilen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Physisch&lt;/td&gt;
&lt;td&gt;Zahlen in Stromsignale umwandeln&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Jede Schicht wird quasi als daten in die darunterliegende Schicht eingebettet.
So baut jede tiefere Schicht einen Container von relevanten Daten drumherum.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wie ein Pappkarton im Pappkarton&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="lernblog"/></entry><entry><title>ER-Diagramme</title><link href="https://www.dj-bauer.de/er-diagramme.html" rel="alternate"/><published>2021-02-23T20:00:00+01:00</published><updated>2021-02-23T20:00:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-02-23:/er-diagramme.html</id><summary type="html">&lt;p&gt;Unterrichtsreihe Datenbankentwurf&lt;/p&gt;</summary><content type="html">&lt;h1 id="bestandteile-eines-er-diagrams"&gt;Bestandteile eines ER-Diagrams&lt;/h1&gt;
&lt;p&gt;&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_er.png" /&gt;&lt;/p&gt;
&lt;p&gt;Ein ER-Diagram besteht aus den drei teilen &lt;em&gt;Entität&lt;/em&gt;, &lt;em&gt;Attribut&lt;/em&gt; und &lt;em&gt;Relation&lt;/em&gt;.
Dabei gelten Folgende Regeln:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entitäten haben Attribute&lt;/li&gt;
&lt;li&gt;Entitäten haben Relationen miteinander&lt;/li&gt;
&lt;li&gt;Relationen haben Attribute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_er2.png" /&gt;&lt;/p&gt;
&lt;p&gt;Bei Relationen haben die Entitäten dabei sogenannte &lt;strong&gt;Kardinalitäten&lt;/strong&gt;.
Diese bestimmen, wie viele Entitäten miteinander in Beziehung stehen&lt;/p&gt;
&lt;h1 id="kardinalitaten"&gt;Kardinalitäten&lt;/h1&gt;
&lt;h2 id="11"&gt;1:1&lt;/h2&gt;
&lt;p&gt;Ein Entity hat die Beziehung mit genau einem anderen.
Zum Beispiel hat ein Bürger &lt;strong&gt;genau einen&lt;/strong&gt; Personalausweis.
&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_er11.png" /&gt;
&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_er11s.png" /&gt;&lt;/p&gt;
&lt;h2 id="1n"&gt;1:n&lt;/h2&gt;
&lt;p&gt;Genau ein Entity hat die Beziehung mit n-anderen Entities.
Ein Auto kann zum Beispiel auf genau einen Halter zugelassen sein, der kann aber mehrere Autos zulassen.
&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_er1n.png" /&gt;
&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_er1ns.png" /&gt;&lt;/p&gt;
&lt;h2 id="nm"&gt;n:m&lt;/h2&gt;
&lt;p&gt;Ein Entity hat mehrere Beziehungen mit mehreren Entities.
So kann ein Auto von mehreren Menschen gefahren werden, die auch mehrere Autos fahren können.
&lt;img alt="ER-Bestandteile" src="https://www.dj-bauer.de/images/lernblog_ernms.png" /&gt;&lt;/p&gt;
&lt;h1 id="der-entwurf-eines-er-modells"&gt;Der Entwurf eines ER-Modells&lt;/h1&gt;
&lt;p&gt;Zuerst muss man sich den Anwendungsfall anschauen und die Entitäten herausfiltern.
Diese kann man dann schonmal mitsammt ihren Attributen in das Diagramm eintragen.
Dann werden die Beziehungen zwischen den Entitäten eingetragen.
Dabei muss man überlegen, welche Kardinalitäten dabei zustande kommen.&lt;/p&gt;
&lt;p&gt;Um von dem ER-Modell in ein Relationales Modell zu kommen (Das Layout der Datenbank), legt man erstmal für jede Entität eine eigene Tabelle an. 
Wenn eine Entität noch keinen Primärschlüssel hat, wird dieser als ID hinzugefügt.
Nun schaut man sich die Relationen an.
Wenn einem irgendwo eine &lt;strong&gt;1:1&lt;/strong&gt; beziehung auffällt, dann kann man diese beiden Entitäten in eine Tabelle zusammenfassen.
Wenn man eine &lt;strong&gt;1:n&lt;/strong&gt; Beziehung findet, dann haben beide Entitäten ihre eigene Tabelle, und die Entität mit der Kardinalität &lt;strong&gt;n&lt;/strong&gt; speichert einen Fremdschlüssel auf die andere Entität.
Für die &lt;strong&gt;n:m&lt;/strong&gt; Beziehungen werden eigene Tabellen angelegt, die auch mit Fremdschlüsseln auf die Entitäten referenzieren.&lt;/p&gt;
&lt;p&gt;Ein Beispiel aus dem Buch &lt;em&gt;Datenbanksysteme&lt;/em&gt; von Alfons Kemper und André Eickler ist hier zu sehen.
&lt;img alt="ER-Modell" src="https://www.dj-bauer.de/images/lernblog_ermodell.png" /&gt;
wird zu:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Professor(__PersNr__, Rang, Raum, Name)
Assistent(__PersNr__, Name, Fach, ~~Professor~~)
Vorlesung(__Nr__, SWS, Titel, ~~Professor~~)
Student(__MatrNr__, Name, Semester)
Vorsaussetzen(~~Vorlesung~~, ~~Vorlesung~~)
Prüfung(~~Student~~, ~~Professor~~, ~~Vorlesung~~, Note)
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="normalformen"&gt;Normalformen&lt;/h1&gt;
&lt;p&gt;Nicht jedes Relationelle Modell ist sinnvoll zu implementieren.
Um ein Modell möglichst effizient in die beste Form zu bringen, gibt es drei große Regeln oder auch &lt;strong&gt;Normalformen&lt;/strong&gt; genannt.
Dabei basiert jede Normalform auf der vorherigen und übernimmt dessen Einschränkungen.
So ist die dritte Normalform ein superset der zweiten Normalform, welche wiederum ein superset der ersten Normalform ist.&lt;/p&gt;
&lt;h2 id="1nf"&gt;1.NF&lt;/h2&gt;
&lt;p&gt;Jedes Attribut einer Relation muss einen Atomaren Wertebereich haben.
Das bedeutet, dass jedes Attribut &lt;strong&gt;genau eine&lt;/strong&gt; information speichert und nicht weiter aufgeteilt werden kann.
Dies erleichtert das Abfragen, da Daten nicht weiter aufgeschlüsselt werden müssen.&lt;/p&gt;
&lt;h2 id="2-nf"&gt;2. NF&lt;/h2&gt;
&lt;p&gt;Die Erste Normalform muss hierfür vorliegen, wie eingangs erwähnt.
Jedes Nicht-primärattribut muss voll funktional von einer echten Teilmenge eines Schlüsselkandidaten abhängen.
Das bedeutet, dass jedes Attribut von jedem Teil(bei zusammengesetztem Schlüssel) abhängen muss.
Dadurch modelliert jede Relation(Tabelle) genau nur einen Sachverhalt.&lt;/p&gt;
&lt;h2 id="3-nf"&gt;3. NF&lt;/h2&gt;
&lt;p&gt;Kein Nichtschlüsselattribut darf von einem Schlüsselkandidaten &lt;em&gt;transitiv&lt;/em&gt; abhängen.
Dies bedeutet, dass kein Attribut von einem anderen Attribut abhängt, ohne das es ein Kandidat ist.
So werden verkettungen verhindert und erleichtern das Erkennen der Abhängigkeiten ohne die Daten zu kennen.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Tabellen</title><link href="https://www.dj-bauer.de/tabellen.html" rel="alternate"/><published>2021-02-23T19:00:00+01:00</published><updated>2021-02-23T19:00:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-02-23:/tabellen.html</id><summary type="html">&lt;p&gt;Tabellen sind ein einfacher Weg, um Daten zu speichern und zu verknüpfen.
Sie werden auch dazu verwendet, um Datenbanken darzustellen und um mit ihnen zu interagieren.
Tabellen sind grundsätzlich folgendermaßen Aufgebaut:
&lt;img alt="Tabelle" src="https://www.dj-bauer.de/images/lernblog_tabelle.png" /&gt;&lt;/p&gt;
&lt;p&gt;Die Kunst beim Datenbankentwurf ist es dabei den Anwendungsfall so in eine Datenbank umzusetzten, dass keine Anomalien auftreten.
Anomalien …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Tabellen sind ein einfacher Weg, um Daten zu speichern und zu verknüpfen.
Sie werden auch dazu verwendet, um Datenbanken darzustellen und um mit ihnen zu interagieren.
Tabellen sind grundsätzlich folgendermaßen Aufgebaut:
&lt;img alt="Tabelle" src="https://www.dj-bauer.de/images/lernblog_tabelle.png" /&gt;&lt;/p&gt;
&lt;p&gt;Die Kunst beim Datenbankentwurf ist es dabei den Anwendungsfall so in eine Datenbank umzusetzten, dass keine Anomalien auftreten.
Anomalien sind Fehler, die zum beispiel durch das doppelte speichern von Daten oder die mangelnde Verknüpfung von Daten auftreten.
Es gibt grundlegend 3 Arten von Anomalien:&lt;/p&gt;
&lt;h4 id="1-einfugeanomalie"&gt;1. Einfügeanomalie&lt;/h4&gt;
&lt;p&gt;Ein Datum kann nicht eingetragen werden, da informationen zum Schlüsselattribut fehlt und damit der Eintrag unvollständig ist.&lt;/p&gt;
&lt;h4 id="2-loschanomalie"&gt;2. Löschanomalie&lt;/h4&gt;
&lt;p&gt;Durch das Löschen eines Eintrages löscht man weitere Daten, die eigentlich noch gespeichert werden sollten.&lt;/p&gt;
&lt;h4 id="3-anderungsanomalie"&gt;3. Änderungsanomalie&lt;/h4&gt;
&lt;p&gt;Wenn Daten doppelt gespeichert werden und man nur eines davon ändert. Dadurch haben die selben 'Objekte' nun unterschiedliche Eingenschaften.&lt;/p&gt;
&lt;h3 id="schlusselattribut"&gt;Schlüsselattribut&lt;/h3&gt;
&lt;p&gt;In einer Tabelle gibt es immer ein Schlüsselattribut.
Daturch lässt sich der Datensatz genau identifizieren.&lt;/p&gt;
&lt;h3 id="inkonsistenzen"&gt;Inkonsistenzen&lt;/h3&gt;
&lt;p&gt;Sind das Ergebniss von Anomalien.
Die Daten in der Datenbank sind Widersprüchlich und man bekommt bei verschiedenen Anfragen mit gleichem erwarteten Ergebniss unterschiedliche Rückgaben.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Binärbäume</title><link href="https://www.dj-bauer.de/binarbaume.html" rel="alternate"/><published>2021-02-23T18:00:00+01:00</published><updated>2021-02-23T18:00:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-02-23:/binarbaume.html</id><summary type="html">&lt;p&gt;Ein Binärbaum ist eine hirarische Datenstruktur.
Das bedeutet, dass er nicht linear ist und damit nicht die Objekte in einer einfachen Reihenfolge darstellt.
&lt;img alt="Baumstruktur" src="https://www.dj-bauer.de/images/lernblog_baum.png" /&gt;
Ein Baum besteht aus Knoten, die mit Kanten verbunden werden.
Dabei kann man ihn abstrakt als Wurzel beschreiben, die eine linkes und ein rechtes kind hat.
Dieses …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ein Binärbaum ist eine hirarische Datenstruktur.
Das bedeutet, dass er nicht linear ist und damit nicht die Objekte in einer einfachen Reihenfolge darstellt.
&lt;img alt="Baumstruktur" src="https://www.dj-bauer.de/images/lernblog_baum.png" /&gt;
Ein Baum besteht aus Knoten, die mit Kanten verbunden werden.
Dabei kann man ihn abstrakt als Wurzel beschreiben, die eine linkes und ein rechtes kind hat.
Dieses Kind kann eine weitere Wurzel sein(global betrachtet dann innerer Knoten gennant) oder aber ein Blatt sein, also keine weiteren Kinder haben.
Jeder knoten hat ein Element der zu speichernden Daten.
&lt;img alt="Baumstruktur" src="https://www.dj-bauer.de/images/lernblog_baum2.png" /&gt;
Die Rot-markierten knoten stellen eine Baum dar, ebenso wie die grün markierten.
Dies Zeigt, wie ein innerer Knoten(der rechte rote) zur Wurzel des Grünen Baums wird/ist.&lt;/p&gt;
&lt;h2 id="der-geordnete-binarbaum"&gt;Der geordnete Binärbaum&lt;/h2&gt;
&lt;p&gt;In einem geordneten Binärbaum, sind die daten geordnet vorliegend.
Dabei ist der Inhalt jedes linken Teilbaums kleiner, als der der Wurzel und der Inhalt jedes rechten Teilbaums größer als die Wurzel.
Ein Beispiel dafür wäre das folgende.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Baumstruktur" src="https://www.dj-bauer.de/images/lernblog_baum3.png" /&gt;&lt;/p&gt;
&lt;p&gt;Man nennt ihn auch BinarySearchTree.&lt;/p&gt;
&lt;p&gt;Die Java-Klasse dazu kann folgendermaßen aussehen.
&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;
&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;
&lt;div class="mermaid"&gt;
classDiagram
class Tree&lt;sub&gt;Content&lt;/sub&gt; {
    content &lt;sub&gt;Content&lt;/sub&gt;
    leftchild : Tree
    rightchild : Tree&lt;/p&gt;
&lt;p&gt;}
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Die wichtigen Methoden hierbei sind Daten einzufügen, zu entfernen und abzurufen.
Diese werden folgendermaßen implementiert:&lt;/p&gt;
&lt;h3 id="suchen"&gt;Suchen&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wenn wir kein element haben, dann abbrechen&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isLess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Das gesuche element ist kleiner, also suchen wir im linken Teilbaum&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLeftTree&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isGreater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Das gesuche element ist größer, also suchen wir im rechten Teilbaum&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRightTree&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Element wurde gefunden.&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Wir haben das element nicht gefunden&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="einfugen"&gt;Einfügen&lt;/h3&gt;
&lt;p&gt;Da in BinarySearchTrees alle Objekte eindeutig sind, doppeln sich Objekte niemals und können daher beim einfügen ignoriert werden.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wir fügen nichts leeres ein.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;//Wenn der aktuelle Baum leer ist, dann erzeugen wir eine neue Node&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BSTNode&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isLess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Wir versuchen das objekt in the linken seite einzufügen&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isGreater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Wir versuchen das objekt in the rechten seite einzufügen&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="entfernen"&gt;Entfernen&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Wenn der Baum leer ist, dann abbrechen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Zu löschendes Element ist kleiner als aktuelles, daher suchen wir im linken Teilbaum&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isLess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Wenn es größer ist, dann muss es im rechten gelöscht werden.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isGreater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Das element ist gefunden und soll hier gelöscht werden&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Wenn wir kein linkes blatt haben&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wenn der Knoten ein Blatt ist und keine Nachfolger hat einfach auf null setzten.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wir haben nur einen rechten nachfolger&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getNodeOfRightSuccessor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wir haben nur einen linken nachfolger&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getNodeOfLeftSuccessor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;// Es gibt links und rechts einen Nachfolger.&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getNodeOfRightSuccessor&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// Der rechte Nachfolger hat keinen linken Nachfolger.&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getNodeOfRightSuccessor&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getNodeOfRightSuccessor&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;BinarySearchTree&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;right&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ancestorOfSmallRight&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;BinarySearchTree&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="lernblog"/></entry><entry><title>Stacks, Queues und Listen</title><link href="https://www.dj-bauer.de/stacks-queues-und-listen.html" rel="alternate"/><published>2021-01-11T00:00:00+01:00</published><updated>2021-01-11T00:00:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2021-01-11:/stacks-queues-und-listen.html</id><summary type="html">&lt;h1 id="lineare-datenstrukturen-generell"&gt;Lineare Datenstrukturen Generell&lt;/h1&gt;
&lt;p&gt;Eine Lineare Datenstruktur ist eine Datenstruktur die Objekt (Klassen, Primitive, etc...) in reihenfolge speichern kann.
Beispiele dafür sind Arrays, Listen oder Queues.
Im folgenden beschäftige ich mich mit dynamischen linearen Datenstrukturen, die ihre Struktur (Speicherbelegung) dynamisch an die anzahl der Listenelemente anpassen und damit flexibel groß sein …&lt;/p&gt;</summary><content type="html">&lt;h1 id="lineare-datenstrukturen-generell"&gt;Lineare Datenstrukturen Generell&lt;/h1&gt;
&lt;p&gt;Eine Lineare Datenstruktur ist eine Datenstruktur die Objekt (Klassen, Primitive, etc...) in reihenfolge speichern kann.
Beispiele dafür sind Arrays, Listen oder Queues.
Im folgenden beschäftige ich mich mit dynamischen linearen Datenstrukturen, die ihre Struktur (Speicherbelegung) dynamisch an die anzahl der Listenelemente anpassen und damit flexibel groß sein können.
Ein Array zum Beispiel ist nicht dynamisch, da es einen festen Speicherplatz beim initialisieren belegt und damit eine feste Länge hat.&lt;/p&gt;
&lt;h1 id="stacks"&gt;Stacks&lt;/h1&gt;
&lt;p&gt;Der Stack arbeitet nach dem first in last out prinzip.
Das bedeutet, das man Elemente wie bei einem papierstapel drauflegen und runternehmen kann.
Dabei wird immer das letzte Element zuerst runtergenommen.&lt;/p&gt;
&lt;p&gt;Dadurch kann sich folgende Operationen überlegen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lege ein Element drauf&lt;/li&gt;
&lt;li&gt;Nimm das obere Element runter.&lt;/li&gt;
&lt;li&gt;Gib das obere Element aus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Stack enthält das oberste Stackelement als Attribut.
Ein Stackelement ist ein Objekt, was den zu speichernden Inhalt und das nächste Element als Attribut hat.
Dadurch referenzieren sich die Elemente immer weiter gegenseitig.&lt;/p&gt;
&lt;p&gt;Wenn ein neues Objekt draufgelegt wird, speichert dieses die Referenz zum vorherigen ersten Element und wird als oberstes element im Stack gespeichert.
Da das erste Element bei einem leeren Stack &lt;em&gt;null&lt;/em&gt; ist, referenziert das letzte Element immer &lt;em&gt;null&lt;/em&gt; als nächstes. Dadurch ist es einfach zu erkennen, wann der Stack zu ende ist.&lt;/p&gt;
&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;

&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;

&lt;div class="mermaid"&gt;
classDiagram
class Stack~ContentType~ {
    top() : ~ContentType~
    push(~ContentType~) : void
    pop() : void
}

class StackNode~ContentType~ {
    content: ~ContentType~
}
Stack &lt;-- StackNode : top
StackNode &lt;-- StackNode : next
&lt;/div&gt;

&lt;h1 id="queue"&gt;Queue&lt;/h1&gt;
&lt;p&gt;Eine Queue funktioniert ahnlich wie ein Stack.
Die Queue arbeitet nach dem &lt;em&gt;First in - First&lt;/em&gt; out prinzip.
Dafür wird das neueste Element und das älteste Element in der Queue referenziert.
Die QueueNodes referenzieren jeweils das neuere Element, welches dementsprechend als nächstes das abzurufende wäre.
Auch enthalten die Nodes wieder das Inhaltsobjekt.&lt;/p&gt;
&lt;div class="mermaid"&gt;
classDiagram
class Queue~ContentType~ {
    append(~ContentType~) : void
    first() : ~ContentType~
    remove() : void
}

class QueueNode~ContentType~ {
    content : ~ContentType~
}

Queue &lt;-- QueueNode : first
Queue &lt;-- QueueNode : last
QueueNode &lt;-- QueueNode : next
&lt;/div&gt;

&lt;p&gt;Um in einer Queue ein Objekt hinzuzufügen wird es zum vorher letzten als nächstes referenziert und dann in der Queue als letztes referenziert.
Genau wie beim Stack ist das nächste Element der letzten Node &lt;em&gt;null&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="liste"&gt;Liste&lt;/h1&gt;
&lt;p&gt;Die Liste ist wie eine dynamische Version des Arrays.
Eine Liste hat einen Zeiger, der auf das aktuelle Element verweist. 
Dieser kann frei innerhalb der Liste bewegt werden.
Ebenfalls hat die Liste einen Verweis auf das erste und das letzte Element, um die Navigation zu vereinfachen.&lt;/p&gt;
&lt;div class="mermaid"&gt;
classDiagram
class Liste~ContentType~ {
    toFirst() : void
    toLast() : void
    getContent() : ~ContentType~
    next() : void
    isEmpty() : boolean
    remove() : void
    append(~ContentType~) : void
    concat(Liste~ContentType~) : void
    getPrevNode(Node~ContentType~) : Node~ContentType~
}

class Node~ContentType~ {
    content : ~ContentType~
}
Liste &lt;-- Node : first
Liste &lt;-- Node : last
Liste &lt;-- Node : current
Node &lt;-- Node : next
&lt;/div&gt;

&lt;p&gt;Die Liste ist so strukturiert, dass jede Node die referenz zum nächsten Element speichert. Dadurch ergibt sich wie auch schon bei der Queue eine Kette.
Man spricht hierbei von einer Linked-List.
Würden die Nodes auch eine Referenz auf das vorherige Element, also in beide Richtungen speichern, wäre es eine Double-Linked-List.&lt;/p&gt;
&lt;p&gt;Die Liste hat die Vorteile, wenn man Ansammlungen von verschieden großen Mengen speichern will und man nicht unnötig viel speicherplatz zuweisen will.
Die standard-Java Bibliothek hat die Klasse LinkedList, die genau diese Aufgabe übernimmt.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Delock 11826 EspHome flashing</title><link href="https://www.dj-bauer.de/delock-11826-esphome-flashing.html" rel="alternate"/><published>2020-12-26T16:04:00+01:00</published><updated>2020-12-26T16:04:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-12-26:/delock-11826-esphome-flashing.html</id><summary type="html">&lt;p&gt;Ich habe mir nun auch mal einen von diesen Tasmota geflashten Delock Netzwerkschaltern angeschaut.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Also diese Delock Schalter sind schon echt cool.
Ganz ohne Cloud und einfach nur mit Tasmota.
Da ich aber &lt;a href="https://www.home-assistant.io"&gt;home assistant&lt;/a&gt; am laufen habe, ist &lt;a href="https://www.esphome.io"&gt;EspHome&lt;/a&gt; für mich besser geeignet, um nicht für alles einen MQTT-Server zu brauchen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Delock 11826 Network Switch" src="https://www.dj-bauer.de/images/20201226_delock_11826.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Also habe ich mir einfach ein Esphome Image kompiliert und als Tasmota update getarnt hochgeladen.
Und was soll ich sagen? Reibungsloser Ablauf!
Es hat auf Anhieb alles Funktioniert.&lt;/p&gt;
&lt;p&gt;Das Pinout habe ich &lt;a href="https://templates.blakadder.com/delock_11826.html"&gt;hier&lt;/a&gt; gefunden.
Für alle, die auch diesen Schalter umflashen wollen, habe ich hier die wichtigen io Teile.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gpio&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Fountain&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;GPIO12&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;relay&lt;/span&gt;

&lt;span class="nt"&gt;binary_sensor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gpio&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;taster&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;GPIO0&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;INPUT_PULLUP&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;inverted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;True&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delayed_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;20ms&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delayed_off&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;20ms&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;on_press&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;then&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;switch.toggle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;relay&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Der Taster auf dem Schalter kann diesen also ebenfalls ganz normal ein und aus schalten.&lt;/p&gt;</content><category term="Smarthome"/><category term="esp"/><category term="homeassistant"/></entry><entry><title>My gentoo build setup</title><link href="https://www.dj-bauer.de/my-gentoo-build-setup-en.html" rel="alternate"/><published>2020-11-30T13:25:00+01:00</published><updated>2020-11-30T13:25:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-11-30:/my-gentoo-build-setup-en.html</id><summary type="html">&lt;p&gt;Recently I got into gentoo and I started creating a quite sophisticated building system for portage.&lt;/p&gt;</summary><content type="html">&lt;h1 id="architecture"&gt;Architecture&lt;/h1&gt;
&lt;p&gt;I am going to use the following components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gentooLTO&lt;/strong&gt; for -O3 and graphite optimizations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;distcc&lt;/strong&gt; to distribute the compiling jobs to a high power server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ccache&lt;/strong&gt; to cache compiled files for often used libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="setting-up-the-server"&gt;Setting up the server&lt;/h1&gt;
&lt;h2 id="updating-gcc"&gt;Updating gcc&lt;/h2&gt;
&lt;p&gt;I installed a standard gentoo installation with openrc from the default LXC packages in proxmox, where my server is.
To use gentooLTO, You need to have gcc&amp;gt;=10, so I unmasked the unstable packet first.&lt;/p&gt;
&lt;h4 id="etcportagepackageaccept_keywords"&gt;&lt;strong&gt;&lt;code&gt;/etc/portage/package.accept_keywords&lt;/code&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sys-devel/gcc ~amd64
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then I installed the newest gcc and made it default compiler to uninstall the old one.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--ask&lt;span class="w"&gt; &lt;/span&gt;sys-devel/gcc
&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;gcc-config
&lt;span class="go"&gt;gcc-8.9.0  1&lt;/span&gt;
&lt;span class="go"&gt;gcc-10.2.0 2&lt;/span&gt;
&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;gcc-config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--depclean
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="setting-up-distccd"&gt;Setting up distccd&lt;/h2&gt;
&lt;p&gt;The distcc server is pretty easy to set up and get configured&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--ask&lt;span class="w"&gt; &lt;/span&gt;distcc
&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;rc-update&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;distccd
&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;rc-service&lt;span class="w"&gt; &lt;/span&gt;distccd&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The only thing left to do for distcc is now to fill the config file with some default configurations
There is basically only one main line necessarry which will set all the parameters&lt;/p&gt;
&lt;h4 id="etcconfddistccd"&gt;&lt;em&gt;&lt;code&gt;/etc/conf.d/distccd&lt;/code&gt;&lt;/em&gt;&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;DISTCCD_OPTS=&amp;quot;--port 3632 --log-level debug --log-file /var/log/distcc/distcc.log -N 15 --allow IP_ADDRESS&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The ip address you insert after --allow should be the addresses you wanna use as client which can connect to it.
The number as argument &lt;em&gt;-N&lt;/em&gt; determines the number of processes you want to start. I am on a 12 core machine, and 15 processes worked best for me, so no compiling process was blocking.&lt;/p&gt;
&lt;h2 id="setting-up-ccache"&gt;Setting up ccache&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--ask&lt;span class="w"&gt; &lt;/span&gt;ccache
&lt;/pre&gt;&lt;/div&gt;


&lt;h4 id="varcacheccacheccacheconf"&gt;&lt;em&gt;&lt;code&gt;/var/cache/ccache/ccache.conf&lt;/code&gt;&lt;/em&gt;&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# Maximum size your cache ist allowed to take up
max_size = 8.0G
#Allow others to run ebuild and share the cache
umask = 002
# preserve cache accross gcc rebuilds
compiler_check = %compiler% -v
# Rekursive number of directories
cache_dir_levels = 2
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="setting-up-the-clientdesktop-computer"&gt;Setting up the client/desktop computer&lt;/h1&gt;
&lt;p&gt;There is a bit more work to do on the desktop computer
The first thing to do is to also &lt;a href="#updating-gcc"&gt;update to the latest gcc version&lt;/a&gt;.
This is necassary to use gentooLTO and was needed on the server, because we need the &lt;strong&gt;same&lt;/strong&gt; binutils and gcc versions on the client and server(s).&lt;/p&gt;
&lt;p&gt;In the next step we setup distcc and make portage use it.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;emerge&lt;span class="w"&gt; &lt;/span&gt;--ask&lt;span class="w"&gt; &lt;/span&gt;distcc
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To use distcc in portage is pretty easy.
We only need to activate it as a feature in our &lt;em&gt;/etc/portage/make.conf&lt;/em&gt;
Also we need to specify the local(-l) and total(-j) number of threads to use by all.
A good formula should be sum of &lt;em&gt;cpu-cores + 1&lt;/em&gt;
It is also important to specify your cpu architecture explicitly, because &lt;strong&gt;-march=auto wont work&lt;/strong&gt;. This is because we need to make sure, we compile it for the correct traget architecture even when our remote server is on a different one.&lt;/p&gt;
&lt;h4 id="etcportagemakeconf"&gt;&lt;strong&gt;&lt;code&gt;/etc/portage/make.conf&lt;/code&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;GLOBALARG=&amp;quot;-march=zenver1&amp;quot;
NUMTHREADS=&amp;quot;12&amp;quot;
# 12 remote + 12 local + 1
MAKEOPS=&amp;quot;-j25 -l12&amp;quot;
FEATURES=&amp;quot;distcc&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;One step is still missing until we can use distcc to remotely compile packages and that is to tell it where our remote servers are. We do this with a simple command&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;dbauer@appollo:~$ &lt;/span&gt;distcc-config&lt;span class="w"&gt; &lt;/span&gt;--remote&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;IP_ADDR_OF_SERVER&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you want to use ccache on your client as well, you can do the same procedure to install and setup ccache as on the server and just need to activate it as a feature in your portage/make.conf.&lt;/p&gt;
&lt;p&gt;And that's it!
It took a quite a while for me to figure it all out, but the gentoo wiki was really helpfull.
I do not know if it was worth the work, but now I know, my ebuild packages are remotely compiled.&lt;/p&gt;</content><category term="gentoo"/><category term="gentoo"/><category term="distcc"/><category term="ccache"/><category term="portage"/><category term="lto"/></entry><entry><title>Backtracking</title><link href="https://www.dj-bauer.de/backtracking.html" rel="alternate"/><published>2020-10-03T19:00:00+02:00</published><updated>2020-10-03T19:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-10-03:/backtracking.html</id><summary type="html">&lt;h1 id="grundsatzliches-prinzip"&gt;Grundsätzliches Prinzip&lt;/h1&gt;
&lt;p&gt;Backtracking arbeitet grundsätzlich nach dem &lt;em&gt;Trial-and Error&lt;/em&gt; printzip.
Es wird also so lange nach einer Lösung gesucht, bis sie gefunden wird.
Wenn abzusehen ist, dass der aktuelle Lösungsweg nicht zur Lösung führen wird, wird ein Schritt zurück gegangen und nach einer alterantiven Lösung gesucht.
Am einfachsten werden Backtracking …&lt;/p&gt;</summary><content type="html">&lt;h1 id="grundsatzliches-prinzip"&gt;Grundsätzliches Prinzip&lt;/h1&gt;
&lt;p&gt;Backtracking arbeitet grundsätzlich nach dem &lt;em&gt;Trial-and Error&lt;/em&gt; printzip.
Es wird also so lange nach einer Lösung gesucht, bis sie gefunden wird.
Wenn abzusehen ist, dass der aktuelle Lösungsweg nicht zur Lösung führen wird, wird ein Schritt zurück gegangen und nach einer alterantiven Lösung gesucht.
Am einfachsten werden Backtracking Algorithmen rekursiv implementiert, wie man später noch im meinem Beispiel sehen wird.&lt;/p&gt;
&lt;h1 id="beispiel-ariadnefaden"&gt;Beispiel Ariadnefaden&lt;/h1&gt;
&lt;p&gt;Hierbei wird versucht den weg durch ein Labyrinth zu finden, ohne das Labyrinth zu kennen. 
( Sonnst wäre das ganze ja auch ohne Witz und man nähme einfach A* Oder ähnliches. )
Man kann dabei seinen gegangnen weg markieren.&lt;/p&gt;
&lt;h2 id="implementierung-des-ariadnefaden"&gt;Implementierung des Ariadnefaden&lt;/h2&gt;
&lt;p&gt;Gegeben ist ein 2-dimensionalen array wo, die Wände mit einem &lt;em&gt;#&lt;/em&gt; als char gekennzeichnet werden. Der erfolgreiche weg wird mit &lt;em&gt;O&lt;/em&gt; und nicht erfolgreicher weg mit &lt;em&gt;b&lt;/em&gt; markiert. Das Ziel steht drin mit &lt;em&gt;Z&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;suche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Ziel gefunden&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Aktuelle Position markieren&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;O&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Probieren, ob der weg nach links der richtige ist&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//true, wenn Ziel gefunden&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//Probieren, ob der weg nach rechts der richtige ist&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;breite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;breite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// true, wenn Ziel gefunden&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Probieren, ob der weg nach oben der richtige ist&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// true, wenn Ziel gefunden&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Probieren, ob der weg nach unten der richtige ist&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;hoehe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;hoehe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// true, wenn Ziel gefunden&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Wenn bis jetzt noch nicht returnt, ist der weg der falsche&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Als falsch markieren und als falschen weg returenen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;feld&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Die gelben wege waren Erfolgslos, der Grüne, führt zum Ziel.
&lt;img alt="Labyrinth gelößt" src="https://www.dj-bauer.de/images/lernblog_labyrinth.png" /&gt;&lt;/p&gt;
&lt;h1 id="andere-anwendungen-von-backtracking"&gt;Andere Anwendungen von Backtracking&lt;/h1&gt;
&lt;p&gt;Backtracking oft für das Lösen von NP-vollständigen Problemen genutzt, wie beim Rucksackproblem, wo man Versucht man einen Rucksack mit einer maximalen Gewichtskapazität und objekte mit einem Gewicht und einem Nuzwert hat.
Dabei versucht man die beste Kombination von Gewichten und nutzen zu bekommen.
Andere Beispiele wären Das Färbeproblem oder das Damen- und Springerproblem.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Komplexität</title><link href="https://www.dj-bauer.de/komplexitat.html" rel="alternate"/><published>2020-10-03T19:00:00+02:00</published><updated>2020-10-03T19:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-10-03:/komplexitat.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Mitschriften aus dem Unterricht&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="komplexitaet-von-suchen"&gt;Komplexitaet von suchen&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;gegeben ist ein feld mit n elementen&lt;/li&gt;
&lt;li&gt;Benchmarking ist nicht aussagekräftig&lt;ul&gt;
&lt;li&gt;Nicht die Algorithmen, sondern die Umgebung (Computer, architektur, betriebssystem, etc.) wird dabei betrachtet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Besser ist die Betrachtung in Einzelschritten des Algorithmus&lt;ul&gt;
&lt;li&gt;Bestimmung in abstrakter Zeiteinheit&lt;/li&gt;
&lt;li&gt;Unabhängig von environment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="beispiel-anhand-der-schritte-der-linearen-suche"&gt;Beispiel anhand der Schritte …&lt;/h2&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Mitschriften aus dem Unterricht&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="komplexitaet-von-suchen"&gt;Komplexitaet von suchen&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;gegeben ist ein feld mit n elementen&lt;/li&gt;
&lt;li&gt;Benchmarking ist nicht aussagekräftig&lt;ul&gt;
&lt;li&gt;Nicht die Algorithmen, sondern die Umgebung (Computer, architektur, betriebssystem, etc.) wird dabei betrachtet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Besser ist die Betrachtung in Einzelschritten des Algorithmus&lt;ul&gt;
&lt;li&gt;Bestimmung in abstrakter Zeiteinheit&lt;/li&gt;
&lt;li&gt;Unabhängig von environment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="beispiel-anhand-der-schritte-der-linearen-suche"&gt;Beispiel anhand der Schritte der linearen suche&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;zuweisung&lt;/li&gt;
&lt;li&gt;n schleifendurchläufe á 4 einzelschritte&lt;ul&gt;
&lt;li&gt;2 tests&lt;/li&gt;
&lt;li&gt;feldzugriff&lt;/li&gt;
&lt;li&gt;addition&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;letzter test&lt;/li&gt;
&lt;li&gt;rückgabe&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;2+n*4+3 = 5+4n schritte&lt;/p&gt;
&lt;p&gt;Bester fall: n=0: 5 schritte&lt;/p&gt;
&lt;h1 id="aussagen-uber-die-algorithmenlaufzeit"&gt;Aussagen über die Algorithmenlaufzeit&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Man sucht relative Vergleichbarkeit über skaliebarkeit&lt;/li&gt;
&lt;li&gt;Vernachlässigung von kleinen Funktionsteilen&lt;ul&gt;
&lt;li&gt;3n² + 2n -&amp;gt; 3n²&lt;/li&gt;
&lt;li&gt;2n * 5 -&amp;gt; 2n&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vernachlässigung von Konstanten&lt;ul&gt;
&lt;li&gt;4n -&amp;gt; n&lt;/li&gt;
&lt;li&gt;2n² -&amp;gt; n²&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reduktion auf den wesentlichen Term&lt;/li&gt;
&lt;li&gt;Wesentlichste Namen:&lt;ul&gt;
&lt;li&gt;n² quadratisch&lt;/li&gt;
&lt;li&gt;n³ qubisch&lt;/li&gt;
&lt;li&gt;n^4 quartisch&lt;/li&gt;
&lt;li&gt;2^n exponentiel&lt;/li&gt;
&lt;li&gt;log n logarithmisch&lt;/li&gt;
&lt;li&gt;f! fakultativ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="o-notation"&gt;O-Notation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;f element aus O(g)&lt;/li&gt;
&lt;li&gt;f wächst genauso schnell wie g&lt;ul&gt;
&lt;li&gt;Es seien f: ℕ → ℝ+ und  g: ℕ → ℝ+ Funktionen. &lt;/li&gt;
&lt;li&gt;Dann gilt: &lt;/li&gt;
&lt;li&gt;f = Θ(g) genau dann, wenn n0 ∈ ℕ und c1, c2, ∈ ℝ existieren, &lt;/li&gt;
&lt;li&gt;sodass für n ≤ n0:&lt;/li&gt;
&lt;li&gt;c1 * g(n) ≤ f(n) ≤ c2*g(n)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;O-Notation ist ein linearer rechenkörper&lt;/li&gt;
&lt;/ul&gt;</content><category term="lernblog"/></entry><entry><title>Suche</title><link href="https://www.dj-bauer.de/suche.html" rel="alternate"/><published>2020-10-03T19:00:00+02:00</published><updated>2020-10-03T19:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-10-03:/suche.html</id><summary type="html">&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;

&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;

&lt;h1 id="lineare-suche"&gt;Lineare Suche&lt;/h1&gt;
&lt;p&gt;Bei der Linearen Suche wird über jedes Element in der Liste gelaufen und mit dem gesuchten Element verglichen.
Wenn die Elemente gleich sind, wird der Index zurück gegeben. 
Wenn kein Element gefunden wird, wird -1 zurück gegeben.
&lt;div class="mermaid"&gt;
graph TD
    Z([Start]) --&amp;gt; A[index=0 …&lt;/div&gt;&lt;/p&gt;</summary><content type="html">&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;

&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;

&lt;h1 id="lineare-suche"&gt;Lineare Suche&lt;/h1&gt;
&lt;p&gt;Bei der Linearen Suche wird über jedes Element in der Liste gelaufen und mit dem gesuchten Element verglichen.
Wenn die Elemente gleich sind, wird der Index zurück gegeben. 
Wenn kein Element gefunden wird, wird -1 zurück gegeben.
&lt;div class="mermaid"&gt;
graph TD
    Z([Start]) --&amp;gt; A[index=0]
    A --&amp;gt; B{ index &amp;lt; a.length }
    B --&amp;gt; |True| C{"a[index] == searched"}
    B --&amp;gt; |False| F([Return -1])
    C --&amp;gt; |False| D[index += 1]
    C --&amp;gt; |True| E(["Return a[index]"])
    D --&amp;gt; B
&lt;/div&gt;&lt;/p&gt;
&lt;h2 id="java-implementierung"&gt;Java Implementierung&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;suche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="binare-suche"&gt;Binäre Suche&lt;/h1&gt;
&lt;p&gt;Der Grundgedanke geht davon aus, dass die zu durchuchende Liste schon im vorhinein sortiert ist.
Die binäre Suche sucht sich das mittlere Element in der durchuchende Menge aus und vergleicht es mit dem gesuchten Wert.
Wenn dieser direkt gleich dem gesuchten Wert ist, wird der index zurück gegeben.
Wenn der gesuchte wert größer ist, dann wird die Rechte Hälfte der Bereichs genau nach diesem Schema noch einmal durchsucht.
Beim kleinern passiert das gleiche mit der linken Hälfte.&lt;/p&gt;
&lt;div class="mermaid"&gt;
graph TD
    A([Start]) --&gt; B[start=0&lt;br&gt;end=a.length-1]
    B --&gt; C{ start &lt;= end }
    C --&gt; |True| D["mid = (start+end)/2"]
    D --&gt; E{"a[mid] == searched"}
    E --&gt; |True| F[/Return mid/]
    E --&gt; |False| G{"a[mid] &lt; n"}
    G --&gt; |True| H[start = mid+1]
    H --&gt; C
    G --&gt; |False| I[end = mid+1]
    I --&gt; C
    F --&gt; J([End])
    C --&gt; |False| K[/return -1/]
    K --&gt; J
&lt;/div&gt;

&lt;h2 id="java-implementierung_1"&gt;Java Implementierung&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;binaereSuche&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;//binäre Suche&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rechts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rechts&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rechts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;rechts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;// Zähle Hoch&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;// Zähle runter&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;rechts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rechts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="vergleich-der-komplexitaten"&gt;Vergleich der Komplexitäten&lt;/h1&gt;
&lt;p&gt;Die Lineare Suche hat eine Komplexität im worst case von O(n), wohingegen die binäre Suche eine Komplexität O(log(n)) hat, was eine deutliche Verbesserung ist.&lt;/p&gt;</content><category term="lernblog"/></entry><entry><title>Sortieren</title><link href="https://www.dj-bauer.de/sortieren.html" rel="alternate"/><published>2020-09-08T00:00:00+02:00</published><updated>2020-09-08T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-09-08:/sortieren.html</id><summary type="html">&lt;h1 id="sortierverfahren"&gt;Sortierverfahren&lt;/h1&gt;
&lt;h2 id="selection-sort"&gt;Selection Sort&lt;/h2&gt;
&lt;p&gt;Es gibt das min und das max selection sort verfahren. Beim Min-Selection sort wird immer aus einem unsortierten bereich das minimum herausgesucht und dann als letztes Element der sortierten Menge angefügt.&lt;/p&gt;
&lt;h3 id="struktogram"&gt;Struktogram&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Struktogram Min sort" src="https://www.dj-bauer.de/images/20200908_lernblog_selection_sort.png" /&gt;&lt;/p&gt;
&lt;h3 id="java-implementierung"&gt;Java Implementierung&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;minSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;h1 id="sortierverfahren"&gt;Sortierverfahren&lt;/h1&gt;
&lt;h2 id="selection-sort"&gt;Selection Sort&lt;/h2&gt;
&lt;p&gt;Es gibt das min und das max selection sort verfahren. Beim Min-Selection sort wird immer aus einem unsortierten bereich das minimum herausgesucht und dann als letztes Element der sortierten Menge angefügt.&lt;/p&gt;
&lt;h3 id="struktogram"&gt;Struktogram&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Struktogram Min sort" src="https://www.dj-bauer.de/images/20200908_lernblog_selection_sort.png" /&gt;&lt;/p&gt;
&lt;h3 id="java-implementierung"&gt;Java Implementierung&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;minSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;minPos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Den index vom kleinsten wert in der unsortierten Menge finden.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;minPos&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;minPos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Den kleinsten wert and den niedrigsten Index der unsortierten Menge setzen&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;iUnsorted&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;minPos&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;minPos&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="merge-sort"&gt;Merge Sort&lt;/h2&gt;
&lt;h3 id="funktionsweise"&gt;Funktionsweise&lt;/h3&gt;
&lt;p&gt;Die liste wird immer weiter in kleinere listen unterteilt, bis diese die länge 1 haben, also praktisch sortiert sind.
Dann werden diese wieder sortiert zusammengeführt, daher der name merge sort(engl. merge &lt;em&gt;sortieren&lt;/em&gt;)
Dies ist nicht nur von der Komplexität sehr effektiv (&lt;strong&gt;O(log n)&lt;/strong&gt;), sondern ist durch die vielen kleinen prozesse gut auf meherere Prozesse Skallierbar.&lt;/p&gt;
&lt;script src="https://www.dj-bauer.de/theme/js/mermaid.min.js"&gt;&lt;/script&gt;

&lt;script&gt;mermaid.initialize({startOnLoad:true});&lt;/script&gt;

&lt;h3 id="programablaufplan"&gt;Programablaufplan&lt;/h3&gt;
&lt;p&gt;&lt;div class="mermaid"&gt;
graph TD
    A([Start]) --&amp;gt;|Parameters&lt;br&gt;result, left, right| B[leftindex = 0&lt;br&gt;rightindex = 0&lt;br&gt;resultindex = 0]
    B --&amp;gt; C[ ]
    C --&amp;gt; D{resultindex &amp;lt; result.length}
    D --&amp;gt; |False| E([End])
    D --&amp;gt; |True| F{leftindex &amp;gt;= left.length}
    G --&amp;gt; C
    F --&amp;gt; |False| H{rightindex &amp;gt;= right.length}
    H --&amp;gt; |False| I{"left[leftindex] &amp;lt; right[rightindex]"}
    F --&amp;gt; |True| G["result[resultIndex] = right[rightindex];&lt;br&gt;rightindex++;&lt;br&gt;resultIndex++;"]
    I --&amp;gt; |False| G
    I --&amp;gt; |True| J["result[resultindex] = left[leftindex];&lt;br&gt;leftindex++;&lt;br&gt;resultindex++;"]
    J --&amp;gt; C
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="java-implementierung_1"&gt;Java Implementierung&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;mergeSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Bringt zwei sortierte arrays in ein grosses array zusammen&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="quick-sort"&gt;Quick sort&lt;/h2&gt;
&lt;h3 id="funktionsweise_1"&gt;Funktionsweise&lt;/h3&gt;
&lt;p&gt;Beim quicksort gibt es einen &lt;em&gt;Pivot Point&lt;/em&gt; Um den herum sortiert werden.
Alle werte kleiner, als der Pivot werden links davon eingeordnet, und alle größer, rechts davon.
Dazu werden eine rechte und eine linke schranke definiert, die immer weiter richtung Pivot gehen.
Wenn das Element an unserer linken Marke nun einen größeren Wert, als Pivot hat und die Linke Marke einen größeren, dann werden diese beiden vertauscht.&lt;/p&gt;
&lt;h3 id="programablaufplan_1"&gt;Programablaufplan&lt;/h3&gt;
&lt;p&gt;&lt;div class="mermaid"&gt;
graph TD
    Z([Start]) --&amp;gt; A["pivot=a[a.length/2]&lt;br&gt;left=0&lt;br&gt;right=n-1"]
    A --&amp;gt; B{left &amp;lt; right}
    B --&amp;gt; |True| C{"a[right] &amp;gt;= pivot"}
    B --&amp;gt; |False| K["a[left] = pivot"]
    K --&amp;gt; Y([End])
    C --&amp;gt; |True| D["right += 1"]
    D --&amp;gt; E{left != right}
    C --&amp;gt; |False| E
    E --&amp;gt; |True| F["a[left] = a[right]&lt;br&gt;left += 1"]
    F --&amp;gt; G{"a[left] &amp;lt; pivot"}
    E --&amp;gt; |False| G
    G --&amp;gt; |True| H[left += 1]
    H --&amp;gt; I{left != right}
    G --&amp;gt; |False| I
    I --&amp;gt; |False| B
    I --&amp;gt; |True| J["a[right] = a[left]&lt;br&gt;right -= 1"]
    J --&amp;gt; B
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="java-implementierung_2"&gt;Java implementierung&lt;/h3&gt;
&lt;p&gt;Implementiert wird der Quick sort wieder in rekursiver form&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;quicksort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//Wenn unser array nur noch ein element hat, ist es sortiert&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//Pivot element als mittleres element bestimmen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pivot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//Rechte und linke marken erstellen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wert, der nach rechts muss finden&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pivot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// Wert, der nach links muss finden&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linke&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;//Werte vertauschen&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Rekursiver aufruf&lt;/span&gt;
&lt;span class="cm"&gt;    Am ende ist der index des pivot elements = l = r,&lt;/span&gt;
&lt;span class="cm"&gt;    daher kann man sich aussuchen, welchen index man nimmt.&lt;/span&gt;
&lt;span class="cm"&gt;    Ich nehme l.&lt;/span&gt;
&lt;span class="cm"&gt;    */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;quicksort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;quicksort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="insertion-sort"&gt;Insertion Sort&lt;/h2&gt;
&lt;h3 id="funktionsweise_2"&gt;Funktionsweise&lt;/h3&gt;
&lt;p&gt;Beim insertion sort gibt es einen sortierten und einen unsortierten bereich.
Man kann sich hierbei aussuchen, ob man diesen Bereich oben, also für die großen Zahlen, oder unter für die kleinen Zahlen haben möchte.
Der sortierte Bereich ist anfangs 1 element groß.
Ich erklähre hier das sortieren mit dem kleineren sortierten Bereich.
Es wird immer das erste Element der unsortierten bereichs mit dem letzten der sortierten verglichen. Ist das unsortierte Element kleiner, wird es mit dem vorletzten Element verglichen, bis es größer ist. Dann wird es nach dem kleinen Element eingefügt, daher auch der Name.
So wird der sortierte Bereich um 1 größer, und das neue erste Element der unsortierten Bereichs wird verglichen.
Dies passiert, bis der unsortierte Bereicht leer ist, und damit das ganze Array sortiert ist.&lt;/p&gt;
&lt;h3 id="java-implementierung_3"&gt;Java Implementierung&lt;/h3&gt;
&lt;p&gt;Man kann den Insertion Sort sowohl rekursiv, als auch iterativ implementieren.
Beim Aufruf der Rekursiven Implementierung, muss man als zweites Parameter den &lt;em&gt;index=0&lt;/em&gt; angeben.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;insertion_sort_rekursiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;insertion_sort_rekursiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;insertion_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="lernblog"/></entry><entry><title>Rekursion</title><link href="https://www.dj-bauer.de/rekursion.html" rel="alternate"/><published>2020-08-30T12:00:00+02:00</published><updated>2020-08-30T12:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-08-30:/rekursion.html</id><summary type="html">&lt;h1 id="rekursion"&gt;Rekursion&lt;/h1&gt;
&lt;p&gt;Eine Prozedur teilt ein Problem auf indem es sich immer wieder selbstaufruft, bis es zu einer einfachen Lösung kommt.
Eine rekursive Berechnung geht von dem zu berechnenden Folgeglied aus und berechnet von dort ausgehend immer weitere Folgeglieder.&lt;/p&gt;
&lt;h2 id="rekursionsschreibweise"&gt;Rekursionsschreibweise:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Basis ist der startpunkt&lt;ul&gt;
&lt;li&gt;z.B. &lt;code&gt;f(0)=0, f(1 …&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h1 id="rekursion"&gt;Rekursion&lt;/h1&gt;
&lt;p&gt;Eine Prozedur teilt ein Problem auf indem es sich immer wieder selbstaufruft, bis es zu einer einfachen Lösung kommt.
Eine rekursive Berechnung geht von dem zu berechnenden Folgeglied aus und berechnet von dort ausgehend immer weitere Folgeglieder.&lt;/p&gt;
&lt;h2 id="rekursionsschreibweise"&gt;Rekursionsschreibweise:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Basis ist der startpunkt&lt;ul&gt;
&lt;li&gt;z.B. &lt;code&gt;f(0)=0, f(1)=1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rekursionsschritt definiert  für alle anderen validen Werte&lt;ul&gt;
&lt;li&gt;z.B. &lt;code&gt;f(n) = f(n-1) + f(n-2) für n &amp;gt; 1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rekursive-zahlenfolgen"&gt;Rekursive Zahlenfolgen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hofstadter Funktion&lt;ul&gt;
&lt;li&gt;Definitionsmenge: &lt;code&gt;n &amp;gt;= 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Basis: &lt;code&gt;f(1) = 1, f(2) = 2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rekursionsschritt: &lt;code&gt;f(n) = f(n - f(n-1)) + f(n - f(n-2))&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fibbonachi Folge&lt;ul&gt;
&lt;li&gt;Definitionsmenge: &lt;code&gt;n &amp;gt;= 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Basis: &lt;code&gt;f(0) = 0, f(1) = 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rekursionsschritt: &lt;code&gt;f(n - 1) + f(n - 2)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fakultät Funktion&lt;ul&gt;
&lt;li&gt;Definitionsmenge: &lt;code&gt;n &amp;gt;=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Basis: &lt;code&gt;f(1) = 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rekursionsschritt: &lt;code&gt;f(n) = n * f(n - 1)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="turme-von-hanoi"&gt;Türme von Hanoi&lt;/h1&gt;
&lt;p&gt;Die Türme von Hanoi ist ein Puzzel, bei dem es darum geht die Scheiben vom ersten Turm zu einem weiteren zu transferieren. Dabei darf immer nur eine jede Scheibe einzeln bewegt werden. Außerdem darf eine Scheibe nur auf eine größere Scheibe gelegt werden.
&lt;img alt="Türme von Hanoi" src="https://www.dj-bauer.de/images/20200907_lernblog_hanoi_1.png" /&gt;&lt;/p&gt;
&lt;h2 id="anzahl-der-schritte"&gt;Anzahl der Schritte&lt;/h2&gt;
&lt;p&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Anzahl der Scheiben&lt;/th&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Anzahl der Schritte&lt;/th&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;
&lt;h2 id="formel-zur-berechnung-der-benotigten-schritte"&gt;Formel zur Berechnung der benötigten Schritte&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rekursiv: &lt;code&gt;s(n) = s(n-1)*2 + 1, s(1) = 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Explizit: &lt;code&gt;s(n) = 2^s - 1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rekursive-beweg-funktion"&gt;Rekursive beweg-funktion&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;FUNKTION&lt;/span&gt; &lt;span class="n"&gt;bewege&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anzahl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ziel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hilfe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bewege&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anzahl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hilfe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bewege&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ziel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bewege&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anzahl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hilfe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ziel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="struktogram-der-algorithmus"&gt;Struktogram der Algorithmus&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Struktogram Algorithmus" src="https://www.dj-bauer.de/images/20200908_lernblog_hanoi_2.png" /&gt;&lt;/p&gt;
&lt;h2 id="rekursive-beweg-funktion-in-java-implementiert"&gt;Rekursive Beweg-Funktion in Java implementiert&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/*Bewege eine Scheibe von einem Stapel zu einem anderen*/&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;bewege_scheibe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zielstapel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Bewege scheibe */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/*Bewege einen Turm vom startstapel zum zielstapel*/&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;bewege_turm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hoehe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zielstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hilfstapel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hoehe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;bewege_scheibe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zielstapel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;bewege_turm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hoehe&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hilfstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zielstapel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;bewege_scheibe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zielstapel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;bewege_turm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hoehe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hilfstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zielstapel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startstapel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="lernblog"/></entry><entry><title>GUI mit Java</title><link href="https://www.dj-bauer.de/gui-mit-java.html" rel="alternate"/><published>2020-08-20T12:00:00+02:00</published><updated>2020-08-20T12:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-08-20:/gui-mit-java.html</id><content type="html">&lt;h1 id="was-haben-wir-gemacht"&gt;Was haben wir gemacht&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;GUI erstellung mit dem Java-Editor&lt;ul&gt;
&lt;li&gt;Temperaturumwandler GUI&lt;/li&gt;
&lt;li&gt;Taschenrechner GUI&lt;/li&gt;
&lt;li&gt;Game of life GUI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Game of life Simulator programmiert&lt;/li&gt;
&lt;/ul&gt;</content><category term="lernblog"/></entry><entry><title>Tschüss Thingiverse, hello selfhosted</title><link href="https://www.dj-bauer.de/tschuss-thingiverse-hello-selfhosted.html" rel="alternate"/><published>2020-07-30T09:15:00+02:00</published><updated>2020-07-30T09:15:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-07-30:/tschuss-thingiverse-hello-selfhosted.html</id><summary type="html">&lt;p&gt;Bisher habe ich die meisten meiner 3d-designs auf Thingiverse hochgeladen. Nun nicnt mehr&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ich habe seit einem Jahr nichts mehr auf Thingiverse hochgeladen.
Das liegt for allem daran, dass die Seite unbenutzbar geworden ist.
In einem Nachmittag der Frust habe ich also angefangen, in meinem static blog generator &lt;em&gt;Pelican&lt;/em&gt; mit Jinja und einem bash script, eine einfache Möglichkeit für mich zu schaffen meine Modelle selbst zu hosten.
Bisher habe ich noch wenig features, aber ich plane zumindest Druckinformationen zinzuzufügen.
Nun ist oben im Reiter auch ein Link zur Liste meiner Modelle&lt;/p&gt;</content><category term="3d-print"/><category term="selfhosting"/></entry><entry><title>6.3in designer phone stand</title><link href="https://www.dj-bauer.de/63in-designer-phone-stand.html" rel="alternate"/><published>2020-07-26T00:00:00+02:00</published><updated>2020-07-26T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-07-26:/63in-designer-phone-stand.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Vogesenwanderung 2020</title><link href="https://www.dj-bauer.de/vogesenwanderung-2020-en.html" rel="alternate"/><published>2020-07-11T11:55:00+02:00</published><updated>2020-07-11T11:55:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-07-11:/vogesenwanderung-2020-en.html</id><summary type="html">&lt;p&gt;Dieses Jahr sind wir wieder zu dritt in den Vogesen unterwegs gewesen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nach einem Ausfall der fast schon traditionell jährlichen Vogesenwanderung letztes Jahr durch mein Auslandsahr, ging es dieses Jahr wieder weiter.
Dieses Jahr war schon zum zweiten Jahr neben mir und meinem Vater, meine Schwester dabei.
Auch hatten wir zum ersten mal vier Übernachtungen anstatt sonst drei.
Dieses Jahr hatten wir zum ersten mal recht hohe Berge mit bis zu 1400m und Seen gesehen.
Für mich persönlich war es eine der anstrengensten trips, aber definitiv eine der besten.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Gebirgsaussicht" src="https://www.dj-bauer.de/images/20200707_me.jpg" /&gt;
&lt;img alt="Der zweite Lagerplatz" src="https://www.dj-bauer.de/images/20200705_see.jpg" /&gt;
&lt;img alt="Der zweite Lagerplatz am morgen" src="https://www.dj-bauer.de/images/20200706_nebel.jpg" /&gt;
&lt;img alt="Gebirgsaussicht" src="https://www.dj-bauer.de/images/20200707_panorama.jpg" /&gt;
&lt;img alt="Der vierte Lagerplatz" src="https://www.dj-bauer.de/images/20200707_see.jpg" /&gt;&lt;/p&gt;</content><category term="2020"/><category term="wandern"/><category term="vogesen"/></entry><entry><title>Create systemd free linux system with artix</title><link href="https://www.dj-bauer.de/create-systemd-free-linux-system-with-artix-en.html" rel="alternate"/><published>2020-07-01T15:36:00+02:00</published><updated>2020-07-01T15:36:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-07-01:/create-systemd-free-linux-system-with-artix-en.html</id><summary type="html">&lt;p&gt;I recently installed artix linux for the first time. Here is a very brief step-by-step list how I've done it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently installed artix linux for the first time.
Here is a very brief step-by-step list how I've done it.
To install Artix I followed the artix wiki installation instructions.&lt;/p&gt;
&lt;h1 id="here-is-my-short-version-of-the-instructions"&gt;Here is my short version of the instructions.&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Download the artix-openrc iso and burn it on a USB-Stick&lt;/li&gt;
&lt;li&gt;Boot from the USB stick on the machine&lt;/li&gt;
&lt;li&gt;Partition the drive&lt;ol&gt;
&lt;li&gt;Boot partition 512M sda1&lt;/li&gt;
&lt;li&gt;Sawp partition 4GB sda2&lt;/li&gt;
&lt;li&gt;Root partition Rest sda3&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Format the partitions&lt;ol&gt;
&lt;li&gt;mkfs.ext4 -L BOOT /dev/sda1&lt;/li&gt;
&lt;li&gt;mkfs.ext4 -L ROOT /dev/sda3&lt;/li&gt;
&lt;li&gt;mkswap 0L SWAP /dev/sda2&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Mount the partitions&lt;ol&gt;
&lt;li&gt;swapon /dev/disk/by-label/SWAP&lt;/li&gt;
&lt;li&gt;mount /dev/disk/by-label/ROOT /mnt&lt;/li&gt;
&lt;li&gt;mkdir /mnt/boot&lt;/li&gt;
&lt;li&gt;mount /dev/disk/by-label/BOOT /mnt/boot&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Install the base system, openrc and kernel&lt;ul&gt;
&lt;li&gt;basestrap /mnt base base-devel openrc linux linux-firmware&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generate Fstab&lt;ul&gt;
&lt;li&gt;fstabgen -U /mnt &amp;gt;&amp;gt; /mnt/etc/fstab&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chroot into new root dir&lt;ul&gt;
&lt;li&gt;artools-chroot /mnt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Set locals&lt;ol&gt;
&lt;li&gt;vi /etc/locale.gen (uncomment correct locales)&lt;/li&gt;
&lt;li&gt;locale-gen&lt;/li&gt;
&lt;li&gt;ln -sf /usr/share/zoneinfo/Region/City /etc/localtime&lt;/li&gt;
&lt;li&gt;hwclock --systohc&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Install bootloader&lt;ol&gt;
&lt;li&gt;pacman -S grub os-prober&lt;/li&gt;
&lt;li&gt;grub-install --recheck /dev/sda&lt;/li&gt;
&lt;li&gt;grub-mkconfig -o /boot/grub/grub.cfg&lt;/li&gt;
&lt;li&gt;Set timeout to 0 in /boot/grub/grub.cfg&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Set root password&lt;ul&gt;
&lt;li&gt;passwd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Network config&lt;ol&gt;
&lt;li&gt;echo HOSTNAME &amp;gt; /etc/hostname&lt;/li&gt;
&lt;li&gt;pacman -S dhcpcd connman-openrc (Install dhcp and network manager)&lt;/li&gt;
&lt;li&gt;rc-update add connmand&lt;/li&gt;
&lt;li&gt;rc-service connmand start&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Reboot into system&lt;ol&gt;
&lt;li&gt;exit&lt;/li&gt;
&lt;li&gt;umount -R /mnt&lt;/li&gt;
&lt;li&gt;reboot&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</content><category term="Linux"/><category term="artix"/><category term="openrc"/><category term="linux"/></entry><entry><title>Reddit memes on the command line</title><link href="https://www.dj-bauer.de/reddit-memes-on-the-command-line-en.html" rel="alternate"/><published>2020-06-11T13:29:00+02:00</published><updated>2020-06-11T13:29:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-06-11:/reddit-memes-on-the-command-line-en.html</id><summary type="html">&lt;p&gt;I recently got the Idea, to automatically view reddit media in the command line. So I wrote a shell script for it&lt;/p&gt;</summary><content type="html">&lt;p&gt;I am currently in a phase where I try to collect every newsfeed together as rss in my terminal newsreader &lt;a href="https://newsboat.org/"&gt;newsboat&lt;/a&gt;.
I recently saw on the internet how you can get your subreddits you want as an RSS feed: "https://reddit.com/r/NAME/.rss".&lt;/p&gt;
&lt;p&gt;Now I was in the position, that I still had to open the browser to open actual media like images or videos.
In the newsboat doc I found the command pipe-to.&lt;/p&gt;
&lt;p&gt;So I wrote a little script which I just could pipe the whole article in and download, and open the media.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/tmp/reddit/&amp;quot;&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DIR&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;line
&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;link&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-oh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://[iv]\.redd\.it/.* &amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-z&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;amp&lt;span class="p"&gt;;&amp;amp;&lt;/span&gt;amp&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; BEGIN { FS = &amp;quot;/&amp;quot;}; {print $4}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$DIR$filename&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# o is a script, which chooses the right application for a file by the extension, stolen from Luke Smith somewhere&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;Make sure to have it executable (&lt;em&gt;chmod +x openreddit.sh&lt;/em&gt;) ant somewhere in your PATH
The last step to do was to create the newsboat macro for it.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;macro t pipe-to openreddit.sh
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now I can open any reddit media by pressing &lt;strong&gt;,t&lt;/strong&gt; with an open reddit post in newsboat
Sadly it's not that easy with twitter, because I have not found a way to retreive the media files yet, but eventually I can figure it out.&lt;/p&gt;</content><category term="Scripting"/><category term="reddit"/><category term="newsboat"/><category term="shell"/></entry><entry><title>Doch früher nach Hause gekommen</title><link href="https://www.dj-bauer.de/doch-fruher-nach-hause-gekommen.html" rel="alternate"/><published>2020-04-19T07:42:00+02:00</published><updated>2020-04-19T07:42:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-04-19:/doch-fruher-nach-hause-gekommen.html</id><summary type="html">&lt;p&gt;Ich bin nun genau einen Monat und einen Tag zurück in Deutschland. Warum genau und wie mein Jahr abgebrochen wurde, steht in diesem Artikel&lt;/p&gt;</summary><content type="html">&lt;p&gt;Als ich am 12 März morgens zum Frühstücken die Treppe hinunterging, stand mein Gastbruder, der wegen Corona nicht mehr zum college musste schon im Wohnzimmer und erzählte mir, dass ich warscheinlich heim geschickt werde.
Meine Gastmutter, die bei meiner Plazierungsorganisation CIEE arbeitete, war schon in der Schule und hat versucht das Chaos mit der Schule zu regeln.
Mein Wortlaut, als sie kurz später wieder zuhause eintraf: Khris, what the hell is goin' on with me?
Sie sagte mir nur, dass ich höchstwarscheinlich fliegen werde und auf offizielle Emails warten soll.&lt;/p&gt;
&lt;p&gt;Die kahm dann eine Stunde später noch vor der ersten Schulstunde und damit hatte ich noch genau 3 Schultage(Donnerstag, wo ich es erfahren habe eingeschlossen) zum Verabschieden, und den üblichen Kleinigkeiten.
Ach ne! Waren dann doch nur zwei, da Sonntag die Schulen in Iowa geschlossen wurden.
Durch meine Gastmutter wussten glücklicherweise schon alle Lehrer Bescheid und waren sehr verständnissvoll.
Meine Eltern haben mir ein großzügiges Budget für eine Abschiedsfeier gegeben, sodass ich noch wärend der Schule Donnerstags die Feier für Freitag plante.
Freitag Nacht hatten wir dann eine große Feier wo einfach so viele Menschen kamen, zumindest um einfach Tschüss zu sagen.
Mein Profi Tipp and alle Feiern: Macht ein Kahoot Spiel über euch selbst.
Kommt super an.&lt;/p&gt;
&lt;p&gt;Am Wochenende habe ich eigentlich nur meinen Koffer und ein Packet gepackt (Anderer Pro Tip: Keine Parfums auf Air Mail) und den Kram, den ich nicht mitnehmen wollte, konnte and Freunde zu verteilen.
Meine Gastfamilie wartet immer noch auf ein an mich gerichtetes packet mit Osterschokolade was meine Mutter eine Woche zuvor losgeschickt hat.&lt;/p&gt;
&lt;p&gt;Zu dem Zeitpunkt meiner Abreise hat in unserem 1400 Menschendorf die Pandemie noch nicht wirklich ernst genommen und wir waren eher ironisch dem ganzen gegenüber.
Auf jeden Fall sind wir mit 15 Leuten in 3 Autos zum Flughafen gefahren.
Und ich muss echt sagen: Der Abschied vor der Security an sich war nicht das schwierigste.
Das schwierigste waren die letzten Schritte diese geliebten Menschen hinter sich zu lassen und den one-way durch die Security zu nehmen.
Ohne spass: Das waren die härtesten Schritte meines Lebens. 
Einfach dieses Gefühl wortwörtlich diese Menschen zumindest für diesen Moment hinter einem zu lassen und voran zu gehen. Schrecklich.&lt;/p&gt;
&lt;p&gt;Schon auf meinem ersten Flug habe ich andere PPPler getroffen und es wurden immer mehr auf dem Weg nach Deutschland.
Zum Glück konnte ich mich auf meinen Flügen immer gut ablenken.
Das hat mir, glaube ich, sehr geholfen.
An Deutschland musste ich mich dann aber auch wieder erstmal gewöhnen.
Ich habe jetzt immer noch manchmal Momente, wo ich einfach auf Englisch anfange zu reden, konnte am Anfang kaum ganze deutsche Sätze ohne englische Wörter rausbringen und die Autobahn war mir bisschen zu schnell.&lt;/p&gt;
&lt;p&gt;Wie es nun weiter geht?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keine Ahnung&lt;/strong&gt;&lt;/p&gt;</content><category term="Exchange"/><category term="corona"/><category term="covid-19"/><category term="ppp"/></entry><entry><title>Nachbarschaftshilfe durch 3d-druck in einer Pandemie</title><link href="https://www.dj-bauer.de/nachbarschaftshilfe-durch-3d-druck-in-einer-pandemie.html" rel="alternate"/><published>2020-03-20T14:11:00+01:00</published><updated>2020-03-20T14:11:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-03-20:/nachbarschaftshilfe-durch-3d-druck-in-einer-pandemie.html</id><summary type="html">&lt;p&gt;Wegen der aktuellen Pandemie wurde ich aus Amerika frühe Nachhause geholt. Nun versuche ich unserer Gemeinde mit meinem 3d-Drucker zu helfen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Durch die COVID-19 Pandemie wurde ich schon am 16 März nach Hause geholt.
Das ist zwar sehr schade, aber daran kann ich jetzt leider auch nichts mehr ändern.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Türklingen haken" src="https://www.dj-bauer.de/images/20200320_hooks_1.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Der Makespace Bonn hat einen &lt;a href="https://makerspacebonn.de/2020/03/curve-flattener/"&gt;Haken&lt;/a&gt; designed, um potenziell kontaminierte Türklinken zu öffnen.
Nun drucke ich diese quasi im Dauerbetrieb und werde diese gegen eine kleine freiwillige Spende an Nachbarn, Freunde, etc. verteilen.
Wenn es gut ankommt, planen mein Vater und ich, ein Email postfach aufzumachen, wo man sie dann bestellen kann.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Türklingen haken" src="https://www.dj-bauer.de/images/20200320_hooks_2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Ich möchte jedoch nochmal ganz gross danke an den Makerspace Bonn sagen, die das Model entwickelt haben und frei unter MIT license der Allgemeinheit zur verfügung stellen.
Jeder kann irgendetwas kleines für seinen Umkreis tun, und wenn es nur "Handgadgets ausdrucken" ist.&lt;/p&gt;</content><category term="3d-print"/><category term="3d-print"/><category term="covid-19"/></entry><entry><title>Terminal Calendar with khal</title><link href="https://www.dj-bauer.de/terminal-calendar-with-khal-en.html" rel="alternate"/><published>2020-03-01T20:56:00+01:00</published><updated>2020-03-01T20:56:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-03-01:/terminal-calendar-with-khal-en.html</id><summary type="html">&lt;p&gt;After struggling with calcurse and caldav I finally got a solution for calendar scheduling in the terminal synchronized with nextcloud&lt;/p&gt;</summary><content type="html">&lt;p&gt;When I started looking for a terminal calendar application the primary result was calcurse.
Calcurse has also an integrated todo list, which I in my particular case don't need, because I got &lt;a href="https://www.dj-bauer.de/todotxt-mit-vim.html"&gt;todo.txt&lt;/a&gt; for that.
But uses it's own plaintext for storing it's appointments.
Which is problematic for me when I want to use my existing calendar from Nextcloud.
Calcurse has experimental caldav support, but the import and export scripts did not work properly for me and just messed my calendar up by creating broken calendar cards and doubling all my events each sync.&lt;/p&gt;
&lt;p&gt;Khal is my solution.
It is similar to khard, a terminal vcard contact book.
Both applications work perfectly with vdirsyncer together.
The only packages required are vdirsyncer and khal.
Ond Arch linux they can pe installed using pacman.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo pacman -S vdirsyncer khal
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Otherwise i'd recommend pip.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip install vdirsyncer khal
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="synchronize-with-nextcloud"&gt;Synchronize with nextcloud&lt;/h1&gt;
&lt;p&gt;First of all I add the vdirsyncer synchronisation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.config/vdirsyncer/config&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[pair calendar]&lt;/span&gt;
&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;calendar_local&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;calendar_remote&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;collections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;from a&amp;quot;, &amp;quot;from b&amp;quot;]&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;displayname&amp;quot;]&lt;/span&gt;

&lt;span class="k"&gt;[storage calendar_local]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;filesystem&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/.calendar&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;fileext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.ics&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;[storage calendar_remote]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;caldav&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Can be obtained from nextcloud&lt;/span&gt;
&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://yournextcloud.example.lcl/remote.php/dav/calendars/USERNAME/personal/&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;amp;lt&lt;/span&gt;&lt;span class="c1"&gt;;USERNAME&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Instead of inserting my plaintext password I fetch it using pass&lt;/span&gt;
&lt;span class="na"&gt;password.fetch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;command&amp;quot;, &amp;quot;pass&amp;quot;, &amp;quot;nextcloud&amp;quot;]&lt;/span&gt;
&lt;span class="c1"&gt;#SSL certificate fingerprint&lt;/span&gt;
&lt;span class="na"&gt;verify_fingerprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;FINGERPRINT&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Verify ssl certificate. Set to false if it is self signed and not installed on local machine&lt;/span&gt;
&lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The SSL certificate fingerprint can be obtained by the following line&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;echo -n | openssl s_client -connect your.calserver.lcl:443 | openssl x509 -noout -fingerprint
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now we can run &lt;em&gt;vdirsyncer discover&lt;/em&gt; to create the necessary directories to then synchronize with &lt;em&gt;vdirsyncer sync&lt;/em&gt;.
I recommend to setup a cronjob for &lt;em&gt;vdirsyncer sync&lt;/em&gt; to stay synchronized.&lt;/p&gt;
&lt;h1 id="configure-khal"&gt;Configure khal&lt;/h1&gt;
&lt;p&gt;The thing left to do is to tell khal where our calendar is and some other things to display.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.config/khal/config&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[calendars]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;#Can contain as many calendars as we want&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;[[personal]]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.calendar/CALENDARNAME&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;calendar&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;dark green&lt;/span&gt;

&lt;span class="k"&gt;[default]&lt;/span&gt;
&lt;span class="c1"&gt;#Set calendar used for new events when no one is given&lt;/span&gt;
&lt;span class="na"&gt;default_calendar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;personal&lt;/span&gt;
&lt;span class="c1"&gt;#Color dates when containing an event&lt;/span&gt;
&lt;span class="na"&gt;highlight_event_days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;#Timespan of days whose events are shown in e.g. list&lt;/span&gt;
&lt;span class="na"&gt;timedelta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;7d&lt;/span&gt;

&lt;span class="c1"&gt;#Set printing of dates&lt;/span&gt;
&lt;span class="k"&gt;[locale]&lt;/span&gt;
&lt;span class="na"&gt;timeformat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;%H:%M&lt;/span&gt;
&lt;span class="na"&gt;dateformat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;%m/%d/%Y&lt;/span&gt;
&lt;span class="na"&gt;longdateformat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;%m/%d/%Y&lt;/span&gt;
&lt;span class="na"&gt;datetimeformat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;%m/%d/%Y %H:%M&lt;/span&gt;
&lt;span class="na"&gt;longdatetimeformat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;%m/%d/%Y %H:%M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;em&gt;ikhal&lt;/em&gt; (interactive khal) gives us then this nice prompt.
It is shipped with khal and &lt;em&gt;khal interactive&lt;/em&gt; has the same effect
&lt;img alt="Khal screenshot" src="https://www.dj-bauer.de/images/20200301_khal.png" /&gt;&lt;/p&gt;
&lt;h1 id="keybindings-for-khal"&gt;Keybindings for khal&lt;/h1&gt;
&lt;p&gt;&lt;table&gt;
    &lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Function&lt;/th&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;delete selected event&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;export selected event as ics file&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;duplicate selected event&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;edit selected event in $EDITOR&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;visual selection(vim like)&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;create new event&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;q&lt;/td&gt;&lt;td&gt;quit&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;select today&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;enter&lt;/td&gt;&lt;td&gt;show and edit details of event&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;meta enter&lt;/td&gt;&lt;td&gt;save edited event&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;j, down&lt;/td&gt;&lt;td&gt;move cursor down&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;k, up&lt;/td&gt;&lt;td&gt;move cursor up&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;h, left&lt;/td&gt;&lt;td&gt;move cursor left&lt;/td&gt;
    &lt;tr&gt;&lt;td&gt;l, right&lt;/td&gt;&lt;td&gt;move cursor right&lt;/td&gt;
&lt;/table&gt;&lt;/p&gt;</content><category term="Workflow"/><category term="nextcloud"/><category term="khal"/><category term="calendar"/></entry><entry><title>Once forever mutt configuration</title><link href="https://www.dj-bauer.de/once-forever-mutt-configuration-en.html" rel="alternate"/><published>2020-02-26T23:09:00+01:00</published><updated>2020-02-26T23:09:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2020-02-26:/once-forever-mutt-configuration-en.html</id><summary type="html">&lt;p&gt;I decided to move from mutt to neomutt. With that in mind after a bit of experimenting I wanted to create the ultimate email workflow&lt;/p&gt;</summary><content type="html">&lt;h1 id="what-are-we-gonna-do"&gt;What are we gonna do?&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#part-1-contact-synchronisation"&gt;Contact synchronisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#part-2-receive-mails-with-offlineimap"&gt;Receive mails with offlineimap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#part-3-sending-mails-with-msmtp"&gt;Sending mails with msmtp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#part-4-tag-emails-with-notmuch"&gt;Tag emails with notmuch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#part-5-mailsyncing"&gt;Mailsync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#part-6-smash-everything-into-mutt"&gt;Smash everything into mutt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="packages"&gt;Packages&lt;/h1&gt;
&lt;p&gt;I am using the following packages&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;neomutt (MUA)&lt;/li&gt;
&lt;li&gt;notmuch (tag mails)&lt;/li&gt;
&lt;li&gt;msmtp (send mails)&lt;/li&gt;
&lt;li&gt;offlineimap (sync mails)&lt;/li&gt;
&lt;li&gt;khard (contacts book)&lt;/li&gt;
&lt;li&gt;vdirsyncer (sync contacts)&lt;/li&gt;
&lt;li&gt;cron (automate scripts)&lt;/li&gt;
&lt;li&gt;pass (password storage)&lt;/li&gt;
&lt;li&gt;dunst (notification deamon)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="part-1-contact-synchronisation"&gt;Part 1: Contact synchronisation&lt;/h2&gt;
&lt;p&gt;I assume we have a installed and configured pass and have our nextcloud password.
First we need a configuration file for vdirsyncer to synchronize the contacts with nextcloud&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.config/vdirsyncer/config&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[general]&lt;/span&gt;
&lt;span class="c1"&gt;#A cache path where the current status of vdirsyncer will be stored&lt;/span&gt;
&lt;span class="na"&gt;status_path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/.config/vdirsyncer/status/&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;#Create a new sync connection between two storages we will define&lt;/span&gt;
&lt;span class="k"&gt;[pair nextcloud_contacts]&lt;/span&gt;
&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nextcloud_contacts_local&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nextcloud_contacts_remote&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;collections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;from a&amp;quot;, &amp;quot;from b&amp;quot;]&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;displayname&amp;quot;]&lt;/span&gt;

&lt;span class="c1"&gt;# A local storage to store the contacts&lt;/span&gt;
&lt;span class="k"&gt;[storage nextcloud_contacts_local]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;filesystem&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# Path to where to store the vcards&lt;/span&gt;
&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;~/.contacts/&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;fileext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.vcf&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# A remote storage to nextcloud&lt;/span&gt;
&lt;span class="k"&gt;[storage nextcloud_contacts_remote]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;carddav&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# Can be obtained from nextcloud&lt;/span&gt;
&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://your.nextcloud.lcl/remote.php/dav/addressbooks/users/USERNAME/&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;USERNAME&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# Shell command which calls the external command pass and reads the password nextcloud&lt;/span&gt;
&lt;span class="na"&gt;password.fetch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&amp;quot;command&amp;quot;, &amp;quot;pass&amp;quot;, &amp;quot;nextcloud&amp;quot;]&lt;/span&gt;
&lt;span class="c1"&gt;# SSL certificate fingerprint&lt;/span&gt;
&lt;span class="na"&gt;verify_fingerprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;FINGERPRINT&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Verify ssl certificate. Set to false if it is self signed and not installed on local machine&lt;/span&gt;
&lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The SSL certificate fingerprint can be obtained by the following line&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;s_client&lt;span class="w"&gt; &lt;/span&gt;-connect&lt;span class="w"&gt; &lt;/span&gt;your.nextcloud.lcl:443&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;x509&lt;span class="w"&gt; &lt;/span&gt;-noout&lt;span class="w"&gt; &lt;/span&gt;-fingerprint
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then we can initialize our synchronisation with &lt;em&gt;vdirsyncer discover&lt;/em&gt;.
We will sync then with &lt;em&gt;vdirsyncer sync&lt;/em&gt;
To Automate the process I will run a cron job on it
&lt;em&gt;crontab&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;*/5&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/vdirsyncer&lt;span class="w"&gt; &lt;/span&gt;sync
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The contact book is relatively easy to configure&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.config/khard/khard.conf&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[addressbooks]&lt;/span&gt;
&lt;span class="c1"&gt;# Create new contact book&lt;/span&gt;
&lt;span class="k"&gt;[[Nextcloud]]&lt;/span&gt;
&lt;span class="c1"&gt;# Path to directory of vdirsynced contacts&lt;/span&gt;
&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.contacts/contacts/&lt;/span&gt;

&lt;span class="k"&gt;[general]&lt;/span&gt;
&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;span class="na"&gt;default_action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;list&lt;/span&gt;
&lt;span class="c1"&gt;# Set editor to edit contacts&lt;/span&gt;
&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nim&lt;/span&gt;
&lt;span class="na"&gt;merge_editor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;vimdiff&lt;/span&gt;

&lt;span class="c1"&gt;# Set a few tweaks to how to display contacts&lt;/span&gt;
&lt;span class="k"&gt;[contact table]&lt;/span&gt;
&lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;first_name&lt;/span&gt;
&lt;span class="na"&gt;show_nicknames&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;last_name&lt;/span&gt;

&lt;span class="k"&gt;[vcard]&lt;/span&gt;
&lt;span class="c1"&gt;# Perform search in the vard files to improve performance&lt;/span&gt;
&lt;span class="na"&gt;search_in_source_files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With that configuration we can run &lt;em&gt;khard show&lt;/em&gt; and if everything went fine, we can see a list of all our contacts.&lt;/p&gt;
&lt;h2 id="part-2-receive-mails-with-offlineimap"&gt;Part 2: Receive mails with offlineimap&lt;/h2&gt;
&lt;p&gt;As a second part I want to fetch all my emails&lt;/p&gt;
&lt;p&gt;Because we never want to store passwords in plaintext, we want to use pass again. In offlineimap we have to create a python script first, which then can provide us a method to read the password&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.offlineimap.py&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/env python2&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;check_out&lt;/span&gt;

&lt;span class="c1"&gt;# Python method to obtain password&lt;/span&gt;
&lt;span class="c1"&gt;# Runs the shell command &amp;quot;pass show mail&amp;quot; and return the result of it&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_pass&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;check_out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pass show mail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;Some people might have issues with import &lt;em&gt;check_out&lt;/em&gt;. These should install the python package &lt;em&gt;subprocess32&lt;/em&gt; and should replace the &lt;em&gt;check_out&lt;/em&gt; call with &lt;em&gt;check_output&lt;/em&gt; in the python script above.&lt;/p&gt;
&lt;p&gt;And here is my configuration for offlineimap&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.offlineimaprc&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[general]&lt;/span&gt;
&lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;private&lt;/span&gt;
&lt;span class="c1"&gt;# Path to python script, which contains the method to obtain the password&lt;/span&gt;
&lt;span class="na"&gt;pythonfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.offlineimap.py&lt;/span&gt;

&lt;span class="c1"&gt;# Create a mail syncronisation&lt;/span&gt;
&lt;span class="k"&gt;[Account private]&lt;/span&gt;
&lt;span class="na"&gt;localrepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;private-local&lt;/span&gt;
&lt;span class="na"&gt;remoterepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;private-remote&lt;/span&gt;

&lt;span class="c1"&gt;# Local storage&lt;/span&gt;
&lt;span class="k"&gt;[Repository private-local]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Maildir&lt;/span&gt;
&lt;span class="c1"&gt;# Path to where the mails will be stored&lt;/span&gt;
&lt;span class="na"&gt;localfolders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.cache/mail/private&lt;/span&gt;

&lt;span class="c1"&gt;# Remote storage&lt;/span&gt;
&lt;span class="k"&gt;[Repository private-remote]&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;IMAP&lt;/span&gt;
&lt;span class="c1"&gt;# Path to Imap server&lt;/span&gt;
&lt;span class="na"&gt;remotehost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;amp;lt&lt;/span&gt;&lt;span class="c1"&gt;;HOST&amp;amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;remoteuser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;amp;lt&lt;/span&gt;&lt;span class="c1"&gt;;USER&amp;amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Password method defined in our external python script&lt;/span&gt;
&lt;span class="na"&gt;remotepasseval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;get_pass()&lt;/span&gt;
&lt;span class="na"&gt;remoteport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;993&lt;/span&gt;
&lt;span class="c1"&gt;# Use ssl to synchronize emails&lt;/span&gt;
&lt;span class="na"&gt;ssl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="c1"&gt;# See fingerprint for vdirsyncer&lt;/span&gt;
&lt;span class="na"&gt;cert_fingerprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;amp;lt&lt;/span&gt;&lt;span class="c1"&gt;;FINGERPRINT&amp;amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Sync all mails into their corresponding mail folders&lt;/span&gt;
&lt;span class="c1"&gt;# Not needed for local, but it might be necessary for mobile clients to have the sent emails in the corresponding folder&lt;/span&gt;
&lt;span class="k"&gt;[mbnames]&lt;/span&gt;
&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.cache/mail/mailboxes&lt;/span&gt;
&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mailboxes&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# Set naming for the folders&lt;/span&gt;
&lt;span class="na"&gt;peritem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;+$(accountname)s%(foldername)s&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;sep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;footer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We should not forget to create the directory &lt;em&gt;~/.cache/mail&lt;/em&gt;. 
With that things done we are ready to run  &lt;em&gt;offlineimap&lt;/em&gt; and probably wait quite a while until all our mails are downloaded.&lt;/p&gt;
&lt;h2 id="part-3-sending-mails-with-msmtp"&gt;Part 3: Sending mails with msmtp&lt;/h2&gt;
&lt;p&gt;As next we will configure &lt;em&gt;msmtp&lt;/em&gt; to correctly send emails.
Once we got that setup, we also can use msmtp in scripts to automate status updates or similar.
I this case we have directly a parameter, which we can set to specify a shell command to optain our mail password.
The configuration is not that hard either.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.msmtprc&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;private
port&lt;span class="w"&gt; &lt;/span&gt;PORT
host&lt;span class="w"&gt; &lt;/span&gt;mailserver@example.com
from&lt;span class="w"&gt; &lt;/span&gt;user@example.com
user&lt;span class="w"&gt; &lt;/span&gt;USERNAME
passwordeval&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pass show mail&amp;quot;&lt;/span&gt;
auth&lt;span class="w"&gt; &lt;/span&gt;on
tls&lt;span class="w"&gt; &lt;/span&gt;on
tls_starttls&lt;span class="w"&gt; &lt;/span&gt;on
tls_certcheck&lt;span class="w"&gt; &lt;/span&gt;on
tls_fingerprint&lt;span class="w"&gt; &lt;/span&gt;FINGERPRINT
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The usage from msmtp is rather simple. It takes &lt;em&gt;stdin&lt;/em&gt; as a message and sends it with a given account.
A hello world example would be&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Subject: Hello world\nThis a test mail from msmtp&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;msmtp&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;private&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;lt&lt;span class="p"&gt;;&lt;/span&gt;EMAIL&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now we can already receive emails and send emails.
But I want to be able to use my mailclient completely offline.
Therefore we need to be able to write emails offline and send them as soon as we have an connection to our mailserver again.
The shell script &lt;a href="https://github.com/tpn/msmtp/blob/master/scripts/msmtpq/msmtpq"&gt;msmtpq&lt;/a&gt;.
We can paste it basically anywhere where it is in our PATH to be executable from everywhere.
I will paste it into &lt;em&gt;~/.local/bin/&lt;/em&gt;.
The only thing left to do is to substitute every msmtp call with msmtp.sh.
If an internet connection exists, it will be automatically uploaded.
If not, then the mail will be queued.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To manage the queue, we use &lt;em&gt;msmtpq.sh --g-mgmt&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Therefore to flush the queue, we run &lt;em&gt;msmtpq.sh --q-mgmt -r&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;With &lt;em&gt;-d&lt;/em&gt; We can see the content of our queue.
We will use this functionality later and automate the process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next thing we want to do is to tag our emails with notmuch.&lt;/p&gt;
&lt;h2 id="part-4-tag-emails-with-notmuch"&gt;Part 4: Tag emails with notmuch&lt;/h2&gt;
&lt;p&gt;To begin with notmuch we want to setup some basic configuration for notmuch to find its mail directory and other initial information.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.notmuch-config&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[database]&lt;/span&gt;
&lt;span class="c1"&gt;# Path to our mails&lt;/span&gt;
&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;~/.cache/mail&lt;/span&gt;

&lt;span class="k"&gt;[user]&lt;/span&gt;
&lt;span class="c1"&gt;# My Name&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Jon Doe&lt;/span&gt;
&lt;span class="c1"&gt;# My mail address&lt;/span&gt;
&lt;span class="na"&gt;primary_email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;example@example.com&lt;/span&gt;

&lt;span class="k"&gt;[new]&lt;/span&gt;
&lt;span class="c1"&gt;# Which tags to give a new email&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;new&lt;/span&gt;
&lt;span class="na"&gt;ignore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;

&lt;span class="k"&gt;[search]&lt;/span&gt;
&lt;span class="c1"&gt;# Mails with this tags will be excluded from search&lt;/span&gt;
&lt;span class="na"&gt;exclude_tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;deleted&lt;/span&gt;&lt;span class="c1"&gt;;spam;&lt;/span&gt;

&lt;span class="k"&gt;[maildir]&lt;/span&gt;
&lt;span class="c1"&gt;# Synchronize mail tags with offlineimap&lt;/span&gt;
&lt;span class="na"&gt;synchronize_flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With that being said we can run &lt;em&gt;notmuch new&lt;/em&gt; to see all our emails loaded into the notmuch database with is in our case located in &lt;em&gt;~/.cache/mail/.notmuch/&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Not we can use notmuch in the command line to manually tag emails.
But in the next step we will create a script depending on our needs to do that automatically for us.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/notmuch-hook.sh&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# Index all new emails&lt;/span&gt;
notmuch&lt;span class="w"&gt; &lt;/span&gt;new
&lt;span class="c1"&gt;# Move tag new mails with unread and inbox&lt;/span&gt;
notmuch&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;+inbox&lt;span class="w"&gt; &lt;/span&gt;+unread&lt;span class="w"&gt; &lt;/span&gt;-new&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;tag::new
&lt;span class="c1"&gt;# Mark sent mails as not inbox, but sent&lt;/span&gt;
notmuch&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;-new&lt;span class="w"&gt; &lt;/span&gt;-inbox&lt;span class="w"&gt; &lt;/span&gt;+sent&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;from:&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;lt&lt;span class="p"&gt;;&lt;/span&gt;MYEMAIL&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;# Move mails in trash out of the inbox&lt;/span&gt;
notmuch&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;-inbox&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;tag:trash
&lt;span class="c1"&gt;# Move mails from amazon.com out of my inbox and tag with shop&lt;/span&gt;
&lt;span class="c1"&gt;# We will have a seperate virtual mailbox in neomutt later for that&lt;/span&gt;
notmuch&lt;span class="w"&gt; &lt;/span&gt;tag&lt;span class="w"&gt; &lt;/span&gt;-inbox&lt;span class="w"&gt; &lt;/span&gt;+shop&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;from:*@amazon.com
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;To automatically retag all messages after offlineimap we can run a hook in offlineimap to run our notmuch script automatically after syncing&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.offlineimaprc&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Account private]&lt;/span&gt;
&lt;span class="na"&gt;localrepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;private-local&lt;/span&gt;
&lt;span class="na"&gt;remoteport&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;remote-local&lt;/span&gt;
&lt;span class="c1"&gt;# Path to script which will be executed after mailsync&lt;/span&gt;
&lt;span class="na"&gt;postsynchook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.notmuch-hook.sh&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="part-5-mailsyncing"&gt;Part 5: Mailsyncing&lt;/h2&gt;
&lt;p&gt;To automate notmuch tagging, mailsync and my oflfinemsmtp queue, we will create a syncing script.
When we want to send a notification to our desktop from a cron run script, we need to specify the Xmenu dbus.
For that we add to our .profile the following&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In ~/.profile&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;touch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cache.Xdbus
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cache/Xdbus
env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;DBUS_SESSION_BUS_ADDRESS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cache/Xdbus
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;export DBUS_SESSION_BUS_ADDRESS&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cache/Xdbus
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here is the final mailsync script&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.local/bin/mailsync.sh&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="c1"&gt;#Get the Xdbus and load it up to be able to show notifications&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cache/Xdbus&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cache/Xdbus&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;fi&lt;/span&gt;

&lt;span class="s2"&gt;# Get number of emails queued to sent&lt;/span&gt;
&lt;span class="s2"&gt;num_queue=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;msmtpq.sh&lt;span class="w"&gt; &lt;/span&gt;--q-mgmt&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;num&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wc&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="s2"&gt;# Flush queue&lt;/span&gt;
&lt;span class="s2"&gt;msmtpq.sh --q-mgmt -r&lt;/span&gt;

&lt;span class="s2"&gt;#Sync imap emails&lt;/span&gt;
&lt;span class="s2"&gt;offlineimap&lt;/span&gt;

&lt;span class="s2"&gt;#Get number of new mails&lt;/span&gt;
&lt;span class="s2"&gt;num_unread=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;notmuch&lt;span class="w"&gt; &lt;/span&gt;count&lt;span class="w"&gt; &lt;/span&gt;tag:unread&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="s2"&gt;#When run with parameter q, then don&amp;#39;t show notifications&lt;/span&gt;
&lt;span class="s2"&gt;if [ &amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; != &amp;quot;&lt;/span&gt;q&lt;span class="s2"&gt;&amp;quot; ]; then&lt;/span&gt;
&lt;span class="s2"&gt;    notify-send &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;📧Mailsync&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;Synced&lt;span class="w"&gt; &lt;/span&gt;mail&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;📬&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$num_unread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;mails&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;📯&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$num_queue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Mails&lt;span class="w"&gt; &lt;/span&gt;uploaded&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;The only thing left to do is to add a cron job to automatically synchronize emails&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;*/10&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;mailsync.sh
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="part-6-smash-everything-into-mutt"&gt;Part 6: Smash everything into mutt&lt;/h2&gt;
&lt;p&gt;In mutt is a lot to configure. Here is the basic configuration to get the functionality we wanted.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;~/.muttrc&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#Setup minimal mutt mailboxes&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/.cache/mail/&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mbox_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;spoolfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+/&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;postponed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Drafts&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;trash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Trash&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Sent&lt;/span&gt;

&lt;span class="c1"&gt;#Setup notmuch mailboxes&lt;/span&gt;
&lt;span class="c1"&gt;#URL to your mail folder&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nm_default_uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;notmuch:///home/dbauer/.cache/mail&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;virtual_spoolfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;virtual&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mailboxes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; 📥Inbox&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;notmuch://?query=tag:inbox&amp;quot;&lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; 📬Unread&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;notmuch://?query=tag:unread&amp;quot;&lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; 📧Sent&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;notmuch://?query=tag:sent&amp;quot;&lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; 🛒Shopping&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;notmuch://?query=tag:shop&amp;quot;&lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; 🗄 Trash&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;notmuch://?query=tag:trah&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;#Basic naming setup&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;myemail@myserver.com&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;realname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;My name&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use_from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reply_to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;#Send emails via msmtpq.sh&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sendmail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;msmtpq.sh -a private&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sendmail_wait&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;#Sidebar configuration&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sidebar_format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%B %?N?[%N]? %* (%S)&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sidebar_visible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;#Look up contacts via khard&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;query_command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;khard email --parsable --search-in-source-files &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;#Hacky way to select the inbox in sidebar with key i&lt;/span&gt;
&lt;span class="c1"&gt;#The number of &amp;amp;lt;sidebar-prev&amp;amp;gt; depends on how many mailboxes we have.&lt;/span&gt;
&lt;span class="c1"&gt;#We basically just press them to reach the top in the worst case from the very bottom.&lt;/span&gt;
&lt;span class="n"&gt;unbind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;sidebar-prev&amp;amp;gt;&amp;amp;lt;sidebar-prev&amp;amp;gt;&amp;amp;lt;sidebar-prev&amp;amp;gt;&amp;amp;lt;sidebar-prev&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Mark email as deleted with key d&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;modify-labels&amp;amp;gt;+trash&amp;amp;lt;enter&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Search emails via notmuch with /&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;vfolder-from-query&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Add email address to contact book with A&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;pipe-message&amp;amp;gt;khard add-email&amp;amp;lt;return&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#Save selected attachment with S&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;kill&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;HOME&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Downloads&lt;/span&gt;&lt;span class="o"&gt;/&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;enter&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;enter&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;#General command to edit notmuch labels of selected email&lt;/span&gt;
&lt;span class="n"&gt;macro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;modify&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;
&lt;span class="c1"&gt;#Navigate through sidebar&lt;/span&gt;
&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;
&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;
&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sidebar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="Ricing"/><category term="mutt"/><category term="mail"/><category term="linux"/><category term="workflow"/><category term="khard"/><category term="contact"/><category term="nextcloud"/></entry><entry><title>Nutcracker Performance</title><link href="https://www.dj-bauer.de/nutcracker-performance-en.html" rel="alternate"/><published>2019-12-13T09:06:00+01:00</published><updated>2019-12-13T09:06:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-12-13:/nutcracker-performance-en.html</id><summary type="html">&lt;p&gt;Last weekend we had our Nutcracker performance in Des Moines. After my exciting week in Washington D.C. I finally find time to write about it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In August this year I attended an &lt;a href="https://www.dj-bauer.de/nutcracker-audition-en.html"&gt;audition&lt;/a&gt; for a nutcracker production in Des Moines.
The rehersals began in November and it was a cool experience to actuall practice with the boys in your same age and level.
I did not have that in Germany.
The whole production runs of multiple Ballett studios in the whole town, so I had to go to different studios for my two dances on Saturday and Sunday.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dancer badge and nutcracker poster" src="https://www.dj-bauer.de/images/20191215_ballet_performance.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The first run through was allready on wednesday in the civics center.
Thursday follwed with final rehersal and final started the shows with the school shows.
On saturday we had two and on sunday one performance.
I definetly can say, that I could feel the previous days in my legs on sunday.
The whole production was with the concept, that we were treated like professional dancers.
That idea was really interresting, beginning from the makeup, to how the treat us behind the stage.
Appropo stage: it was huge.
The Des Moines Civic Center is a really big building and it was pretty cool to stand behind the stage there.&lt;/p&gt;
&lt;p&gt;Overall I can say, that it was a really good oportunity for me to dance somewhere else and with a different style.
Also did I really enjoy meeting the new people to dance with them in this terrific setting.
I would reccomend everyone to simply go to such auditions and take part in a ballet production despite if you are from that studio or not.&lt;/p&gt;</content><category term="Exchange"/><category term="ballet"/><category term="sport"/><category term="nutcracker"/></entry><entry><title>Civic Education week in Washington D.C.</title><link href="https://www.dj-bauer.de/civic-education-week-in-washington-dc-en.html" rel="alternate"/><published>2019-12-13T08:43:00+01:00</published><updated>2019-12-13T08:43:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-12-13:/civic-education-week-in-washington-dc-en.html</id><summary type="html">&lt;p&gt;I am now in the plane back to Iowa from The Capitol of the US. We had a lot of activities the past week with our Exchange program.&lt;/p&gt;</summary><content type="html">&lt;p&gt;One if not the part of my exchange year we all were looking for was the Civic Education Week in Washington D.C.
It was part of my &lt;a href="https://www.dj-bauer.de/meine-ppp-bewerbung.html"&gt;scholarship&lt;/a&gt; and included a lot of different activities. I will try to write blog posts about as many as I can.
Here is first of all a brief list of activities we did.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capitol Hill Day&lt;/li&gt;
&lt;li&gt;Newseum &amp;amp; other museums&lt;/li&gt;
&lt;li&gt;Memorial Tour&lt;/li&gt;
&lt;li&gt;Department of state visit&lt;/li&gt;
&lt;li&gt;Ford's Theater&lt;/li&gt;
&lt;li&gt;and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Civic education week certificate" src="https://www.dj-bauer.de/images/20191215_civic_education_week.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I arrived late in the night on sunday, because I had my &lt;a href="https://www.dj-bauer.de/nutcracker-performance-en.html"&gt;nutcracker performance&lt;/a&gt; in the morning.
At the first day we got our schedule for the whole week.
Everything was exactly planned and with almost no breaks.
Many of us were intimitated at first, because it did not seem like we would have any freetime, but I would say afterwords that I would not wanted to just talk with friends.
The variety of activities gave us the feeling to get the most from the few days we had.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The US Capitol" src="https://www.dj-bauer.de/images/20191215_capitol.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I was happy to meet some people from my preperation week again, but also meet new cool people.
I am not really sure, if this is the best concept by mixing groups of around five of each preperation seminar or organisation together.
That leads to many small groups and it was harder to get known to new people, because many stay in their group.
In the end of the week this situation broke up, but I would have wished this happened earlier.
But it definetly felt good to talk about ones experience so far with people from the same persepective.&lt;/p&gt;
&lt;p&gt;Also we visited the national christmas tree(s). I decided to photograph every single one and here is the result of it.
&lt;img alt="Collage of every single of the national christmas tree" src="https://www.dj-bauer.de/images/20191215_christmas_tree.jpg" /&gt;&lt;/p&gt;</content><category term="Exchange"/><category term="congress"/><category term="cbyx"/><category term="ppp"/></entry><entry><title>zsh as my new shell</title><link href="https://www.dj-bauer.de/zsh-as-my-new-shell-en.html" rel="alternate"/><published>2019-11-24T14:09:00+01:00</published><updated>2019-11-24T14:09:00+01:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-11-24:/zsh-as-my-new-shell-en.html</id><summary type="html">&lt;p&gt;Around a month ago I switched to zsh as my shell. Now I want to write about my experiences with it&lt;/p&gt;</summary><content type="html">&lt;p&gt;When I installed arch Linux on my computer(at around April this year) I was looking for a simple shell with a few specific features like spelling correction of the recursive path listing.
As my options I found fish and zsh.
Since a friend showed my zsh with the oh-my-zsh framework, which was way to complex for my needs, and I did not know about the 'normal' way of zsh I used fish for around over half a year.
But since fishs lacking POSIX compatibility I was quite often annoyed when trying to run a command found.
Around a month ago I then switched to vanilla zsh.&lt;/p&gt;
&lt;h1 id="configuration"&gt;Configuration&lt;/h1&gt;
&lt;h2 id="profile"&gt;.profile&lt;/h2&gt;
&lt;p&gt;One of my first issues was quite easy to solve.
My &lt;em&gt;.profile&lt;/em&gt; file was not read anymore since I installed it via pacman and set it as my default shell.
I solved this issue by linking my &lt;em&gt;.profile&lt;/em&gt; file to &lt;em&gt;.zprofile&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ln&lt;span class="w"&gt; &lt;/span&gt;.profile&lt;span class="w"&gt; &lt;/span&gt;.zprofile
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="alternative-config-directory"&gt;Alternative config directory&lt;/h2&gt;
&lt;p&gt;The normal zsh configuration would be in &lt;em&gt;.zshrc&lt;/em&gt;.
Because I am a friend of putting all my configuration in &lt;em&gt;~/.config/&lt;/em&gt; I looked for a way to move it.
It turned out, that it is possible to set a environment variable for the zsh config directory in my &lt;em&gt;.profile&lt;/em&gt;.
The configuration file stays still &lt;em&gt;.zshrc&lt;/em&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ZDOTDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/zsh&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="general-configuration"&gt;General configuration&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;autoload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;
&lt;span class="n"&gt;HISTSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;span class="n"&gt;SAVEHIST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;span class="n"&gt;HISTFILE&lt;/span&gt;&lt;span class="o"&gt;=~/.&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zsh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="custom-prompt"&gt;Custom Prompt&lt;/h2&gt;
&lt;p&gt;My prompt looks around like this. (Of course with a different color sheet)&lt;/p&gt;
&lt;p&gt;&lt;span style="color:red"&gt;[&lt;/span&gt;&lt;span style="color:yellow"&gt;dbauer&lt;/span&gt;&lt;span style="color:green"&gt;@&lt;/span&gt;&lt;span style="color:blue"&gt;host&lt;/span&gt; &lt;span style="color:purple"&gt;~/daten&lt;/span&gt;&lt;span style="color:red"&gt;]&lt;/span&gt;$&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}$%b &amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="code-and-file-completion"&gt;Code and file completion&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;autoload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;compinit&lt;/span&gt;
&lt;span class="n"&gt;zstyle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:completion:*&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;
&lt;span class="n"&gt;zmodload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zsh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;complist&lt;/span&gt;
&lt;span class="n"&gt;compinit&lt;/span&gt;
&lt;span class="n"&gt;_comp_options&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;globdots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#Include hidden files&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="syntax-highlighting"&gt;Syntax highlighting&lt;/h2&gt;
&lt;p&gt;For syntax highlighting I use the plugin &lt;em&gt;zsh-syntax-highlighting&lt;/em&gt; available under Arch Linux in pacman/community&lt;/p&gt;
&lt;h2 id="useful-aliases"&gt;Useful aliases&lt;/h2&gt;
&lt;p&gt;I found some quite useful aliases.
I set an alias to connect to my vpn.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;alias vpn-home=&amp;quot;sudo openvpn --config .openvpn/config.ovpn&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Also I set a quite useful alias for my git branch&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;alias showBranch=&amp;quot;git log --graph --decorate --oneline&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To have an quick and dirty clock in my terminal I have the following alias&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;clock&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;while true; do tput clear; date +&amp;#39;%H : %M : %S&amp;#39; | figlet ; sleep 1; done&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And last but definetly not least I set an alias to &lt;em&gt;cp&lt;/em&gt;. Prppably there are people out there who would critisize it, but when I copy large directories I want to keep track of the progress. That's why I use rsync instead from now on.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; alias cp=&amp;quot;rsync -ah --progress $1 $2&amp;quot;
&lt;/pre&gt;&lt;/div&gt;</content><category term="Linux"/><category term="shell"/><category term="zsh"/><category term="Linux"/></entry><entry><title>Route all traffic through openvpn</title><link href="https://www.dj-bauer.de/route-all-traffic-through-openvpn-en.html" rel="alternate"/><published>2019-10-18T10:52:00+02:00</published><updated>2019-10-18T10:52:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-10-18:/route-all-traffic-through-openvpn-en.html</id><summary type="html">&lt;p&gt;I wanted to make sure all my traffic runs through my vpn.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In general I use two VPNs.
Both are selfhosted OpenVPN networks.
One to connect into my home network from the outside and one to use insecure wifis at public places.
The first one goes into a WLAN with no way out, so I do not want to route all my traffic through this.
But, when I connect through my second one from an airport, I want to make sure, that every traffic from every application of my computer is routed through the tunnel.
In the beginning I struggled a lot when I tried to remove the &lt;em&gt;default ip route&lt;/em&gt; and add a custom one, because then my connection to my vpn server got lost.
But then I found a very comfortable way in the &lt;em&gt;openvpn config&lt;/em&gt; to handle the routing for me.
By simply adding the following line to my client configuration OpenVPN automatically handles my routing without any init or deinit scripts.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;redirect-gateway def1
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In my openvpn log I can now find the done routing&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nx"&gt;Fri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Oct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tun0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;up&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;span class="nx"&gt;Fri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Oct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tun0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;10.8.0.3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;broadcast&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;10.8.0.255&lt;/span&gt;
&lt;span class="nx"&gt;Fri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Oct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;192.168.2.1&lt;/span&gt;
&lt;span class="nx"&gt;Fri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Oct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;0.0.0.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;10.8.0.1&lt;/span&gt;
&lt;span class="nx"&gt;Fri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Oct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;128.0.0.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m m-Double"&gt;10.8.0.1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It can be easily checked by pinging an known address and running.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo tcpdump -n -i tun0
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It should appear in the output&lt;/p&gt;</content><category term="Security"/><category term="openvpn"/><category term="linux"/></entry><entry><title>Pelican Syntax highlighting</title><link href="https://www.dj-bauer.de/pelican-syntax-highlighting-en.html" rel="alternate"/><published>2019-10-15T21:42:00+02:00</published><updated>2019-10-15T21:42:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-10-15:/pelican-syntax-highlighting-en.html</id><summary type="html">&lt;p&gt;It took me quite a while to enable syntax highlighting on my blog. But in the end it was just a constellation of small issues.&lt;/p&gt;</summary><content type="html">&lt;p&gt;First make sure to install &lt;em&gt;pygments&lt;/em&gt;, so the markdown module &lt;em&gt;codehilight&lt;/em&gt; can use it.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip install pygments
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then I had the main issue. The actual code highlighting is in a &lt;a href="python-markdown-extensions-en.html"&gt;markdown extension&lt;/a&gt; which like the &lt;a href="https://stackoverflow.com/questions/29639410/how-to-use-pygments-in-pelican-with-markdown"&gt;author of codehilight said&lt;/a&gt;, has to be forked by yourself.
I simply used the &lt;a href="https://github.com/Python-Markdown/markdown/blob/master/markdown/extensions/codehilite.py"&gt;default one&lt;/a&gt; he recommended.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://docs.getpelican.com/en/3.6.3/content.html#syntax-highlighting"&gt;markdown syntax&lt;/a&gt; for a code block a newline followed by the code tab indented.
Who does not want line numbering, should append a &lt;em&gt;:::language&lt;/em&gt; (also indented) before the code.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Some caption for the stuff
&amp;amp;lt;newline&amp;amp;gt;
&amp;amp;lt;tab&amp;amp;gt;:::python
&amp;amp;lt;tab&amp;amp;gt;print(&amp;quot;Hello World&amp;quot;)
&lt;/pre&gt;&lt;/div&gt;</content><category term="Scripting"/><category term="pelican"/><category term="markdown"/><category term="python"/></entry><entry><title>Python Markdown Extensions</title><link href="https://www.dj-bauer.de/python-markdown-extensions-en.html" rel="alternate"/><published>2019-10-13T20:54:00+02:00</published><updated>2019-10-13T20:54:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-10-13:/python-markdown-extensions-en.html</id><summary type="html">&lt;p&gt;Since the markdown module in pelican is so modular, it is very easy to write comfortable extensions&lt;/p&gt;</summary><content type="html">&lt;p&gt;I write my blog posts in markdown and pelican does the magic with it.
So I don't really like to have html code in my markdown files.
Unfortunatly, like many people know, Markdown has no download or abbreviation tags.
That's why I wrote my own markdown extensions for pelican to handle that for me.&lt;/p&gt;
&lt;h2 id="general"&gt;General&lt;/h2&gt;
&lt;p&gt;I store all my extensions in a directory &lt;em&gt;markdown&lt;/em&gt;.
To import the extension classes I will append the directory to the python path.
In my configuration file I firstly import the extension class we will create for each extension.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;markdown&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown_extension&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Extension&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the pelican configuration file we will add a dictionary with a list with all the extensions in it.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;MARKDOWN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;extensions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Extension&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="abbreviation"&gt;Abbreviation&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;markdown/markdown_abbreviation.py&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown.extensions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Extension&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown.postprocessors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Postprocessor&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;makeExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;AbbreviationExtension&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;AbbreviationExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AbbreviationExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Extension&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AbbreviationExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extendMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;md_globals&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;postprocessors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AbbreviationPostprocessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;postprocessors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abbreviation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;postprocessors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;gt;raw_html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AbbreviationPostprocessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Postprocessor&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;abbreviation_pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\?\[([^\[]*)\]\[([^\[]*)\]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AbbreviationPostprocessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abbreviation_pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;abbr title=&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;/abbr&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="download"&gt;Download&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;markdown/markdown_download.py&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown.extensions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Extension&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown.preprocessors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Preprocessor&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;markdown.postprocessors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Postprocessor&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;makeExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;DownloadExtension&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;DownloadExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DownloadExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Extension&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DownloadExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extendMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;md_globals&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;postprocessors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DownloadPostprocessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;postprocessors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;download&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;postprocessors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;gt;raw_html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DownloadPostprocessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Postprocessor&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;download_pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\%\[([^\[]*)\]\[([^\[]*)\]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DownloadPostprocessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;download_pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;a href=&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{static}&lt;/span&gt;&lt;span class="s2"&gt;/files/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt; download&amp;amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;/a&amp;amp;gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content><category term="Scripting"/><category term="pelican"/><category term="python"/><category term="markdown"/></entry><entry><title>Create Wordclouds</title><link href="https://www.dj-bauer.de/create-wordclouds-en.html" rel="alternate"/><published>2019-10-13T15:59:00+02:00</published><updated>2019-10-13T15:59:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-10-13:/create-wordclouds-en.html</id><summary type="html">&lt;p&gt;I wrote a little script to create simple worclouds on the fly&lt;/p&gt;</summary><content type="html">&lt;p&gt;After I saw a wordcloud on the blog of my father, I decided to create one for my blog too.
After a call with him I found out, that he created it once and never regenerated it, because of performance reasons due of his blog software.
I want it to be dynamic created by a self written &lt;abbr title="My Blog framework"&gt;pelican&lt;/abbr&gt; plugin.
Unfortunately I am not finished installing all the required modules on the webserver, so I don not have a wordcloud with all my tags yet.&lt;/p&gt;
&lt;h1 id="my-python-script"&gt;My python script&lt;/h1&gt;
&lt;p&gt;I found a python script on the &lt;a href="https://www.hagen-bauer.de/2015/07/tagcloud-bild-aus-jekyll.html"&gt;blog of my father&lt;/a&gt; and modified it for general use.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;wordcloud&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WordCloud&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;STOPWORDS&lt;/span&gt;

&lt;span class="c1"&gt;#function to map color to my blog scheme&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;color_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;400.0&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;153&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;87&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;87&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;153&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;#Main function&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;stopwords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;STOPWORDS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;wordcloud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WordCloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;white&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mac_words&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stopwords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;stopwords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wordcloud&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wordcloud&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;#To be usable as shell program&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
    &lt;span class="n"&gt;in_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;out_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="usage"&gt;Usage&lt;/h1&gt;
&lt;p&gt;Now I have two methods to use it&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As a cli with&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wordcloudcli.py text.txt out.png&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As a python module&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;wordcloudcli&lt;/span&gt;
&lt;span class="n"&gt;wordcloudcli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;out.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="so-lets-have-some-fun-with-it"&gt;So let's have some fun with it&lt;/h1&gt;
&lt;h2 id="the-whole-bible"&gt;The whole Bible&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Wordcloud of the bible" src="https://www.dj-bauer.de/images/20191013_wordcloud-bible.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="dracula"&gt;Dracula&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Wordcloud of Dracula" src="https://www.dj-bauer.de/images/20191013_wordcloud-dracula.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="huckleberry-finn"&gt;Huckleberry Finn&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Wordcloud of Huckleberry Finn" src="https://www.dj-bauer.de/images/20191013_wordcloud-huckleberry.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="romeo-and-juliet"&gt;Romeo and Juliet&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Wordcloud of Romeo and Juliet" src="https://www.dj-bauer.de/images/20191013_wordcloud-romeo-juliet.jpg" /&gt;&lt;/p&gt;</content><category term="Scripting"/><category term="python"/><category term="statistics"/></entry><entry><title>Axe Throwing</title><link href="https://www.dj-bauer.de/axe-throwing-en.html" rel="alternate"/><published>2019-10-10T23:09:00+02:00</published><updated>2019-10-10T23:09:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-10-10:/axe-throwing-en.html</id><summary type="html">&lt;p&gt;Last weekend we went out with our family to a different activity. We went axe throwing&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Axe in target" src="https://www.dj-bauer.de/images/20191005_axe-throwing.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;My hostmother got some tickets for this location for free and because she told us it would be fun, we gave it a try.
And spoiler, it was really fun.
We had to drive a but longer to it, but the time was it worth.
We went there with a group of eight people.
Each group gets one "Basket" with two lanes.
Each lane had a target plate.&lt;/p&gt;
&lt;p&gt;The instructors were casual and friendly, but showed us how to throw safely.
My only security concerns were because one member, who didn't really repsected an axe, but after I told him that, he did better.
The whole event was really entertaining and showed me, how a for a foreign strange sounding activity can be really fun. Maybe we can do that in Germany too.&lt;/p&gt;
&lt;p&gt;So I can really recommend this &lt;a href="https://www.facebook.com/deroosaxethrowing/"&gt;location&lt;/a&gt;&lt;/p&gt;</content><category term="Exchange"/><category term="sport"/><category term="family"/><category term="activities"/></entry><entry><title>Homecoming</title><link href="https://www.dj-bauer.de/homecoming-en.html" rel="alternate"/><published>2019-09-22T20:39:00+02:00</published><updated>2019-09-22T20:39:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-09-22:/homecoming-en.html</id><summary type="html">&lt;p&gt;Last week was Homecoming. In this post i write about the events in the week.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last week we had &lt;abbr title="Homecoming is the tradition of welcoming back former students and members and celebrating an organization's existence. It is a tradition in many high schools, colleges, and churches in the United States and to a lesser extent in Canada.  - Wikipedia"&gt;homecoming&lt;/abbr&gt;. In our homecoming week we had multiple activities.&lt;/p&gt;
&lt;h1 id="dress-up-days"&gt;Dress-Up Days&lt;/h1&gt;
&lt;p&gt;Over the whole weeks we had different themes to dress every day.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Favorite movie character&lt;/li&gt;
&lt;li&gt;Holiday&lt;/li&gt;
&lt;li&gt;White-Out&lt;/li&gt;
&lt;li&gt;Back in the days&lt;/li&gt;
&lt;li&gt;School Colors in red and blue&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="homecoming-parade"&gt;Homecoming Parade&lt;/h1&gt;
&lt;p&gt;In our parade many groups of our school went to our downtown and threw candy.
It can be compared to our German &lt;em&gt;Karneval&lt;/em&gt;. 
Our football team for example was driving on the fire trucks.
Also the dance team went with us, the marching band, our homecoming court and others.
The homecoming court exists out of the five most votes boys and girls each, who are the candidates for homecoming king and queen.&lt;/p&gt;
&lt;h1 id="pep-rally"&gt;Pep Rally&lt;/h1&gt;
&lt;p&gt;The pep rally is some kind of a school show with the current seniors.
The school marching band played our school anthem and the dance team presented their dances.
The parents of the Seniors made a show with their children.
They dressed them up like characters from their generation.
Also the homecoming king and queen were being elected.
&lt;img alt="Pep Rally" src="https://www.dj-bauer.de/images/20190922_pep-rally.jpg" /&gt;&lt;/p&gt;
&lt;h1 id="homecoming-game-and-dance"&gt;Homecoming Game and Dance&lt;/h1&gt;
&lt;p&gt;In the evening we had our homecoming game.
So we had a home football game with our marching band, the dance team and so on.
In the halftime our school gave a great entertainment with all of them.
Also the homecoming king and queen were presented to the public.
Fortunately we won the game, so we could go with a good mood to our homecoming dance.
Well, the dance was not that successful, so very less people were even there and even less were actual dancing.
But simply spending time with my friends and especially new people was quite fun.
After that we hang out a bit and some of my friends invited me to go &lt;abbr title="A snipe hunt is a type of practical joke or fool's errand, in existence in North America as early as the 1840s, in which an unsuspecting newcomer is duped into trying to catch a non-existent animal called a snipe. While snipe are actual birds, a snipe hunt is a quest for an imaginary creature whose description varies. The target of the prank is led to an outdoor spot and given instructions for catching the snipe; these often include waiting in the dark and holding an empty bag or making noises to attract the creature. The others involved in the prank then leave the newcomer alone in the woods to discover the joke"&gt;snipe hunting&lt;/abbr&gt;, but fortunately told me the real meaning after they realized that I would be really screwed up alone in a corn field.&lt;/p&gt;</content><category term="Exchange"/><category term="highschool"/></entry><entry><title>The nondescriptive moments can be the best one</title><link href="https://www.dj-bauer.de/the-nondescriptive-moments-can-be-the-best-one-en.html" rel="alternate"/><published>2019-09-15T20:51:00+02:00</published><updated>2019-09-15T20:51:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-09-15:/the-nondescriptive-moments-can-be-the-best-one-en.html</id><summary type="html">&lt;p&gt;Sometimes the best moments come when you can't imagine&lt;/p&gt;</summary><content type="html">&lt;p&gt;Like my &lt;a href="https://www.hagen-bauer.de/2011/06/wellenreiter.html"&gt;father wrote 8 years ago&lt;/a&gt; I got an alternative music education which I never regret. But this also means I am familiar with Jimmy Hendrix, Tom Petty, John Denver and all the other American music legends. Today a friend and me planned to buy a pair of good old American boots. Well, we arrived when every store was already closed.
&lt;img alt="On the road back" src="https://www.dj-bauer.de/images/20190915_road.jpeg" /&gt;
But the drive back was legendary. We just turned the music loudly on and found out, that we shared the same music favourites. Just listening to music together can be a great experiences. Free Fallin', Could you be loved, Country Roads are a few of them.&lt;/p&gt;
&lt;p&gt;So now I really have to say thank you to my father to show me that great music. I think that feelings would not be possible with todays music. Wait, also great thanks to my sponsor Norbert Röttgen. Without him, I would not be able to sit here and write about this beautiful experience.&lt;/p&gt;</content><category term="Exchange"/><category term="driving"/><category term="music"/></entry><entry><title>My Nutcracker Roles</title><link href="https://www.dj-bauer.de/my-nutcracker-roles-en.html" rel="alternate"/><published>2019-09-07T18:40:00+02:00</published><updated>2019-09-07T18:40:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-09-07:/my-nutcracker-roles-en.html</id><summary type="html">&lt;p&gt;A weeks ago I got my role offering after the audition. After a bit of struggling with dates I can now announce my roles.&lt;/p&gt;</summary><content type="html">&lt;p&gt;When you have read my article about my &lt;a href="https://www.dj-bauer.de/nutcracker-audition-en.html"&gt;Nutcracker Audition&lt;/a&gt; you may would like to know which roles I now got.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Picture of my shirt with my number" src="https://www.dj-bauer.de/images/20190825_shirt.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Well a few days after the audition I got my dates for my civic education week. In this week I will spend some days in Washington D.C.
It is in the second week of December.
So my flight to Washington D.C. is going be at the same day the last presentation will be.
So I thought I will not be able to take part in the ballet.
But because of my brilliant host mother I am able to take a flight after the presentation.
Only because the presentation is in the same city as my airport I can do that.&lt;/p&gt;
&lt;p&gt;So a week ago I got my role offer.
The offered me two roles in the second act.
My first role is the solo role in the Hungarian dance.
And my second role is in the Russian dance.
I love this dance.
When I saw it the first time I thought: when I would choose a dance in Nutcracker I want to be in the Russian dance.
It is just so funny and powerful. And of course I don't say &lt;em&gt;No&lt;/em&gt; to a solo role. So I am very happy with the roles. Especially when I think about the differences between Russian and English Ballet I mentioned in my post about the audition.&lt;/p&gt;
&lt;p&gt;You really can not believe how happy I am to have this opportunity.
I can not repeat enough, that this was made possible by my sponsor Norbert Röttgen.
Huge thanks to him.
But also to my great host mother who helps me with everything I need help and organizes a lot of events or experiences for us.&lt;/p&gt;</content><category term="Exchange"/><category term="sport"/><category term="ballet"/><category term="nutcracker"/></entry><entry><title>My first school day</title><link href="https://www.dj-bauer.de/my-first-school-day-en.html" rel="alternate"/><published>2019-08-26T21:00:00+02:00</published><updated>2019-08-26T21:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-08-26:/my-first-school-day-en.html</id><summary type="html">&lt;p&gt;In this article I will write about my first school day on friday. Spoiler: it was confusing&lt;/p&gt;</summary><content type="html">&lt;h1 id="before-the-classes"&gt;Before the classes&lt;/h1&gt;
&lt;p&gt;Okay where should I begin? I started the day with a breakfast with the football team which was really cool. So we drove to one of the team members house where some parents prepared it for us. We had pancakes, scrambled eggs, and fruits. Then we drive to school. (I was driven of course).
Then I approached the school my name was written on the ground in front of the main entrance with my football number.
Also every football player had a sign that looked a football jersey with his name and his number attach to his locker.
It was Friday, so game day, so the football team wore their jerseys.&lt;/p&gt;
&lt;p&gt;&lt;img alt="My locker" src="https://www.dj-bauer.de/images/20190826_locker.jpg" /&gt;&lt;/p&gt;
&lt;h1 id="my-classes"&gt;My classes&lt;/h1&gt;
&lt;p&gt;So at first I took my schedule and got a guided tour through the important parts of the school.
Then I had PE, so sport in my first hour.
In the second hour I had Chemistry. Wow that room is modern… In Germany you are glad when you have one working monitor per class, but in this room is one monitor for 7 students per table each. The teacher gave us the curriculum for this year and I noticed that I knew almost everything from my previous years. Hmm, we will see if I was right.
In the third hour I had study hall so I simply sat down with some people and talked to them because we had nothing to do. Then the juniors where called to the library to get their laptops. Yes you heard right. Every student received it's own Chromebook. In a community school without any extra fees. In Germany you can be glad when the regular computers work. So many of the classes have online content.
By now I had almost no problems with finding the room but, now I really struggled finding my math class. With some help I found it, this room had a smartboard so the class is way different from the German math classes.
My next class is American government. We started with the us citizenship test. Well, I think for a foreign exchange student this test is an ideal way to check ones progress during the year. Of course because I have a &lt;a href="https://www.dj-bauer.de/meine-ppp-bewerbung.html"&gt;political scholarship&lt;/a&gt; that class is perfect for me to learn more about the US system.
Then we went to lunch and I sat with some guys from the football team.
After lunch we continued the government class.
And then we had DEN time. It is just like another study hall to prepare ones stuff and to do homework, so again I met new people.
My sixth class was Tech. It is about crafting and machines, that sounded very interesting. The teacher said maybe we will do some welding in the end of the year.
Then I had World history. We had not done that much by now, but I am interested how the history taught here differs from the one taught in German schools.
My last class is English. The teacher is quite tough, but my last English teacher was very tough as well so I am used to it. I see it just as a challenging opportunity to improve my English a lot.&lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;So those are my classes. What else happened that day? Well, we had a &lt;a href="https://www.dj-bauer.de/high-school-football-en.html"&gt;football game&lt;/a&gt; that night. I heard a ton of new names on that day. Because that school is so small and I am on the football team way more people came to me than to the other exchange student. So I had so many new people and new impressions that I forgot many things instantly and I was glad when I found a room by myself. All in all I had no really bad experiences on my first school day.&lt;/p&gt;</content><category term="Exchange"/><category term="highschool"/></entry><entry><title>Nutcracker audition</title><link href="https://www.dj-bauer.de/nutcracker-audition-en.html" rel="alternate"/><published>2019-08-25T12:01:00+02:00</published><updated>2019-08-25T12:01:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-08-25:/nutcracker-audition-en.html</id><summary type="html">&lt;p&gt;Yesterday I was in a audition for the nutcracker. About the differences between English and Russian ballet.&lt;/p&gt;</summary><content type="html">&lt;h1 id="how-it-began"&gt;How it began&lt;/h1&gt;
&lt;p&gt;Half a week ago my host mother told me about a nutcracker audition in Des Moines.
And since I do ballet for 7 years I really wanted to continue it in America.
My host mother and sister drove me to the dance studio.
I was in the highest age class with 14 and upper.
Unfortunately I hurt my foot one day before so I was not sure if I should do it.
But because it hurt just a tiny bit anymore I decided to take part.&lt;/p&gt;
&lt;h1 id="how-it-was"&gt;How it was&lt;/h1&gt;
&lt;p&gt;So when we arrived I registered and got my number.
So it was like the auditions in the movies with numbers and the judges in front of you with a long table.
Then I went to the other waiting dancer.
There were around 30 to 40 girls and we were five boys.
We started with some basic plié and dancing warming up and then we had some basic choreographies.
Then the boys had one or two solo choreographies with a lot of jumps.
After that the girls had their pointe and a selection in two rounds for the higher roles.
Then the boys had grand pirouette.
When their were only six girls left we had some paring with pirouettes and some promenade.
And that was it.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Picture of my shirt with my number" src="https://www.dj-bauer.de/images/20190825_shirt.jpg" /&gt;&lt;/p&gt;
&lt;h1 id="my-difficulties"&gt;My difficulties&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;So as you might know in Germany there is mostly Russian ballet taught and not the English like in the US. It might sound like small differences and they are mostly minor. But when you have ever danced the "Russian way" and never had any experiences with the English ballet you will be confused my things like way of holding your arms or common movements.
So that was one of my major problems. I was not used to such minor things which got me out of my concept.&lt;/li&gt;
&lt;li&gt;And there was of course the naming. I bad in french names at home as well, but then their was an other accent of it which was quiet hard for me to understand. But with half a second of a delay in the beginning I got almost everything.&lt;/li&gt;
&lt;li&gt;As I said earlier I had some problems with my foots the day before which prevented my for example from jumping as high as usual.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Despite the given difficulties already the audition has a great experience for me to learn another type of ballet.
And lucky for my their was a women in the judgment who speaks German and was informed by my host mother, so she helped my a bit with the expressions.
And even if I know that three of the five boys were way better than me, I am looking forward to take some part in that production.&lt;/p&gt;</content><category term="Exchange"/><category term="ballet"/><category term="sport"/><category term="nutcracker"/></entry><entry><title>High school football</title><link href="https://www.dj-bauer.de/high-school-football-en.html" rel="alternate"/><published>2019-08-24T22:36:00+02:00</published><updated>2019-08-24T22:36:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-08-24:/high-school-football-en.html</id><summary type="html">&lt;p&gt;Two weeks ago I joined the high school football team. Yesterday we had our first game.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I had no football experiences before so it is currently a exciting experience to learn football. But especially the team experiences are amazing. So yesterday on the first school day we had our first match and I had my first football game ever. At the end of the school year I will write a general report about my overall experiences with the team.
&lt;img alt="My in outfit" src="https://www.dj-bauer.de/images/20190823_footballgame.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;At first we meet in our coaches room and spend some time together and got into the right mood. Already getting ready in the locker room was amazing. Everyone had fun. After the final meeting with the coach we went on the field.
Oh man was that awesome.
Everyone was yelling and the whole football field was like electrified.
Even if I did not play I was part of the team and that was what counts.
In the end we won 62 to 26.
And I think that having a party in the locker room is not a common thing in Germany.
But here everyone is just having fun. I think joining the football team my best decision in this adventure by now.&lt;/p&gt;</content><category term="Exchange"/><category term="highschool"/><category term="football"/><category term="sport"/></entry><entry><title>The adventure begins</title><link href="https://www.dj-bauer.de/the-adventure-begins-en.html" rel="alternate"/><published>2019-08-08T17:44:00+02:00</published><updated>2019-08-08T17:44:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-08-08:/the-adventure-begins-en.html</id><summary type="html">&lt;p&gt;Yesterday my journey to the USA started. And today I arrived at my host family. About the start of my adventure.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I will write only English articles during my time in the USA. Maybe I will translate the afterwords.&lt;/p&gt;
&lt;p&gt;Yesterday was the day of the days. The departure date.
With the whole group of the &lt;a href="meine-ppp-bewerbung.html"&gt;PPP&lt;/a&gt;-participants and two teamer of &lt;a href="https://www.experiment-ev.de"&gt;Experiment e.V.&lt;/a&gt; we flew from Frankfurt to Washington D.C.
I was excited especially of the flight, because I never flew before, but we were in a big group.
In the plane we met also a group of other exchange students. It was very interesting to compare the expectations of different nations.
Due to a storm in Washington we were not able to land, so we had a pause in Montreal to refuel the airplane.
Then with four hours delay  we arrived in Washington Dulles. And in this moment I realized that the (before theoretical) year begins.
&lt;img alt="Landing at sunset" src="https://www.dj-bauer.de/images/20190808-landing.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Passing the security check pass quiet simple and equipped with our package we went to the exit.
In the exit we were welcomed by CIEE teamers. With them we took a shuttle bus to a hotel.
Normally we would have done some information program done, but it was already 9:30 PM so we had a great dinner and after that a short introduction.
Well, at around 00:00 I &lt;em&gt;could&lt;/em&gt; sleep. But I was way to excited and a bit scared because I had to fly one my own from Atlanta to my final destination.
So after one hour of sleep I woke up and at around 3 AM I left my room with all my baggage to not wake my room mates up, who did not have to wake up as early as I.
In the lobby I was able to prepare myself and my baggage. At 4 AM we went with a teamer to the airport to Check-In. After the security we bought some breakfast. With three people we flied to Atlanta.
And there I was, as said, on my own. But finding my flight on a big screen was not a big deal.
Somehow strange, but also funny is: From flight to flight the airplanes became smaller, but the space for my legs increased constantly.
&lt;img alt="Look out of the airplane window" src="../images/20190808-airplane.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;When I went out of the airplane my first two goals were to find &lt;em&gt;A&lt;/em&gt; my baggage and &lt;em&gt;B&lt;/em&gt; my host family of course.
First I tried task &lt;em&gt;A&lt;/em&gt;. No problem.
Task &lt;em&gt;B&lt;/em&gt; was as easy as &lt;em&gt;A&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And there it was: my host family!
Finally. After almost one year from the beginning of the application process for the scholarship I sit in the car and started to realize what happened.
Now when I am writing this I started to realized the real opportunity my sponsor gave me.
But I think I have still not completely realized that this dream is now reality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resume&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flying on your own (event if you have no experiences) with a prebooked E-ticket is no problem.&lt;ul&gt;
&lt;li&gt;The staff is there to help you&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Crying in the airplane is not a problem. That is part of the realizing process.&lt;/li&gt;
&lt;/ul&gt;</content><category term="exchange"/><category term="ciee"/><category term="experiment"/><category term="flight"/><category term="ppp"/></entry><entry><title>Mein Abschiedsbuch</title><link href="https://www.dj-bauer.de/mein-abschiedsbuch.html" rel="alternate"/><published>2019-08-06T12:29:00+02:00</published><updated>2019-08-06T12:29:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-08-06:/mein-abschiedsbuch.html</id><summary type="html">&lt;p&gt;Heute ist mein Abschiedsbuch/Auslandsbuch fertig geworden. Ich habe es nur etwas anders gemacht, als die meisten…&lt;/p&gt;</summary><content type="html">&lt;h1 id="was-ist-ein-abschiedsbuch-genau"&gt;Was ist ein Abschiedsbuch genau?&lt;/h1&gt;
&lt;p&gt;Unter viele Austauschschüler/innen ist es mittlerweile Brauch ein Abschiedsbuch zu gestalten.
Dort bereitet man diverse Seiten vor, die die Freunde/innen dann ausfüllen können.
Auch lässt man in der Regeln hinten im Buch noch einige Seiten frei, wo sich die anderen dann kreativ ausleben können und eine eigene Seite für einen gestalten können.
Diese Seiten werden werden dann abgedeckt oder ähnliches, damit man sie dann erst im Flugzeug liest.
So ein Buch fängt man in der Regel ca. 2 bis 3 Monate vor Abflug an, da das Buch für die individuellen Seiten herumgegeben wird.&lt;/p&gt;
&lt;h1 id="wie-ich-auf-die-idee-gekommen-bin"&gt;Wie ich auf die Idee gekommen bin&lt;/h1&gt;
&lt;p&gt;Bis zu meinem Vorbereitungsseminar fand ich die Idee ziemlich blöd, doch ein paar andere Teilnehmer hatten ihre dabei.
Als ich das dann mal in echt gesehen habe, fand ich die Idee auf einmal doch nicht mehr zu blöd.
Gut, ich hatte noch ca. 5 Wochen bis zu den Schulende Zeit. Hmmm, eine Woche erstellen. Dann bleiben ja nach Adam Ries noch 4 Wochen zum eintragen Zeit. Sagen wir mal 20 Einträge à 1-2 Tage Bearbeitungszeit. Huch! Das passt nicht. Und wenn dann nur ganz knapp.&lt;/p&gt;
&lt;h1 id="meine-eigene-art-es-zu-regeln"&gt;Meine eigene Art es zu regeln&lt;/h1&gt;
&lt;p&gt;Doch als (angehender) Informatiker weiss man sich zu helfen: Parallelisieren. Ich designe das Buch und Seiten zum ausfüllen selber, und binde dann das Buch selber.
Guter Plan, nur eine Sache fehlte: Ein schönes Buch. Bei meiner künstlerischen Begabung war mir sofort klar, dass dieses Buch aus dem Drucker kommen sollte.
Okay, wie erstelle ich es dann am Computer: Libre Office? - Ne, keine Lust auf Alignment mit der Maus, Latex? - Ne, ich bin noch nicht erfahren genug für eigene Kommandos, Python? - Klingt komisch, sollte aber klappen!
Also habe ich mein Abschiedsbuch allen ernstes in Python programmiert. Die Reaktion meines Vaters war nur: "Ha! Das passt zu dir."&lt;/p&gt;
&lt;p&gt;Tja, also gingen vor Wochen schon die Blankoseiten herum. Gestern hatte ich dann alle eingesammelt und ja, hier ist es:
&lt;img alt="Mein Abschiedsbuch" src="https://www.dj-bauer.de/images/20190806_abschiedsbuch.jpg" /&gt;&lt;/p&gt;</content><category term="Exchange"/><category term="experiment"/><category term="ppp"/><category term="python"/><category term="scripting"/></entry><entry><title>Plain Text Kalender</title><link href="https://www.dj-bauer.de/plain-text-kalender.html" rel="alternate"/><published>2019-07-31T22:03:00+02:00</published><updated>2019-07-31T22:03:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-31:/plain-text-kalender.html</id><summary type="html">&lt;p&gt;Nachdem ich von todo.txt gehört habe, versuche ich ein Kalender Plaintext format festzulegen&lt;/p&gt;</summary><content type="html">&lt;h1 id="inspiration"&gt;Inspiration&lt;/h1&gt;
&lt;p&gt;Der Anlass war &lt;a href="http://todotxt.org/"&gt;todo.txt&lt;/a&gt; einen Plaintext basierenden Kalender zu definieren.
Nach einigem Googlen fand ich als Lösungen &lt;a href="https://github.com/jonstoler/calvin"&gt;Calvin&lt;/a&gt; und &lt;a href="https://github.com/luxpir/plaintext-productivity/blob/master/2016vertiCal.conf"&gt;verticalCal&lt;/a&gt;, jedoch fand ich die Formate unausgereift bzw. zu umständlich.&lt;/p&gt;
&lt;h1 id="ziel"&gt;Ziel&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Der ganze Kalender muss in einer Textdatei liegen&lt;/li&gt;
&lt;li&gt;Das Format soll&lt;ol&gt;
&lt;li&gt;Aus einem Texteditor bearbeitbar sein&lt;/li&gt;
&lt;li&gt;Automatisch bearbeitbar sein&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;1 Termin = 1 Zeile&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="spezifikation"&gt;Spezifikation&lt;/h1&gt;
&lt;h2 id="zeitpunkt"&gt;Zeitpunkt&lt;/h2&gt;
&lt;p&gt;YYYY-MM-DD/HH:MM&lt;br /&gt;
&lt;strong&gt;Beispiel:&lt;/strong&gt; 2019-07-23/12:56&lt;/p&gt;
&lt;h2 id="ort"&gt;Ort&lt;/h2&gt;
&lt;p&gt;@Ort (Leerzeichen werden durch Unterstrich ersetzt)&lt;br /&gt;
&lt;strong&gt;Beispiel:&lt;/strong&gt; @Musterstraße_5._Musterstadt&lt;/p&gt;
&lt;h2 id="kategory"&gt;Kategory&lt;/h2&gt;
&lt;p&gt;+Kategorie&lt;br /&gt;
&lt;strong&gt;Beispiel:&lt;/strong&gt; +Schule&lt;/p&gt;
&lt;h2 id="termin"&gt;Termin&lt;/h2&gt;
&lt;p&gt;Startzeitpunkt [Endzeitpunkt] Name [Kategorie] [Ort]&lt;br /&gt;
Der Name hat keine Einschränkungen in der Schreibweise oder Länge.&lt;br /&gt;
&lt;strong&gt;Beispiele:&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mf"&gt;2019&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Friseur&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Friseur_Maier&lt;/span&gt;
&lt;span class="mf"&gt;2019&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Farbe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Kaufen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;Familie&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;BaumarktXY&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="anmerkungen"&gt;Anmerkungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Da Kommentare (fast) nie genutzt werden, können sie, wenn zwingend Notwendig, anderswo gespeichert und verknüpft werden.&lt;/li&gt;
&lt;li&gt;Wiederholende Termine sollen über eigene Scripte gelößt werden. Dies war eins der Kernfeatures, die ich als Ziel hatte&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="implementierung"&gt;Implementierung&lt;/h1&gt;
&lt;p&gt;Die Implementierung habe ich in Python3 vorgenommen.
Ziel war hier ein Kommandozeilentool für das Anzeigen, Bearbeiten, Löschen und Erstellen von Terminen.
Ich bisher zwei halbe Implementierungen vorgenommen. Ein &lt;a href="https://www.dj-bauer.de/files/vim-calendar.zip" download&gt;Vim Plugin&lt;/a&gt; für Syntax-highlighting und ein &lt;a href="https://www.dj-bauer.de/files/calendar.zip" download&gt;cli&lt;/a&gt; für das Erstellen, Sortieren und Auflisten der Termine.
Im Vim-Plugin fehlen noch Features, wie das Bearbeiten, Sortieren und vielleicht komfortables Erstellen. Mal schauen, wann ich dies hinzufüge. Dem Cli fehlt noch das Feature von Bearbeiten und dem Entfernen von Events.&lt;/p&gt;
&lt;p&gt;Da alles unter GPL v.3 lizensiert ist, kann man gerne Verbesserungen vornehmen. Ich freue mich über Verbersserungsvorschläge.&lt;/p&gt;</content><category term="Workflow"/><category term="plaintext"/><category term="calendar"/></entry><entry><title>Todo.txt mit vim</title><link href="https://www.dj-bauer.de/todotxt-mit-vim.html" rel="alternate"/><published>2019-07-31T17:24:00+02:00</published><updated>2019-07-31T17:24:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-31:/todotxt-mit-vim.html</id><summary type="html">&lt;p&gt;Ich habe mich nun für Plaintext als Todoliste begeistern können. Doch wie verknüpfe ich alles?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zuhause haben wir seit ca. einem Jahr unsere Nextcloud. Die Todolistenfunktion, welche in den Kalender integriert war, habe ich mangels einfacher Bedienung eher halb genutzt und habe mangels guter Liste manche Todos etwas schleifen gelassen.
Mein &lt;a href="https://www.hagen-bauer.de/2012/09/todotxt-die-ultimative-aufgabenverwaltung.html"&gt;Vater&lt;/a&gt; benutzt dieses Tool schon seit sieben Jahren, jedoch habe ich erst vor kurzem diese Genialität entdeckt.
Ich persönlich verwende nur Prioritäten von &lt;strong&gt;A&lt;/strong&gt; bis &lt;strong&gt;E&lt;/strong&gt;
Dabei benutze ich die folgende Bedeutung:
&lt;table&gt;
    &lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;Heute&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;Morgen&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;Diese Woche&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;Nächste Woche&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;Unbestimmt&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;
&lt;h1 id="synchronisierung"&gt;Synchronisierung&lt;/h1&gt;
&lt;p&gt;Zur Synchronisation habe ich in meiner Nextcloud ein Verzeichniss mit der Datei &lt;em&gt;todo.txt&lt;/em&gt;. Auf dem Smartphone kann ich die einzelne Datei einfach lokal synchronisieren.
Die Nextcloud App für Computer kann aber nur Verzeichnisse synchronisieren, weshalb ein eigenes Verzeichniss dafür habe.
Da ich aber die Nextcloud App unpraktisch bzgl automatischen Scripten finde suche ich noch nach einer bidirektionalen Syncsoftware.
Vdirsyncer kann leider kein WebDAV und rclone ist auch nur monodirektional. Wem da eine Lösung einfällt, kann sich gerne bei mir melden.&lt;/p&gt;
&lt;h1 id="bedienung"&gt;Bedienung&lt;/h1&gt;
&lt;h2 id="desktop-und-laptop"&gt;Desktop und Laptop&lt;/h2&gt;
&lt;p&gt;Ich weis, dass es das Kommandozeilentool &lt;a href="https://github.com/todotxt/todo.txt-cli"&gt;todo.sh&lt;/a&gt; gibt, allerdings ist der Mehrwert dieses mir noch unklar.
Ich öffne die Textdatei lieber in Vim mit dem Plugin &lt;a href="https://github.com/freitass/todo.txt-vim"&gt;todo.txt-vim&lt;/a&gt;. Da dieses nicht ganz in meiner Vim-Konfiguration funktioniert, habe ich es kurzerhand abgewandelt und in meiner &lt;em&gt;.vimrc&lt;/em&gt; erweitert.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;autocmd &lt;span class="nb"&gt;BufRead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;BufNewFile&lt;/span&gt; */todo.txt &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;filetype&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;todo
&lt;span class="c"&gt;&amp;quot; todo.txt colors&lt;/span&gt;
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoDone       ctermfg&lt;span class="p"&gt;=&lt;/span&gt;DarkGray
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoPriorityA  ctermfg&lt;span class="p"&gt;=&lt;/span&gt;Red
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoPriorityB  ctermfg&lt;span class="p"&gt;=&lt;/span&gt;Yellow
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoPriorityC  ctermfg&lt;span class="p"&gt;=&lt;/span&gt;Yellow
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoDate       ctermfg&lt;span class="p"&gt;=&lt;/span&gt;Magenta
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoProject    ctermfg&lt;span class="p"&gt;=&lt;/span&gt;Cyan
&lt;span class="nb"&gt;highlight&lt;/span&gt; TodoContext    ctermfg&lt;span class="p"&gt;=&lt;/span&gt;Blue
&lt;span class="c"&gt;&amp;quot; todo.txt keybindings&lt;/span&gt;
&lt;span class="nb"&gt;nnoremap&lt;/span&gt; &amp;amp;&lt;span class="k"&gt;lt&lt;/span&gt;;leader&amp;amp;gt;s :&lt;span class="k"&gt;sort&lt;/span&gt;&amp;amp;&lt;span class="k"&gt;lt&lt;/span&gt;;CR&amp;amp;gt;
&lt;span class="nb"&gt;nnoremap&lt;/span&gt; &amp;amp;&lt;span class="k"&gt;lt&lt;/span&gt;;leader&amp;amp;gt;&lt;span class="k"&gt;c&lt;/span&gt; :&lt;span class="k"&gt;call&lt;/span&gt; todo#txt#mark_as_done&lt;span class="p"&gt;()&lt;/span&gt;&amp;amp;&lt;span class="k"&gt;lt&lt;/span&gt;;CR&amp;amp;gt;
&lt;span class="nb"&gt;nnoremap&lt;/span&gt; &amp;amp;&lt;span class="k"&gt;lt&lt;/span&gt;;leader&amp;amp;gt;&lt;span class="k"&gt;d&lt;/span&gt; :&lt;span class="k"&gt;call&lt;/span&gt; todo#txt#set_date&lt;span class="p"&gt;()&lt;/span&gt;&amp;amp;&lt;span class="k"&gt;lt&lt;/span&gt;;CR&amp;amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Die Veränderung Abänderung ist hier als &lt;a href="https://www.dj-bauer.de/files/vim-txt.patch" download&gt;Patch&lt;/a&gt; zum Download.
Die Kombination &lt;code&gt;&amp;lt;leader&amp;gt;d&lt;/code&gt; ist besonders beim schreiben neuer Todos praktisch.
&lt;img alt="Todo.txt-vim in Action" src="../images/20190731_todo-vim.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="smartphone"&gt;Smartphone&lt;/h2&gt;
&lt;p&gt;Für das Smartphone benutze ich wie die meisten die App SimpleTask aus F-Droid.
Als ich in der Nextcloud App die Datei heruntergeladen habe, wähle man in SimpleTask als Datei &lt;em&gt;/Android/media/com.nextcloud.client/nextcloud/&lt;account&gt;/todo/todo.txt&lt;/em&gt; aus.
Auch deaktiviere ich das Archivierungsfeature in den Einstellungen, da ich dies später über Scripte lösen will.&lt;/p&gt;</content><category term="Workflow"/><category term="vim"/><category term="todo.txt"/><category term="nextcloud"/><category term="simpletask"/></entry><entry><title>Multi material Knife</title><link href="https://www.dj-bauer.de/multi-material-knife.html" rel="alternate"/><published>2019-07-29T00:00:00+02:00</published><updated>2019-07-29T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-29:/multi-material-knife.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Teabag holder</title><link href="https://www.dj-bauer.de/teabag-holder.html" rel="alternate"/><published>2019-07-29T00:00:00+02:00</published><updated>2019-07-29T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-29:/teabag-holder.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Wallmounted Spolholder</title><link href="https://www.dj-bauer.de/wallmounted-spolholder.html" rel="alternate"/><published>2019-07-29T00:00:00+02:00</published><updated>2019-07-29T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-29:/wallmounted-spolholder.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Eddingholder</title><link href="https://www.dj-bauer.de/eddingholder.html" rel="alternate"/><published>2019-07-26T00:00:00+02:00</published><updated>2019-07-26T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-26:/eddingholder.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Feets for Motorhome awnings</title><link href="https://www.dj-bauer.de/feets-for-motorhome-awnings.html" rel="alternate"/><published>2019-07-26T00:00:00+02:00</published><updated>2019-07-26T00:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-26:/feets-for-motorhome-awnings.html</id><content type="html"/><category term="3d-prints"/></entry><entry><title>Eine Küstenwanderung mit leckeren Crepes</title><link href="https://www.dj-bauer.de/eine-kustenwanderung-mit-leckeren-crepes.html" rel="alternate"/><published>2019-07-25T20:42:00+02:00</published><updated>2019-07-25T20:42:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-25:/eine-kustenwanderung-mit-leckeren-crepes.html</id><summary type="html">&lt;p&gt;Heute haben wir im Urlaub eine Küstenwanderung gemacht. Als Belohnung gab es dann leckere Crepes&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zurzeit bin ich vor meinem Abflug nach Amerika erstmal noch einmal mit meiner Familie in der Bretagne.
Heute haben wir also eine Küstenwanderung entlang des &lt;em&gt;GR43&lt;/em&gt; gemacht. Dabei hatten wir wunderschöne Ausblicke auf eine große Bucht und sind durch grüne Tunnel gegangen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wunderschöne Panorama Aussicht" src="https://www.dj-bauer.de/images/20190725_panorama.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Auch sind wir dabei an von Büschen umrandeten Hortensien-Feldern vorbeigelaufen.
&lt;img alt="Hortensien-Feld" src="https://www.dj-bauer.de/images/20190725_blumen.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Nach ca.2½ Stunden sind wir dann im Hafen unseres Ziels angekommen.
Dort gab es dann erstmal einen Galette und Crepe. &lt;/p&gt;
&lt;p&gt;&lt;img alt="Gallette mit Salat, Tomate, Käse und Ei" src="https://www.dj-bauer.de/images/20190725_crepe.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Den Rückweg sind wir dann per Bus gefahren. Unsere Körper waren noch mit verdauen der Köstlichkeiten beschäftigt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fazit:&lt;/strong&gt;
1. Die Küsten in der Bretagne sind verdammt hügelig!
2. Wer in der Bretagne ist muss mindestens einmal eine richtige Creperie besuchen&lt;/p&gt;</content><category term="2019"/></entry><entry><title>Einen Fettbrand mit Wasser löschen</title><link href="https://www.dj-bauer.de/einen-fettbrand-mit-wasser-loschen.html" rel="alternate"/><published>2019-07-05T10:28:00+02:00</published><updated>2019-07-05T10:28:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-07-05:/einen-fettbrand-mit-wasser-loschen.html</id><summary type="html">&lt;p&gt;Es wird einem ja immer eingetrichtert, dass man eine Fettbrand nie mit Wasser löschen sollte. Nur hält man sich da auch im Ernstfall dran?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Man lernt heute in der Schule, Zuhause und sonstwo immer, dass man einen Fettbrand unter keinen Umständen mit Wasser bekämpfen soll.
Nur kann/wird man dieses Wissen denn dann auch im Ernstfall innerhalb von Sekunden anwenden?&lt;/p&gt;
&lt;p&gt;Vor ein paar Wochen war ich mit Freunden auf einem Balkon grillen. 
Und nun ist uns irgendwann von dem fettigen Fleisch etwas zu viel Fett auf die Heizstäbe des Elektrogrills getropft und hat sich entzündet.
Und das erste was man hört ist von 5/7 Seiten: "Holt mal Wasser!" - Bitte Was⁉
Naja, irgendwann konnten ein anderer und ich sie dann noch überzeugen doch lieber Blumenerde zu nehmen.
Glück gehabt...&lt;/p&gt;
&lt;p&gt;Ich finde dies ist ein relativ gutes Beispiel dafür, dass es nicht viel bringt uns in der Schule auf Biegen und Brechen Wissen einzuprügeln, damit man es im Test kann.
Den davon bleibt nicht viel hängen und fürs Leben lernen so leider viele auch nicht.&lt;/p&gt;</content><category term="2019"/></entry><entry><title>Mein Bundesstaat</title><link href="https://www.dj-bauer.de/mein-bundesstaat.html" rel="alternate"/><published>2019-06-22T13:10:00+02:00</published><updated>2019-06-22T13:10:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-06-22:/mein-bundesstaat.html</id><summary type="html">&lt;p&gt;Ich habe nun auch eine Gastfamilie gefunden. Und ich komme nach Iowa&lt;/p&gt;</summary><content type="html">&lt;p&gt;Gestern habe ich eine erfreuliche Email bekommen: Mir wurde meine Gastfamilienaddresse mitgeteilt.
Ich werde ins ländliche Iowa in ein Dorf mit ca. 1500 Einwohnern kommen. Meine Gastfamilie wird inklusive mir siebenköpfig sein. Davon ist einer noch ein chinesischer Austauschschüler.
Auch meine Schule wird recht klein sein. Aber dann kann man ja wohl auch besser neue Leute kennenlernen.&lt;/p&gt;
&lt;p&gt;Nun freue ich mich immer mehr auf meinen Abflugstag und möchte meine Gastfamilie in echt kennenlernen.
An alle (zukünftigen) möchte ich jetzt weitergeben, dass man sich keine Sorgen machen muss, wenn es etwas länger dauert. Die Mitarbeiter wissen eigentlich immer was sie tun und kennen das Prozedere.&lt;/p&gt;</content><category term="Exchange"/><category term="experiment"/><category term="ciee"/></entry><entry><title>Meine PPP-Bewerbung</title><link href="https://www.dj-bauer.de/meine-ppp-bewerbung.html" rel="alternate"/><published>2019-06-22T08:15:00+02:00</published><updated>2019-06-22T08:15:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-06-22:/meine-ppp-bewerbung.html</id><summary type="html">&lt;p&gt;Nachdem ich als PPP-Stipendiat ausgewählt worden bin, möchte ich euch von meinen Erfahrungen darüber ezählen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Anfang Mai wurde ich von meinem Bundestagsabgeordneten &lt;a href="https://www.norbert-roettgen.de/"&gt;Norbert Röttgen&lt;/a&gt; als Stipendiat für das PPP/CBYX 2019/20 angenommen. Nun möchte ich euch von meinen Erfahrungen mit dem Bewerbungsverfahren berichten.&lt;/p&gt;
&lt;h1 id="wie-ist-es-bei-mir-passiert"&gt;Wie ist es bei mir passiert?&lt;/h1&gt;
&lt;p&gt;Alles angefangen hat es im Oktober 2018, wo meine Mutter mich beim Grillen gefragt hat, ob ich mich denn nicht auf das PPP-Stipendium bewerben möchte.
Sie habe das auch früher gemacht, ist aber nicht ausgewählt worden.
Ich fand die Idee echt cool, da mich der kulturelle Austausch mit den USA sehr interessiert und ich noch nie in den USA war.&lt;/p&gt;
&lt;p&gt;Also bewarb ich mich kurzerhand auf dem Portal des deutschen Bundestages.
Nachdem ich dort ein Formular ausgefüllt habe, wurde mir meine Partnerorganisation mitgeteilt: &lt;a href="https://www.experiment-ev.de/"&gt;Experiment e.V.&lt;/a&gt;.
Dort ging die Bewerbungsphase dann richtig los.
Das Formular war intuitiv auszufüllen.
Das einzige, was mir ein winziges bisschen Bauchschmerzen bereitete, waren die Mindest- und Maximalwortanzahlen bei den zu schreibenden Texten.
Ich bin eigentlich immer nur knapp unter die Minimalanforderung gekommen, worüber ich mir aber eigentlich keine große Sorgen machte.
Als dieses Formular abgeschickt worden war, passierte ersteinmal für ein oder zwei Wochen gar nichts.&lt;/p&gt;
&lt;p&gt;Dann wurde ich im November für einen Tag zu einem Gruppengespräch in Bonn eingeladen, wo alle (ungefähr 15-20) Kandidaten, die ungefähr aus ihren Bögen den Anforderungen entsprachen, eingeladen waren.
Und hier kommt die erste Besonderheit an Experiment e.V., da es eine Non-profit-Organisation ist, und sie damit also kein Geld als Verein einnehmen dürfen, wird sehr viel im Verein durch ehrenamtliche ehemalige AustauschschühlerInnen getan, wie zum Beispiel die Auswahlgespräche oder die Vorbereitungsseminare.
Also konnte man sich schon direkt beim Auswahlgespräch Erfahrungsberichte bei den Ehemaligen einholen.
Obwohl wir alle eigentlich gegeneinander spielten und alle dieses eine Stipendium haben wollten, schien die Stimmung locker und entspannt.&lt;/p&gt;
&lt;p&gt;Im Dezember oder Januar bekam ich dann eine persönliche Nachricht von meinem Abgeordneten, dass er mich gerne in einem persönlichen Gespräch kennen lernen würde.
Also hatte ich Ende Januar/Anfang Februar ein Einzelgespräch mit Ihm. Dabei erfuhr ich, dass er nur zwei Kandidaten ausgewählt hat, was die Sache für einen noch spannender machte.
Im Interview erzählte ich Ihm mehr von mir und weniger von den Unterlagen, denn die hatte er ja schon vorliegen.
Drei Tage später bekam ich dann eine Email von Ihm, dass er mich ausgesucht hat.&lt;/p&gt;
&lt;h1 id="was-kann-ich-anderen-empfehlen"&gt;Was kann ich anderen empfehlen?&lt;/h1&gt;
&lt;p&gt;Die nachfolgenden Punkte können sich nach Standardantwort anhören, aber sie stimmen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wie ich schon oben erwähnt habe, habe ich vergleichsweise wenig geschrieben&lt;ul&gt;
&lt;li&gt;Das ist nicht schlimm, es kommt darauf an, was man schreibt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Auf die Gespräche habe ich mich nicht sonderlich vorbereitet&lt;ul&gt;
&lt;li&gt;Man geht als Person ins Ausland, um zu lernen, und nicht um sein Wissen auszuschütten.&lt;/li&gt;
&lt;li&gt;Es kommt auf dich, und nicht auf dein Wissen an.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Obwohl wärend des Gruppenevents Einzelgespräche auf Englisch stattfinden, muss man kein perfektes Englisch können.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Exchange"/><category term="experiment"/><category term="ppp"/></entry><entry><title>Emojis im Terminal</title><link href="https://www.dj-bauer.de/emojis-im-terminal.html" rel="alternate"/><published>2019-05-05T12:49:00+02:00</published><updated>2019-06-12T12:00:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-05-05:/emojis-im-terminal.html</id><summary type="html">&lt;p&gt;Hier beschreibe ich, wie ich mir ein Font mit Emojis erstellt habe.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Vielleicht hatten auch schon einige von euch das Problem, dass die Unicode Zeichen im Terminal anzeigen wollten, jedoch kein Font gefunden, welches Emojis und ihr Lieblingsfont z.B. Inconsolata unterstützt. Auf dieses Problem bin ich gestoßen, als ich anfing mit i3Blocks meine Statusbar zu gestalten.&lt;/p&gt;
&lt;p&gt;Als Basis neme ich das ganz gewöhliche &lt;a href="https://github.com/googlefonts/Inconsolata"&gt;Inconsolata Mono Font&lt;/a&gt; und als Emoji-Font fand ich das &lt;a href="https://github.com/eosrei/twemoji-color-font"&gt;Twitter Color Emoji Font&lt;/a&gt;. Dieses wollte ich nicht alleine nutzen, da ich für Schriften bei Inconsolata bleiben wollten. Obwohl es Farben unterstützt, hat es auch die reinen Umrisse, falls Farben nicht unterstützt/erwünscht sind.&lt;/p&gt;
&lt;p&gt;Um diese beiden Fonts zu mergen benutze ich das program &lt;em&gt;fotnforge&lt;/em&gt;, welches in den gängigen Paketverwaltungen verfügbar ist.&lt;/p&gt;
&lt;p&gt;Ich start also fontforge mit dem Ausgangsfont als parameter&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fontforge Inconsolata.ttf
&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Nun kann ich unter dem Menüpunkt &lt;em&gt;Element&lt;/em&gt; das Emoji-Font importieren.&lt;/li&gt;
&lt;li&gt;Um nur die darzustellenden Glyphs anzuzeigen, aktiviert man im Menüpunk &lt;em&gt;Encoding&lt;/em&gt; die &lt;em&gt;Compact&lt;/em&gt;-Option.&lt;/li&gt;
&lt;li&gt;Da in meinem Fall die Emojis noch viel zu groß sind, wähle ich sie alle aus und verkleinere sie mit &lt;em&gt;Ctrl+* → &lt;/em&gt;scale uniformly*&lt;/li&gt;
&lt;li&gt;Unter dem Menupunkt &lt;em&gt;File→Create Font&lt;/em&gt; kann man nun das font exportieren.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Font lege ich in &lt;em&gt;&lt;sub&gt;/.fonts&lt;em&gt; ab und nenne es &lt;/em&gt;InconsolataEmoji.ttf&lt;em&gt;
Um es einzubinden benutze ich &lt;/em&gt;fontconfig*, welches auch in apt verfügbar ist.
Meine Konfigurationsdatei in *&lt;/sub&gt;/.config/fontconfig/fonts.conf&lt;/em&gt; sieht folgendermaßen aus.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;?xml&lt;span class="w"&gt; &lt;/span&gt;version=&amp;quot;1.0&amp;quot;?&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;!DOCTYPE&lt;span class="w"&gt; &lt;/span&gt;fontconfig&lt;span class="w"&gt; &lt;/span&gt;SYSTEM&lt;span class="w"&gt; &lt;/span&gt;&amp;#39;fonts.dtd&amp;#39;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;fontconfig&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;

&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;serif&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;prefer&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;Libertine&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/prefer&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;

&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;sans-serif&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;prefer&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;Biolinum&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/prefer&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;sans&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;prefer&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;Biolinum&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/prefer&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;monospace&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;prefer&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;family&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;InconsolataEmoji&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/family&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/prefer&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/alias&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/fontconfig&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In meinem Terminal wurde die Schrift nach einem Re-Login erfolgreich geladen. Damit meine i3 statusbar dies auch tat, fügte ich in der Bar-Section meiner Konfigurationsdatei forgende zeile ein.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;font pango:mono 14
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id="edit-20190612"&gt;EDIT 2019/06/12&lt;/h1&gt;
&lt;p&gt;Man kann sich unter Arch Linux die ganze Arbeit aber auch sparen und für farbige Emojis das AUR &lt;a href="https://aur.archlinux.org/packages/ttf-emojione/"&gt;ttf-emojione&lt;/a&gt; und für das terminal das AUR &lt;a href="https://aur.archlinux.org/packages/ttf-symbola/"&gt;ttf-symbola&lt;/a&gt; installieren.&lt;/p&gt;</content><category term="Ricing"/><category term="font"/><category term="emoji"/><category term="ricing"/></entry><entry><title>Eine neue Statusbar mit I3Blocks</title><link href="https://www.dj-bauer.de/eine-neue-statusbar-mit-i3blocks.html" rel="alternate"/><published>2019-05-05T12:28:00+02:00</published><updated>2019-05-05T12:28:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-05-05:/eine-neue-statusbar-mit-i3blocks.html</id><summary type="html">&lt;p&gt;In diesem Post installiere ich i3Blocks und stelle meinen ersten "Block" ein&lt;/p&gt;</summary><content type="html">&lt;p&gt;I3Blocks ist eine Alternative zu der standartmäßigen &lt;em&gt;i3status&lt;/em&gt; oder der &lt;em&gt;Polybar&lt;/em&gt;. Dabei setzt es vor allem auf ein baukastenähnliches System, woher auch der Name kommt.&lt;/p&gt;
&lt;h1 id="installation-und-konfiguration"&gt;Installation und Konfiguration&lt;/h1&gt;
&lt;p&gt;Man kann es wie gewöhnlich z.B. über apt installieren&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo apt install i3blocks
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Die Konfigurationsdatei wird in &lt;sub&gt;/.config/i3blocks/config angelegt. Ich speichere meine Blöcke, welche im Grunde genommen ein Script welches etwas ausgibt ist, alle in *&lt;/sub&gt;/.scripts/statusbar/* ab. Als Normalkonfiguration habe ich folgendes.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;command=$HOME/.scripts/statusbar/$BLOCK_NAME
separator_block_width=15
markup=pango
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Alle Einstellungen, die nicht in einem Block sind, werden auf alle Blöcke angewandt. In der ersten Zeile setze ich den Befehl, welcher für den Block ausgeführt wird. Dort wird auch die Variable &lt;em&gt;BLOCK_NAME&lt;/em&gt; genutzt, welche für jeden Block unterschiedlich ist.&lt;/p&gt;
&lt;h1 id="das-erstellen-eines-blockes"&gt;Das Erstellen eines Blockes&lt;/h1&gt;
&lt;p&gt;Als Beispiel werde ich meinen Uhr-Block nehmen.
In meiner Konfigurationsdatei füge ich folgendes hinzu.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[clock]&lt;/span&gt;
&lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In den Eckigen Klammern steht der Name des Blockes, mit dem der Command bestimmt wird.
Das Intervall ist der Zeitabstand in Sekunden, in dem der Command aufgerufen wird.&lt;/p&gt;
&lt;p&gt;Mein Uhrscript, welches in ~/.scripts/statusbar/clock liegt, ist recht Simpel.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;weekday&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;+%a&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;+%H:%M &amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;+%d %b&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#Das icon der Uhrzeit anpassen&lt;/span&gt;
&lt;span class="nv"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;+%I&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;👻&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;#Buhuhu&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕑&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;02&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕒&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;03&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕓&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;04&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕔&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;05&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕕&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;06&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕖&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;07&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕗&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;08&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕘&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;09&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕙&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕚&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕛&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;clkIcn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🕛&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$clkIcn&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$time&lt;/span&gt;&lt;span class="s2"&gt;🗓 &lt;/span&gt;&lt;span class="nv"&gt;$weekday&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$day&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

Sicher&lt;span class="w"&gt; &lt;/span&gt;kann&lt;span class="w"&gt; &lt;/span&gt;man&lt;span class="w"&gt; &lt;/span&gt;sie&lt;span class="w"&gt; &lt;/span&gt;Emojiauswahl&lt;span class="w"&gt; &lt;/span&gt;noch&lt;span class="w"&gt; &lt;/span&gt;etwas&lt;span class="w"&gt; &lt;/span&gt;verkürzen.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Falls ihr (noch) kein Emoji-Font habt, um diese im Terminal darzustellen beschreibe ich in &lt;a href="emojis-im-terminal.html"&gt;diesem Blogpost&lt;/a&gt;, wie ich mir mein eigenes Emoji-Font erstellt habe.&lt;/p&gt;
&lt;p&gt;So kann man einfach und mit eigenen Blöcken seine Statusbar an seine Wünsche anpassen&lt;/p&gt;</content><category term="Ricing"/><category term="i3"/><category term="i3blocks"/><category term="bash"/><category term="scripting"/><category term="ricing"/></entry><entry><title>Die Thinkpad-Fn-Tasten wiederbeleben</title><link href="https://www.dj-bauer.de/die-thinkpad-fn-tasten-wiederbeleben.html" rel="alternate"/><published>2019-05-05T11:51:00+02:00</published><updated>2019-05-05T11:51:00+02:00</updated><author><name>Daniel Bauer</name></author><id>tag:www.dj-bauer.de,2019-05-05:/die-thinkpad-fn-tasten-wiederbeleben.html</id><summary type="html">&lt;p&gt;In diesem post beschreibe ich, wie ich den Fn Tasten meines Thinkpads wieder ihre Funtkion gebe&lt;/p&gt;</summary><content type="html">&lt;p&gt;Vielleicht passiert es auch anderen, wenn sie auf einen Windowmanager, wie i3 wechseln, dass ihre Funktion-Tasten, wie laut-leiser oder Bildschirhelligkeit auf einmal nicht mehr Funktionieren. Dies war leider auch bei mir der Fall. Deshalb werde ich in diesem Post beschreiben, wie ich meine Bildschirmhelligkeit wieder einfach steuern kann.&lt;/p&gt;
&lt;p&gt;Die Bildschirmhelligkeit ist in der datei &lt;em&gt;/sys/class/backlight/intel_backlight/brightness&lt;/em&gt; zu finden/setzten.
Die maximale Helligkeit konnte ich in der der Datei &lt;em&gt;/sys/class/backlight/intel_backlight/max_brightness&lt;/em&gt; finden.
Es kann sein, dass bei anderen Laptops der devicename (in meinem Fall intel_backlight) anders ist.&lt;/p&gt;
&lt;p&gt;Zuerst habe ich ein Script geschrieben, mit welchem ich die Bildschirmhelligkeit setzen bzw. erhöhen/verringern kann&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="c1"&gt;#Die maximale Helligkeit auslesen&lt;/span&gt;
&lt;span class="nv"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/sys/class/backlight/intel_backlight/max_brightness&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#Zeigt usage and und beendet das Programm&lt;/span&gt;
error&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;usage: changeBrightness.sh [-s|-c] [value]&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;error
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-s&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-c&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;#Die aktuelle Helligkeit auslesen&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/sys/class/backlight/intel_backlight/brightness&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;#Aufaddieren&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;error
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-lt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$max_value&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$max_value&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

sudo&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/sys/class/backlight/intel_backlight/brightness
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dann habe ich in meine &lt;em&gt;~/.config/i3/config&lt;/em&gt; noch die Keybindings ergänzt.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;bindsym&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;XF86MonBrightnessDown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sudo $HOME/.scripts/backlight.sh -c -100&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;bindsym&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;XF86MonBrightnessUp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sudo $HOME/.scripts/backlight.sh -c 100&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Und schon war ich fertig! Na ja fast. Da man das Script nur mit sudo aufrufen kann  musste ich in meiner &lt;em&gt;/etc/sudoers&lt;/em&gt; eine Zeile ergänzen, die es meinem User erlaubt dieses Script ohne auszuführen.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;dbauer ALL=NOPASSWD: /home/dbauer/.scripts/backlight.sh
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Und nun ist es fertig. Dies kann man selbstverständlich für alle Tasten/Funktionen machen, die man nicht (mehr) hat oder haben will.&lt;/p&gt;</content><category term="Ricing"/><category term="i3"/><category term="thinkpad"/></entry></feed>