WEBVTT

00:00:00.000 --> 00:00:05.860
Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Paisen-Podcast, heute die 26. Episode, wir haben den 1. Dezember.

00:00:06.580 --> 00:00:11.420
Jochen, wir sind heute genau zwei Jahre, vor genau zwei Jahren haben wir die erste rausgebracht.

00:00:11.440 --> 00:00:12.460
Oh, ja richtig, das stimmt.

00:00:13.520 --> 00:00:16.240
2018, am 1. Dezember kam unsere erste Episode raus.

00:00:16.860 --> 00:00:17.060
Ja.

00:00:17.440 --> 00:00:19.020
Ja, nicht schlecht, oder? Zweiter Geburtstag.

00:00:19.040 --> 00:00:20.580
Zwei Jahre, meine Güte, ist das schon wieder lange her.

00:00:20.600 --> 00:00:23.880
Nicht so schlecht, wir haben sogar durchschnittlich mehr als eine Folge dann pro Monat aufgenommen.

00:00:24.400 --> 00:00:26.580
Und wenn wir die noch zählen, die wir weggeschmissen haben, sind wir sogar bei.

00:00:26.580 --> 00:00:35.300
Ja, ich glaube, wir haben uns verzählt ab und zu. Ich weiß nicht, ob das wirklich genauso viele sind. Also 27 ist jetzt die Zahl, aber es kann sein, dass wir irgendwie Dinge unterschlagen haben.

00:00:35.560 --> 00:00:37.200
Ja, ich glaube, 26 ist offiziell jetzt.

00:00:37.440 --> 00:00:38.880
Kann auch sein. Ich weiß es nicht genau.

00:00:38.940 --> 00:00:42.720
Ja, hallo, hallo. Schön, dass ihr wieder eingeschaltet habt. Heute machen wir Async Teil 2.

00:00:42.960 --> 00:00:43.200
Ja.

00:00:43.520 --> 00:00:45.020
Und wir haben dabei den Johannes.

00:00:45.680 --> 00:00:45.920
Hallo.

00:00:46.040 --> 00:00:46.180
Hallo.

00:00:47.400 --> 00:00:55.460
Ja, wir wollten auch wieder ein bisschen News machen und euch ein bisschen entschädigen für die ganzen Folgen, wo wir das so ein bisschen…

00:00:55.460 --> 00:00:56.940
Ja, wir haben uns ja immer so viel vorgenommen,

00:00:57.220 --> 00:00:58.140
was wir eigentlich machen wollten.

00:00:59.260 --> 00:01:00.760
Module aus der Standardbibliothek vorstellen,

00:01:01.320 --> 00:01:02.980
Pics und so, das machen wir dann nie, weil

00:01:02.980 --> 00:01:04.520
irgendwie immer zu wenig Zeit ist und wir

00:01:04.520 --> 00:01:07.220
die ganze Zeit brauchen, um unser Audio-Setup hinzukriegen.

00:01:07.240 --> 00:01:08.960
Ja, genau, und dann muss am Ende irgendwie

00:01:08.960 --> 00:01:11.120
jemand wieder ins Bett und dann müssen wir leider immer aufhören.

00:01:11.600 --> 00:01:12.320
Ja, genau.

00:01:13.000 --> 00:01:14.680
Genau, machen wir das diesmal.

00:01:16.020 --> 00:01:17.160
Ja, also

00:01:17.160 --> 00:01:18.840
zum Beispiel eine Geschichte, die ich

00:01:18.840 --> 00:01:20.760
eigentlich dann erwähnen wollte,

00:01:20.760 --> 00:01:23.000
wir hatten ja vorletztes Mal, glaube ich,

00:01:23.040 --> 00:01:24.880
was zu Python 3.9 erzählt

00:01:24.880 --> 00:01:26.840
und eine ganz wichtige Geschichte habe ich vergessen.

00:01:27.860 --> 00:01:28.800
Und zwar ist in

00:01:28.800 --> 00:01:30.920
Python 3.9 Topological

00:01:30.920 --> 00:01:32.820
Sort schon mit in der

00:01:32.820 --> 00:01:34.740
Standardbibliothek. Topological Sort.

00:01:35.580 --> 00:01:37.060
Jetzt bin ich natürlich wieder der Blöde,

00:01:37.160 --> 00:01:38.480
der keine Ahnung hat, was das ist. Also

00:01:38.480 --> 00:01:40.440
was ist bitte Topological Sort?

00:01:43.560 --> 00:01:44.600
Jochen weiß es auch nicht.

00:01:45.000 --> 00:01:45.660
Das ist nur cool.

00:01:46.620 --> 00:01:47.460
Nee, das ist

00:01:47.460 --> 00:01:50.620
wenn man jetzt

00:01:50.620 --> 00:01:52.660
einen Graphen, also wenn man zum Beispiel

00:01:52.660 --> 00:01:54.680
Abhängigkeiten hat und die sortieren möchte, also wenn man sich zum Beispiel

00:01:54.680 --> 00:01:56.240
anzieht und dann irgendwie

00:01:56.240 --> 00:01:58.700
dran denken möchte, dass man irgendwie

00:01:58.700 --> 00:02:00.800
bevor man, weiß ich nicht,

00:02:00.940 --> 00:02:02.720
die Schuhe anzieht, die Socken angezogen haben

00:02:02.720 --> 00:02:04.860
muss, dann ist das Problem

00:02:04.860 --> 00:02:06.540
sozusagen, das allgemeine Problem dazu ist

00:02:06.540 --> 00:02:08.520
topological sort oder

00:02:08.520 --> 00:02:10.600
topologische Sortierung, keine Ahnung.

00:02:10.980 --> 00:02:12.240
Gibt es auch beim Projektmanagement, glaube ich.

00:02:13.520 --> 00:02:14.460
Gibt es überall, wo es grafen.

00:02:14.820 --> 00:02:14.980
Ja.

00:02:16.860 --> 00:02:18.580
Zum Beispiel auch ganz wichtiger Angelegenheit,

00:02:18.660 --> 00:02:20.640
da habe ich selber zum, da wusste ich noch nicht, dass es

00:02:20.640 --> 00:02:22.680
das ist und habe selber

00:02:22.680 --> 00:02:24.700
überlegt, was das für ein Problem sein könnte. Nach ganz,

00:02:24.800 --> 00:02:26.500
ganz lange Überlegen bin ich dann drauf gekommen, es könnte

00:02:26.500 --> 00:02:28.540
irgendwas mit Graphen zu tun haben und dann sortieren.

00:02:29.340 --> 00:02:30.580
Und irgendwann hat mir jemand gesagt,

00:02:30.640 --> 00:02:32.420
ja, das ist doch Topological Sort. Dann habe ich mich

00:02:32.420 --> 00:02:33.440
ziemlich blöd gefühlt, aber

00:02:33.440 --> 00:02:36.220
zwar wenn man die

00:02:36.220 --> 00:02:38.300
Abhängigkeiten von Programmen

00:02:38.300 --> 00:02:40.440
oder Paketen, die man installieren

00:02:40.440 --> 00:02:42.220
möchte, sortieren möchte, da braucht man das dann auch.

00:02:43.060 --> 00:02:43.140
Ja.

00:02:45.900 --> 00:02:46.260
Genau.

00:02:46.820 --> 00:02:47.940
Das ist jetzt mit drin, einfach so?

00:02:48.280 --> 00:02:49.800
Das ist jetzt in der Standardbibliothek mit drin.

00:02:50.040 --> 00:02:51.580
Batteries included, sage ich ja nur.

00:02:52.200 --> 00:02:56.820
Ja, Graflip heißt das Modul, oder?

00:02:57.000 --> 00:03:00.100
Ja, ja, genau.

00:03:01.340 --> 00:03:02.600
Heute ist übrigens auch Advent of Code,

00:03:02.720 --> 00:03:04.300
der Teil 1, rausgekommen.

00:03:05.080 --> 00:03:05.620
Macht ihr das noch?

00:03:05.640 --> 00:03:07.700
Worum geht es denn dieses Mal beim Advent of Code, Dominik?

00:03:07.880 --> 00:03:09.220
Das habe ich noch nicht so ganz rausgefunden.

00:03:09.300 --> 00:03:11.540
Ich glaube, irgendjemand möchte in Urlaub fahren auf eine Insel,

00:03:12.080 --> 00:03:14.200
weil er schon fünf Jahre lang versucht hat, da hinzubekommen.

00:03:14.300 --> 00:03:17.620
Und dann muss er irgendwie seine Abrechnung richtig machen,

00:03:17.700 --> 00:03:18.720
dass er da hinkommt.

00:03:19.080 --> 00:03:20.460
Ich finde, die letzten Jahre fand ich auch sehr interessant.

00:03:20.460 --> 00:03:22.340
dann ging es ja irgendwie um Weihnachtswichtel

00:03:22.340 --> 00:03:24.220
und die Reise durchs Weltall mit dem Santa

00:03:24.220 --> 00:03:25.220
und so. Ja, genau.

00:03:27.020 --> 00:03:28.320
Okay, mit dem Raumschiff, was

00:03:28.320 --> 00:03:30.420
ein Interpreter braucht, den man dann selber programmieren musste.

00:03:30.740 --> 00:03:31.980
Ja, genau, dann haben wir Opcodes und so, ne?

00:03:36.500 --> 00:03:38.020
Ja, also Entschuldigung, das ist eine coole Sache.

00:03:38.820 --> 00:03:40.020
Da kann man dann allen möglichen

00:03:40.020 --> 00:03:41.320
Programmiersprachen machen natürlich und

00:03:41.320 --> 00:03:42.980
hallo.

00:03:44.040 --> 00:03:45.900
Das ist auch hauptsächlich so für einen selbst, oder?

00:03:46.020 --> 00:03:48.200
Also es ist ja nicht irgendwie gewertet oder so,

00:03:48.200 --> 00:03:50.400
sondern es ist ja nur...

00:03:50.460 --> 00:03:53.000
Ja, ich kenne es gar nicht.

00:03:54.460 --> 00:03:56.860
Ja, es sind einfach 24 Programmieraufgaben,

00:03:56.940 --> 00:03:58.620
üblicherweise zweigeteilt in zwei Teile.

00:03:59.520 --> 00:04:02.260
Und die sind immer von der Sorte, hier ist ein kleines Beispiel

00:04:02.260 --> 00:04:04.800
und hier ist eine große Eingabemenge.

00:04:04.960 --> 00:04:07.300
Und wenn du die Antwort weißt, dann tippst du hier in dieses Feld ein.

00:04:08.660 --> 00:04:11.180
Und dann kannst du quasi überprüfen,

00:04:11.280 --> 00:04:12.920
ob du die richtige Lösung gefunden hast.

00:04:13.780 --> 00:04:14.980
Ah, okay, ja.

00:04:16.200 --> 00:04:18.040
Und das ist eigentlich immer ganz nett.

00:04:18.040 --> 00:04:20.100
Das ist sehr nett gemacht, das ist sehr aufwendig

00:04:20.100 --> 00:04:21.780
gestaltet und wir haben immer schöne Story.

00:04:22.120 --> 00:04:23.840
Genau, man muss ja immer einen Stern sammeln pro Tag,

00:04:23.920 --> 00:04:25.520
pro Aufgabe, also zwei Sterne am Tag.

00:04:25.760 --> 00:04:26.440
Zwei Sterne, genau.

00:04:27.080 --> 00:04:28.540
Für 48, 50 sogar, oder?

00:04:29.280 --> 00:04:30.660
24, kriegt man 25 auch noch ein?

00:04:32.120 --> 00:04:33.300
Nö. Also, ja,

00:04:33.700 --> 00:04:34.100
zweimal 24.

00:04:36.100 --> 00:04:37.260
Ich glaube, 48 dann.

00:04:37.900 --> 00:04:39.740
Ach so, und das geht auch zurück, also man kann auch bis

00:04:39.740 --> 00:04:41.700
2015 zurückgucken

00:04:41.700 --> 00:04:43.340
und sich die ganzen alten Aufgaben

00:04:43.340 --> 00:04:45.240
ansehen.

00:04:46.140 --> 00:04:47.260
Das ist sehr nett, also

00:04:47.260 --> 00:04:49.100
selber ausprobieren und dann halt gucken, ob man

00:04:49.100 --> 00:04:51.400
die Aufgaben lösen kann. Die werden am Anfang

00:04:51.400 --> 00:04:53.240
sind die noch etwas einfach.

00:04:53.760 --> 00:04:55.220
Die gehen aber schnell wirklich in die Zeit.

00:04:55.580 --> 00:04:57.460
Ich habe sogar einen Post gelesen von Peter Norweg,

00:04:57.560 --> 00:04:59.300
der sagt, das ist ja eigentlich schon sehr geil, aber

00:04:59.300 --> 00:05:00.320
so viel Zeit hat er dann auch nicht.

00:05:02.200 --> 00:05:02.560
Aber ja.

00:05:03.040 --> 00:05:05.340
Das ist auch bei mir immer so das Problem. Ich mache da gerne

00:05:05.340 --> 00:05:07.400
mit und dann irgendwann fühlt

00:05:07.400 --> 00:05:09.080
es sich an wie Arbeit und dann höre ich es dann wieder auf.

00:05:12.480 --> 00:05:13.420
Ja, aber es ist auf jeden Fall

00:05:13.420 --> 00:05:15.500
sehr zu empfehlen. Für alle

00:05:15.500 --> 00:05:18.580
Stufen ist was dabei. Die ersten Aufgaben

00:05:18.580 --> 00:05:20.500
sind einfacher, die kriegt man schnell durch und die

00:05:20.500 --> 00:05:22.500
so ab dann fünf oder so

00:05:22.500 --> 00:05:24.480
oder sechs oder zehn oder zwölf wird es dann

00:05:24.480 --> 00:05:26.380
schon richtig happig. Ja, man muss sich dann wirklich überlegen, wie man

00:05:26.380 --> 00:05:28.260
da rangeht und nicht einfach so so hands-on drauflos.

00:05:28.400 --> 00:05:30.540
Dann läuft man meistens gegen eine kleine

00:05:30.540 --> 00:05:32.420
oder größere Wand. Und

00:05:32.420 --> 00:05:34.580
letztes Jahr war es auch so, dass die aufeinander aufgebaut haben.

00:05:34.720 --> 00:05:36.660
Das heißt, man hat dann an einem Tag seinen Interpreter

00:05:36.660 --> 00:05:38.700
gebaut und zwei Tage später hat man wieder abgebaut,

00:05:38.820 --> 00:05:40.500
weil dann noch ein Feature dazu

00:05:40.500 --> 00:05:42.400
kam. Ja, oder man musste halt neue Opcodes handeln

00:05:42.400 --> 00:05:43.840
oder sowas. Und wenn man am Anfang studrig

00:05:43.840 --> 00:05:45.980
gearbeitet hat und das so hingeworst hat,

00:05:46.020 --> 00:05:47.880
dass das einfach so ging, da hat man sich geärgert,

00:05:47.940 --> 00:05:49.800
weil man die Implementierung sonst einfach hätte

00:05:49.800 --> 00:05:51.880
erweitern können und so musste man sie ganz neu

00:05:51.880 --> 00:05:53.840
bauen. Naja, ich bin gespannt, wie es dieses

00:05:53.840 --> 00:05:54.280
Jahr draus wird.

00:05:55.620 --> 00:05:57.720
Ich habe nicht immer so viel Zeit, aber ich glaube, so eine Stunde morgens

00:05:57.720 --> 00:05:59.300
würde ich mir schon dafür nehmen. Ich mag das nämlich.

00:06:00.420 --> 00:06:01.920
Ja, es lohnt sich auf jeden Fall auch. Sehr gute

00:06:01.920 --> 00:06:02.180
Übung.

00:06:04.280 --> 00:06:05.700
Ja, ich habe da auch immer sehr viel gelernt. Also wirklich

00:06:05.700 --> 00:06:07.720
auch über Konzepte von anderen Lösungen angucken, verschiedene

00:06:07.720 --> 00:06:09.920
Sprachen. Ein Kollege von mir macht das in Go.

00:06:10.120 --> 00:06:11.160
Da kann man das immer schön vergleichen.

00:06:12.120 --> 00:06:13.640
Hatte heute direkt eine rekursive Lösung

00:06:13.640 --> 00:06:15.540
implementiert. Ich war direkt ein bisschen neidisch.

00:06:15.940 --> 00:06:17.640
Ich hatte nicht an Binary Research gedacht. Ich wusste auch gar nicht,

00:06:17.720 --> 00:06:18.580
wie das in Python richtig geht.

00:06:19.680 --> 00:06:21.260
Und habe einfach ItaTools genommen,

00:06:21.960 --> 00:06:23.440
was auch funktionierte, aber

00:06:23.440 --> 00:06:24.260
war halt BruteForce.

00:06:26.460 --> 00:06:27.600
Aber ja, wir waren bei News,

00:06:27.640 --> 00:06:28.920
was der Stene stehen geblieben ist.

00:06:28.940 --> 00:06:30.640
Ja, sind ja News.

00:06:31.000 --> 00:06:31.320
Ja, genau.

00:06:33.420 --> 00:06:35.460
Eine ganz interessante Geschichte. Python läuft

00:06:35.460 --> 00:06:36.280
jetzt auf .NET

00:06:36.280 --> 00:06:38.540
auf der Runtime da.

00:06:39.620 --> 00:06:41.260
Das hast du gerade so ein bisschen leise vor dich hin

00:06:41.260 --> 00:06:42.680
genuschelt, als wäre es eine

00:06:42.680 --> 00:06:44.960
Meinung. Das ist mir auch ein peinlich.

00:06:45.060 --> 00:06:46.500
Das ist peinlich, dass du das jetzt sagt und nicht leid.

00:06:46.940 --> 00:06:48.700
Was ist jetzt der Unterschied zu IronPython?

00:06:48.780 --> 00:06:50.980
Weil IronPython gab es ja schon lange. Ja, aber ich glaube,

00:06:51.040 --> 00:06:52.680
das war schon lange nicht mehr so richtig

00:06:52.680 --> 00:06:54.600
aktiv. Das ist so wie Jython.

00:06:55.120 --> 00:06:57.200
Da gibt es sicherlich einen 2.7-Port für.

00:06:58.900 --> 00:07:00.640
Ja, es ist irgendwie, es gibt einen Pep,

00:07:00.960 --> 00:07:03.080
der beschreibt, wie man

00:07:03.080 --> 00:07:04.840
sich quasi einklinken kann, wenn man jetzt

00:07:04.840 --> 00:07:07.040
ein JIT-Compiler ist

00:07:07.040 --> 00:07:08.900
und diese Variante

00:07:08.900 --> 00:07:10.760
jetzt benutzt es auch. Das ist irgendwie

00:07:10.760 --> 00:07:12.880
von Anthony Shaw oder so

00:07:12.880 --> 00:07:13.840
hat das gebaut.

00:07:14.340 --> 00:07:16.420
Was genau meinst du mit einklinken, wenn man ein

00:07:16.420 --> 00:07:18.760
Just-in-Time-Compiler, das heißt

00:07:18.760 --> 00:07:20.900
sowas wie Python, die halt

00:07:20.900 --> 00:07:22.820
zur Laufzeit dann irgendwie evaluiert werden, oder

00:07:22.820 --> 00:07:23.280
wie ist das?

00:07:24.600 --> 00:07:26.780
Dass es halt dann zu Maschinencode runterkompiliert

00:07:26.780 --> 00:07:27.640
wird, quasi.

00:07:28.420 --> 00:07:30.640
Ja, und genau.

00:07:30.900 --> 00:07:32.680
Aber während das Programm läuft. Also die Teile,

00:07:32.840 --> 00:07:34.580
die gerade notwendig sind, werden dann

00:07:34.580 --> 00:07:36.560
während das Programm läuft zu

00:07:36.560 --> 00:07:38.820
Maschinencode kompiliert oder zu dem Code, der

00:07:38.820 --> 00:07:41.040
VM, die da drunter liegt

00:07:41.040 --> 00:07:42.660
und sind dann natürlich schneller.

00:07:44.240 --> 00:07:45.160
Macht PyPy

00:07:45.160 --> 00:07:47.000
zum Beispiel auch. PyPy hat auch so einen

00:07:47.000 --> 00:07:48.840
JIT-Modus, der dann halt

00:07:48.840 --> 00:07:50.800
die

00:07:50.800 --> 00:07:52.980
Sachen, die jetzt gerade

00:07:52.980 --> 00:07:54.920
in der Schleife sind und

00:07:54.920 --> 00:07:56.660
100.000 Mal durchgeführt werden, die

00:07:56.660 --> 00:07:58.740
kompiliert er dann halt so vor, dass diese Varianten

00:07:58.740 --> 00:08:00.680
schneller sind. Das ist einer der

00:08:00.680 --> 00:08:02.800
großen Vorteile von PyPy, dass

00:08:02.800 --> 00:08:04.760
die das machen können. Das macht CPython nicht.

00:08:04.840 --> 00:08:06.820
CPython hat keinen JIT drin.

00:08:06.940 --> 00:08:09.000
Der hat einfach seine Stack-Maschinen und die arbeitet

00:08:09.000 --> 00:08:09.880
das alles ab und fertig.

00:08:11.660 --> 00:08:13.020
Aber wie ist denn dann die

00:08:13.020 --> 00:08:14.940
Runtime? Das ist ja dann nicht CPython, sondern das ist

00:08:14.940 --> 00:08:17.020
dann irgendeine andere Runtime, die auf .NET läuft, oder wie?

00:08:18.760 --> 00:08:19.120
Ja,

00:08:19.300 --> 00:08:21.100
nee, das ist schon hauptsächlich

00:08:21.100 --> 00:08:23.040
CPython. Es ist nur so, dass man

00:08:23.040 --> 00:08:23.980
das irgendwie,

00:08:25.840 --> 00:08:26.060
also,

00:08:26.300 --> 00:08:28.260
keine Ahnung.

00:08:29.140 --> 00:08:30.300
Es ist schon CPython.

00:08:30.300 --> 00:08:32.180
Aber es

00:08:32.180 --> 00:08:34.140
funktioniert jetzt

00:08:34.140 --> 00:08:35.420
halbwegs noch nicht schneller, aber

00:08:35.420 --> 00:08:37.820
Leute könnten jetzt

00:08:37.820 --> 00:08:39.720
Optimierungen machen, indem sie halt das

00:08:39.720 --> 00:08:41.240
irgendwie auf die .NET Runtime

00:08:41.240 --> 00:08:42.340
optimieren.

00:08:43.760 --> 00:08:45.820
Ja, war auf jeden Fall

00:08:45.820 --> 00:08:47.100
irgendwie so, kann man sich mal angucken.

00:08:47.280 --> 00:08:49.360
Ich werde mal den Artikel dazu in den Shownotes packen.

00:08:50.920 --> 00:08:51.660
Ja, was

00:08:51.660 --> 00:08:53.620
hatten wir noch? Genau, noch so Dinge

00:08:53.620 --> 00:08:54.480
wie

00:08:54.480 --> 00:08:56.940
PEP 621,

00:08:57.400 --> 00:08:59.460
irgendwie mehr dazu gekommen, was man jetzt alles so in

00:08:59.460 --> 00:09:01.500
PyProject-Tommel irgendwie reinschreiben kann

00:09:01.500 --> 00:09:03.360
an Metadaten. Oh, cool. Was denn?

00:09:04.220 --> 00:09:04.540
Ja,

00:09:05.420 --> 00:09:07.860
ich glaube, so ziemlich alles, was

00:09:07.860 --> 00:09:09.620
halt vorher sonst ein Setup-UI so genannt hätte.

00:09:09.620 --> 00:09:10.020
Flake 8 auch?

00:09:11.820 --> 00:09:13.940
Ich glaube, Flake 8 wehrt sich noch so ein bisschen.

00:09:15.120 --> 00:09:15.480
Ähm,

00:09:16.280 --> 00:09:16.900
ja.

00:09:18.340 --> 00:09:19.860
PyTest geht fast, also

00:09:19.860 --> 00:09:21.740
PyTest ist im Moment noch so mit PyTest

00:09:21.740 --> 00:09:23.280
Ini-Options, so ein Workaround.

00:09:24.120 --> 00:09:25.680
Das wäre cool, wenn das normal wäre und

00:09:25.680 --> 00:09:27.700
ich glaube, Flake 8 hat es noch nicht so wirklich geschafft.

00:09:28.500 --> 00:09:29.920
Und habe ich noch was vergessen, was fehlt?

00:09:31.840 --> 00:09:32.200
Ähm,

00:09:32.620 --> 00:09:32.940
ja,

00:09:33.240 --> 00:09:35.360
ich glaube, das sind eher so Dinge wie,

00:09:35.500 --> 00:09:37.260
was ist der Autor von dem Ding und was

00:09:37.260 --> 00:09:39.300
sind die Abhängigkeiten und diese ganzen

00:09:39.300 --> 00:09:41.260
Geschichten. Ja, aber so Black-Konfiguration geht zum Beispiel

00:09:41.260 --> 00:09:43.340
schon rein und... Ja, ja, gut, aber das ist ja

00:09:43.340 --> 00:09:45.000
ein Third-Party.

00:09:45.900 --> 00:09:47.220
Ja, ein Third-Party, aber das ist ja nett,

00:09:47.280 --> 00:09:49.240
wenn man das alles da in die Pipeline drumherum packen kann,

00:09:49.300 --> 00:09:51.480
weil ich bin ein Freund von monolithischen

00:09:51.480 --> 00:09:53.060
Konflikts und nicht so ganz vielen kleinen,

00:09:53.380 --> 00:09:54.040
die irgendwo rumfliegen.

00:09:55.780 --> 00:09:57.000
Ansonsten, was auch noch

00:09:57.000 --> 00:09:59.100
ganz,

00:09:59.100 --> 00:10:00.900
was ich ganz witzig fand,

00:10:01.200 --> 00:10:03.300
da sind ja irgendwie neue Chips aus Apple rausgefallen.

00:10:06.040 --> 00:10:07.180
Ja. Hat man gehört.

00:10:07.520 --> 00:10:07.740
Ja.

00:10:09.100 --> 00:10:09.360
Waren.

00:10:10.260 --> 00:10:12.460
Hat man schon so Geräte gesehen?

00:10:13.020 --> 00:10:13.200
Ja.

00:10:16.980 --> 00:10:18.480
Also du hast schon so ein...

00:10:18.480 --> 00:10:21.140
Ich habe jetzt keinen, aber ich habe schon

00:10:21.140 --> 00:10:23.120
irgendwie Ergebnisse von

00:10:23.120 --> 00:10:24.920
den Geräten gesehen für

00:10:24.920 --> 00:10:26.360
Dinge, die ich interessant fand.

00:10:26.900 --> 00:10:29.200
Und insofern, wenn ich jetzt schwer überlege,

00:10:29.200 --> 00:10:31.080
ob ich da nicht vielleicht auch mal zuschlagen

00:10:31.080 --> 00:10:33.000
soll, weil es ist schon

00:10:33.000 --> 00:10:34.980
sendet, so auf dem Papier jedenfalls und so was man

00:10:34.980 --> 00:10:35.160
hört.

00:10:37.060 --> 00:10:37.940
Wenn man in diesem

00:10:37.940 --> 00:10:41.060
Ökosystem drin ist, dann ist das glaube ich

00:10:41.060 --> 00:10:42.920
eine Sache. Das ist ja so eine Sache, die ich gar nicht

00:10:42.920 --> 00:10:44.760
verstehen kann. Also sonst finde ich ja alles, was

00:10:44.760 --> 00:10:46.480
Mochen macht, total bewundernswert und super.

00:10:46.980 --> 00:10:47.520
Aber dieses

00:10:47.520 --> 00:10:50.320
Mekophilie, wie sagt man? Ich weiß nicht.

00:10:50.880 --> 00:10:51.200
Mekaholika.

00:10:53.860 --> 00:10:54.180
Fanboytum.

00:10:55.680 --> 00:10:56.260
Naja, also

00:10:56.260 --> 00:10:58.540
das Schicke daran ist halt, dass

00:10:58.540 --> 00:11:00.840
da sind jetzt gar keine

00:11:00.840 --> 00:11:02.300
Also zum Beispiel bei dem MacBook Air

00:11:02.300 --> 00:11:03.760
sind halt keine Lüfter mehr drin.

00:11:04.980 --> 00:11:06.200
Ja, juhu, im Sommer, yay.

00:11:07.100 --> 00:11:09.540
Ja, aber also die Leute haben das ja schon benutzt

00:11:09.540 --> 00:11:11.140
und das schaltet halt.

00:11:11.160 --> 00:11:12.320
Ja, iPhone sind ja auch keine Lüfter drin.

00:11:12.320 --> 00:11:13.360
Da sind auch keine Lüfter drin.

00:11:13.420 --> 00:11:14.700
Das ist auch wahrscheinlich, dass das funktioniert.

00:11:15.280 --> 00:11:17.440
Der schönste Hack, den ich gesehen habe übrigens.

00:11:18.140 --> 00:11:18.580
Bitte was?

00:11:18.600 --> 00:11:19.760
Der schönste Hack, den ich gesehen habe,

00:11:19.920 --> 00:11:23.120
da hat einer die Tesla-App auf seinem Mac installiert

00:11:23.120 --> 00:11:25.200
und der hat auch Bluetooth

00:11:25.200 --> 00:11:27.840
und hat damit seinen Mac als Schlüssel

00:11:27.840 --> 00:11:29.340
für seinen Tesla verwenden können.

00:11:29.900 --> 00:11:30.180
Hm.

00:11:30.840 --> 00:11:32.360
Was natürlich sehr praktisch ist,

00:11:32.640 --> 00:11:34.740
wenn man immer seinen Mac dabei haben muss.

00:11:35.240 --> 00:11:36.140
Ja, voll gut.

00:11:36.600 --> 00:11:38.160
Und an, also der muss dann auch an sein.

00:11:38.180 --> 00:11:39.720
Zum Einkaufen, einmal kurz im Supermarkt.

00:11:40.160 --> 00:11:42.160
Ja, er hat mal kurz unter den Arm geklemmt.

00:11:42.380 --> 00:11:43.660
Der Akku hält ja jetzt auch länger,

00:11:43.820 --> 00:11:45.520
da kann man das dann vielleicht irgendwie aufgeklappen machen.

00:11:45.520 --> 00:11:46.980
Aber handlicher ist das Gerät trotzdem.

00:11:47.020 --> 00:11:47.380
Naja, nicht so richtig.

00:11:49.040 --> 00:11:50.140
Wahrscheinlich sieht der Akku den Tester

00:11:50.140 --> 00:11:51.340
innerhalb von zehn Minuten leer oder so.

00:11:53.200 --> 00:11:54.700
Was es da jetzt halt auch gab,

00:11:54.700 --> 00:11:58.260
ist schon so eine irgendwie Preview-Variante

00:11:58.260 --> 00:12:02.960
von einer TensorFlow-Version,

00:12:03.140 --> 00:12:07.600
die halt gegen die entsprechenden Bibliotheken gelinkt ist

00:12:07.600 --> 00:12:11.140
und dann halt schnell ist halt auch auf Metal

00:12:11.140 --> 00:12:13.720
und halt auf der Apple-Hardware.

00:12:15.440 --> 00:12:18.620
Und das war tatsächlich auch ganz nett.

00:12:18.760 --> 00:12:19.380
Also ich habe das dann auch mal,

00:12:19.500 --> 00:12:20.920
ich meine, das ist ja immer so ein Problem,

00:12:21.020 --> 00:12:24.040
man hat halt keine Nvidia-Karten auf Apple

00:12:24.040 --> 00:12:25.720
und

00:12:25.720 --> 00:12:29.020
es gibt da einmal so eine Geschichte

00:12:29.020 --> 00:12:30.820
über PlateML, das ist so eine

00:12:30.820 --> 00:12:32.940
Intel-Geschichte,

00:12:33.000 --> 00:12:34.820
die man sich installieren kann, damit wird es dann halt schon mal

00:12:34.820 --> 00:12:36.600
ein bisschen schneller, also da geht dann schon so ein bisschen was

00:12:36.600 --> 00:12:38.060
GPU-mäßiges, halt auch mit den

00:12:38.060 --> 00:12:40.280
AMD-Karten, die da halt drin sind.

00:12:42.980 --> 00:12:44.800
Aber ist halt nicht so schnell wie Nvidia

00:12:44.800 --> 00:12:46.860
und ist halt auch nicht so schnell,

00:12:47.060 --> 00:12:48.800
also die CUDA und

00:12:48.800 --> 00:12:50.900
diese ganzen Geschichten, das ist damit nicht so richtig vergleichbar,

00:12:51.020 --> 00:12:52.520
aber so ein bisschen was kriegt man da schon hin,

00:12:52.880 --> 00:12:56.340
Also zumindest so weit, dass halt so Maschinen in den Geschichten

00:12:56.340 --> 00:12:59.900
halt auf der GPU in so einem MacBook sind halt genauso schnell

00:12:59.900 --> 00:13:02.200
wie halt mit den acht CPUs sonst.

00:13:02.920 --> 00:13:07.100
Ja, weil dann hat Nvidia 3090 oder sowas, da ist ja ...

00:13:07.100 --> 00:13:08.960
Ja, genau, die ist halt schneller.

00:13:10.360 --> 00:13:12.000
Die passt in den Mac nicht rein, habe ich gehört.

00:13:12.940 --> 00:13:14.340
Ja, nee, das geht halt irgendwie nicht.

00:13:15.100 --> 00:13:16.760
In diese Mac Pros gehen die nicht da rein?

00:13:17.460 --> 00:13:17.620
Nicht?

00:13:18.660 --> 00:13:20.420
Dachtest du, die hätten sogar Nvidia-Karten drin?

00:13:20.520 --> 00:13:22.700
Das kann sein, dass das da geht, ja, das weiß ich nicht genau.

00:13:22.880 --> 00:13:25.760
ja. Kostet ja wahrscheinlich 5000 Euro

00:13:25.760 --> 00:13:26.600
für eine Karte oder so.

00:13:27.600 --> 00:13:28.780
Ja, ist ja egal, komm.

00:13:29.200 --> 00:13:31.620
Wenn der Standfuß von dem

00:13:31.620 --> 00:13:33.200
Monitor schon 1000 Euro kostet, dann ist das

00:13:33.200 --> 00:13:34.020
nicht mehr so wichtig.

00:13:35.580 --> 00:13:37.540
Aber der ist aus einem massiven Block

00:13:37.540 --> 00:13:39.100
Aluminium ist der rausgefräst.

00:13:39.700 --> 00:13:39.860
Ja.

00:13:41.660 --> 00:13:43.620
Ja, es ist auch, also aus

00:13:43.620 --> 00:13:44.840
dem Bereich hätte ich auch News.

00:13:45.520 --> 00:13:47.660
Jochen, was sagst du denn zu dem Durchbruch, was das

00:13:47.660 --> 00:13:49.680
Proteinfalten angeht? Ja, das klingt

00:13:49.680 --> 00:13:50.460
auch sehr gut tatsächlich.

00:13:51.160 --> 00:13:52.620
Das wurde so beschrieben

00:13:52.620 --> 00:13:54.860
als der erste richtige Anwendungsfall

00:13:54.860 --> 00:13:56.460
für AI, der erste richtige

00:13:56.460 --> 00:13:58.100
Durchbruch von AI-Anwendungen.

00:13:58.800 --> 00:14:00.000
Wie mit den Protein-Fallen.

00:14:00.200 --> 00:14:01.940
Wo eine

00:14:01.940 --> 00:14:04.020
amerikanische Firma DeepMind

00:14:04.020 --> 00:14:06.240
die haben

00:14:06.240 --> 00:14:08.520
einen Algorithmus vorgestellt, also Algorithmus kann man

00:14:08.520 --> 00:14:10.580
ja fast nicht sagen, aber die haben eine Technologie

00:14:10.580 --> 00:14:12.360
vorgestellt, die aus

00:14:12.360 --> 00:14:14.800
einer Sequenzbeschreibung

00:14:14.800 --> 00:14:16.360
also

00:14:16.360 --> 00:14:17.920
die Aminosäuren

00:14:17.920 --> 00:14:20.300
quasi, die aneinander

00:14:20.300 --> 00:14:21.980
gereiht werden, genau, die zum Beispiel durch

00:14:21.980 --> 00:14:23.820
Gene kodiert werden können,

00:14:24.600 --> 00:14:26.520
das fertig gefaltete

00:14:26.520 --> 00:14:28.360
Protein berechnet. Und das Problem ist

00:14:28.360 --> 00:14:29.140
halt, dass die,

00:14:30.760 --> 00:14:32.280
ja, dass diese Proteine zwar

00:14:32.280 --> 00:14:33.420
linear hergestellt werden,

00:14:34.260 --> 00:14:36.320
aber sich dann eben zu einer dreidimensionalen

00:14:36.320 --> 00:14:38.340
Struktur zusammenfalten. Und weil die eben

00:14:38.340 --> 00:14:40.240
sehr viele Proteine drin haben, die sich

00:14:40.240 --> 00:14:42.240
in sehr viele Richtungen falten können, ist die Anzahl

00:14:42.240 --> 00:14:43.380
der Freiheitsgrade sehr hoch.

00:14:44.420 --> 00:14:46.220
Und die haben jetzt eben eine Technik vorgestellt,

00:14:46.320 --> 00:14:48.060
wie man innerhalb von wenigen Tagen

00:14:48.060 --> 00:14:51.320
so eine Faltung berechnen

00:14:51.320 --> 00:14:53.540
kann. Also quasi auf einem Strang

00:14:53.540 --> 00:14:54.000
aus einer

00:14:54.000 --> 00:14:57.400
RNA. Genau, also was du reinkriegst

00:14:57.400 --> 00:14:59.100
ist, oder was du gegeben kriegst, ist eine

00:14:59.100 --> 00:15:01.120
Abfolge von Aminosäuren. Das ist ja fast wie eine

00:15:01.120 --> 00:15:03.240
RNA, oder? Genau, das ist

00:15:03.240 --> 00:15:05.020
RNA. Das ist so ein Problem aus der Biologie,

00:15:05.860 --> 00:15:07.120
was

00:15:07.120 --> 00:15:09.060
1973 auf irgendeiner Konferenz

00:15:09.060 --> 00:15:09.700
vorgestellt wurde.

00:15:11.660 --> 00:15:13.160
Also seit 50 Jahren arbeitet man da

00:15:13.160 --> 00:15:14.740
dran im Wesentlichen. Und

00:15:14.740 --> 00:15:17.080
die Frage ist halt, wie dieses Protein

00:15:17.080 --> 00:15:18.980
dann dreidimensional ausschaut, weil das bestimmt

00:15:18.980 --> 00:15:20.840
ganz viele der Eigenschaften dieses Proteins

00:15:20.840 --> 00:15:22.880
und das kannst du nicht blutfaust rechnen,

00:15:22.960 --> 00:15:24.600
weil der Lösungsraum halt irgendwie 10 hoch

00:15:24.600 --> 00:15:25.780
1000 ist

00:15:25.780 --> 00:15:29.020
und die haben

00:15:29.020 --> 00:15:30.060
jetzt eben so eine Technologie

00:15:30.060 --> 00:15:32.700
vorgestellt, wo man in, ich glaube, vier Tagen

00:15:32.700 --> 00:15:34.860
haben sie, vier Tage Rechenzeit haben sie reingesteckt

00:15:34.860 --> 00:15:36.820
und dann haben sie im Schnitt

00:15:36.820 --> 00:15:38.940
bei so einem, da gibt es dann so einen Benchmark

00:15:38.940 --> 00:15:40.740
und so einen Wettbewerb, wo sie

00:15:40.740 --> 00:15:42.540
im Schnitt 92%

00:15:42.540 --> 00:15:43.960
Übereinstimmung hatten,

00:15:44.920 --> 00:15:46.760
wobei 92% Übereinstimmung, das hört sich

00:15:46.760 --> 00:15:48.680
niedrig an, aber ist wohl extrem hoch,

00:15:49.180 --> 00:15:51.040
weil die Messwerte, die man so rauskriegt,

00:15:51.140 --> 00:15:52.760
sind auch immer nur im Bereich zwischen

00:15:52.760 --> 00:15:55.120
90 und 100 Prozent Übereinstimmung. Also es ist im Wesentlichen

00:15:55.120 --> 00:15:56.900
wie ein Messwert, den man

00:15:56.900 --> 00:15:59.000
da rauskriegt. Und das ist eben tatsächlich eine Sache,

00:15:59.100 --> 00:16:00.820
die man vorher nicht konnte und die es einfach nicht

00:16:00.820 --> 00:16:02.460
gab. Und

00:16:02.460 --> 00:16:05.020
die auch in der Medizin sehr, sehr, sehr,

00:16:05.020 --> 00:16:06.720
sehr, sehr nützlich ist, weil du dann

00:16:06.720 --> 00:16:09.120
eben nicht die Moleküle

00:16:09.120 --> 00:16:10.760
synthetisieren und untersuchen musst, was

00:16:10.760 --> 00:16:12.900
sehr aufwendig und sehr teuer und sehr schwierig

00:16:12.900 --> 00:16:14.780
ist, sondern du kannst halt sagen, hier, wir haben

00:16:14.780 --> 00:16:16.840
so eine Gensequenz gefunden, wie sieht

00:16:16.840 --> 00:16:17.360
denn das Ding aus?

00:16:18.880 --> 00:16:21.020
Und das ist so, also es wurde wie gesagt

00:16:21.020 --> 00:16:22.840
beschrieben als so einer der ersten richtigen

00:16:22.840 --> 00:16:24.800
Durchbrüche von AI-Technologie,

00:16:24.920 --> 00:16:26.080
von Machine Learning-Technologie,

00:16:27.140 --> 00:16:28.880
wo jetzt was möglich ist, was vorher

00:16:28.880 --> 00:16:30.580
einfach nicht möglich war.

00:16:30.680 --> 00:16:32.640
Das heißt, man kann tatsächlich irgendwann einen ganzen

00:16:32.640 --> 00:16:34.180
Körper brechen irgendwann mal vielleicht so.

00:16:35.240 --> 00:16:36.260
Ja, aber also

00:16:36.260 --> 00:16:38.620
das wurde halt dann sozusagen

00:16:38.620 --> 00:16:40.640
so vorgestellt als, oder das habe ich gesehen,

00:16:40.640 --> 00:16:42.240
ich habe dann halt so den, man hat

00:16:42.240 --> 00:16:44.400
den Fortschritt gesehen als so ein Graph

00:16:44.400 --> 00:17:00.620
Und dann, die letzten beiden Geschichten waren halt deutlich besser und jetzt halt das letzte so gut wie fast ein Experiment oder quasi genauso gut. Und jemand hat beschrieben, das ist dann halt so, dass der ImageNet-Moment für Proteinfaltung, also wo man halt sieht, okay, jetzt ist es so gut, dass man tatsächlich was damit machen kann.

00:17:00.620 --> 00:17:02.460
und bei ImageNet war es ja auch so, also

00:17:02.460 --> 00:17:04.660
bevor Deep Learning

00:17:04.660 --> 00:17:06.820
da irgendwie, man da mit rangegangen ist,

00:17:07.240 --> 00:17:08.540
waren die Ergebnisse einfach, man

00:17:08.540 --> 00:17:10.560
konnte es nicht verwenden. Und das war halt bei

00:17:10.560 --> 00:17:12.280
diesen Proteinfaltungsgeschichten auch immer so, da war die

00:17:12.280 --> 00:17:14.320
Genauigkeit 40%, 50% oder so,

00:17:14.740 --> 00:17:16.620
ja schon, es geht so ein bisschen was, aber es hat halt nicht,

00:17:17.120 --> 00:17:18.580
war halt, man konnte es nicht verwenden und jetzt ist

00:17:18.580 --> 00:17:20.160
es halt so weit, dass man es tatsächlich verwenden kann.

00:17:20.980 --> 00:17:22.640
Und ja, das ist natürlich

00:17:22.640 --> 00:17:24.500
schon beeindruckend. Ja, DeepMind, auch interessant,

00:17:25.120 --> 00:17:26.420
ist von Google gekauft worden,

00:17:26.700 --> 00:17:29.100
die haben wir schon,

00:17:29.100 --> 00:17:30.340
die hatten doch auch schon AlphaGo gemacht.

00:17:30.620 --> 00:17:32.440
haben die gemacht, genau, Alpha-Code-Zero,

00:17:32.740 --> 00:17:32.960
ja.

00:17:34.000 --> 00:17:36.480
Ja, spannende Sache,

00:17:36.640 --> 00:17:38.520
aber hat nichts mit Paisen zu tun, also zurück zum Thema.

00:17:38.820 --> 00:17:40.220
Hunde wollt ihr ewig leben, ja.

00:17:41.620 --> 00:17:41.980
Tja.

00:17:42.420 --> 00:17:44.280
Ja, das ist doch gar nicht so schlecht, also so ein Protein-Fighting,

00:17:44.340 --> 00:17:45.900
da kann man auch bestimmt einige Sachen machen,

00:17:46.300 --> 00:17:48.400
die den Körper verjüngen oder sowas, das ist bestimmt ein gutes

00:17:48.400 --> 00:17:50.140
Geschäftsmodell, wenn man da relativ weit vorne ist.

00:17:50.820 --> 00:17:52.140
Ja, jetzt gerade ist es vor allem

00:17:52.140 --> 00:17:54.040
spannend, weil man da halt auch

00:17:54.040 --> 00:17:56.000
mRNA-Sequenzen mitbrechen kann und

00:17:56.000 --> 00:17:57.140
hat welche, die richtige ist.

00:17:58.580 --> 00:17:59.580
Gut, gut, ja.

00:18:00.620 --> 00:18:03.600
ja, da geht einiges

00:18:03.600 --> 00:18:05.940
genau, ansonsten

00:18:05.940 --> 00:18:08.120
eine Geschichte und da, das ist ja schon fast

00:18:08.120 --> 00:18:09.200
eine Überleitung zu

00:18:09.200 --> 00:18:11.880
dem Thema

00:18:11.880 --> 00:18:13.980
es ist eine neue Release rausgekommen von

00:18:13.980 --> 00:18:16.380
Phoenix Live View

00:18:16.380 --> 00:18:17.920
vor kurzem

00:18:17.920 --> 00:18:19.740
ich gucke da ab und zu auch mal so ein bisschen

00:18:19.740 --> 00:18:22.140
rein, weil ich mir dieses ganze Elixier

00:18:22.140 --> 00:18:23.880
Erlang-Ding halt auch so ein bisschen angucke

00:18:23.880 --> 00:18:25.860
und

00:18:25.860 --> 00:18:27.940
das hat jetzt zum Beispiel

00:18:27.940 --> 00:18:29.060
auch File Uploads drin

00:18:29.060 --> 00:18:32.520
Oh, das hört sich

00:18:32.520 --> 00:18:34.560
voll interessant, das hört sich total nach

00:18:34.560 --> 00:18:36.660
Yagni an, ah, Pfeil Uploads

00:18:36.660 --> 00:18:38.400
das machen wir in Release 12, das braucht

00:18:38.400 --> 00:18:40.560
kein Mensch. Ja, ja, ja

00:18:40.560 --> 00:18:42.360
das hat mich jetzt auch gewundert, ehrlich gesagt, dass das

00:18:42.360 --> 00:18:43.420
noch nicht drin war, oh Gott

00:18:43.420 --> 00:18:46.500
ja, jetzt ist es drin und das ist auch tatsächlich sehr schick

00:18:46.500 --> 00:18:48.600
also, ja, aber

00:18:48.600 --> 00:18:50.540
genau, genau, da

00:18:50.540 --> 00:18:51.740
hat sich auch noch ein bisschen was getan

00:18:51.740 --> 00:18:54.140
Ja, vielleicht musst du nochmal kurz sagen, was Phoenix überhaupt ist

00:18:54.140 --> 00:18:56.380
Ja, das ist halt sozusagen das Standard

00:18:56.380 --> 00:18:57.740
oder ich weiß es nicht genau, jetzt

00:18:57.740 --> 00:18:59.220
bloß nichts Falsches sagen.

00:19:00.060 --> 00:19:02.060
Ich kenne mich ja jetzt mit Elixier nicht so aus, aber es ist halt

00:19:02.060 --> 00:19:03.940
so das Web-Framework, was man halt, also

00:19:03.940 --> 00:19:06.040
Elixier ist halt ein

00:19:06.040 --> 00:19:07.900
Dialekt oder, sagen wir mal,

00:19:07.900 --> 00:19:09.900
so eine etwas anders aufgemachte

00:19:09.900 --> 00:19:11.900
Sprache, die aber auch

00:19:11.900 --> 00:19:13.640
auf dieser Erlangen vor allem läuft und

00:19:13.640 --> 00:19:15.860
oder auf der, ja, genau, und

00:19:15.860 --> 00:19:17.060
zu Erlangen runterkompiliert

00:19:17.060 --> 00:19:19.900
und Phoenix

00:19:19.900 --> 00:19:22.380
ist halt sozusagen das Standard-Web-Framework

00:19:22.380 --> 00:19:24.000
dafür. Und was ist Erlangen? Kann man

00:19:24.000 --> 00:19:25.760
das essen? Ja, Erlangen ist halt auch so

00:19:25.760 --> 00:19:27.640
eine Sprache. Die Ericsson-Language.

00:19:27.740 --> 00:19:29.680
Genau. Wer oder was ist Ericsson?

00:19:30.860 --> 00:19:31.720
Ericsson ist der

00:19:31.720 --> 00:19:32.880
große Telefonhersteller.

00:19:33.280 --> 00:19:35.420
Der große Telefonhersteller aus

00:19:35.420 --> 00:19:37.060
Norwegen, glaube ich.

00:19:37.920 --> 00:19:38.740
Woher kommt Ericsson?

00:19:39.360 --> 00:19:41.720
Und ich weiß nicht genau, wann das entwickelt wird.

00:19:41.740 --> 00:19:42.760
Er ist natürlich ein Sony-Ericsson.

00:19:43.320 --> 00:19:43.480
Ach.

00:19:44.880 --> 00:19:47.520
Ja, und

00:19:47.520 --> 00:19:48.800
ich glaube, das ist

00:19:48.800 --> 00:19:51.440
schon ziemlich lange her.

00:19:51.720 --> 00:19:53.320
Anfang der 80er, weiß nicht, oder irgendwann dann so

00:19:53.320 --> 00:19:54.120
Schweden.

00:19:54.860 --> 00:19:57.560
Da gibt es ein ganz, ganz, ganz geniales Video aus den 80ern,

00:19:57.560 --> 00:19:59.740
wo sie das demonstrieren, das ist R-Lang-System.

00:20:00.560 --> 00:20:01.820
Mit der Ästhetik

00:20:01.820 --> 00:20:03.500
der 80er, aber mit der Technologie, die

00:20:03.500 --> 00:20:05.500
heute, also wenn ich das

00:20:05.500 --> 00:20:07.120
programmieren müsste, was die damals zeigen,

00:20:07.480 --> 00:20:08.660
wüsste ich nicht genau, wie ich es machen würde.

00:20:09.340 --> 00:20:11.220
Ja, ist schon mal ein

00:20:11.220 --> 00:20:13.160
R-Lang-Nehmen.

00:20:14.080 --> 00:20:14.240
Ja.

00:20:15.800 --> 00:20:17.380
Und das ist halt auch heute noch,

00:20:17.460 --> 00:20:19.520
immer noch, es ist gerade sehr hip im

00:20:19.520 --> 00:20:21.620
ganzen Lab-Umfeld, so für Backend-Geschichten,

00:20:21.760 --> 00:20:22.680
deswegen war das halt,

00:20:23.520 --> 00:20:25.560
weil man quasi, naja, so sehr, sehr

00:20:25.560 --> 00:20:28.040
robuste Concurrency-Geschichten

00:20:28.040 --> 00:20:29.720
halt geschenkt kriegt und

00:20:29.720 --> 00:20:31.300
so, ich meine zum Beispiel

00:20:31.300 --> 00:20:33.820
WhatsApp ist da drauf halt gebaut

00:20:33.820 --> 00:20:35.260
und so, ne, und

00:20:35.260 --> 00:20:37.240
Das wurde doch für, also das hat Erlang,

00:20:37.540 --> 00:20:39.960
das hat Ericsson doch für seine Telefonsystem-

00:20:39.960 --> 00:20:41.700
Backends gemacht. Für die Telefon-Switches ist das

00:20:41.700 --> 00:20:43.720
eigentlich gebaut worden, ja. Genau, und da, die dürfen halt nicht

00:20:43.720 --> 00:20:45.760
abstützen. Also ich meine, wenn die abstützen, dann ist halt

00:20:45.760 --> 00:20:46.360
echt blöd.

00:20:48.640 --> 00:20:49.580
Deshalb ist das so robust.

00:20:49.660 --> 00:20:51.140
Da gibt's auch einige, es gibt auch einige

00:20:51.140 --> 00:20:54.020
Multiplayer-Gaming-Systeme,

00:20:54.040 --> 00:20:55.880
wo die Backends in Erlang geschrieben sind.

00:20:55.960 --> 00:20:58.280
Einfach, weil die nicht abstürzen dürfen und skalierbar

00:20:58.280 --> 00:21:00.120
sein müssen. Ja, man sieht

00:21:00.120 --> 00:21:02.080
die ja nicht. Das sagen immer nur Firmen wieder

00:21:02.080 --> 00:21:03.860
hier, wir benutzen Erlang, um unsere Backends zu

00:21:03.860 --> 00:21:05.340
programmieren, aber die siehst du ja nie.

00:21:05.840 --> 00:21:06.160
Na gut.

00:21:07.940 --> 00:21:10.120
Ja, also ich habe gerade mal bei Wikipedia geschaut und da steht

00:21:10.120 --> 00:21:11.920
auf der Übersichtsmap, die

00:21:11.920 --> 00:21:13.320
ziemlich hässlich ist, Environment

00:21:13.320 --> 00:21:16.020
CCC. Auch

00:21:16.020 --> 00:21:18.200
interessant. Crackers Competitors

00:21:18.200 --> 00:21:20.040
Costumers wollten die wohl sagen, aber naja.

00:21:20.960 --> 00:21:21.920
Das nur so am Rande, kleiner

00:21:21.920 --> 00:21:23.640
Joke. Okay. Aber Jochen

00:21:23.640 --> 00:21:25.860
kompiliert das wirklich zu Erlang

00:21:25.860 --> 00:21:27.740
runter oder kompiliert das direkt zu Beam?

00:21:27.800 --> 00:21:29.320
Weil die VM heißt ja Beam VM.

00:21:29.600 --> 00:21:31.120
Ja, ich meine,

00:21:31.760 --> 00:21:33.840
ich meine,

00:21:34.000 --> 00:21:35.680
es kompiliert erst nochmal zu Erlang runter.

00:21:36.080 --> 00:21:37.840
Und dann, aber

00:21:37.840 --> 00:21:39.080
ja, genau.

00:21:39.080 --> 00:21:41.300
Ich gucke dann immer nur so drauf.

00:21:41.700 --> 00:21:43.320
Zu Beam. Beam me up, Scotty.

00:21:43.380 --> 00:21:44.320
Was ist denn jetzt wieder Beam?

00:21:44.900 --> 00:21:47.080
Ja, das ist die VM, die Erlang ausführt.

00:21:47.700 --> 00:21:48.900
Das ist so wie C-Python.

00:21:49.060 --> 00:21:51.080
C-Python, niemand interagiert je mit

00:21:51.080 --> 00:21:53.000
C-Python, obwohl wir alle immer mit C-Python

00:21:53.000 --> 00:21:54.300
interagieren, aber das ist das

00:21:54.300 --> 00:21:56.380
eigentliche Programm, was das ausführt.

00:21:56.720 --> 00:21:59.100
Bei Erlang und Beam ist es genauso. Bei Erlang heißt es halt

00:21:59.100 --> 00:22:01.160
nicht C-Erlang, sondern es heißt

00:22:01.160 --> 00:22:03.000
halt Beam. Und dann laufen

00:22:03.000 --> 00:22:04.240
Dinge wie Elixir auf Erlang.

00:22:04.920 --> 00:22:05.100
Genau.

00:22:07.160 --> 00:22:09.060
Und Elixir ist das Django für Erlang.

00:22:09.200 --> 00:22:10.800
Nee, Phoenix. Das ist das Django

00:22:10.800 --> 00:22:12.880
sozusagen für Elixir.

00:22:12.880 --> 00:22:13.820
Das Django für Elixir.

00:22:14.300 --> 00:22:17.000
Elixir wird auf Erlang und das läuft dann auf Beam.

00:22:17.300 --> 00:22:18.340
Genau. Und Beam läuft auf?

00:22:19.040 --> 00:22:20.780
Ich glaube, da gibt es auch irgendwo OTP oder sowas

00:22:20.780 --> 00:22:25.760
Ja, ich glaube, dass das die Bibliothek ist.

00:22:25.840 --> 00:22:28.680
OTP ist die, wenn ich das recht weiß.

00:22:28.820 --> 00:22:30.700
Aber ich lasse mich gerne in den Kommentaren.

00:22:31.160 --> 00:22:32.660
Genau, das müssen wir uns alle dafür schlagen.

00:22:32.680 --> 00:22:35.420
Das ist wieder so ein neuer Namespace.

00:22:35.680 --> 00:22:37.640
Also ich habe überhaupt keine Ahnung, wofür ihr gerade redet.

00:22:38.500 --> 00:22:39.380
Ich fühle mich etwas abgehängt.

00:22:39.400 --> 00:22:40.980
Ja, das macht nichts, dann fühlen wir uns besser.

00:22:44.040 --> 00:22:45.680
Ja, also genau.

00:22:45.780 --> 00:22:48.740
Eigentlich ist es auch nur, es ist halt deswegen interessant,

00:22:48.860 --> 00:22:50.760
weil es halt sozusagen für Async und

00:22:50.760 --> 00:22:52.680
diese Geschichten halt so das,

00:22:53.180 --> 00:22:54.620
wo man immer sagt, das ist ein Goldstandard,

00:22:54.740 --> 00:22:56.860
da funktioniert das richtig gut und alle, die das da machen,

00:22:56.960 --> 00:22:58.600
sind immer so begeistert und schauen auf die anderen herab.

00:22:58.600 --> 00:23:00.380
Dann muss man auch vielleicht mal gucken, was das eigentlich so kann.

00:23:01.900 --> 00:23:01.900
Und

00:23:01.900 --> 00:23:04.400
ja, deswegen gucke ich mir das auch gerade so ein bisschen an,

00:23:04.480 --> 00:23:06.580
um das halt ein bisschen miteinander vergleichen zu können, alles.

00:23:07.860 --> 00:23:08.700
Und genau,

00:23:08.800 --> 00:23:10.480
dazu vielleicht auch gerade noch eine Überleitung

00:23:10.480 --> 00:23:11.920
zu so einem Podcast

00:23:11.920 --> 00:23:13.820
Software-Thema,

00:23:14.620 --> 00:23:16.200
weil es gab schon mal einen Versuch,

00:23:17.000 --> 00:23:17.180
also

00:23:17.180 --> 00:23:19.140
noch mal eine Ecke

00:23:19.140 --> 00:23:21.280
ausholen. So eine

00:23:21.280 --> 00:23:23.280
der populäreren Geschichten, wie man Podcasts

00:23:23.280 --> 00:23:24.460
hostet, ist ja irgendwie

00:23:24.460 --> 00:23:27.140
der

00:23:27.140 --> 00:23:29.120
Podlove Publisher oder es gibt ja

00:23:29.120 --> 00:23:31.120
natürlich unterschiedliche Teile, was dieses Hosting betrifft,

00:23:31.200 --> 00:23:32.660
aber so das Ding, was sozusagen

00:23:32.660 --> 00:23:35.080
die Feeds generiert und

00:23:35.080 --> 00:23:36.640
ja

00:23:36.640 --> 00:23:39.240
irgendwie auch den ganzen Website-Teil

00:23:39.240 --> 00:23:40.320
so zum Großteil macht.

00:23:41.320 --> 00:23:43.240
Das ist halt so ein

00:23:43.240 --> 00:23:44.480
WordPress-Plugin.

00:23:45.180 --> 00:23:46.460
Vielleicht habe ich schon mal gehört, dass von Tim Püttler

00:23:46.460 --> 00:23:47.520
auf der Cars-Radio-Expo...

00:23:47.520 --> 00:23:51.280
Ja gut, der hat das Projekt mal initiiert.

00:23:51.740 --> 00:23:53.060
Da haben natürlich eine Menge Leute

00:23:53.060 --> 00:23:54.500
dran irgendwie geschrieben.

00:23:57.340 --> 00:23:58.880
Und genau,

00:24:00.280 --> 00:24:01.440
naja,

00:24:01.660 --> 00:24:03.120
also man kriegt halt so Probleme, wenn man jetzt

00:24:03.120 --> 00:24:04.880
irgendwie WordPress und dann Plugin hat.

00:24:05.480 --> 00:24:07.180
Also dazu gibt es

00:24:07.180 --> 00:24:08.180
jetzt auch einen ganz interessanten

00:24:08.180 --> 00:24:09.880
Podcast.

00:24:11.000 --> 00:24:12.420
Padlovers Podcast heißt der irgendwie.

00:24:12.800 --> 00:24:14.920
Und da wurde über die Geschichte auch schon so

00:24:14.920 --> 00:24:17.020
einiges erzählt. Und ich habe mir

00:24:17.020 --> 00:24:18.980
das halt mal angehört, weil ich dachte, für mich ganz interessant,

00:24:19.120 --> 00:24:20.880
weil ich diesen ganzen Hosting-Teil,

00:24:21.000 --> 00:24:23.080
den Publisher-Teil ja sozusagen in Django

00:24:23.080 --> 00:24:23.860
irgendwie

00:24:23.860 --> 00:24:26.940
gebaut habe. Natürlich

00:24:26.940 --> 00:24:29.060
nicht das, was das Ding macht, aber halt so rudimentär,

00:24:29.140 --> 00:24:30.140
dass man damit halt irgendwie

00:24:30.140 --> 00:24:33.140
für die Anforderungen, die wir haben, das halt so halbwegs hinbekommt.

00:24:34.200 --> 00:24:34.400
Und

00:24:34.400 --> 00:24:36.420
ja,

00:24:37.060 --> 00:24:38.840
dachte, vielleicht kann ich da so ein paar interessante

00:24:38.840 --> 00:24:41.120
Anregungen mitnehmen, was man da eigentlich alles noch so tun kann

00:24:41.120 --> 00:24:42.740
und worauf man aufpassen muss und so.

00:24:43.280 --> 00:24:44.980
Und ich fand das sehr unterhaltsam

00:24:44.980 --> 00:24:46.840
und ich fand es auch interessant, in welche Probleme

00:24:46.840 --> 00:24:48.100
sie dabei reingelaufen sind.

00:24:49.920 --> 00:24:50.620
Zum Beispiel

00:24:50.620 --> 00:24:52.560
einfach mal so ein bisschen so, ich meine,

00:24:53.020 --> 00:24:54.760
oder könnt ihr euch das schon vorstellen, was man so für Probleme

00:24:54.760 --> 00:24:57.120
kriegt, wenn man WordPress als Hosting-Plattform

00:24:57.120 --> 00:24:58.500
nimmt und dann ein Plugin hat?

00:25:00.520 --> 00:25:00.840
Nö,

00:25:00.920 --> 00:25:02.480
ich glaube, da gibt es keinerlei

00:25:02.480 --> 00:25:04.820
Sicherheitsprobleme mehr und auch keine

00:25:04.820 --> 00:25:06.880
Interabhängigkeiten

00:25:07.440 --> 00:25:08.660
und auch keine Dependency-Hell,

00:25:08.740 --> 00:25:10.580
gar nichts. Ich glaube nicht, dass das, nö, ist nicht.

00:25:10.720 --> 00:25:12.380
Dass er klick, klick und funktioniert?

00:25:13.100 --> 00:25:14.540
Ja, also das ist halt

00:25:14.540 --> 00:25:16.980
so eine, es ist natürlich super

00:25:16.980 --> 00:25:18.980
zugänglich und es funktioniert überall

00:25:18.980 --> 00:25:20.500
und insofern

00:25:20.500 --> 00:25:22.920
kann ich das natürlich in gewisser Weise verstehen, dass man das macht,

00:25:23.000 --> 00:25:24.960
weil man halt sozusagen, wenn man

00:25:24.960 --> 00:25:27.040
nicht benutzt wird, dann hilft einem

00:25:27.040 --> 00:25:27.860
das ja natürlich auch alles nicht.

00:25:28.700 --> 00:25:30.940
Aber wenn es dann benutzt wird

00:25:30.940 --> 00:25:32.940
und es ist halt ein WordPress-Plugin, dann hat man

00:25:32.940 --> 00:25:34.620
halt auch einen Haufen Probleme, die man sonst nicht hätte.

00:25:35.360 --> 00:25:36.920
Unter anderem also der arme

00:25:36.920 --> 00:25:38.960
Mensch, der das dann erzählt hat, ich hätte jetzt leider den Namen

00:25:38.960 --> 00:25:40.940
auch gerade nicht parat, der da schon

00:25:40.940 --> 00:25:42.740
ganz lange dran rumentwickelt,

00:25:43.100 --> 00:26:04.540
Und erzählte dann so, ja, also wir haben das, also irgendwann wollten Leute dann so Statistik haben auch und dann liefen aber die Statistik-Jobs irgendwie so ein bisschen länger und naja, normalerweise so WordPress, das läuft dann halt auf Hostern irgendwo und die beenden die Prozesse halt immer so nach einer Minute ungefähr.

00:26:07.260 --> 00:26:25.340
Und normalerweise ist das kein gutes Zeichen, wenn dein Web-Request länger als eine Minute läuft und dann schießt man den lieber weg, weil wahrscheinlich ist der eh kaputt. Und naja, du blockierst ja auch einen Worker komplett sozusagen und das sind ja Shared-Hoster und da gibt es ja ganz viele Leute und dann blockierst du ja die anderen Ressourcen.

00:26:25.340 --> 00:26:39.920
Das heißt, ja, nicht so gut und jetzt musst du halt aber irgendwie um diese Beschränkungen drumherum programmieren, weil sowas wie Background-Tasks oder irgendwie Task-Queue-System oder so hast du halt nicht.

00:26:40.920 --> 00:26:47.340
Du hast halt auch nicht irgendwelche Maschinen mit Workern, die dann halt Sachen abarbeiten oder so, das gibt es halt einfach alles nicht und du musst halt alles in Requests abhandeln.

00:26:47.340 --> 00:26:55.180
Das heißt, du musst darauf warten, dass ein Request vorbeikommt und dann guckst du halt in eine Kontakt-Tabelle und guckst halt, ob jetzt gerade irgendwas laufen muss und wenn ja, dann läuft das halt in deinem Request.

00:26:55.340 --> 00:26:57.160
und derjenige, der

00:26:57.160 --> 00:26:59.240
die Webseite aufgerufen hat, der hat halt ein bisschen Pech gehabt

00:26:59.240 --> 00:27:00.480
und der muss halt länger warten

00:27:00.480 --> 00:27:03.100
und, aber du musst halt aufpassen, wenn das

00:27:03.100 --> 00:27:04.960
länger dauert als eine Minute oder wenn du dich diesem Bereich

00:27:04.960 --> 00:27:06.720
näherst, dann wird es halt knifflig

00:27:06.720 --> 00:27:09.360
und dann hat er dann irgendwie so ein Katz-und-Maus-Spiel

00:27:09.360 --> 00:27:11.300
gebaut, wo man

00:27:11.300 --> 00:27:13.040
dann so einen Prozess wegforkt

00:27:13.040 --> 00:27:15.220
nach kurz vor

00:27:15.220 --> 00:27:16.900
60 Sekunden und dann wieder

00:27:16.900 --> 00:27:18.980
berechnet, berechnet, berechnet, alles wieder serialisiert

00:27:18.980 --> 00:27:20.640
wieder wegforkt und dann sozusagen

00:27:20.640 --> 00:27:22.440
dem Kill immer wegläuft

00:27:22.440 --> 00:27:25.280
und das ist natürlich schon

00:27:25.280 --> 00:27:26.200
Also ich meine, ja.

00:27:27.060 --> 00:27:28.740
Ja, ist eine lustige Übung, würde ich mal sagen.

00:27:28.880 --> 00:27:29.960
Ja, kann man natürlich machen.

00:27:31.180 --> 00:27:32.660
Oder halt eben auch so Dinge wie,

00:27:35.100 --> 00:27:37.880
ja, sie wollten irgendwann die Podcast-Logos anzeigen

00:27:37.880 --> 00:27:44.160
und da gibt es ja die von iTunes geforderten Größen,

00:27:44.240 --> 00:27:46.920
das sind so 3000 mal 3000 Pixel, das ist ein bisschen groß.

00:27:47.860 --> 00:27:50.000
Dann siehst du, okay, das rechnen wir einfach ein bisschen runter

00:27:50.000 --> 00:27:52.740
und dann, ah, oh Mist, so einfach kann man das aber nicht machen.

00:27:53.300 --> 00:27:54.640
Man muss ja irgendwie berücksichtigen, dass

00:27:54.640 --> 00:27:56.900
auf unterschiedlichen Monitorgrößen

00:27:56.900 --> 00:27:58.840
die Dinge unterschiedliche viele Pixel haben müssen

00:27:58.840 --> 00:28:00.780
und so. Und wie macht man denn das? Und was ist denn

00:28:00.780 --> 00:28:02.720
die Standardlösung von WordPress? Und dann haben sie gesehen,

00:28:02.820 --> 00:28:04.700
oh, es gibt keine. Und

00:28:04.700 --> 00:28:06.240
das Problem hat mich ja auch schon,

00:28:06.700 --> 00:28:08.640
das ist auch etwas, wo ich bei Django etwas überrascht war,

00:28:08.740 --> 00:28:09.620
dass es da einfach nichts gab.

00:28:11.100 --> 00:28:12.320
Und ja,

00:28:12.500 --> 00:28:14.600
dann mussten sie das halt auch irgendwie selber

00:28:14.600 --> 00:28:16.600
bauen. Wo man sich denkt, oh ja, das Problem hatte ich

00:28:16.600 --> 00:28:18.200
halt auch schon, das habe ich dann auch selber bauen.

00:28:19.140 --> 00:28:20.600
Aber was

00:28:20.600 --> 00:28:22.500
das Ganze halt deutlich schwerer macht, ist halt, wenn du

00:28:22.500 --> 00:28:24.320
nicht selber das alles installiert hast und deine

00:28:24.320 --> 00:28:26.440
Abhängigkeiten definiert hast, dann hast du halt

00:28:26.440 --> 00:28:28.340
machst du das vielleicht mit Image Magic

00:28:28.340 --> 00:28:29.200
oder so auf

00:28:29.200 --> 00:28:32.720
in zehn unterschiedlichen Variationen

00:28:32.720 --> 00:28:34.500
über alle möglichen Hoster, die halt alle möglichen

00:28:34.500 --> 00:28:36.520
unterschiedlichen Versionen

00:28:36.520 --> 00:28:37.380
davon installiert haben

00:28:37.380 --> 00:28:39.760
und dann musst du

00:28:39.760 --> 00:28:42.200
halt Code schreiben, der mit zehn

00:28:42.200 --> 00:28:44.060
unterschiedlichen Versionen von irgendeiner

00:28:44.060 --> 00:28:46.580
Bildbearbeitungsgeschichte klarkommt, was natürlich totaler

00:28:46.580 --> 00:28:47.900
das ist natürlich

00:28:47.900 --> 00:28:48.840
gruselig alles.

00:28:49.760 --> 00:28:51.620
Ja, depende sehr.

00:28:52.280 --> 00:29:05.840
Ja, und genau, all diese Dinge und ja, ich meine, kann man sich ja auch mal selber anhören, wenn das, also es war schon interessant und ich fand das auch total cool, was sie da alles irgendwie mit hingekriegt haben und da rausgeholt haben.

00:29:05.840 --> 00:29:17.320
Auf der anderen Seite würde ich jetzt sagen, wenn man jetzt nochmal anfängt mit sowas, dann nimmt man doch vielleicht lieber irgendwie ein richtiges Framework zum Entwickeln von Webseiten und nicht irgendwie ein Wordpress.

00:29:17.320 --> 00:29:19.610
Plug-In, ne? Also...

00:29:19.610 --> 00:29:21.270
Naja, das Problem ist, was du jetzt gerade gesagt hast,

00:29:21.350 --> 00:29:23.370
nimmt man vielleicht lieber, ist natürlich nett, wenn man

00:29:23.370 --> 00:29:25.250
dann weiß, wie es geht. Ich glaube, das ist so die größte...

00:29:25.250 --> 00:29:26.950
Nee, ich glaube, das war tatsächlich Absicht,

00:29:27.230 --> 00:29:28.570
dass das so... Weil

00:29:28.570 --> 00:29:31.310
die Frage war, wie kommt

00:29:31.310 --> 00:29:32.970
man halt zu einer User-Basis?

00:29:34.190 --> 00:29:35.410
Und das geht

00:29:35.410 --> 00:29:37.150
halt nur, wenn man dahin geht, wo die Leute sind

00:29:37.150 --> 00:29:39.470
und die sind halt bei WordPress. Oder waren sie auf jeden Fall

00:29:39.470 --> 00:29:40.130
zumindest damals

00:29:40.130 --> 00:29:43.310
zu mehr oder weniger 100 Prozent.

00:29:43.790 --> 00:29:45.130
Ja, ich weiß nicht, ob sich das groß geändert hat.

00:29:45.650 --> 00:29:46.790
Ja doch, es gibt mittlerweile Hoster.

00:29:47.190 --> 00:29:48.990
Es gibt zum Beispiel Podigy

00:29:48.990 --> 00:29:51.450
als Podcast-Hoster,

00:29:51.550 --> 00:29:53.510
der inzwischen auch relativ groß ist

00:29:53.510 --> 00:29:53.870
und

00:29:53.870 --> 00:29:57.290
einer der Gründer davon

00:29:57.290 --> 00:29:59.150
war halt auch bei einem von diesen

00:29:59.150 --> 00:30:01.150
Podcast-Episoden zu Gast

00:30:01.150 --> 00:30:02.470
und der erzählt dann so, ja,

00:30:03.470 --> 00:30:04.890
wir haben das dann auch gemacht,

00:30:04.890 --> 00:30:06.630
irgendwie so Podcast-Hosting irgendwie mal gebaut,

00:30:06.730 --> 00:30:08.470
aber wir haben dann Ruby on Rails genommen und da dachte ich mir so, ja,

00:30:09.050 --> 00:30:10.810
okay, das ist schon mal

00:30:10.810 --> 00:30:12.910
eine deutlich bessere Wahl. Also ich würde

00:30:12.910 --> 00:30:14.730
auch, also wenn ich so spontan sagen müsste,

00:30:14.870 --> 00:30:16.890
so Ruby on Rails ist wahrscheinlich eine gute Wahl

00:30:16.890 --> 00:30:18.130
oder eben Django wahrscheinlich auch,

00:30:18.770 --> 00:30:20.830
um sowas zu bauen, weil da hat man halt einen Großteil

00:30:20.830 --> 00:30:22.770
von dem ganzen Kram, den man braucht, der ist da halt

00:30:22.770 --> 00:30:23.430
schon einfach drin.

00:30:25.550 --> 00:30:26.850
Oder nachladbar zumindest.

00:30:27.290 --> 00:30:28.710
Ja, und man hat halt

00:30:28.710 --> 00:30:30.770
Wege, damit umzugehen

00:30:30.770 --> 00:30:32.830
und das macht es halt dann

00:30:32.830 --> 00:30:34.030
natürlich schon mal deutlich einfacher.

00:30:34.570 --> 00:30:36.830
Auf der anderen Seite ist es dann halt so, wenn du

00:30:36.830 --> 00:30:37.990
jetzt aber eigentlich

00:30:37.990 --> 00:30:41.390
die ganzen

00:30:41.390 --> 00:30:42.830
Podcasts,

00:30:43.690 --> 00:30:45.470
Blogs, die es da draußen gibt, unterstützen möchtest,

00:30:45.530 --> 00:30:47.670
in dem, was sie tun. Ja, ist halt schwierig.

00:30:47.790 --> 00:30:49.490
Da musst du halt dann irgendwas für WordPress entwickeln.

00:30:49.570 --> 00:30:51.690
Das ist natürlich nicht so einfach. Also ich weiß es nicht.

00:30:51.710 --> 00:30:52.730
Ich habe keine Antwort darauf.

00:30:54.190 --> 00:30:55.770
Ja. Aber ich fand es halt

00:30:55.770 --> 00:30:57.730
interessant, dass das halt, wie sich das

00:30:57.730 --> 00:30:59.230
da so entwickelt hat. Und

00:30:59.230 --> 00:31:00.910
deswegen kam ich eigentlich drauf.

00:31:01.450 --> 00:31:03.610
Die haben dann nochmal versucht, das alles komplett

00:31:03.610 --> 00:31:05.250
neu zu bauen. Und zwar in Elixir.

00:31:06.710 --> 00:31:07.590
Aha. Ja.

00:31:08.890 --> 00:31:09.750
Die Katze beißt sich in den

00:31:09.750 --> 00:31:11.150
Schwanz. Genau. Und

00:31:11.150 --> 00:31:12.810
eigentlich eine ganz gute Idee.

00:31:13.690 --> 00:31:15.350
Aber das ist dann irgendwie auch

00:31:15.350 --> 00:31:16.090
nicht so richtig

00:31:16.090 --> 00:31:18.230
dann fertig geworden.

00:31:19.910 --> 00:31:21.190
Aber im Prinzip würde ich auch sagen,

00:31:21.310 --> 00:31:22.590
ja, so Elixir klingt schon mal deutlich besser.

00:31:25.730 --> 00:31:27.410
Das hast du dann nicht gemacht, weil man das mit Asynch

00:31:27.410 --> 00:31:29.110
so toll machen kann, bei Elixir?

00:31:29.570 --> 00:31:30.630
Ja, weil du damit halt auch

00:31:30.630 --> 00:31:33.270
die harten Probleme lösen kannst.

00:31:33.550 --> 00:31:35.310
Du quärst dich mehr krass mit dem Maus-Unterherspiel.

00:31:35.710 --> 00:31:37.250
Ja, nee, das ist gut, aber

00:31:37.250 --> 00:31:39.290
das ist nochmal eher solche Sachen

00:31:39.290 --> 00:31:41.450
wie, du willst ja auch zum Beispiel die Files

00:31:41.450 --> 00:31:42.330
irgendwie

00:31:42.330 --> 00:31:45.290
distributieren, zum Beispiel.

00:31:46.630 --> 00:31:47.370
Und du kannst

00:31:47.370 --> 00:31:49.250
natürlich ein CDN nehmen, aber ich merke das jetzt auch

00:31:49.250 --> 00:31:51.210
irgendwie, so CDN ist halt

00:31:51.210 --> 00:31:52.990
einmal teuer und

00:31:52.990 --> 00:31:54.950
ja, also weiß nicht,

00:31:55.750 --> 00:31:57.190
wäre eigentlich schon cooler, das selber

00:31:57.190 --> 00:31:59.330
machen zu können, aber dann ist halt wieder blöd.

00:31:59.430 --> 00:32:01.570
Also das kannst du dann nicht irgendwie mit einem WordPress-Plugin

00:32:01.570 --> 00:32:02.510
machen, da kannst du keine Files haben.

00:32:03.370 --> 00:32:04.530
Oh, kann man schon, aber

00:32:04.530 --> 00:32:06.150
das...

00:32:06.150 --> 00:32:08.150
Was ist mit einem selbst gecodeten Minio oder sowas?

00:32:09.570 --> 00:32:09.970
Ja,

00:32:10.210 --> 00:32:11.430
ja, ja, gut, aber

00:32:11.430 --> 00:32:14.010
es ist halt auch kein CDN, hast du auch

00:32:14.010 --> 00:32:15.970
keine, wenn du globale

00:32:15.970 --> 00:32:16.950
Infrastruktur haben willst.

00:32:17.750 --> 00:32:19.950
Also du meinst, die Verteilung über mehrere Länder hinweg ist sonst

00:32:19.950 --> 00:32:20.390
kompliziert?

00:32:21.890 --> 00:32:23.730
Ja, auch generell die schnelle Anbindung,

00:32:23.890 --> 00:32:25.970
wenn du halt sehr viele große Dateien

00:32:25.970 --> 00:32:27.810
hosten willst, ist nicht

00:32:27.810 --> 00:32:30.070
ganz simpel, das performant

00:32:30.070 --> 00:32:31.930
hinzukriegen. Der Vorteil bei Elixir wäre halt,

00:32:31.930 --> 00:32:33.150
du kannst halt alles damit machen.

00:32:33.670 --> 00:32:35.250
Du kannst halt da dein

00:32:35.250 --> 00:32:37.150
File-Verwaltungs-Dings mitmachen,

00:32:37.470 --> 00:32:39.050
genauso wie dein Backend für

00:32:39.050 --> 00:32:40.970
irgendwie dein Frontend

00:32:40.970 --> 00:32:44.010
du musst eigentlich nie

00:32:44.010 --> 00:32:45.530
diese Umgebung verlassen

00:32:45.530 --> 00:32:47.370
und kannst darin halt alles bauen.

00:32:47.950 --> 00:32:50.250
Ja, aber warum ist das denn so? Warum ist das denn für alles geeignet?

00:32:50.270 --> 00:32:52.090
Das hört sich so an, als würdest du den Podcast umbenennen wollen.

00:32:53.810 --> 00:32:54.570
Noch nicht, nein.

00:32:54.930 --> 00:32:56.390
Lernst du denn Elixier

00:32:56.390 --> 00:32:58.550
oder ist es nur Neid, der aus dir spricht?

00:32:59.190 --> 00:33:00.190
Ja, es ist schon Neid

00:33:00.190 --> 00:33:00.830
auch, ja.

00:33:03.090 --> 00:33:03.670
Kann ich verstehen.

00:33:04.790 --> 00:33:06.210
Ich habe tatsächlich auch

00:33:06.210 --> 00:33:08.310
hier so Elixier in Action oder sowas, Buch rumliegen.

00:33:08.310 --> 00:33:10.190
Ich habe auch schon mal reingeguckt, aber ich habe es noch nicht.

00:33:10.330 --> 00:33:13.170
Das diffundiert jetzt dein Kopfkissen durch in deinen Kopf.

00:33:13.390 --> 00:33:14.970
Genau, das hoffe ich mir davon.

00:33:15.210 --> 00:33:16.590
Mal schauen, was ist die beste Methode.

00:33:18.130 --> 00:33:19.270
Ich habe auch noch so ein, zwei Bücher

00:33:19.270 --> 00:33:19.850
unter dem Kopfkissen.

00:33:21.810 --> 00:33:23.150
Bei Alexi habe ich auch immer das Gefühl,

00:33:23.290 --> 00:33:25.330
ich hätte gerne die Zeit schon reingesteckt,

00:33:25.410 --> 00:33:27.190
das mal gelernt zu haben, aber jetzt

00:33:27.190 --> 00:33:28.950
habe ich doch auch keine Lust, das gerade jetzt zu machen.

00:33:29.870 --> 00:33:30.050
Ja.

00:33:31.050 --> 00:33:33.850
Ja, aber Jochen, erklär mal, warum ist das so?

00:33:34.890 --> 00:33:35.430
Ja, Kekse

00:33:35.430 --> 00:33:36.330
sind ein großes Thema.

00:33:36.330 --> 00:33:38.170
Also was halt auch

00:33:38.170 --> 00:33:40.130
eben, weshalb ich das jetzt auch so betont habe,

00:33:40.250 --> 00:33:41.890
Man kann damit halt alles machen. Du kannst damit halt auch

00:33:41.890 --> 00:33:43.810
Files surfen und kriegst halt, also zum Beispiel

00:33:43.810 --> 00:33:45.570
irgendwie nehmen wir dieses Problem von Hand mit dem

00:33:45.570 --> 00:33:48.130
Django-Channel ja auch schon ein paar Mal

00:33:48.130 --> 00:33:50.090
irgendwie private Files surfen

00:33:50.090 --> 00:33:51.950
oder sowas.

00:33:52.450 --> 00:33:53.390
Wenn du das jetzt irgendwie,

00:33:53.950 --> 00:33:55.970
nehmen wir an, du nimmst jetzt mal Django als

00:33:55.970 --> 00:33:57.690
deine Podcast-Hosting-Plattform

00:33:57.690 --> 00:34:00.010
und jetzt willst du aber sowas

00:34:00.010 --> 00:34:02.150
auch haben, vielleicht wie private Podcasts

00:34:02.150 --> 00:34:04.090
oder keine Ahnung, wenn es sowas gibt, keine Ahnung, ich weiß es

00:34:04.090 --> 00:34:05.750
nicht, aber du willst irgendwie den Zugriff beschränken.

00:34:06.150 --> 00:34:07.930
Oder Bilder oder so von der Familie.

00:34:08.070 --> 00:34:09.490
Deine geheimen Vertragsdaten.

00:34:09.610 --> 00:34:11.510
irgendwie sowas, dann

00:34:11.510 --> 00:34:13.770
ist das halt nicht mehr so ganz einfach,

00:34:13.930 --> 00:34:16.030
weil die Files kannst du ja

00:34:16.030 --> 00:34:17.970
auch nicht mit Django direkt ausliefern, wenn du das

00:34:17.970 --> 00:34:20.110
jetzt mal so die Folgen erst abgreifst. Kannst du schon.

00:34:20.110 --> 00:34:21.430
Ist halt aber dann

00:34:21.430 --> 00:34:23.950
nicht so gut, wenn da tausend Leute gleichzeitig drauf

00:34:23.950 --> 00:34:25.930
zugreifen. Wenn da viele Leute gleichzeitig

00:34:25.930 --> 00:34:27.170
drauf zugreifen, geht das nicht so gut.

00:34:28.090 --> 00:34:29.850
Auf der anderen Seite kann eigentlich nur

00:34:29.850 --> 00:34:32.170
Django bzw. der Applikationsserver entscheiden,

00:34:32.410 --> 00:34:33.750
ob jetzt irgendwie... Privat, viele Leute gleichzeitig,

00:34:33.850 --> 00:34:35.050
hatte ich auch irgendwie gerade so ein bisschen, ja.

00:34:35.790 --> 00:34:37.930
Ob ein Request autorisiert ist oder nicht.

00:34:38.590 --> 00:34:40.030
Der Dominik bezweifelt unseren Erfolg.

00:34:40.510 --> 00:34:41.270
Wie, warte, wieso?

00:34:42.390 --> 00:34:43.950
Naja, also das ist...

00:34:43.950 --> 00:34:44.630
Privat und viele Leute gleichzeitig.

00:34:44.790 --> 00:34:47.850
Natürlich, in unserer coolen Gang laden viele Leute...

00:34:47.850 --> 00:34:48.850
Das passiert relativ schnell.

00:34:48.950 --> 00:34:50.630
Das passiert möglicherweise schon mit einem Browser,

00:34:50.710 --> 00:34:51.530
kriegst du das halt schon hin.

00:34:52.510 --> 00:34:54.610
Also wenn du halt irgendwie da, weiß ich nicht...

00:34:54.610 --> 00:34:56.270
Wenn du mittlere Maustaste hast, dann mach dir einen neuen Tab auf.

00:34:56.830 --> 00:34:58.050
Ja, wenn du einen neuen Tab aufmachst.

00:34:58.070 --> 00:35:00.170
Ja, auch wenn du jetzt zehn Bilder auf einer Seite hast,

00:35:00.250 --> 00:35:01.470
dann ist es schon vorbei.

00:35:02.650 --> 00:35:05.170
Das heißt, du kriegst das schon mit einem Browser hin.

00:35:05.610 --> 00:35:08.570
Also wenn du jetzt, ich weiß nicht, wie viel Worker du normalerweise hast,

00:35:08.590 --> 00:35:10.550
wenn du jetzt eine billige VM hast

00:35:10.550 --> 00:35:12.190
auf Hetzner oder weiß ich nicht,

00:35:12.830 --> 00:35:14.590
dann ist es halt, wenn du da nur

00:35:14.590 --> 00:35:16.630
ein paar Prozesse laufen hast, dann sind die halt schon mit einem

00:35:16.630 --> 00:35:17.770
Request ausgelastet.

00:35:18.170 --> 00:35:20.670
Was ist jetzt mit Xcent-Pfeil

00:35:20.670 --> 00:35:22.630
noch? Genau, das wäre dann halt

00:35:22.630 --> 00:35:24.610
sozusagen eine Möglichkeit, das Problem zu

00:35:24.610 --> 00:35:26.490
lösen, dass man halt, dass der

00:35:26.490 --> 00:35:28.610
Request an den Applikationsverfahrer geht, der

00:35:28.610 --> 00:35:30.610
überprüft, ob der autorisiert

00:35:30.610 --> 00:35:32.410
ist oder nicht und schickt dann halt einen

00:35:32.410 --> 00:35:34.250
Header zurück in der Response, ja,

00:35:35.030 --> 00:35:36.370
also dieser Request

00:35:36.370 --> 00:35:38.170
sah gut aus und dann geht jetzt irgendwas

00:35:38.170 --> 00:35:40.090
was in der Proxy-Pipeline in Nginx

00:35:40.090 --> 00:35:41.890
oder so hin, sieht diesen

00:35:41.890 --> 00:35:43.490
Header in der Response und sagt,

00:35:43.710 --> 00:35:45.990
ah, das war eigentlich eine File-Response,

00:35:46.210 --> 00:35:47.870
aber der Applikations-Server kann ja jetzt keine

00:35:47.870 --> 00:35:49.150
Files zurückschicken, das wäre ja blöd.

00:35:49.690 --> 00:35:51.870
Dann bleibt da ja die ganze Zeit die Verbindung offen

00:35:51.870 --> 00:35:53.310
und es gibt nicht so viele Applikations-Server.

00:35:53.850 --> 00:35:55.390
Daher nehme ich jetzt mal diesen Request,

00:35:55.550 --> 00:35:57.590
diese Response und tausche die aus durch

00:35:57.590 --> 00:35:58.610
eine File-Response

00:35:58.610 --> 00:36:01.910
mit dem echten File, auf das ich Zugriff habe

00:36:01.910 --> 00:36:03.550
und schicke das zurück.

00:36:03.550 --> 00:36:05.330
Ja, so ist die Konfiguration dann doch wieder

00:36:05.330 --> 00:36:07.210
eigentlich relativ blibberle, weil in den X

00:36:07.210 --> 00:36:08.430
einen Eintrag macht, der dann dieses

00:36:08.430 --> 00:36:11.550
X-File-Response-Send-Dings

00:36:11.550 --> 00:36:13.550
macht. Ja, aber auf jeden Fall Nginx benutzen.

00:36:13.590 --> 00:36:15.170
Genau. Geht das nicht mit Kendi?

00:36:15.190 --> 00:36:17.130
Aber Jochen, warum ist denn das jetzt besser?

00:36:17.230 --> 00:36:18.530
Warum ist denn das besser, wenn der

00:36:18.530 --> 00:36:21.110
Nginx das macht, anstatt dass unser

00:36:21.110 --> 00:36:22.930
Django, unser Glydekorn oder sowas...

00:36:22.930 --> 00:36:25.210
Bei dem Nginx ist das halt egal, wenn da

00:36:25.210 --> 00:36:27.130
tausend Requests reinkommen. Aber warum?

00:36:27.210 --> 00:36:29.190
Warum ist es dem egal und warum ist es uns nicht egal?

00:36:30.070 --> 00:36:31.410
Ja, deswegen, weil halt

00:36:31.410 --> 00:36:33.490
sozusagen eine Verbindung den Nginx

00:36:33.490 --> 00:36:35.470
nicht blockiert. Also selbst wenn

00:36:35.470 --> 00:36:37.350
er da Daten zurücksendet, dann kann

00:36:37.350 --> 00:36:39.370
er das auf tausend Verbindungen gleichzeitig

00:36:39.370 --> 00:36:41.270
tun. Das geht aber jetzt bei einem

00:36:41.270 --> 00:36:43.370
normalen Django-Applikationsserver

00:36:43.370 --> 00:36:45.390
so nicht, sondern da ist der Prozess

00:36:45.390 --> 00:36:47.130
komplett geblockt, weil der halt synchron

00:36:47.130 --> 00:36:49.070
Sachen rausschreibt. Das heißt, das müsste man

00:36:49.070 --> 00:36:50.150
einen ASCII-Django nehmen.

00:36:51.070 --> 00:36:51.710
Der ist quasi

00:36:51.710 --> 00:36:55.430
besser parallel als...

00:36:55.430 --> 00:36:57.270
Ja, also

00:36:57.270 --> 00:36:58.750
der macht halt parallel I.O.

00:37:00.070 --> 00:37:01.410
Und das geht

00:37:01.410 --> 00:37:03.330
mit Django erstmal so

00:37:03.330 --> 00:37:05.050
nicht. Das geht jetzt inzwischen auch so ein bisschen, aber

00:37:05.050 --> 00:37:07.010
erstmal nicht so einfach.

00:37:07.750 --> 00:37:09.070
Und das Problem,

00:37:09.190 --> 00:37:11.310
was ich damit habe, sozusagen aus der Systemperspektive,

00:37:11.410 --> 00:37:13.130
ist halt, du musst

00:37:13.130 --> 00:37:15.290
halt einfach nur, um diese Konfiguration

00:37:15.290 --> 00:37:17.130
dann testen zu können, dass, wenn du das

00:37:17.130 --> 00:37:19.170
jetzt lokal überprüfen willst, funktioniert das denn alles

00:37:19.170 --> 00:37:20.850
so, wie ich das gedacht habe, dann musst du dann

00:37:20.850 --> 00:37:23.470
Nginx hochfahren und eine Datenbank

00:37:23.470 --> 00:37:25.130
und dann deinen Applikationsserver

00:37:25.130 --> 00:37:26.990
und ein Caching. Ja, du brauchst es wesentlich

00:37:26.990 --> 00:37:28.850
nur in einer Staging-Umgebung testen, oder? Also

00:37:28.850 --> 00:37:30.870
in einer Develop-Umgebung

00:37:30.870 --> 00:37:33.010
hast du die ganzen Bauteile ja normalerweise

00:37:33.010 --> 00:37:34.910
nicht. Ja, und das kannst

00:37:34.910 --> 00:37:36.910
schon, dann fährst du halt einen Haufen Docker-Container hoch, geht schon.

00:37:37.330 --> 00:37:38.710
Ja, gut, aber das machst du ja nicht zum

00:37:38.710 --> 00:37:40.830
entwickeln, sondern das machst du ja wirklich nur zum überprüfen.

00:37:41.910 --> 00:37:42.890
Ja, naja,

00:37:42.990 --> 00:37:43.850
also, aber

00:37:43.850 --> 00:37:46.890
kann man nicht alles machen. Also gut, ich mach das nicht.

00:37:47.130 --> 00:37:48.810
So, ich stelle Docker-Compost ab und dann ist

00:37:48.810 --> 00:37:50.690
die ganze Liste, die in der YAML drin ist, die wird dann einfach mal

00:37:50.690 --> 00:37:52.310
hochgefahren. Ja,

00:37:52.510 --> 00:37:54.670
der Punkt ist nur, es ist halt... Ja, das mach ich schon auch, aber

00:37:54.670 --> 00:37:56.830
es ist halt ein Haufen... Wenn 3 oder 4 so Dinge laufen

00:37:56.830 --> 00:37:58.190
hat, dann ist schon der Speicher voll.

00:37:58.530 --> 00:38:00.630
Jaja, also es ist halt aufwendig und

00:38:00.630 --> 00:38:02.910
es ist halt auch irgendwie eine komplizierte

00:38:02.910 --> 00:38:04.750
Konfiguration und es ist halt fehleranfällig.

00:38:04.910 --> 00:38:06.470
und wenn du jetzt

00:38:06.470 --> 00:38:08.170
Elixir verwendest,

00:38:09.430 --> 00:38:10.850
dann ist das halt alles,

00:38:11.070 --> 00:38:12.910
dann kannst du das lokal testen, du kannst

00:38:12.910 --> 00:38:14.550
lokal das entwickeln und du kannst

00:38:14.550 --> 00:38:16.870
deployst es so produktiv,

00:38:16.950 --> 00:38:18.730
natürlich vielleicht mit einer etwas anderen Konfiguration, aber

00:38:18.730 --> 00:38:20.650
mehr oder weniger genauso, wie du es lokal getestet hast

00:38:20.650 --> 00:38:22.830
und wenn das dann lokal funktioniert, dann funktioniert das

00:38:22.830 --> 00:38:24.610
dann auch und du brauchst keine komplizierte Architektur mit

00:38:24.610 --> 00:38:25.490
irgendwie noch drei anderen

00:38:25.490 --> 00:38:28.210
Teilen, die halt zusammen

00:38:28.210 --> 00:38:30.310
funktionieren müssen, damit es klappt insgesamt

00:38:30.310 --> 00:38:32.350
und das hat natürlich schon einen gewissen Reiz.

00:38:32.650 --> 00:38:34.030
Also ich meine, ich

00:38:34.030 --> 00:38:36.390
entwickle auch viel mit Docker, weil das

00:38:36.390 --> 00:38:38.530
halt, ja, ich meine, bei ganz

00:38:38.530 --> 00:38:40.270
vielen Leuten wahrscheinlich so das Mittel der Wahl ist, um halt

00:38:40.270 --> 00:38:42.450
Entwicklungsumgebung zu vereinheitlichen. Und bei mir ist

00:38:42.450 --> 00:38:44.650
das so, also das lüftet,

00:38:44.770 --> 00:38:46.370
also mein Laptop lüftet einfach die

00:38:46.370 --> 00:38:48.370
ganze Zeit. Ich dachte, er hat keinen Lüfter mehr. Ach so,

00:38:48.450 --> 00:38:50.450
stimmt, das war noch mal. Und wenn ich das vom Strom

00:38:50.450 --> 00:38:52.210
abstecke, dann dauert das eine Stunde und dann ist der Akku leer.

00:38:52.590 --> 00:38:54.410
Und das ist halt irgendwie eigentlich

00:38:54.410 --> 00:38:56.450
kein schöner Zustand. Aber so ist

00:38:56.450 --> 00:38:58.510
es halt. Also das ist bei mir nicht so,

00:38:58.610 --> 00:38:59.350
Jochen. Da ist

00:38:59.350 --> 00:39:02.550
eine andere Konfiguration.

00:39:02.730 --> 00:39:04.210
Ich sage mal, es ist eine andere Konfiguration.

00:39:04.230 --> 00:39:06.950
Ich versuche auch gerade so ein bisschen wieder von dem Docker-Zeugs runterzukommen,

00:39:07.030 --> 00:39:09.550
weil das ist halt echt das...

00:39:09.550 --> 00:39:10.730
Ach ja, und jetzt bei den neuen

00:39:10.730 --> 00:39:12.470
Macs geht das ja auch gar nicht mehr.

00:39:12.790 --> 00:39:14.790
Die haben keine Virtualisierungsunterstützung.

00:39:16.170 --> 00:39:16.730
Okay, cool.

00:39:16.730 --> 00:39:17.750
Wie war der Fortschritt?

00:39:18.730 --> 00:39:20.910
Es gibt keine Virtualisierungsunterstützung, also kein Parallels

00:39:20.910 --> 00:39:21.190
oder was?

00:39:22.730 --> 00:39:24.650
What? Wegen ARM? Warum?

00:39:25.830 --> 00:39:26.850
Ja, ich weiß

00:39:26.850 --> 00:39:28.010
nicht, ob das noch kommt oder so, aber

00:39:28.010 --> 00:39:29.570
einen Tag gibt es das auf jeden Fall nicht.

00:39:29.830 --> 00:39:31.370
Ach cool, dann muss man sich endlich einen anschaffen.

00:39:32.730 --> 00:39:34.190
Wirklich nicht. Keine Methodisierung.

00:39:34.210 --> 00:39:36.310
Brauchst dann zwei Macs, einen für

00:39:36.310 --> 00:39:37.950
Windows und einen für

00:39:37.950 --> 00:39:38.790
Microsoft.

00:39:40.430 --> 00:39:42.150
Ja gut, aber das sind ja jetzt alles nur, also ich meine,

00:39:42.490 --> 00:39:44.030
wie man seine Entwicklungsumgebung betreibt

00:39:44.030 --> 00:39:46.090
und warum man das wie macht,

00:39:46.170 --> 00:39:47.710
das ist ja so ein bisschen freigestellt. Aber

00:39:47.710 --> 00:39:49.990
der eigentliche

00:39:49.990 --> 00:39:52.170
Hintergrund ist doch halt wirklich der,

00:39:52.270 --> 00:39:54.010
dass man in Python einfach daran

00:39:54.010 --> 00:39:54.670
gebunden ist,

00:39:56.130 --> 00:39:58.090
dass jeder Worker einen Request

00:39:58.090 --> 00:39:59.830
bearbeiten kann, weil die halt nicht parallel

00:39:59.830 --> 00:40:01.990
arbeiten können. Und in Elixir

00:40:01.990 --> 00:40:04.290
ist es halt nicht so, weil die

00:40:04.290 --> 00:40:05.870
VM, auf der das läuft, halt super

00:40:05.870 --> 00:40:07.930
parallel ist, weil die alles gleichzeitig machen können.

00:40:10.050 --> 00:40:11.770
Auch hier wieder mit dem Hintergrund halt,

00:40:11.870 --> 00:40:13.510
dass das aus einem Telekommunikations

00:40:13.510 --> 00:40:15.770
Background kommt und wenn

00:40:15.770 --> 00:40:17.690
die Hardware nur ein Telefonat

00:40:17.690 --> 00:40:19.830
gleichzeitig machen kann, dann ist das

00:40:19.830 --> 00:40:20.910
halt ziemlich blöd und

00:40:20.910 --> 00:40:23.930
es ist besser, wenn man tausend Telefonate gleichzeitig

00:40:23.930 --> 00:40:25.590
macht. Das erinnert mich an die 90er, wo mein Dad

00:40:25.590 --> 00:40:27.750
mich die ganze Zeit angeschrien hat, geh aus dem

00:40:27.750 --> 00:40:29.370
Internet, ich will telefonieren.

00:40:29.910 --> 00:40:31.710
Und wenn ihr da halt so einen Knotenpunkt gehabt

00:40:31.710 --> 00:40:33.750
hättet, dann hättet ihr vielleicht mehrere

00:40:33.750 --> 00:40:35.690
Sachen. Aber so Telefonate

00:40:35.690 --> 00:40:37.630
haben ja auch üblicherweise sehr strenge

00:40:37.630 --> 00:40:39.730
Real-Time-Anforderungen. Das heißt,

00:40:39.930 --> 00:40:41.530
es reicht ja nicht, tausend Sachen gleichzeitig

00:40:41.530 --> 00:40:43.750
zu machen, sondern du musst ja tausend Real-Time-Sachen

00:40:43.750 --> 00:40:44.610
gleichzeitig machen.

00:40:45.910 --> 00:40:47.250
Und dann ist dieses

00:40:47.250 --> 00:40:49.330
sowieso schon schwierige Problem nochmal direkt

00:40:49.330 --> 00:40:51.590
ein kleines bisschen noch viel schwieriger

00:40:51.590 --> 00:40:51.910
geworden.

00:40:53.450 --> 00:40:53.710
Und

00:40:53.710 --> 00:40:57.610
das ist so ein bisschen für mich das Coole an dieser

00:40:57.610 --> 00:40:59.450
ganzen Erlangen-und-Elixir-Sache,

00:40:59.750 --> 00:41:01.490
weil die halt einfach eine Basis haben,

00:41:01.490 --> 00:41:03.490
eine VM haben, die

00:41:03.490 --> 00:41:05.550
knallhart darauf ausgerichtet ist,

00:41:05.630 --> 00:41:07.570
tausend Sachen gleichzeitig in Realtime zu

00:41:07.570 --> 00:41:09.490
machen. Und wenn man das

00:41:09.490 --> 00:41:11.590
braucht, dann ist das eine absolut geniale

00:41:11.590 --> 00:41:13.490
Sache. Und das ist, glaube ich, eben in so einem Web-Umfeld

00:41:13.490 --> 00:41:15.550
kann das wirklich was sein, wo man das einfach ausnutzen

00:41:15.550 --> 00:41:16.930
kann, wo du halt wirklich sagen kannst, okay,

00:41:17.590 --> 00:41:19.010
da kommen Dateien rüber, da kommen

00:41:19.010 --> 00:41:21.450
Authentifizierung rüber, da kommt alles

00:41:21.450 --> 00:41:21.810
drüber.

00:41:24.130 --> 00:41:24.490
Und

00:41:24.490 --> 00:41:27.470
ja, das ist auch so ein bisschen die Faszination,

00:41:27.870 --> 00:41:29.530
das ist der Grund, warum ich das gerne mal

00:41:29.530 --> 00:41:30.830
gelernt gehabt hätte.

00:41:31.490 --> 00:41:51.250
Ja, oder noch ein Beispiel, wo das vielleicht ein bisschen deutlicher wird. Ich habe jetzt gerade nochmal kurz drüber nachgedacht. Also wenn man jetzt zum Beispiel etwas, was man häufig nicht hinkriegt, es gibt so eigentlich, was man gerne hätte eigentlich, ist dieses HLS, also HTTP Livestreaming.

00:41:52.910 --> 00:41:55.190
sozusagen, das ist so ein Standard,

00:41:55.650 --> 00:41:56.770
im Grunde, das zackt halt

00:41:56.770 --> 00:41:58.910
große Dateien in viele kleine und

00:41:58.910 --> 00:42:01.330
aber du brauchst halt Server-Unterstützung

00:42:01.330 --> 00:42:03.030
dafür. Wenn du das jetzt gerne

00:42:03.030 --> 00:42:04.790
anbieten würdest, sodass Podcast-Clients

00:42:04.790 --> 00:42:07.070
das sozusagen nutzen können, um halt

00:42:07.070 --> 00:42:08.930
auch auf schlechten Verbindungen

00:42:08.930 --> 00:42:10.970
und halt auch irgendwie online Sachen zu streamen,

00:42:11.510 --> 00:42:12.890
dann hast du halt, wenn du jetzt ein normales

00:42:12.890 --> 00:42:15.050
System baust, sag ich jetzt mal, so eben mit Ruby und Rails

00:42:15.050 --> 00:42:17.010
und keine Ahnung, Nginx und so und weißer Teufel,

00:42:17.630 --> 00:42:18.950
das hinzukriegen

00:42:18.950 --> 00:42:20.050
wird ein echter

00:42:20.050 --> 00:42:22.710
Stunt, während

00:42:22.710 --> 00:42:24.650
wenn du das halt alles in Elixir machst, dann ist das

00:42:24.650 --> 00:42:26.230
halt bloß Code, den du schreibst.

00:42:26.970 --> 00:42:28.730
Du musst auch den Standort unterstützen und du musst

00:42:28.730 --> 00:42:30.690
es halt irgendwie hinkriegen, aber das ist halt auch

00:42:30.690 --> 00:42:32.590
nur dein Applikationscode und nicht irgendwie

00:42:32.590 --> 00:42:34.490
ein großes System, was du da irgendwie drumherum

00:42:34.490 --> 00:42:35.130
konfigurieren musst.

00:42:36.250 --> 00:42:38.530
Und du kannst alle diese Anforderungen damit

00:42:38.530 --> 00:42:40.370
in den Griff kriegen. Das ist halt

00:42:40.370 --> 00:42:41.510
schon ein gewisser Charme.

00:42:43.950 --> 00:42:44.350
Ja,

00:42:44.470 --> 00:42:45.830
es ist einfach tief

00:42:45.830 --> 00:42:48.090
in einem Web-Server drin.

00:42:49.030 --> 00:42:50.230
Du hast einfach

00:42:50.230 --> 00:42:52.550
die Fähigkeiten, die du in einem

00:42:52.550 --> 00:42:54.630
Nginx hättest. Ich meine, im Prinzip kannst du das ja

00:42:54.630 --> 00:42:56.390
alles mit Nginx-Modulen machen. Kannst du ja

00:42:56.390 --> 00:42:57.330
Module schreiben.

00:42:58.530 --> 00:42:59.070
Nur, dass

00:42:59.070 --> 00:43:02.190
die Zuhörer haben gerade eben abgeschaltet.

00:43:02.450 --> 00:43:04.170
Die sind schon lange weg. Dann muss man das halt

00:43:04.170 --> 00:43:06.030
auch tun und das will eigentlich keiner.

00:43:06.550 --> 00:43:08.650
Ja, also okay. Das kann man mit

00:43:08.650 --> 00:43:10.490
Caddy und Traffic oder sowas nicht einfach machen.

00:43:10.570 --> 00:43:12.030
Was kann man bei alter Alternativen noch?

00:43:12.190 --> 00:43:13.190
Nein, leider alles nicht.

00:43:14.370 --> 00:43:16.210
Also kannst du auch

00:43:16.210 --> 00:43:18.470
in Traffic reinbauen. Musst du dann halt

00:43:18.470 --> 00:43:19.130
in Go programmieren.

00:43:20.230 --> 00:43:22.110
Caddy ist auch Go, oder? Ja, genau.

00:43:22.210 --> 00:43:23.150
Kannst halt auch in Go schreiben.

00:43:24.310 --> 00:43:26.470
Können die beide Module, die nachladbare

00:43:26.470 --> 00:43:26.770
Module?

00:43:28.990 --> 00:43:30.010
Ja, so middleware.

00:43:30.010 --> 00:43:31.650
Oder musst du das dann halt direkt selber kompilieren?

00:43:32.090 --> 00:43:34.350
Egal. Ja, also ist auf jeden Fall

00:43:34.350 --> 00:43:36.310
dann nicht mehr so richtig einfach. Und es ist

00:43:36.310 --> 00:43:38.230
halt ganz was anderes als die Applikation, die du dann

00:43:38.230 --> 00:43:39.430
normalerweise so schreibst.

00:43:40.050 --> 00:43:42.350
Aber genau, also wie kriegt

00:43:42.350 --> 00:43:43.930
Erlang das denn jetzt eigentlich hin?

00:43:44.950 --> 00:43:46.010
Es verwendet halt das

00:43:46.010 --> 00:43:47.390
sogenannte

00:43:47.390 --> 00:43:49.190
Actor-Model.

00:43:49.950 --> 00:43:50.790
Oh, jetzt.

00:43:51.150 --> 00:43:53.350
Du musst auch gleich noch,

00:43:53.670 --> 00:43:55.570
wenn du noch besser klingen willst, musst du sagen,

00:43:55.670 --> 00:43:57.770
Shared Nothing Concurred Programming via Message

00:43:57.770 --> 00:43:59.450
Parsing. Okay.

00:44:00.330 --> 00:44:01.810
Ja. Schön, haben wir

00:44:01.810 --> 00:44:03.230
jetzt, wissen alle Bescheid, oder?

00:44:04.230 --> 00:44:04.810
Fertig für heute.

00:44:06.530 --> 00:44:07.130
Nee, ich bin gerade abgestürzt.

00:44:08.190 --> 00:44:09.590
Das ist auch so, also das ist was, was man

00:44:09.590 --> 00:44:11.570
sehr schnell, ich habe ja mal versucht, Erlang

00:44:11.570 --> 00:44:11.970
zu lernen.

00:44:14.770 --> 00:44:15.410
Habe es dann

00:44:15.410 --> 00:44:17.210
wieder aufgegeben.

00:44:17.690 --> 00:44:19.410
Aber das ist so was, das ist so was, so was

00:44:19.410 --> 00:44:21.410
Konzeptuelles, was man sehr schnell lernt,

00:44:21.830 --> 00:44:23.470
wo man sich aber ungeheuer schwer nur

00:44:23.470 --> 00:44:25.030
dran gewöhnen kann. Also in dem

00:44:25.030 --> 00:44:27.490
Modell, in dem ich üblicherweise

00:44:27.490 --> 00:44:29.190
so lebe und programmiere, in Python,

00:44:30.230 --> 00:44:31.490
da schreibt man halt Programm und es wird von

00:44:31.490 --> 00:44:33.410
oben nach unten abgearbeitet. Und wenn ich eine Funktion

00:44:33.410 --> 00:44:35.330
aufrufe, dann ist es so, wie wenn ich die Funktion

00:44:35.330 --> 00:44:36.870
da eben an die Stelle hin kopiert hätte.

00:44:39.410 --> 00:44:39.770
Wesentlichen

00:44:39.770 --> 00:44:41.290
so, bis auf so ein paar Ausnahmen mit

00:44:41.290 --> 00:44:42.850
Rekursionen und Scopes und so, ist das

00:44:42.850 --> 00:44:45.210
das Modell, was ich im Kopf habe.

00:44:45.290 --> 00:44:47.270
Wenn ich eine Funktion aufrufe, dann ist es so, wie wenn die

00:44:47.270 --> 00:44:47.830
da jetzt steht.

00:44:49.410 --> 00:45:05.530
Und in Erlangen ist das aber nicht so. In Erlangen ist das Modell so ein bisschen anders. Da schreibt man ein Programm und es besteht aus ganz vielen Prozessen. Und auch was ein Prozess ist, ist da auch erstmal, das wird so ein bisschen, ja ein Prozess ist, stell dir einfach einen Prozess vor.

00:45:06.470 --> 00:45:32.330
Und die können sich dann Nachrichten schicken und zwar an ihre Mailboxes. Also jeder Prozess hat eine Mailbox und da kann man sich Nachrichten hinschicken. Und das Einzige, was diese Prozesse machen, ist im Wesentlichen Nachrichten aus ihren Mailboxes abrufen und die bearbeiten und anderen Prozessen Nachrichten in ihre Mailbox reinschicken. Und das ist von der Vorstellung her was total Verrücktes, was total Absurdes, weil wie kann man denn daraus ein funktionierendes Programm machen?

00:45:32.850 --> 00:45:34.190
Das könnte man ja in Django auch machen,

00:45:34.270 --> 00:45:35.810
indem man irgendwie so einen Cache für eine Datenbank nutzt,

00:45:35.850 --> 00:45:36.930
als diesen Mailbox-Layer oder sowas.

00:45:36.930 --> 00:45:37.890
Nee, kannst du da nicht machen,

00:45:38.230 --> 00:45:41.350
weil das tatsächlich da eine Entsprechung in der Maschine hat,

00:45:41.450 --> 00:45:43.650
weil diese Sachen alle gleichzeitig laufen.

00:45:43.750 --> 00:45:46.930
Und das ist so ein bisschen die Macht davon,

00:45:47.170 --> 00:45:48.870
das Coole davon.

00:45:49.670 --> 00:45:52.790
Und Mailboxes und Processes müssen nicht eins zu eins sein.

00:45:52.790 --> 00:45:56.170
Das heißt, du kannst an einem Mailbox viele Prozesse ranmachen

00:45:56.170 --> 00:45:59.390
oder ein Prozess kann mehrere Mailboxes bearbeiten,

00:45:59.490 --> 00:46:02.870
Je nachdem, wie dein System halt gerade an der Anforderung ist.

00:46:03.530 --> 00:46:05.070
Okay, aber warum ist das jetzt so cool?

00:46:05.070 --> 00:46:09.710
Das Coole ist, diese Prozesse heißen Actor.

00:46:10.230 --> 00:46:14.390
Dieses System aus Prozess und Mailbox heißt Actor.

00:46:15.770 --> 00:46:18.570
Und das hat eine bestimmte, oder so wie ich es mir vorstelle,

00:46:18.710 --> 00:46:20.230
hat das eine bestimmte Zuständigkeit.

00:46:20.690 --> 00:46:24.570
Das System ist zuständig für Dateien ausliefern.

00:46:25.850 --> 00:46:27.310
Und wenn ich eine Datei ausliefern möchte,

00:46:27.870 --> 00:46:29.730
dann sage ich, muss ich es nicht selber machen,

00:46:29.830 --> 00:46:31.590
sondern ich schicke nur eine Nachricht an die Dateien

00:46:31.590 --> 00:46:33.670
ausliefern Mailbox. Und da ist irgendjemand und der

00:46:33.670 --> 00:46:35.570
bearbeitet die dran. Das heißt, wenn

00:46:35.570 --> 00:46:37.570
ich entschieden habe, ich als

00:46:37.570 --> 00:46:39.590
Anwendungslogik habe entschieden, da muss jetzt diese

00:46:39.590 --> 00:46:41.570
Datei ausgeliefert werden, dann

00:46:41.570 --> 00:46:43.610
ist meine Arbeit beendet, indem ich eine

00:46:43.610 --> 00:46:45.570
korrekt formatierte Nachricht an die Mailbox

00:46:45.570 --> 00:46:46.910
Dateien ausliefern schicke.

00:46:47.650 --> 00:46:48.650
Dann bin ich fertig.

00:46:51.590 --> 00:46:53.610
Und auf der anderen Seite dieser Mailbox

00:46:53.610 --> 00:46:55.730
ist halt irgendein weiterer Prozess,

00:46:55.970 --> 00:46:57.310
der macht nichts anderes als

00:46:57.310 --> 00:46:59.350
da kommt eine Nachricht, ich soll

00:46:59.350 --> 00:47:01.250
eine Datei ausliefern an folgende

00:47:01.250 --> 00:47:03.010
Verbindung oder an folgende IP oder sonst was.

00:47:03.570 --> 00:47:05.310
Also mache ich das. Und dieser Prozess

00:47:05.310 --> 00:47:07.050
macht nichts anderes. Das heißt, es gibt

00:47:07.050 --> 00:47:09.150
einen Prozess, der ist zuständig für, oder

00:47:09.150 --> 00:47:10.490
eine Mailbox, ja, einen Actor,

00:47:11.070 --> 00:47:13.070
der ist zuständig für Dateien ausliefern. Es gibt

00:47:13.070 --> 00:47:14.970
einen Actor, der ist zuständig für Authentifizierung.

00:47:15.090 --> 00:47:16.910
Es gibt einen Actor, der ist zuständig für die Datenbank.

00:47:17.010 --> 00:47:18.610
Es gibt einen Actor, der ist zuständig für

00:47:18.610 --> 00:47:21.330
was weiß ich, SSL Termination,

00:47:21.430 --> 00:47:22.690
was auch immer man haben möchte, ja.

00:47:23.210 --> 00:47:23.950
Bühne frei.

00:47:25.290 --> 00:47:27.070
Jeder Actor macht eine Sache

00:47:27.070 --> 00:47:28.950
und ist für eine Sache zuständig.

00:47:29.170 --> 00:47:30.550
Und wenn jemand anders was machen soll,

00:47:31.010 --> 00:47:32.830
dann ist es einfach nur eine Nachricht.

00:47:35.050 --> 00:47:35.910
So, jetzt könnte man sagen,

00:47:36.010 --> 00:47:37.750
okay, das ist ja in einem objektorientierten System

00:47:37.750 --> 00:47:38.270
nicht anders.

00:47:38.410 --> 00:47:40.450
Ja, da schickt man Nachrichten von Klassen zu Klassen.

00:47:40.950 --> 00:47:41.570
Der Unterschied ist,

00:47:41.670 --> 00:47:44.910
dass diese Actors selbst laufende Prozesse sind.

00:47:45.270 --> 00:47:46.850
Das heißt, wenn ich eine Nachricht schicke,

00:47:46.850 --> 00:47:49.270
dann wird die halt gleichzeitig,

00:47:49.270 --> 00:47:50.310
die wird jetzt sofort bearbeitet.

00:47:51.450 --> 00:47:52.530
Ich muss nicht warten,

00:47:52.670 --> 00:47:55.330
bis die Nachricht abgearbeitet ist von der Klasse.

00:47:55.470 --> 00:47:57.390
Und das kann ja sehr lange dauern.

00:47:57.530 --> 00:47:59.170
Wenn meine View-Klasse aufgerufen wird

00:47:59.170 --> 00:48:00.390
und ich eine Datei ausliefern muss,

00:48:01.210 --> 00:48:02.950
dann dauert es halt so lange, wie es dauert,

00:48:02.990 --> 00:48:05.210
die Datei auszuliefern und dann ist die Nachricht bearbeitet.

00:48:05.630 --> 00:48:06.950
Sondern das sind wirklich einfach nur

00:48:06.950 --> 00:48:09.030
kurze Nachrichten. Mach das. Mach das. Tu das.

00:48:10.170 --> 00:48:10.910
Hier ist was passiert.

00:48:11.210 --> 00:48:12.250
Also Events.

00:48:12.810 --> 00:48:13.750
Das sind einfach nur

00:48:13.750 --> 00:48:16.770
Dinge, die passieren sollen oder Nachrichten,

00:48:16.770 --> 00:48:18.830
die in dem System relevant sind und die werden

00:48:18.830 --> 00:48:20.830
dann sofort weiter bearbeitet. Und derjenige,

00:48:20.990 --> 00:48:22.490
der für die Authentifizierung zuständig ist,

00:48:22.570 --> 00:48:25.030
der kann sofort den nächsten Request authentifizieren.

00:48:25.470 --> 00:48:47.170
So, das ist die eine Sache. Die andere Sache ist, in Klassen ist es, wenn man eine objektorientierte Architektur hat, dann ist es sehr leicht, Daten zu verteilen. Da gibt es diese, wir haben ja schon drüber gesprochen, es gibt diese Sachen, wie man Klassen aufbauen sollte und dass die abgeschlossen sein sollten und dass die ihre privaten Daten privat halten sollen und das Null-Interface und so weiter.

00:48:47.530 --> 00:49:13.810
Aber im Endeffekt ist es ja doch irgendwie so, dass man schon ungefähr weiß, was diese Klasse wie macht. Und auch, was die für Daten enthält. Und dann manchmal ist es halt auch so, dass man auf Daten zugreifen muss, die halt da drin sind und die draußen sind. Das geht in diesem Ektormodell überhaupt nicht. In dem Ektormodell gibt es nur eine Möglichkeit, mit einem anderen Ektor zu kommunizieren und das ist über eine Nachricht. Das heißt, alles, was in diesem Ektormodell passiert ist, du schickst Nachrichten.

00:49:15.370 --> 00:49:17.270
Aber die E-Mail-Box kann man dann klonen oder was?

00:49:17.370 --> 00:49:18.930
Oder dass die doch gleichzeitig irgendwas machen können?

00:49:20.030 --> 00:49:21.490
An der einen Mail-Box, wie du gesagt hast?

00:49:22.130 --> 00:49:23.410
Die Mail-Box ist

00:49:23.410 --> 00:49:24.510
der Endpoint.

00:49:24.830 --> 00:49:27.870
Du schreibst eine Nachricht und du tust die in den Briefkasten

00:49:27.870 --> 00:49:29.770
rein und dann bist du nicht mehr dafür verantwortlich.

00:49:29.790 --> 00:49:31.510
Also die Worker holen sich ihre Sachen alle raus.

00:49:32.070 --> 00:49:33.190
Dass da zehn Leute gleichzeitig

00:49:33.190 --> 00:49:35.430
diese Mail-Box bearbeiten, das kann dir völlig egal sein.

00:49:35.470 --> 00:49:37.010
Dann hast du so ein

00:49:37.010 --> 00:49:38.790
NIFO oder FIFO oder sowas,

00:49:38.930 --> 00:49:41.490
eine Methode und kannst dann einfach Dinge da rausnehmen

00:49:41.490 --> 00:49:42.010
aus der Mail-Box.

00:49:42.010 --> 00:49:44.110
Ja, also davon gibt es

00:49:44.110 --> 00:49:45.770
dann sehr, sehr viele. Also das ist halt so, dass

00:49:45.770 --> 00:49:47.170
ich weiß nicht,

00:49:48.650 --> 00:49:50.030
also Tausende gar kein

00:49:50.030 --> 00:49:51.610
Problem, auch Millionen kein Problem.

00:49:53.270 --> 00:49:53.590
Und

00:49:53.590 --> 00:49:54.550
das ist

00:49:54.550 --> 00:49:57.350
also ja,

00:49:57.810 --> 00:50:01.770
das kannst du quasi beliebig

00:50:01.770 --> 00:50:02.890
hochskalieren, sagen wir mal so.

00:50:03.410 --> 00:50:05.530
Man kann die auch dynamisch neu starten.

00:50:05.530 --> 00:50:07.270
Die werden auch dynamisch neu gestartet.

00:50:07.370 --> 00:50:09.330
Und wenn so einer abbricht, wenn einer kaputt geht,

00:50:09.410 --> 00:50:10.830
weil er irgendeine Nachricht nicht verstanden hat,

00:50:10.930 --> 00:50:13.370
dann wird der halt gelöscht und einfach ein neuer gestartet.

00:50:13.470 --> 00:50:14.650
da, zack, der ist jetzt weg.

00:50:15.390 --> 00:50:17.590
Ja, was ja kein Problem ist,

00:50:17.710 --> 00:50:19.250
wenn sozusagen,

00:50:19.850 --> 00:50:21.470
also was man dazu noch sagen muss,

00:50:21.550 --> 00:50:23.550
genau, eine schöne

00:50:23.550 --> 00:50:25.510
Eigenschaft sozusagen für dieses Modell,

00:50:26.010 --> 00:50:27.650
die halt Erlang da auch direkt mitbringt,

00:50:27.810 --> 00:50:29.270
ist, dass da das ja so eine

00:50:29.270 --> 00:50:31.330
funktionale Vorbeimersprache ist, ist halt

00:50:31.330 --> 00:50:33.270
sowas wie Daten verändern,

00:50:33.550 --> 00:50:34.510
das geht halt einfach nicht.

00:50:35.990 --> 00:50:37.270
Das ist

00:50:37.270 --> 00:50:38.070
prinzipiell nicht möglich.

00:50:39.230 --> 00:50:40.970
Du kannst halt bloß Daten kopieren, aber

00:50:40.970 --> 00:50:43.210
das heißt, du kannst Sachen auch mal perfekt cachen

00:50:43.210 --> 00:50:44.310
und so, weil

00:50:44.310 --> 00:50:47.310
und es ist auch egal, wer da was

00:50:47.310 --> 00:50:49.330
macht, weil es ist ja sowieso immer nur

00:50:49.330 --> 00:50:50.830
das Gleiche, ja, es ist halt nie,

00:50:51.270 --> 00:50:53.230
du kannst, es ist nicht möglich, dass jemand hinterher

00:50:53.230 --> 00:50:55.170
irgendwie Daten verändert hat und das in einem

00:50:55.170 --> 00:50:56.450
anderen State ist oder so,

00:50:57.150 --> 00:50:58.550
sondern, ja,

00:50:59.290 --> 00:51:00.710
wenn der State irgendwie

00:51:00.710 --> 00:51:03.030
kopiert wird und dann macht das halt ein anderer Actor,

00:51:03.190 --> 00:51:04.670
ist das halt völlig egal, wer das jetzt war.

00:51:05.970 --> 00:51:07.170
Ja, oder auch wenn der abstürzt und

00:51:07.170 --> 00:51:08.270
ein anderer übernimmt das, ist egal.

00:51:08.470 --> 00:51:11.070
Wir sind alle gleich. Du hast eine Armee

00:51:11.070 --> 00:51:13.530
von identisch ausschauenden Schauspielern.

00:51:14.490 --> 00:51:15.010
Ja, und

00:51:15.010 --> 00:51:17.230
man kann das halt auch nicht umgehen,

00:51:17.370 --> 00:51:18.610
weil, ja, das

00:51:18.610 --> 00:51:20.650
verbietet einem die Sprache. Es gibt ja auch

00:51:20.650 --> 00:51:22.890
sozusagen eine Actor-Implementierung in anderen Sprachen.

00:51:23.130 --> 00:51:25.030
Es gibt auch diverse in C++ zum Beispiel, aber

00:51:25.030 --> 00:51:27.470
du kannst... Pie-Acker, ja.

00:51:28.550 --> 00:51:28.990
Super Sache

00:51:28.990 --> 00:51:30.190
übrigens, sollte jeder verwenden.

00:51:30.890 --> 00:51:32.810
Okay, ich habe nur gehört, dass es das gibt.

00:51:32.810 --> 00:51:34.610
Ich weiß aber nicht, ich wundere, dass es sich an der

00:51:34.610 --> 00:51:36.670
Skala-Acker-Geschichte orientiert.

00:51:36.790 --> 00:51:38.790
Ja, genau, das kommt von Skala, ja. Wann, wie, wo

00:51:38.790 --> 00:51:40.970
benutzt man das dann? Wobei Skala

00:51:40.970 --> 00:51:42.430
ist ja quasi Erlangen für

00:51:42.430 --> 00:51:43.570
Ja, für die

00:51:43.570 --> 00:51:48.410
Wie benutzt man das dann?

00:51:48.890 --> 00:51:49.470
Pi-AK?

00:51:50.750 --> 00:51:51.450
Ja, wenn du halt

00:51:51.450 --> 00:51:53.550
synchrone Sachen haben willst

00:51:53.550 --> 00:51:56.790
Das Problem an Pi-AK ist halt

00:51:56.790 --> 00:51:58.530
dass das immer noch den Gil beachten muss

00:51:58.530 --> 00:52:00.390
Das heißt, du gewinnst nicht so ungeheuer viel

00:52:00.390 --> 00:52:04.210
Weil du immer noch in dieser

00:52:04.210 --> 00:52:06.790
mehr oder weniger Single-Threaded-Python-Welt

00:52:06.790 --> 00:52:08.630
festhängst, aber das macht

00:52:08.630 --> 00:52:09.690
die Struktur einfacher

00:52:09.690 --> 00:52:20.390
Ja, es löst dich davon ab, alles in einem Ablauf machen zu müssen, sondern du kannst sagen, so, dieses Ding ist jetzt verantwortlich für und das hat folgende Ressourcen fest in der Hand und zack.

00:52:21.570 --> 00:52:37.470
Aber was du halt nicht hinkriegen kannst und was das halt so ein bisschen, also ich meine, klar, du kannst natürlich dann sagen, okay, ich weiß, ich darf hier nur immutable Datenstrukturen verwenden und so, aber du kannst natürlich Sachen schon ändern, wenn du böse bist und das geht halt lange nicht.

00:52:38.410 --> 00:52:40.350
Ich habe gerade auch eine andere Bibliothek gefunden, die heißt

00:52:40.350 --> 00:52:42.550
Tespian. Habe ich aber nicht

00:52:42.550 --> 00:52:44.190
reingeguckt, keine Ahnung. Ja, das ist ein Aktor.

00:52:45.570 --> 00:52:46.750
Das sind die Theaterschauspieler.

00:52:49.330 --> 00:52:49.690
Ja,

00:52:50.350 --> 00:52:52.350
genau. Also ich meine, man zahlt da natürlich

00:52:52.350 --> 00:52:54.450
einen Preis für. Also man zahlt den Preis

00:52:54.450 --> 00:52:55.950
vor allen Dingen in Hauptspeicher.

00:52:56.490 --> 00:52:58.370
Man muss halt alles kopieren, wenn man irgendwas verändern

00:52:58.370 --> 00:52:58.630
will.

00:53:01.270 --> 00:53:02.430
Das ist halt auch das, was

00:53:02.430 --> 00:53:04.270
einen im Wesentlichen begrenzt, was die Anzahl

00:53:04.270 --> 00:53:06.190
der Aktor-Dinger

00:53:06.190 --> 00:53:08.390
halt angeht.

00:53:08.410 --> 00:53:10.410
dass man, wenn der Hauptspeicher voll ist, dann ist halt

00:53:10.410 --> 00:53:10.630
Schluss

00:53:10.630 --> 00:53:14.390
und es ist halt auch ein bisschen langsamer

00:53:14.390 --> 00:53:16.430
also wenn man jetzt sagen würde, okay man macht

00:53:16.430 --> 00:53:18.070
das Ganze handoptimiert

00:53:18.070 --> 00:53:20.350
irgendwie mit Threads oder so, dann ist das

00:53:20.350 --> 00:53:21.910
wahrscheinlich schneller, aber

00:53:21.910 --> 00:53:24.530
sagen wir mal so, es ist halt ein sehr sehr guter Kompromiss

00:53:24.530 --> 00:53:26.550
eigentlich, wenn es um

00:53:26.550 --> 00:53:27.730
ja

00:53:27.730 --> 00:53:30.130
Dinge parallel

00:53:30.130 --> 00:53:32.730
concurrent und in zuverlässig

00:53:32.730 --> 00:53:33.450
machen geht

00:53:33.450 --> 00:53:35.910
und so diese letztes

00:53:35.910 --> 00:53:38.150
das Sequential Performance brauchen die meisten Leute ja dann

00:53:38.150 --> 00:53:38.510
eh nicht.

00:53:40.090 --> 00:53:41.230
Und dafür ist es halt super.

00:53:41.410 --> 00:53:43.950
Selbst dann bist du ja oft in so einer Situation,

00:53:44.150 --> 00:53:45.250
wo Stabilität einfach

00:53:45.250 --> 00:53:46.810
wichtiger ist.

00:53:47.710 --> 00:53:50.030
Und die kriegst du da halt für umsonst

00:53:50.030 --> 00:53:52.170
mit dazu, weil das sehr schwierig ist,

00:53:52.170 --> 00:53:53.890
diese VM zu crashen.

00:53:55.150 --> 00:53:56.330
Und selbst wenn du irgendwas machst,

00:53:56.390 --> 00:53:58.390
was crasht, dann hast du halt

00:53:58.390 --> 00:53:59.690
diesen einen Request gecrashed.

00:54:01.030 --> 00:54:01.990
Aber der Rest läuft weiter.

00:54:02.550 --> 00:54:03.930
Es ist quasi nicht möglich,

00:54:04.050 --> 00:54:05.270
diese Maschine abzuschießen.

00:54:05.910 --> 00:54:14.990
Und das ist schon was, wo man auch mit Neid draufschauen kann, weil das ja in anderen Systemen relativ leicht ist.

00:54:14.990 --> 00:54:33.350
Das ist eher so schwer, das Ding irgendwie am Laufen zu halten. Da muss man immer die ganze Zeit fünf Teller jonglieren, während man auf einem Einrad herum, auf einem Seil herumfährt oder so. Ja, das ist da ganz angenehm.

00:54:34.310 --> 00:54:58.890
Aber es ist natürlich auch ganz klar ausgerichtet auf so Workloads, die parallel sind. Also eben genau aus dem Telefonieumfeld her. Jedes Telefonat selber braucht halt nicht ungefähr euer viel. Also du musst halt dann irgendwie deine, was weiß ich, 16 Kilobit musst du durchkriegen oder deine, wie viele auch immer sie gerade runter haben. Aber das ist ja nicht viel. Aber du hast halt 1000 Stück davon gleichzeitig in der Hand.

00:54:59.470 --> 00:55:17.630
Und in anderen Workloads hast du ja andere Anforderungen, jetzt zum Beispiel Machine Learning, da brauchst du halt eine Sache, die du hunderttausendmal ausführen musst und da ist es besser, Prozessoren zu haben, die das schnell machen können, deshalb hat sich das ja auch so ein bisschen anders entwickelt und ich glaube auch, dass da der Hintergrund so ein bisschen anders ist.

00:55:17.630 --> 00:55:45.530
Python kommt ja wirklich aus dieser, ja, ein Programm tut eine Sache Welt und da ist es dann halt einfacher zu sagen, okay, die Programme werden schneller, weil die Prozessoren schneller werden, weil die Single-Thread-Performance schneller wird. Aber jetzt sind wir nun mal genau in so einem Umbruch, wo es tatsächlich so ist, dass eben Single-Thread-Performance nicht mehr schneller wird. Aber dafür kannst du jetzt einen Computer kaufen, der 64 Cores hat. Oder gibt es nicht von AMD sogar schon die mit 128?

00:55:45.850 --> 00:56:09.830
Kann gut sein, ja. Das ist, äh, genau, ja. Und das, das, jetzt wird's halt, also, sag mal so, also, äh, das hatten wir in der ersten Sendung schon und ich, äh, würde da tatsächlich, äh, ehrlich gesagt, äh, bei bleiben, also, dass man das selten hat, dass man beides braucht. Also, du kannst ja problemlos 128 Python-Interpreter starten. Also, wenn du 128 Cores hast, dann hast du wahrscheinlich auch genug Hauptspeicher, um, äh, 128 Prozesse zu haben.

00:56:10.830 --> 00:56:17.310
Aber da hast du halt nur 128. Kannst du 128 gleichzeitig beantworten? Nicht 12.800.

00:56:17.470 --> 00:56:43.310
Aber wenn CPU dein Problem ist und dann brauchst du, ja, also wenn I.O. dein Problem ist, gut, aber dann brauchst du die ganzen Prozessoren eigentlich nicht, dann kannst du das auch auf einer CPU, also naja, ich weiß es nicht so genau, es ist, ja, also ich meine, man hat es selten, dass man beides braucht und für beide Extremfälle gibt es halt sehr gute Lösungen.

00:56:43.310 --> 00:56:55.070
Also den Data Science CPU verbrennen Use Case, da gibt es super Lösungen für. Den kann man jetzt nicht zum Websurfen verwenden, aber das funktioniert super.

00:56:55.730 --> 00:57:02.930
Sehr schöne Computer von Nvidia für mehrere hunderttausend Dollar. Würde ich nicht als Webserver einsetzen.

00:57:02.930 --> 00:57:20.310
Ne, genau, das macht doch nicht so viel Sinn. Und auf der anderen Seite ist halt irgendwie, weiß ich nicht, eben Lib, sozusagen, kriegen wir den Übergang zu Python wieder hin oder halt auch eben Node.js. LibUV ist halt auch auf einem Prozessor, macht das schon irgendwie ordentlich I.O.

00:57:20.310 --> 00:57:25.450
Das ist sozusagen die Event-Loop,

00:57:25.590 --> 00:57:27.370
die unter Node.js und halt auch

00:57:27.370 --> 00:57:29.250
bei Python, also normalerweise

00:57:29.250 --> 00:57:31.170
in Produktivgeschichten nimmt man halt immer LibUV

00:57:31.170 --> 00:57:33.310
statt der Async.io

00:57:33.310 --> 00:57:35.110
Standard-Event-Loop.

00:57:36.090 --> 00:57:36.990
Aha, kein Async.io?

00:57:37.550 --> 00:57:39.790
Das ist Async.io.

00:57:39.910 --> 00:57:41.310
Würdest du Ubicorn verwenden statt

00:57:41.310 --> 00:57:43.550
Also kann man auf jeden Fall,

00:57:43.630 --> 00:57:43.750
ja.

00:57:43.750 --> 00:57:43.970
Also

00:57:43.970 --> 00:57:46.390
und

00:57:46.390 --> 00:57:49.630
ja, man kann halt, bei Async.io

00:57:49.630 --> 00:57:51.830
ist es so, du kannst die Implementierung deiner Event-Loop

00:57:51.830 --> 00:57:53.710
kannst du halt austauschen und du

00:57:53.710 --> 00:57:55.950
kannst halt entweder die Standard-Implementierung

00:57:55.950 --> 00:57:57.810
nehmen oder du nimmst

00:57:57.810 --> 00:57:59.510
halt LibUV zum Beispiel und

00:57:59.510 --> 00:58:01.030
LibUV ist dann halt deutlich schneller.

00:58:03.810 --> 00:58:03.970
Und

00:58:03.970 --> 00:58:05.730
ja, also zu der

00:58:05.730 --> 00:58:07.550
Historie, ich weiß es jetzt ehrlich gesagt nicht so ganz genau, ich glaube,

00:58:07.630 --> 00:58:08.630
es gab einmal LibEV,

00:58:09.370 --> 00:58:10.890
das Ding ist auch schon ziemlich alt

00:58:10.890 --> 00:58:13.650
und... Aber das ist doch

00:58:13.650 --> 00:58:15.430
eine CE-Bibliothek, oder? Ja, ja,

00:58:15.610 --> 00:58:16.310
LibUV auch.

00:58:16.310 --> 00:58:18.070
Wenn du einfach nur Event-Event-Element

00:58:18.070 --> 00:58:20.090
anfängt. Genau,

00:58:20.270 --> 00:58:22.110
das ist, die implementieren das sogenannte

00:58:22.110 --> 00:58:23.750
Reactor-Pattern irgendwie

00:58:23.750 --> 00:58:26.070
und benutzen unten drunter

00:58:26.070 --> 00:58:27.910
Syscrolls. Wenn es da mal einen Podcast dazu gäbe,

00:58:27.990 --> 00:58:30.070
so Pattern. Ja, ich glaube,

00:58:30.150 --> 00:58:31.310
da müssen wir auch noch ein paar Teile irgendwie machen.

00:58:32.870 --> 00:58:34.150
Ja, aber vielleicht tatsächlich noch mal genau

00:58:34.150 --> 00:58:34.530
was erklären.

00:58:34.620 --> 00:58:36.060
was halt das Reaktor-Pattern vielleicht ist.

00:58:36.340 --> 00:58:38.460
Und dann vielleicht auch nochmal, was halt Event-Loops

00:58:38.460 --> 00:58:40.320
überhaupt sind. Das haben wir nämlich. Genau, das haben wir das letzte Mal,

00:58:40.440 --> 00:58:41.200
da haben wir da aufgehört.

00:58:42.280 --> 00:58:44.260
Ja, also Reaktor-Pattern.

00:58:44.280 --> 00:58:44.880
Das setzt ihr für raus.

00:58:46.460 --> 00:58:47.960
Jetzt seid ihr im geneigten Leser-Zug.

00:58:49.240 --> 00:58:54.180
Du hast halt so

00:58:54.180 --> 00:58:54.760
Syscalls

00:58:54.760 --> 00:58:57.320
in Unix.

00:58:58.020 --> 00:59:00.000
Da gibt es auch unterschiedliche, je nachdem, welche Unix-Art man

00:59:00.000 --> 00:59:02.260
verwendet. Epoch, unter Linux.

00:59:03.280 --> 00:59:04.060
Vielleicht nochmal einmal ganz kurz,

00:59:04.080 --> 00:59:05.960
Wir müssen doch ein bisschen nur damit anfangen. Was ist ein Syscall?

00:59:06.140 --> 00:59:06.980
Oh nein, oh mein Gott.

00:59:08.800 --> 00:59:10.120
Jetzt muss man tief reinsteigen.

00:59:10.760 --> 00:59:12.260
Also sozusagen, das ist die Art,

00:59:12.640 --> 00:59:13.460
wie User...

00:59:13.460 --> 00:59:16.220
Ja, mit dem Betriebssystem

00:59:16.220 --> 00:59:17.760
kommunizieren. Also

00:59:17.760 --> 00:59:20.060
das, was jeder kennt vielleicht, ist sowas wie

00:59:20.060 --> 00:59:20.940
du machst einen Pfeil auf.

00:59:21.640 --> 00:59:23.820
Du musst jetzt irgendwie an die Bits auf der Platte

00:59:23.820 --> 00:59:25.580
tatsächlich rankommen und der

00:59:25.580 --> 00:59:27.660
tatsächlich bei Unix ist so der

00:59:27.660 --> 00:59:29.640
der Syscall für alles ist halt

00:59:29.640 --> 00:59:31.520
open. Also das ist ja auch eigentlich der Trick

00:59:31.520 --> 00:59:33.420
bei Unix, dass man sagt so, okay...

00:59:33.420 --> 00:59:35.440
einen Syscall. Es gibt nur einen

00:59:35.440 --> 00:59:36.720
Syscall. Alles ein Pfeil.

00:59:37.140 --> 00:59:38.720
Eigentlich ist alles ein Pfeil, genau.

00:59:39.340 --> 00:59:40.740
Es ist völlig egal, was es wirklich ist.

00:59:41.640 --> 00:59:43.340
Pfeil ist unsere Abstraktion

00:59:43.340 --> 00:59:45.600
für einfach

00:59:45.600 --> 00:59:46.140
alles.

00:59:47.300 --> 00:59:49.320
Also wenn man das annimmt, dann kommt man

00:59:49.320 --> 00:59:50.360
bei Unix ziemlich gut raus.

00:59:51.100 --> 00:59:54.440
ja, genau.

00:59:54.840 --> 00:59:57.220
Das ist halt die Art, wie man dem Kernel sagt, ich hätte jetzt gerne

00:59:57.220 --> 00:59:59.340
da zum Beispiel irgendwie Zugriff drauf.

01:00:00.220 --> 01:00:01.180
Dann sagt man halt Open.

01:00:01.920 --> 01:00:02.800
Und das kann man eben

01:00:02.800 --> 01:00:05.340
dann eben nicht nur mit Files machen, sondern auch mit Netzwerkverbindungen,

01:00:05.500 --> 01:00:07.140
die ja dann in Unix auch nur Files sind

01:00:07.140 --> 01:00:08.960
oder Hauptsprecher ist auch nur Files oder halt

01:00:08.960 --> 01:00:11.220
irgendwie Pipes, Kommunikation

01:00:11.220 --> 01:00:12.660
zu anderen ist auch alles immer nur ein File und

01:00:12.660 --> 01:00:14.860
also man kommt ja sehr weit.

01:00:15.860 --> 01:00:16.980
Der Bildschirm ist auch ein File, oder?

01:00:17.240 --> 01:00:18.520
Ja. Und

01:00:18.520 --> 01:00:20.840
die Terminals sind auch Files.

01:00:21.400 --> 01:00:22.680
Ja. Und

01:00:22.680 --> 01:00:24.500
jetzt müssen wir nur noch wissen, was Files sind.

01:00:25.700 --> 01:00:26.400
Ja. Das ist

01:00:26.400 --> 01:00:29.140
abstrakt. Das können wir in dieser

01:00:29.140 --> 01:00:30.460
Vorlesung nicht machen. Es ist ein sehr

01:00:30.460 --> 01:00:32.120
sehr, sehr, sehr, sehr simples Interface.

01:00:32.240 --> 01:00:34.140
Es ist einfach unstrukturierte Daten und

01:00:34.140 --> 01:00:36.140
du kannst darauf zugreifen, indem du

01:00:36.140 --> 01:00:37.980
halt Sachen daraus liest und

01:00:37.980 --> 01:00:39.840
reinschreibst. Aber sortiert. Sortiert.

01:00:39.840 --> 01:00:41.940
Das ist das Wichtige, oder? Du kannst an eine bestimmte Stelle springen.

01:00:41.940 --> 01:00:44.020
Eine Abfolge von Bytes. Ich kann hin und her springen, ja.

01:00:44.060 --> 01:00:45.560
Ich habe so einen Zeiger, der irgendwie Interface.

01:00:45.840 --> 01:00:47.520
Ah, nicht jedes Pfeil kann hin und her springen.

01:00:47.700 --> 01:00:49.820
Pfeils können sagen, sie dürfen hin und her springen

01:00:49.820 --> 01:00:50.200
oder auch nicht.

01:00:53.060 --> 01:00:53.860
Okay, dann habe ich jetzt

01:00:53.860 --> 01:00:55.040
ein Cisco, das macht ein Open, okay.

01:00:56.000 --> 01:00:56.240
Genau.

01:00:57.620 --> 01:00:59.880
Also insofern auch alles schick.

01:01:00.460 --> 01:01:02.180
Problem ist jetzt natürlich... Und das ist auch gar kein

01:01:02.180 --> 01:01:04.380
Problem, oder, Jochen? Also ich meine, da brauchst du noch

01:01:04.380 --> 01:01:06.200
keine Lib dafür, sondern du brauchst halt nur wissen,

01:01:06.620 --> 01:01:08.600
wie du das aufrufst. Und das

01:01:08.600 --> 01:01:10.220
ist super und nett und easy.

01:01:10.380 --> 01:01:12.620
Und wenn du jetzt gegen deine, was weiß ich, Bibliothek,

01:01:13.000 --> 01:01:13.700
gegen deine

01:01:13.700 --> 01:01:16.420
Kernel-Bibliothek kompiliert hast,

01:01:16.480 --> 01:01:18.400
gegen deinen Kernel-Header, dann kannst du die Sachen aufrufen.

01:01:18.840 --> 01:01:18.960
Genau.

01:01:20.000 --> 01:01:22.320
Warum brauchen wir jetzt LibEV? Warum brauchen wir LibEvent

01:01:22.320 --> 01:01:24.260
oder Lib? Ja, das ist

01:01:24.260 --> 01:01:26.380
sozusagen eine Abstraktionsschicht über

01:01:26.380 --> 01:01:27.800
den Syscalls,

01:01:28.300 --> 01:01:30.300
weil das Problem ist, du hast jetzt unterschiedliche Syscalls,

01:01:30.340 --> 01:01:32.340
je nachdem, welches Betriebssystem du hast,

01:01:32.740 --> 01:01:34.240
die eben so etwas machen wie,

01:01:34.980 --> 01:01:36.320
naja, du machst jetzt nicht einfach nur

01:01:36.320 --> 01:01:37.880
einen Pfeil auf und schickst da irgendwas, das kannst du auch,

01:01:38.200 --> 01:01:40.220
dann ist es aber blockierend und synchron.

01:01:41.080 --> 01:01:42.580
Du willst jetzt aber nicht blockierend

01:01:42.580 --> 01:01:44.300
irgendwie lesen und schreiben, weil

01:01:44.300 --> 01:01:46.060
du möchtest ja gleichzeitig parallel

01:01:46.060 --> 01:01:48.380
irgendwie Datenströme in der Gegend

01:01:48.380 --> 01:01:50.520
herumschicken, weil wenn du blockierst,

01:01:50.640 --> 01:01:52.180
dann kannst du immer nur eins nach dem anderen machen

01:01:52.180 --> 01:01:54.120
und das ist ja, wenn du jetzt tausend Leuten

01:01:54.120 --> 01:01:55.820
gleichzeitig einen Pfeil schicken möchtest, geht das halt nicht so gut.

01:01:56.760 --> 01:01:58.320
Und dafür gibt es dann halt

01:01:58.320 --> 01:02:00.220
andere Interfaces,

01:02:00.340 --> 01:02:01.500
die das möglich machen.

01:02:02.420 --> 01:02:03.960
Und da gibt es dann halt so

01:02:03.960 --> 01:02:05.220
die uralten

01:02:05.220 --> 01:02:08.100
Geschichten in Unix sind halt so Select,

01:02:08.200 --> 01:02:10.040
der Select-Syscall und Poll.

01:02:12.560 --> 01:02:14.260
Und im Wesentlichen gibt man

01:02:14.260 --> 01:02:16.220
den, oh Gott. Jetzt musst du trotzdem kurz

01:02:16.220 --> 01:02:17.320
sagen, was Select ist und was Poll ist.

01:02:17.960 --> 01:02:19.700
Also ich fange mal mit Poll an.

01:02:19.900 --> 01:02:22.100
Du gibst Poll einfach eine Liste von

01:02:22.100 --> 01:02:24.120
Pfeildeskriptoren sozusagen, also

01:02:24.120 --> 01:02:25.560
offenen Pfeils eigentlich, mehr oder weniger.

01:02:26.400 --> 01:02:28.300
Und dann wirst du irgendwie benachrichtigt,

01:02:28.300 --> 01:02:30.080
wenn da irgendwas passiert ist,

01:02:30.180 --> 01:02:30.620
vom Kernel.

01:02:31.760 --> 01:02:33.840
Und das Problem dabei ist halt, dass, also

01:02:33.840 --> 01:02:35.580
bei Paul kannst du halt irgendwie, ach Gott,

01:02:35.740 --> 01:02:37.700
das muss ich tief in Erinnerung kramen,

01:02:38.120 --> 01:02:40.100
also der Vorteil ist, du kannst halt beliebig viele

01:02:40.100 --> 01:02:41.960
Files da reintun, also beliebig viele Netzwerkverbindungen

01:02:41.960 --> 01:02:43.900
haben, der Nachteil ist irgendwie, ist es halt

01:02:43.900 --> 01:02:46.100
O von N oder sowas, also deine

01:02:46.100 --> 01:02:48.520
Zeit,

01:02:48.720 --> 01:02:50.100
die das im Kernel verbringt,

01:02:50.100 --> 01:02:51.800
wird halt immer mehr, je mehr du da reinsteckst.

01:02:52.160 --> 01:02:53.160
Und bei Select war es so,

01:02:54.220 --> 01:02:54.420
dass

01:02:54.420 --> 01:02:58.120
das schnell ist, das ist halt irgendwie O von 1,

01:02:58.260 --> 01:02:59.880
aber du kannst irgendwie nur 1024

01:02:59.880 --> 01:03:01.820
Pfeildeskriptoren oder so irgendwie da reinstecken.

01:03:01.840 --> 01:03:03.480
Was ist denn ein Select jetzt, also im Unterschied?

01:03:03.780 --> 01:03:05.880
Also im Wesentlichen geht es doch darum, dass du

01:03:05.880 --> 01:03:06.880
auf Daten wartest.

01:03:07.500 --> 01:03:09.780
Das heißt, der Syscall heißt,

01:03:10.280 --> 01:03:11.560
du kannst sagen,

01:03:11.760 --> 01:03:13.980
ich möchte jetzt die Datei

01:03:13.980 --> 01:03:15.680
lesen und dann gibt es einen Syscall,

01:03:15.760 --> 01:03:17.660
der heißt ReadData oder wie auch immer der heißen mag

01:03:17.660 --> 01:03:18.880
und

01:03:18.880 --> 01:03:21.940
der blockiert dann halt, da musst du

01:03:21.940 --> 01:03:23.180
so lange warten, bis die Daten da sind.

01:03:24.220 --> 01:03:26.040
Und das ist bei einer Netzwerkverbindung echt blöd.

01:03:26.200 --> 01:03:26.960
Das willst du nicht, genau.

01:03:28.080 --> 01:03:29.100
Dann kannst du sagen, okay,

01:03:29.660 --> 01:03:31.040
wir modifizieren den und

01:03:31.040 --> 01:03:32.860
sagen, wir machen Read-Data, aber

01:03:32.860 --> 01:03:35.020
nicht blockierend. Das heißt, wenn was da ist, dann

01:03:35.020 --> 01:03:37.100
kriegen wir das und wenn nichts da ist, dann kriegen wir halt

01:03:37.100 --> 01:03:38.700
zurück, es gibt gerade nichts.

01:03:40.220 --> 01:03:41.120
Und damit kannst du das ja

01:03:41.120 --> 01:03:42.960
umsetzen. Damit kannst du Polling machen, damit kannst du sagen,

01:03:43.020 --> 01:03:44.140
hier, alle meine Netzwerkverbindungen,

01:03:44.440 --> 01:03:45.780
was gibt's denn jetzt hier?

01:03:47.460 --> 01:03:49.020
Aber Polling ist halt schlecht,

01:03:49.020 --> 01:03:50.860
weil dann, das ist

01:03:50.860 --> 01:03:51.640
aktives Warten.

01:03:52.300 --> 01:03:54.260
Busy Waiting, genau, das verbraucht halt CPU.

01:03:55.220 --> 01:03:56.820
Ja, und vor allem, während du auf

01:03:56.820 --> 01:03:58.760
eins wartest, kann ja bei einem anderen was passieren

01:03:58.760 --> 01:04:00.800
und das bemerkst du dann halt erst, wenn du so weit bist,

01:04:00.880 --> 01:04:01.140
dass du da bist.

01:04:01.140 --> 01:04:03.000
Da steht die ganze Zeit, du sagst, bist du schon da, bist du schon da,

01:04:03.060 --> 01:04:05.040
bist du schon da, bist du schon da, bist du schon da, bist du schon da.

01:04:05.200 --> 01:04:08.520
Genau, aber wenn du jetzt bei zehn Türen immer anklopfst

01:04:08.520 --> 01:04:09.960
und sagst, bist du schon da, bist du schon da,

01:04:10.080 --> 01:04:12.440
dann kann es ja sein, dass du bei der zehnten Tür bist

01:04:12.440 --> 01:04:14.020
und bei der, oder du bist bei der ersten Tür

01:04:14.020 --> 01:04:15.720
und bei der zehnten Tür passiert jetzt gerade was

01:04:15.720 --> 01:04:17.320
und du merkst es aber erst,

01:04:17.380 --> 01:04:19.200
wenn du die anderen neun alle durchgefragt hast.

01:04:19.480 --> 01:04:22.440
Das heißt, du hast nicht nur viel CPU verbraucht,

01:04:22.520 --> 01:04:23.480
für was, was eigentlich nichts bringt,

01:04:23.860 --> 01:04:25.440
sondern du hast auch noch hohe Latenz drin.

01:04:27.140 --> 01:04:28.200
Du kriegst die Nachrichten,

01:04:28.760 --> 01:04:30.680
sofort mit, dass irgendwas passiert, sondern du kriegst

01:04:30.680 --> 01:04:32.800
erst mit, wenn du dazukommst, danach zu fragen.

01:04:33.340 --> 01:04:34.820
Und das ist natürlich schlecht, ja, weil

01:04:34.820 --> 01:04:36.520
ähm

01:04:36.520 --> 01:04:38.280
weil du dann eben

01:04:38.280 --> 01:04:40.660
eine unnötige Latenz hast. Du hast unnötige Wartezeiten,

01:04:40.700 --> 01:04:42.740
die du nicht abbrauchst. Und jetzt

01:04:42.740 --> 01:04:44.580
wird es noch schlimmer, wenn du das nämlich naiv machst, dann

01:04:44.580 --> 01:04:46.700
kannst du so ein Problem haben, das Starvation heißt.

01:04:47.240 --> 01:04:48.640
Ja, wenn du sagst, wenn irgendwas passiert,

01:04:48.740 --> 01:04:50.620
dann fange ich wieder bei Tür 1 an, nachzufragen.

01:04:50.960 --> 01:04:51.800
Und dann passiert das nicht.

01:04:52.660 --> 01:04:54.620
Und doch, doch, dann hast du nämlich

01:04:54.620 --> 01:04:56.540
Starvation, weil wenn bei Tür 10 irgendwas ist,

01:04:56.540 --> 01:04:58.240
da kommst du ja nie hin, weil

01:04:58.240 --> 01:05:00.240
die ganze Zeit irgendwas passiert, dann

01:05:00.240 --> 01:05:02.340
kommst du nie dazu, Tür 10 nachzufragen. Das heißt, du musst

01:05:02.340 --> 01:05:04.240
dann auch noch aufpassen, dass du die

01:05:04.240 --> 01:05:06.340
in einer gewissen Reihenfolge

01:05:06.340 --> 01:05:08.100
abfragst, die nicht dazu führt, dass

01:05:08.100 --> 01:05:10.220
einer hier liegen gelassen

01:05:10.220 --> 01:05:11.980
wird. Also Polling ist was ganz Schlechtes,

01:05:12.420 --> 01:05:14.100
wenn du auf Daten wartest

01:05:14.100 --> 01:05:15.400
in einer Aktivverbindung.

01:05:16.300 --> 01:05:17.000
Und deshalb gibt es

01:05:17.000 --> 01:05:20.060
diesen Select-Syscall,

01:05:20.180 --> 01:05:22.100
wo du eben sagst, benachrichtige mich,

01:05:22.300 --> 01:05:23.940
wenn irgendwas von diesen

01:05:23.940 --> 01:05:26.260
1024 oder eben

01:05:26.260 --> 01:05:27.100
jetzt, wie Jochen sagt,

01:05:28.160 --> 01:05:30.300
beliebig vielen, irgendwo was passiert.

01:05:31.660 --> 01:05:32.340
Wenn irgendwo

01:05:32.340 --> 01:05:34.140
was passiert, dann gib mir Bescheid. Dann kriegst du

01:05:34.140 --> 01:05:35.100
quasi einen Interrupt.

01:05:36.740 --> 01:05:37.840
Ah. Genau.

01:05:38.320 --> 01:05:40.180
Ah, das gab es doch früher immer.

01:05:40.260 --> 01:05:42.100
Das war noch so relativ nativ

01:05:42.100 --> 01:05:44.020
oder schneller ansprechbar. Das musste man doch früher immer

01:05:44.020 --> 01:05:46.080
selber konfigurieren, die Interrupt.

01:05:46.200 --> 01:05:48.120
Die Soundfarbe gab es, weil die müssen

01:05:48.120 --> 01:05:50.160
halt ihre Daten holen und die sagen so,

01:05:50.320 --> 01:05:52.040
jetzt, ich brauche Daten und dann musst du

01:05:52.040 --> 01:05:53.920
dich drum kümmern. Da kannst du nicht sagen, ja, ich bin jetzt gerade

01:05:53.920 --> 01:05:54.580
beschäftigt mit.

01:05:56.260 --> 01:05:57.700
Sonst knackt es der Ton.

01:05:58.160 --> 01:06:00.080
Genau, und

01:06:00.080 --> 01:06:01.920
also der Syscall, den man auf der Linie

01:06:01.920 --> 01:06:03.820
dafür jetzt verwendet, der nennt sich E-Poll, der

01:06:03.820 --> 01:06:05.400
halt irgendwie, ja, ist halt

01:06:05.400 --> 01:06:07.920
irgendwie Anfang der Nuller Jahre, ich weiß nicht, seit wann

01:06:07.920 --> 01:06:09.960
das drin ist im Kernel, müsste ja

01:06:09.960 --> 01:06:11.240
irgendwie, aber ist schon sehr lang

01:06:11.240 --> 01:06:14.020
und das Ding macht das quasi für beliebig

01:06:14.020 --> 01:06:15.780
viele Falldeskriptoren und halt schnell

01:06:15.780 --> 01:06:17.680
also das Ding ist richtig, macht

01:06:17.680 --> 01:06:19.900
macht Laune, funktioniert

01:06:19.900 --> 01:06:21.720
dann alles super und

01:06:21.720 --> 01:06:24.060
FreeBSD, BSD-basierte

01:06:24.060 --> 01:06:25.980
Unix, die nehmen dann eher sowas wie KQ

01:06:25.980 --> 01:06:28.260
also FreeBSD, macOS

01:06:28.260 --> 01:06:29.840
macOS und so

01:06:29.840 --> 01:06:32.640
macht praktisch das gleiche

01:06:32.640 --> 01:06:34.420
Wie was? Entschuldigung, ich wollte das nicht nochmal aussprechen. Der Syscall

01:06:34.420 --> 01:06:36.620
heißt einfach anders und der heißt KQ

01:06:36.620 --> 01:06:40.560
KQ heißt der, oder? Oder KQ

01:06:40.560 --> 01:06:41.420
Ja, genau

01:06:41.420 --> 01:06:43.540
Ja, KQ

01:06:43.540 --> 01:06:46.260
Die Leute mitschreiben, kleiner Schmutzigeritz

01:06:46.260 --> 01:06:47.820
Und

01:06:47.820 --> 01:06:50.380
genau, aber es gibt ja subtile

01:06:50.380 --> 01:06:52.180
Unterschiede, bei Solaris hast du dann noch sowas wie

01:06:52.180 --> 01:06:53.760
DevPol und so, also

01:06:53.760 --> 01:06:56.740
unterschiedliche Unix-Geschmacksrichtungen

01:06:56.740 --> 01:06:58.320
machen das halt irgendwie so leicht anders alles

01:06:58.320 --> 01:07:00.300
und das willst du ja jetzt nicht, wenn du

01:07:00.300 --> 01:07:02.120
ein Anwendungsprogramm schreibst, alles nochmal

01:07:02.120 --> 01:07:04.340
machen müssen, damit du halt irgendwie alle

01:07:04.340 --> 01:07:06.040
Unix-Varianten unterstützen kannst

01:07:06.040 --> 01:07:08.440
und dann brauchst du halt eine Abstraktionsschicht darüber,

01:07:08.640 --> 01:07:10.400
die halt dann unten drunter mit

01:07:10.400 --> 01:07:10.840
den

01:07:10.840 --> 01:07:14.260
betriebssystemspezifischen

01:07:14.260 --> 01:07:16.280
Syscalls oder Interfaces

01:07:16.280 --> 01:07:18.320
redet, aber mit der du

01:07:18.320 --> 01:07:20.260
dann reden kannst, ohne das alles wissen zu müssen.

01:07:20.900 --> 01:07:22.380
Und genau, das ist halt LibEV.

01:07:23.760 --> 01:07:41.000
Und, genau, das war LibUV, also das, was dann, das Ding ist, glaube ich, gestartet irgendwann 2011 oder so, das Projekt, und hat für Unix, für Unix hat es halt LibUV benutzt einfach, das hat es einfach nur gerappt.

01:07:41.980 --> 01:07:46.820
Hat aber auch noch eine Windows-Geschichte mit dazu genommen, weil Windows macht das alles irgendwie anders.

01:07:47.960 --> 01:07:48.820
Das implementiert

01:07:48.820 --> 01:07:49.260
halt nicht dieses

01:07:49.260 --> 01:07:52.700
Reaktor-Pattern sozusagen,

01:07:52.800 --> 01:07:54.620
wo du halt benachrichtigt wirst, wenn halt irgendwas passiert,

01:07:54.740 --> 01:07:55.680
sondern es ist ein

01:07:55.680 --> 01:07:58.180
Pro-Reaktor.

01:07:59.060 --> 01:08:01.000
Also der Select ist ein Reaktor-Pattern?

01:08:01.160 --> 01:08:02.720
Ja, genau. Das sind die alle.

01:08:02.880 --> 01:08:03.720
Bei Unix ist das immer so.

01:08:04.860 --> 01:08:06.740
Was heißt nochmal ein Reaktor-Trimmer?

01:08:06.740 --> 01:08:08.500
Du kriegst halt

01:08:08.500 --> 01:08:10.840
benachrichtigt, wenn irgendwas passiert und dann kannst du

01:08:10.840 --> 01:08:13.020
irgendwas machen. Warum heißt das Reaktor-Pattern?

01:08:13.060 --> 01:08:14.700
Weil du darauf reagierst, wenn irgendwas

01:08:14.700 --> 01:08:16.720
passiert. Also du bist in dem Moment

01:08:16.720 --> 01:08:18.920
Nicht der Aktor, der aktiv

01:08:18.920 --> 01:08:20.740
wartet, sondern du bist der Reaktor. Du sagst,

01:08:21.040 --> 01:08:22.940
weck mich auf, wenn irgendwas ist.

01:08:23.120 --> 01:08:24.620
Ich hatte irgendwie gerade einen in die Grille

01:08:24.620 --> 01:08:26.380
entdeckt, der Reaktor, wir abgeben.

01:08:26.700 --> 01:08:28.540
Und Windows macht es halt

01:08:28.540 --> 01:08:30.080
anders. Da gibt es diese

01:08:30.080 --> 01:08:32.800
IOCompletion

01:08:32.800 --> 01:08:35.000
Ports. Da ist auch alles nicht eine Datei,

01:08:35.080 --> 01:08:35.740
sondern ein Handle.

01:08:36.460 --> 01:08:36.660
Tja.

01:08:40.260 --> 01:08:40.660
Und

01:08:40.660 --> 01:08:42.720
da ist es halt so, man

01:08:42.720 --> 01:08:44.480
kriegt halt, da passieren dann Dinge

01:08:44.480 --> 01:08:46.560
und der Kernel macht dann schon zum Beispiel, der liest dann schon, also beim

01:08:46.560 --> 01:08:47.560
während bei dem

01:08:47.560 --> 01:08:50.680
Reactor-Pattern ist es halt so, da musst du dann schon noch selber lesen,

01:08:50.760 --> 01:08:52.540
du kriegst halt bloß Benachrichtigungen, also du könntest

01:08:52.540 --> 01:08:54.400
jetzt, wenn du wolltest, dann könntest du erst was lesen und

01:08:54.400 --> 01:08:55.320
kannst das halt machen oder nicht.

01:08:58.520 --> 01:08:58.800
Und

01:08:58.800 --> 01:09:00.560
bei Windows ist es halt so, der Kernel macht das dann

01:09:00.560 --> 01:09:01.540
halt und dann

01:09:01.540 --> 01:09:04.580
sagt er dir halt, wenn irgendwas completed

01:09:04.580 --> 01:09:06.140
ist, was damit passiert ist und wo

01:09:06.140 --> 01:09:08.540
es liegt oder so. Ich weiß nicht so genau, keine Ahnung

01:09:08.540 --> 01:09:09.980
von Windows. Wenn du das Handle weißt. Ja.

01:09:11.360 --> 01:09:12.500
Aber es ist halt eine grundsätzlich

01:09:12.500 --> 01:09:14.040
andere Art, damit umzugehen

01:09:14.040 --> 01:09:16.340
und da gab es, glaube ich, tatsächlich

01:09:16.340 --> 01:09:18.320
auch, hat Microsoft selber, hat da irgendwie

01:09:18.320 --> 01:09:20.040
Code beigesteuert zu

01:09:20.040 --> 01:09:22.240
LibUV, meine ich, und hat

01:09:22.240 --> 01:09:23.700
den Teil halt geschrieben und dann

01:09:23.700 --> 01:09:26.120
haben sie das halt unter einem

01:09:26.120 --> 01:09:27.320
Interface sozusagen

01:09:27.320 --> 01:09:30.240
verfügbar

01:09:30.240 --> 01:09:32.140
gemacht und halt LibUV verwendet

01:09:32.140 --> 01:09:34.060
für Unix und dann

01:09:34.060 --> 01:09:35.700
den Microsoft-Teil für Windows

01:09:35.700 --> 01:09:38.200
und sieht dann aber von der

01:09:38.200 --> 01:09:40.240
Anwendung gleich

01:09:40.240 --> 01:09:42.240
aus. Und später

01:09:42.240 --> 01:09:44.140
haben sie dann aber Libby wieder rausgeschmissen, glaube ich,

01:09:44.160 --> 01:09:45.340
und das dann selber nochmal alles geschrieben.

01:09:45.920 --> 01:09:47.700
Naja, also, wie auch immer.

01:09:48.320 --> 01:09:50.300
Also es funktioniert. Inzwischen ist es gut

01:09:50.300 --> 01:09:51.880
getestet. Es gibt ja genug

01:09:51.880 --> 01:09:52.980
Node.js da draußen und so.

01:09:53.960 --> 01:09:55.380
Und es funktioniert gut.

01:09:57.060 --> 01:09:57.940
Und es ist halt auch

01:09:57.940 --> 01:09:59.320
richtig schnell.

01:10:00.320 --> 01:10:02.240
Und was diese Event-Loop tatsächlich

01:10:02.240 --> 01:10:03.540
eigentlich macht, ist

01:10:03.540 --> 01:10:05.680
eben diese

01:10:05.680 --> 01:10:07.060
ganzen

01:10:07.060 --> 01:10:10.060
dieses I.O.-Zeugs

01:10:10.060 --> 01:10:10.540
verwalten.

01:10:12.240 --> 01:10:13.720
aber halt auch Callbacks

01:10:13.720 --> 01:10:15.360
aufrufen. Also du kannst zum Beispiel

01:10:15.360 --> 01:10:17.760
bei deinem Event-Loop jetzt Callbacks registrieren

01:10:17.760 --> 01:10:19.620
für halt... Also ein Event-Loop ist

01:10:19.620 --> 01:10:21.620
ein eigener Prozess, der läuft und der die ganze Zeit guckt,

01:10:21.700 --> 01:10:23.340
was für Events da registriert sind und die dann

01:10:23.340 --> 01:10:24.660
aufrufen, wenn irgendwas passiert, oder?

01:10:25.740 --> 01:10:27.540
Das Ding läuft immer,

01:10:27.900 --> 01:10:28.280
läuft in,

01:10:28.960 --> 01:10:31.140
es kann nur eine Event-Loop pro

01:10:31.140 --> 01:10:33.380
Thread geben. Du kannst mehrere

01:10:33.380 --> 01:10:35.700
haben, aber nur in unterschiedlichen Threads.

01:10:36.100 --> 01:10:36.360
Und

01:10:36.360 --> 01:10:39.460
ja, das Ding läuft halt.

01:10:39.460 --> 01:10:41.200
Das ist halt sozusagen die innerste Loop

01:10:41.200 --> 01:10:42.920
in deinem Programm, wenn du es was benutzt.

01:10:42.920 --> 01:10:44.740
Das ist das, was mit LibUV

01:10:44.740 --> 01:10:47.080
hintergeht, oder? Das ist die Event-Loop.

01:10:47.860 --> 01:10:48.600
Ja, also

01:10:48.600 --> 01:10:51.100
LibUV ist eine Implementation, ja.

01:10:51.140 --> 01:10:52.660
Also so eine Wild-Schuh-Schleife oder sowas.

01:10:53.160 --> 01:10:54.900
Ja, letztlich genau. Das Ding,

01:10:55.420 --> 01:10:57.400
ja, wobei das nicht busy-weighted,

01:10:58.060 --> 01:10:59.240
sondern das schläft dann halt auch,

01:10:59.340 --> 01:11:00.840
wenn nichts zu tun ist, aber

01:11:00.840 --> 01:11:03.040
sobald irgendwas zu tun ist, dann wird es sehr

01:11:03.040 --> 01:11:05.080
wach und agil und macht irgendwie Dinge.

01:11:06.140 --> 01:11:10.460
diese

01:11:10.460 --> 01:11:13.000
Einführung

01:11:13.000 --> 01:11:14.960
in ASIC.io von Lukas Langer gibt es

01:11:14.960 --> 01:11:16.500
halt auch, da zeigt er die Implementation

01:11:16.500 --> 01:11:19.080
der Python-Event-Loop

01:11:19.080 --> 01:11:20.900
glaube ich aus 3.4 oder

01:11:20.900 --> 01:11:23.020
3.5, ich weiß es nicht genau, und das

01:11:23.020 --> 01:11:24.220
waren irgendwie so 20

01:11:24.220 --> 01:11:26.880
Zeilen, 30 Zeilen Python, und es war

01:11:26.880 --> 01:11:28.940
tatsächlich eine While-True-Schleife, und

01:11:28.940 --> 01:11:30.460
die hat im Wesentlichen nur gemacht, so geguckt,

01:11:30.860 --> 01:11:32.720
oh, welche Callbacks sollen jetzt gerade laufen,

01:11:33.420 --> 01:11:34.460
dann hat sie aufgerufen,

01:11:34.880 --> 01:11:36.640
dann noch irgendwie Signal-Handling gemacht und

01:11:36.640 --> 01:11:38.640
irgendwie, das war es im Wesentlichen.

01:11:38.740 --> 01:11:40.640
Und dann noch geguckt, welche sind jetzt beim

01:11:40.640 --> 01:11:42.460
nächsten auf, beim nächsten, bei der nächsten

01:11:42.460 --> 01:11:44.700
Iteration dran und das war es eigentlich

01:11:44.700 --> 01:11:46.200
fast. Und das war die ganze Event-Loop.

01:11:46.380 --> 01:11:48.320
Also Event-Loop ist tatsächlich dieser Loop und da muss man

01:11:48.320 --> 01:11:49.760
Signale registrieren oder was?

01:11:50.900 --> 01:11:52.500
Callbacks sind vor allen Dingen das, was

01:11:52.500 --> 01:11:54.060
man da rein

01:11:54.060 --> 01:11:56.000
tut, was dann da drin läuft.

01:11:56.200 --> 01:11:57.920
Die stehen dann in irgendeiner Liste, die immer wieder

01:11:57.920 --> 01:12:00.480
ein gemeinsamer Speicher quasi

01:12:00.480 --> 01:12:01.980
der...

01:12:01.980 --> 01:12:04.480
Wenn in Datei X irgendwas

01:12:04.480 --> 01:12:06.340
was passiert, dann ruf damit diese

01:12:06.340 --> 01:12:07.940
Funktion auf. Ja, aber also, wie sag ich das?

01:12:08.740 --> 01:12:10.620
Da gibt es halt ein Interface.

01:12:11.100 --> 01:12:12.400
Du kannst Call soon

01:12:12.400 --> 01:12:14.300
zum Beispiel für, jetzt soll dem nix

01:12:14.300 --> 01:12:15.240
laufen oder

01:12:15.240 --> 01:12:18.160
ja, mit einem bestimmten,

01:12:18.260 --> 01:12:20.460
zu einem bestimmten Zeitpunkt, also die Timer,

01:12:20.660 --> 01:12:22.480
du kannst dann auch Timer setzen und die werden halt ausgeführt

01:12:22.480 --> 01:12:24.380
und dann wird halt überprüft, ist das jetzt

01:12:24.380 --> 01:12:26.080
dran mit dem Laufen oder noch nicht.

01:12:28.680 --> 01:12:30.440
Also je nachdem, was halt so eine Event-Loop

01:12:30.440 --> 01:12:32.360
anbietet, ja. Also es gibt ja da viele

01:12:32.360 --> 01:12:33.380
verschiedene Sorten Events.

01:12:34.220 --> 01:12:35.940
Und genau so ein Timer, ja, im Wesentlichen

01:12:35.940 --> 01:12:37.820
sagst du halt, wenn du auf so einen

01:12:37.820 --> 01:12:39.700
Timer wartest, dein

01:12:39.700 --> 01:12:41.760
Python-Programm sagt, ruft

01:12:41.760 --> 01:12:43.700
eine Funktion auf, die sagt, ich möchte

01:12:43.700 --> 01:12:45.680
um 0 Uhr

01:12:45.680 --> 01:12:47.800
möchte ich, dass diese Funktion gestartet wird.

01:12:48.960 --> 01:12:49.880
Und dann muss

01:12:49.880 --> 01:12:51.640
diese Event-Loop ja im Wesentlichen nichts anderes machen,

01:12:51.760 --> 01:12:53.760
als zu sagen, ist es schon 0 Uhr? Nein, ist es schon

01:12:53.760 --> 01:12:55.700
0 Uhr? Und wenn es 0 Uhr ist, dann sagt sie

01:12:55.700 --> 01:12:57.140
ja, und dann startet eben dieses

01:12:57.140 --> 01:12:59.740
registrierten Callback. Diese Funktion und genau.

01:13:00.780 --> 01:13:01.880
Und so ein Callback ist einfach

01:13:01.880 --> 01:13:03.860
eine Funktion, ja, du sagst, ich möchte

01:13:03.860 --> 01:13:05.860
dass eine Funktion aufgerufen wird und die muss

01:13:05.860 --> 01:13:07.960
auch normalerweise schon fertig

01:13:07.960 --> 01:13:09.800
parametrisiert sein, ja, also du kannst dann nicht

01:13:09.800 --> 01:13:11.740
sagen, mit folgenden Parametern, sondern

01:13:11.740 --> 01:13:13.780
du musst dann halt die so, ja, oder gibst die halt

01:13:13.780 --> 01:13:15.780
irgendwie mit, ja, aber im Wesentlichen sagst du

01:13:15.780 --> 01:13:17.680
nur, da soll dann ein Funktionsaufruf

01:13:17.680 --> 01:13:19.720
passieren. Also im Prinzip iteriert quasi dieser

01:13:19.720 --> 01:13:21.680
ganze Loop immer durch diese gleiche Liste und

01:13:21.680 --> 01:13:23.680
guckt, was da drin steht und versucht das dann halt auszuführen, was da

01:13:23.680 --> 01:13:25.820
irgendwie... Ja, nur halt schlau, ja, er iteriert

01:13:25.820 --> 01:13:27.440
da nicht die ganze Zeit durch, sondern er sagt

01:13:27.440 --> 01:13:29.660
zum Beispiel, wann ist denn

01:13:29.660 --> 01:13:31.000
der nächste Timer fällig?

01:13:32.200 --> 01:13:32.920
Das kann ja,

01:13:33.200 --> 01:13:35.000
das ist um 0 Uhr, das sind jetzt noch

01:13:35.000 --> 01:13:37.000
1 Stunde 55,

01:13:37.240 --> 01:13:38.520
also kann ich 1 Stunde 55,

01:13:39.080 --> 01:13:41.060
ich schlafe mal 1 Stunde 54, ja, und

01:13:41.060 --> 01:13:43.100
dann kannst du

01:13:43.100 --> 01:13:44.840
dich da so rantasten, ja, aber für die 1 Stunde

01:13:44.840 --> 01:13:47.040
54 musst du ja nicht immer gucken, ah, ist schon soweit,

01:13:47.100 --> 01:13:47.980
ist schon soweit, sondern

01:13:47.980 --> 01:13:50.980
die machen das halt schlauer und das

01:13:50.980 --> 01:13:52.380
ist eben genau der Trick da dran,

01:13:52.900 --> 01:13:55.020
dass du dich nicht drum kümmern musst, wie der das macht,

01:13:56.100 --> 01:13:56.800
sondern dass

01:13:56.800 --> 01:13:58.280
diese Eventloop schlau genug ist,

01:13:58.720 --> 01:14:00.700
das für dich auf eine schlaue Art und Weise zu machen.

01:14:01.780 --> 01:14:01.900
Ja.

01:14:03.200 --> 01:14:21.520
Genau, richtig, da war noch ein Spezialdings dabei, der LibUV hat auch noch ein Threadpool irgendwie für, glaube ich, Kommunikation mit Files und so, aber also im Grunde abstrahiert alles weg, was man halt so, was Low-Level unten drunter passieren muss, damit es halt funktioniert und man hat dann halt ein sehr schönes Interface nach außen.

01:14:21.520 --> 01:14:34.460
Und wenn man jetzt AsyncIO zum Beispiel verwendet, dann kann man einfach das AsyncIO-Interface verwenden und AsyncIO sagen, verwende doch LibUV als Event-Loop und dann benutzt es das Ding unten drunter.

01:14:35.460 --> 01:14:42.160
Ja, und ein weiterer Trick, den es dann halt noch gibt, sind sogenannte Trampoline, also Callbacks.

01:14:42.160 --> 01:14:43.040
Wenn man es will, jetzt aber.

01:14:43.620 --> 01:14:44.340
Kein Tamponier.

01:14:46.600 --> 01:14:48.080
Genau, wenn man das genau wissen will,

01:14:48.100 --> 01:14:50.220
wie das

01:14:50.220 --> 01:14:51.640
alles funktioniert,

01:14:51.960 --> 01:14:54.220
dieses Videoserie von Lukas Lange

01:14:54.220 --> 01:14:56.160
angucken, der erklärt das alles sehr ausführlich, ich kann

01:14:56.160 --> 01:14:57.700
das jetzt nur so anreißen, aber

01:14:57.700 --> 01:15:00.020
im Grunde ist es so, Callbacks, die sich halt

01:15:00.020 --> 01:15:02.080
selbst wieder registrieren, sozusagen, weil man

01:15:02.080 --> 01:15:04.160
ja, also ich meine, wenn jetzt eine Funktion

01:15:04.160 --> 01:15:06.040
aufgerufen worden ist und gelaufen ist,

01:15:06.080 --> 01:15:07.420
dann ist ja dann eigentlich ja Schluss.

01:15:08.000 --> 01:15:10.000
Aber du hast ja oft so Tasks, die

01:15:10.000 --> 01:15:11.940
irgendwie die ganze Zeit irgendetwas machen.

01:15:12.160 --> 01:15:13.940
und ab und zu mal und dann wieder schlafen.

01:15:14.360 --> 01:15:15.840
Wie kann das zum Beispiel sein, dass die sich dann

01:15:15.840 --> 01:15:18.080
schlafen legen und wieder aufwachen und dann nochmal was anderes machen?

01:15:18.680 --> 01:15:19.660
Das ginge ja eigentlich nicht.

01:15:19.920 --> 01:15:21.460
Oder auch die Reaktivität anpassen.

01:15:21.740 --> 01:15:23.880
Wenn du gemerkt hast, da ist jetzt nichts zu tun, dann

01:15:23.880 --> 01:15:26.040
schlafen die länger oder kürzer.

01:15:26.400 --> 01:15:27.880
Ja, und der Mechanismus,

01:15:28.020 --> 01:15:29.900
über den das geht, ist, die schedulen sich selbst

01:15:29.900 --> 01:15:30.780
wieder auf die Event-Loop.

01:15:32.400 --> 01:15:33.700
Hat jeder von uns schon mal gemacht.

01:15:34.580 --> 01:15:35.920
Ohne das Wort Trampolin

01:15:35.920 --> 01:15:37.060
zu kennen. Ja, wahrscheinlich.

01:15:37.640 --> 01:15:39.380
Genau. Und

01:15:39.380 --> 01:15:41.500
noch, wenn man jetzt

01:15:41.500 --> 01:15:43.840
guckt, wie ist der Mechanismus

01:15:43.840 --> 01:15:45.020
eigentlich dafür, der

01:15:45.020 --> 01:15:47.240
das macht, dann sind das halt

01:15:47.240 --> 01:15:49.600
tatsächlich einfach nur Generatoren eigentlich

01:15:49.600 --> 01:15:50.360
unten drunter.

01:15:52.360 --> 01:15:53.780
Das ist doch der generelle Trick

01:15:53.780 --> 01:15:55.640
von Ace und Gaio, oder? Das sind alles einfach immer nur

01:15:55.640 --> 01:15:56.240
Generatoren.

01:15:57.460 --> 01:15:58.020
Ja, also

01:15:58.020 --> 01:16:01.580
man nennt es halt anders und

01:16:01.580 --> 01:16:03.760
es hat einen anderen Typ, aber es ist

01:16:03.760 --> 01:16:05.640
tatsächlich fast

01:16:05.640 --> 01:16:06.280
das Gleiche.

01:16:07.920 --> 01:16:08.440
Also

01:16:08.440 --> 01:16:11.000
also die Step-Funktion

01:16:11.000 --> 01:16:12.980
in dem Generator ist halt eigentlich das, was

01:16:12.980 --> 01:16:15.020
du dann halt immer wieder in die Event-Loop

01:16:15.020 --> 01:16:16.780
reintust. Und Await

01:16:16.780 --> 01:16:18.840
ist halt nur ein anderes Wort für

01:16:18.840 --> 01:16:20.800
Yield-From und Yield-From ist halt genau das

01:16:20.800 --> 01:16:22.900
Ding, was halt die

01:16:22.900 --> 01:16:24.880
Generator-Geschichte da macht, an der

01:16:24.880 --> 01:16:26.580
Stelle. So hat doch

01:16:26.580 --> 01:16:28.860
Async.io auch angefangen, oder? Dass man einfach

01:16:28.860 --> 01:16:30.740
gesagt hat, wenn ich eine Menge von Generatoren

01:16:30.740 --> 01:16:32.460
habe, dann könnte ich die alle nacheinander mal

01:16:32.460 --> 01:16:34.740
ausführen lassen und die geben mir die Kontrolle

01:16:34.740 --> 01:16:36.740
zurück. Die haben genau diese Eigenschaft schon.

01:16:36.840 --> 01:16:38.780
Generatoren haben genau das, was man

01:16:38.780 --> 01:16:39.700
braucht, was man sagen kann.

01:16:40.880 --> 01:16:42.020
Sogenannte Co-Routinen.

01:16:43.540 --> 01:16:44.580
Im Generator kann man ja sagen,

01:16:44.700 --> 01:16:46.640
okay, alles klar, jetzt gib mir doch mal das nächste,

01:16:46.760 --> 01:16:48.780
gib mir das nächste. Und dann so, ah, und jetzt stopp mal.

01:16:48.920 --> 01:16:49.860
Bleib mal kurz stehen.

01:16:50.540 --> 01:16:52.140
Du machst jetzt erstmal nichts mehr.

01:16:52.620 --> 01:16:54.480
Und dann später kann man ihm sagen, okay, und jetzt gibt noch mal

01:16:54.480 --> 01:16:56.660
wieder was. Das heißt, das sind schon Funktionen, die man

01:16:56.660 --> 01:16:58.540
irgendwie so anhalten und weiterlaufen lassen kann.

01:16:59.420 --> 01:17:00.840
Und wenn man

01:17:00.840 --> 01:17:02.060
das jetzt nicht nur aus der

01:17:02.060 --> 01:17:04.740
ich kann ja jetzt Sachen rausnehmen Perspektive sieht,

01:17:04.800 --> 01:17:05.980
sondern auch man kann da Sachen reintun,

01:17:06.840 --> 01:17:31.200
Dann hat man eigentlich schon alles zusammen, was man braucht, um das zu implementieren. Und tatsächlich, die werden alle fair gescheduled. Das heißt, also wenn man sich jetzt, da wäre jetzt ein Schaubild ganz nett, so als Klassenmodell, wie ist die Vererbungs-Hierarchie an der Stelle?

01:17:31.200 --> 01:17:33.220
also wenn man

01:17:33.220 --> 01:17:34.460
jetzt zum Beispiel async-dev schreibt,

01:17:34.720 --> 01:17:37.160
also async-dev-Funktion ist

01:17:37.160 --> 01:17:39.080
was sehr ähnliches wie eine normale Funktion, die

01:17:39.080 --> 01:17:41.300
jetzt irgendwie yield statt return sagt.

01:17:41.940 --> 01:17:43.260
Die wird nämlich intern in Python

01:17:43.260 --> 01:17:44.940
auch anders behandelt als normale Funktion.

01:17:45.720 --> 01:17:46.780
Und auch dieser

01:17:46.780 --> 01:17:49.260
Was auch sehr überraschend

01:17:49.260 --> 01:17:51.080
ist für Anfänger, oder wenn man das erklärt.

01:17:51.200 --> 01:17:52.940
Vielleicht müsste man statt dev irgendwie

01:17:52.940 --> 01:17:55.020
gen-Name machen oder sowas. Nein, nein.

01:17:55.960 --> 01:17:57.360
Da schreibst du es schon so hin,

01:17:57.420 --> 01:17:59.140
aber wenn du sagst yield im Body der

01:17:59.140 --> 01:18:01.240
Funktion, dann wird das Ding anders behandelt

01:18:01.240 --> 01:18:02.240
und nicht mehr als normale Funktion.

01:18:02.240 --> 01:18:04.340
Ja, das ist die gleiche Art. Wenn man die Deklaration dann anders machen würde,

01:18:04.400 --> 01:18:06.560
vielleicht mit einem Gen, statt einem Define,

01:18:06.660 --> 01:18:08.580
dann könnte man dann...

01:18:08.580 --> 01:18:09.600
Ja, aber...

01:18:09.600 --> 01:18:12.220
Du siehst dann halt an einer anderen Stelle und dann musst du

01:18:12.220 --> 01:18:14.160
aufpassen, dass das zusammenpasst.

01:18:14.420 --> 01:18:18.040
Das ist schon okay, so wie es ist.

01:18:18.120 --> 01:18:19.940
Es ist nur einmal am Anfang, wenn man das erklärt,

01:18:20.000 --> 01:18:21.520
zum ersten Mal, dann ist es echt weird.

01:18:22.180 --> 01:18:24.380
Ja, also im Grunde

01:18:24.380 --> 01:18:26.200
sind halt nur andere

01:18:26.200 --> 01:18:28.040
Schlüsselwörter, aber was man

01:18:28.040 --> 01:18:29.940
tatsächlich macht, ist halt einen Generator

01:18:29.940 --> 01:18:31.620
oder eine Funktion zu definieren,

01:18:31.720 --> 01:18:34.020
die halt irgendwelche Dinger, also einen Generator

01:18:34.020 --> 01:18:36.020
erzeugt. Und wenn man

01:18:36.020 --> 01:18:37.840
jetzt die Worte ändert, dann hat man fast

01:18:37.840 --> 01:18:39.760
das schon, was Async.io macht, nämlich wenn man sagt,

01:18:39.900 --> 01:18:41.940
Async.dev ist, damit definiert

01:18:41.940 --> 01:18:43.620
man halt eine Funktion, die jetzt, die man

01:18:43.620 --> 01:18:45.420
anhalten kann und die man weiterlaufen lassen kann.

01:18:46.360 --> 01:18:47.920
Und wenn man

01:18:47.920 --> 01:18:49.900
die aufruft, kriegt man nicht das Ergebnis der Funktion

01:18:49.900 --> 01:18:51.780
zurück, sondern eine Kuroutine oder

01:18:51.780 --> 01:18:52.400
ein Generator.

01:18:53.700 --> 01:18:55.500
Eine Routine, die man dann halt starten kann.

01:18:56.740 --> 01:18:57.100
Genau.

01:18:58.040 --> 01:18:59.680
auf genau diese Runde, bis er wieder Yield-Zahl

01:18:59.680 --> 01:19:01.940
gesagt hat, oder? Genau, und

01:19:01.940 --> 01:19:03.920
das Ganze ist verpackt, also

01:19:03.920 --> 01:19:05.680
wenn man jetzt, man hat diese Ansend-Funktion

01:19:05.680 --> 01:19:07.060
und dann hat man

01:19:07.060 --> 01:19:09.720
diese

01:19:09.720 --> 01:19:12.000
Kurroutinen und diese Kurroutinen

01:19:12.000 --> 01:19:13.900
verpackt in ein Future,

01:19:14.800 --> 01:19:15.740
sozusagen das Interface von

01:19:15.740 --> 01:19:16.160
dem Future,

01:19:17.360 --> 01:19:18.340
sind ein Task.

01:19:20.560 --> 01:19:21.700
Und dann sind wir eigentlich

01:19:21.700 --> 01:19:23.760
komplett, weil das, was tatsächlich, was man

01:19:23.760 --> 01:19:25.600
haben will, sind eigentlich Tasks. Das ist halt so das,

01:19:25.600 --> 01:19:26.780
was eigentlich die

01:19:26.780 --> 01:19:30.520
Low-Level-Async-IO-Geschichte

01:19:30.520 --> 01:19:31.480
ist. Also ein Future hat

01:19:31.480 --> 01:19:33.120
ein erwartbares Ergebnis, oder?

01:19:33.780 --> 01:19:34.540
Ja, ein Future ist

01:19:34.540 --> 01:19:37.820
sozusagen auch nur ein Interface

01:19:37.820 --> 01:19:39.160
für, also

01:19:39.160 --> 01:19:41.020
in einem Future kann man halt

01:19:41.020 --> 01:19:43.880
das kann man halt fragen, so bist du fertig?

01:19:44.380 --> 01:19:45.920
Und dann sagt das halt ja oder nein, also dann.

01:19:46.420 --> 01:19:47.720
Oder man kann ein Result

01:19:47.720 --> 01:19:49.380
für ein Future setzen, dann kann man sagen so

01:19:49.380 --> 01:19:51.540
future.setResult

01:19:51.540 --> 01:19:54.100
irgendwas und dann, wenn man sagt future.done

01:19:54.100 --> 01:19:55.760
dann sagt das, ja, ich bin fertig, ich habe ja ein Result

01:19:55.760 --> 01:19:57.480
und dann kann man das Result auch holen.

01:19:58.000 --> 01:19:59.200
Und man kann eben auch sagen...

01:19:59.200 --> 01:19:59.780
Kann man die nicht sogar verketten?

01:20:00.120 --> 01:20:01.480
Man kann die verketten, beliebig, genau.

01:20:01.560 --> 01:20:02.900
Man kann auch solche Sachen sagen wie,

01:20:03.360 --> 01:20:06.380
wenn du fertig bist, dann ruf folgende Funktionen auf.

01:20:07.480 --> 01:20:08.180
Folgendes Future.

01:20:08.480 --> 01:20:10.680
Ja, und das kann man beliebig vielen wieder machen.

01:20:11.280 --> 01:20:12.820
Und die gehen auch alle wieder auf die Event-Loop.

01:20:13.280 --> 01:20:14.560
Das ist auch ein interessanter Unterschied.

01:20:14.840 --> 01:20:16.480
Als ich da so ein bisschen was drüber gelesen habe,

01:20:17.140 --> 01:20:20.560
habe ich das dann gesehen, es gab ein Node.js macht das anders

01:20:20.560 --> 01:20:24.060
und es gab da auch einen Vortrag von dem Ryan Dahl,

01:20:24.280 --> 01:20:26.140
der Node.js mal irgendwann entwickelt hat.

01:20:26.780 --> 01:20:27.880
Das ist jetzt auch schon wieder was her,

01:20:28.020 --> 01:20:29.540
2018 hat er den gehalten und meinte so,

01:20:29.580 --> 01:20:31.660
ah, Designfehler in Node.js früher.

01:20:32.120 --> 01:20:33.580
Also einer der Fehler ist halt,

01:20:33.800 --> 01:20:34.800
dass es eben nicht so,

01:20:35.740 --> 01:20:37.720
dass auch diese Promise-Geschichte in JavaScript

01:20:37.720 --> 01:20:39.920
nicht, dass Node.js

01:20:39.920 --> 01:20:41.620
da nicht so wirklich drauf basiert, sondern dass sie

01:20:41.620 --> 01:20:43.560
halt auch viele Callbacks haben, die dann direkt ausgeführt

01:20:43.560 --> 01:20:45.740
werden und dann haben sie das Problem,

01:20:45.880 --> 01:20:47.640
dass Netzwerk dann doch nicht so gut funktioniert,

01:20:47.820 --> 01:20:49.700
weil sie teilweise nicht kontrollieren

01:20:49.700 --> 01:20:51.440
können, wann welche Callbacks ausgeführt werden

01:20:51.440 --> 01:20:53.300
und sie dann irgendwie, keine Ahnung,

01:20:53.400 --> 01:20:55.560
kompliziert, Backpressure kriegen, Probleme

01:20:55.560 --> 01:20:57.440
kriegen an diversen Stellen und das dann alles

01:20:57.440 --> 01:20:59.480
irgendwie wie ein Kartenhaus in sich zusammenfällt.

01:20:59.800 --> 01:21:00.920
An der Stelle bräuchten wir vielleicht mal

01:21:00.920 --> 01:21:01.720
ein bisschen mehr mit jemandem reden.

01:21:03.040 --> 01:21:05.640
Genau, und

01:21:05.640 --> 01:21:07.640
in Python

01:21:07.640 --> 01:21:09.460
ist es halt so, da wird das alles wieder,

01:21:09.940 --> 01:21:11.400
die ganzen Callbacks der

01:21:11.400 --> 01:21:13.400
Features, die gehen auch alle wieder zurück in die Event-Loop

01:21:13.400 --> 01:21:15.020
und werden ganz normal gescheduled und das ist alles

01:21:15.020 --> 01:21:17.520
fair, sozusagen. Also kein Callback,

01:21:17.600 --> 01:21:19.260
das ist ein Callback, das ist ein Backcall.

01:21:19.320 --> 01:21:21.420
Im Wesentlichen ist dann jeder Funktionsaufruf

01:21:21.420 --> 01:21:22.680
eben so ein Yield-Punkt, oder?

01:21:23.180 --> 01:21:33.060
Ja, beziehungsweise, genau, an der Stelle findet dieser Übergang statt, an der Stelle geht es zurück in die Event-Loop und dann halt in den nächsten Callback.

01:21:34.480 --> 01:21:48.980
Ja genau, aber das ist ja eben genau wichtig sonst, also damit dieses kooperative Multitasking hier funktioniert, dass die Prozesse einfach regelmäßig oder in möglichst kurzen Abständen yielden, damit eben die Event-Loop andere Sachen machen kann.

01:21:49.960 --> 01:21:52.820
Genau, wenn man das nicht macht, hat man ein Problem, ja.

01:21:53.020 --> 01:21:55.360
Ja gut, dann hältst du halt im Wesentlichen die Event-Loop an.

01:21:55.460 --> 01:21:59.500
Also wenn einer von denen hängen bleibt, sage ich mal,

01:22:00.520 --> 01:22:03.460
dann hat auch die Event-Loop wenig Möglichkeiten,

01:22:03.640 --> 01:22:06.180
da was zu tun dagegen, weil die halt nie wieder dran ist.

01:22:06.680 --> 01:22:06.780
Ja.

01:22:07.920 --> 01:22:11.380
Und das ist zum Beispiel in der Erlang-Welt anders.

01:22:11.380 --> 01:22:15.700
Wenn da ein Actor, die haben auch natürlich Monitoring eingebaut,

01:22:15.820 --> 01:22:19.440
automatisch, das heißt, man kann da Time-Outs setzen

01:22:19.440 --> 01:22:21.980
und wenn der Time-Out erreicht ist, dann wird halt der Actor abgeschossen.

01:22:22.680 --> 01:22:22.740
Ja.

01:22:23.020 --> 01:22:25.940
Ja, ja, also

01:22:25.940 --> 01:22:28.880
das ist halt da noch mal

01:22:28.880 --> 01:22:30.440
anders, ja.

01:22:31.400 --> 01:22:32.900
Ja, und dann habe ich auch noch so ein bisschen

01:22:32.900 --> 01:22:34.720
Benchmarks gemacht,

01:22:35.240 --> 01:22:37.020
wollte einfach mal gucken, wie schnell ist das denn alles

01:22:37.020 --> 01:22:39.080
so ungefähr. Und das

01:22:39.080 --> 01:22:40.920
war auch teilweise ganz interessant.

01:22:42.660 --> 01:22:42.880
Also

01:22:42.880 --> 01:22:45.000
bei Node.js kommt man ungefähr so bei,

01:22:45.480 --> 01:22:45.600
also

01:22:45.600 --> 01:22:48.460
es bietet einem dann,

01:22:49.440 --> 01:22:51.200
ich habe NUX, glaube ich,

01:22:51.300 --> 01:22:52.780
irgendwo mal deployed und dann, also

01:22:52.780 --> 01:22:55.460
wenn man das startet, man kriegt nicht mal

01:22:55.460 --> 01:22:57.360
die Option, das auf mehreren Prozessen laufen zu lassen

01:22:57.360 --> 01:22:59.260
oder so, sondern man kriegt halt irgendwie einen Prozess

01:22:59.260 --> 01:23:01.280
mit der Event-Loop und das war's. Aber der

01:23:01.280 --> 01:23:03.360
macht halt dann auch schon so 7.000 Requests pro Sekunde

01:23:03.360 --> 01:23:04.860
oder so, wenn man jetzt einfach nur

01:23:04.860 --> 01:23:07.700
ein Stückchen

01:23:07.700 --> 01:23:09.160
Hello World JSON zurückgibt.

01:23:09.880 --> 01:23:11.580
Und das ist schon

01:23:11.580 --> 01:23:13.320
sehr schnell. Und wenn man

01:23:13.320 --> 01:23:15.420
das konfigurieren könnte, was ich nicht konnte,

01:23:15.540 --> 01:23:17.260
aber dann kann man das bestimmt auf mehreren Prozessen

01:23:17.260 --> 01:23:18.920
auch laufen lassen. Und das

01:23:18.920 --> 01:23:21.260
wird dann wahrscheinlich in einer ähnlichen

01:23:21.260 --> 01:23:22.700
Richtung, weil es die gleiche Event-Loop ist,

01:23:23.180 --> 01:23:25.080
liegen wie, wenn man jetzt irgendwie

01:23:25.080 --> 01:23:27.060
einfach nur Starlet nimmt oder

01:23:27.060 --> 01:23:29.040
so, halt Async

01:23:29.040 --> 01:23:31.040
Webserver und dann LibUV

01:23:31.040 --> 01:23:33.140
drunter und auch wieder so Hello World JSON

01:23:33.140 --> 01:23:35.160
zurückgibt, dann kommt man so

01:23:35.160 --> 01:23:37.180
auf 35.000 Requests pro Sekunde

01:23:37.180 --> 01:23:38.460
bei einer 8-Core-Maschine.

01:23:40.280 --> 01:23:41.160
Also bei meinem...

01:23:41.160 --> 01:23:42.460
Das ist etwas weniger als 7.000.

01:23:43.540 --> 01:23:45.280
Nee, mehr, aber es ist ja auch...

01:23:45.280 --> 01:23:47.120
Es ist etwas weniger als 7.000 pro Core.

01:23:47.400 --> 01:23:48.340
Ja, das kann sein, genau.

01:23:49.840 --> 01:23:51.060
Es ist ein bisschen weniger

01:23:51.060 --> 01:23:53.080
genau, braucht auch ein bisschen,

01:23:53.340 --> 01:23:55.020
aber es ist, es ist, es ist, auf

01:23:55.020 --> 01:23:57.060
einem Prozess ist es aber ähnlich, auf einem Prozess

01:23:57.060 --> 01:23:59.120
ist es fast gleich, also es macht ja echt

01:23:59.120 --> 01:24:00.240
kaum einen Unterschied. Ja, okay.

01:24:01.360 --> 01:24:03.060
Ja gut, die werden halt auch im Wesentlichen

01:24:03.060 --> 01:24:05.000
nicht viel anderes machen, das sind ja kurze

01:24:05.000 --> 01:24:07.280
Funktionen, die ausgeführt werden, wenn so ein

01:24:07.280 --> 01:24:08.760
WV-Core

01:24:08.760 --> 01:24:11.080
kommt. Ja, und die Latenz war auch

01:24:11.080 --> 01:24:12.780
fast gleich, tatsächlich bei

01:24:12.780 --> 01:24:15.200
Node.js ein bisschen konstanter als bei

01:24:15.200 --> 01:24:16.280
bei Python,

01:24:17.320 --> 01:24:19.100
aber

01:24:19.100 --> 01:24:21.000
auch so, also tatsächlich

01:24:21.000 --> 01:24:22.860
die Netzwerk-Latenz zwischen den beiden Rechnern, auf denen

01:24:22.860 --> 01:24:24.340
ich das probiert habe, war so 2-3 Millisekunden.

01:24:25.440 --> 01:24:26.780
Und die

01:24:26.780 --> 01:24:29.140
gemessene

01:24:29.140 --> 01:24:30.780
Latenz war dann so 12-13

01:24:30.780 --> 01:24:32.880
Millisekunden immer. Sowohl bei Node.js wie

01:24:32.880 --> 01:24:35.060
auch bei Python. Auch wahrscheinlich

01:24:35.060 --> 01:24:36.600
eben die Latenz von Yubi halt.

01:24:37.480 --> 01:24:38.700
Aber das ist auch schon ziemlich gut.

01:24:38.980 --> 01:24:40.400
Also kann man nicht mehr kann.

01:24:41.260 --> 01:24:42.980
Wenn man jetzt Django nimmt

01:24:42.980 --> 01:24:44.980
und nicht irgendwie so einen rohen

01:24:44.980 --> 01:24:46.860
Async-Server,

01:24:47.220 --> 01:24:48.920
also Yubicorn habe ich

01:24:48.920 --> 01:24:51.240
verwendet halt als Applikationshäufer.

01:24:52.660 --> 01:24:53.260
Wenn man

01:24:53.260 --> 01:24:55.060
jetzt Ubicon nimmt und

01:24:55.060 --> 01:24:56.980
Django, dann sieht das halt

01:24:56.980 --> 01:24:58.940
ein bisschen anders aus. Dann ist

01:24:58.940 --> 01:25:01.040
halt leider, also

01:25:01.040 --> 01:25:02.980
da gehen insgesamt nur so 3000

01:25:02.980 --> 01:25:04.500
Requests pro Sekunde durch ungefähr.

01:25:05.700 --> 01:25:06.940
Wahrscheinlich liegt das irgendwie

01:25:06.940 --> 01:25:08.980
an diesem ganzen Middleware-Stack oder ich weiß nicht genau, woran es

01:25:08.980 --> 01:25:10.520
liegt, aber das ist halt... Ja, der macht halt sehr viel.

01:25:10.620 --> 01:25:11.800
Macht halt sehr viel pro View.

01:25:12.580 --> 01:25:14.940
Also das ist deutlich weniger

01:25:14.940 --> 01:25:17.020
und es ist halt auch, die Latenz ist

01:25:17.020 --> 01:25:18.800
halt deutlich höher. Die ist irgendwie direkt bei

01:25:18.800 --> 01:25:20.720
also 30 Millisekunden oder sowas. Ich meine, das ist immer noch nicht viel,

01:25:20.840 --> 01:25:21.780
aber es ist halt dann schon mal

01:25:21.780 --> 01:25:24.860
so, puh, oi, das war schon

01:25:24.860 --> 01:25:26.700
ja, ich meine, es ist alles

01:25:26.700 --> 01:25:28.720
völlig irrelevant, ja, also nicht, dass ich jemals

01:25:28.720 --> 01:25:30.540
irgendwie... Ja, klar, aber die Zahlen sind halt schon

01:25:30.540 --> 01:25:32.460
deutlich unterschiedlich. Ja, und

01:25:32.460 --> 01:25:34.560
was ich dann krass fand, ist,

01:25:34.640 --> 01:25:35.160
wenn man

01:25:35.160 --> 01:25:38.440
Django nimmt

01:25:38.440 --> 01:25:40.340
mit Junicorn und

01:25:40.340 --> 01:25:41.680
zum Beispiel G-Event-Workern,

01:25:42.700 --> 01:25:44.480
dann ist das auf einer CPU

01:25:44.480 --> 01:25:46.440
auch so bei 8000 Requests pro Sekunde, also sogar noch ein bisschen

01:25:46.440 --> 01:25:47.160
schneller als CPU-Wi.

01:25:48.180 --> 01:25:50.300
Und auch mit relativ

01:25:50.300 --> 01:25:52.320
wenig Latenz. Also das hat

01:25:52.320 --> 01:25:54.260
mich auch gewundert. Wow, krass. Wusste ich, hätte ich

01:25:54.260 --> 01:25:56.080
jetzt nicht gedacht. Also

01:25:56.080 --> 01:25:57.800
das war,

01:25:58.100 --> 01:25:59.700
das fand ich ganz beachtlich.

01:26:01.120 --> 01:26:02.420
Und auch Latenz besser.

01:26:03.020 --> 01:26:04.260
Aber du kannst es nicht als

01:26:04.260 --> 01:26:05.900
ASGI laufen lassen, sondern dann

01:26:05.900 --> 01:26:08.260
über Whiskey

01:26:08.260 --> 01:26:10.260
Interface. Und da kannst du natürlich viele

01:26:10.260 --> 01:26:11.080
Dinge so nicht mehr machen.

01:26:13.260 --> 01:26:14.320
Aber da ist

01:26:14.320 --> 01:26:16.220
das dann gar nicht mehr so langsam. Ich glaube

01:26:16.220 --> 01:26:17.800
irgendwie momentan ist es halt noch so, dass

01:26:17.800 --> 01:26:20.340
die ASCII-Geschichten nehmen irgendwie einen Sonderweg

01:26:20.340 --> 01:26:22.460
in Django und dieser Sonderweg ist irgendwie ein Stückchen langsamer.

01:26:23.620 --> 01:26:24.260
Ja, aber

01:26:24.260 --> 01:26:26.360
keine Ahnung. Aber da würdest du jetzt

01:26:26.360 --> 01:26:28.160
dann natürlich auch nicht deinen File-Server

01:26:28.160 --> 01:26:30.280
bauen. Würdest du dich trauen,

01:26:30.480 --> 01:26:32.400
einen File-Server mit Django

01:26:32.400 --> 01:26:33.860
ASCII-Uvicorn zu machen?

01:26:34.120 --> 01:26:35.980
Ich glaube, das ginge wahrscheinlich sogar tatsächlich.

01:26:36.660 --> 01:26:37.720
Also wahrscheinlich wäre das schnell genug.

01:26:37.720 --> 01:26:39.740
Oder würdest du den raustun und in den Starlight rein tun?

01:26:40.420 --> 01:26:42.280
Ja, das wäre eben auch so eine

01:26:42.280 --> 01:26:42.460
Sache.

01:26:44.820 --> 01:26:46.020
Wahrscheinlich würde ich es eher mit sowas wie

01:26:46.020 --> 01:26:48.180
Starlet probieren oder FastAPI oder so.

01:26:49.060 --> 01:26:50.200
Genau, einfach

01:26:50.200 --> 01:26:51.280
deswegen, weil das da

01:26:51.280 --> 01:26:54.240
so seamless ist quasi. Das ist halt

01:26:54.240 --> 01:26:55.280
irgendwie

01:26:55.280 --> 01:26:57.940
dafür schon gebaut und das funktioniert einfach so.

01:26:58.800 --> 01:27:00.020
Und was ja auch toll ist,

01:27:00.140 --> 01:27:01.900
du kannst ja auch über

01:27:01.900 --> 01:27:04.020
ASCII halt mehrere

01:27:04.020 --> 01:27:04.980
Applikationen haben.

01:27:05.960 --> 01:27:07.940
Du nimmst halt einen Applikationsserver und

01:27:07.940 --> 01:27:09.840
sagst dem halt unter der URL, es ist halt

01:27:09.840 --> 01:27:11.860
irgendwie, deine ASCII-Applikation ist halt

01:27:11.860 --> 01:27:13.840
jetzt irgendwie FastAPI oder sonst irgendwas.

01:27:14.000 --> 01:27:15.920
Ja, klar. Und unter der URL ist es

01:27:15.920 --> 01:27:17.140
halt Django. Gar kein Problem.

01:27:17.940 --> 01:27:19.760
Und gibst denen halt unterschiedliche Funktionen mit und dann

01:27:19.760 --> 01:27:20.500
ist das halt so.

01:27:21.920 --> 01:27:23.660
Sodass du halt auch sowas machen, wenn du

01:27:23.660 --> 01:27:26.140
es jetzt schaffst, irgendwie zum Beispiel Sachen zu authentifizieren,

01:27:26.900 --> 01:27:27.860
du kriegst ja das gleiche

01:27:27.860 --> 01:27:29.760
Cookie, Session-Cookie zum Beispiel, und dann kannst du

01:27:29.760 --> 01:27:31.200
natürlich auch die Autorisierung in

01:27:31.200 --> 01:27:33.180
irgendwas anderem machen und nicht unbedingt in Django.

01:27:33.780 --> 01:27:35.480
Wenn das geht, und das geht bestimmt irgendwie,

01:27:36.080 --> 01:27:37.820
dann kannst du auch das Ding dazu verwenden,

01:27:37.820 --> 01:27:38.660
die Files auszuliefern.

01:27:39.460 --> 01:27:41.660
Oder könntest du es über einen geteilten Cache oder irgendwelche

01:27:41.660 --> 01:27:43.920
anderen Messages machen, dass du quasi...

01:27:43.920 --> 01:27:45.780
Dass man das andere

01:27:45.780 --> 01:27:47.800
Dinge und dann halt irgendwie fragt, ja, das könnte man wahrscheinlich auch machen.

01:27:48.000 --> 01:27:49.700
Sogar über dieses ASCII-Interface könnte man das machen.

01:27:50.860 --> 01:27:51.900
Ja, also wie auch immer.

01:27:51.930 --> 01:27:53.630
das kriegt man auf jeden Fall hin, denke ich. Und

01:27:53.630 --> 01:27:55.890
dann bräuchte man vielleicht diese

01:27:55.890 --> 01:27:57.670
ganze Nginx-Geschichte schon nicht mehr

01:27:57.670 --> 01:27:59.810
und kann es einfach auch alles direkt in

01:27:59.810 --> 01:28:01.850
Python machen. Ja, gut, irgendwas brauchst du

01:28:01.850 --> 01:28:04.010
davor, um es zu terminieren. Also SSL-Termination

01:28:04.010 --> 01:28:05.550
genau, das willst du nicht.

01:28:06.490 --> 01:28:07.710
Ja, also da ist meine

01:28:07.710 --> 01:28:08.150
aktuelle

01:28:08.150 --> 01:28:11.150
Geschichte ja Traffic

01:28:11.150 --> 01:28:13.810
und ich fand es hakelig zu

01:28:13.810 --> 01:28:15.430
konfigurieren. Wir schreiben übrigens Traffic

01:28:15.430 --> 01:28:17.590
für die Leute, die mitgoogeln wollen.

01:28:19.190 --> 01:28:19.230
Und

01:28:19.230 --> 01:28:22.250
Ja, das ist so ein

01:28:22.250 --> 01:28:23.930
Loadbalancer, TCP,

01:28:24.130 --> 01:28:26.290
HTTP und mit eingebautem

01:28:26.290 --> 01:28:28.110
SSL. Ja, es ist hauptsächlich ein

01:28:28.110 --> 01:28:29.670
Loadbalancer, oder? Habe ich so verstanden.

01:28:29.870 --> 01:28:31.570
Ja, die machen gar kein Web-Server-Kram.

01:28:31.950 --> 01:28:33.310
Also da gibt es auch diverse...

01:28:33.310 --> 01:28:35.330
SSL-Termination und Loadbalancer.

01:28:35.570 --> 01:28:37.610
Ja, genau. Und das Ding ist

01:28:37.610 --> 01:28:40.050
in Go geschrieben

01:28:40.050 --> 01:28:42.110
und performt auch. Es ist auch so,

01:28:42.150 --> 01:28:44.090
wenn man SSL anschaltet, habe ich dann natürlich auch getestet,

01:28:44.410 --> 01:28:46.030
wie ist das eigentlich, wenn man jetzt SSL anmacht,

01:28:46.030 --> 01:28:46.770
wie wirkt sich das auf?

01:28:47.470 --> 01:28:49.350
Ja, es verbrennt gut CPU

01:28:49.350 --> 01:28:51.610
und es wird dann alles, ist dann alles

01:28:51.610 --> 01:28:53.570
nur noch halb so schnell. Aber okay,

01:28:53.790 --> 01:28:55.770
das ist ja gut. Klar, dass das was kostet.

01:28:55.950 --> 01:28:57.630
Das ist ja irgendwie logisch. Ja, gut, aber

01:28:57.630 --> 01:28:59.490
das sind ja Kosten, die man, also da

01:28:59.490 --> 01:29:00.230
kommst du halt nicht drum rum.

01:29:01.330 --> 01:29:02.430
Die hast du halt irgendwo.

01:29:04.310 --> 01:29:05.190
Genau, und

01:29:05.190 --> 01:29:07.650
ja, also das war

01:29:07.650 --> 01:29:09.410
eigentlich, also insofern würde ich sagen, also

01:29:09.410 --> 01:29:11.510
Django ist halt momentan noch im Vergleich zu

01:29:11.510 --> 01:29:13.450
Node.js und reinem Ubicorn

01:29:13.450 --> 01:29:15.270
irgendwie ein Stück langsamer.

01:29:15.470 --> 01:29:17.410
Woran es genau liegt, weiß ich nicht. Aber es ist

01:29:17.410 --> 01:29:19.330
auch schnell genug wahrscheinlich für alles, was man irgendwie so

01:29:19.330 --> 01:29:21.410
damit machen möchte. Insofern eigentlich kein großes Problem.

01:29:24.170 --> 01:29:25.410
Und dann habe ich auch nochmal Erlang

01:29:25.410 --> 01:29:27.530
getestet. Und Erlang war

01:29:27.530 --> 01:29:31.410
Erlang war quasi

01:29:31.410 --> 01:29:33.410
genauso schnell wie Ubicorn

01:29:33.410 --> 01:29:35.430
auf allen CPUs. Hat auch

01:29:35.430 --> 01:29:37.470
irgendwie alle CPUs komplett ausgelastet

01:29:37.470 --> 01:29:38.530
und

01:29:38.530 --> 01:29:41.310
hat halt auch so 35.000 Requests

01:29:41.310 --> 01:29:43.250
pro Sekunde ungefähr gemacht. Aber was ich total

01:29:43.250 --> 01:29:45.270
überraschend fand, und das hat mich

01:29:45.270 --> 01:29:47.050
auch beeindruckt, ehrlich gesagt, war,

01:29:47.390 --> 01:29:49.310
dass die Latenz, also du hast ja

01:29:49.310 --> 01:29:51.050
dann immer so, also die meisten Requests

01:29:51.050 --> 01:29:53.330
liegen halt alle in so einem engen Korridor

01:29:53.330 --> 01:29:54.730
von Zeit, Latenz

01:29:54.730 --> 01:29:57.010
und dann hast du halt so ein paar Ausreißer

01:29:57.010 --> 01:29:58.770
irgendwie so und eigentlich schon eher

01:29:58.770 --> 01:30:01.050
viele, manchmal dauern Dinge dann länger und das

01:30:01.050 --> 01:30:02.990
wollen wir ja eigentlich auch nicht. Und bei R lang

01:30:02.990 --> 01:30:05.110
hat man das praktisch gar nicht. Die brauchen alle

01:30:05.110 --> 01:30:07.030
genau gleich lang und alle nur so 3

01:30:07.030 --> 01:30:09.130
Millisekunden. Die Latenz zwischen

01:30:09.130 --> 01:30:10.670
den beiden Rechnern, wenn man Ping macht, sind halt irgendwie

01:30:10.670 --> 01:30:13.210
2,47 Millisekunden oder sowas

01:30:13.210 --> 01:30:15.010
und die Latenz bei den R langen Dingern

01:30:15.010 --> 01:30:17.030
ist halt 3 Millisekunden. Also wow, krass.

01:30:17.390 --> 01:30:19.650
Okay, das ist, ja.

01:30:19.730 --> 01:30:21.150
Ja, das ist eben diese Telefonie, ja.

01:30:21.470 --> 01:30:23.330
Das ist einfach ein Realtime-System

01:30:23.330 --> 01:30:27.790
und das merkt man eben an so einer Stelle ziemlich deutlich.

01:30:28.330 --> 01:30:30.410
Also da waren halt eben, also ja,

01:30:30.590 --> 01:30:33.230
das fand ich durchaus auch beeindruckend, ja.

01:30:35.170 --> 01:30:37.790
Aber wie kann man jetzt diese beiden Welten verheiraten, Jochen?

01:30:37.870 --> 01:30:38.530
Wie würdest du jetzt?

01:30:39.750 --> 01:30:41.050
Kann man ja auch machen, ne?

01:30:41.050 --> 01:30:42.350
Man könnte ja auch sagen, okay,

01:30:43.090 --> 01:30:45.630
man lässt das über den gleichen Loadbalancer gehen

01:30:46.570 --> 01:30:48.250
Ja, okay, wenn man so einen Load-Balancer hat, ja.

01:30:49.030 --> 01:30:50.950
Ja, okay, man braucht irgendwas in der Richtung

01:30:50.950 --> 01:30:53.510
und dann könnte ja auch zum Beispiel Erlang

01:30:53.510 --> 01:30:55.010
die Session-Cookies von Django kriegen,

01:30:55.090 --> 01:30:55.870
weil es ja die gleiche Domain.

01:30:56.570 --> 01:30:58.690
Ja, wobei Session-Cookies reichen ja alleine nicht aus.

01:30:58.790 --> 01:30:59.970
Du hast ja oft bei Authentifizierung,

01:31:00.010 --> 01:31:02.090
hast du dann irgendwelche Datenbank-Aufrufe,

01:31:02.650 --> 01:31:04.410
ob du welche Dateien du sehen darfst

01:31:04.410 --> 01:31:06.670
oder welche Bilder oder was weiß ich.

01:31:06.890 --> 01:31:07.450
Ja, ja, klar, okay.

01:31:07.610 --> 01:31:09.790
Aber du kannst ja auf die gleiche Datenbank gehen.

01:31:09.890 --> 01:31:10.650
Das könntest du ja machen.

01:31:11.350 --> 01:31:12.710
Ja, nee, aber klar.

01:31:14.410 --> 01:31:16.270
Eine Lösung, die ich mal gesehen habe, ist, dass du das

01:31:16.270 --> 01:31:18.330
über S3-Buckets machst und dann solche Tickets

01:31:18.330 --> 01:31:20.470
mitschickst, weil da kannst du so Authentifizierungstickets

01:31:20.470 --> 01:31:22.110
machen. Moment, du machst

01:31:22.110 --> 01:31:23.490
welche Tickets auf welche Buckets?

01:31:25.190 --> 01:31:26.330
Ist ja gar nichts. Das

01:31:26.330 --> 01:31:28.310
Wichtige ist, du hast zwei Systeme und das eine

01:31:28.310 --> 01:31:30.290
System sagt dem anderen, ja, du darfst die Datei

01:31:30.290 --> 01:31:32.010
ausliefern oder nein, du darfst sie nicht ausliefern.

01:31:32.030 --> 01:31:34.090
Und das eine ist ein Erlang und das andere ist Django zum Beispiel.

01:31:34.150 --> 01:31:36.030
Und sowas könnte man da ja prinzipiell auch machen,

01:31:36.030 --> 01:31:38.230
dass du sagst, du hast irgendwie so eine interne

01:31:38.230 --> 01:31:40.110
Schnittstelle, die dir

01:31:40.110 --> 01:31:42.190
aufruft und sagt, darf dieser Session-Cookie

01:31:42.190 --> 01:31:43.490
diese Datei abrufen?

01:31:44.290 --> 01:31:45.770
Ja, das geht.

01:31:45.770 --> 01:31:47.410
Sowas könnte man machen, dass du quasi da

01:31:47.410 --> 01:31:49.950
eine internische Stelle hast, weil das brauchst

01:31:49.950 --> 01:31:51.870
du auf jeden Fall. Wenn du das alles in ASCII

01:31:51.870 --> 01:31:53.830
hast, hast du auch eine internische Stelle.

01:31:54.370 --> 01:31:55.650
Auch wenn du eben Starlet

01:31:55.650 --> 01:31:57.950
und Django

01:31:57.950 --> 01:31:59.610
zusammenfindest, brauchst du auch eine schöne Stelle.

01:31:59.990 --> 01:32:01.310
Das ist dann halt eine Python-Funktion.

01:32:02.150 --> 01:32:03.950
Wenn du zwei VMs

01:32:03.950 --> 01:32:05.970
quasi in einem Loadbalancer zusammentust,

01:32:06.070 --> 01:32:07.670
hättest du auch eine schöne Stelle, die dann halt aber eine

01:32:07.670 --> 01:32:09.990
HTTP-Stelle ist.

01:32:11.990 --> 01:32:12.930
Was ja okay ist.

01:32:12.930 --> 01:32:14.830
ja, was ja prinzipiell

01:32:14.830 --> 01:32:16.530
möglich ist.

01:32:17.350 --> 01:32:19.010
Und dann hast du ja wieder so eine Situation,

01:32:19.170 --> 01:32:20.910
ich meine, Extent-File ist ja auch nichts anderes als

01:32:20.910 --> 01:32:22.730
so eine Schildstelle, ja, die sagt, liefere

01:32:22.730 --> 01:32:23.850
diese Datei aus.

01:32:26.570 --> 01:32:27.130
Wäre halt

01:32:27.130 --> 01:32:28.890
hier ein kleines bisschen anders. Aber ich wüsste jetzt nicht, dass

01:32:28.890 --> 01:32:30.290
es da was gibt, was vorbereitet ist.

01:32:31.010 --> 01:32:32.810
Nee, da muss man dann selber, also ich habe tatsächlich auch

01:32:32.810 --> 01:32:34.710
jemanden schon irgendwo im Blog, ich habe dann nur

01:32:34.710 --> 01:32:36.750
ganz kurz danach gegoogelt und dann habe ich jemanden gefunden,

01:32:36.870 --> 01:32:38.650
der einen Blogpost dazu geschrieben hat, wie man

01:32:38.650 --> 01:32:41.010
Django-Sessions

01:32:41.010 --> 01:32:42.870
von Erlang aus authentifizieren kann.

01:32:42.930 --> 01:32:45.130
und der Fazit von dem Blogpost

01:32:45.130 --> 01:32:46.170
war irgendwie so, ja, ja, das geht.

01:32:47.490 --> 01:32:49.330
Aber... Ich meine, das ist ja im Wesentlichen

01:32:49.330 --> 01:32:50.970
eine Datenbank-Tabelle, da steht

01:32:50.970 --> 01:32:53.350
der Session-Cookie drin und ein serialisiertes

01:32:53.350 --> 01:32:55.130
Base64-serialisiertes

01:32:55.790 --> 01:32:56.710
JSON.

01:32:57.290 --> 01:32:59.150
War das, ja, ja, das geht, aber lass es lieber

01:32:59.150 --> 01:33:00.370
oder war das, ja, ja, geht, aber...

01:33:00.370 --> 01:33:01.950
Der brauchte das für irgendwas.

01:33:02.650 --> 01:33:04.550
Also gebaut und das war jetzt

01:33:04.550 --> 01:33:07.050
natürlich schon fummelig und das ist nicht so, dass das

01:33:07.050 --> 01:33:08.950
irgendwie, dass man das

01:33:08.950 --> 01:33:11.230
irgendwo... Es gibt keine Konfigurationsoptionen

01:33:11.230 --> 01:33:12.730
oder so, dass man jetzt sagt, Django, ja,

01:33:12.850 --> 01:33:14.670
aber man muss das dann halt

01:33:14.670 --> 01:33:16.870
erlangen. Aber es geht schon.

01:33:17.230 --> 01:33:18.690
Also insofern, ja.

01:33:19.570 --> 01:33:20.590
Ja, und das ist auch nicht

01:33:20.590 --> 01:33:22.670
super kompliziert

01:33:22.670 --> 01:33:24.290
schlimm. Also es ist nicht, du musst jetzt hier

01:33:24.290 --> 01:33:26.330
den internen Code von Django

01:33:26.330 --> 01:33:27.810
lesen und verstehen und

01:33:27.810 --> 01:33:30.450
erinnert sich alle meine Release, sondern es ist halt schon,

01:33:30.570 --> 01:33:32.690
du musst auf die Datenbank-Tabelle zugreifen

01:33:32.690 --> 01:33:34.470
und Base64 dekodieren und JSON

01:33:34.470 --> 01:33:36.510
lesen und fertig. Pipx install, oder?

01:33:37.910 --> 01:33:38.350
Ja,

01:33:38.530 --> 01:33:39.150
genau.

01:33:40.630 --> 01:33:42.470
Oder halt, keine Ahnung, wie es bei Erlang

01:33:42.470 --> 01:33:43.570
heißt. Beam-Install

01:33:43.570 --> 01:33:45.170
Python Django.

01:33:47.030 --> 01:33:50.230
Ja, aber ja, fand ich

01:33:50.230 --> 01:33:52.810
fand ich

01:33:52.810 --> 01:33:56.330
überhaupt, FastAPI habe ich mich jetzt ein bisschen

01:33:56.330 --> 01:33:57.350
mit beschäftigt mal.

01:33:58.710 --> 01:34:00.490
Zuerst, ich habe das immer mal schon verfolgt,

01:34:00.610 --> 01:34:02.130
so dass es, das ist eigentlich ganz interessant.

01:34:02.610 --> 01:34:04.310
Und jetzt habe ich es ein bisschen intensiver mir angeguckt

01:34:04.310 --> 01:34:06.230
und das ist wirklich eigentlich ziemlich cool, muss man sagen.

01:34:06.310 --> 01:34:08.390
Auf der anderen Seite, also auf der einen Seite, sehr cool.

01:34:08.390 --> 01:34:09.130
Auf der anderen Seite,

01:34:10.430 --> 01:34:12.250
ich vermisse Django, bei Django

01:34:12.250 --> 01:34:14.050
eben schon solche Sachen, dass halt da ist halt

01:34:14.050 --> 01:34:16.330
Registrierung, Authentifizierung, also wobei

01:34:16.330 --> 01:34:18.210
ehrlich gesagt, ich finde es fast noch ein bisschen zu wenig, also

01:34:18.210 --> 01:34:20.110
Registrierung muss man ja auch immer dann schon überlegen bei Django,

01:34:20.590 --> 01:34:22.570
aber dass halt zumindest Authentifizierung

01:34:22.570 --> 01:34:24.230
und so halbwegs eigentlich alles schon

01:34:24.230 --> 01:34:26.330
drin hat und bei FastAPI

01:34:26.330 --> 01:34:28.290
das macht man schon mehr oder weniger

01:34:28.290 --> 01:34:30.250
so roh selber und das

01:34:30.250 --> 01:34:32.170
ist halt so, okay,

01:34:32.430 --> 01:34:34.030
ich muss ja wirklich

01:34:34.030 --> 01:34:35.750
die Hash-Funktion auswählen und

01:34:35.750 --> 01:34:38.530
ja. Hat ja auch einen gewissen Security-Impact.

01:34:39.070 --> 01:34:39.370
Jaja.

01:34:41.050 --> 01:34:42.790
Genau. Die Verantwortung will ich gar nicht

01:34:42.790 --> 01:34:44.010
haben. Don't do it yourself, ja.

01:34:45.230 --> 01:34:46.130
Try. Ja.

01:34:46.750 --> 01:34:48.670
Und also insofern, dass da muss man halt

01:34:48.670 --> 01:34:50.430
eine ganze Menge Dinge tun,

01:34:50.710 --> 01:34:52.690
die man vielleicht gar nicht machen will, aber

01:34:52.690 --> 01:34:54.610
auf der anderen Seite ist es halt so, man sitzt halt auch

01:34:54.610 --> 01:34:55.310
wirklich mit dem

01:34:55.310 --> 01:34:58.410
Hintern roh auf dem

01:34:58.410 --> 01:35:00.750
auf der

01:35:00.750 --> 01:35:02.450
Performance und kann halt auch, wenn man jetzt

01:35:02.450 --> 01:35:04.770
müsste. Man muss zwar nie, aber man könnte.

01:35:05.410 --> 01:35:05.770
Aber

01:35:05.770 --> 01:35:08.650
das ist doch deine Hypothese, Johann. Man muss doch eigentlich

01:35:08.650 --> 01:35:09.050
gar nie.

01:35:11.050 --> 01:35:12.410
Wir lösen das durch mehr Prozessoren.

01:35:13.950 --> 01:35:15.430
Ja, auf jeden Fall, genau.

01:35:15.530 --> 01:35:17.570
FastAPI, eigentlich auch eine sehr, sehr schöne Geschichte

01:35:17.570 --> 01:35:18.870
und macht diverse Dinge richtig.

01:35:19.810 --> 01:35:22.130
Also zum Beispiel, dass das API-Interface,

01:35:22.250 --> 01:35:24.390
dass das Web-Interface halt so komplett integriert ist

01:35:24.390 --> 01:35:26.710
und alles ist halt, das macht Dinge schon deutlich einfacher.

01:35:28.570 --> 01:35:31.590
Und ja, also ich bin mal gespannt,

01:35:31.690 --> 01:35:32.850
wie sich das noch entwickelt, aber das sieht schon,

01:35:33.210 --> 01:35:36.050
also Flask habe ich mir auch so ein bisschen angeguckt,

01:35:36.150 --> 01:35:38.610
Flask ist schon so ein bisschen schwieriger mit Async.

01:35:39.290 --> 01:35:40.150
Also da gibt es dann auch so Geschichten,

01:35:40.270 --> 01:35:42.030
ich weiß nicht, wie hieß denn das? Quart?

01:35:42.190 --> 01:35:43.350
Oder ich weiß es nicht mehr genau.

01:35:44.710 --> 01:35:46.090
Wo man das irgendwie so miteinander

01:35:46.090 --> 01:35:47.990
verheiraten kann. Aber ehrlich gesagt,

01:35:48.130 --> 01:35:49.750
ich glaube nicht, dass ich

01:35:49.750 --> 01:35:51.870
Flasks noch wirklich verwenden.

01:35:52.030 --> 01:35:53.730
Also jetzt so, weil

01:35:53.730 --> 01:35:56.090
eben Starlet oder Fast API macht eigentlich genau

01:35:56.090 --> 01:35:57.690
das Gleiche. Oder ist halt, du hast

01:35:57.690 --> 01:35:59.530
und es ist halt irgendwie deutlich moderner.

01:35:59.530 --> 01:36:00.850
Ja, den Eindruck hatte ich auch.

01:36:02.770 --> 01:36:04.010
Es gibt Leute, die verwenden

01:36:04.010 --> 01:36:05.990
das noch. Ich meine, wir kennen ja beide Leute, die noch

01:36:05.990 --> 01:36:07.750
Pyramid verwenden oder BFG.

01:36:07.870 --> 01:36:10.050
Oder ein Webverwender. Ich meine, das ist natürlich auch so eine Sache.

01:36:10.270 --> 01:36:11.710
Wenn man sich da einmal dran gewöhnt hat

01:36:11.710 --> 01:36:12.990
und da viel drin gemacht hat, dann

01:36:12.990 --> 01:36:15.770
ja, das ist, bevor man

01:36:15.770 --> 01:36:17.210
seinen eigenen Vendor locken.

01:36:17.550 --> 01:36:18.930
Ja, hat man sich dann selber

01:36:18.930 --> 01:36:20.790
ja,

01:36:21.010 --> 01:36:22.330
eingeschlossen.

01:36:25.930 --> 01:36:26.330
Genau.

01:36:27.910 --> 01:36:29.350
Letztens habe ich auch noch so einen

01:36:29.350 --> 01:36:31.690
Podcast gehört mit einem, jetzt habe ich leider

01:36:31.690 --> 01:36:33.530
den Namen nicht mehr parat,

01:36:34.130 --> 01:36:35.870
auch einen Python-Urgestein,

01:36:35.870 --> 01:36:37.130
der arbeitet bei Instagram.

01:36:40.270 --> 01:37:07.050
Und er plauderte so ein bisschen aus dem Nähkästchen, was sie da so alles machen. Und da waren auch so ein paar Aspekte noch dabei, die ich noch nicht so kannte. Wie zum Beispiel, das war mir nicht klar, dass Instagram schon seit Jahren auf ASGI, nicht ASGI, den Standard gab es nicht, aber auf irgendeinem Async-Interface zwischen Applikationsserver und Anwendung umgestiegen ist, obwohl sie ja eigentlich Django verwenden.

01:37:07.590 --> 01:37:10.030
Aber den Teil haben sie halt tatsächlich umgebaut.

01:37:11.530 --> 01:37:11.930
Und

01:37:11.930 --> 01:37:14.130
das war, weil

01:37:14.130 --> 01:37:15.970
das für sie dann wohl doch schon sehr

01:37:15.970 --> 01:37:17.470
wichtig war, dass das halt geht. Ja gut.

01:37:18.050 --> 01:37:19.770
Wenn du viel Rechenlast hast und wenn du viele

01:37:19.770 --> 01:37:21.390
Dateien auslieferst. Ja.

01:37:23.150 --> 01:37:23.550
Und

01:37:23.550 --> 01:37:25.070
also das,

01:37:25.550 --> 01:37:28.050
auf der anderen Seite, sie waren lange auf Django 1.3.

01:37:29.130 --> 01:37:29.830
Sind dann

01:37:29.830 --> 01:37:31.930
jetzt umgestiegen. Und das war

01:37:31.930 --> 01:37:33.790
auch irgendwie wohl der Treiber hinter dem Umstieg auf

01:37:33.790 --> 01:37:35.470
Python 3, weil dann Async alles

01:37:35.470 --> 01:37:36.370
sehr viel fluffiger wird.

01:37:37.590 --> 01:37:40.230
und sind jetzt auf Django 1.8

01:37:40.230 --> 01:37:42.010
und das hieß halt so, das wird sich

01:37:42.010 --> 01:37:43.870
wohl auch nicht mehr ändern, das ist jetzt die letzte

01:37:43.870 --> 01:37:45.650
Django-Version, die sie halt irgendwie nehmen.

01:37:45.810 --> 01:37:47.450
Die letzte Version, die es gibt.

01:37:48.370 --> 01:37:50.010
Ja, das war's

01:37:50.010 --> 01:37:51.950
dann da irgendwie, sie haben halt einige

01:37:51.950 --> 01:37:53.810
Teile komplett, die

01:37:53.810 --> 01:37:55.710
quasi identisch geblieben sind, also irgendwie das ganze

01:37:55.710 --> 01:37:57.190
Request-Response-Handling ist irgendwie,

01:37:58.030 --> 01:38:00.010
auch die Mittelwehr-Geschichten, das ist alles gleich geblieben,

01:38:00.230 --> 01:38:01.970
auch der View-Layer ist mehr oder weniger komplett

01:38:01.970 --> 01:38:03.290
intakt, aber

01:38:03.290 --> 01:38:06.150
also bis auf, dass sie halt da eine Asing-Schnittstelle

01:38:06.150 --> 01:38:08.010
dazwischen haben, aber was sie

01:38:08.010 --> 01:38:10.070
komplett ausgetauscht haben, ist irgendwie, also

01:38:10.070 --> 01:38:12.190
alles, was man irgendwie pluggable austauschen

01:38:12.190 --> 01:38:14.270
kann, ist ausgetauscht und den ORM

01:38:14.270 --> 01:38:15.350
haben sie auch ausgetauscht,

01:38:15.430 --> 01:38:18.170
weil sie irgendwann

01:38:18.170 --> 01:38:18.930
schaden mussten.

01:38:19.930 --> 01:38:21.590
Da brauchst du mehr der Kontrolle dann irgendwann.

01:38:21.750 --> 01:38:23.990
Ja, und Schaden zu der Zeit

01:38:23.990 --> 01:38:25.910
ging das, also es geht ja inzwischen in Django auch so halbwegs,

01:38:26.110 --> 01:38:27.570
aber damals ging das halt nicht.

01:38:28.050 --> 01:38:29.990
Also ich meine, nochmal, Schaden ist aufteilen

01:38:29.990 --> 01:38:31.490
von, hat man gefragt, aber verstehe ich nicht.

01:38:31.490 --> 01:38:32.930
Ja, also der

01:38:32.930 --> 01:38:36.010
Königsweg bei Datenbanken,

01:38:36.150 --> 01:38:38.370
die zu skalieren, ist ja einfach immer mehr Hauptsprecher reinstecken

01:38:38.370 --> 01:38:40.530
oder mehr Prozessoren, solange wie halt geht.

01:38:40.990 --> 01:38:42.710
Und wenn man denkt, ja, jetzt geht nicht mehr,

01:38:42.750 --> 01:38:44.650
dann halt einfach nochmal ...

01:38:44.650 --> 01:38:45.650
Eine zweite Datenbank.

01:38:45.830 --> 01:38:47.930
Und dann musst du halt aufpassen, wo deine Daten hinspannen.

01:38:48.210 --> 01:38:49.530
Wisst ihr, wo das Wort herkommt?

01:38:49.670 --> 01:38:50.790
Das ist ein sehr schönes ...

01:38:50.790 --> 01:38:51.750
Ultima Online.

01:38:51.750 --> 01:38:52.390
Sehr schönes Wort.

01:38:52.930 --> 01:38:53.330
Genau.

01:38:54.170 --> 01:38:57.150
Das Wort Shard heißt ja eigentlich so ein Bruchstück.

01:38:58.230 --> 01:39:00.270
Und es kommt tatsächlich aus der Ultima Online-Welt.

01:39:00.830 --> 01:39:03.070
Die Geschichte von Ultima Online ist,

01:39:03.570 --> 01:39:06.490
dass der Weltstein in viele kleine Steine zerbrochen ist.

01:39:07.570 --> 01:39:10.270
Und jeder von diesen Shards ist jetzt eine Welt für sich.

01:39:10.470 --> 01:39:12.070
Und das heißt, wenn du eben in Ultima Online

01:39:12.070 --> 01:39:13.230
dich mit einem Server verbindest,

01:39:13.330 --> 01:39:14.690
dann heißt der nicht Server, sondern Shard.

01:39:15.710 --> 01:39:17.970
Und das war deren Trick,

01:39:18.110 --> 01:39:23.030
wie sie so eine große Benutzerschar handeln konnten,

01:39:23.030 --> 01:39:26.210
indem die dir einfach auch verschiedene Bruchstücke

01:39:26.210 --> 01:39:27.570
von diesem Weltstein verteilt haben.

01:39:27.670 --> 01:39:29.390
Und da kommt dieses Wort Sharding her.

01:39:29.810 --> 01:39:31.290
Das ist ja schon ein sehr spezifisches Wort,

01:39:32.050 --> 01:39:34.290
dass du eben einfach sagst, das ist

01:39:34.290 --> 01:39:36.270
eine eigene abgeschlossene Welt und du kannst nicht aus

01:39:36.270 --> 01:39:36.870
dieser Welt raus.

01:39:38.810 --> 01:39:39.910
Ja, genau. Und das musste

01:39:39.910 --> 01:39:42.230
Instagram mit denen, musste halt auch die User dann

01:39:42.230 --> 01:39:44.010
irgendwann aufteilen auf unterschiedliche Datenbanken.

01:39:44.150 --> 01:39:45.990
Und dann hatten sie das zuerst so gemacht, dass

01:39:45.990 --> 01:39:48.290
quasi alle deine

01:39:48.290 --> 01:39:50.210
Daten, wenn du jetzt als User auf irgendeiner Datenbank lagst,

01:39:50.270 --> 01:39:52.190
dann alles, was du, also dein kompletter Feed

01:39:52.190 --> 01:39:54.110
und der ganze Content von denen, denen du

01:39:54.110 --> 01:39:56.170
folgst, der lag dann halt auf deiner Datenbank.

01:39:57.670 --> 01:39:58.150
Was ja

01:39:58.150 --> 01:40:00.170
auch irgendwie Sinn macht, weil dann die ganzen Queries

01:40:00.170 --> 01:40:02.330
gehen dann halt nur zu einer Datenbank und dann ist es eigentlich schön.

01:40:03.350 --> 01:40:03.790
Und dann

01:40:03.790 --> 01:40:05.410
war irgendwie

01:40:05.410 --> 01:40:08.650
Wer war das?

01:40:09.590 --> 01:40:10.230
Justin Bieber

01:40:10.230 --> 01:40:11.830
oder sowas? Ich weiß es nicht genau.

01:40:15.730 --> 01:40:16.410
Irgendwie hieß es

01:40:16.410 --> 01:40:18.230
also, jeder kannte die User-ID von dem und

01:40:18.230 --> 01:40:19.990
wenn die irgendwo aufgetaucht ist, dann war immer

01:40:19.990 --> 01:40:22.310
irgendwie all hands on

01:40:22.310 --> 01:40:24.290
deck Zeit und man musste halt,

01:40:24.370 --> 01:40:26.410
weil immer wenn der gepostet hat, hast du natürlich das Problem,

01:40:26.410 --> 01:40:27.510
da hat er halt irgendwie

01:40:27.510 --> 01:40:30.770
Zillionen

01:40:30.770 --> 01:40:32.410
Follower und

01:40:32.410 --> 01:40:34.730
der Content, der musste

01:40:34.730 --> 01:40:36.690
dann halt auf alle Datenbanken repliziert werden.

01:40:36.770 --> 01:40:38.390
Das hat dann einen riesen Update-Sturm ausgelöst,

01:40:38.890 --> 01:40:40.670
weil, also sobald der irgendwas abgedatet hat,

01:40:41.230 --> 01:40:42.610
wurde das dann halt

01:40:42.610 --> 01:40:44.830
irgendwie quasi jede Datenbank rein repliziert.

01:40:45.570 --> 01:40:46.910
Und das ist natürlich dann nicht so gut.

01:40:46.990 --> 01:40:48.770
Das ist doch eine generelle Eigenschaft

01:40:48.770 --> 01:40:50.610
von so einem Netzwerk, von so

01:40:50.610 --> 01:40:52.850
Social Graphs, dass wir so eine exponentielle

01:40:52.850 --> 01:40:53.630
Verteilung haben.

01:40:54.330 --> 01:40:56.630
Dass es ein paar Knoten gibt, die mit allen

01:40:56.630 --> 01:40:58.730
verbunden sind und alle anderen haben nur ein paar

01:40:58.730 --> 01:41:00.890
Verbindungen. So ein zentrales

01:41:00.890 --> 01:41:01.690
Webding.

01:41:02.350 --> 01:41:04.450
Wie gesagt. Ja. Und die Spinne.

01:41:05.730 --> 01:41:06.710
Ja, nee, dass du eben

01:41:06.710 --> 01:41:09.110
so eine Verteilung hast, wo es

01:41:09.110 --> 01:41:10.530
beide Extreme gibt. Du hast

01:41:10.530 --> 01:41:12.570
ganz, du hast viele, oder

01:41:12.570 --> 01:41:14.730
einige Knoten, die ganz viele Verbindungen

01:41:14.730 --> 01:41:16.630
haben. Und du hast aber auf der anderen Seite

01:41:16.630 --> 01:41:18.670
auch ganz, ganz viele Knoten, die

01:41:18.670 --> 01:41:20.690
ganz wenige Verbindungen haben. Also die, das ist

01:41:20.690 --> 01:41:21.850
irgendwie. Ja, irgendwo im Zentrum.

01:41:22.170 --> 01:41:24.210
Irgendwo so eine große Gaswolke, wo ganz viele

01:41:24.210 --> 01:41:26.350
Sterne sitzen. Die Menge der Endes ist irgendwie gleich verteilt.

01:41:26.630 --> 01:41:30.970
Ist das nicht sogar so, wenn du so einen Random Graph

01:41:30.970 --> 01:41:32.670
baust, wenn du in so einen Graph

01:41:32.670 --> 01:41:34.950
Random Edges reintust, dass du dann immer so einen kriegst?

01:41:35.250 --> 01:41:35.990
Das kann sein.

01:41:36.450 --> 01:41:39.110
Meine Grafen-Theorie-Vorlesungen sind lange her.

01:41:42.550 --> 01:41:44.070
Ja, also jedenfalls fand ich das

01:41:44.070 --> 01:41:46.010
auch witzig, fand ich,

01:41:46.470 --> 01:41:48.830
dann wurde irgendwann gefragt, wie lange dauert das

01:41:48.830 --> 01:41:50.670
eigentlich, wenn man die testet, oder wie viel Code

01:41:50.670 --> 01:41:51.110
ist das eigentlich?

01:41:52.110 --> 01:41:54.630
Keine Ahnung, viele Millionen Zeilen irgendwie.

01:41:55.310 --> 01:41:56.390
Und wie lange dauert das eigentlich,

01:41:56.510 --> 01:41:58.970
die Tests durchlaufen zu lassen?

01:41:59.710 --> 01:42:00.830
Ja, also auf einer Maschine

01:42:00.830 --> 01:42:02.370
hat das schon ganz lange keiner mehr probiert.

01:42:02.910 --> 01:42:04.670
Sie haben sich halt auch so ein eigenes Ding gebaut,

01:42:04.750 --> 01:42:06.310
was dann halt die Tests irgendwie an

01:42:06.310 --> 01:42:09.430
diverse Maschinen...

01:42:09.430 --> 01:42:10.970
Auf dem Teststart

01:42:10.970 --> 01:42:11.670
lief es auf dem anderen nicht.

01:42:12.410 --> 01:42:14.870
Ja, aber das dauert wohl tatsächlich nur 15 Minuten.

01:42:15.150 --> 01:42:16.870
Und das machen sie auch nur, also normalerweise

01:42:16.870 --> 01:42:18.850
reicht es irgendwie, die Lokaltests

01:42:18.850 --> 01:42:20.750
um dich herum laufen zu lassen, um zu sehen,

01:42:20.830 --> 01:42:22.110
ob das irgendwie alles noch funktioniert oder nicht.

01:42:22.590 --> 01:42:24.450
Und sobald es dann halt in Produktion geht,

01:42:24.690 --> 01:42:26.790
muss es halt einmal komplett durchlaufen und das

01:42:26.790 --> 01:42:28.670
dauert dann halt auf x Rechnern

01:42:28.670 --> 01:42:30.870
15 Minuten ungefähr. Ja gut, aber

01:42:30.870 --> 01:42:32.570
das ist doch trotzdem noch cool. Das ist eigentlich noch alles

01:42:32.570 --> 01:42:33.870
in 15 Minuten

01:42:33.870 --> 01:42:36.730
durchzutesten, das ist ja der Hammer,

01:42:36.910 --> 01:42:38.810
da könnten sich ja viele Firmen, das dauert

01:42:38.810 --> 01:42:40.870
ja bei vielen anderen Projekten

01:42:40.870 --> 01:42:42.570
Monate. Ja genau und

01:42:42.570 --> 01:42:44.570
eben die ganzen Teile

01:42:44.570 --> 01:42:46.550
fand ich auch, das ist aber auch

01:42:46.550 --> 01:42:47.990
respektabel und was ich auch gut fand,

01:42:48.230 --> 01:42:50.070
das hieß so, ja wie macht ihr das eigentlich

01:42:50.070 --> 01:42:52.630
als Entwicklungsmodell mit Branches

01:42:52.630 --> 01:42:54.070
oder wie auch immer und dann hieß es so, ja

01:42:54.070 --> 01:42:56.290
Branchen, das können wir schon ganz lange nicht mehr machen,

01:42:56.430 --> 01:42:58.270
weil es sind einfach zu viele Entwickler. Die haben halt tausende

01:42:58.270 --> 01:43:00.050
Entwickler, die da drin rumschreiben

01:43:00.050 --> 01:43:02.470
und sobald du einen Branch

01:43:02.470 --> 01:43:04.270
irgendwie weggehst, dann die kriegst du nie

01:43:04.270 --> 01:43:05.010
wieder zurück, weil

01:43:05.010 --> 01:43:07.590
du gehst einfach in den Konflikten unter.

01:43:08.230 --> 01:43:10.250
Das ist einfach zu schnell. Das heißt, alle entwickeln

01:43:10.250 --> 01:43:12.310
immer auf dem gleichen Branch, aber verstecken

01:43:12.310 --> 01:43:12.530
alles.

01:43:14.690 --> 01:43:18.370
Und packen halt alles hinter Feature-Flex.

01:43:19.050 --> 01:43:19.790
Und das geht dann wohl.

01:43:20.930 --> 01:43:22.290
Ja, aber das ist generell so eine Technik,

01:43:22.470 --> 01:43:23.730
wenn du größere

01:43:23.730 --> 01:43:26.730
Deployments auch hast, dass du Feature-Flags machst.

01:43:27.010 --> 01:43:27.830
Was ist ein Feature-Flag?

01:43:28.390 --> 01:43:30.810
Rolling Releases haben kannst und

01:43:30.810 --> 01:43:32.530
trotzdem sicher bist, dass du

01:43:32.530 --> 01:43:34.830
ein Rollback machen kannst. Dass du halt sozusagen

01:43:34.830 --> 01:43:36.550
ein Feature, an dem du jetzt

01:43:36.550 --> 01:43:38.070
irgendwie schreibst, das ist,

01:43:38.530 --> 01:43:40.910
das machst du halt ein- und ausschaltbar

01:43:40.910 --> 01:43:41.330
sozusagen.

01:43:42.730 --> 01:43:44.290
Also quasi die Commits kann man dann abschalten?

01:43:44.930 --> 01:43:46.870
Nein, nein, nicht die Commits, nur die

01:43:46.870 --> 01:43:47.530
Funktionalität.

01:43:49.290 --> 01:43:50.570
Code kommt immer mit, aber

01:43:50.570 --> 01:43:52.130
der wird halt nicht immer angesprochen.

01:43:53.550 --> 01:43:55.530
Du hast eine große Tabelle, wo drinsteht,

01:43:55.610 --> 01:43:57.290
was jetzt gerade für Features aktiv sind.

01:43:58.390 --> 01:44:00.990
Okay, dann muss ich halt quasi jede Zeile flecken.

01:44:01.970 --> 01:44:02.590
Nö, nur die ...

01:44:02.590 --> 01:44:03.910
Nicht jede Zeile, jedes Feature.

01:44:04.070 --> 01:44:04.190
Ja.

01:44:04.870 --> 01:44:05.830
Nur die Einstiegspunkte.

01:44:07.110 --> 01:44:07.350
Genau.

01:44:08.190 --> 01:44:10.490
Und du würdest auch nie ein neues Feature

01:44:10.490 --> 01:44:12.910
auf allen gleichzeitig anschalten oder so,

01:44:12.990 --> 01:44:14.630
sondern du schaltest das immer erst mal auf so

01:44:14.630 --> 01:44:16.230
einem Promille an und guckst, was passiert.

01:44:16.810 --> 01:44:18.190
Und dann nimmst du ein bisschen mehr

01:44:18.190 --> 01:44:20.090
und dann guckst du halt und dann kannst du messen

01:44:20.090 --> 01:44:22.010
und dann guckst du deine Graphen an und denkst,

01:44:22.070 --> 01:44:23.510
okay, sieht gut aus, dann ja.

01:44:24.530 --> 01:44:25.190
Das kennt ihr,

01:44:25.310 --> 01:44:28.010
könnt ihr euch noch damals, ganz, ganz

01:44:28.010 --> 01:44:29.990
früher, als das Internet noch jung war,

01:44:30.670 --> 01:44:31.970
könnt ihr euch an Audio

01:44:31.970 --> 01:44:33.390
Galaxy erinnern? Ja.

01:44:34.310 --> 01:44:35.930
Das war, es war das bessere

01:44:35.930 --> 01:44:37.250
Napster. Ja, das war super.

01:44:37.950 --> 01:44:40.010
Und der, einer von den Autoren, die das

01:44:40.010 --> 01:44:41.950
geschrieben haben, also die hatten auch, die sind dann geschlossen

01:44:41.950 --> 01:44:43.970
worden, ja, von der Musikindustrie relativ schnell.

01:44:46.630 --> 01:44:48.030
Die, da, die haben sehr viele,

01:44:48.030 --> 01:44:49.890
der hat sehr viele interessante Artikel veröffentlicht

01:44:49.890 --> 01:44:51.950
und er hat halt gesagt, die sind irgendwann von Java

01:44:51.950 --> 01:44:53.730
auf C umgestiegen aus Geschwindigkeitsproblem.

01:44:54.850 --> 01:44:55.990
Und natürlich waren diese Server

01:44:55.990 --> 01:44:57.030
erstmal nicht kompatibel.

01:44:57.730 --> 01:44:59.030
Und die haben das einfach so gemacht.

01:44:59.130 --> 01:45:01.490
Die haben diesen C-Server halt geschrieben

01:45:01.490 --> 01:45:03.790
und der war dann halb fertig. Und dann haben sie ihn einfach laufen lassen.

01:45:04.870 --> 01:45:06.070
In den Pool reingetan.

01:45:06.150 --> 01:45:07.690
Der ist nach einer halben Sekunde gecrashed.

01:45:09.010 --> 01:45:09.730
Und dann haben sie

01:45:09.730 --> 01:45:10.550
diesen Crash behoben.

01:45:12.450 --> 01:45:13.830
Und dann haben sie das so lange gemacht,

01:45:13.950 --> 01:45:15.410
bis der halt stabil genug lief,

01:45:15.550 --> 01:45:17.650
dass sie quasi die Hälfte ihres Pools

01:45:17.650 --> 01:45:18.330
ersetzen konnten.

01:45:19.450 --> 01:45:20.350
Das ist so eine Technik.

01:45:21.010 --> 01:45:22.270
Wenn du viel Traffic hast,

01:45:23.050 --> 01:45:24.590
dann kannst du so statistische Sachen machen.

01:45:24.730 --> 01:45:27.170
Kannst du sagen, okay, wir samplen jetzt einfach mal

01:45:27.170 --> 01:45:29.310
einen Teil des Traffics raus

01:45:29.310 --> 01:45:31.490
und tun den auf einen anderen Server

01:45:31.490 --> 01:45:33.090
und schauen mal, ob der kompatibel ist.

01:45:33.090 --> 01:45:36.550
Oder du samplst eben die, wie du sagst, Feature Flags raus

01:45:36.550 --> 01:45:38.410
und sagst, wir aktivieren jetzt dieses Feature mal

01:45:38.410 --> 01:45:40.930
für 10.000 Benutzer.

01:45:41.050 --> 01:45:43.330
Und dann denkst du dir so, 10.000 Benutzer, so viele.

01:45:43.510 --> 01:45:46.450
Aber es sind halt nur 0,001 Promille der aktiven Benutzer.

01:45:47.810 --> 01:45:50.490
Und wenn irgendwas schief geht, dann ist es schade für die,

01:45:50.610 --> 01:45:52.050
aber dann müssen die halt die Seite neu laden

01:45:52.050 --> 01:45:53.770
und du hast aber

01:45:53.770 --> 01:45:56.490
statistisch valide Daten.

01:45:56.950 --> 01:45:57.970
Also auch das ist ja was,

01:45:58.090 --> 01:46:00.530
was du nur kannst, wenn du viel

01:46:00.530 --> 01:46:01.450
Paralleles,

01:46:01.990 --> 01:46:03.990
viele parallele Anfragen hast.

01:46:07.930 --> 01:46:08.370
Naja,

01:46:09.370 --> 01:46:10.390
das fand ich eigentlich alles

01:46:10.390 --> 01:46:12.770
sehr fluffig und dann hat er noch was gesagt

01:46:12.770 --> 01:46:13.850
und da dachte ich so, oh shit,

01:46:14.930 --> 01:46:16.750
das ist auch, hatte ich ja vorher schon so ein bisschen

01:46:16.750 --> 01:46:18.450
gehört bei auch einem Podcast

01:46:18.450 --> 01:46:20.370
mit Andrew, wo

01:46:20.370 --> 01:46:21.870
weil Andrew Godwin zu Gast war,

01:46:22.010 --> 01:46:23.990
der irgendwie bei Eventbrite, glaube ich, arbeitet.

01:46:25.090 --> 01:46:25.690
Weil er auch meinte so,

01:46:25.790 --> 01:46:28.550
also die Eventbrite-Jungle-Applikation

01:46:28.550 --> 01:46:31.170
hat ja so um eine Million Zeilen irgendwie Code.

01:46:32.070 --> 01:46:35.250
Und es dauert halt schon relativ lang, die zu starten.

01:46:35.570 --> 01:46:36.690
Und der Grund, warum es so lange dauert,

01:46:36.750 --> 01:46:37.490
sind halt die Imports,

01:46:37.750 --> 01:46:40.350
weil die Imports laufen halt 20 Sekunden.

01:46:41.010 --> 01:46:42.510
Und da kann man nicht viel optimieren.

01:46:42.790 --> 01:46:43.570
Und er meinte so,

01:46:43.590 --> 01:46:44.650
wir haben halt tatsächlich das Problem,

01:46:44.790 --> 01:46:46.910
dass wenn wir jetzt irgendwo schnell hochskalieren müssen,

01:46:47.470 --> 01:46:50.290
dann sind halt diese 20 Sekunden, die fehlen.

01:46:50.370 --> 01:46:52.250
einfach. Und es gibt tatsächlich Überlegungen,

01:46:52.370 --> 01:46:54.290
ob sie das Ganze nicht in einer anderen Sprache neu schreiben, weil

01:46:54.290 --> 01:46:56.330
es halt unoptimierbar ist.

01:46:56.730 --> 01:46:57.790
Kann man die Imports cachen oder so?

01:46:58.470 --> 01:47:00.470
Nee, leider kann man da nicht viel machen.

01:47:01.750 --> 01:47:02.170
Und das

01:47:02.170 --> 01:47:04.370
kannst du einen Graphen aufbauen,

01:47:04.450 --> 01:47:06.350
der die dann in einer anderen Reihenfolge macht. Das habe ich schon mal

01:47:06.350 --> 01:47:08.390
wo gelesen, aber das hilft halt auch nur.

01:47:09.510 --> 01:47:10.410
Ja, das Problem,

01:47:10.610 --> 01:47:12.170
das grundsätzliche Problem ist halt wohl irgendwie,

01:47:12.350 --> 01:47:14.230
dass auch, sobald ein neues Modul dazu

01:47:14.230 --> 01:47:15.790
kommt, kann es halt die Reihenfolge ändern.

01:47:16.270 --> 01:47:17.570
Und das heißt, du kannst nicht,

01:47:18.130 --> 01:47:19.670
du müsstest irgendwie das

01:47:19.670 --> 01:47:39.710
Ich habe das mal gesehen, ich habe mal so einen Artikel gelesen, wo sie gesagt haben, sie mussten, also war auch irgend so ein Internetanbieter aus den 2010ern oder was weiß ich, die halt das Importsystem so anpassen mussten, dass sie die Importreihenfolge selber optimieren können, um genau das zu umgehen.

01:47:40.270 --> 01:47:42.810
Ja, und genau das sagte der dann halt auch.

01:47:42.910 --> 01:47:45.270
Der meinte so, naja, also sehr große,

01:47:45.530 --> 01:47:47.250
also sie haben das schon so ein bisschen zerlegt irgendwie

01:47:47.250 --> 01:47:49.210
oder versucht, aber trotzdem ist es so,

01:47:49.470 --> 01:47:51.950
wenn du an Instagram entwickelst,

01:47:52.310 --> 01:47:53.930
hast du da auch deinen Entwicklungs-Server,

01:47:54.010 --> 01:47:55.350
deinen Django-Entwicklungs-Server so quasi,

01:47:55.570 --> 01:47:56.710
ganz normal, wie man das so kennt.

01:47:57.330 --> 01:47:59.870
Und jetzt änderst du da halt irgendeine triviale Geschichte

01:47:59.870 --> 01:48:02.690
und dann lädt er automatisch neu.

01:48:03.150 --> 01:48:04.550
Und dann willst du ja gucken auf deiner Seite,

01:48:04.810 --> 01:48:05.610
okay, hat das jetzt so funktioniert,

01:48:05.670 --> 01:48:06.130
wie ich mir das gesagt habe.

01:48:06.950 --> 01:48:07.850
Und das dauert dann halt eine Minute.

01:48:09.770 --> 01:48:11.130
Du kannst nicht viel daran machen.

01:48:11.770 --> 01:48:12.770
So ist das dann halt.

01:48:13.450 --> 01:48:15.070
Und das ist natürlich extrem frustrierend.

01:48:15.190 --> 01:48:16.430
Also das macht dann nicht mehr so richtig viel Spaß,

01:48:16.430 --> 01:48:17.110
damit zu entwickeln.

01:48:18.270 --> 01:48:22.050
Und was man sich eventuell vorstellen könnte,

01:48:22.130 --> 01:48:26.350
was man da macht, ist halt eben über Type Hinting oder so

01:48:26.350 --> 01:48:31.290
vielleicht irgendwie auch in dem Modulsystem zu sagen,

01:48:31.650 --> 01:48:33.970
es gibt Module, die nicht mehr alles dürfen.

01:48:34.170 --> 01:48:35.710
Und dann kannst du irgendwie einschränken,

01:48:36.430 --> 01:48:39.010
dass sie zum Beispiel nicht mehr die Reihenfolge der Module,

01:48:39.010 --> 01:48:40.990
die importiert werden, ändern dürfen. Und dann könntest

01:48:40.990 --> 01:48:42.830
du sowas machen, wie du kannst es eben cachen. Du kannst halt sagen,

01:48:42.930 --> 01:48:44.830
okay, ich mache einen Reload,

01:48:44.930 --> 01:48:46.530
aber nur von dem Modul und sonst nichts.

01:48:47.550 --> 01:48:48.890
Und das geht aber momentan noch

01:48:48.890 --> 01:48:50.770
nicht so richtig und da sind sie halt

01:48:50.770 --> 01:48:51.570
auch irgendwie dran.

01:48:52.450 --> 01:48:54.490
Aber da kann man doch bestimmt den Python-Interpreter

01:48:54.490 --> 01:48:56.750
irgendwelche Memory-Snapshots machen, wo du

01:48:56.750 --> 01:48:57.710
alles importiert hast,

01:48:58.670 --> 01:49:01.030
was du einfach einmal komplett in den Hauptspeicher

01:49:01.030 --> 01:49:01.730
rein streamst.

01:49:02.730 --> 01:49:04.670
Ja, ich weiß es nicht, aber es scheint

01:49:04.670 --> 01:49:05.850
nicht so ein einfaches Problem zu sein.

01:49:05.850 --> 01:49:06.930
Das sind irgendwie wohl...

01:49:06.930 --> 01:49:08.310
Also mal ein Guido fragen, der weiß das.

01:49:09.130 --> 01:49:10.810
Ja, aber das klingt natürlich,

01:49:10.850 --> 01:49:11.830
wenn schon mal mehrere Leute sagen,

01:49:11.910 --> 01:49:12.670
dass sie damit Probleme haben,

01:49:12.730 --> 01:49:13.950
das klingt dann natürlich nicht so richtig gut.

01:49:14.330 --> 01:49:14.610
Aber ja.

01:49:16.050 --> 01:49:16.450
Ja.

01:49:18.090 --> 01:49:20.550
Ja, tatsächlich ist mir das auch schon

01:49:20.550 --> 01:49:21.930
in eigenen Projekten aufgefallen.

01:49:22.010 --> 01:49:22.690
Wenn die größer werden,

01:49:22.770 --> 01:49:24.550
dann ist halt die Startup-Time langsamer.

01:49:24.710 --> 01:49:26.610
Und das ist nervig beim Entwickeln,

01:49:26.710 --> 01:49:29.290
weil du halt deine Sekunden warten musst,

01:49:29.290 --> 01:49:31.190
bis du deine Änderungen testen kannst.

01:49:32.050 --> 01:49:33.450
Das ist schon so.

01:49:35.210 --> 01:49:35.370
Ja.

01:49:36.170 --> 01:49:37.950
Ja, aber du hast irgendwas Interessantes gesagt, und zwar Type-Ins.

01:49:38.110 --> 01:49:39.670
Ich glaube, das bringt uns jetzt quasi

01:49:39.670 --> 01:49:41.590
zum Ende dieser Folge.

01:49:42.130 --> 01:49:44.110
Und zwar hatte ich da

01:49:44.110 --> 01:49:46.130
einen Pick der Woche in der Standard, äh, nicht Standard

01:49:46.130 --> 01:49:48.270
Library, wir wollten zwar ein bisschen Standard Library machen, aber

01:49:48.270 --> 01:49:49.990
ich hätte heute gepickt

01:49:49.990 --> 01:49:52.050
Typer. Und Typer macht

01:49:52.050 --> 01:49:53.650
nämlich genau das, das macht nämlich aus Type-Ins

01:49:53.650 --> 01:49:56.150
Kommandos, die man sehr schön

01:49:56.150 --> 01:49:57.930
benutzen kann. Man kann jetzt seine eigene

01:49:57.930 --> 01:50:00.110
Klee zusammenklicken oder

01:50:00.110 --> 01:50:01.890
seine eigenen Kommandos, die man aufrufen kann.

01:50:03.190 --> 01:50:04.470
Ah, das ist für eine Kommandozeile?

01:50:04.630 --> 01:50:06.070
Ist das da, also tatsächlich so, dass

01:50:06.070 --> 01:50:07.910
du dann Command-Line

01:50:07.910 --> 01:50:09.990
Dinger hast. Ja, es gibt sogar

01:50:09.990 --> 01:50:11.930
Autocompletion, die mitgeliefert wird und so. Das hast du eigentlich

01:50:11.930 --> 01:50:12.710
ganz cool gemacht.

01:50:13.890 --> 01:50:15.630
Da gibt es ja ganz viele Bibliotheken, die das machen.

01:50:15.950 --> 01:50:18.010
Früher gab es ja immer nur eine, die ganz schlecht

01:50:18.010 --> 01:50:19.490
war und inzwischen gibt es ganz viele.

01:50:20.090 --> 01:50:22.030
Ja, also Klick-Klick drunter und man kann halt tatsächlich

01:50:22.030 --> 01:50:24.010
mit so Type Annotations sagen, was

01:50:24.010 --> 01:50:26.110
für gültige

01:50:26.110 --> 01:50:27.590
Argumente man irgendwie mitparsen kann.

01:50:28.410 --> 01:50:29.970
Irgendwie, dann kannst du einfach ein Boolean flaggen

01:50:29.970 --> 01:50:31.910
und dann kannst du halt einfach die Option setzen, dann kommt

01:50:31.910 --> 01:50:33.930
halt ein True oder False rein und kannst halt dann gucken,

01:50:34.170 --> 01:50:35.890
was du machen willst und das ist irgendwie sehr

01:50:35.890 --> 01:50:38.230
convenient irgendwie für Projekte und

01:50:38.230 --> 01:50:40.590
kleine Abstraktionen.

01:50:41.050 --> 01:50:42.270
Ja, das ist spannend.

01:50:42.610 --> 01:50:44.270
Das ist tatsächlich ein Problem, an dem ich

01:50:44.270 --> 01:50:46.210
auch schon vor langer Zeit mal

01:50:46.210 --> 01:50:46.870
gearbeitet habe.

01:50:48.010 --> 01:50:50.370
Weil es mich nämlich auch genervt hat. 2012

01:50:50.370 --> 01:50:52.410
habe ich meine eigene Bibliothek veröffentlicht.

01:50:53.510 --> 01:50:54.330
Kommandier heißt die,

01:50:54.390 --> 01:50:55.810
die im Wesentlichen genau das Gleiche macht.

01:50:56.150 --> 01:50:58.030
Die nimmt Funktionen mit ihren Types

01:50:58.030 --> 01:50:59.050
und Typehints und

01:50:59.050 --> 01:51:01.570
baut ja daraus eine Kommandozeile.

01:51:02.510 --> 01:51:03.910
Gibt es inzwischen tatsächlich

01:51:03.910 --> 01:51:05.570
einige Google Fire

01:51:05.570 --> 01:51:06.510
heißt die, glaube ich.

01:51:08.290 --> 01:51:09.470
Die ist nicht

01:51:09.470 --> 01:51:11.250
quasi auf Google nicht zu finden. Ah, hier,

01:51:11.330 --> 01:51:12.050
Python Fire heißt.

01:51:13.770 --> 01:51:14.970
Macht auch so was ähnliches.

01:51:15.250 --> 01:51:17.470
Simple way to create command line

01:51:17.470 --> 01:51:18.330
interface in Python.

01:51:19.270 --> 01:51:20.910
Ich bin ja sehr froh, dass

01:51:20.910 --> 01:51:23.470
ich lange vor Google auf die Idee gekommen bin.

01:51:23.630 --> 01:51:24.270
Also ich kann mir selber,

01:51:25.210 --> 01:51:27.410
ich schreibe mir selber zu, dass ich

01:51:27.410 --> 01:51:28.750
die bessere Idee hatte.

01:51:29.970 --> 01:51:30.570
Ja, sehr gut.

01:51:31.290 --> 01:51:33.470
Du hast auch irgendwie noch eben was gesagt

01:51:33.470 --> 01:51:35.450
unserem vorgepinkelt, dass du Commander

01:51:35.450 --> 01:51:36.510
interessant fandest?

01:51:37.130 --> 01:51:39.470
Ne, also wie gesagt, meine Bibliothek heißt

01:51:39.470 --> 01:51:40.710
Kommandier. Kommandier.

01:51:41.250 --> 01:51:43.450
Das ist ein englisches Wort, das heißt so viel

01:51:43.450 --> 01:51:44.170
wie übernehmen.

01:51:45.590 --> 01:51:47.470
Und deshalb habe ich das gemacht. Aber es gibt

01:51:47.470 --> 01:51:49.450
in der Standardbibliothek noch

01:51:49.450 --> 01:51:51.470
was anderes, das heißt CMD, also

01:51:51.470 --> 01:51:53.430
CMD. Das macht

01:51:53.430 --> 01:51:55.550
ein bisschen was anderes, das macht nicht ein Command Line

01:51:55.550 --> 01:51:57.490
Interface, sondern ein Shell Interface.

01:51:58.630 --> 01:51:59.490
Das heißt sowas wie

01:51:59.490 --> 01:52:01.410
das, was man in Python hat. Der Python

01:52:01.410 --> 01:52:03.370
Interpreter ist ja, wenn man den startet, ist der

01:52:03.370 --> 01:52:05.250
ein Shell-Interface, das heißt, ich habe eine Eingabezeile

01:52:05.250 --> 01:52:07.110
und wenn ich da was eingebe, dann passiert irgendwas.

01:52:08.550 --> 01:52:09.450
Und mit

01:52:09.450 --> 01:52:11.210
dieser Bibliothek

01:52:11.210 --> 01:52:13.370
CMD aus der Standardbibliothek

01:52:14.090 --> 01:52:15.610
kann man solche Shells

01:52:15.610 --> 01:52:16.430
sich selber bauen.

01:52:17.390 --> 01:52:19.610
Das heißt, es ist quasi nicht auf der Kommandozeile

01:52:19.610 --> 01:52:21.450
die Befehle eingegeben, sondern in dem

01:52:21.450 --> 01:52:23.290
Programm dann drin. Auch mit toller

01:52:23.290 --> 01:52:25.230
Autocompletion und mit bestimmten

01:52:25.230 --> 01:52:26.930
Optionen, die direkt angezeigt werden und sowas alles.

01:52:27.090 --> 01:52:28.950
Genau, also im Wesentlichen schreibt man eine Klasse,

01:52:29.210 --> 01:52:31.130
die von dieser Command-Klasse

01:52:31.130 --> 01:52:33.030
ableitet, also von der CMD-Klasse ableitet und

01:52:33.030 --> 01:52:34.130
tut dann da Funktionen rein.

01:52:34.830 --> 01:52:37.250
Und der Rest, also der nimmt die Dokumentation

01:52:37.250 --> 01:52:38.970
daraus, der nimmt die Parameter daraus.

01:52:40.970 --> 01:52:42.950
Wenn man nicht

01:52:42.950 --> 01:52:44.870
die Standard-Library braucht, gibt es auch CMD2.

01:52:45.270 --> 01:52:46.790
Das kann dann auch Farben und sowas alles.

01:52:47.530 --> 01:52:48.890
Aha, Farben. Spielerei.

01:52:49.050 --> 01:52:50.830
Ja, nein, nein, nein, das kann, glaube ich, noch ein, zwei

01:52:50.830 --> 01:52:52.750
andere nette Sachen. Ich muss da mal ausprobieren.

01:52:52.770 --> 01:52:54.710
Das Beispiel, was bei CMD

01:52:54.710 --> 01:52:56.910
in der Standard-Library

01:52:56.910 --> 01:52:58.730
drin ist, ist direkt Turtle, also wie man sich eine

01:52:58.730 --> 01:53:00.810
Turtle, interaktive Turtle baut.

01:53:01.810 --> 01:53:02.450
Ich weiß nicht, ob ihr

01:53:02.450 --> 01:53:04.530
ob ihr damals schon alt

01:53:04.530 --> 01:53:06.410
oder schrägstrich jung genug wart, um

01:53:06.410 --> 01:53:08.170
die Turtle zu benutzen im

01:53:08.170 --> 01:53:10.490
Ja, erinnere mich ein bisschen an, wie hieß das Logo?

01:53:10.530 --> 01:53:12.790
Informatik-Unterricht. Ja, ja, Turtle Graphics.

01:53:13.070 --> 01:53:13.430
Das war

01:53:13.430 --> 01:53:15.210
sehr schön damals.

01:53:16.350 --> 01:53:17.730
In Pascal hatten wir das.

01:53:18.450 --> 01:53:19.870
Wisst ihr, was LEED ist?

01:53:22.670 --> 01:53:23.650
Guck dir mal in den Spiegel.

01:53:24.310 --> 01:53:26.490
Der, der, oh, ich weiß nicht

01:53:26.490 --> 01:53:28.690
mehr, was das heißt. Loyal Informatik-Editor

01:53:28.690 --> 01:53:30.230
oder irgendwie sowas. Das war so

01:53:30.230 --> 01:53:32.210
ein System, was wir in der Schule hatten,

01:53:32.330 --> 01:53:33.590
Als ich in der achten Klasse war,

01:53:34.270 --> 01:53:35.050
hatten wir das entschuldigt.

01:53:35.910 --> 01:53:37.250
Es war so eine Art Pascal

01:53:37.250 --> 01:53:39.790
mit einem Turtle-Interface und das Beste ist,

01:53:40.090 --> 01:53:41.690
es hatte einen Editor mit dabei und es hat auch

01:53:41.690 --> 01:53:42.510
sehr schöne Grafiken gemacht.

01:53:43.370 --> 01:53:44.950
Der konnte aber nicht scrollen, dieser Editor.

01:53:45.090 --> 01:53:47.850
Das heißt, alle Programme waren maximal eine Seite lang.

01:53:49.510 --> 01:53:50.150
Sehr schön.

01:53:50.890 --> 01:53:51.890
Und das

01:53:51.890 --> 01:53:53.450
musste halt ausreichen in der achten Klasse.

01:53:55.070 --> 01:53:55.930
Aber mit Turtle

01:53:55.930 --> 01:53:57.150
und allem war es auch sehr, sehr gut.

01:53:58.410 --> 01:53:59.650
Wir hatten damals tatsächlich

01:53:59.650 --> 01:54:01.530
Turbo Pascal 5.0, glaube ich.

01:54:01.830 --> 01:54:03.490
nicht schlecht. Das war auch, das hat

01:54:03.490 --> 01:54:04.830
tatsächlich Spaß gemacht.

01:54:09.790 --> 01:54:11.690
Ist auch sowas, was man nicht mehr, also ich meine,

01:54:11.830 --> 01:54:13.650
diese ganzen Dinge findet man nicht mehr im Internet.

01:54:13.790 --> 01:54:15.370
Ich habe es gerade probiert und es geht nicht.

01:54:17.530 --> 01:54:18.650
Ja, ist alles irgendwie weg.

01:54:19.510 --> 01:54:21.610
Ja, gone, gone, gone again.

01:54:21.690 --> 01:54:23.190
Ja, aber rechter Vergess ist ja auch nicht schlecht.

01:54:24.090 --> 01:54:25.510
Ja. Kommt alles in die Shownotes.

01:54:26.390 --> 01:54:27.070
Genau, ja gut.

01:54:28.350 --> 01:54:28.850
Hast du noch was,

01:54:29.470 --> 01:54:30.390
Pick, Jochen?

01:54:30.590 --> 01:54:32.310
Ja, also ich würde jetzt einfach mal so,

01:54:32.430 --> 01:54:34.110
auch was so Async-Geschichten angeht,

01:54:34.250 --> 01:54:35.890
also man braucht ja nicht nur den Serverteil,

01:54:36.010 --> 01:54:36.710
sondern halt auch einen,

01:54:38.450 --> 01:54:40.070
der kleine ist ja manchmal auch nicht so schlecht,

01:54:40.330 --> 01:54:41.110
wenn man den hat.

01:54:41.530 --> 01:54:44.070
Ansonsten, ja, wie will man jetzt eigentlich gucken,

01:54:44.150 --> 01:54:44.770
ob das funktioniert hat,

01:54:44.870 --> 01:54:46.050
was man da auf der Serverseite gebaut hat.

01:54:46.870 --> 01:54:50.150
Und ja, so üblicherweise wird man jetzt unter Python

01:54:50.150 --> 01:54:51.150
zum Web-Requests machen,

01:54:51.290 --> 01:54:52.750
ja, verwenden die meisten wahrscheinlich Requests.

01:54:54.030 --> 01:54:56.290
Aber das Ding ist halt leider nicht Async, gar nicht.

01:54:57.950 --> 01:54:59.230
Sondern halt komplett synchron.

01:54:59.710 --> 01:55:01.430
Und kann man auch nicht viel machen.

01:55:02.110 --> 01:55:03.850
Und sozusagen der asynchrone

01:55:03.850 --> 01:55:05.590
Nachfolger

01:55:05.590 --> 01:55:07.710
irgendwie von Request, oder vielleicht wird ja

01:55:07.710 --> 01:55:08.850
Request auch nochmal irgendwann asynch.

01:55:10.450 --> 01:55:10.890
Ist

01:55:10.890 --> 01:55:12.950
HTTPX.

01:55:13.570 --> 01:55:14.210
Auch von

01:55:14.210 --> 01:55:17.810
einem der Namen,

01:55:17.950 --> 01:55:19.290
die hinter ganz vielen Dingen stehen.

01:55:19.870 --> 01:55:21.390
Von Tom Christie, der halt

01:55:21.390 --> 01:55:22.150
Jungle Rest Framework

01:55:22.150 --> 01:55:25.250
gebaut hat. Und dann Starlet

01:55:25.250 --> 01:55:27.250
und viele andere Dinge.

01:55:27.910 --> 01:55:29.450
Und genau, der hat

01:55:29.450 --> 01:55:31.510
dann irgendwann quasi halt auch jetzt

01:55:31.510 --> 01:55:33.690
einen async-fähigen

01:55:33.690 --> 01:55:35.410
HTTP-Client geschrieben,

01:55:35.730 --> 01:55:37.750
der sich am Request-Interface halt orientiert.

01:55:39.390 --> 01:55:40.190
Aber halt

01:55:40.190 --> 01:55:41.770
auch, mit dem man

01:55:41.770 --> 01:55:43.130
dann async-Geschichten machen kann.

01:55:43.690 --> 01:55:45.550
Und genau, den verwende ich jetzt auch eigentlich

01:55:45.550 --> 01:55:47.590
meistens, wenn ich irgendwie HTTP-Geschichten mache

01:55:47.590 --> 01:55:49.050
und funktioniert eigentlich ganz gut.

01:55:50.770 --> 01:55:51.330
Und warum

01:55:51.330 --> 01:55:53.630
nicht jetzt nicht mehr Request, was jetzt besser

01:55:53.630 --> 01:55:55.070
als Request ist? Es kann mehr als Request.

01:55:55.130 --> 01:55:56.790
Wie gesagt, Request ist Sync,

01:55:57.190 --> 01:55:59.430
kann kein async. Ja, okay. Also es ist jetzt

01:55:59.430 --> 01:56:00.850
quasi, ja, iSync-Request.

01:56:04.330 --> 01:56:05.370
Ja, also ich erinnere mich noch,

01:56:05.430 --> 01:56:07.030
früher habe ich immer sowas verwendet wie AEO,

01:56:07.190 --> 01:56:09.110
HTTP-Client und so, aber das war immer ziemlich,

01:56:09.250 --> 01:56:11.430
da muss man viel selber machen. Ja, da muss man selber frickeln.

01:56:11.670 --> 01:56:11.790
Ja.

01:56:13.970 --> 01:56:15.290
Ja, gut. Ich würde sagen,

01:56:15.350 --> 01:56:17.170
Come to the Dark Side, wir haben Cookies, ne, und

01:56:17.170 --> 01:56:19.170
du hast auch noch ein nettes Video gemacht zum Cookies.

01:56:19.210 --> 01:56:21.290
Oh ja, das können wir ja auch mal verlinken. Ja, das kommt auch

01:56:21.290 --> 01:56:22.570
in die Show Notes, perfekt. Ja.

01:56:24.290 --> 01:56:25.290
Aus aktuellem Anlass.

01:56:27.290 --> 01:56:29.170
Ja. Ja, vielen Dank, dass ihr uns

01:56:29.170 --> 01:56:30.610
heute wieder zugehört hat, dass ihr eingeschaltet habt.

01:56:31.630 --> 01:56:33.150
Feedback, Kritik, Anregungen, was auch immer.

01:56:33.370 --> 01:56:34.890
Hallo at peisenpodcast.de

01:56:34.890 --> 01:56:37.310
Schreibt uns, hört uns, wann auch

01:56:37.310 --> 01:56:38.930
immer ihr wollt. Morgens, mittags, abends, nachts.

01:56:39.510 --> 01:56:41.110
Zum Aufstehen, zum Schlafen gehen, zum Zähneputzen,

01:56:41.610 --> 01:56:43.290
zum Autofahren, zum was auch

01:56:43.290 --> 01:56:45.230
immer euch gerade einfällt, zum auf der Decke

01:56:45.230 --> 01:56:47.150
im Park liegen. Bei den

01:56:47.150 --> 01:56:48.470
Temperaturen bestimmt wundervoll.

01:56:49.690 --> 01:56:49.810
Ja.

01:56:51.170 --> 01:56:52.930
Auch beim Autofahren. Optionen sind eingeschränkt.

01:56:53.050 --> 01:56:55.650
Wir sind immer noch Corona

01:56:55.650 --> 01:56:57.070
behindert.

01:56:57.430 --> 01:56:58.990
Irgendwie in allem, was wir tun.

01:56:59.050 --> 01:56:59.990
Aber E-Mails schreiben geht.

01:57:01.070 --> 01:57:02.450
Und Podcasts hören geht auch.

01:57:02.730 --> 01:57:04.750
Bleibt uns gebogen und bis zum nächsten Mal.

01:57:05.230 --> 01:57:06.650
Jo, bis dann. Tschüss.
