diff --git a/20210625/bs-20210625.pdf b/20210625/bs-20210625.pdf
index be8b653380582c395fd0e4e41e8063084452df0f..0fe477fbd343c6ae3c99907c00f3f875ae734299 100644
Binary files a/20210625/bs-20210625.pdf and b/20210625/bs-20210625.pdf differ
diff --git a/20210625/bs-20210625.tex b/20210625/bs-20210625.tex
index 060f9646dc4e5c98f4c834299ba723aa5a1f4b26..16870ce4950e9d5bf3dcb55b115e7daaccb80ffc 100644
--- a/20210625/bs-20210625.tex
+++ b/20210625/bs-20210625.tex
@@ -669,7 +669,7 @@
 
 \end{frame}
 
-\setlength{\pdfpageheight}{40.5cm}
+\setlength{\pdfpageheight}{50.5cm}
 
 \begin{frame}[fragile]
 
diff --git a/20210702/bs-20210702.txt b/20210702/bs-20210702.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fd6949f826daba63232dc2decd38fb5f01b597ea
--- /dev/null
+++ b/20210702/bs-20210702.txt
@@ -0,0 +1,116 @@
+Scheduler des Linux-0.01-Kernels, 02.07.2021, 11:39:30
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Aufgabe: Welcher Task kommt als nächster an die Reihe?
+
+Tabelle von Structs: task_struct
+Datenfelder:
+ - state: Will dieser Task überhaupt Rechenzeit haben?
+ - counter: aktuelle (dynamische) Priorität des Tasks
+ - priority: Priorität des Tasks
+
+p ist ein Zeiger auf Zeiger von task_structs,
+  also ein Array von Zeigern auf task_structs.
+
+Task Nr. 0 ist der "idle task".
+
+p wird so initialisiert, daß er auf dem ersten Eintrag des
+  task-Arrays zeigt, der nicht mehr(!) zum Array gehört.
+In der Schleife wird dann als erstes --i und --p ausgeführt.
+
+Das innere "if" wird nur ausgeführt, wenn der Zeiger(!) "*p"
+kein NULL-Zeiger ist.
+
+  int counter[n] = { ... };
+  int c = -1;
+  for (int i = 0; i < n; i++)
+    if (counter[i] > c)
+      c = counter[i];
+
+--> c hat den Wert des Maximums aller counter[i].
+
+Was bewirkt das Komma in der Zeile "c = (*p)->counter, next = i;"?
+--> Komma-Operator: "a,b" bedeutet: "berechne a, vergiß es wieder,
+    und berechne stattdessen b."
+    Nur sinnvoll in Kombination mit Seiteneffekten!
+    "c = (*p)->counter" ist ein Ausdruck mit dem Wert "(*p)->counter"
+    und dem Seiteneffekt, daß dieser Wert der Variablen c zugewiesen wird.
+
+Andere Schreibweise für die innere Schleife:
+
+  while (i >= 1)
+    {
+      i--;
+      p--;
+      if (*p)
+        if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
+          {
+            c = (*p)->counter;
+            next = i;
+          }
+    }
+
+Nach der inneren while-Schleife enthält
+next die Nummer des Tasks mit der höchsten Priorität (counter)
+und c den counter dieses Tasks (also die höchste Priorität selbst)
+
+Sobald alle counter abgelaufen sind, bekommen sie
+in der for-Schleife neue Werte zugewiesen
+gemäß der jeweiligen Priorität der Tasks.
+Tasks, die nicht TASK_RUNNING sind, können noch counter > 0 haben
+und bekommen die Priorität zusätzlich darauf addiert.
+--> Der Counter kann über alle Maßen wachsen. (Oder????;-)
+Nein, denn der "angesparte" Counter wird vorher halbiert (">> 1").
+--> Der Counter kann bis zu einem gewissen Maximum wachsen
+    (dem Doppelten der Priorität des Tasks).
+--> Durch Abwarten kann ein Task Rechenzeit ansparen.
+    Wenn er dann doch läuft, hat er direkt hohe Priorität.
+--> Sinnvoll für interaktive Programme (z.B. Editor).
+
+--> Dynamische Prioritätenvergabe (nicht echtzeitfähig)
+
+Signal, 02.07.2021, 13:35:22
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Messenger mit Ende-zu-Ende-Verschlüsselung
+
+Freie Software (Client und Server)
+zentrale Infrastruktur
+Signal Foundation betreibt zentrale Server
+
+Auch die Meta-Daten werden verschlüsselt.
+Der Empfänger einer Nachricht ist dem Server bekannt,
+aber der Absender nur dem Empfänger.
+
+Die Server werden in Clouds betrieben bei Amazon, Microsoft usw.
+
+Es gibt Vertraulichkeit, Integrität und plausible deniability
+
+Man kann über Signal auch "telefonieren".
+
+Wer teilnimmt, hat einen privaten Schlüssel.
+Um eine Nachricht zu versenden, benötigt man
+eine ID des Empfängers (Telefonnummer).
+Darüber holt man sich den Public Key.
+Schlüsselabgleich erfolgt über den Abgleich einer Sicherheitsnummer,
+die aus beiden Public Keys gemeinsam gebildet wird.
+
+Zur Registrierung benötigt man eine Telefonnummer,
+über die man SMS oder Sprachanrufe empfangen kann.
+Darüber erfährt man einen Verifizierungs-Code, den man
+währnd der Installation der Client-Software eingeben muß.
+Man kann seinen Signal-Account zusätzlich durch eine PIN schützen.
+
+Versenden einer verschlüsselten Nachricht:
+ - Austausch eines Sitzungsschlüssels per Diffie-Hellman
+ - Vermutung: Die asymmetrischen Schlüssel dienen dazu,
+   Man-in-the-Middle-Angriffe zu verhindern.
+
+Projekt: Signal-Bot
+Raspberry Pi mit Signal-CLI
+Dieser soll Nachrichten versenden, die von anderen Programmen stammen
+und empfangene Nachrichten an Programme weiterleiten.
+Wichtig: dedizierte Telefonnummer
+
+
+Verbesserungsmöglichkeiten für BBB, 02.07.2021, 14:07:31
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In Kombination mit Mumble: anzeigen, wer gerade spricht
diff --git a/20210709/bs-20210709.txt b/20210709/bs-20210709.txt
new file mode 100644
index 0000000000000000000000000000000000000000..85a6382c0df759984d80f337a82aae9c94728275
--- /dev/null
+++ b/20210709/bs-20210709.txt
@@ -0,0 +1,173 @@
+Echtzeit-Erweiterungen für Linux, 09.07.2021, 11:42:17
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - früher: RTAI (Real Time Application Interface)
+
+   Der RTAI-Kernel läuft als "Sub-Kernel" direkt auf der Hardware.
+   Der Linux-Kernel läuft als "Applikation" im RTAI-Kernel.
+   Kommunikation zwischen Echtzeit-Tasks und Linux-Prozessen
+   erfolgt mittels Semaphoeren.
+
+ - früher: RT-Linux
+
+ - aktuell: Xenomai
+
+do-while(0)-Schleife, 09.07.2021, 12:05:38
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Definition:
+
+  #define spin_lock_mutex(lock, flags) \
+    do \
+      { \
+        spin_lock (lock); \
+        (void) (flags); \
+      } \
+    while (0)
+
+Benutzung:
+
+  if (whatever)
+    spin_lock_mutex (lock, flags);    // Semikolon!
+  else
+    whatever ();
+
+Wird zu:
+
+  if (whatever)
+    do
+      {
+        spin_lock (lock);
+        (void) (flags);
+      }
+    while (0);    // Semikolon!
+  else
+    whatever ();
+
+Definition:
+
+  #define spin_lock_mutex(lock, flags) \
+    { \
+      spin_lock (lock); \
+      (void) (flags); \
+    }
+
+Benutzung:
+
+  if (whatever)
+    spin_lock_mutex (lock, flags);    // Semikolon!
+  else
+    whatever ();
+
+Wird zu:
+
+  if (whatever)
+    {
+      spin_lock (lock);
+      (void) (flags);
+    };    // Semikolon! --> Fehler
+  else
+    whatever ();
+
+Definition:
+
+  #define spin_lock_mutex(lock, flags) \
+    spin_lock (lock); \
+    (void) (flags)
+
+Benutzung:
+
+  if (whatever)
+    spin_lock_mutex (lock, flags);    // Semikolon!
+  else
+    whatever ();
+
+Wird zu:
+
+  if (whatever)
+    spin_lock (lock);
+    (void) (flags);    // Semikolon! --> Fehler
+  else
+    whatever ();
+
+Fazit: do ... while(0) ist ein Trick, um ein Präprozessor-Macro
+so definieren zu können, daß es in allen Situationen wie eine
+Funktion verwendet werden kann.
+
+F. Aust, P. Maas: Signal-Bot, 09.07.2021, 13:35:29
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+https://gitlab.cvh-server.de/faust/signalbot
+
+Der Bot protokolliert und interpretiert alle Nachrichten, die er bekommt.
+Nachrichten, die mit einem Punkt beginnen, sind Befehle.
+
+Beipiel:
+  .help
+  .foo --> bar
+  .ping --> pong
+
+Herausforderung: über die Kommandozeile laufen lassen
+python-Skript benutzt signal-CLI. Die benutzt Java. Langsam: 90s
+Jetzt: läuft per systemd im Hintergrund --> Java läuft durch. --> schnell
+
+Funktionen:
+
+ - .yn --> zufällige GIF-Datei von yes-no-wtf
+
+ - Zitate in Datenbank speichern
+
+ - Der Bot informiert den Kanal automatisch aktuell kostenlose Computerspiele.
+
+ - Projekt: .gn: Der Bot prüft den Chat auf Gender-Neutralität, weist auf
+   nicht-neutrale Wörter hin und schlägt gener-neutrale Synoyme vor - unter
+   Verwendung von geschicktgendern.de.
+
+ - Projekt: Signal selbst unterstürzt bereits Polls, sog. Reactions.
+   zusätzlich: cvhbot-Polls durch den Bot
+
+ - Projekt: MQTT-To-Signal-Adapter (separates Programm, sagt dem Bot bescheid)
+
+Es ist möglich, mehrere Bots auf demselben Server laufen zu lassen,
+sofern jeder Bot eine eigene Telefonnummer hat.
+Alternative: Die Reaktion des Bots hängt vom Ursprung
+des Befehls ab (Benutzer, Gruppe).
+
+Der Bot kommt bei den Benutzern gut an.
+
+Nachteile von Signal:
+ - zentraler Server
+ - App im Ruhemodus erfährt nicht von neuen Nachrichten
+   (Konfiguration der Stromsparmaßnahmen unter Android hilft nicht.)
+
+Projektideen:
+ - Signal beibringen, auch im Hintergrund Nachrichten zu empfangen
+ - Signal mit Mumble-Chat koppeln
+ - Signal mit BBB-Chat koppeln
+ - Matrix als "Sammelstelle"
+
+S. Simanek: Forums-Projekt, 09.07.2021, 14:25:09
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Forum für Studierende, aber auch Lehrende, für den Austausch über
+Studieninhalte, für Austausch mit der Fachschaftsvertretung, aber
+auch für Off-Topic-Gespräche (als Alternative to Discord usw.)
+
+Situation: Auf dem CVH-Server gibt es bereits eine
+Discourse-Installation. Die müßte man wieder in Betrieb nehmen.
+
+Abgrenzung zu Signal:
+ - Signal ist ein Messenger-Dienst - Echtzeit-Kommunikation -
+   wie SMS mit Gruppen - nach Personen(gruppen) sortiert.
+   Signal ist nicht anonym.
+ - Forum: offline-Kommunikation
+   Ein Forum ist nach Themen sortiert.
+   Ein Forum kann pseudonym sein.
+
+Vorschläge für die Struktur des Forums:
+ - Start-Subforum mit FAQs und Übersicht
+ - fachspezifische Subforen
+ - organisatorische Subforen: Ankündigungen der Fachschaftsvertretung usw.
+ - Off-Topic-Subforen
+ 
+Sonstiges:
+ - Fachschaftsvertretung mit einbinden!
+ - Maßnahmen gegen Trolle und Spammer! --> Moderation erforderlich
+ - Gelder für Moderatoren beantragen: diversitätssensible Studieneigangsphase
+ - Wichtig für nachhatltige IT: Lizenzen, Datenschutz