diff --git a/20210514/bs-20210514.txt b/20210514/bs-20210514.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c11bfa49d1a3347fa18970cb973512926af2c5a5
--- /dev/null
+++ b/20210514/bs-20210514.txt
@@ -0,0 +1,130 @@
+Projektideen, 14.05.2021, 11:39:44
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Janus WebRTC
+    - Warum brach am 10.5.2021 die Bildübertragung per Janus
+      bei ca. 130 Teilnehmenden zusammen?
+    - Was kann man dagegen tun?
+    - Zum Testen: Pool-Rechner
+
+ * Streaming
+    - Problem: WebRTC (Echtzeit) überlastet die Server.
+    - Mögliche Lösung: Echtzeit-Bildschirm "abfilmen" und streamen
+    - Ziel: Online-Konferenzsystem,
+      bei dem ein Teil des Publikums aktiv teilnehmen kann
+      (in Echtzeit, ca. 50 Teilnehmende)
+      und alle anderen (1000+) per Streaming (mit leichter Verzögerung)
+      zumindest passiv zuschauen und zuhören können
+    - Software: z.B. IceCast
+    - Zum Testen: Pool-Rechner
+
+ * Mumble-Web-Interface
+    - Problem: Das Mumble-Web-Interface überlastet den Server.
+    - Ursache:
+      Der Web-Client spricht nicht direkt mit Mumble,
+      sondern per WebSocket mit seinem Server.
+      Der Server muß dann zwischen dem WebSocket und Mumble vermitteln.
+
+ * VNC-Web-Interface
+    - Problem: Es hat funktioniert, aber es war langsam.
+    - Ursache:
+      Der Web-Client spricht nicht direkt mit VNC,
+      sondern per WebSocket mit seinem Server.
+      Der Server muß dann zwischen dem WebSocket und VNC vermitteln.
+
+ * Mögliche Lösung: effizienteres websockify
+    - Aktuelle Implementierungen: python, node.js
+    - Idee: In C programmieren.
+      https://github.com/mittorn/websockify-c - ohne SSL,
+      aber um SSL kümmert sich ja der Web-Server (Proxy)
+    - Idee: node.js-Version verwenden.
+      node.js ist nur um den Faktor 1.5 langsamer als C, python ca. 10mal
+      https://benchmarksgame-team.pages.debian.net/benchmarksgame/which-programs-are-fastest.html
+
+ * Weitere Lösungsideen
+    - auf mehrere Server verteilen
+    ? TigerVNC: effizienter gestalten: Scroll-Algorithmus
+    ? x11vnc: effizienter gestalten: Scroll-Algorithmus
+    ? noVNC: effizienter gestalten: WebAssembly
+    ? noVNC: effizienter gestalten: Scroll-Algorithmus
+
+Daten zu PULT-Nutzung, 14.05.2021, 11:51:32
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Mumble-Web-Interface: websockify python-3
+  websockify auf main-0: 3% CPU-Last pro Instanz am 10.5.2021
+  websockify auf main-0: 2.5% bis 4.0% CPU-Last pro Instanz am 14.5.2021
+
+VNC-Web-Interface: websockify python-2.7, TigerVNC
+  websockify auf streaming: 1% CPU-Last pro Instanz am 10.5.2021
+  websockify auf streaming: 2.5% CPU-Last pro Instanz am 14.5.2021
+  TigerVNC auf streaming: 50% bis 64% CPU-Last mit 13 Instanzen am 14.5.2021
+  TigerVNC auf streaming: 40% bis 45% CPU-Last mit 7 Instanzen am 14.5.2021
+  TigerVNC auf streaming: 90% bis 97% CPU-Last mit ~120 Instanzen am 14.5.2021
+
+Von der Anwendung bis zum Kernel: libc, 14.05.2021, 14:17:04
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+$ gcc -Wall -O -g3 hello-1.c -o hello-1
+$ gdb -tui ./hello-1
+(gdb) b 5  # setze Breakpoint vor printf()-Aufruf
+(gdb) run
+(gdb) step  # springe in die aufgerufene Funktion hinein
+(gdb) directory libc/glibc-2.28/libio  # Verzeichnis für Quelltext mitteilen
+--> _IO_puts()
+(gdb) next  # 1 Zeile ausführen
+--> _IO_sputn()  # springe in die aufgerufene Funktion hinein
+--> IO_validate_vtable()  # In dieser Funktion landen wir stattdessen.
+--> return vtable;
+--> "Hello, world!\n" erscheint auf dem Bildschirm.
+--> ???
+
+_IO_sputn() ist keine Funktion, sondern ein Präprozessor-Makro,
+der _IO_XSPUTN() aufruft.
+
+_IO_XSPUTN() ist keine Funktion, sondern ein Präprozessor-Makro,
+der JUMP2() aufruft und zusätzlich __xsputn
+als ersten Parameter übergibt.
+
+JUMP2() ist keine Funktion, sondern ein Präprozessor-Makro,
+der die Funktion _IO_JUMPS_FUNC(THIS)->FUNC() aufruft
+und zusätzlich THIS als ersten Parameter übergibt.
+FUNC hat hierbei den Wert __xsputn, und
+THIS hat den Wert FP, also die Datei, hier also stdout.
+
+_IO_JUMPS_FUNC() ist keine Funktion, sondern ein Präprozessor-Makro,
+der ...
+
+# define _IO_JUMPS_FUNC(THIS) \
+  (IO_validate_vtable                                                   \
+   (*(struct _IO_jump_t **) ((void *) &_IO_JUMPS_FILE_plus (THIS)       \
+                             + (THIS)->_vtable_offset)))
+
+... prüft, ob die virtuelle Methodentabelle (vtable) in Ordnung ist
+und einen Zeiger darauf zurückliefert.
+Anschließend kann JUMP2() die tatsächliche Funktion __xsputn() aufrufen.
+
+Gesamtergebnis:
+
+_IO_sputn() ist eine virtuelle Methode der Datei.
+THIS hat den Wert der Datei, hier also stdout.
+
+...
+--> return vtable;
+--> _IO_new_file_xsputn()
+# --> _IO_OVERFLOW (f, EOF)
+# --> IO_valudate_vtable()  # Aufruf einer virtuellen Methode
+# --> _IO_new_file_overflow()
+# --> _IO_do_write (f, ...)  # Präprozessor-Makro für ...
+# --> _IO_new_do_write (f, ...)
+_IO_default_xsputn (f, ...)
+--> _IO_OVERFLOW (f, EOF)
+--> IO_valudate_vtable()  # Aufruf einer virtuellen Methode
+--> _IO_new_file_overflow()
+--> _IO_do_write (f, ...)  # Präprozessor-Makro für ...
+--> _IO_new_do_write (f, ...)
+... Schleife ...
+Datei fileops.c, Zeile 791
+--> _IO_new_do_write (f, ...)
+--> new_do_write (f, ...)
+--> _IO_SYSWRITE (fp, ...)
+--> __libc_write()
+Datei sysdeeps/unix/sysv/linux/write.c, Zeile 26
+--> return SYSCALL_CANCEL (write, fd, buf, nbytes);
diff --git a/20210514/hello-1.c b/20210514/hello-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac
--- /dev/null
+++ b/20210514/hello-1.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int main (void)
+{
+  printf ("Hello, world!\n");
+  return 0;
+}
diff --git a/20210514/hello-2.c b/20210514/hello-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b767f77cd3a7328e5f45b60e674d32a647386509
--- /dev/null
+++ b/20210514/hello-2.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int main (void)
+{
+  puts ("Hello, world!");
+  return 0;
+}
diff --git a/20210514/hello-3.c b/20210514/hello-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..e94ca36ea31d1cda0d9f38d132cf59fc21c08fb8
--- /dev/null
+++ b/20210514/hello-3.c
@@ -0,0 +1,12 @@
+extern int puts (char *s);
+
+void printf (void)
+{
+  puts ("Hello, world!");
+}
+
+int main (void)
+{
+  printf ();
+  return 0;
+}
diff --git a/20210514/verbinde-video-1.txt b/20210514/verbinde-video-1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..aa25ed6cbcadb114bdbde3aa6b6b5de580a6bdd0
--- /dev/null
+++ b/20210514/verbinde-video-1.txt
@@ -0,0 +1,30 @@
+streaming/home/pult/vnc6> DISPLAY=:6 HOME=`pwd` xwininfo -root -children
+
+xwininfo: Window id: 0x394 (the root window) (has no name)
+
+  Root window id: 0x394 (the root window) (has no name)
+  Parent window id: 0x0 (none)
+     20 children:
+     0x1600088 (has no name): ("ssvncviewer" "Ssvnc")  1920x1080+0+0  +0+0
+     0x12003df "janus-1 Camera 0": ("display-im6.q16" "Display-im6.q16")  480x360+1440+720  +1440+720
+     0x20012a "Xpdf: /home/pult/vnc6/vnc-testbild.pdf": ("win" "Xpdf")  1920x1080+0+0  +0+0
+     0x12009ba "Pan Icon": ("display-im6.q16" "Display-im6.q16")  96x72+960+960  +960+960
+     0x12008c4 "Magnify 3X": ("display-im6.q16" "Display-im6.q16")  256x256+960+960  +960+960
+     0x12007c5 (has no name): ("display-im6.q16" "Display-im6.q16")  1x1+960+960  +960+960
+     0x12006cb (has no name): ("display-im6.q16" "Display-im6.q16")  1x1+960+960  +960+960
+     0x12005d1 "Commands": ("display-im6.q16" "Display-im6.q16")  134x410+960+670  +960+670
+     0x12001f3 (has no name): ("display-im6.q16" "Display-im6.q16")  96x72+960+960  +960+960
+     0x1600081 "chat": ("chat" "Ssvnc")  410x359+0+0  +0+0
+     0x600251 (has no name): ()  1x1+3+2  +3+2
+     0x3a2 (has no name): ()  100x100+0+0  +0+0
+     0x20013f "Xpdf: Print": ("printDialog_popup" "Xpdf")  5x5+0+0  +0+0
+     0x20013e "Xpdf: Find": ("findDialog_popup" "Xpdf")  5x5+0+0  +0+0
+     0x200130 "Xpdf: About": ("aboutDialog_popup" "Xpdf")  450x300+0+0  +0+0
+     0x200116 (has no name): ()  5x5+0+0  +0+0
+     0x20010e "Xpdf: Password": ("passwordDialog_popup" "Xpdf")  5x5+0+0  +0+0
+     0x400001 (has no name): ()  10x10+-100+-100  +-100+-100
+     0x200002 (has no name): ()  1x1+0+0  +0+0
+     0x200001 "xpdf.real": ("xpdf.real" "Xpdf")  1x1+0+0  +0+0
+
+streaming/home/pult/vnc6> DISPLAY=:6 HOME=`pwd` xdotool windowraise 0x12003df
+streaming/home/pult/vnc6>