WEBVTT

00:00:00.000 --> 00:00:11.400
Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast. Heute die 26. Episode, wir haben den 1. Dezember. Jochen, wir sind heute genau zwei Jahre, vor genau zwei Jahren haben wir die erste rausgebracht.

00:00:11.400 --> 00:00:12.440
Oh, ja richtig, das stimmt.

00:00:13.480 --> 00:00:16.220
2018, am 1. Dezember kam unsere erste Episode raus.

00:00:16.840 --> 00:00:17.040
Ja.

00:00:17.400 --> 00:00:18.980
Ja, nicht schlecht, oder? Zweiter Geburtstag.

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

00:00:20.580 --> 00:00:26.540
Nicht so schlecht, wir haben sogar durchschnittlich mehr als eine Folge dann pro Monat aufgenommen. Und wenn wir die noch zählen, die wir weggeschmissen haben, sind wir sogar bei.

00:00:26.540 --> 00:00:35.280
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, die aber es kann sein, dass wir irgendwie Dinge unterschlagen haben.

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

00:00:37.400 --> 00:00:38.840
Kann auch sein. Ich weiß es nicht genau.

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

00:00:42.920 --> 00:00:43.180
Ja.

00:00:43.460 --> 00:00:44.980
Und wir haben dabei den Johannes.

00:00:45.640 --> 00:00:45.880
Hallo.

00:00:46.000 --> 00:00:46.140
Hallo.

00:00:47.360 --> 00:00:55.420
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.420 --> 00:00:58.120
Ja, wir haben uns ja immer so viel vorgenommen, was wir eigentlich machen wollten.

00:00:58.420 --> 00:00:58.860
Lagen haben.

00:00:59.220 --> 00:01:07.160
Modul aus der Standardbibliothek vorstellen, Pics und so, das machen wir dann nie, weil irgendwie immer zu wenig Zeit ist und wir die ganze Zeit brauchen, um unser Audiosetup hinzukriegen.

00:01:07.180 --> 00:01:11.080
Ja, genau, dann muss am Ende irgendwie jemand wieder ins Bett und dann müssen wir leider immer aufhören.

00:01:11.560 --> 00:01:12.260
Ja, genau.

00:01:12.940 --> 00:01:14.640
Genau, machen wir das diesmal.

00:01:15.780 --> 00:01:20.740
Ja, also zum Beispiel eine Geschichte, die ich eigentlich erwähnen wollte.

00:01:20.740 --> 00:01:24.860
Wir hatten ja vorletztes Mal, glaube ich, was zu Python 3.9 erzählt.

00:01:25.240 --> 00:01:26.800
Und eine ganz wichtige Geschichte habe ich vergessen.

00:01:27.860 --> 00:01:33.420
Und zwar ist in Python 3.9 Topological Thought schon mit in der Standardbibliothek.

00:01:33.960 --> 00:01:34.720
Topological Thought.

00:01:35.580 --> 00:01:38.040
Jetzt bin ich natürlich wieder der Blöde, der keine Ahnung hat, was das ist.

00:01:38.340 --> 00:01:40.420
Also, was ist bitte Topological Thought?

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

00:01:44.960 --> 00:01:45.620
Das ist nur cool.

00:01:45.620 --> 00:01:47.400
Ja, nee, das ist

00:01:47.400 --> 00:01:51.260
wenn man jetzt einen Grafen

00:01:51.260 --> 00:01:53.300
also wenn man zum Beispiel Abhängigkeiten hat

00:01:53.300 --> 00:01:55.120
und die sortieren möchte, also wenn man sich zum Beispiel anzieht

00:01:55.120 --> 00:01:56.200
und dann irgendwie

00:01:56.200 --> 00:01:59.500
dran denken möchte, dass man irgendwie bevor man

00:01:59.500 --> 00:02:00.780
weiß ich nicht

00:02:00.780 --> 00:02:02.900
die Schuhe anzieht, die Socken angezogen haben muss

00:02:02.900 --> 00:02:05.220
dann ist das Problem sozusagen

00:02:05.220 --> 00:02:06.540
das allgemeine Problem dazu ist

00:02:06.540 --> 00:02:09.740
topological Sort oder topologische Sortierung

00:02:09.740 --> 00:02:11.200
keine Ahnung, gibt es auch

00:02:11.200 --> 00:02:13.480
beim Projektmanagement, glaube ich

00:02:13.480 --> 00:02:14.760
Gibt es überall, wo es Grafen gibt

00:02:14.760 --> 00:02:14.940
Ja.

00:02:16.860 --> 00:02:18.000
Zum Beispiel auch ganz wichtiger

00:02:18.000 --> 00:02:20.180
Angelegenheit, da habe ich selber zum, da wusste ich

00:02:20.180 --> 00:02:21.800
noch nicht, was das ist und

00:02:21.800 --> 00:02:23.920
habe selber überlegt, was das für ein Problem sein könnte.

00:02:24.300 --> 00:02:26.080
Nach ganz, ganz lange Überlegen bin ich dann drauf gekommen,

00:02:26.160 --> 00:02:28.120
es könnte irgendwas mit Graphen zu tun haben und dann

00:02:28.120 --> 00:02:30.200
sortieren und irgendwann hat mir

00:02:30.200 --> 00:02:31.780
jemand gesagt, ja, das ist doch Topological Sort.

00:02:31.960 --> 00:02:33.360
Dann habe ich mich ziemlich blöd gefühlt, aber

00:02:33.360 --> 00:02:35.920
zwar wenn man

00:02:35.920 --> 00:02:38.260
die Abhängigkeiten von Programmen

00:02:38.260 --> 00:02:40.040
oder Paketen, die man

00:02:40.040 --> 00:02:42.200
installieren möchte, sortieren möchte, da braucht man das dann auch.

00:02:43.000 --> 00:02:43.120
Ja.

00:02:44.760 --> 00:02:46.320
Genau.

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

00:02:48.100 --> 00:02:49.780
Das ist jetzt in der Standardbibliothek mit drin.

00:02:49.980 --> 00:02:51.540
Batteries included, sage ich ja nur.

00:02:52.180 --> 00:02:52.400
Ja.

00:02:54.260 --> 00:02:54.660
Ja.

00:02:55.660 --> 00:02:56.800
GraphLib heißt das Modul, oder?

00:02:56.920 --> 00:02:58.880
Ja, ja.

00:02:59.840 --> 00:03:00.060
Genau.

00:03:01.300 --> 00:03:04.240
Heute ist übrigens auch Advent of Code, der Teil 1, rausgekommen.

00:03:05.000 --> 00:03:05.580
Macht ihr das noch?

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

00:03:07.820 --> 00:03:09.180
Das habe ich noch nicht so ganz rausgefunden.

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

00:03:12.020 --> 00:03:14.160
weil er schon fünf Jahre lang versucht hat, das hinzubekommen.

00:03:14.160 --> 00:03:14.780
und dann muss er

00:03:14.780 --> 00:03:18.020
irgendwie seine Abrechnung richtig machen, dass er da

00:03:18.020 --> 00:03:20.120
hinkommt. Ich finde, die letzten Jahre fand ich auch sehr

00:03:20.120 --> 00:03:22.300
interessant. Da ging es ja irgendwie um Weihnachtswichtel

00:03:22.300 --> 00:03:24.200
und die Reise durchs Weltall mit dem Santa

00:03:24.200 --> 00:03:25.180
und so. Ja, genau.

00:03:26.980 --> 00:03:28.100
Okay. Mit dem Raumschiff,

00:03:28.280 --> 00:03:30.180
was man Interprete braucht, den man dann selber programmieren

00:03:30.180 --> 00:03:31.940
musste. Ja, genau. Da haben wir auch Codes und so, ne?

00:03:32.580 --> 00:03:32.820
Mhm.

00:03:36.460 --> 00:03:37.980
Ja, also er scheint auch cool. Das ist eine coole Sache.

00:03:38.340 --> 00:03:39.980
Also, da kann man dann allen möglichen

00:03:39.980 --> 00:03:41.000
Programmiersprachen machen, natürlich.

00:03:41.000 --> 00:03:42.960
Und, äh, hallo.

00:03:42.960 --> 00:04:11.140
und dann kannst du quasi überprüfen,

00:04:11.140 --> 00:04:12.900
ob du die richtige Lösung gefunden hast.

00:04:12.960 --> 00:04:14.980
Ah, okay, ja

00:04:14.980 --> 00:04:18.000
Und das ist eigentlich immer ganz nett

00:04:18.000 --> 00:04:20.480
Es ist sehr nett gemacht, es ist sehr aufwendig gestaltet

00:04:20.480 --> 00:04:21.760
und wir haben immer schöne Story

00:04:21.760 --> 00:04:24.280
Genau, man muss ja immer einen Stern sammeln pro Tag, pro Aufgabe

00:04:24.280 --> 00:04:25.500
also zwei Sterne am Tag

00:04:25.500 --> 00:04:28.500
für 48, 50 sogar, oder?

00:04:29.240 --> 00:04:30.620
24, kriegt man 25 auch noch ein?

00:04:32.260 --> 00:04:32.480
Nö

00:04:32.480 --> 00:04:34.340
Also, ja, 2x24

00:04:34.340 --> 00:04:35.540
24 oder 25

00:04:35.540 --> 00:04:37.280
Ich glaube 48 dann

00:04:37.280 --> 00:04:39.700
Achso, und es geht auch zurück, also man kann auch bis

00:04:39.700 --> 00:04:41.660
2015 zurück gucken

00:04:41.660 --> 00:04:45.220
und sich die ganzen alten Aufgaben ansehen.

00:04:46.360 --> 00:04:48.040
Das ist sehr nett. Also selber ausprobieren

00:04:48.040 --> 00:04:50.400
und dann halt gucken, ob man die Aufgaben lösen kann.

00:04:50.500 --> 00:04:53.180
Am Anfang sind die noch etwas einfach.

00:04:53.720 --> 00:04:55.180
Die gehen aber schnell wirklich in die Zeit.

00:04:55.540 --> 00:04:57.720
Ich habe sogar einen Post gelesen von Peter Norweg, der sagt,

00:04:57.800 --> 00:05:00.280
das wäre eigentlich schon sehr geil, aber so viel Zeit hat er dann auch nicht.

00:05:02.540 --> 00:05:04.540
Das ist auch bei mir immer so das Problem.

00:05:04.700 --> 00:05:08.000
Ich mache da gerne mit und dann irgendwann fühlt es sich an wie Arbeit

00:05:08.000 --> 00:05:09.060
und dann höre ich es dann wieder auf.

00:05:11.660 --> 00:05:14.020
Ja, aber es ist auf jeden Fall sehr zu empfehlen

00:05:14.020 --> 00:05:14.960
für alle

00:05:14.960 --> 00:05:17.460
Stufen ist was dabei

00:05:17.460 --> 00:05:20.080
die ersten Aufgaben sind einfacher, die kriegt man schnell durch

00:05:20.080 --> 00:05:22.060
und die, so ab dann 5

00:05:22.060 --> 00:05:24.080
oder so oder 6 oder 10 oder 12

00:05:24.080 --> 00:05:25.080
wird es dann schon richtig happig

00:05:25.080 --> 00:05:28.240
Ja, man muss sich dann wirklich überlegen, wie man da rangeht und nicht einfach so hands-on drauflos

00:05:28.240 --> 00:05:30.040
dann läuft man meistens gegen eine

00:05:30.040 --> 00:05:31.680
kleine oder größere Wand

00:05:31.680 --> 00:05:33.840
Und letztes Jahr war es auch so, dass die aufeinander

00:05:33.840 --> 00:05:35.880
aufgebaut haben, das heißt man hat dann an einem Tag

00:05:35.880 --> 00:05:38.040
seinen Interpreter gebaut und zwei Tage später hat man

00:05:38.040 --> 00:05:40.180
wieder abgebaut, weil dann noch ein Feature

00:05:40.180 --> 00:05:41.740
dazukam. Ja, oder man musste halt neue

00:05:41.740 --> 00:05:43.820
Opcodes handeln oder sowas. Und wenn man am Anfang schludrig

00:05:43.820 --> 00:05:45.940
gearbeitet hat und das so hingeworst hat,

00:05:45.980 --> 00:05:47.840
dass das einfach so ging, dann hat man sich geärgert,

00:05:47.920 --> 00:05:49.760
weil man die Implementierung sonst einfach hätte

00:05:49.760 --> 00:05:52.060
erweitern können und so musste man sie ganz neu bauen.

00:05:52.280 --> 00:05:53.940
Naja, ich bin gespannt, wie es dieses Jahr

00:05:53.940 --> 00:05:54.240
draus wird.

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

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

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

00:06:01.880 --> 00:06:02.160
Übung.

00:06:04.240 --> 00:06:05.840
Ja, ich habe da auch mal sehr viel gelernt. Also wirklich auch

00:06:05.840 --> 00:06:07.700
über Konzepte von anderen Lösungen angucken, verschiedene

00:06:07.700 --> 00:06:09.880
Sprachen. Ein Kollege von mir macht das in Go,

00:06:09.880 --> 00:06:11.160
kann man es immer schon vergleichen.

00:06:11.980 --> 00:06:14.200
Er hat heute direkt eine rekursive Lösung implementiert.

00:06:14.480 --> 00:06:15.500
Ich war direkt ein bisschen neidisch.

00:06:15.880 --> 00:06:17.800
Ich hatte nicht an Binary Research gedacht, ich wusste auch gar nicht, wie das

00:06:17.800 --> 00:06:18.580
in Python richtig geht.

00:06:19.520 --> 00:06:21.220
Und habe einfach Iter-Tools genommen,

00:06:22.100 --> 00:06:23.740
was auch funktionierte, aber weil

00:06:23.740 --> 00:06:24.220
BruteForce.

00:06:26.460 --> 00:06:27.680
Aber wir waren bei News, dass

00:06:27.680 --> 00:06:28.900
der Stene stehen geblieben ist.

00:06:28.900 --> 00:06:31.200
Ja, genau.

00:06:33.400 --> 00:06:34.320
Eine ganz interessante

00:06:34.320 --> 00:06:36.260
Geschichte, Python läuft jetzt auf .NET

00:06:36.260 --> 00:06:38.480
auf der Runtime da.

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

00:06:41.220 --> 00:06:42.660
genuschelt, als wäre es eine

00:06:42.660 --> 00:06:44.920
Meinung. Das ist mir auch peinlich.

00:06:45.020 --> 00:06:46.480
Das ist peinlich, dass das so nicht läuft.

00:06:46.920 --> 00:06:48.660
Was ist der Unterschied zu IronPython?

00:06:48.740 --> 00:06:50.080
Weil IronPython gab es ja schon lange.

00:06:50.140 --> 00:06:52.640
Ja, aber ich glaube, das war schon lange nicht mehr so richtig

00:06:52.640 --> 00:06:54.560
aktiv. Das ist so wie Json.

00:06:55.020 --> 00:06:56.680
Da gibt es sicherlich einen 2.7

00:06:56.680 --> 00:06:57.180
Port für.

00:06:58.860 --> 00:07:00.260
Ja, es ist irgendwie, es gibt einen

00:07:00.260 --> 00:07:01.880
Pep, der

00:07:01.880 --> 00:07:04.400
beschreibt, wie man sich quasi einklinken kann,

00:07:04.460 --> 00:07:05.200
wenn man jetzt ein JIT

00:07:05.200 --> 00:07:07.780
Compiler ist und

00:07:07.780 --> 00:07:09.960
Diese Variante jetzt benutzt es auch.

00:07:10.360 --> 00:07:11.180
Das ist irgendwie von

00:07:11.180 --> 00:07:13.820
Anthony Shaw oder so hat es gebaut.

00:07:14.320 --> 00:07:16.080
Was genau meinst du mit einklinken,

00:07:16.140 --> 00:07:18.400
wenn man ein Compiler, also das ist ein Just-in-Time-Compiler,

00:07:18.520 --> 00:07:19.660
das heißt sowas wie

00:07:19.660 --> 00:07:21.940
Python, die halt zur Laufzeit dann irgendwie

00:07:21.940 --> 00:07:23.260
evaluiert werden oder wie ist das?

00:07:24.400 --> 00:07:26.160
Das ist halt dann zu Maschinencode

00:07:26.160 --> 00:07:27.620
runterkompiliert wird quasi.

00:07:28.360 --> 00:07:28.520
Aha.

00:07:30.640 --> 00:07:31.900
Während das Programm läuft.

00:07:32.080 --> 00:07:34.020
Also die Teile, die gerade notwendig sind,

00:07:34.020 --> 00:07:36.180
werden dann während das Programm läuft

00:07:36.180 --> 00:07:38.260
zu Maschinencode kompiliert oder zu dem

00:07:38.260 --> 00:07:39.840
Code der VM,

00:07:40.400 --> 00:07:42.320
die da drunter liegt und sind dann natürlich

00:07:42.320 --> 00:07:42.640
schneller.

00:07:44.200 --> 00:07:45.820
Das macht PyPy zum Beispiel auch.

00:07:45.960 --> 00:07:47.440
PyPy hat auch so einen JIT-Modus,

00:07:48.180 --> 00:07:48.820
der dann halt

00:07:48.820 --> 00:07:52.360
die Sachen,

00:07:52.480 --> 00:07:54.220
die jetzt gerade in der

00:07:54.220 --> 00:07:56.260
Schleife sind und 100.000 Mal durchgeführt werden,

00:07:56.480 --> 00:07:58.260
die kompiliert er dann halt so vor, dass diese

00:07:58.260 --> 00:08:00.280
Varianten schneller sind. Das ist einer

00:08:00.280 --> 00:08:02.280
der großen Vorteile von

00:08:02.280 --> 00:08:03.900
PyPy, dass die das machen können. Das macht

00:08:03.900 --> 00:08:05.720
C-Python nicht, C-Python hat keinen JIT.

00:08:06.180 --> 00:08:07.640
drin. Der hat einfach seine

00:08:07.640 --> 00:08:09.860
Stack-Maschinen und die arbeitet das alles ab und fertig.

00:08:11.600 --> 00:08:12.000
Aber

00:08:12.000 --> 00:08:13.880
wie ist denn dann die Runtime? Das ist ja dann nicht

00:08:13.880 --> 00:08:15.900
Zip-Python, sondern das ist dann irgendeine andere Runtime,

00:08:16.020 --> 00:08:16.980
die auf .NET läuft, oder wie?

00:08:18.700 --> 00:08:20.000
Ja, nee, das ist

00:08:20.000 --> 00:08:21.620
schon hauptsächlich Zip-Python.

00:08:21.840 --> 00:08:23.940
Es ist nur so, dass man das irgendwie

00:08:23.940 --> 00:08:25.980
also

00:08:25.980 --> 00:08:28.240
keine Ahnung.

00:08:29.080 --> 00:08:29.780
Es ist schon

00:08:29.780 --> 00:08:31.020
Zip-Python, aber

00:08:31.020 --> 00:08:33.920
es funktioniert

00:08:33.920 --> 00:08:35.360
jetzt so halbwegs noch nicht schneller, aber

00:08:35.360 --> 00:08:38.480
Leute könnten jetzt Optimierungen machen,

00:08:38.620 --> 00:08:40.340
indem sie halt das irgendwie auf die

00:08:40.340 --> 00:08:42.320
.NET Runtime irgendwie optimieren.

00:08:42.880 --> 00:08:43.520
Rübergit.

00:08:44.000 --> 00:08:46.200
Ja, war auf jeden Fall irgendwie so.

00:08:46.320 --> 00:08:47.060
Kann man sich mal angucken.

00:08:47.220 --> 00:08:49.320
Ich hätte mal den Artikel dazu in den Shownotes packen.

00:08:50.780 --> 00:08:52.060
Ja, was hatten wir noch?

00:08:52.660 --> 00:08:54.440
Genau, noch so Dinge wie

00:08:54.440 --> 00:08:56.700
PEP 621

00:08:56.700 --> 00:08:58.400
irgendwie mehr dazu

00:08:58.400 --> 00:09:00.100
gekommen, was man jetzt alles so in PyProject

00:09:00.100 --> 00:09:02.140
Tommel irgendwie reinschreiben kann an Metadaten.

00:09:02.480 --> 00:09:03.320
Oh, cool. Was denn?

00:09:03.320 --> 00:09:04.420
Ja,

00:09:04.860 --> 00:09:07.620
ich glaube, so ziemlich alles,

00:09:07.800 --> 00:09:08.980
was halt vorher so ein Setup

00:09:08.980 --> 00:09:10.000
Flag 8 auch?

00:09:11.740 --> 00:09:13.620
Ich glaube, Flag 8 wehrt sich noch

00:09:13.620 --> 00:09:13.920
so ein bisschen.

00:09:16.340 --> 00:09:16.700
Ja.

00:09:17.660 --> 00:09:18.680
Was ist das? PyTest?

00:09:19.000 --> 00:09:21.280
Geht fast. Also PyTest ist im Moment noch so mit

00:09:21.280 --> 00:09:23.240
PyTest-E-Options, so ein Workaround.

00:09:24.220 --> 00:09:25.440
Das wäre cool, wenn das normal wäre.

00:09:25.640 --> 00:09:27.340
Und ich glaube, Flag 8 hat es noch nicht so wirklich

00:09:27.340 --> 00:09:29.500
geschafft. Und habe ich noch was vergessen,

00:09:29.500 --> 00:09:29.940
was fehlt?

00:09:29.940 --> 00:09:39.600
Ja, ich glaube, das sind eher so Dinge wie, was ist der Autor von dem Ding und was sind die Abhängigkeiten und diese ganzen Geschichten.

00:09:39.620 --> 00:09:42.400
Ja, aber so Black-Konfigurationen geht zum Beispiel schon rein und...

00:09:42.400 --> 00:09:44.980
Ja, ja, gut, aber das ist ja jetzt ein Third-Party.

00:09:45.880 --> 00:09:54.020
Ja, aber das ist ja nett, wenn man das alles da in die PyProjekt-Tummel packen kann, weil ich bin ein Freund von monolithischen Konflikten und nicht so ganz vielen kleinen, die irgendwo rumfliegen.

00:09:54.020 --> 00:09:56.980
Ansonsten, was auch noch

00:09:56.980 --> 00:09:59.060
ganz

00:09:59.060 --> 00:10:01.160
witzig fand, ist,

00:10:01.320 --> 00:10:03.260
da sind ja irgendwie neue Chips aus Apple rausgefallen.

00:10:06.080 --> 00:10:07.140
Hat man gehört?

00:10:07.480 --> 00:10:07.700
Ja.

00:10:09.080 --> 00:10:11.580
Hat man schon

00:10:11.580 --> 00:10:12.420
so Geräte gesehen?

00:10:12.980 --> 00:10:13.180
Ja.

00:10:16.940 --> 00:10:18.240
Also du hast schon so eine?

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

00:10:21.080 --> 00:10:23.100
irgendwie Ergebnisse von

00:10:23.100 --> 00:10:25.740
den Karten gesehen für Dinge, die ich

00:10:25.740 --> 00:10:27.460
interessant fand. Und insofern,

00:10:27.760 --> 00:10:30.160
wenn ich jetzt schwer überlege, ob ich da nicht vielleicht auch mal

00:10:30.160 --> 00:10:31.520
zuschlagen soll, weil

00:10:31.520 --> 00:10:33.280
es ist schon sendet.

00:10:33.620 --> 00:10:35.120
Auf dem Papier jedenfalls und so, was man hört.

00:10:37.240 --> 00:10:37.900
Wenn man in diesem

00:10:37.900 --> 00:10:40.120
Ökosystem drin ist,

00:10:40.200 --> 00:10:41.560
dann ist das, glaube ich, eine nette Sache.

00:10:41.640 --> 00:10:43.360
Das ist ja so eine Sache, die ich gar nicht verstehen kann.

00:10:43.560 --> 00:10:45.080
Sonst finde ich ja alles, was Mochen macht,

00:10:45.160 --> 00:10:47.460
total bewundernswert und super. Aber dieses

00:10:47.460 --> 00:10:49.760
Mekophilie, wie sagt man?

00:10:49.760 --> 00:10:50.300
Ich weiß nicht.

00:10:50.300 --> 00:10:51.160
Ja, Fankomolika.

00:10:53.700 --> 00:10:54.140
Fanboytum.

00:10:55.540 --> 00:10:56.220
Naja, also

00:10:56.220 --> 00:10:58.240
das Schicke daran ist halt,

00:10:58.580 --> 00:11:00.440
dass da sind jetzt

00:11:00.440 --> 00:11:02.280
gar keine, zum Beispiel bei dem MacBook Air

00:11:02.280 --> 00:11:03.720
sind halt keine Lüfter mehr drin.

00:11:04.960 --> 00:11:06.180
Juhu, im Sommer, yay!

00:11:07.060 --> 00:11:08.360
Ja, aber also die Leute

00:11:08.360 --> 00:11:09.920
haben das ja schon benutzt und das

00:11:09.920 --> 00:11:11.080
scheint halt...

00:11:11.080 --> 00:11:13.320
Da sind auch keine Lüfter drin.

00:11:14.940 --> 00:11:16.240
Der schönste Hack,

00:11:16.360 --> 00:11:17.420
den ich gesehen habe übrigens,

00:11:18.320 --> 00:11:19.740
der schönste Hack, den ich gesehen habe,

00:11:19.740 --> 00:11:49.720
und Jochen unterhalten sich über die Programmiersprache Python

00:11:49.740 --> 00:11:51.320
in Tesla innerhalb von 10 Minuten leer oder so.

00:11:53.080 --> 00:11:53.780
Was es da

00:11:53.780 --> 00:11:56.200
jetzt halt auch gab, ist schon so eine

00:11:56.200 --> 00:11:58.220
irgendwie Preview-Variante

00:11:58.220 --> 00:11:59.020
von einer

00:11:59.020 --> 00:12:01.900
TensorFlow-Version,

00:12:03.100 --> 00:12:03.620
die halt

00:12:03.620 --> 00:12:06.380
gegen die

00:12:06.380 --> 00:12:07.820
entsprechenden Bibliotheken gelinkt ist und

00:12:07.820 --> 00:12:09.780
dann halt schnell ist halt auch

00:12:09.780 --> 00:12:11.720
auf Metal und halt

00:12:11.720 --> 00:12:13.680
auf der Apple-Hardware.

00:12:15.360 --> 00:12:15.800
Und

00:12:15.800 --> 00:12:17.720
das war

00:12:17.720 --> 00:12:19.660
tatsächlich auch ganz nett. Also ich habe das dann auch mal, ich meine,

00:12:19.740 --> 00:12:24.020
Das ist ja immer so ein Problem, man hat halt keine Nvidia-Karten auf Apple

00:12:24.020 --> 00:12:29.860
und es gibt da einmal so eine Geschichte über PlateML,

00:12:30.160 --> 00:12:33.940
das ist so eine Intel-Geschichte, die man sich installieren kann,

00:12:34.020 --> 00:12:35.320
damit wird es dann halt schon mal ein bisschen schneller,

00:12:35.480 --> 00:12:37.320
also da geht dann schon so ein bisschen was GPU-mäßiges,

00:12:37.460 --> 00:12:40.240
halt auch mit den AMD-Karten, die da halt drin sind.

00:12:42.960 --> 00:12:44.760
Aber ist halt nicht so schnell wie Nvidia

00:12:44.760 --> 00:12:46.840
und ist halt auch nicht so schnell,

00:12:46.840 --> 00:12:50.880
also die CUDA und diese ganzen Geschichten, das ist damit nicht so richtig vergleichbar,

00:12:50.980 --> 00:12:52.500
aber so ein bisschen was kriegt man da schon hin.

00:12:52.900 --> 00:12:58.460
Also zumindest so weit, dass halt so Maschinenlöhnengeschichten halt auf der GPU in so einem MacBook

00:12:58.460 --> 00:13:02.180
sind halt genauso schnell wie halt mit den 8 CPUs sonst.

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

00:13:07.080 --> 00:13:08.920
Ja, genau, die ist halt schneller.

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

00:13:12.880 --> 00:13:14.300
Ja, nee, das geht halt irgendwie nicht.

00:13:14.740 --> 00:13:16.720
In diese Mac Pros gehen die nicht da rein?

00:13:16.840 --> 00:13:17.580
nicht?

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

00:13:20.460 --> 00:13:22.720
Das kann sein, dass das da geht, das weiß ich nicht genau.

00:13:24.360 --> 00:13:26.580
Das sind wahrscheinlich 5000 Euro für eine Karte oder so.

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

00:13:29.100 --> 00:13:30.740
Wenn der

00:13:30.740 --> 00:13:32.760
Standfluss von dem Monitor schon 1000 Euro kostet,

00:13:32.900 --> 00:13:33.980
dann ist das nicht so wichtig.

00:13:35.540 --> 00:13:36.380
Aber der ist aus einem

00:13:36.380 --> 00:13:39.080
massiven Block Aluminium rausgefräst.

00:13:39.640 --> 00:13:39.820
Ja.

00:13:41.560 --> 00:13:42.780
Ja, das ist auch

00:13:42.780 --> 00:13:44.800
aus dem Bereich hätte ich auch News.

00:13:44.800 --> 00:13:49.000
Jochen, was sagst du denn zu dem Durchbruch, was das Proteinfalten angeht?

00:13:49.100 --> 00:13:50.420
Ja, das klingt auch sehr gut tatsächlich.

00:13:51.120 --> 00:13:55.420
Das wurde so beschrieben als der erste richtige Anwendungsfall für AI,

00:13:55.780 --> 00:13:58.060
der erste richtige Durchbruch von AI-Anwendungen.

00:13:58.820 --> 00:13:59.980
Mit den Proteinfalten?

00:13:59.980 --> 00:14:07.640
Wo eine amerikanische Firma DeepMind, die haben einen Algorithmus vorgestellt,

00:14:07.720 --> 00:14:11.080
also Algorithmus kann man ja fast nicht sagen, aber die haben eine Technologie vorgestellt,

00:14:11.080 --> 00:14:20.820
die aus einer Sequenzbeschreibung, also die Aminosäuren, die aneinandergereiht werden,

00:14:20.900 --> 00:14:27.520
genau, die zum Beispiel durch Gene kodiert werden können, das fertig gefaltete Protein berechnet.

00:14:27.680 --> 00:14:33.380
Und das Problem ist halt, dass diese Proteine zwar linear hergestellt werden,

00:14:34.220 --> 00:14:37.400
aber sich dann eben zu einer dreidimensionalen Struktur zusammenfalten.

00:14:37.400 --> 00:14:39.300
und weil die eben sehr viele Proteine

00:14:39.300 --> 00:14:41.440
drin haben, die sich in sehr viele Richtungen falten können,

00:14:41.580 --> 00:14:43.340
ist die Anzahl der Freiheitsgrade sehr hoch.

00:14:44.260 --> 00:14:45.400
Und die haben jetzt eben eine

00:14:45.400 --> 00:14:47.540
Technik vorgestellt, wie man innerhalb von wenigen

00:14:47.540 --> 00:14:48.020
Tagen

00:14:48.020 --> 00:14:51.520
so eine Faltung berechnen kann.

00:14:52.020 --> 00:14:53.160
Also quasi ein Strang

00:14:53.160 --> 00:14:55.520
aus einer RNA.

00:14:55.520 --> 00:14:57.660
Was du reinkriegst ist

00:14:57.660 --> 00:14:59.440
oder was du gegeben kriegst ist eine Abfolge

00:14:59.440 --> 00:15:01.380
von Aminosäuren. Das ist ja fast wie eine RNA,

00:15:01.520 --> 00:15:03.400
oder? Genau, das ist RNA.

00:15:03.520 --> 00:15:04.980
Das ist so ein Problem aus der Biologie.

00:15:04.980 --> 00:15:09.680
das 1973 auf irgendeiner Konferenz vorgestellt wurde.

00:15:11.300 --> 00:15:13.840
Also seit 50 Jahren arbeitet man daran im Wesentlichen.

00:15:14.440 --> 00:15:18.120
Und die Frage ist halt, wie dieses Protein dann dreidimensional ausschaut,

00:15:18.200 --> 00:15:20.820
weil das bestimmt ganz viele der Eigenschaften dieses Proteins.

00:15:20.820 --> 00:15:25.740
Und das kannst du nicht blutfaustrechnen, weil der Lösungsraum halt irgendwie 10 hoch 1000 ist.

00:15:28.180 --> 00:15:34.880
Und die haben jetzt eben so eine Technologie vorgestellt, wo man in, ich glaube, vier Tagen Rechenzeit reingesteckt hat.

00:15:34.980 --> 00:15:36.780
und dann haben sie im Schnitt,

00:15:36.920 --> 00:15:39.760
da gibt es dann so einen Benchmark und so einen Wettbewerb,

00:15:40.420 --> 00:15:41.120
wo sie im Schnitt

00:15:41.120 --> 00:15:43.640
92% Übereinstimmung

00:15:43.640 --> 00:15:45.800
hatten, wobei 92%

00:15:45.800 --> 00:15:47.380
Übereinstimmung, das hört sich niedrig an,

00:15:47.480 --> 00:15:49.320
aber ist wohl extrem hoch, weil

00:15:49.320 --> 00:15:51.260
die Messwerte, die man so rauskriegt, sind

00:15:51.260 --> 00:15:53.640
auch immer nur im Bereich zwischen 90% und 100%

00:15:53.640 --> 00:15:55.240
Übereinstimmung. Also es ist im Wesentlichen wie

00:15:55.240 --> 00:15:57.360
ein Messwert, den man da rauskriegt.

00:15:57.440 --> 00:15:59.220
Und das ist eben tatsächlich eine Sache, die man

00:15:59.220 --> 00:16:01.080
vorher nicht konnte und die es einfach nicht gab.

00:16:02.140 --> 00:16:02.440
Und

00:16:02.440 --> 00:16:07.280
die auch in der Medizin sehr, sehr, sehr, sehr, sehr nützlich ist, weil du dann eben nicht

00:16:07.280 --> 00:16:13.160
die Moleküle synthetisieren und untersuchen musst, was sehr aufwendig und sehr teuer und sehr schwierig ist,

00:16:13.560 --> 00:16:17.340
sondern du kannst halt sagen, hier, wir haben so eine Gensequenz gefunden, wie sieht denn das Ding aus?

00:16:18.840 --> 00:16:24.780
Und das ist so, also es wurde wie gesagt beschrieben als so eine der ersten richtigen Durchbrüche von AI-Technologie,

00:16:24.880 --> 00:16:30.560
von Machine Learning-Technologie, wo jetzt was möglich ist, was vorher einfach nicht möglich war.

00:16:30.560 --> 00:16:31.940
Das heißt, man kann tatsächlich irgendwann

00:16:31.940 --> 00:16:34.160
den ganzen Körper brechen irgendwann mal vielleicht so.

00:16:35.200 --> 00:16:35.860
Ja, aber

00:16:35.860 --> 00:16:38.300
das wurde halt dann

00:16:38.300 --> 00:16:39.960
sozusagen so vorgestellt als,

00:16:40.040 --> 00:16:41.620
ich habe dann halt den

00:16:41.620 --> 00:16:44.360
Fortschritt gesehen als so ein Graph

00:16:44.360 --> 00:16:46.260
und dann die letzten

00:16:46.260 --> 00:16:48.180
beiden Geschichten waren halt deutlich besser und

00:16:48.180 --> 00:16:50.320
jetzt halt das letzte so gut wie

00:16:50.320 --> 00:16:52.440
fast ein Experiment oder quasi genauso gut

00:16:52.440 --> 00:16:54.060
und jemand hat beschrieben das dann halt so, dass

00:16:54.060 --> 00:16:56.180
der Image-Net-Moment für Proteinfaltung

00:16:56.180 --> 00:16:58.340
also wo man halt sieht so,

00:16:58.340 --> 00:17:00.320
okay, jetzt ist es so gut, dass man tatsächlich was damit machen

00:17:00.320 --> 00:17:02.140
kann und der ImageNet war es ja auch so,

00:17:02.320 --> 00:17:03.040
also bevor

00:17:03.040 --> 00:17:06.140
Deep Learning da irgendwie, man da mit

00:17:06.140 --> 00:17:08.240
reingegangen ist, waren die Ergebnisse einfach

00:17:08.240 --> 00:17:10.300
man konnte es nicht verwenden und das war

00:17:10.300 --> 00:17:11.980
halt bei diesen Proteinfaltungsgeschichten auch immer so,

00:17:12.040 --> 00:17:14.280
weil die Genauigkeit war 40%, 50% oder so,

00:17:14.700 --> 00:17:16.240
ja schon, es geht so ein bisschen was, aber es hat

00:17:16.240 --> 00:17:18.080
halt nicht, man konnte es nicht verwenden

00:17:18.080 --> 00:17:20.120
und jetzt ist es halt so weit, dass man es tatsächlich verwenden kann

00:17:20.120 --> 00:17:21.860
und ja,

00:17:22.060 --> 00:17:24.060
das ist natürlich schon beeindruckend. Ja, DeepMind, auch

00:17:24.060 --> 00:17:26.020
interessant, ist von Google gekauft

00:17:26.020 --> 00:17:26.400
worden,

00:17:26.680 --> 00:17:30.160
die hatten doch auch schon AlphaGo

00:17:30.160 --> 00:17:32.360
AlphaGo haben die gemacht, genau, AlphaGo Zero.

00:17:33.940 --> 00:17:36.440
Ja, spannende Sache.

00:17:36.600 --> 00:17:38.480
Aber hat nichts mit Python zu tun, also zurück zum Thema.

00:17:38.780 --> 00:17:40.180
Hunde wollt ihr ewig leben, ja.

00:17:41.600 --> 00:17:41.920
Ja.

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

00:17:44.300 --> 00:17:45.860
da kann man auch bestimmt einige Sachen machen,

00:17:46.260 --> 00:17:48.360
die den Körper verjüngen oder sowas. Das ist bestimmt ein gutes

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

00:17:50.780 --> 00:17:52.660
Ja, jetzt gerade ist es vor allem spannend,

00:17:52.800 --> 00:17:55.000
weil man da halt auch mRNA-Sequenzen

00:17:55.000 --> 00:17:57.080
mit brechen kann und hat welche, die richtig ist.

00:17:58.580 --> 00:17:59.220
Gut, gut.

00:18:00.160 --> 00:18:03.540
Ja, da geht einiges.

00:18:04.360 --> 00:18:05.880
Genau, ansonsten

00:18:05.880 --> 00:18:07.160
eine Geschichte und da,

00:18:07.440 --> 00:18:08.740
das ist ja schon fast eine Überleitung

00:18:08.740 --> 00:18:10.740
zu dem

00:18:10.740 --> 00:18:13.540
Thema, es ist eine neue Release rausgekommen

00:18:13.540 --> 00:18:15.340
von Phoenix

00:18:15.340 --> 00:18:16.360
Live View

00:18:16.360 --> 00:18:19.240
vor kurzem. Ich gucke da ab und zu

00:18:19.240 --> 00:18:21.220
auch mal so ein bisschen jetzt rein, weil ich mir

00:18:21.220 --> 00:18:23.360
dieses ganze Elixier-Erlangen-Ding halt auch so ein bisschen

00:18:23.360 --> 00:18:23.840
angucke

00:18:23.840 --> 00:18:26.820
und das

00:18:26.820 --> 00:18:29.020
hat jetzt zum Beispiel auch File-Uploads drin.

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

00:18:32.520 --> 00:18:35.160
total nach Jagni an

00:18:35.160 --> 00:18:37.940
Ah, File Uploads, das machen wir in Release 12

00:18:37.940 --> 00:18:38.980
das braucht kein Mensch

00:18:38.980 --> 00:18:42.000
Ja, das hat mich jetzt auch gewundert, ehrlich gesagt

00:18:42.000 --> 00:18:43.040
dass das noch nicht drin war

00:18:43.040 --> 00:18:45.800
Ja, jetzt ist es drin und das ist auch

00:18:45.800 --> 00:18:46.480
tatsächlich sehr schick

00:18:46.480 --> 00:18:49.560
Ja, aber genau

00:18:49.560 --> 00:18:51.720
da hat sich auch noch ein bisschen was getan

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

00:18:54.100 --> 00:18:55.700
Ja, das ist halt sozusagen das

00:18:55.700 --> 00:18:57.460
Standard, oder ich weiß es nicht genau

00:18:57.460 --> 00:18:59.200
Plus nichts Falsches sagen.

00:19:00.040 --> 00:19:01.460
Ich kenne mich ja jetzt mit Elixir nicht so aus,

00:19:01.560 --> 00:19:03.180
aber es ist halt so das Web-Framework.

00:19:03.640 --> 00:19:05.560
Also Elixir ist halt

00:19:05.560 --> 00:19:07.540
ein Dialekt oder

00:19:07.540 --> 00:19:08.740
so eine etwas anders

00:19:08.740 --> 00:19:11.500
aufgemachte Sprache,

00:19:11.580 --> 00:19:13.160
die aber auch auf dieser Erlangen vor allem läuft

00:19:13.160 --> 00:19:13.620
und

00:19:13.620 --> 00:19:17.020
zu Erlangen runterkompiliert.

00:19:18.900 --> 00:19:19.280
Und

00:19:19.280 --> 00:19:20.800
Phoenix ist halt sozusagen das

00:19:20.800 --> 00:19:22.680
Standard-Web-Framework dafür.

00:19:22.900 --> 00:19:24.320
Was ist Erlangen? Kann man das essen?

00:19:24.800 --> 00:19:26.880
Ja, Erlangen ist halt auch so eine Sprache.

00:19:26.880 --> 00:19:28.000
Ericsson Language. Genau.

00:19:28.660 --> 00:19:29.640
Wer oder was ist Ericsson?

00:19:30.720 --> 00:19:32.840
Ericsson ist der große Telefonhersteller.

00:19:33.280 --> 00:19:35.100
Der große Telefonhersteller

00:19:35.100 --> 00:19:37.020
aus Norwegen, glaube ich.

00:19:37.340 --> 00:19:38.700
Ja. Woher kommt Ericsson?

00:19:39.320 --> 00:19:41.020
Und das, ich weiß nicht genau,

00:19:41.060 --> 00:19:42.720
wann das entwickelt wird. Die heißen natürlich Sony Ericsson.

00:19:43.280 --> 00:19:43.460
Ach.

00:19:44.860 --> 00:19:45.760
Sind nicht mehr alleine.

00:19:47.020 --> 00:19:48.580
Ja, und ich glaube,

00:19:48.580 --> 00:19:49.980
das ist schon

00:19:49.980 --> 00:19:52.260
ziemlich lange her, Anfang der 80er,

00:19:52.340 --> 00:19:53.260
irgendwann dann so.

00:19:54.660 --> 00:19:56.620
Das ist ein ganz, ganz, ganz geniales

00:19:56.620 --> 00:19:58.400
Video aus den 80ern, wo sie das demonstrieren,

00:19:58.500 --> 00:19:59.720
das ist R-Lang-System.

00:20:00.520 --> 00:20:02.500
Mit der Ästhetik der 80er, aber

00:20:02.500 --> 00:20:04.360
mit der Technologie, die heute...

00:20:04.360 --> 00:20:06.380
Also, wenn ich das programmieren müsste, was die

00:20:06.380 --> 00:20:08.620
damals zeigen, wüsste ich nicht genau, wie ich es machen würde.

00:20:09.320 --> 00:20:09.680
Ja.

00:20:10.420 --> 00:20:11.260
Ja, ja, ist schon mal ein...

00:20:11.260 --> 00:20:13.100
Also halt R-Lang nehmen.

00:20:14.040 --> 00:20:16.560
Ja. Und das ist halt

00:20:16.560 --> 00:20:18.520
auch heute noch immer noch, es ist gerade

00:20:18.520 --> 00:20:20.420
sehr hip im ganzen Web-Umfeld,

00:20:20.600 --> 00:20:22.640
so für Backend-Geschichten, deswegen war das halt,

00:20:23.480 --> 00:20:24.540
weil man quasi,

00:20:24.540 --> 00:20:26.300
naja, so sehr, sehr robuste

00:20:26.300 --> 00:20:28.300
Concurrency-Geschichten halt

00:20:28.300 --> 00:20:29.420
geschenkt kriegt.

00:20:30.220 --> 00:20:31.260
Ich meine zum Beispiel,

00:20:31.560 --> 00:20:34.140
WhatsApp ist da drauf halt gebaut und so.

00:20:35.180 --> 00:20:36.280
Das wurde doch für,

00:20:36.500 --> 00:20:38.600
also das hat Ericsson doch für

00:20:38.600 --> 00:20:40.300
seine Telefonsystem-Backends

00:20:40.300 --> 00:20:42.500
Für die Telefonswitches ist das eigentlich gebaut worden.

00:20:42.600 --> 00:20:44.000
Genau, und die dürfen halt nicht abstützen.

00:20:44.160 --> 00:20:46.300
Also ich meine, wenn die abstützen, dann ist es halt echt blöd.

00:20:48.580 --> 00:20:49.540
Deshalb ist das so robust.

00:20:49.620 --> 00:20:50.980
Es gibt auch einige

00:20:50.980 --> 00:20:54.200
Multiplayer-Gaming-Systeme, wo die

00:20:54.200 --> 00:20:55.860
Backends in Erlang geschrieben sind.

00:20:55.860 --> 00:20:57.780
einfach, weil die nicht abstürzen dürfen und

00:20:57.780 --> 00:20:58.680
skalierbar sein müssen.

00:20:59.640 --> 00:21:01.860
Man sieht die ja nicht. Das sagen immer nur Firmen

00:21:01.860 --> 00:21:03.840
wieder hier, wir benutzen Erlang, um unsere Backends zu

00:21:03.840 --> 00:21:05.320
programmieren, aber die siehst du ja nie.

00:21:05.800 --> 00:21:06.120
Na gut.

00:21:08.080 --> 00:21:09.700
Ich habe gerade mal bei Wikipedia geschaut

00:21:09.700 --> 00:21:11.500
und da steht auf der Übersicht

00:21:11.500 --> 00:21:12.960
Environment

00:21:12.960 --> 00:21:15.480
.ccc

00:21:15.480 --> 00:21:16.400
Auch interessant.

00:21:17.180 --> 00:21:19.580
Crackers Competitors Costumers wollten die wohl sagen, aber

00:21:19.580 --> 00:21:21.600
naja, das muss am Rande.

00:21:21.700 --> 00:21:22.160
Kleiner Joke.

00:21:23.240 --> 00:21:25.820
Aber Jochen kompiliert das wirklich zu Erlang

00:21:25.820 --> 00:21:27.700
runter oder kombiniert das direkt zu Beam,

00:21:27.760 --> 00:21:29.300
weil die VM heißt ja Beam VM.

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

00:21:32.220 --> 00:21:33.800
ich meine,

00:21:33.980 --> 00:21:35.420
es kombiniert erst nochmal zu Erlang

00:21:35.420 --> 00:21:36.680
und dann,

00:21:37.000 --> 00:21:39.060
aber, ja genau,

00:21:39.240 --> 00:21:41.280
ich gucke dann immer nur so drauf.

00:21:41.780 --> 00:21:43.700
Zu Beam, Beam me up, Scotty, was ist denn

00:21:43.700 --> 00:21:45.700
jetzt wieder Beam? Ja, das ist eine VM,

00:21:45.860 --> 00:21:46.740
die Erlang ausführt.

00:21:47.680 --> 00:21:48.860
Das ist so wie C-Python.

00:21:49.860 --> 00:21:51.540
Niemand interagiert je mit C-Python,

00:21:51.540 --> 00:21:53.420
obwohl wir alle immer mit C-Python interagieren,

00:21:53.500 --> 00:21:55.640
aber das ist das eigentliche Programm,

00:21:55.640 --> 00:21:59.280
was das ausführt. Bei Erlang und Beam ist es genauso. Bei Erlang heißt es halt nicht

00:21:59.280 --> 00:22:03.760
CRlang, sondern es heißt halt Beam. Und dann laufen Dinge wie Elixir

00:22:03.760 --> 00:22:05.060
auf Erlang. Genau.

00:22:07.100 --> 00:22:09.700
Und Elixir ist das Dango für Erlang. Nee, für Nix.

00:22:09.960 --> 00:22:13.760
Das Phoenix ist das Dango für Elixir.

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

00:22:17.280 --> 00:22:21.020
Und Beam läuft auf? Ich glaube da gibt es auch irgendwo OTP oder sowas darunter.

00:22:21.020 --> 00:22:30.640
Prozessoren. Ja, ich glaube, dass das die Bibliothek ist. OTP ist die Bibliothek. Wenn ich das recht weiß. Aber ich lasse mich gerne in den Kommentaren.

00:22:31.120 --> 00:22:32.620
Genau, jetzt müssen wir uns alle dafür schlagen.

00:22:32.620 --> 00:22:39.340
Das ist wieder so ein neuer Namespace. Ich habe überhaupt keine Ahnung, wofür ihr gerade redet. Ich fühle mich etwas abgehängt.

00:22:39.360 --> 00:22:41.360
Ja, das macht nichts. Dann fühlen wir uns besser.

00:22:41.360 --> 00:23:11.340
Ja, ist klar.

00:23:11.360 --> 00:23:13.800
Podcast-Software-Thema,

00:23:14.600 --> 00:23:15.420
weil es gab

00:23:15.420 --> 00:23:17.140
schon mal einen Versuch, also

00:23:17.140 --> 00:23:19.120
nochmal eine Ecke

00:23:19.120 --> 00:23:21.440
ausholen, so eine der

00:23:21.440 --> 00:23:23.600
populäreren Geschichten, wie man Podcasts hostet,

00:23:23.700 --> 00:23:24.420
ist ja irgendwie

00:23:24.420 --> 00:23:27.100
der

00:23:27.100 --> 00:23:29.260
Podlove-Publisher, oder es gibt ja natürlich

00:23:29.260 --> 00:23:31.260
unterschiedliche Teile, was dieses Hosting betrifft, aber

00:23:31.260 --> 00:23:32.620
so das Ding, was sozusagen

00:23:32.620 --> 00:23:35.060
die Feeds generiert und

00:23:35.060 --> 00:23:36.600
ja,

00:23:36.820 --> 00:23:39.200
irgendwie auch den ganzen Website-Teil

00:23:39.200 --> 00:23:40.300
so zum Großteil macht,

00:23:40.300 --> 00:23:44.440
und das ist halt so ein WordPress-Plugin.

00:23:45.140 --> 00:23:47.480
Vielleicht habe ich schon mal gehört, dass von Tim Püttlach, der mit Cars Radio existiert ist.

00:23:47.480 --> 00:23:54.420
Ja gut, der hat das Projekt mal initiiert, da haben natürlich eine Menge Leute dran geschrieben.

00:23:57.540 --> 00:24:04.840
Und man kriegt halt so Probleme, wenn man jetzt irgendwie WordPress und dann Plugin hat.

00:24:04.840 --> 00:24:09.820
Also dazu gibt es jetzt auch einen ganz interessanten Podcast.

00:24:10.300 --> 00:24:11.740
Padlovers Podcast

00:24:11.740 --> 00:24:13.860
heißt der irgendwie und da wurde

00:24:13.860 --> 00:24:15.940
über die Geschichte auch schon so einiges erzählt

00:24:15.940 --> 00:24:17.820
und ich habe mir das halt mal angehört, weil ich

00:24:17.820 --> 00:24:19.380
dachte, für mich ganz interessant, weil ich

00:24:19.380 --> 00:24:21.780
diesen ganzen Hosting-Teil, den Publisher-Teil

00:24:21.780 --> 00:24:23.040
ja sozusagen in Django

00:24:23.040 --> 00:24:25.640
irgendwie gebaut

00:24:25.640 --> 00:24:27.700
habe, halt natürlich nicht das, was das Ding

00:24:27.700 --> 00:24:29.740
macht, aber halt so rudimentär, dass man damit halt

00:24:29.740 --> 00:24:31.680
irgendwie für die Anforderungen,

00:24:31.720 --> 00:24:33.100
die wir haben, das halt so halbwegs hinbekommt

00:24:33.100 --> 00:24:34.360
und

00:24:34.360 --> 00:24:37.560
ja, dachte,

00:24:37.560 --> 00:24:39.640
vielleicht kann ich da so ein paar interessante Anregungen mitnehmen,

00:24:39.640 --> 00:24:41.760
was man da eigentlich alles noch so tun kann und worauf man

00:24:41.760 --> 00:24:43.800
aufpassen muss und so und ich fand

00:24:43.800 --> 00:24:45.700
es sehr unterhaltsam und ich fand es auch

00:24:45.700 --> 00:24:47.720
interessant in welche Probleme sie dabei reingelaufen

00:24:47.720 --> 00:24:48.100
sind

00:24:48.100 --> 00:24:51.620
zum Beispiel einfach mal so

00:24:51.620 --> 00:24:53.640
ein bisschen so, ich meine, oder könnt ihr euch das

00:24:53.640 --> 00:24:55.160
schon vorstellen, was man so für Probleme kriegt, wenn man

00:24:55.160 --> 00:24:57.760
WordPress als Hosting-Plattform nimmt und dann

00:24:57.760 --> 00:24:58.480
ein Plugin hat?

00:25:00.540 --> 00:25:01.820
Nö, ich glaube da gibt es keine

00:25:01.820 --> 00:25:03.900
keine Sicherheit-Probleme

00:25:03.900 --> 00:25:04.780
und auch keine

00:25:04.780 --> 00:25:07.740
Interabhängigkeiten und auch

00:25:07.740 --> 00:25:09.600
keine Dependency-Hell, gar nichts. Ich glaube nicht, dass

00:25:09.600 --> 00:25:12.340
ist nötig. Das ist ja klick, klick und funktioniert.

00:25:13.600 --> 00:25:15.560
Ja, also das ist halt, ich meine, das ist halt so

00:25:15.560 --> 00:25:17.720
eine, das ist natürlich super zugänglich und

00:25:17.720 --> 00:25:19.460
das funktioniert überall und

00:25:19.460 --> 00:25:21.880
insofern kann ich das natürlich in gewisser

00:25:21.880 --> 00:25:23.500
Weise verstehen, dass man das macht, weil man halt

00:25:23.500 --> 00:25:25.820
sozusagen, wenn man nicht benutzt

00:25:25.820 --> 00:25:27.820
wird, dann hilft einem das natürlich auch alles nicht.

00:25:28.680 --> 00:25:29.680
Aber wenn man es,

00:25:29.760 --> 00:25:31.720
wenn es dann benutzt wird und es ist halt ein WordPress

00:25:31.720 --> 00:25:33.820
Plugin, dann hat man halt auch einen Haufen Probleme,

00:25:33.880 --> 00:25:35.700
die man sonst nicht hätte. Unter anderem

00:25:35.700 --> 00:25:37.700
also der arme Mensch, der das dann erzählt

00:25:37.700 --> 00:25:39.420
hatte, ich hätte leider den Namen auch gerade nicht

00:25:39.420 --> 00:25:41.580
verraten, der da schon ganz lange dran rum

00:25:41.580 --> 00:25:42.700
entwickelt,

00:25:43.460 --> 00:25:45.480
erzählte dann so, ja, also wir

00:25:45.480 --> 00:25:46.740
haben das, also irgendwann

00:25:46.740 --> 00:25:49.660
wollten Leute dann so Statistik haben auch und dann

00:25:49.660 --> 00:25:50.980
hm,

00:25:51.440 --> 00:25:53.400
dann liefen aber die Statistikjobs irgendwie

00:25:53.400 --> 00:25:55.180
so ein bisschen länger und

00:25:55.180 --> 00:25:57.400
naja, normalerweise so

00:25:57.400 --> 00:25:58.980
WordPress, das läuft dann halt auf

00:25:58.980 --> 00:26:01.420
Hostern irgendwo und die

00:26:01.420 --> 00:26:03.320
beenden die Prozesse halt immer

00:26:03.320 --> 00:26:04.520
so nach einer Minute ungefähr.

00:26:06.280 --> 00:26:06.720
Weil

00:26:06.720 --> 00:26:09.580
normalerweise ist das kein gutes Zeichen, wenn dein

00:26:09.580 --> 00:26:11.000
Web-Request länger als eine Minute läuft

00:26:11.000 --> 00:26:13.440
und dann schießt man den lieber weg,

00:26:13.560 --> 00:26:14.740
weil wahrscheinlich ist der eh kaputt

00:26:14.740 --> 00:26:16.220
und

00:26:16.220 --> 00:26:19.260
naja, du blockierst ja auch einen

00:26:19.260 --> 00:26:21.200
Worker komplett sozusagen und das sind ja

00:26:21.200 --> 00:26:23.420
Shared-Hoster und da gibt es ja ganz viele Leute

00:26:23.420 --> 00:26:25.320
und dann blockierst du ja deren Ressourcen,

00:26:25.420 --> 00:26:27.540
das heißt, ja, nicht so gut

00:26:27.540 --> 00:26:29.260
und jetzt musst du halt aber

00:26:29.260 --> 00:26:30.720
irgendwie um diese

00:26:30.720 --> 00:26:33.340
Beschränkungen drumherum programmieren,

00:26:34.100 --> 00:26:35.560
weil sowas wie

00:26:35.560 --> 00:26:39.880
Background Tasks oder irgendwie Task Queue System oder so, hast du halt nicht.

00:26:40.880 --> 00:26:44.360
Du hast halt auch nicht irgendwelche Maschinen mit Workern, die dann halt Sachen abarbeiten oder so.

00:26:44.400 --> 00:26:47.300
Das gibt es halt einfach alles nicht. Und du musst halt alles in Requests abhandeln.

00:26:47.420 --> 00:26:51.300
Das heißt, du musst darauf warten, dass ein Request vorbeikommt und dann guckst du halt in eine Kontaktverwaltung

00:26:51.300 --> 00:26:55.140
und guckst halt, ob jetzt gerade irgendwas laufen muss und wenn ja, dann läuft das halt in deinem Request.

00:26:56.280 --> 00:27:00.440
Und derjenige, der die Webseite aufgerufen hat, der hat halt ein bisschen Pech gehabt und der muss halt länger warten.

00:27:01.800 --> 00:27:05.340
Aber du musst halt aufpassen. Wenn es länger dauert als eine Minute oder wenn du dich diesem Bereich näherst,

00:27:05.340 --> 00:27:35.320
und Jochen unterhalten sich über die Programmiersprache Python

00:27:35.340 --> 00:27:37.840
Sie wollten irgendwann die Podcast-Logos anzeigen

00:27:37.840 --> 00:27:38.500
und

00:27:38.500 --> 00:27:42.840
da gibt es ja die von iTunes

00:27:42.840 --> 00:27:45.380
geforderten Größen, also so 3000x3000

00:27:45.380 --> 00:27:46.880
Pixel, das ist ein bisschen groß.

00:27:47.820 --> 00:27:49.260
Dann haben sie gesagt, okay, das rechnen wir einfach

00:27:49.260 --> 00:27:51.420
ein bisschen runter und dann, ah, oh Mist,

00:27:51.520 --> 00:27:52.700
so einfach kann man das aber nicht machen.

00:27:53.280 --> 00:27:55.580
Man muss ja irgendwie berücksichtigen, dass auf unterschiedlichen

00:27:55.580 --> 00:27:57.280
Monitorgrößen die Dinge

00:27:57.280 --> 00:27:59.160
unterschiedliche viele Pixel haben müssen und so.

00:27:59.660 --> 00:28:01.360
Und wie macht man denn das und was sind die Standardlösungen

00:28:01.360 --> 00:28:02.980
von WordPress? Und dann haben sie gesehen, so, oh,

00:28:02.980 --> 00:28:04.660
es gibt keine. Und

00:28:04.660 --> 00:28:06.200
Das Problem hat mich ja auch schon

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

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

00:28:11.080 --> 00:28:12.280
Und ja,

00:28:12.480 --> 00:28:14.560
dann mussten wir das halt auch irgendwie selber

00:28:14.560 --> 00:28:16.560
bauen, wo man sich denkt, ja, das Problem hatte ich

00:28:16.560 --> 00:28:18.180
halt auch schon, das muss ich dann auch selber bauen.

00:28:19.060 --> 00:28:20.560
Aber, was

00:28:20.560 --> 00:28:22.460
das Ganze halt deutlich schwerer macht, ist halt, wenn du

00:28:22.460 --> 00:28:24.280
nicht selber das alles installiert hast und deine

00:28:24.280 --> 00:28:26.400
Abhängigkeiten definiert hast, dann hast du halt

00:28:26.400 --> 00:28:28.760
machst du das vielleicht mit ImageMagick oder so

00:28:28.760 --> 00:28:29.160
auf

00:28:29.160 --> 00:28:32.680
in zehn unterschiedlichen Variationen

00:28:32.680 --> 00:28:34.460
über alle möglichen Hoster, die halt alle möglichen

00:28:34.460 --> 00:28:36.500
unterschiedlichen Versionen

00:28:36.500 --> 00:28:37.340
davon installiert haben.

00:28:38.620 --> 00:28:40.680
Und dann musst du halt

00:28:40.680 --> 00:28:42.860
Code schreiben, der mit 10 unterschiedlichen

00:28:42.860 --> 00:28:45.080
Versionen von irgendeiner Bildbearbeitungsgeschichte

00:28:45.080 --> 00:28:46.560
klarkommt, was natürlich totaler

00:28:46.560 --> 00:28:48.780
das ist natürlich gruselig alles.

00:28:49.700 --> 00:28:49.720
Ja.

00:28:50.940 --> 00:28:52.780
Ja, und

00:28:52.780 --> 00:28:54.840
genau all diese

00:28:54.840 --> 00:28:56.520
Dinge und ja, ich meine,

00:28:57.240 --> 00:28:58.520
kann man sich ja auch mal selber anhören,

00:28:58.780 --> 00:29:00.840
also es war schon

00:29:00.840 --> 00:29:02.740
interessant und ich fand das auch total cool, was sie da

00:29:02.740 --> 00:29:04.640
alles irgendwie mit hingekriegt haben und

00:29:04.640 --> 00:29:06.860
rausgeholt haben. Auf der anderen Seite würde ich

00:29:06.860 --> 00:29:08.780
jetzt sagen, wenn man jetzt nochmal anfängt mit

00:29:08.780 --> 00:29:10.900
sowas, dann nimmt man doch vielleicht lieber

00:29:10.900 --> 00:29:22.670
irgendwie ein richtiges Framework zum Entwickeln von Webseiten und nicht irgendwie ein WordPress Naja das Problem ist was du jetzt gerade gesagt hast nimmt man vielleicht lieber ist nat nett

00:29:23.090 --> 00:29:23.950
wenn man dann weiß, wie es geht.

00:29:24.910 --> 00:29:26.890
Nee, ich glaube, das war tatsächlich Absicht,

00:29:27.190 --> 00:29:28.550
dass das so, weil

00:29:28.550 --> 00:29:30.650
die Frage war,

00:29:30.790 --> 00:29:32.910
wie kommt man halt zu einer User-Basis?

00:29:34.170 --> 00:29:34.990
Und das

00:29:34.990 --> 00:29:37.090
geht halt nur, wenn man dahin geht, wo die Leute sind

00:29:37.090 --> 00:29:39.050
und die sind halt bei WordPress, oder waren sie

00:29:39.050 --> 00:29:40.130
auf jeden Fall zumindest damals

00:29:40.130 --> 00:29:43.310
zu mehr oder weniger 100%.

00:29:43.310 --> 00:29:45.070
Ich weiß nicht, ob sich das groß geändert hat.

00:29:45.590 --> 00:29:46.730
Ja doch, es gibt mittlerweile Hoster.

00:29:47.130 --> 00:29:49.030
Es gibt zum Beispiel Podijay

00:29:49.030 --> 00:29:51.390
als Podcast-Hoster,

00:29:51.490 --> 00:29:53.450
der inzwischen auch relativ groß ist

00:29:53.450 --> 00:29:53.830
und

00:29:53.830 --> 00:29:57.210
einer der Gründer davon

00:29:57.210 --> 00:29:59.090
war halt auch bei einem von diesen

00:29:59.090 --> 00:30:01.090
Podcast-Episoden zu Gast

00:30:01.090 --> 00:30:01.890
und der erzählt dann so,

00:30:02.190 --> 00:30:04.830
wir haben das dann auch gemacht,

00:30:04.830 --> 00:30:06.510
irgendwie so Podcast-Hosting gebaut,

00:30:06.650 --> 00:30:07.790
aber wir haben dann Ruby und Rails genommen.

00:30:07.910 --> 00:30:09.230
Ja, okay.

00:30:10.130 --> 00:30:11.630
Das ist schon mal eine deutlich bessere Wahl.

00:30:12.010 --> 00:30:13.770
Also ich würde auch, wenn ich

00:30:13.770 --> 00:30:15.770
so spontan sagen müsste, so Ruby on Rails ist wahrscheinlich

00:30:15.770 --> 00:30:17.750
eine gute Wahl oder eben Django wahrscheinlich

00:30:17.750 --> 00:30:19.750
auch, um sowas zu bauen, weil

00:30:19.750 --> 00:30:21.770
da hat man halt einen Großteil von dem ganzen Kram,

00:30:21.830 --> 00:30:23.390
den man braucht, der ist da halt schon einfach drin.

00:30:25.490 --> 00:30:25.830
Oder

00:30:25.830 --> 00:30:26.810
nachladbar zumindest.

00:30:27.810 --> 00:30:29.710
Und man hat halt Wege

00:30:29.710 --> 00:30:30.710
damit umzugehen

00:30:30.710 --> 00:30:33.610
und das macht es halt dann natürlich schon mal deutlich

00:30:33.610 --> 00:30:35.650
einfacher. Auf der anderen Seite ist es

00:30:35.650 --> 00:30:37.250
dann halt so, wenn du jetzt aber

00:30:37.250 --> 00:30:37.730
eigentlich

00:30:37.730 --> 00:30:41.290
die ganzen

00:30:41.290 --> 00:30:44.610
Podcasts, Blogs, die es da draußen gibt,

00:30:44.690 --> 00:30:46.010
unterstützen möchtest in dem, was sie tun.

00:30:46.930 --> 00:30:48.750
Ja, ist halt schwierig. Da musst du halt dann irgendwas für

00:30:48.750 --> 00:30:50.250
WordPress entwickeln. Das ist natürlich nicht so

00:30:50.250 --> 00:30:52.670
einfach. Also ich weiß es nicht. Ich habe keine Antwort darauf.

00:30:54.130 --> 00:30:54.250
Ja.

00:30:54.970 --> 00:30:56.650
Aber ich fand es halt interessant, dass das halt

00:30:56.650 --> 00:30:58.410
sich da so entwickelt hat.

00:30:58.970 --> 00:31:00.850
Und deswegen kam ich eigentlich drauf.

00:31:01.390 --> 00:31:02.810
Die haben dann nochmal versucht,

00:31:02.850 --> 00:31:04.750
das alles komplett neu zu bauen und zwar in

00:31:04.750 --> 00:31:05.170
Elixir.

00:31:05.170 --> 00:31:07.030
Aha

00:31:07.030 --> 00:31:10.030
Die Katze beißt sich in den Schwanz

00:31:10.030 --> 00:31:12.750
Genau und eigentlich eine ganz gute Idee

00:31:12.750 --> 00:31:14.790
aber das ist dann

00:31:14.790 --> 00:31:16.050
irgendwie auch nicht so richtig

00:31:16.050 --> 00:31:18.190
dann fertig geworden

00:31:18.190 --> 00:31:21.150
aber im Prinzip würde ich auch sagen

00:31:21.150 --> 00:31:22.570
ja so Elixir klingt schon mal deutlich besser

00:31:22.570 --> 00:31:23.310
Ja

00:31:23.310 --> 00:31:26.930
Und das hat nicht gemacht, weil man das

00:31:26.930 --> 00:31:29.050
mit Asim so toll machen kann bei Elixir

00:31:29.050 --> 00:31:30.570
Ja, weil du damit halt auch

00:31:30.570 --> 00:31:33.230
die harten Probleme lösen kannst

00:31:33.230 --> 00:31:35.270
und du querst dich mehr, kannst du mit dem Maus hinterher spielen.

00:31:35.670 --> 00:31:37.190
Ja, nee, das ist gut, aber

00:31:37.190 --> 00:31:39.230
das ist nochmal eher solche Sachen

00:31:39.230 --> 00:31:41.390
wie, du willst ja auch zum Beispiel die Files

00:31:41.390 --> 00:31:42.270
irgendwie

00:31:42.270 --> 00:31:45.230
distributieren, zum Beispiel.

00:31:46.590 --> 00:31:47.310
Und du kannst

00:31:47.310 --> 00:31:49.190
natürlich ein CDN nehmen, aber ich merke das jetzt auch

00:31:49.190 --> 00:31:51.150
irgendwie, so CDN ist halt

00:31:51.150 --> 00:31:52.930
einmal teuer und

00:31:52.930 --> 00:31:54.890
ja, also weiß nicht,

00:31:55.690 --> 00:31:57.150
wäre eigentlich schon cooler, das selber

00:31:57.150 --> 00:31:59.270
machen zu können, aber dann ist halt wieder blöd.

00:31:59.370 --> 00:32:01.510
Also das kannst du dann nicht irgendwie mit einem WordPress-Plugin

00:32:01.510 --> 00:32:02.450
machen, da kannst du keine Files haben.

00:32:02.450 --> 00:32:04.470
oder jedenfalls, kann man schon, aber

00:32:04.470 --> 00:32:06.230
das...

00:32:06.230 --> 00:32:08.090
Was ist mit einem selbst gehochten Minio oder sowas?

00:32:09.270 --> 00:32:09.910
Äh, ja,

00:32:10.150 --> 00:32:12.570
ja, ja, gut, aber...

00:32:12.570 --> 00:32:14.790
Ist halt auch kein CDN, hast ja auch keine...

00:32:14.790 --> 00:32:16.450
Wenn du globale Infrastruktur

00:32:16.450 --> 00:32:18.210
haben willst... Also du meinst, die

00:32:18.210 --> 00:32:20.330
Verteilung über mehrere Länder hinweg ist sonst kompliziert?

00:32:21.810 --> 00:32:22.550
Ja, auch

00:32:22.550 --> 00:32:24.370
generell die schnelle Anbindung, wenn du halt sehr

00:32:24.370 --> 00:32:26.490
viele große Dateien hosten willst,

00:32:27.390 --> 00:32:28.090
ist nicht ganz

00:32:28.090 --> 00:32:30.450
simpel, das performant hinzukriegen.

00:32:30.450 --> 00:32:32.330
Der Vorteil bei Elixir wäre, du kannst halt

00:32:32.330 --> 00:32:34.250
alles damit machen. Du kannst

00:32:34.250 --> 00:32:36.430
halt da dein File-Verwaltungs-

00:32:36.430 --> 00:32:38.250
Dings mitmachen, genauso wie dein

00:32:38.250 --> 00:32:40.050
Backend für irgendwie

00:32:40.050 --> 00:32:41.950
dein Frontend und

00:32:41.950 --> 00:32:43.950
du musst eigentlich nie

00:32:43.950 --> 00:32:46.290
diese Umgebung verlassen und

00:32:46.290 --> 00:32:47.310
kannst da drin halt alles bauen.

00:32:47.890 --> 00:32:50.190
Warum ist das denn für alles geeignet?

00:32:50.210 --> 00:32:52.030
Das hört sich an, als würdest du den Podcast umbenennen wollen.

00:32:53.650 --> 00:32:54.510
Noch nicht, nein.

00:32:54.870 --> 00:32:56.330
Lernst du denn Elixier

00:32:56.330 --> 00:32:58.490
oder ist es nur ein Knight, der aus dir spricht?

00:32:59.110 --> 00:33:00.110
Ja, es ist schon ein Knight

00:33:00.110 --> 00:33:00.770
auch, ja.

00:33:02.330 --> 00:33:06.470
Ich habe tatsächlich auch hier so

00:33:06.470 --> 00:33:08.250
Alexir in Action oder sowas Buch rumliegen

00:33:08.250 --> 00:33:10.130
Ich habe auch schon mal reingeguckt, aber ich habe es noch nicht

00:33:10.130 --> 00:33:12.210
Das diffundiert jetzt durch dein Kopfkissen

00:33:12.210 --> 00:33:13.130
durch in deinen Kopf

00:33:13.130 --> 00:33:14.970
Genau, das hoffe ich mir davon

00:33:14.970 --> 00:33:16.570
Mal schauen, was ist die beste Methode

00:33:16.570 --> 00:33:20.130
Ich habe auch noch so ein, zwei Bücher unter dem Kopfkissen

00:33:20.130 --> 00:33:22.430
Bei Alexir

00:33:22.430 --> 00:33:24.110
habe ich auch immer das Gefühl, ich hätte gerne

00:33:24.110 --> 00:33:26.290
die Zeit schon reingesteckt, das mal gelernt zu haben

00:33:26.290 --> 00:33:28.010
Aber jetzt habe ich doch auch keine Lust

00:33:28.010 --> 00:33:29.150
das gerade jetzt zu machen

00:33:29.150 --> 00:33:32.110
Ja, aber Jochen, erklär mal

00:33:32.110 --> 00:33:33.830
Warum ist das so?

00:33:34.830 --> 00:33:36.290
Ja, Kekse sind ein großes Thema.

00:33:36.490 --> 00:33:38.110
Also was halt auch

00:33:38.110 --> 00:33:40.070
eben, weshalb ich das jetzt auch so betont habe,

00:33:40.190 --> 00:33:41.830
man kann damit halt alles machen, du kannst damit halt auch

00:33:41.830 --> 00:33:43.750
Files serven und kriegst halt, also zum Beispiel,

00:33:43.990 --> 00:33:45.150
irgendwie nehmen wir dieses Problem von Hand,

00:33:45.190 --> 00:33:48.070
in dem Django-Channel ja auch schon ein paar Mal

00:33:48.070 --> 00:33:50.110
private Files serven

00:33:50.650 --> 00:33:51.890
oder sowas.

00:33:52.390 --> 00:33:53.330
Wenn du das jetzt irgendwie,

00:33:53.890 --> 00:33:55.910
nehmen wir an, du nimmst jetzt mal Django als

00:33:55.910 --> 00:33:57.610
deine Podcast-Hosting-Plattform

00:33:57.610 --> 00:34:00.110
und jetzt willst du aber sowas auch

00:34:00.110 --> 00:34:02.090
haben, vielleicht wie private Podcasts

00:34:02.090 --> 00:34:04.150
keine Ahnung, wenn es was gibt, keine Ahnung, ich weiß es nicht,

00:34:04.210 --> 00:34:05.690
aber du willst irgendwie den Zugriff beschränken.

00:34:05.690 --> 00:34:07.870
Oder Bilder oder so von der Familie.

00:34:08.010 --> 00:34:09.430
Deine geheimen Vertragsdaten.

00:34:09.550 --> 00:34:11.430
Ja, irgendwie sowas. Dann

00:34:11.430 --> 00:34:13.710
ist das halt nicht mehr so ganz einfach,

00:34:13.890 --> 00:34:15.970
weil die Files kannst du ja

00:34:15.970 --> 00:34:17.790
auch nicht mit Django direkt ausliefern, wenn du

00:34:17.790 --> 00:34:19.470
das jetzt mal so die Folgen erst abgreifst.

00:34:19.670 --> 00:34:21.350
Kannst du schon, ist halt aber dann

00:34:21.350 --> 00:34:25.890
nicht so gut, wenn da viele Leute gleichzeitig

00:34:25.890 --> 00:34:27.110
drauf zugreifen, geht das nicht so gut.

00:34:28.110 --> 00:34:29.750
Auf der anderen Seite kann eigentlich nur

00:34:29.750 --> 00:34:31.670
Django bzw. der Applikationsserver

00:34:31.670 --> 00:34:33.050
entscheiden, ob jetzt...

00:34:33.050 --> 00:34:37.890
Ob ein Request autorisiert ist oder nicht.

00:34:38.530 --> 00:34:39.410
Der Dominik bezweifelt

00:34:39.410 --> 00:34:39.970
unseren Erfolg.

00:34:40.490 --> 00:34:40.970
Wieso?

00:34:43.130 --> 00:34:44.550
Privat und viele Leute gleichzeitig.

00:34:44.750 --> 00:34:46.050
Natürlich, in unserer coolen Gang

00:34:46.050 --> 00:34:47.730
laden viele Leute...

00:34:47.730 --> 00:34:50.570
Das passiert relativ schnell. Das passiert möglicherweise schon mit einem Browser.

00:34:50.690 --> 00:34:51.490
Kriegst du das halt schon hin.

00:34:52.530 --> 00:34:54.530
Also wenn du halt irgendwie da...

00:34:54.530 --> 00:34:56.210
Wenn du mittlere Maus hast, dann mach dir einen neuen Tab auf.

00:34:56.770 --> 00:34:57.990
Ja, wenn du einen neuen Tab aufmachst.

00:34:57.990 --> 00:35:00.110
Wenn du zehn Bilder auf einer Seite hast,

00:35:00.210 --> 00:35:01.450
dann ist es schon vorbei.

00:35:01.670 --> 00:35:05.150
Das heißt, du kriegst das schon mit einem Browser hin

00:35:05.150 --> 00:35:06.670
Also, wenn du jetzt

00:35:06.670 --> 00:35:08.390
ich weiß nicht, wie viel Work hat du normalerweise

00:35:08.390 --> 00:35:10.490
wenn du jetzt eine billige VM hast

00:35:10.490 --> 00:35:12.010
auf Hexner oder weiß nicht

00:35:12.010 --> 00:35:15.010
dann ist halt, wenn du da nur ein paar Prozesse

00:35:15.010 --> 00:35:16.570
laufen hast, dann sind die halt schon mit einem

00:35:16.570 --> 00:35:17.770
Request ausgelastet

00:35:17.770 --> 00:35:20.590
Was ist jetzt mit Xcent-File?

00:35:21.230 --> 00:35:22.570
Genau, das wäre dann halt

00:35:22.570 --> 00:35:24.810
sozusagen eine Möglichkeit, das Problem zu lösen

00:35:24.810 --> 00:35:26.750
dass man halt, dass der Request

00:35:26.750 --> 00:35:28.530
an den Applikationsverfahrer geht, der

00:35:28.530 --> 00:35:30.710
überprüft, ob der autorisiert ist

00:35:30.710 --> 00:35:32.510
oder nicht und schickt dann halt ein Header

00:35:32.510 --> 00:35:34.190
zurück in der Response. Ja,

00:35:34.890 --> 00:35:36.890
also dieser Request sah gut aus

00:35:36.890 --> 00:35:38.630
und dann geht jetzt irgendwas in der

00:35:38.630 --> 00:35:40.630
Proxy-Pipeline in Nginx oder so hin,

00:35:41.250 --> 00:35:42.830
sieht diesen Header in der Response

00:35:42.830 --> 00:35:44.650
und sagt, ah, das war

00:35:44.650 --> 00:35:46.330
eigentlich eine File-Response, aber

00:35:46.330 --> 00:35:48.470
der Applikations-Server kann ja jetzt keine Files zurückschicken,

00:35:48.570 --> 00:35:50.610
das wäre ja blöd, dann bleibt

00:35:50.610 --> 00:35:52.590
ja die ganze Zeit die Verbindung offen und es gibt nicht so viele

00:35:52.590 --> 00:35:54.590
Applikations-Server, daher nehme ich

00:35:54.590 --> 00:35:56.290
jetzt mal diesen Request, diese Response

00:35:56.290 --> 00:35:58.550
und tausche die aus durch eine File-Response

00:35:58.550 --> 00:36:01.850
mit dem echten File, auf das ich Zugriff habe

00:36:01.850 --> 00:36:03.510
und schickt das zurück.

00:36:03.670 --> 00:36:05.550
Ja, da ist die Konfiguration dann doch wieder eigentlich

00:36:05.550 --> 00:36:07.670
relativ plippal, weil in den X einen Eintrag

00:36:07.670 --> 00:36:09.350
macht, der dann dieses X-File

00:36:09.350 --> 00:36:10.550
Response send.

00:36:11.350 --> 00:36:13.490
Ja, aber auf jeden Fall Nginx benutzen.

00:36:13.550 --> 00:36:13.810
Genau.

00:36:14.670 --> 00:36:17.070
Aber Jochen, warum ist denn das jetzt besser?

00:36:17.170 --> 00:36:18.470
Warum ist denn das besser, wenn der

00:36:18.470 --> 00:36:21.050
Nginx das macht, anstatt dass unser

00:36:21.050 --> 00:36:22.870
Django, unser Gyrdokon oder so was...

00:36:22.870 --> 00:36:25.150
Bei dem Nginx ist das halt egal, wenn da

00:36:25.150 --> 00:36:26.450
tausend Requests reinkommen.

00:36:26.450 --> 00:36:29.150
Aber warum? Warum ist das dem egal und warum ist es uns nicht egal?

00:36:30.010 --> 00:36:30.790
Ja, deswegen

00:36:30.790 --> 00:36:32.770
weil halt sozusagen eine Verbindung

00:36:32.770 --> 00:36:34.670
den Nginx nicht blockiert

00:36:34.670 --> 00:36:36.810
Also selbst wenn er da Daten zurücksendet, dann

00:36:36.810 --> 00:36:38.710
kann er das auf tausend

00:36:38.710 --> 00:36:40.670
Verbindungen gleichzeitig tun, das geht aber

00:36:40.670 --> 00:36:43.190
jetzt bei einem normalen Django-Applikations-

00:36:43.190 --> 00:36:44.530
Server so nicht, sondern da ist der

00:36:44.530 --> 00:36:46.450
Prozess komplett geblockt, weil der halt

00:36:46.450 --> 00:36:48.230
synchron Sachen rausschreibt

00:36:48.230 --> 00:36:50.110
Das heißt, das müsste man an ASCII-Django nehmen

00:36:50.110 --> 00:36:51.650
Der ist quasi

00:36:51.650 --> 00:36:54.470
besser parallel als

00:36:54.470 --> 00:36:55.650
Ja

00:36:55.650 --> 00:36:58.010
ja, also der macht halt

00:36:58.010 --> 00:36:58.690
parallel I.O.

00:37:00.050 --> 00:37:02.290
Und das geht mit Django

00:37:02.290 --> 00:37:04.130
erstmal so nicht, das geht jetzt inzwischen

00:37:04.130 --> 00:37:06.050
auch so ein bisschen, aber erstmal

00:37:06.050 --> 00:37:06.950
nicht so einfach.

00:37:07.670 --> 00:37:09.930
Das Problem, was ich damit habe,

00:37:09.990 --> 00:37:11.650
sozusagen aus der Systemperspektive, ist halt,

00:37:12.250 --> 00:37:13.910
du musst halt einfach nur,

00:37:14.190 --> 00:37:15.950
um diese Konfiguration dann testen zu können,

00:37:16.490 --> 00:37:18.070
wenn du das jetzt lokal überprüfen willst,

00:37:18.130 --> 00:37:19.970
funktioniert das denn alles so, wie ich das gedacht habe,

00:37:20.310 --> 00:37:21.910
dann musst du dann Nginx hochfahren

00:37:21.910 --> 00:37:23.830
und eine Datenbank und

00:37:23.830 --> 00:37:25.070
und deinen Applikationsserver.

00:37:25.350 --> 00:37:28.130
Du kannst es wesentlich nur in der Staging-Umgebung

00:37:28.130 --> 00:37:30.030
testen, oder? Also in der

00:37:30.030 --> 00:37:31.810
Develop-Umgebung hast du die ganzen

00:37:31.810 --> 00:37:33.110
Bauteile ja normalerweise nicht.

00:37:34.110 --> 00:37:35.850
Du kannst schon, dann fährst du halt einen Haufen

00:37:35.850 --> 00:37:36.850
Docker-Container hoch, geht schon.

00:37:37.610 --> 00:37:39.930
Aber das machst du ja nicht zum Entwickeln, sondern das machst du ja wirklich nur

00:37:39.930 --> 00:37:40.770
zum Überprüfen.

00:37:41.890 --> 00:37:43.370
Ja, naja, also

00:37:43.370 --> 00:37:45.530
kann man

00:37:45.530 --> 00:37:46.830
Also gut, ich mach das nicht.

00:37:47.430 --> 00:37:50.010
Dann ist die ganze Liste, die in der Jammer drin ist,

00:37:50.010 --> 00:37:51.070
die wird dann einfach mal hochgefahren.

00:37:51.790 --> 00:37:53.270
Ja, der Punkt ist nur,

00:37:53.270 --> 00:37:55.770
Es ist halt ein Haufen

00:37:55.770 --> 00:37:58.170
Wenn 3 oder 4 so Dinge laufen hat, dann ist schon der Speicher voll

00:37:58.170 --> 00:37:59.810
Jaja, also es ist halt

00:37:59.810 --> 00:38:01.550
aufwendig und es ist halt auch

00:38:01.550 --> 00:38:04.010
irgendwie eine komplizierte Konfiguration und es ist halt

00:38:04.010 --> 00:38:06.050
fehleranfällig und wenn du

00:38:06.050 --> 00:38:08.130
jetzt Elixir verwendest

00:38:08.130 --> 00:38:10.070
dann ist

00:38:10.070 --> 00:38:11.850
das halt alles, dann kannst du das

00:38:11.850 --> 00:38:13.850
lokal testen, du kannst lokal das entwickeln

00:38:13.850 --> 00:38:16.070
und du kannst, deployst es so

00:38:16.070 --> 00:38:17.810
produktiv, natürlich vielleicht mit einer etwas anderen

00:38:17.810 --> 00:38:19.870
Konfiguration, aber mehr oder weniger genauso wie du es

00:38:19.870 --> 00:38:21.890
lokal getestet hast und wenn das dann lokal

00:38:21.890 --> 00:38:23.970
funktioniert, dann funktioniert das dann auch. Und du brauchst keine komplizierte

00:38:23.970 --> 00:38:25.430
Architektur mit irgendwie noch drei anderen

00:38:25.430 --> 00:38:28.130
Teilen, die halt zusammen

00:38:28.130 --> 00:38:29.810
funktionieren müssen, damit es klappt

00:38:29.810 --> 00:38:31.950
insgesamt. Und das hat natürlich einen gewissen

00:38:31.950 --> 00:38:32.950
Reiz. Also ich meine,

00:38:33.490 --> 00:38:36.050
ich entwickle auch viel mit Docker, weil

00:38:36.050 --> 00:38:37.830
das halt, ja,

00:38:37.930 --> 00:38:39.930
bei ganz vielen Leuten wahrscheinlich so das Mittel der Wahl ist,

00:38:39.990 --> 00:38:41.510
um halt die Entwicklungsumgebung zu vereinheitlichen.

00:38:41.970 --> 00:38:43.490
Und bei mir ist das so, also

00:38:43.490 --> 00:38:45.770
das lüftet, also mein Laptop lüftet

00:38:45.770 --> 00:38:46.930
einfach die ganze Zeit.

00:38:48.090 --> 00:38:48.990
Achso, stimmt, das war noch mal.

00:38:49.410 --> 00:38:51.730
Und wenn ich das vom Strom abstecke, dann dauert das eine Stunde und dann ist

00:38:51.730 --> 00:38:56.710
Akku leer und das ist halt irgendwie eigentlich kein schöner Zustand, aber so ist es halt.

00:38:57.390 --> 00:38:58.690
Also das ist bei mir nicht so, Jochen.

00:39:00.130 --> 00:39:01.470
Ja, wenn man jetzt nicht Docker...

00:39:01.470 --> 00:39:02.330
Das ist eine andere Konfiguration.

00:39:04.090 --> 00:39:08.730
Ich versuche auch gerade so ein bisschen wieder von dem Docker-Satz runterzukommen, weil das ist halt echt das...

00:39:09.490 --> 00:39:12.410
Ach ja, und jetzt bei den neuen Macs geht das ja auch gar nicht mehr.

00:39:12.750 --> 00:39:14.730
Die haben keine Virtualisierungsunterstützung.

00:39:16.090 --> 00:39:17.690
Okay, cool. Wie war der Fortschritt?

00:39:17.690 --> 00:39:21.130
Es gibt keine Virtualisierungsunterstützung, also kein Parallels oder was?

00:39:21.130 --> 00:39:21.270
oder?

00:39:22.650 --> 00:39:24.590
What? Wegen ARM? Warum?

00:39:25.690 --> 00:39:26.910
Ja, ich weiß nicht,

00:39:26.950 --> 00:39:28.790
ob das noch kommt oder so, aber einen Tag

00:39:28.790 --> 00:39:30.630
gibt es das auf jeden Fall nicht. Ach cool, dann muss man sich

00:39:30.630 --> 00:39:31.310
endlich eine Hand schaffen.

00:39:32.690 --> 00:39:33.250
Wirklich nicht.

00:39:33.550 --> 00:39:34.750
Ich brauche dann zwei

00:39:34.750 --> 00:39:37.150
für Windows

00:39:37.150 --> 00:39:38.810
und einen für Microsoft.

00:39:40.370 --> 00:39:40.850
Ja gut, aber

00:39:40.850 --> 00:39:42.810
ich meine, wie man seine

00:39:42.810 --> 00:39:44.390
Entwicklungsumgebung betreibt und

00:39:44.390 --> 00:39:46.790
warum man das wie macht, das ist ja so ein bisschen

00:39:46.790 --> 00:39:48.770
freigestellt. Aber der

00:39:48.770 --> 00:39:51.070
eigentliche Hintergrund

00:39:51.070 --> 00:39:53.090
ist doch halt wirklich der, dass man in Python

00:39:53.090 --> 00:39:54.630
einfach daran gebunden ist,

00:39:56.070 --> 00:39:56.950
dass jeder

00:39:56.950 --> 00:39:58.910
Worker einen Request bearbeiten kann, weil

00:39:58.910 --> 00:40:00.490
die halt nicht parallel arbeiten können.

00:40:01.130 --> 00:40:03.030
Und in Delixia ist es halt nicht so, weil

00:40:03.030 --> 00:40:04.950
die VM, auf der

00:40:04.950 --> 00:40:06.870
es läuft, halt super parallel ist, weil die alles

00:40:06.870 --> 00:40:07.870
gleichzeitig machen können.

00:40:09.970 --> 00:40:10.870
Auch hier wieder

00:40:10.870 --> 00:40:12.370
mit dem Hintergrund halt, dass das aus einem

00:40:12.370 --> 00:40:15.030
Telekommunikations-Background

00:40:15.030 --> 00:40:16.690
kommt und wenn die Hardware nur

00:40:16.690 --> 00:40:18.630
ein Telefonat gleichzeitig machen kann,

00:40:19.390 --> 00:40:20.810
dann ist das halt ziemlich blöd und

00:40:20.810 --> 00:40:23.910
und es ist besser, wenn man tausend Telefonate gleichzeitig macht.

00:40:23.910 --> 00:40:26.710
Das erinnert mich an die 90er, wo mein Dad mich die ganze Zeit angeschrien hat,

00:40:26.810 --> 00:40:29.330
geh aus dem Internet, ich will telefonieren.

00:40:29.850 --> 00:40:33.970
Und wenn ihr da halt so einen Knotenpunkt gehabt hättet, dann hättet ihr vielleicht mehrere Sachen.

00:40:34.370 --> 00:40:38.870
Aber so Telefonate haben ja auch üblicherweise sehr strenge Real-Time-Anforderungen.

00:40:39.170 --> 00:40:41.850
Das heißt, es reicht ja nicht, tausend Sachen gleichzeitig zu machen,

00:40:41.930 --> 00:40:44.550
sondern du musst ja tausend Real-Time-Sachen gleichzeitig machen.

00:40:45.850 --> 00:40:50.410
Und dann ist dieses sowieso schon schwierige Problem nochmal direkt ein kleines bisschen,

00:40:50.810 --> 00:40:51.870
noch viel schwieriger geworden.

00:40:53.410 --> 00:40:53.630
Und

00:40:53.630 --> 00:40:56.750
das ist so ein bisschen für mich das

00:40:56.750 --> 00:40:58.790
Coole an dieser ganzen Erlangen und

00:40:58.790 --> 00:41:00.790
Elixir-Sache, weil die halt einfach eine

00:41:00.790 --> 00:41:02.170
Basis haben, eine VM haben,

00:41:02.370 --> 00:41:04.810
die knallhart darauf

00:41:04.810 --> 00:41:06.670
ausgerichtet ist, tausend Sachen gleichzeitig

00:41:06.670 --> 00:41:07.690
in Realtime zu machen.

00:41:08.490 --> 00:41:10.710
Und wenn man das braucht, dann ist das

00:41:10.710 --> 00:41:12.630
eine absolut geniale Sache. Und das ist, glaube ich, eben

00:41:12.630 --> 00:41:14.730
in so einem Web-Umfeld kann das wirklich was sein, wo man das

00:41:14.730 --> 00:41:16.630
einfach ausnutzen kann, wo du halt wirklich sagen kannst,

00:41:16.710 --> 00:41:18.690
okay, da kommen Dateien rüber, da

00:41:18.690 --> 00:41:20.690
kommen Authentifizierungen rüber, da

00:41:20.690 --> 00:41:21.750
kommt alles drüber.

00:41:24.210 --> 00:41:24.430
Und

00:41:24.430 --> 00:41:26.670
ja, das ist auch so ein bisschen

00:41:26.670 --> 00:41:28.570
die Faszination, das ist der Grund,

00:41:28.690 --> 00:41:30.770
warum ich das gerne mal gelernt gehabt hätte.

00:41:32.310 --> 00:41:32.890
Ja, oder

00:41:32.890 --> 00:41:34.870
noch ein Beispiel, wo das vielleicht ein bisschen deutlicher

00:41:34.870 --> 00:41:36.310
wird. Ich habe jetzt gerade nochmal kurz

00:41:36.310 --> 00:41:38.490
drüber nachgedacht. Also wenn man jetzt zum Beispiel

00:41:38.490 --> 00:41:41.210
etwas, was man

00:41:41.210 --> 00:41:42.810
häufig nicht hinkriegt,

00:41:43.010 --> 00:41:44.570
es gibt so eigentlich,

00:41:44.630 --> 00:41:46.070
was man gerne hätte eigentlich,

00:41:46.690 --> 00:41:48.190
ist dieses HLS,

00:41:48.190 --> 00:41:49.230
also HTTP,

00:41:49.230 --> 00:41:51.730
Live Streaming.

00:41:52.770 --> 00:41:53.330
Sozusagen,

00:41:53.510 --> 00:41:55.150
das ist ein Standard.

00:41:55.630 --> 00:41:57.370
Im Grunde, das zahkt halt große Dateien

00:41:57.370 --> 00:41:57.970
in viele kleine.

00:41:59.690 --> 00:42:01.550
Aber du brauchst halt Server-Unterstützung dafür.

00:42:01.990 --> 00:42:03.650
Wenn du das jetzt gerne anbieten würdest,

00:42:03.710 --> 00:42:05.590
sodass Podcast-Clients das sozusagen

00:42:05.590 --> 00:42:07.030
nutzen können, um halt

00:42:07.030 --> 00:42:09.610
auch auf schlechten Verbindungen und halt auch

00:42:09.610 --> 00:42:10.890
irgendwie Online-Sachen zu streamen,

00:42:11.390 --> 00:42:13.410
dann hast du halt, wenn du jetzt ein normales System baust,

00:42:13.490 --> 00:42:15.470
sag ich jetzt mal, so eben mit Ruby und Rails und keine Ahnung,

00:42:15.550 --> 00:42:16.950
Nginx und so und weißer Teufel,

00:42:16.950 --> 00:42:19.970
hinzukriegen, wird ein echter

00:42:19.970 --> 00:42:21.250
Stunt.

00:42:22.290 --> 00:42:24.010
Während, wenn du das halt alles in Elixir machst,

00:42:24.170 --> 00:42:26.170
dann ist das halt bloß Code, den du schreibst.

00:42:26.390 --> 00:42:28.290
Du musst auch den Standort unterstützen

00:42:28.290 --> 00:42:29.390
und du musst es halt irgendwie hinkriegen.

00:42:29.790 --> 00:42:32.090
Aber das ist halt auch nur dein Applikationscode und nicht

00:42:32.090 --> 00:42:34.150
irgendwie ein großes System, was du da irgendwie

00:42:34.150 --> 00:42:35.070
drumherum konfigurieren musst.

00:42:36.170 --> 00:42:38.250
Und du kannst alle diese Anforderungen

00:42:38.250 --> 00:42:39.530
damit in den Griff kriegen.

00:42:39.770 --> 00:42:41.470
Das hat schon einen gewissen Charme.

00:42:44.110 --> 00:42:45.750
Ja, wir sind einfach tief

00:42:45.750 --> 00:42:48.030
im Web-Server drin.

00:42:48.930 --> 00:42:50.170
Du hast einfach

00:42:50.170 --> 00:42:52.250
die Fähigkeiten, die du

00:42:52.250 --> 00:42:53.130
in dem Nginx hättest.

00:42:53.370 --> 00:42:55.890
Im Prinzip kannst du das ja alles mit Nginx-Modulen machen.

00:42:56.010 --> 00:42:57.270
Kannst du ja Module schreiben.

00:42:58.570 --> 00:42:59.010
Nur, dass

00:42:59.010 --> 00:43:02.110
die Zuhörer haben gerade eben abgeschaltet.

00:43:02.390 --> 00:43:03.130
Die sind schon lange weg.

00:43:03.350 --> 00:43:05.970
Dann muss man das halt möglicherweise auch tun und das will eigentlich keiner.

00:43:06.490 --> 00:43:06.970
Ja, also okay.

00:43:07.830 --> 00:43:09.990
Das kann man mit Caddy und Traffic oder sowas nicht

00:43:09.990 --> 00:43:11.930
einfach machen. Was kann man bei alterer Alternative noch?

00:43:12.150 --> 00:43:13.110
Nein, leider alles nicht.

00:43:13.110 --> 00:43:13.310
Nein.

00:43:13.310 --> 00:43:16.150
also kannst du auch

00:43:16.150 --> 00:43:17.450
kannst du auch in Traffic reinbauen

00:43:17.450 --> 00:43:19.410
musst dann halt in Go programmieren

00:43:19.410 --> 00:43:20.930
kennst du das auch Go oder?

00:43:21.070 --> 00:43:23.110
ja genau kannst halt auch in Go schreiben

00:43:23.110 --> 00:43:25.370
können die beide Module

00:43:25.370 --> 00:43:27.650
die nachleitbare Module

00:43:27.650 --> 00:43:29.630
ja so

00:43:29.630 --> 00:43:30.130
Mittelware

00:43:30.130 --> 00:43:33.230
ja also

00:43:33.230 --> 00:43:35.470
ist auf jeden Fall dann nicht mehr so richtig einfach

00:43:35.470 --> 00:43:37.750
und es ist halt ganz was anderes als die Applikation

00:43:37.750 --> 00:43:39.370
die du dann normalerweise so schreibst

00:43:39.370 --> 00:43:41.130
aber genau

00:43:41.130 --> 00:43:43.870
Genau, also wie kriegt Erlang das denn jetzt eigentlich hin?

00:43:44.890 --> 00:43:47.330
Es verwendet halt das sogenannte

00:43:47.330 --> 00:43:49.130
Actor-Model.

00:43:49.870 --> 00:43:53.250
Uh, das muss ich gleich noch,

00:43:53.570 --> 00:43:55.510
wenn du noch besser klingen willst, musst du sagen,

00:43:55.610 --> 00:43:58.210
Shared Nothing Concurred Programming via Message Parsing.

00:43:59.150 --> 00:43:59.410
Okay.

00:44:01.170 --> 00:44:03.170
Schön, wissen alle Bescheid, oder?

00:44:04.050 --> 00:44:04.750
Fertig für heute.

00:44:06.490 --> 00:44:07.070
Nee, ich bin gerade abgeschlossen.

00:44:07.070 --> 00:44:10.290
Das ist was, was man sehr schnell,

00:44:10.290 --> 00:44:11.930
Ich habe ja mal versucht Erlang zu lernen

00:44:11.930 --> 00:44:16.070
Habe es dann wieder

00:44:16.070 --> 00:44:18.250
aufgegeben, aber das ist so was

00:44:18.250 --> 00:44:20.070
das ist so was konzeptuelles

00:44:20.070 --> 00:44:22.310
was man sehr schnell lernt, wo man sich aber

00:44:22.310 --> 00:44:24.130
ungeheuer schwer nur dran gewöhnen kann

00:44:24.130 --> 00:44:26.490
Also in dem Modell, in dem ich

00:44:26.490 --> 00:44:28.530
üblicherweise so lebe und programmiere

00:44:28.530 --> 00:44:29.150
in Python

00:44:29.150 --> 00:44:32.450
da schreibt man halt Programm und es wird von oben nach unten abgearbeitet

00:44:32.450 --> 00:44:34.350
und wenn ich eine Funktion aufrufe, dann ist das so

00:44:34.350 --> 00:44:36.270
wie wenn ich die Funktion da eben an die Stelle hin

00:44:36.270 --> 00:44:36.830
kopiert hätte

00:44:36.830 --> 00:44:39.710
im Wesentlichen

00:44:39.710 --> 00:44:41.230
so, bis auf so ein paar Ausnahmen mit

00:44:41.230 --> 00:44:43.250
Rekursionen und Scopes und so, ist das

00:44:43.250 --> 00:44:45.150
das Modell, was ich im Kopf habe.

00:44:45.230 --> 00:44:47.210
Wenn ich eine Funktion aufrufe, dann ist das so, wie wenn die

00:44:47.210 --> 00:44:47.770
da jetzt steht.

00:44:49.490 --> 00:44:51.250
Und in Erlang ist das aber nicht so.

00:44:51.370 --> 00:44:53.150
In Erlang ist das Modell

00:44:53.150 --> 00:44:54.510
so ein bisschen anders. Da

00:44:54.510 --> 00:44:57.150
schreibt man ein Programm und es besteht aus ganz vielen

00:44:57.150 --> 00:44:57.690
Prozessen

00:44:57.690 --> 00:45:01.270
und auch, was ein Prozess ist, ist da auch

00:45:01.270 --> 00:45:02.990
erstmal, es wird so ein bisschen, ja,

00:45:03.050 --> 00:45:05.230
ein Prozess ist, stell dir einfach ein Prozess

00:45:05.230 --> 00:45:07.230
vor. Und die können

00:45:07.230 --> 00:45:09.630
sich dann Nachrichten schicken und zwar in ihre Mailboxes.

00:45:09.830 --> 00:45:11.570
Also jeder Prozess hat eine Mailbox

00:45:11.570 --> 00:45:13.230
und da kann man sich Nachrichten hinschicken.

00:45:13.350 --> 00:45:15.310
Und das Einzige, was diese Prozesse machen, ist

00:45:15.310 --> 00:45:17.430
im Wesentlichen Nachrichten

00:45:17.430 --> 00:45:19.230
aus ihren Mailbox abrufen und die

00:45:19.230 --> 00:45:21.210
bearbeiten und anderen Prozessen

00:45:21.210 --> 00:45:22.790
Nachrichten in ihre Mailbox reinschicken.

00:45:24.350 --> 00:45:25.250
Und das ist von der

00:45:25.250 --> 00:45:26.530
Vorstellung her was total

00:45:26.530 --> 00:45:29.130
verrücktes, was total absurdes,

00:45:29.250 --> 00:45:31.150
weil wie kann man denn daraus ein

00:45:31.150 --> 00:45:32.270
funktionierendes Programm machen?

00:45:33.010 --> 00:45:34.930
Das könnte man ja in Dango auch machen, indem man irgendwie so einen Cache

00:45:34.930 --> 00:46:04.910
und Jochen unterhalten sich über die Programmiersprache Python

00:46:04.930 --> 00:46:34.910
und Jochen unterhalten sich über die Programmiersprache Python

00:46:34.930 --> 00:46:48.590
Das heißt, wenn ich entschieden habe, ich als Anwendungslogik habe entschieden, da muss jetzt diese Datei ausgeliefert werden, dann ist meine Arbeit beendet, indem ich eine korrekt formantierte Nachricht an die Mailbox Dateien ausliefern schicke. Dann bin ich fertig.

00:46:48.590 --> 00:46:54.710
und auf der anderen Seite dieser Mailbox ist halt irgendein

00:46:54.710 --> 00:46:58.990
weiterer Prozess, der macht nichts anderes als, da kommt eine Nachricht,

00:46:59.050 --> 00:47:02.950
ich soll eine Datei ausliefern an folgende Verbindung oder an folgende IP oder sonst was,

00:47:03.530 --> 00:47:06.990
also mache ich das und dieser Prozess macht nichts anderes. Das heißt, es gibt

00:47:06.990 --> 00:47:10.430
einen Prozess, der ist zuständig für, oder eine Mailbox, einen Actor,

00:47:11.130 --> 00:47:14.910
der ist zuständig für Dateien ausliefern, es gibt einen Actor, der ist zuständig für Authentifizierung,

00:47:15.030 --> 00:47:18.550
es gibt einen Actor, der ist zuständig für die Datenbank, es gibt einen Actor, der ist zuständig für

00:47:18.550 --> 00:47:22.430
oder was weiß ich, SSL Termination, was auch immer man haben möchte.

00:47:23.050 --> 00:47:23.890
Bühne frei.

00:47:25.150 --> 00:47:28.890
Jeder Actor macht eine Sache und ist für eine Sache zuständig.

00:47:29.110 --> 00:47:32.770
Und wenn jemand anders was machen soll, dann ist es einfach nur eine Nachricht.

00:47:34.970 --> 00:47:38.210
So, jetzt könnte man sagen, okay, das ist ja in einem objektorientierten System nicht anders.

00:47:38.370 --> 00:47:40.390
Da schickt man Nachrichten von Klassen zu Klassen.

00:47:40.890 --> 00:47:44.850
Der Unterschied ist, dass diese Actors selbst laufende Prozesse sind.

00:47:44.850 --> 00:47:47.630
Das heißt, wenn ich eine Nachricht schicke, dann wird die halt

00:47:47.630 --> 00:47:50.250
gleichzeitig, die wird jetzt sofort bearbeitet.

00:47:51.390 --> 00:47:55.890
Ich muss nicht warten, bis die Nachricht abgearbeitet ist von der Klasse und das kann ja

00:47:55.890 --> 00:48:00.330
sehr lange dauern. Wenn meine View-Klasse aufgerufen wird und ich eine Datei ausliefern muss,

00:48:01.170 --> 00:48:04.730
dann dauert es halt so lange, wie es dauert, die Datei auszuliefern und dann ist die Nachricht

00:48:04.730 --> 00:48:07.950
bearbeitet. Sondern das sind wirklich einfach nur kurze Nachrichten. Mach das.

00:48:08.190 --> 00:48:12.190
Mach das. Tu das. Hier ist was passiert. Also Events.

00:48:12.190 --> 00:48:24.970
Das sind einfach nur Dinge, die passieren sollen oder Nachrichten, die in dem System relevant sind und die werden dann sofort weiter bearbeitet. Und derjenige, der für die Authentifizierung zuständig ist, der kann sofort den nächsten Request authentifizieren.

00:48:24.970 --> 00:48:29.050
So, das ist die eine Sache. Die andere Sache ist

00:48:29.050 --> 00:48:33.050
in Klassen ist es, wenn man eine objektorientierte

00:48:33.050 --> 00:48:36.770
Architektur hat, dann ist es sehr leicht Daten zu verteilen. Da gibt es

00:48:36.770 --> 00:48:40.790
diese, wir haben ja schon drüber gesprochen, es gibt diese Sachen, wie man Klassen aufbauen sollte und

00:48:40.790 --> 00:48:44.930
dass die abgeschlossen sein sollten und dass die ihre privaten

00:48:44.930 --> 00:48:48.810
Daten privat halten sollen und das Null-Interface und so weiter. Aber im Endeffekt ist es

00:48:48.810 --> 00:48:52.730
ja doch irgendwie so, dass man schon ungefähr weiß, was diese Klasse wie macht.

00:48:52.730 --> 00:48:55.770
und auch was die für Daten enthält.

00:48:55.910 --> 00:48:57.670
Und dann manchmal ist es halt auch so, dass man

00:48:57.670 --> 00:48:59.450
auf Daten zugreifen muss, die

00:48:59.450 --> 00:49:01.550
halt da drin sind und die da draußen sind. Das geht

00:49:01.550 --> 00:49:03.710
in diesem Ektormodell überhaupt nicht. In dem Ektormodell

00:49:03.710 --> 00:49:05.130
gibt es nur eine Möglichkeit

00:49:05.130 --> 00:49:07.650
mit einem anderen

00:49:07.650 --> 00:49:09.490
Ektor zu kommunizieren und das ist über eine Nachricht.

00:49:09.910 --> 00:49:11.310
Das heißt, alles was in diesem

00:49:11.310 --> 00:49:13.750
Ektormodell passiert ist, du schickst Nachrichten.

00:49:15.490 --> 00:49:15.690
Aber

00:49:15.690 --> 00:49:17.510
die Ektormodelle kann man dann klonen oder was? Oder dass

00:49:17.510 --> 00:49:18.870
die doch gleichzeitig irgendwas machen können?

00:49:19.930 --> 00:49:20.910
An der einen Mailbox?

00:49:20.910 --> 00:49:21.570
gesagt hast, oder?

00:49:22.270 --> 00:49:24.450
Die Mailbox ist der Endpoint.

00:49:24.770 --> 00:49:26.650
Du schreibst eine Nachricht und du schreibst die

00:49:26.650 --> 00:49:28.830
in den Briefkasten rein und dann bist du

00:49:28.830 --> 00:49:29.690
nicht mehr dafür verantwortlich.

00:49:29.910 --> 00:49:33.150
Dass da zehn Leute gleichzeitig

00:49:33.150 --> 00:49:34.790
diese Mailbox bearbeiten, das kann dir

00:49:34.790 --> 00:49:35.370
völlig egal sein.

00:49:35.370 --> 00:49:37.030
Dann hast du so ein

00:49:37.030 --> 00:49:38.730
Niko oder Fifo oder sowas,

00:49:38.930 --> 00:49:41.450
kannst halt einfach Dinge da rausnehmen

00:49:41.450 --> 00:49:41.950
aus der Mailbox.

00:49:42.910 --> 00:49:44.710
Da gibt es dann sehr, sehr viele.

00:49:44.910 --> 00:49:45.730
Das ist halt so, dass

00:49:45.730 --> 00:49:49.630
Tausende,

00:49:49.630 --> 00:49:51.570
gar kein Problem, auch Millionen kein Problem.

00:49:53.510 --> 00:49:54.450
Und das ist

00:49:54.450 --> 00:50:01.710
das kannst du quasi beliebig

00:50:01.710 --> 00:50:02.830
hochskalieren, sagen wir mal so.

00:50:03.350 --> 00:50:05.470
Man kann die auch dynamisch neu starten.

00:50:06.210 --> 00:50:07.210
Die werden auch dynamisch neu gestartet.

00:50:07.310 --> 00:50:09.270
Und wenn so einer abbricht, wenn einer kaputt geht,

00:50:09.370 --> 00:50:10.770
weil er irgendeine Nachricht nicht verstanden hat,

00:50:10.890 --> 00:50:13.310
dann wird der halt gelöscht und einfach ein neuer gestartet.

00:50:13.390 --> 00:50:14.590
Zack, der ist jetzt weg.

00:50:16.090 --> 00:50:17.530
Was ja kein Problem ist,

00:50:17.530 --> 00:50:19.210
wenn sozusagen

00:50:19.210 --> 00:50:21.670
also was man dazu noch sagen muss, genau

00:50:21.670 --> 00:50:23.970
eine schöne Eigenschaft

00:50:23.970 --> 00:50:25.450
sozusagen für dieses Modell

00:50:25.450 --> 00:50:27.590
die halt Erlang da auch direkt mitbringt

00:50:27.590 --> 00:50:29.610
ist, dass da das ja so eine funktionale

00:50:29.610 --> 00:50:31.770
Programmiersprache ist, ist halt sowas wie

00:50:31.770 --> 00:50:33.830
Daten verändern, das geht

00:50:33.830 --> 00:50:34.470
halt einfach nicht

00:50:34.470 --> 00:50:37.750
das ist prinzipiell nicht

00:50:37.750 --> 00:50:39.790
möglich, du kannst

00:50:39.790 --> 00:50:41.550
halt bloß Daten kopieren, aber das heißt

00:50:41.550 --> 00:50:43.670
du kannst Sachen auch mal perfekt cachen und so

00:50:43.670 --> 00:50:45.710
und es ist auch

00:50:45.710 --> 00:50:47.790
egal wer da was macht, weil

00:50:47.790 --> 00:50:49.930
ist ja sowieso immer nur das Gleiche.

00:50:50.130 --> 00:50:51.490
Es ist halt nie, du kannst,

00:50:51.610 --> 00:50:53.730
es ist nicht möglich, dass jemand hinterher irgendwie Daten

00:50:53.730 --> 00:50:55.850
verändert hat und das in einem anderen State

00:50:55.850 --> 00:50:57.510
ist oder so, sondern

00:50:57.510 --> 00:50:59.890
ja, wenn der

00:50:59.890 --> 00:51:01.690
State irgendwie kopiert wird

00:51:01.690 --> 00:51:03.690
und dann macht das halt ein anderer Actor, ist das halt völlig

00:51:03.690 --> 00:51:04.610
egal, wer das jetzt war.

00:51:05.910 --> 00:51:07.690
Ja, oder auch wenn der abstürzt und andere übernimmt

00:51:07.690 --> 00:51:09.250
das, ist egal. Das ist völlig wurscht.

00:51:09.610 --> 00:51:11.330
Die sind alle gleich. Du hast eine Armee von

00:51:11.330 --> 00:51:13.430
identisch ausschauenden Schauspielern.

00:51:14.410 --> 00:51:14.950
Ja, und

00:51:14.950 --> 00:51:17.530
man kann das halt auch nicht umgehen, weil

00:51:17.530 --> 00:51:19.790
ja, das verbietet einem die Sprache.

00:51:20.010 --> 00:51:21.970
Es gibt ja auch sozusagen ein Acta-Implementierung

00:51:21.970 --> 00:51:23.610
in anderen Sprachen. Es gibt diverse

00:51:23.610 --> 00:51:25.090
in C++ zum Beispiel, aber...

00:51:25.090 --> 00:51:27.410
Python gibt es auch? Acker? PyAcker, ja.

00:51:28.490 --> 00:51:29.810
Super Sache übrigens, sollte jeder

00:51:29.810 --> 00:51:31.070
verwenden. Okay.

00:51:31.450 --> 00:51:33.270
Ich habe nur gehört, dass es das gibt. Ich weiß aber nicht.

00:51:33.510 --> 00:51:35.970
Ich wundere, dass es sich an der Scala-Acker-

00:51:35.970 --> 00:51:37.710
Geschichte orientiert. Ja, genau, das kommt von Scala.

00:51:37.910 --> 00:51:39.550
Wann, wie, wo benutzt man das dann?

00:51:40.310 --> 00:51:41.510
Wobei Scala ist ja quasi

00:51:41.510 --> 00:51:44.110
Erlangen für... Ja, für die...

00:51:44.110 --> 00:51:45.070
Ja, genau.

00:51:45.070 --> 00:51:45.270
mit.

00:51:47.210 --> 00:51:48.350
Wie benutzt man das dann?

00:51:48.670 --> 00:51:49.390
Dieses PyAK?

00:51:50.490 --> 00:51:51.370
Ja, wenn du halt

00:51:51.370 --> 00:51:53.470
synchrone Sachen haben willst.

00:51:54.270 --> 00:51:56.730
Das Problem an PyAK ist halt,

00:51:56.810 --> 00:51:58.450
dass das immer noch den Gil beachten muss.

00:51:58.570 --> 00:52:00.330
Das heißt, du gewinnst nicht so ungeheuer viel,

00:52:01.470 --> 00:52:04.150
weil du immer noch in dieser

00:52:04.150 --> 00:52:06.730
mehr oder weniger Single-Trailed-Python-Welt

00:52:06.730 --> 00:52:08.550
festhängst, aber das macht

00:52:08.550 --> 00:52:10.590
die Struktur einfacher. Es löst

00:52:10.590 --> 00:52:12.550
dich davon ab, alles in einem

00:52:12.550 --> 00:52:14.610
Ablauf machen zu müssen, sondern du kannst sagen,

00:52:14.610 --> 00:52:16.490
dieses Ding ist jetzt verantwortlich für

00:52:16.490 --> 00:52:18.750
und das hat folgende Ressourcen

00:52:18.750 --> 00:52:20.330
fest in der Hand und zack.

00:52:21.710 --> 00:52:22.990
Aber was du halt nicht hinkriegen

00:52:22.990 --> 00:52:24.690
kannst und was das halt so ein bisschen

00:52:24.690 --> 00:52:26.770
also ich meine klar, du kannst natürlich dann sagen, okay

00:52:26.770 --> 00:52:28.190
ich weiß, ich darf hier nur

00:52:28.190 --> 00:52:30.890
immutable Datenstrukturen verwenden und so

00:52:30.890 --> 00:52:32.830
aber du kannst natürlich Sachen schon ändern

00:52:32.830 --> 00:52:34.450
wenn du böse bist und

00:52:34.450 --> 00:52:36.290
das geht halt

00:52:36.290 --> 00:52:37.430
in Erlangen nicht.

00:52:38.350 --> 00:52:40.290
Ich habe gerade auch eine andere Bibliothek gefunden, die heißt

00:52:40.290 --> 00:52:42.870
Tespian. Habe ich auch nicht reingeguckt.

00:52:42.990 --> 00:52:43.210
Keine Ahnung.

00:52:44.610 --> 00:52:46.690
und die Theater-Schauspieler.

00:52:49.250 --> 00:52:51.110
Ja, genau.

00:52:51.290 --> 00:52:52.990
Also ich meine, man zahlt da natürlich einen Preis für.

00:52:53.210 --> 00:52:54.730
Also man zahlt den Preis vor allen Dingen

00:52:54.730 --> 00:52:55.890
in Hauptspeicher.

00:52:56.410 --> 00:52:58.590
Man muss halt alles kopieren, wenn man irgendwas verändern will.

00:53:01.190 --> 00:53:03.150
Das ist halt auch das, was einen im Wesentlichen

00:53:03.150 --> 00:53:04.650
begrenzt, dass die Anzahl der

00:53:04.650 --> 00:53:06.170
Actor-Dinger

00:53:06.170 --> 00:53:08.370
halt angeht.

00:53:08.630 --> 00:53:10.570
Wenn der Hauptspeicher voll ist, dann ist halt Schluss.

00:53:12.310 --> 00:53:13.230
Und es ist halt

00:53:13.230 --> 00:53:15.430
auch ein bisschen langsamer. Also wenn man jetzt sagen würde,

00:53:15.870 --> 00:53:16.810
okay, man macht das Ganze

00:53:16.810 --> 00:53:18.750
handoptimiert irgendwie mit

00:53:18.750 --> 00:53:20.890
Threads oder so, dann ist das wahrscheinlich schneller.

00:53:21.490 --> 00:53:23.370
Aber sagen wir mal so, es ist halt

00:53:23.370 --> 00:53:24.970
ein sehr, sehr guter Kompromiss eigentlich,

00:53:25.910 --> 00:53:26.490
wenn es um

00:53:26.490 --> 00:53:28.790
Dinge

00:53:28.790 --> 00:53:30.670
parallel, concurrent

00:53:30.670 --> 00:53:33.390
und in zuverlässig machen geht.

00:53:34.110 --> 00:53:35.130
Und so diese

00:53:35.130 --> 00:53:37.250
letztes Sequenzchen Performance brauchen

00:53:37.250 --> 00:53:38.410
die meisten Leute ja dann eh nicht.

00:53:39.890 --> 00:53:41.090
Ja, und selbst

00:53:41.090 --> 00:53:43.070
dann bist du ja oft

00:53:43.070 --> 00:53:45.190
in so einer Situation, wo Stabilität einfach

00:53:45.190 --> 00:53:46.770
wichtiger ist.

00:53:47.810 --> 00:53:49.110
Und die kriegst du da halt

00:53:49.110 --> 00:53:50.890
für umsonst mit dazu, weil es

00:53:50.890 --> 00:53:52.910
sehr schwierig ist, da diese

00:53:52.910 --> 00:53:53.830
VM zu crashen.

00:53:55.010 --> 00:53:56.770
Und selbst wenn du irgendwas machst, was crasht,

00:53:56.910 --> 00:53:59.130
dann hast du halt diesen einen Request

00:53:59.130 --> 00:53:59.630
gecrashed.

00:54:00.730 --> 00:54:01.930
Aber der Rest läuft weiter.

00:54:02.470 --> 00:54:05.190
Es ist quasi nicht möglich, diese Maschine abzuschießen.

00:54:06.310 --> 00:54:07.030
Und das ist

00:54:07.030 --> 00:54:08.710
schon was, wo

00:54:08.710 --> 00:54:11.030
man auch mit Neid draufschauen

00:54:11.030 --> 00:54:13.030
kann, weil das ja in anderen Systemen

00:54:13.070 --> 00:54:14.930
relativ leicht ist.

00:54:15.510 --> 00:54:16.070
Es ist eher so

00:54:16.070 --> 00:54:19.930
schwer, das Ding irgendwie am Laufen zu halten.

00:54:20.030 --> 00:54:20.850
Da muss man immer irgendwie

00:54:20.850 --> 00:54:23.250
die ganze Zeit

00:54:23.250 --> 00:54:26.110
irgendwie Fünfteller jonglieren

00:54:26.110 --> 00:54:26.550
auf einem

00:54:26.550 --> 00:54:30.010
Einrad herum, auf einem Seil

00:54:30.010 --> 00:54:30.850
herumfährt oder so.

00:54:31.450 --> 00:54:33.290
Das ist da ganz angenehm.

00:54:34.510 --> 00:54:35.930
Aber es ist natürlich auch ganz klar

00:54:35.930 --> 00:54:37.930
ausgerichtet auf so Workloads, die parallel

00:54:37.930 --> 00:54:39.850
sind. Also eben

00:54:39.850 --> 00:54:41.210
genau aus dem

00:54:41.210 --> 00:54:43.390
aus dem Telefonieumfeld her.

00:54:43.790 --> 00:54:45.610
Jedes Telefonat selber braucht

00:54:45.610 --> 00:54:47.210
nicht ungefähr euer viel.

00:54:47.430 --> 00:54:48.710
Du musst halt dann irgendwie deine

00:54:48.710 --> 00:54:51.410
16 Kilobit musst du durchkriegen

00:54:51.410 --> 00:54:53.490
oder deine, wie auch immer sie gerade runter

00:54:53.490 --> 00:54:55.550
haben, aber das ist

00:54:55.550 --> 00:54:57.390
ja nicht viel. Aber du hast halt

00:54:57.390 --> 00:54:58.830
1000 Stück davon gleichzeitig in der Hand.

00:54:59.710 --> 00:55:01.510
Und in anderen Workloads hast du ja andere

00:55:01.510 --> 00:55:02.710
Anforderungen.

00:55:02.970 --> 00:55:04.230
Zum Beispiel Machine Learning.

00:55:05.130 --> 00:55:07.290
Da brauchst du halt eine Sache,

00:55:07.430 --> 00:55:09.090
die du 100.000 Mal ausführen musst

00:55:09.090 --> 00:55:10.930
und da ist es besser,

00:55:11.210 --> 00:55:13.150
Prozessoren zu haben, die das schnell machen können.

00:55:13.250 --> 00:55:14.850
Deshalb hat sich das ja auch so ein bisschen anders entwickelt.

00:55:15.290 --> 00:55:17.150
Und ich glaube auch, dass da der Hintergrund so ein bisschen

00:55:17.150 --> 00:55:19.150
anders ist. Python kommt ja wirklich

00:55:19.150 --> 00:55:19.750
aus dieser

00:55:19.750 --> 00:55:22.930
ein Programm tut eine Sache

00:55:22.930 --> 00:55:25.270
Welt und

00:55:25.270 --> 00:55:27.130
da ist es dann halt einfacher zu sagen,

00:55:27.250 --> 00:55:28.950
okay, die Programme werden schneller, weil die

00:55:28.950 --> 00:55:31.630
Prozessoren schneller werden, weil die Single-Field-Performance

00:55:31.630 --> 00:55:33.330
schneller wird. Aber jetzt sind wir

00:55:33.330 --> 00:55:34.710
nun mal genau in so einem Umbruch,

00:55:35.310 --> 00:55:37.450
wo es tatsächlich so ist, dass eben Single-Field-Performance

00:55:37.450 --> 00:55:38.410
nicht mehr schneller wird.

00:55:38.410 --> 00:55:42.010
Aber dafür kannst du jetzt einen Computer kaufen, der

00:55:42.010 --> 00:55:45.490
64 Cores hat. Oder gibt es nicht von AMD sogar schon die mit 128?

00:55:45.930 --> 00:55:47.030
Kann gut sein, ja.

00:55:49.130 --> 00:55:54.210
Das hat man ja in der ersten Sendung schon

00:55:54.210 --> 00:55:57.990
und ich würde da tatsächlich, ehrlich gesagt, bei bleiben

00:55:57.990 --> 00:56:02.010
dass man das selten hat, dass man beides braucht. Also du kannst ja

00:56:02.010 --> 00:56:06.270
problemlos 128 Python-Interpreter starten. Also wenn du 128 Cores

00:56:06.270 --> 00:56:07.970
hast, dann hast du wahrscheinlich auch genug Hauptspeicher, um

00:56:07.970 --> 00:56:09.770
128 Prozesse zu haben.

00:56:11.450 --> 00:56:12.550
Aber da hast du halt nur 128.

00:56:12.770 --> 00:56:14.270
Kannst du 128 gleichzeitig

00:56:14.270 --> 00:56:15.370
beantworten.

00:56:15.370 --> 00:56:17.210
Nicht 12.800.

00:56:17.670 --> 00:56:19.510
Aber wenn CPU dein Problem ist

00:56:19.510 --> 00:56:20.890
und dann

00:56:20.890 --> 00:56:22.430
brauchst du...

00:56:22.430 --> 00:56:25.190
Also wenn I.O. dein Problem ist, gut,

00:56:25.350 --> 00:56:26.950
aber dann brauchst du die ganzen Prozessoren eigentlich nicht.

00:56:27.190 --> 00:56:29.750
Dann kannst du das auch auf einer CPU...

00:56:29.750 --> 00:56:31.130
Also naja, ich weiß es nicht so genau.

00:56:31.130 --> 00:56:37.010
Ja, also ich meine,

00:56:37.250 --> 00:56:39.490
man hat es selten, dass man beides braucht

00:56:39.490 --> 00:56:41.010
und für beide

00:56:41.010 --> 00:56:43.250
Extremfälle gibt es halt sehr gute Lösungen.

00:56:44.590 --> 00:56:45.110
Den

00:56:45.110 --> 00:56:47.230
Data Science CPU

00:56:47.230 --> 00:56:49.270
verbrennen Use Case,

00:56:49.350 --> 00:56:50.650
da gibt es super Lösungen für.

00:56:51.230 --> 00:56:53.170
Den kann man jetzt nicht zum Websurfen verwenden, aber

00:56:53.170 --> 00:56:55.010
das funktioniert super.

00:56:55.670 --> 00:56:57.330
Sehr schöne Computer von Nvidia

00:56:57.330 --> 00:56:58.790
für mehrere hunderttausend Dollar.

00:56:59.430 --> 00:56:59.550
Ja.

00:57:01.130 --> 00:57:02.870
Würde ich nicht als Web-Server einsetzen.

00:57:03.010 --> 00:57:04.530
Ne, genau, das macht da nicht so viel Sinn.

00:57:05.410 --> 00:57:06.810
Und auf der anderen Seite ist halt

00:57:06.810 --> 00:57:09.050
irgendwie, weiß ich nicht, eben

00:57:09.050 --> 00:57:09.590
Lib,

00:57:10.130 --> 00:57:12.910
kriegen wir den Übergang zu

00:57:12.910 --> 00:57:15.150
Python wieder hin oder halt

00:57:15.150 --> 00:57:17.110
auch eben Node.js, LibUV ist

00:57:17.110 --> 00:57:19.010
halt auch auf einem Prozessor, macht das schon

00:57:19.010 --> 00:57:20.230
irgendwie ordentlich I.O.

00:57:20.330 --> 00:57:20.650
LibUV.

00:57:23.090 --> 00:57:24.930
Das ist sozusagen die

00:57:24.930 --> 00:57:27.010
Event-Loop, die unter Node.js und halt

00:57:27.010 --> 00:57:29.190
auch bei Python, also normalerweise

00:57:29.190 --> 00:57:31.070
in Produktivgeschichten nimmt man halt immer LibUV

00:57:31.070 --> 00:57:33.230
statt der AsyncIO

00:57:33.230 --> 00:57:35.030
Standard Event Loop.

00:57:36.030 --> 00:57:36.950
Aha, kein AsyncIO?

00:57:37.470 --> 00:57:39.730
Das ist AsyncIO.

00:57:39.830 --> 00:57:40.930
Würdest du Ubicorn verwenden

00:57:40.930 --> 00:57:42.990
statt... Also kann man

00:57:42.990 --> 00:57:43.690
auf jeden Fall, ja.

00:57:45.830 --> 00:57:46.310
Und

00:57:46.310 --> 00:57:48.690
ja, man kann halt

00:57:48.690 --> 00:57:51.070
bei AsyncIO ist es so, du kannst die Implementierung

00:57:51.070 --> 00:57:52.770
deiner Event Loop kannst du halt austauschen

00:57:52.770 --> 00:57:54.790
und du kannst halt entweder die Standard

00:57:54.790 --> 00:57:56.170
Implementierung nehmen

00:57:56.170 --> 00:57:58.630
oder du nimmst halt libUV zum Beispiel

00:57:58.630 --> 00:58:00.970
und libUV ist dann halt deutlich schneller.

00:58:01.070 --> 00:58:03.910
und

00:58:03.910 --> 00:58:05.670
ja, also zu der

00:58:05.670 --> 00:58:07.490
Historie, ich weiß jetzt ehrlich gesagt nicht so ganz genau, ich glaube

00:58:07.490 --> 00:58:08.570
es gab einmal LibEV,

00:58:08.850 --> 00:58:10.850
das Ding ist auch schon ziemlich alt

00:58:10.850 --> 00:58:13.430
und... Aber das ist

00:58:13.430 --> 00:58:15.370
doch eine C-Bibliothek, oder? Ja, ja,

00:58:15.550 --> 00:58:17.230
LibEV auch. Die einfach nur Event

00:58:17.230 --> 00:58:18.450
in EVE und LM anfängt.

00:58:19.610 --> 00:58:21.450
Genau, das ist, die implementieren

00:58:21.450 --> 00:58:23.190
das sogenannte Reactor-Pattern

00:58:23.190 --> 00:58:25.350
irgendwie und benutzen

00:58:25.350 --> 00:58:27.350
unten drunter Syscrolls. Da mal ein Podcast

00:58:27.350 --> 00:58:28.550
dazu geben, so Pattern. Ja,

00:58:28.550 --> 00:58:41.140
und Ich glaube da m wir auch noch ein paar Teile irgendwie machen Also das Ja aber vielleicht tats nochmal genau das erkl was das Reactor vielleicht ist Und dann vielleicht auch nochmal was halt Event sind Genau das haben wir das letzte Mal da haben wir da aufgeh

00:58:42.200 --> 00:58:42.980
Ja, also

00:58:42.980 --> 00:58:44.240
Reactor-Pattern...

00:58:44.240 --> 00:58:47.460
Seit dem genagten

00:58:47.460 --> 00:58:48.400
Leser zu überlassen.

00:58:52.240 --> 00:58:54.720
Du hast halt so Syscalls

00:58:54.720 --> 00:58:57.260
in Unix.

00:58:58.020 --> 00:58:59.320
Da gibt es auch unterschiedliche, je nachdem, welche

00:58:59.320 --> 00:59:00.340
der Unix-Art man verwendet.

00:59:00.920 --> 00:59:02.260
E-Poll unter Linux.

00:59:03.160 --> 00:59:04.980
Vielleicht nochmal, wir müssen doch ein bisschen nur den Anfang.

00:59:05.080 --> 00:59:06.940
Was ist ein Syscall? Oh nein, oh mein Gott.

00:59:08.760 --> 00:59:10.060
Jetzt muss man tief reinsteigen.

00:59:10.840 --> 00:59:11.600
Also sozusagen,

00:59:11.660 --> 00:59:12.540
das ist die Art, wie

00:59:12.540 --> 00:59:15.240
mit dem

00:59:15.240 --> 00:59:16.700
Betriebssystem kommunizieren.

00:59:17.520 --> 00:59:19.280
Also das, was jeder kennt,

00:59:19.280 --> 00:59:20.880
vielleicht ist sowas wie, du machst einen Pfeil auf.

00:59:21.600 --> 00:59:23.300
Du musst jetzt irgendwie an die Bits

00:59:23.300 --> 00:59:24.980
auf der Platte tatsächlich rankommen und

00:59:24.980 --> 00:59:27.160
der tatsächlich bei Unix

00:59:27.160 --> 00:59:29.240
ist so der Syscall für alles,

00:59:29.320 --> 00:59:31.480
ist halt open. Das ist ja auch der Trick

00:59:31.480 --> 00:59:32.540
bei Unix, dass man sagt so,

00:59:33.040 --> 00:59:35.840
es gibt nur einen syscall.

00:59:36.980 --> 00:59:37.600
Eigentlich ist

00:59:37.600 --> 00:59:38.660
alles ein Pfeil, genau.

00:59:39.320 --> 00:59:40.680
Es ist völlig egal, was es wirklich ist.

00:59:41.560 --> 00:59:43.280
Pfeil ist unsere Abstraktion

00:59:43.280 --> 00:59:45.560
für einfach

00:59:45.560 --> 00:59:46.080
alles.

00:59:47.240 --> 00:59:49.280
Also wenn man das annimmt, dann kommt man

00:59:49.280 --> 00:59:50.300
bei Unix ziemlich gut raus.

00:59:52.520 --> 00:59:52.960
Ja,

00:59:53.580 --> 00:59:55.420
genau, das ist halt

00:59:55.420 --> 00:59:57.160
die Art, wie man dem Kernel sagt, ich hätte jetzt gern

00:59:57.160 --> 00:59:59.300
da zum Beispiel irgendwie Zugriff drauf.

00:59:59.320 --> 01:00:01.140
und dann sagt man halt Open.

01:00:01.860 --> 01:00:02.760
Und das kann man eben

01:00:02.760 --> 01:00:05.280
nicht nur mit Files machen, sondern auch mit Netzwerkverbindungen,

01:00:05.460 --> 01:00:07.080
die ja dann in Unix auch nur Files sind

01:00:07.080 --> 01:00:08.900
oder Hauptsprecher ist auch nur Files oder halt

01:00:08.900 --> 01:00:11.160
irgendwie Pipes, Kommunikation

01:00:11.160 --> 01:00:12.360
und so, das ist auch alles immer nur ein File.

01:00:13.840 --> 01:00:14.780
Also man kommt ja sehr weit.

01:00:15.780 --> 01:00:16.920
Der Bildschirm ist auch ein File, oder?

01:00:17.180 --> 01:00:17.380
Ja.

01:00:18.160 --> 01:00:20.800
Und die Terminals sind auch Files.

01:00:21.360 --> 01:00:21.480
Ja.

01:00:23.100 --> 01:00:24.440
Jetzt muss man nur noch wissen, was Files sind.

01:00:25.660 --> 01:00:25.920
Ja.

01:00:25.920 --> 01:00:27.360
Das ist das Abstrack.

01:00:27.360 --> 01:00:29.680
Das können wir in dieser Vorlesung nicht machen.

01:00:29.700 --> 01:00:31.180
Es ist ein sehr, sehr, sehr, sehr, sehr

01:00:31.180 --> 01:00:33.260
simples Interface. Es ist einfach unstrukturierte

01:00:33.260 --> 01:00:35.180
Daten und du kannst darauf zugreifen,

01:00:35.420 --> 01:00:36.320
indem du halt

01:00:36.320 --> 01:00:38.440
daraus liest und reinschreibst.

01:00:38.440 --> 01:00:40.300
Aber sortiert. Das ist das Wichtige, oder?

01:00:40.380 --> 01:00:42.800
Du hast eine Abfolge von Bytes.

01:00:43.000 --> 01:00:44.860
Ich kann hin und her springen, ja. Ich habe so einen Zeiger, der

01:00:44.860 --> 01:00:47.420
Interface. Ah, nicht jedes File kann hin und her springen.

01:00:47.620 --> 01:00:49.500
Files können sagen, sie dürfen hin und her

01:00:49.500 --> 01:00:50.140
springen oder auch nicht.

01:00:53.000 --> 01:00:53.520
Okay, dann

01:00:53.520 --> 01:00:54.660
habe ich jetzt ein Cisco, das macht ein Open.

01:00:54.660 --> 01:00:56.160
Okay. Genau.

01:00:56.160 --> 01:00:59.340
also insofern auch alles

01:00:59.340 --> 01:01:01.260
schick, das Problem ist jetzt natürlich

01:01:01.260 --> 01:01:03.380
und das ist auch gar kein Problem, oder Jochen?

01:01:03.520 --> 01:01:05.260
also ich meine, da brauchst du noch keine Lib dafür, sondern

01:01:05.260 --> 01:01:07.320
du brauchst halt nur wissen, wie du das

01:01:07.320 --> 01:01:09.380
aufrufst und das ist super

01:01:09.380 --> 01:01:11.400
und nett und easy und wenn du jetzt gegen deine

01:01:11.400 --> 01:01:13.640
was weiß ich, Bibliothek, gegen deine

01:01:13.640 --> 01:01:15.740
Kernel-Bibliothek

01:01:15.740 --> 01:01:17.260
kompiliert hast, gegen deinen Kernel-Header

01:01:17.260 --> 01:01:18.360
dann kannst du die Sachen aufrufen

01:01:18.360 --> 01:01:21.000
warum brauchen wir jetzt Lib-EV?

01:01:21.120 --> 01:01:22.760
warum brauchen wir Lib-Event oder Lib?

01:01:23.220 --> 01:01:25.360
Ja, das ist sozusagen eine Abstraktionsschicht

01:01:25.360 --> 01:01:26.800
Schicht über den

01:01:26.800 --> 01:01:29.380
Syscalls, weil das Problem ist, du hast jetzt

01:01:29.380 --> 01:01:30.860
unterschiedliche Syscalls, je nachdem welches

01:01:30.860 --> 01:01:33.320
Betriebssystem du hast, die eben so

01:01:33.320 --> 01:01:35.220
etwas machen wie, naja,

01:01:35.380 --> 01:01:37.280
du machst jetzt nicht einfach nur einen Pfeil auf und schickst da irgendwas,

01:01:37.360 --> 01:01:38.920
das kannst du auch, dann ist es aber

01:01:38.920 --> 01:01:41.320
blockierend und synchron. Du willst

01:01:41.320 --> 01:01:43.320
jetzt aber nicht blockierend irgendwie lesen

01:01:43.320 --> 01:01:45.400
und schreiben, weil du möchtest ja gleichzeitig

01:01:45.400 --> 01:01:46.560
parallel irgendwie

01:01:46.560 --> 01:01:48.780
Datenströme in der Gegend herumschicken.

01:01:49.660 --> 01:01:51.320
Weil wenn du blockierst, dann kannst du immer nur

01:01:51.320 --> 01:01:53.240
eins nach dem anderen machen und das ist ja, wenn du

01:01:53.240 --> 01:01:55.140
jetzt tausend Leuten gleichzeitig einen Pfeil schicken möchtest,

01:01:55.140 --> 01:01:56.960
geht das halt nicht so gut. Und

01:01:56.960 --> 01:01:58.260
dafür gibt es dann halt

01:01:58.260 --> 01:02:01.140
andere Interfaces, die das möglich

01:02:01.140 --> 01:02:02.360
machen. Und

01:02:02.360 --> 01:02:05.160
da gibt es dann halt so die uralten

01:02:05.160 --> 01:02:07.240
Geschichten in Unix

01:02:07.240 --> 01:02:09.120
sind halt so Select, der Select-Discall

01:02:09.120 --> 01:02:10.000
und Poll.

01:02:12.500 --> 01:02:12.940
Und

01:02:12.940 --> 01:02:14.680
im Wesentlichen gibt man den...

01:02:14.680 --> 01:02:17.260
Jetzt musst du trotzdem kurz sagen, was Select ist und was Poll ist.

01:02:17.300 --> 01:02:19.000
Jaja, also ich fange mal mit

01:02:19.000 --> 01:02:20.940
Poll an. Du gibst Poll

01:02:20.940 --> 01:02:22.040
einfach eine Liste von

01:02:22.040 --> 01:02:24.660
Pfeildeskriptoren sozusagen, also offenen Files

01:02:24.660 --> 01:02:25.520
eigentlich mehr oder weniger.

01:02:26.400 --> 01:02:28.640
Und dann wirst du irgendwie benachrichtigt, wenn

01:02:28.640 --> 01:02:30.560
da irgendwas passiert ist vom Kernel.

01:02:31.680 --> 01:02:32.640
Und das Problem

01:02:32.640 --> 01:02:34.620
dabei ist halt, dass, also bei Paul kannst du

01:02:34.620 --> 01:02:36.380
halt irgendwie, ach Gott, das muss ich

01:02:36.380 --> 01:02:38.500
tief in Erinnerung kramen. Also der

01:02:38.500 --> 01:02:40.540
Vorteil ist, du kannst halt beliebig viele Files da

01:02:40.540 --> 01:02:42.140
reintun, also beliebig viele Netzwerkverbindungen haben.

01:02:42.520 --> 01:02:44.640
Der Nachteil ist irgendwie, ist es halt O von N

01:02:44.640 --> 01:02:46.080
oder sowas. Also deine

01:02:46.080 --> 01:02:48.480
Zeit,

01:02:48.680 --> 01:02:50.660
die das im Kernel verbringt, wird halt immer mehr,

01:02:50.760 --> 01:02:52.640
je mehr du da reinsteckst. Und bei Select

01:02:52.640 --> 01:02:54.360
war es so, dass

01:02:54.360 --> 01:02:59.840
dass das schnell ist, das ist ja irgendwie O von 1, aber du kannst irgendwie nur 1024

01:02:59.840 --> 01:03:03.400
Pfeildeskriptoren oder so irgendwie da reinstellen. Was ist denn ein Select jetzt, also ein Unterschied?

01:03:03.720 --> 01:03:06.820
Also im Wesentlichen geht es doch darum, dass du auf Daten wartest.

01:03:07.460 --> 01:03:11.520
Das heißt, der Syscall heißt, du kannst sagen,

01:03:11.720 --> 01:03:15.640
ich möchte jetzt die Datei lesen und dann gibt es einen Syscall,

01:03:15.720 --> 01:03:18.840
der heißt ReadData oder wie auch immer der heißen mag und

01:03:18.840 --> 01:03:23.580
der blockiert dann halt, da musst du so lange warten, bis die Daten da sind.

01:03:23.580 --> 01:03:25.600
und das ist bei einer Netzwerkverbindung

01:03:25.600 --> 01:03:26.920
echt blöd. Das willst du nicht, genau.

01:03:28.020 --> 01:03:29.040
Dann kannst du sagen, okay,

01:03:29.620 --> 01:03:31.240
wir modifizieren den und sagen,

01:03:31.640 --> 01:03:33.680
wir machen Readdata, aber nicht blockierend,

01:03:33.760 --> 01:03:35.380
das heißt, wenn was da ist, dann kriegen wir das

01:03:35.380 --> 01:03:37.440
und wenn nichts da ist, dann kriegen wir halt zurück,

01:03:37.560 --> 01:03:38.640
es gibt gerade nichts.

01:03:40.160 --> 01:03:41.400
Und damit kannst du das ja umsetzen,

01:03:41.520 --> 01:03:43.080
damit kannst du Polling machen, damit kannst du sagen, hier,

01:03:43.180 --> 01:03:45.720
alle meine Netzwerkverbindungen, was gibt's denn jetzt hier?

01:03:47.400 --> 01:03:48.960
Aber Polling ist halt schlecht,

01:03:49.200 --> 01:03:51.600
weil dann, das ist aktives Warten.

01:03:52.320 --> 01:03:53.280
Busy Waiting, genau,

01:03:53.280 --> 01:03:54.200
und das verbraucht halt CPU.

01:03:55.140 --> 01:03:57.440
Ja, und vor allem, während du auf eins wartest,

01:03:57.580 --> 01:03:59.220
kann ja bei einem anderen was passieren und das

01:03:59.220 --> 01:04:01.060
bemerkst du dann halt erst, wenn du soweit bist, dass du da bist.

01:04:01.060 --> 01:04:01.780
Das steht die ganze Zeit nach.

01:04:02.000 --> 01:04:03.420
Bist du schon da? Bist du schon da? Bist du schon da?

01:04:03.480 --> 01:04:05.040
Bist du schon da? Bist du schon da?

01:04:05.040 --> 01:04:07.020
Genau, aber wenn du jetzt bei

01:04:07.020 --> 01:04:08.840
zehn Türen immer anklopfst und sagst,

01:04:08.880 --> 01:04:10.740
bist du schon da? Bist du schon da? Dann kann es ja sein,

01:04:10.860 --> 01:04:12.840
dass du bei der zehnten Tür bist und bei der,

01:04:12.920 --> 01:04:14.980
du bist bei der ersten Tür und bei der zehnten Tür passiert

01:04:14.980 --> 01:04:17.080
jetzt gerade was und du merkst es aber

01:04:17.080 --> 01:04:19.140
erst, wenn du die anderen neun alle durchgefragt hast.

01:04:19.420 --> 01:04:20.880
Das heißt, du hast nicht nur

01:04:20.880 --> 01:04:23.020
viel CPU verbraucht, für was, was eigentlich

01:04:23.020 --> 01:04:25.180
nichts bringt, sondern du hast auch noch hohe Latenz

01:04:25.180 --> 01:04:25.400
drin.

01:04:27.020 --> 01:04:29.200
Du kriegst die Nachrichten, du kriegst nicht sofort mit,

01:04:29.300 --> 01:04:31.040
dass irgendwas passiert, sondern du kriegst erst mit,

01:04:31.100 --> 01:04:32.740
wenn du dazukommst, danach zu fragen.

01:04:33.280 --> 01:04:34.700
Und das ist natürlich schlecht, weil

01:04:34.700 --> 01:04:39.040
du dann eben eine unnötige

01:04:39.040 --> 01:04:40.920
Latenz hast. Du hast unnötige Wartezeiten, die du nicht

01:04:40.920 --> 01:04:43.180
brauchst. Und jetzt wird es noch schlimmer,

01:04:43.220 --> 01:04:44.980
wenn du das nämlich naiv machst, dann kannst du so

01:04:44.980 --> 01:04:46.640
ein Problem haben, das Starvation heißt.

01:04:47.200 --> 01:04:49.020
Wenn du sagst, wenn irgendwas passiert, dann fange ich

01:04:49.020 --> 01:04:50.580
wieder bei Tür 1 an nachzufragen.

01:04:50.900 --> 01:04:51.760
Und dann passiert das nicht.

01:04:51.760 --> 01:04:56.480
und doch, doch, dann hast du nämlich Starvation, weil wenn bei Tür 10 irgendwas ist,

01:04:56.600 --> 01:05:00.820
da kommst du ja nie hin, weil wenn davor irgendwas passiert, dann kommst du nie dazu,

01:05:00.920 --> 01:05:04.880
Tür 10 nachzufragen. Das heißt, du musst dann auch noch aufpassen, dass du die in einer

01:05:04.880 --> 01:05:09.040
gewissen Reihenfolge abfragst, die nicht dazu führt, dass einer hier

01:05:09.040 --> 01:05:13.380
liegen gelassen wird. Also Polling ist was ganz Schlechtes, wenn du auf

01:05:13.380 --> 01:05:16.960
Daten wartest in einer aktiven Verbindung. Und deshalb gibt es

01:05:16.960 --> 01:05:19.240
diesen Select

01:05:19.240 --> 01:05:20.800
Syscall, wo du eben sagst,

01:05:21.160 --> 01:05:23.240
benachrichtige mich, wenn irgendwas

01:05:23.240 --> 01:05:23.880
von diesen

01:05:23.880 --> 01:05:27.060
1024 oder eben jetzt, wie Jochen sagt,

01:05:27.780 --> 01:05:28.980
beliebig vielen

01:05:28.980 --> 01:05:30.260
irgendwo was passiert.

01:05:31.480 --> 01:05:33.340
Wenn irgendwo was passiert, dann gib mir Bescheid.

01:05:33.680 --> 01:05:35.040
Dann kriegst du quasi einen Interrupt.

01:05:36.680 --> 01:05:36.980
Ah.

01:05:37.320 --> 01:05:37.800
Genau.

01:05:38.700 --> 01:05:41.100
Das gab es doch früher immer. Das war noch relativ

01:05:41.100 --> 01:05:43.040
nativ oder schneller ansprechbar.

01:05:43.120 --> 01:05:44.820
Das musste man doch früher einmal selber konfigurieren.

01:05:45.560 --> 01:05:46.040
Die Interrupt.

01:05:46.040 --> 01:05:50.120
für die Soundfarbe gab es das, weil die müssen halt ihre Daten holen und die sagen so,

01:05:50.260 --> 01:05:54.340
jetzt, ich brauche Daten und dann musst du dich drum kümmern. Da kannst du nicht sagen, ja, ich bin jetzt gerade beschäftigt

01:05:54.340 --> 01:05:56.200
mit...

01:05:56.200 --> 01:06:00.000
Genau, und

01:06:00.000 --> 01:06:03.980
also der Syscall, den man unter den Jungs dafür jetzt verwendet, der nennt sich ePoll, der halt

01:06:03.980 --> 01:06:08.000
irgendwie, ja, ist halt irgendwie Anfang der Nuller Jahre, ich weiß nicht, seit wann das

01:06:08.000 --> 01:06:12.040
drin ist, ein Körner, müsste ja irgendwie schon sehr lang, und

01:06:12.040 --> 01:06:15.700
das Ding macht das quasi für beliebig viele Falldiskretoren und halt schnell.

01:06:16.040 --> 01:06:16.960
Also das Ding ist richtig,

01:06:17.480 --> 01:06:19.840
macht Laune, funktioniert

01:06:19.840 --> 01:06:21.680
dann alles super und

01:06:21.680 --> 01:06:22.580
FreeBSD,

01:06:22.740 --> 01:06:25.480
BSD-basierte Unix, die nehmen dann eher sowas wie

01:06:25.480 --> 01:06:27.600
KQ, also FreeBSD,

01:06:27.760 --> 01:06:29.740
macOS und so.

01:06:30.660 --> 01:06:32.000
Macht praktisch

01:06:32.000 --> 01:06:33.840
das Gleiche. Wie was? Entschuldigung, ich wollte das nicht nochmal

01:06:33.840 --> 01:06:35.220
aufklären. Der Syscall heißt einfach anders und

01:06:35.220 --> 01:06:36.560
der heißt KQ.

01:06:39.120 --> 01:06:39.940
KQ heißt der, oder?

01:06:39.940 --> 01:06:41.300
Oder KQ, ja, genau.

01:06:42.820 --> 01:06:43.480
Ja, KQ.

01:06:44.220 --> 01:06:45.960
Die Leute mitschreiben, kleiner, schmutziger

01:06:45.960 --> 01:06:49.300
und genau, aber

01:06:49.300 --> 01:06:52.920
es gibt ja subtile Unterschiede, bei Solaris hast du halt noch sowas wie DevPol und so

01:06:52.920 --> 01:06:58.000
also unterschiedliche Unix-Geschmacksrichtungen machen das halt irgendwie so leicht anders

01:06:58.000 --> 01:07:02.060
alles und das willst du ja jetzt nicht, wenn du ein Anwendungsprogramm schreibst, alles nochmal

01:07:02.060 --> 01:07:05.980
machen müssen, damit du halt irgendwie alle Unix-Varianten unterstützen kannst

01:07:05.980 --> 01:07:10.020
und dann brauchst du halt eine Abstraktionsschicht darüber, die halt dann unten drunter

01:07:10.020 --> 01:07:14.200
mit den betriebssystemspezifischen

01:07:14.200 --> 01:07:16.560
Syscalls oder Interfaces redet,

01:07:17.200 --> 01:07:18.440
aber mit der du dann

01:07:18.440 --> 01:07:20.220
reden kannst, ohne das alles wissen zu müssen.

01:07:20.820 --> 01:07:22.360
Und genau, das ist halt LibEV.

01:07:23.960 --> 01:07:24.340
Und

01:07:24.340 --> 01:07:25.920
genau,

01:07:27.340 --> 01:07:27.520
das

01:07:27.520 --> 01:07:30.520
war LibUV,

01:07:31.180 --> 01:07:31.840
also das, was dann,

01:07:32.140 --> 01:07:34.020
das Ding ist, glaube ich, gestartet, irgendwann

01:07:34.020 --> 01:07:36.260
2011 oder so, das Projekt, und hat

01:07:36.260 --> 01:07:37.320
für Unix

01:07:37.320 --> 01:07:39.980
hat es halt LibEV benutzt, einfach.

01:07:40.060 --> 01:07:40.940
Das hat es einfach nur gerappt.

01:07:41.960 --> 01:07:43.580
Hat aber auch noch eine Windows-Geschichte

01:07:43.580 --> 01:07:45.420
mit dazu genommen, weil

01:07:45.420 --> 01:07:46.780
Windows macht das alles irgendwie anders.

01:07:48.160 --> 01:07:49.000
Das implementiert halt nicht

01:07:49.000 --> 01:07:52.120
dieses Reaktor-Pattern,

01:07:52.480 --> 01:07:53.760
wo du halt benachrichtigt wirst,

01:07:53.860 --> 01:07:54.920
wenn halt irgendwas passiert, sondern

01:07:54.920 --> 01:07:58.040
das ist ein Pro-Reactor.

01:07:59.000 --> 01:07:59.700
Also der Select ist

01:07:59.700 --> 01:08:00.960
ein Reaktor-Pattern?

01:08:01.080 --> 01:08:02.660
Ja, genau. Das sind die alle.

01:08:02.820 --> 01:08:03.680
Bei Unix ist das immer so.

01:08:04.740 --> 01:08:06.700
Was ist nochmal ein Reaktor-Trimmer?

01:08:06.980 --> 01:08:09.560
Du kriegst halt benachrichtigt, wenn irgendwas

01:08:09.560 --> 01:08:11.200
passiert und dann kannst du irgendwas machen.

01:08:11.480 --> 01:08:12.980
Warum heißt das Reaktor-Pattern?

01:08:12.980 --> 01:08:14.960
weil du darauf reagierst, wenn irgendwas passiert

01:08:14.960 --> 01:08:17.080
du bist in dem Moment nicht der

01:08:17.080 --> 01:08:18.880
Aktor, der aktiv

01:08:18.880 --> 01:08:20.700
wartet, sondern du bist der Reaktor, du sagst

01:08:20.700 --> 01:08:22.920
weck mich auf, wenn irgendwas ist

01:08:22.920 --> 01:08:24.620
ich hatte irgendwie gerade eine Negrile

01:08:24.620 --> 01:08:26.360
entdeckt, der Reaktor, wir abgeben

01:08:26.360 --> 01:08:29.100
und Windows macht es halt anders

01:08:29.100 --> 01:08:30.000
da gibt es diese

01:08:30.000 --> 01:08:33.160
Iocompletion Ports

01:08:33.160 --> 01:08:34.940
da ist auch alles nicht eine Datei

01:08:34.940 --> 01:08:35.740
sondern ein Handle

01:08:35.740 --> 01:08:41.140
und da

01:08:41.140 --> 01:08:42.700
ist es halt so, man

01:08:42.700 --> 01:08:45.060
passiert dann Dinge und der Kernel

01:08:45.060 --> 01:08:46.340
macht dann schon zum Beispiel, der lest dann schon, also

01:08:46.340 --> 01:08:49.140
bei dem React-Python

01:08:49.140 --> 01:08:50.880
ist es halt so, da musst du dann schon noch selber lesen, du kriegst

01:08:50.880 --> 01:08:52.880
bloß benachrichtigt, also du könntest jetzt, wenn du

01:08:52.880 --> 01:08:54.800
wolltest, dann könntest du erst was lesen und dann kannst du das halt

01:08:54.800 --> 01:08:55.260
machen oder nicht.

01:08:58.460 --> 01:08:58.740
Und

01:08:58.740 --> 01:09:00.680
bei Windows ist es halt so, der Kernel macht das dann halt

01:09:00.680 --> 01:09:01.520
und dann

01:09:01.520 --> 01:09:04.780
sagt er dir halt, wenn irgendwas completed ist,

01:09:04.860 --> 01:09:06.880
was damit passiert ist und wo es liegt

01:09:06.880 --> 01:09:08.500
oder so. Ich weiß nicht so genau, keine Ahnung.

01:09:08.820 --> 01:09:09.900
Wenn du das herrschst. Ja.

01:09:11.300 --> 01:09:12.440
Aber es ist halt grundsätzlich

01:09:12.440 --> 01:09:14.000
andere Art damit umzugehen.

01:09:14.780 --> 01:09:16.560
Und da gab es glaube ich tatsächlich auch,

01:09:16.680 --> 01:09:18.260
Microsoft selber hat da irgendwie

01:09:18.260 --> 01:09:20.640
Code beigesteuert zu LibUV,

01:09:20.780 --> 01:09:22.540
meine ich, und hat den Teil

01:09:22.540 --> 01:09:24.580
halt geschrieben und dann haben sie das

01:09:24.580 --> 01:09:26.540
halt unter einem Interface

01:09:26.540 --> 01:09:27.260
sozusagen

01:09:27.260 --> 01:09:30.440
verfügbar gemacht

01:09:30.440 --> 01:09:32.540
und halt LibUV verwendet für

01:09:32.540 --> 01:09:34.720
Unix und dann den Microsoft-Teil

01:09:34.720 --> 01:09:35.660
für Windows.

01:09:36.380 --> 01:09:38.160
Und sieht dann aber von der

01:09:38.160 --> 01:09:40.500
Anwendung gleich aus.

01:09:40.500 --> 01:09:42.760
und später haben sie dann aber

01:09:42.760 --> 01:09:44.740
LibEV wieder rausgeschmissen, glaube ich, und das dann selber nochmal

01:09:44.740 --> 01:09:46.380
alles geschrieben. Naja, also

01:09:46.380 --> 01:09:48.040
wie auch immer, aber

01:09:48.040 --> 01:09:50.660
es funktioniert. Inzwischen ist es gut getestet.

01:09:51.260 --> 01:09:52.700
Es gibt ja genug Node.js da draußen

01:09:52.700 --> 01:09:54.240
und so. Und

01:09:54.240 --> 01:09:55.320
es funktioniert gut.

01:09:57.020 --> 01:09:58.540
Und es ist halt auch richtig

01:09:58.540 --> 01:10:00.680
schnell. Und

01:10:00.680 --> 01:10:02.680
was diese Event-Club tatsächlich eigentlich

01:10:02.680 --> 01:10:03.480
macht, ist

01:10:03.480 --> 01:10:05.620
eben diese

01:10:05.620 --> 01:10:07.020
ganzen

01:10:07.020 --> 01:10:10.500
dieses I.O. Zeugs verwalten,

01:10:11.620 --> 01:10:14.200
aber halt auch Callbacks aufrufen.

01:10:14.520 --> 01:10:16.460
Also du kannst zum Beispiel bei deinem Event-Loop

01:10:16.460 --> 01:10:18.860
jetzt Callbacks registrieren für halt...

01:10:18.860 --> 01:10:20.340
Also ein Event-Loop ist ein eigener Prozess,

01:10:20.440 --> 01:10:22.360
der läuft und der die ganze Zeit guckt, was für Events da

01:10:22.360 --> 01:10:24.600
registriert sind und die dann aufrufen, wenn irgendwas passiert, oder?

01:10:24.800 --> 01:10:26.720
Nee, das Ding

01:10:26.720 --> 01:10:28.460
läuft immer...

01:10:29.160 --> 01:10:30.600
Es kann nur eine Event-Loop

01:10:30.600 --> 01:10:31.900
pro Thread geben.

01:10:32.820 --> 01:10:34.320
Du kannst mehrere haben, aber nur in

01:10:34.320 --> 01:10:35.700
unterschiedlichen Threads.

01:10:35.700 --> 01:10:36.300
und

01:10:36.300 --> 01:10:39.420
ja, das Ding läuft halt.

01:10:39.500 --> 01:10:41.660
Das ist halt die innerste Loop in deinem

01:10:41.660 --> 01:10:42.840
Programm, wenn du sowas benutzt.

01:10:42.840 --> 01:10:44.660
Das ist das, was mit LibUV

01:10:44.660 --> 01:10:47.020
hintergeht, oder? Das ist die Event-Loop.

01:10:47.820 --> 01:10:48.540
Ja, also

01:10:48.540 --> 01:10:51.060
LibUV ist eine Implementation, ja.

01:10:51.100 --> 01:10:52.600
Also so eine Wild-True-Schleife oder sowas.

01:10:53.120 --> 01:10:54.860
Ja, letztlich genau. Das Ding,

01:10:55.380 --> 01:10:56.200
ja, wobei das nicht

01:10:56.200 --> 01:10:58.900
busy-weighted, sondern das schläft dann halt

01:10:58.900 --> 01:11:00.780
auch, wenn nichts zu tun ist, aber

01:11:00.780 --> 01:11:02.760
sobald irgendwas zu tun ist, dann wird es

01:11:02.760 --> 01:11:04.840
sehr wach und agil und macht irgendwie

01:11:04.840 --> 01:11:05.020
Dinge.

01:11:08.720 --> 01:11:10.460
In dieser

01:11:10.460 --> 01:11:12.960
Einführung

01:11:12.960 --> 01:11:14.600
in ASIC.io von Lukas Langer

01:11:14.600 --> 01:11:16.480
zeigt er die Implementation

01:11:16.480 --> 01:11:19.020
der Python-Event-Loop

01:11:19.020 --> 01:11:20.460
glaube ich aus 3.4

01:11:20.460 --> 01:11:22.200
oder 3.5, ich weiß es nicht genau.

01:11:22.720 --> 01:11:24.160
Und das waren irgendwie so 20

01:11:24.160 --> 01:11:26.260
Zeilen, 30 Zeilen Python.

01:11:26.540 --> 01:11:28.140
Und es war tatsächlich eine while-true-Schleife.

01:11:28.760 --> 01:11:30.420
Und die hat im Wesentlichen nur gemacht so, geguckt,

01:11:30.820 --> 01:11:32.680
oh, welche Callbacks sollen jetzt gerade laufen?

01:11:33.380 --> 01:11:34.400
Dann hat sie aufgerufen,

01:11:34.840 --> 01:11:36.580
und dann noch irgendwie Signal-Handling gemacht und

01:11:36.580 --> 01:11:38.600
irgendwie, das war es im Wesentlichen.

01:11:38.680 --> 01:11:40.580
Und dann noch geguckt, welche sind jetzt beim

01:11:40.580 --> 01:11:42.900
nächsten, bei der nächsten Iteration

01:11:42.900 --> 01:11:44.900
dran und das war es eigentlich fast.

01:11:45.200 --> 01:11:46.140
Und das war die ganze Event-Loop.

01:11:46.340 --> 01:11:48.720
Also Event-Loop ist tatsächlich dieser Loop und da muss man Signale

01:11:48.720 --> 01:11:50.560
registrieren oder was? Oder die da hinten?

01:11:50.860 --> 01:11:52.480
Callbacks sind vor allen Dingen das, was

01:11:52.480 --> 01:11:54.000
man da rein

01:11:54.000 --> 01:11:55.960
tut, was dann da drin läuft.

01:11:56.140 --> 01:11:57.880
Die stehen dann in irgendeiner Liste, die immer wieder

01:11:57.880 --> 01:12:00.420
gemeinsam speichert quasi

01:12:00.420 --> 01:12:01.900
der...

01:12:01.900 --> 01:12:04.440
Wenn in Datei X irgendwas

01:12:04.440 --> 01:12:06.800
passiert, dann ruft damit diese Funktion auf.

01:12:06.940 --> 01:12:07.880
Ja, aber wie sag ich das?

01:12:08.880 --> 01:12:10.580
Da gibt es halt ein Interface.

01:12:10.980 --> 01:12:12.900
Du kannst Call soon zum Beispiel

01:12:12.900 --> 01:12:14.620
für jetzt soll dem nix laufen

01:12:14.620 --> 01:12:15.200
oder

01:12:15.200 --> 01:12:18.860
zum bestimmten

01:12:18.860 --> 01:12:20.420
Zeitpunkt. Also die Timer,

01:12:20.600 --> 01:12:22.440
du kannst dann auch Timer setzen und die werden halt ausgeführt

01:12:22.440 --> 01:12:24.600
und dann wird halt überprüft, ist das jetzt dran

01:12:24.600 --> 01:12:26.040
mit dem Laufen oder noch nicht.

01:12:28.920 --> 01:12:30.760
Also je nachdem, was halt so eine Eventloop anbietet.

01:12:31.280 --> 01:12:32.720
Es gibt ja da viele verschiedene

01:12:32.720 --> 01:12:34.780
Sorten Events. Und genau so ein

01:12:34.780 --> 01:12:36.540
Timer, ja, im Wesentlichen sagt man halt,

01:12:37.040 --> 01:12:38.500
wenn du auf so einen Timer wartest,

01:12:38.900 --> 01:12:40.700
dein Python-Programm

01:12:40.700 --> 01:12:42.520
sagt, ruft eine Funktion auf,

01:12:42.600 --> 01:12:43.640
die sagt, ich möchte

01:12:43.640 --> 01:12:46.780
um 0 Uhr möchte ich, dass diese Funktion

01:12:46.780 --> 01:12:47.760
gestartet wird.

01:12:48.900 --> 01:12:50.980
Und dann muss diese Event-Lob ja im Wesentlichen

01:12:50.980 --> 01:12:52.940
nichts anderes machen, als zu sagen, ist es schon 0 Uhr?

01:12:53.040 --> 01:12:54.900
Nein, ist es schon 0 Uhr? Und wenn es 0 Uhr

01:12:54.900 --> 01:12:56.680
ist, dann sagt sie ja und startet eben

01:12:56.680 --> 01:12:58.360
dieses registrierten Callback.

01:12:58.360 --> 01:12:59.680
Diese Funktion und genau.

01:13:00.900 --> 01:13:02.700
Also Callback ist einfach eine Funktion, ja.

01:13:02.720 --> 01:13:04.740
und du sagst, ich möchte, dass eine Funktion

01:13:04.740 --> 01:13:06.600
aufgerufen wird und die muss auch normalerweise

01:13:06.600 --> 01:13:08.840
schon fertig parametrisiert sein,

01:13:08.960 --> 01:13:10.740
also du kannst dann nicht sagen, mit

01:13:10.740 --> 01:13:12.540
folgenden Parametern, sondern du musst dann halt die so

01:13:12.540 --> 01:13:14.740
oder gibst halt irgendwie mit, aber im Wesentlichen

01:13:15.360 --> 01:13:16.780
sagst du nur, da soll dann ein

01:13:16.780 --> 01:13:18.660
Funktionsaufruf passieren. Also im Prinzip

01:13:18.660 --> 01:13:20.460
iteriert quasi dieser ganze Loop immer

01:13:20.460 --> 01:13:22.560
durch diese gleiche Liste und guckt, was da drin steht und versucht

01:13:22.560 --> 01:13:24.420
das dann auszuführen. Ja, nur halt

01:13:24.420 --> 01:13:26.560
schlau, er iteriert da nicht die ganze Zeit

01:13:26.560 --> 01:13:28.720
durch, sondern er sagt zum Beispiel

01:13:28.720 --> 01:13:30.560
wann ist denn der nächste Timer

01:13:30.560 --> 01:13:30.960
fällig?

01:13:30.960 --> 01:13:43.800
Das ist um 0 Uhr, das sind jetzt noch 1 Stunde 55, also kann ich 1 Stunde 55, ich schlafe mal 1 Stunde 54 und dann kannst du dich da so rantasten.

01:13:43.800 --> 01:13:50.680
Aber für die 1 Stunde 54 muss der ja nicht immer gucken, ist schon soweit, ist schon soweit, sondern die machen das halt schlauer.

01:13:50.760 --> 01:14:00.640
Und das ist eben genau der Trick daran, dass du dich nicht darum kümmern musst, wie der das macht, sondern dass diese Eventloop schlau genug ist, das für dich auf eine schlaue Art und Weise zu machen.

01:14:00.960 --> 01:14:21.460
Ja, genau, richtig, da war noch ein Spezialdings dabei, LibUV hat auch noch ein Threadpool irgendwie für, glaube ich, Kommunikation mit Files und so, aber im Grunde abstrahiert alles weg, was Low-Level unten runter passieren muss, damit es halt funktioniert und man hat dann halt ein sehr schönes Interface nach außen.

01:14:21.460 --> 01:14:23.500
und wenn man jetzt AsyncIO zum Beispiel verwendet,

01:14:23.640 --> 01:14:25.380
dann kann man einfach das AsyncIO-Interface

01:14:25.380 --> 01:14:26.760
verwenden und

01:14:26.760 --> 01:14:29.740
AsyncIO sagen,

01:14:29.940 --> 01:14:31.500
verwende doch LibUV als Event-Loop

01:14:31.500 --> 01:14:33.660
und dann benutzt es das Ding unten

01:14:33.660 --> 01:14:34.420
drunter.

01:14:35.460 --> 01:14:37.620
Und ein weiterer Trick, den es

01:14:37.620 --> 01:14:39.440
dann halt noch gibt, ist, das sind sogenannte

01:14:39.440 --> 01:14:39.980
Trampoline,

01:14:41.400 --> 01:14:42.080
also Callbacks.

01:14:42.080 --> 01:14:43.000
Wie man es will, jetzt aber.

01:14:43.640 --> 01:14:44.280
Ein Trampoline.

01:14:46.560 --> 01:14:48.040
Genau, wenn man das genau wissen will,

01:14:48.040 --> 01:14:50.180
wie das

01:14:50.180 --> 01:14:51.600
Wie das alles funktioniert,

01:14:51.880 --> 01:14:54.180
dieses Videoserie von Lukas Lange

01:14:54.180 --> 01:14:55.760
angucken, der erklärt das alles sehr ausführlich.

01:14:55.880 --> 01:14:56.900
Ich kann das jetzt nur so anreißen.

01:14:57.520 --> 01:14:59.960
Aber im Grunde ist es so, Callbacks, die sich halt

01:14:59.960 --> 01:15:01.700
selbst wieder registrieren, sozusagen, weil

01:15:01.700 --> 01:15:03.800
man ja, ich meine, wenn jetzt eine

01:15:03.800 --> 01:15:06.000
Funktion aufgerufen worden ist und gelaufen ist,

01:15:06.040 --> 01:15:07.360
dann ist ja dann eigentlich ja Schluss.

01:15:07.960 --> 01:15:09.940
Aber du hast ja oft so Tasks, die

01:15:09.940 --> 01:15:11.900
irgendwie die ganze Zeit irgendetwas machen

01:15:11.900 --> 01:15:13.880
und ab und zu mal und dann wieder schlafen.

01:15:14.280 --> 01:15:15.780
Wie kann das zum Beispiel sein, dass die sich dann

01:15:15.780 --> 01:15:18.020
schlafen legen und wieder aufwachen und dann nochmal was anderes machen?

01:15:18.380 --> 01:15:19.620
Das ging ja eigentlich nicht.

01:15:19.620 --> 01:15:21.400
oder auch die Reaktivität anpassen.

01:15:21.700 --> 01:15:23.580
Wenn du gemerkt hast, da ist jetzt nichts zu tun,

01:15:23.680 --> 01:15:26.000
dann schlafen die länger oder kürzer.

01:15:26.360 --> 01:15:27.820
Ja, und der Mechanismus,

01:15:27.960 --> 01:15:29.860
über den das geht, ist, die schedulen sich selbst

01:15:29.860 --> 01:15:30.740
wieder auf die Event-Loop.

01:15:32.320 --> 01:15:33.640
Hat jeder von uns schon mal gemacht.

01:15:34.480 --> 01:15:35.880
Ohne das Wort Trampoline

01:15:35.880 --> 01:15:37.000
zu kennen. Ja, wahrscheinlich.

01:15:37.580 --> 01:15:39.340
Genau. Und

01:15:39.340 --> 01:15:41.460
noch, wenn man jetzt

01:15:41.460 --> 01:15:43.780
guckt, wie ist der Mechanismus

01:15:43.780 --> 01:15:44.500
eigentlich dafür,

01:15:44.500 --> 01:15:46.480
der das macht,

01:15:46.660 --> 01:15:48.500
dann sind das halt tatsächlich einfach nur

01:15:48.500 --> 01:15:49.540
Generatoren eigentlich.

01:15:49.620 --> 01:15:50.300
unten drunter.

01:15:52.300 --> 01:15:53.720
Das ist doch der generelle Trick

01:15:53.720 --> 01:15:55.480
von Ace und Gaio, oder? Das sind alles einfach immer

01:15:55.480 --> 01:15:55.960
Generatoren.

01:15:57.360 --> 01:15:57.960
Ja, also

01:15:57.960 --> 01:16:01.540
man nennt es halt anders und

01:16:01.540 --> 01:16:03.700
es hat einen anderen Typ, aber es ist

01:16:03.700 --> 01:16:05.580
tatsächlich fast

01:16:05.580 --> 01:16:06.240
das Gleiche.

01:16:09.260 --> 01:16:09.660
Also

01:16:09.660 --> 01:16:11.600
die Step-Funktion in dem

01:16:11.600 --> 01:16:13.340
Generator ist halt eigentlich das, was du dann halt

01:16:13.340 --> 01:16:15.400
immer wieder in die Event-Loop rein tust.

01:16:16.220 --> 01:16:17.340
Und Await ist halt

01:16:17.340 --> 01:16:19.460
nur ein anderes Wort für Yield-From und

01:16:19.460 --> 01:16:20.720
vielfreundes halt genau das

01:16:20.720 --> 01:16:23.540
Ding, was halt die Generatorgeschichte

01:16:23.540 --> 01:16:25.020
da macht da an der Stelle.

01:16:25.900 --> 01:16:27.340
So hat doch Async.io auch

01:16:27.340 --> 01:16:29.220
angefangen, oder? Dass man einfach gesagt hat,

01:16:29.260 --> 01:16:31.340
wenn ich eine Menge von Generatoren habe, dann könnte ich die

01:16:31.340 --> 01:16:33.400
alle nacheinander mal ausführen

01:16:33.400 --> 01:16:34.960
lassen und die geben mir die Kontrolle zurück.

01:16:35.280 --> 01:16:37.320
Die haben genau diese Eigenschaft schon. Generatoren haben

01:16:37.320 --> 01:16:39.280
genau das, was man braucht, was man

01:16:39.280 --> 01:16:39.640
sagen kann.

01:16:40.780 --> 01:16:41.980
Sogenannte Co-Routinen.

01:16:43.440 --> 01:16:44.840
In einem Generator kann man ja sagen, okay,

01:16:45.240 --> 01:16:46.580
alles klar, jetzt gib mir doch mal das nächste,

01:16:46.580 --> 01:16:48.720
und jetzt stopp mal,

01:16:48.720 --> 01:16:49.820
bleibt mal kurz stehen,

01:16:50.480 --> 01:16:52.100
du machst jetzt erstmal nichts mehr

01:16:52.100 --> 01:16:54.380
und dann später kann man dem sagen, okay, und jetzt gibt es nochmal

01:16:54.380 --> 01:16:56.600
wieder was, das heißt, es sind schon Funktionen, die man

01:16:56.600 --> 01:16:58.520
irgendwie so anhalten und weiterlaufen lassen kann

01:16:58.520 --> 01:17:00.800
und wenn man

01:17:00.800 --> 01:17:02.000
das jetzt nicht nur aus der

01:17:02.000 --> 01:17:04.700
ich kann ja jetzt Sachen rausnehmen Perspektive sieht,

01:17:04.780 --> 01:17:05.940
sondern auch man kann da Sachen reintun,

01:17:06.880 --> 01:17:08.620
dann hat man eigentlich schon alles

01:17:08.620 --> 01:17:10.340
zusammen, was man braucht,

01:17:10.600 --> 01:17:12.820
um das zu implementieren.

01:17:13.540 --> 01:17:14.640
Und tatsächlich

01:17:14.640 --> 01:17:16.740
die werden alle

01:17:16.740 --> 01:17:18.420
fair gescheduled, das heißt

01:17:18.420 --> 01:17:20.740
also wenn man sich jetzt

01:17:20.740 --> 01:17:22.460
naja, da wäre

01:17:22.460 --> 01:17:23.700
ein Schaubild ganz nett,

01:17:24.280 --> 01:17:26.480
so als Klassen...

01:17:26.480 --> 01:17:28.020
Ja, wenn man sich das als

01:17:28.020 --> 01:17:30.680
wie ist die Vererbungs-Hierarchie

01:17:30.680 --> 01:17:31.960
an der Stelle, also was halt

01:17:31.960 --> 01:17:34.420
wenn man jetzt zum Beispiel async-dev schreibt,

01:17:34.660 --> 01:17:36.800
also async-dev-Funktion

01:17:36.800 --> 01:17:38.480
ist was sehr ähnliches wie eine normale

01:17:38.480 --> 01:17:40.540
Funktion, die jetzt irgendwie yield statt

01:17:40.540 --> 01:17:42.420
return sagt. Die wird nämlich

01:17:42.420 --> 01:17:44.480
intern in Python auch anders behandelt als normale

01:17:44.480 --> 01:17:46.460
Funktionen. Und auch

01:17:46.460 --> 01:17:47.720
dieser...

01:17:47.720 --> 01:17:50.120
Was auch sehr überraschend ist für Anfänger,

01:17:50.300 --> 01:17:51.020
oder wenn man das erklärt.

01:17:51.140 --> 01:17:53.940
Vielleicht müsste man statt Def einen Name, irgendwie Gen-Name machen

01:17:53.940 --> 01:17:54.380
oder sowas.

01:17:54.580 --> 01:17:57.320
Nein, nein, da schreibst du es schon so hin,

01:17:57.360 --> 01:17:59.460
aber wenn du sagst Yield, Embody der Funktion,

01:17:59.980 --> 01:18:01.920
dann wird das Ding anders behandelt und nicht mehr als

01:18:01.920 --> 01:18:02.180
normales.

01:18:02.180 --> 01:18:04.280
Ja, das ist die gleiche Art, wenn man die Deklaration dann anders machen würde,

01:18:04.360 --> 01:18:06.500
vielleicht mit einem Gen, statt einem Define,

01:18:06.600 --> 01:18:08.080
dann könnte man

01:18:08.080 --> 01:18:08.840
Ja, aber

01:18:08.840 --> 01:18:12.180
Du siehst dann halt an einer anderen Stelle und dann musst du

01:18:12.180 --> 01:18:14.120
aufpassen, dass das zusammenpasst.

01:18:14.120 --> 01:18:14.520
Ja.

01:18:16.780 --> 01:18:19.140
Ist schon okay, so wie es ist. Es ist nur einmal am Anfang,

01:18:19.260 --> 01:18:21.080
wenn man es erklärt zum ersten Mal, dann ist es echt

01:18:21.080 --> 01:18:23.100
weird. Ja, also

01:18:23.100 --> 01:18:24.320
im Grunde

01:18:24.320 --> 01:18:26.840
sind halt nur andere Schlüsselwörter,

01:18:27.160 --> 01:18:28.780
aber was man tatsächlich macht, ist halt

01:18:28.780 --> 01:18:31.080
einen Generator oder eine Funktion

01:18:31.080 --> 01:18:32.880
zu definieren, die halt irgendwelche

01:18:32.880 --> 01:18:34.780
Dinger, also einen Generator erzeugt

01:18:34.780 --> 01:18:37.040
und wenn man jetzt die Worte ändert, dann hat

01:18:37.040 --> 01:18:38.920
man fast das schon, was Async.io macht,

01:18:39.000 --> 01:18:40.560
nämlich, wenn man sagt, Async.dev

01:18:40.560 --> 01:18:42.660
ist, damit definiert man halt eine Funktion,

01:18:42.660 --> 01:18:44.880
die man anhalten kann und die man weiterlaufen

01:18:44.880 --> 01:18:46.680
lassen kann und

01:18:46.680 --> 01:18:48.940
wenn man die aufruft, kriegt man

01:18:48.940 --> 01:18:50.640
nicht das Ergebnis der Funktion zurück, sondern eine

01:18:50.640 --> 01:18:52.340
Kurroutine oder ein Generator

01:18:52.340 --> 01:18:54.980
Eine Routine, die man dann halt

01:18:54.980 --> 01:18:56.060
starten kann

01:18:56.060 --> 01:18:58.700
Genau, genau diese Runde

01:18:58.700 --> 01:19:00.080
bis der wieder Yieldsag gesagt hat

01:19:00.080 --> 01:19:01.880
Genau und

01:19:01.880 --> 01:19:04.220
das Ganze ist verpackt, also wenn man jetzt

01:19:04.220 --> 01:19:07.000
hat diese Ansichtfunktion und dann hat man

01:19:07.000 --> 01:19:10.920
diese Kurroutinen

01:19:10.920 --> 01:19:12.600
und diese Kurroutinen verpackt

01:19:12.600 --> 01:19:13.860
in ein Future,

01:19:14.720 --> 01:19:16.100
sozusagen das Interface von einem Future,

01:19:17.340 --> 01:19:18.300
sind ein Task.

01:19:20.480 --> 01:19:22.540
Und dann sind wir eigentlich komplett, weil das, was

01:19:22.540 --> 01:19:24.740
tatsächlich, was man haben will, sind eigentlich Tasks.

01:19:24.880 --> 01:19:26.360
Das ist halt so das, was eigentlich

01:19:26.360 --> 01:19:27.760
die

01:19:27.760 --> 01:19:30.740
Low-Level-Async-IO-Geschichte ist.

01:19:30.860 --> 01:19:32.480
Also ein Future hat ein erwartbares

01:19:32.480 --> 01:19:34.500
Ergebnis? Ja, ein Future ist

01:19:34.500 --> 01:19:36.160
sozusagen

01:19:36.160 --> 01:19:38.560
auch nur ein Interface für

01:19:38.560 --> 01:19:40.520
also in einem Future kann

01:19:40.520 --> 01:19:40.960
man halt

01:19:40.960 --> 01:19:43.840
das kann man halt fragen, so bist du fertig?

01:19:44.360 --> 01:19:45.860
Und dann sagt das halt ja oder nein, also dann.

01:19:46.380 --> 01:19:48.240
Oder man kann ein Result für den Future

01:19:48.240 --> 01:19:49.340
setzen, dann kann man sagen so

01:19:49.340 --> 01:19:52.040
future.setResult irgendwas

01:19:52.040 --> 01:19:54.060
und dann, wenn man sagt future.done,

01:19:54.180 --> 01:19:56.380
dann sagt das, ja, ich bin fertig, ich habe ja ein Result und dann kann man das Result

01:19:56.380 --> 01:19:58.560
auch holen und man kann

01:19:58.560 --> 01:20:00.360
dem auch sagen, man kann die

01:20:00.360 --> 01:20:02.220
verketten beliebig, genau, man kann auch solche Sachen

01:20:02.220 --> 01:20:04.440
sagen wie, wenn du fertig bist,

01:20:04.620 --> 01:20:06.340
dann ruf folgende Funktionen auf

01:20:06.340 --> 01:20:08.280
und das kann man...

01:20:08.280 --> 01:20:10.180
Ja, und das kann man beliebig vielen

01:20:10.180 --> 01:20:12.080
wieder machen und die gehen auch alle wieder

01:20:12.080 --> 01:20:13.900
auf die Event-Loop. Das ist auch ein

01:20:13.900 --> 01:20:16.180
interessanter Unterschied, als ich da so ein bisschen was drüber gelesen

01:20:16.180 --> 01:20:18.020
habe, habe ich das dann gesehen,

01:20:18.420 --> 01:20:20.080
es gab ein Node.js macht das

01:20:20.080 --> 01:20:22.140
anders und es gab da auch einen Vortrag

01:20:22.140 --> 01:20:24.020
von dem Ryan Dahl,

01:20:24.240 --> 01:20:26.100
der Node.js mal irgendwann entwickelt hat.

01:20:26.940 --> 01:20:27.820
Das ist jetzt auch schon wieder was her,

01:20:27.940 --> 01:20:29.720
2018 hat der hingehalten und meinte so, ja,

01:20:29.880 --> 01:20:31.620
Designfehler in Node.js früher.

01:20:32.340 --> 01:20:33.760
Also einer der Fehler ist halt, dass

01:20:33.760 --> 01:20:34.820
es eben nicht so,

01:20:35.700 --> 01:20:37.660
dass auch diese Promise-Geschichte in JavaScript

01:20:37.660 --> 01:20:39.860
nicht, dass Node.js

01:20:39.860 --> 01:20:41.840
nicht so wirklich drauf basiert, sondern dass sie halt auch

01:20:41.840 --> 01:20:43.860
viele Callbacks haben, die dann direkt ausgeführt werden

01:20:43.860 --> 01:20:45.680
und dann haben sie das Problem,

01:20:45.820 --> 01:20:47.600
dass ein Netzwerk dann doch nicht so gut funktioniert,

01:20:47.760 --> 01:20:49.860
weil sie teilweise nicht kontrollieren können,

01:20:49.960 --> 01:20:51.400
wann welche Callbacks ausgeführt werden

01:20:51.400 --> 01:20:53.240
und sie dann irgendwie, keine Ahnung,

01:20:53.360 --> 01:20:55.760
kompliziert Backpressure kriegen, Probleme kriegen

01:20:55.760 --> 01:20:57.820
an diversen Stellen und das dann alles irgendwie

01:20:57.820 --> 01:20:59.440
wie ein Kartenhaus in sich zusammenfällt.

01:20:59.760 --> 01:21:00.860
An der Stelle bräuchten wir vielleicht mal...

01:21:00.860 --> 01:21:01.100
...

01:21:01.100 --> 01:21:01.860
...

01:21:01.860 --> 01:21:03.860
...

01:21:03.860 --> 01:21:04.460
...

01:21:04.460 --> 01:21:04.860
...

01:21:04.860 --> 01:21:04.900
...

01:21:04.900 --> 01:21:04.920
...

01:21:04.920 --> 01:21:04.940
...

01:21:04.940 --> 01:21:04.960
...

01:21:04.960 --> 01:21:04.980
...

01:21:04.980 --> 01:21:05.000
...

01:21:05.000 --> 01:21:05.020
...

01:21:05.020 --> 01:21:05.040
...

01:21:05.040 --> 01:21:08.440
Genau, und in Python ist es halt so,

01:21:08.440 --> 01:21:38.420
und Jochen unterhalten sich über die Programmiersprache Python

01:21:38.440 --> 01:21:39.840
Multitasking hier funktioniert,

01:21:40.760 --> 01:21:42.240
dass die Prozesse einfach

01:21:42.240 --> 01:21:43.580
regelmäßig oder

01:21:43.580 --> 01:21:45.780
in möglichst kurzen Abständen

01:21:45.780 --> 01:21:47.680
yielden, damit eben die Eventloop andere Sachen

01:21:47.680 --> 01:21:48.960
machen kann.

01:21:50.040 --> 01:21:51.520
Genau, wenn man das nicht macht,

01:21:51.640 --> 01:21:52.440
hat man ein Problem.

01:21:52.940 --> 01:21:55.300
Dann hältst du halt im Wesentlichen die Eventloop an.

01:21:55.420 --> 01:21:56.300
Also wenn einer von denen

01:21:56.300 --> 01:21:59.420
hängen bleibt, sage ich mal,

01:22:00.480 --> 01:22:01.960
dann hat auch die Eventloop

01:22:01.960 --> 01:22:03.800
wenig Möglichkeiten, da was

01:22:03.800 --> 01:22:05.660
zu tun dagegen, weil die halt nie wieder

01:22:05.660 --> 01:22:06.140
dran ist.

01:22:06.140 --> 01:22:08.840
und das ist zum Beispiel

01:22:08.840 --> 01:22:11.900
in der Erlang-Welt anders, wenn da ein

01:22:11.900 --> 01:22:13.740
Actor, die haben auch

01:22:13.740 --> 01:22:15.640
natürlich Monitoring eingebaut

01:22:15.640 --> 01:22:18.000
automatisch, das heißt man kann

01:22:18.000 --> 01:22:19.900
da Timeouts setzen und wenn der

01:22:19.900 --> 01:22:21.940
Timeout erreicht ist, dann wird halt der Actor abgeschossen

01:22:21.940 --> 01:22:25.880
Ja, ja, also

01:22:25.880 --> 01:22:28.140
das ist halt

01:22:28.140 --> 01:22:28.640
da nochmal

01:22:28.640 --> 01:22:30.420
anders, ja

01:22:30.420 --> 01:22:32.860
und dann habe ich auch noch so ein bisschen

01:22:32.860 --> 01:22:35.760
Benchmarks gemacht, wollte einfach mal gucken

01:22:35.760 --> 01:22:37.660
wie schnell ist das denn alles so ungefähr

01:22:37.660 --> 01:22:40.100
und das war auch teilweise

01:22:40.100 --> 01:22:40.860
ganz interessant

01:22:40.860 --> 01:22:43.620
also bei Node.js

01:22:43.620 --> 01:22:44.980
kommt man ungefähr so bei

01:22:44.980 --> 01:22:48.400
es bietet einem dann

01:22:48.400 --> 01:22:50.260
ich habe

01:22:50.260 --> 01:22:52.100
NUX glaube ich irgendwo mal deployed

01:22:52.100 --> 01:22:54.100
und dann, also wenn man das

01:22:54.100 --> 01:22:56.040
startet, man kriegt nicht mal die Option, das auf

01:22:56.040 --> 01:22:58.040
mehreren Prozessen laufen zu lassen oder so, sondern

01:22:58.040 --> 01:23:00.200
man kriegt halt irgendwie einen Prozess mit der Event-Loop und das war's

01:23:00.200 --> 01:23:02.000
aber der macht halt dann auch schon so

01:23:02.000 --> 01:23:04.060
7000 Requests pro Sekunde oder so, wenn man jetzt

01:23:04.060 --> 01:23:04.740
einfach nur

01:23:04.740 --> 01:23:07.640
ein Stückchen

01:23:07.640 --> 01:23:09.100
Hello World JSON zurückgibt.

01:23:09.800 --> 01:23:11.560
Das ist schon

01:23:11.560 --> 01:23:12.020
sehr schnell.

01:23:12.760 --> 01:23:15.360
Wenn man das konfigurieren könnte, was ich nicht konnte,

01:23:15.520 --> 01:23:17.180
aber dann kann man das bestimmt auf mehreren Prozessen

01:23:17.180 --> 01:23:17.900
auch laufen lassen.

01:23:18.580 --> 01:23:21.500
Das wird dann wahrscheinlich in der ähnlichen Richtung,

01:23:21.560 --> 01:23:23.320
weil es die gleiche Event-Loop ist, liegen,

01:23:23.600 --> 01:23:25.020
wie wenn man jetzt irgendwie

01:23:25.020 --> 01:23:27.020
einfach nur Starlet nimmt oder

01:23:27.020 --> 01:23:28.980
so, halt Async

01:23:28.980 --> 01:23:31.340
Webserver und dann libuv drunter

01:23:31.340 --> 01:23:33.480
und auch wieder so Hello World JSON zurückgibt,

01:23:33.480 --> 01:23:35.460
dann kommt man so auf

01:23:35.460 --> 01:23:37.480
35.000 Requests pro Sekunde bei einer

01:23:37.480 --> 01:23:38.420
8-Core-Maschine

01:23:38.420 --> 01:23:41.060
also bei meinem

01:23:41.060 --> 01:23:43.460
etwas weniger als 7.000

01:23:43.460 --> 01:23:44.560
nee mehr, aber

01:23:44.560 --> 01:23:47.080
ist etwas weniger als 7.000 pro Core

01:23:47.080 --> 01:23:48.360
ja das kann sein, genau

01:23:48.360 --> 01:23:51.080
ist ein bisschen weniger

01:23:51.080 --> 01:23:53.020
genau, braucht auch ein bisschen

01:23:53.020 --> 01:23:53.720
aber es ist

01:23:53.720 --> 01:23:56.420
auf einem Prozess ist es aber ähnlich

01:23:56.420 --> 01:23:58.160
auf einem Prozess ist es fast gleich

01:23:58.160 --> 01:23:59.740
also es macht da echt kaum einen Unterschied

01:23:59.740 --> 01:24:03.020
ja gut, die werden halt auch im Wesentlichen

01:24:03.020 --> 01:24:04.940
nicht viel anderes machen. Das sind ja kurze

01:24:04.940 --> 01:24:06.980
Funktionen, die ausgeführt werden, wenn so ein

01:24:08.060 --> 01:24:08.720
WPV-Core

01:24:08.720 --> 01:24:11.020
kommt. Ja, und die Latenz war auch

01:24:11.020 --> 01:24:12.740
fast gleich. Tatsächlich bei

01:24:12.740 --> 01:24:15.140
Node.js ein bisschen konstanter als bei

01:24:15.140 --> 01:24:16.220
Python.

01:24:18.740 --> 01:24:19.060
Aber

01:24:19.060 --> 01:24:20.940
auch so, also tatsächlich

01:24:20.940 --> 01:24:22.800
die Netzwerklatenz zwischen den beiden Rechnern, auf denen

01:24:22.800 --> 01:24:24.280
ich das probiert habe, war so 2-3 Millisekunden.

01:24:25.240 --> 01:24:26.700
Und die

01:24:26.700 --> 01:24:29.100
gemessene

01:24:29.100 --> 01:24:31.300
Latenz war dann so 12-13 Millisekunden

01:24:31.300 --> 01:24:32.940
immer. Sowohl bei Node.js wie auch

01:24:32.940 --> 01:24:35.000
bei Python. Auch wahrscheinlich

01:24:35.000 --> 01:24:36.560
eben die Datation von UB halt.

01:24:37.300 --> 01:24:38.640
Aber das ist auch schon ziemlich gut.

01:24:38.940 --> 01:24:40.340
Also kann man nicht mehrkennen.

01:24:41.420 --> 01:24:42.960
Wenn man jetzt Django nimmt

01:24:42.960 --> 01:24:44.940
und nicht irgendwie so einen rohen

01:24:44.940 --> 01:24:46.820
Async-Server,

01:24:47.160 --> 01:24:48.840
also UV-Corn habe ich

01:24:48.840 --> 01:24:51.200
verwendet halt als Applikationsserver.

01:24:52.540 --> 01:24:54.720
Wenn man jetzt UV-Corn nimmt

01:24:54.720 --> 01:24:56.920
und Django, dann sieht das halt

01:24:56.920 --> 01:24:58.220
ein bisschen anders aus.

01:24:58.400 --> 01:24:59.620
Dann ist halt leider,

01:25:00.620 --> 01:25:02.460
also da gehen insgesamt nur so

01:25:02.460 --> 01:25:04.460
3000 Requests pro Sekunde durch, ungefähr.

01:25:05.700 --> 01:25:06.660
Wahrscheinlich liegt das

01:25:06.660 --> 01:25:08.640
irgendwie an diesem ganzen Middleware-Stack oder ich weiß nicht genau,

01:25:08.700 --> 01:25:10.480
woran es liegt, aber... Ja, der macht halt sehr viel.

01:25:10.560 --> 01:25:11.740
Macht halt sehr viel pro View.

01:25:12.540 --> 01:25:14.520
Ja, also das ist deutlich

01:25:14.520 --> 01:25:16.500
weniger und es ist halt auch, die

01:25:16.500 --> 01:25:18.300
Latenz ist halt deutlich höher. Die ist irgendwie

01:25:18.300 --> 01:25:20.260
direkt bei so 30 Millisekunden oder so. Ich meine, das ist

01:25:20.260 --> 01:25:21.720
immer noch nicht viel, aber es ist halt dann schon mal

01:25:21.720 --> 01:25:24.420
so, puh, oi, das

01:25:24.420 --> 01:25:26.340
war schon... Ja, ich meine,

01:25:26.380 --> 01:25:28.360
das ist alles völlig irrelevant, ja? Also nicht, dass ich

01:25:28.360 --> 01:25:30.340
jemals irgendwie... Ja, klar, aber die Zahlen sind halt

01:25:30.340 --> 01:25:31.680
schon deutlich unterschiedlich. Ja.

01:25:31.680 --> 01:25:35.100
und was ich dann krass fand ist, wenn man

01:25:35.100 --> 01:25:38.700
Django nimmt mit

01:25:38.700 --> 01:25:40.680
Junicorn und zum Beispiel

01:25:40.680 --> 01:25:41.600
G-Event-Worker

01:25:41.600 --> 01:25:44.860
dann ist das auf einer CPU auch so bei

01:25:44.860 --> 01:25:46.760
8000 Request pro Sekunde, also sogar noch ein bisschen schneller als

01:25:46.760 --> 01:25:47.160
CPUI

01:25:47.160 --> 01:25:50.660
auch mit relativ wenig

01:25:50.660 --> 01:25:52.700
Latenz, also das hat mich auch gewundert

01:25:52.700 --> 01:25:54.820
wow, krass, wusste ich, hätte ich jetzt nicht gedacht

01:25:54.820 --> 01:25:56.440
also das

01:25:56.440 --> 01:25:58.720
das fand ich

01:25:58.720 --> 01:25:59.680
ganz beachtlich

01:25:59.680 --> 01:26:02.380
und auch Latenz besser,

01:26:02.980 --> 01:26:04.500
aber du kannst es nicht als ASGI

01:26:04.500 --> 01:26:05.240
laufen lassen, sondern

01:26:05.240 --> 01:26:08.600
über Whiskey-Interface.

01:26:09.360 --> 01:26:10.400
Und da kannst du natürlich viele Dinge

01:26:10.400 --> 01:26:11.040
so nicht mehr machen.

01:26:13.240 --> 01:26:14.520
Aber da ist das dann

01:26:14.520 --> 01:26:16.180
gar nicht mehr so langsam. Ich glaube,

01:26:16.320 --> 01:26:17.760
momentan ist es halt noch so, dass

01:26:17.760 --> 01:26:20.280
die ASGI-Geschichten nehmen irgendwie einen Sonderweg

01:26:20.280 --> 01:26:22.420
in Django und dieser Sonderweg ist irgendwie ein Stückchen langsamer.

01:26:23.580 --> 01:26:24.220
Ja, aber

01:26:24.220 --> 01:26:26.300
keine Ahnung. Aber da würdest du jetzt

01:26:26.300 --> 01:26:28.120
dann natürlich auch nicht deinen File-Server

01:26:28.120 --> 01:26:30.220
bauen. Würdest du dich trauen,

01:26:30.420 --> 01:26:32.360
einen File-Server mit Django,

01:26:32.460 --> 01:26:33.820
ASCII, UV-Corn zu machen?

01:26:34.060 --> 01:26:35.880
Ich glaube, das ginge wahrscheinlich sogar, tatsächlich.

01:26:36.600 --> 01:26:37.680
Also wahrscheinlich wäre das schnell genug.

01:26:37.680 --> 01:26:39.700
Oder würdest du den raustun und in den Starlight reintun?

01:26:40.340 --> 01:26:42.400
Ja, das wäre eben auch so eine Sache.

01:26:44.720 --> 01:26:46.320
Wahrscheinlich würde ich es eher mit so etwas wie Starlight

01:26:46.320 --> 01:26:48.140
probieren oder FastAPI oder so.

01:26:49.000 --> 01:26:50.140
Genau, einfach

01:26:50.140 --> 01:26:51.240
deswegen, weil das da

01:26:51.240 --> 01:26:54.180
so seamless ist quasi. Das ist halt

01:26:54.180 --> 01:26:55.240
irgendwie

01:26:55.240 --> 01:26:57.880
dafür schon gebaut und das funktioniert einfach so.

01:26:58.120 --> 01:26:59.960
und was ja auch toll ist,

01:27:00.080 --> 01:27:01.860
du kannst ja auch über

01:27:01.860 --> 01:27:03.960
ASCII halt mehrere

01:27:03.960 --> 01:27:04.940
Applikationen haben.

01:27:05.920 --> 01:27:07.880
Du nimmst halt einen Applikationsserver und

01:27:07.880 --> 01:27:09.760
sagst dem halt unter der URL, es ist halt

01:27:09.760 --> 01:27:11.800
irgendwie, deine ASCII-Applikation ist halt

01:27:11.800 --> 01:27:13.800
jetzt irgendwie FastAPI oder sonst irgendwas

01:27:13.800 --> 01:27:15.960
und unter der URL ist es halt

01:27:15.960 --> 01:27:17.120
Django. Gar kein Problem.

01:27:17.940 --> 01:27:19.700
Und gibst den halt unterschiedliche Funktionen mit und dann

01:27:19.700 --> 01:27:20.480
ist das halt so.

01:27:21.840 --> 01:27:23.620
Sodass du halt auch sowas machen, wenn du

01:27:23.620 --> 01:27:26.080
es jetzt schaffst, irgendwie zum Beispiel Sachen zu authentifizieren,

01:27:26.920 --> 01:27:27.800
du kriegst ja das gleiche

01:27:27.800 --> 01:27:29.020
Session Cookie zum Beispiel.

01:27:29.400 --> 01:27:30.680
Und dann kannst du natürlich auch die Autorisierung

01:27:30.680 --> 01:27:33.140
in irgendwas anderes machen und nicht unbedingt in Django.

01:27:33.700 --> 01:27:35.440
Wenn das geht, und das geht bestimmt irgendwie,

01:27:36.020 --> 01:27:37.500
dann kannst du auch das Ding dazu

01:27:37.500 --> 01:27:38.600
verwenden, die Files auszuliefern.

01:27:39.400 --> 01:27:41.080
Oder könntest du es über einen geteilten Cache oder

01:27:41.080 --> 01:27:43.860
irgendwelche anderen Messages machen, dass du quasi...

01:27:43.860 --> 01:27:45.720
Dass man das andere

01:27:45.720 --> 01:27:58.890
Ding dann halt irgendwie fragt Ja das k man wahrscheinlich auch machen Sogar dieses ASCII k man das machen ja Ja also wie auch immer das kriegt man auf jeden Fall hin denke ich Und dann br man vielleicht diese ganze Nginx schon nicht mehr und kann es einfach auch alles

01:27:58.890 --> 01:28:00.150
direkt in Python machen.

01:28:00.510 --> 01:28:02.630
Ja gut, irgendwas brauchst du davor, um es zu terminieren.

01:28:02.850 --> 01:28:03.670
Also SSL-Termination.

01:28:04.170 --> 01:28:05.250
Genau, das willst du nicht.

01:28:06.670 --> 01:28:07.870
Also das ist meine aktuelle

01:28:07.870 --> 01:28:10.890
Geschichte, ja, Traffic.

01:28:11.910 --> 01:28:12.930
Und ich fand es

01:28:12.930 --> 01:28:14.010
hakelig zu konfigurieren.

01:28:14.010 --> 01:28:15.970
Das ist Traffic für die

01:28:15.970 --> 01:28:17.810
Leute, die mitgoogeln wollen.

01:28:18.950 --> 01:28:18.970
Und

01:28:18.970 --> 01:28:21.970
das ist so ein

01:28:21.970 --> 01:28:24.150
Loadbalancer TCP, HTTP

01:28:24.150 --> 01:28:26.010
und mit eingebautem

01:28:26.010 --> 01:28:28.290
SSL. Ja, es ist hauptsächlich ein Loadbalancer,

01:28:28.450 --> 01:28:30.010
oder? Habe ich so verstanden. Ja, ja, ja.

01:28:30.050 --> 01:28:31.310
Die machen gar kein Web-Server-Kram.

01:28:33.310 --> 01:28:34.290
SSL Termination

01:28:34.290 --> 01:28:35.810
und Loadbalancer. Ja, genau.

01:28:36.810 --> 01:28:37.330
Und das Ding ist

01:28:37.330 --> 01:28:39.790
in Go geschrieben

01:28:39.790 --> 01:28:42.050
und performt auch. Es ist auch so, wenn man

01:28:42.050 --> 01:28:43.830
SSL anschaltet, habe ich dann natürlich auch getestet,

01:28:44.170 --> 01:28:45.870
wie ist das eigentlich, wenn man jetzt SSL im Anmach

01:28:45.870 --> 01:28:48.030
Ja, es ist

01:28:48.030 --> 01:28:49.630
verbrennt gut CPU und

01:28:49.630 --> 01:28:51.990
es ist dann alles nur noch halb so schnell.

01:28:52.710 --> 01:28:54.130
Aber okay, das ist ja

01:28:54.130 --> 01:28:55.510
gut, klar, dass das was kostet.

01:28:55.730 --> 01:28:58.030
Das ist ja irgendwie logisch. Ja gut, aber das sind ja Kosten,

01:28:58.210 --> 01:29:00.150
die man, also da kommst du halt nicht drum um.

01:29:01.070 --> 01:29:02.150
Die hast du halt irgendwo.

01:29:04.010 --> 01:29:04.410
Genau.

01:29:04.930 --> 01:29:06.230
Und ja,

01:29:06.790 --> 01:29:07.670
also das war eigentlich,

01:29:08.090 --> 01:29:10.050
also insofern würde ich sagen, also Django ist halt momentan

01:29:10.050 --> 01:29:11.930
noch im Vergleich zu Node.js und

01:29:11.930 --> 01:29:14.130
reinem Ubiquon irgendwie ein Stück

01:29:14.130 --> 01:29:16.290
ein Stück langsamer, woran es genau liegt, weiß ich nicht.

01:29:16.690 --> 01:29:18.170
Aber es ist auch schnell genug wahrscheinlich

01:29:18.170 --> 01:29:20.010
für alles, was man irgendwie so damit machen möchte. Insofern

01:29:20.010 --> 01:29:21.150
eigentlich kein großes Problem.

01:29:23.970 --> 01:29:24.370
Und

01:29:24.370 --> 01:29:25.590
dann habe ich auch nochmal Erlang getestet.

01:29:26.310 --> 01:29:27.450
Und Erlang war

01:29:27.450 --> 01:29:30.270
Erlang war

01:29:30.270 --> 01:29:32.190
quasi genauso schnell wie

01:29:32.190 --> 01:29:34.290
Ubicorn auf allen CPUs.

01:29:34.790 --> 01:29:36.070
Hat auch irgendwie alle

01:29:36.070 --> 01:29:38.250
CPUs komplett ausgelastet und

01:29:38.250 --> 01:29:40.010
hat halt auch so

01:29:40.010 --> 01:29:41.870
35.000 Requests pro Sekunde ungefähr gemacht.

01:29:42.250 --> 01:29:43.690
Aber was ich total überraschend fand

01:29:43.690 --> 01:29:46.070
und das hat mich auch beeindruckt, ehrlich gesagt,

01:29:46.570 --> 01:29:48.110
war, dass die Latenz,

01:29:48.670 --> 01:29:49.470
also du hast ja dann immer so,

01:29:49.830 --> 01:29:51.630
also die meisten Requests liegen halt alle

01:29:51.630 --> 01:29:53.590
in so einem engen Korridor von Zeit,

01:29:53.690 --> 01:29:55.850
Latenz, und dann hast du halt

01:29:55.850 --> 01:29:57.350
so ein paar Ausreißer irgendwie so und

01:29:57.350 --> 01:29:59.070
eigentlich schon eher viele,

01:29:59.210 --> 01:30:01.450
manchmal dauern Dinge dann länger und das sind wir ja eigentlich auch nicht

01:30:01.450 --> 01:30:03.970
und bei Erlang hat man das praktisch gar nicht.

01:30:04.310 --> 01:30:05.390
Die brauchen alle genau gleich lang

01:30:05.390 --> 01:30:07.350
und alle nur so 3 Millisekunden.

01:30:07.670 --> 01:30:09.370
Die Latenz zwischen den beiden Rechnern,

01:30:09.430 --> 01:30:11.850
wenn man Ping macht, sind halt irgendwie 2,47

01:30:11.850 --> 01:30:12.950
Millisekunden oder sowas

01:30:12.950 --> 01:30:15.030
und die Latenz bei den Erlang-Lingern ist halt

01:30:15.030 --> 01:30:16.790
3 Millisekunden. Also wow, krass.

01:30:17.230 --> 01:30:18.210
Okay, das ist

01:30:18.210 --> 01:30:20.710
Ja, das ist eben diese Telefonie.

01:30:20.910 --> 01:30:23.070
Das ist einfach ein Realtime-System

01:30:23.070 --> 01:30:23.490
und

01:30:23.490 --> 01:30:26.870
das merkt man eben an so einer Stelle

01:30:26.870 --> 01:30:28.950
ziemlich deutlich. Also da waren halt eben

01:30:28.950 --> 01:30:30.970
also ja, das fand ich

01:30:30.970 --> 01:30:32.430
durchaus auch beeindruckend.

01:30:34.890 --> 01:30:36.610
Aber wie kann man jetzt diese beiden Welten

01:30:36.610 --> 01:30:38.330
verheiraten, Jochen? Wie würdest du das jetzt?

01:30:39.470 --> 01:30:40.610
Kann man ja auch machen.

01:30:40.610 --> 01:30:42.070
Man könnte ja auch sagen, okay,

01:30:42.070 --> 01:30:45.370
und man lässt das über den gleichen Loadbalancer gehen.

01:30:46.330 --> 01:30:47.990
Ja, okay, wenn man so einen Loadbalancer hat, ja.

01:30:48.750 --> 01:30:50.690
Ja, okay, man braucht irgendwas in der Richtung

01:30:50.690 --> 01:30:54.750
und dann könnte ja auch zum Beispiel Erlang die Session-Cookies von Django kriegen,

01:30:54.810 --> 01:30:55.610
weil es ja die gleiche Domain.

01:30:56.290 --> 01:30:58.430
Ja, wobei Session-Cookies reichen ja alleine nicht aus.

01:30:58.530 --> 01:31:01.830
Du hast ja oft bei Authentifizierung irgendwelche Datenbankaufrufe,

01:31:02.390 --> 01:31:06.410
ob du welche Dateien du sehen darfst oder welche Bilder oder was weiß ich.

01:31:06.610 --> 01:31:09.530
Ja, klar, okay, aber du kannst ja auf die gleiche Datenbank gehen.

01:31:09.610 --> 01:31:10.370
Das könntest du ja machen.

01:31:10.370 --> 01:31:12.450
Ja, ne, aber da, klar

01:31:12.450 --> 01:31:13.230
die

01:31:13.230 --> 01:31:16.170
eine Lösung, die ich mal gesehen habe, ist, dass du das über

01:31:16.170 --> 01:31:18.450
S3-Buckets machst und dann solche Tickets mitschickst

01:31:18.450 --> 01:31:20.210
weil da kannst du so Authentifizierungstickets

01:31:20.210 --> 01:31:22.550
Moment, du machst über welche Tickets

01:31:22.550 --> 01:31:23.230
auf welche Buckets?

01:31:24.930 --> 01:31:26.570
Ist egal, das Wichtige ist

01:31:26.570 --> 01:31:28.410
du hast zwei Systeme und das eine System

01:31:28.410 --> 01:31:30.470
sagt dem anderen, ja, du darfst die Datei ausliefern

01:31:30.470 --> 01:31:32.510
oder nein, du darfst sie nicht ausliefern. Und das eine ist in Erlangen

01:31:32.510 --> 01:31:34.530
und das andere ist Dango zum Beispiel. Und sowas

01:31:34.530 --> 01:31:36.450
könnte man da ja prinzipiell auch machen, dass du sagst

01:31:36.450 --> 01:31:38.450
du hast irgendwie so eine interne Schnittstelle

01:31:38.450 --> 01:31:40.590
die der aufruft und sagt

01:31:40.590 --> 01:31:42.670
darf dieser Session Cookie diese Datei

01:31:42.670 --> 01:31:43.230
abrufen

01:31:43.230 --> 01:31:46.910
sowas könnte man machen, dass du quasi

01:31:46.910 --> 01:31:49.090
da eine interne Schnellstelle hast

01:31:49.090 --> 01:31:50.210
weil das brauchst du auf jeden Fall

01:31:50.210 --> 01:31:52.850
wenn du das alles in ASCII hast, hast du auch eine

01:31:52.850 --> 01:31:54.990
interne Schnellstelle, auch wenn du eben

01:31:54.990 --> 01:31:56.130
Starlet und

01:31:56.130 --> 01:31:58.890
Django zusammen verwendest, brauchst du auch

01:31:58.890 --> 01:32:01.050
eine Schnellstelle, das ist dann halt eine Python-Funktion

01:32:01.050 --> 01:32:02.270
wenn du

01:32:02.270 --> 01:32:05.110
zwei VMs quasi in einem Loadbalancer

01:32:05.110 --> 01:32:06.870
zusammentust, hättest du auch eine Schnellstelle, die dann

01:32:06.870 --> 01:32:07.730
halt aber eine HTTP

01:32:07.730 --> 01:32:37.710
Ja, genau.

01:32:37.730 --> 01:32:40.750
wie man Django Sessions

01:32:40.750 --> 01:32:42.610
von Erlang aus authentifizieren kann

01:32:42.610 --> 01:32:44.870
und der Fazit von dem Blogpost

01:32:44.870 --> 01:32:45.890
war irgendwie so, ja ja, das geht.

01:32:47.230 --> 01:32:47.830
Aber...

01:32:47.830 --> 01:32:50.070
Das ist ja im Wesentlichen eine Datenbank-Tabelle,

01:32:50.210 --> 01:32:52.410
da steht der Session-Cookie drin und ein

01:32:52.410 --> 01:32:54.470
serialisiertes, ein Base64

01:32:54.470 --> 01:32:56.450
serialisiertes JSON.

01:32:56.990 --> 01:32:58.710
War das, ja ja, das geht, aber lass es

01:32:58.710 --> 01:33:00.090
lieber, oder war das, ja ja, geht, aber...

01:33:00.090 --> 01:33:01.690
Der brauchte das für irgendwas.

01:33:02.410 --> 01:33:03.670
Das hat man halt mal so gebaut und

01:33:03.670 --> 01:33:06.450
das ist natürlich schon pummelig und das ist nicht so,

01:33:06.450 --> 01:33:07.210
oder ist das irgendwie,

01:33:08.350 --> 01:33:08.950
dass man das irgendwo...

01:33:08.950 --> 01:33:11.790
Das gibt keine Konfigurationsoption oder so, dass man sagt,

01:33:11.910 --> 01:33:14.250
Django ja, aber man muss das dann

01:33:14.250 --> 01:33:15.130
selber...

01:33:15.130 --> 01:33:17.430
Aber es geht schon, also insofern,

01:33:18.270 --> 01:33:18.430
ja.

01:33:19.290 --> 01:33:21.430
Ja, und das ist auch nicht super

01:33:21.430 --> 01:33:24.010
kompliziert schlimm. Also es ist nicht, du musst jetzt hier

01:33:24.010 --> 01:33:26.050
den internen Code von Django

01:33:26.050 --> 01:33:27.550
lesen und verstehen und

01:33:27.550 --> 01:33:29.510
erinnern sich alle meine Releasern.

01:33:29.650 --> 01:33:32.430
Du musst auf die Datenbank-Tabelle zugreifen

01:33:32.430 --> 01:33:34.210
und Base64 dekodieren und JSON

01:33:34.210 --> 01:33:34.950
lesen und fertig.

01:33:34.950 --> 01:33:36.250
PipX install, oder?

01:33:37.610 --> 01:33:38.870
Ja, genau.

01:33:40.290 --> 01:33:40.830
Oder halt,

01:33:40.930 --> 01:33:42.430
keine Ahnung, wie es bei Erlangen heißt,

01:33:42.550 --> 01:33:44.910
Beam install Python Django.

01:33:46.750 --> 01:33:46.910
Ja.

01:33:48.350 --> 01:33:49.030
Ja, aber

01:33:49.030 --> 01:33:49.970
ja, fand ich

01:33:49.970 --> 01:33:52.910
fand ich

01:33:52.910 --> 01:33:54.430
konzert überhaupt,

01:33:54.570 --> 01:33:56.670
FastAPI habe ich mich jetzt ein bisschen mit beschäftigt,

01:33:57.010 --> 01:33:58.790
mal zuerst,

01:33:58.950 --> 01:34:00.230
ich habe das immer mal schon verfolgt,

01:34:00.230 --> 01:34:01.910
das ist eigentlich ganz interessant,

01:34:02.290 --> 01:34:04.050
und jetzt habe ich es ein bisschen intensiver mir angeguckt,

01:34:04.050 --> 01:34:05.970
und das ist wirklich eigentlich ziemlich cool, muss man sagen.

01:34:06.050 --> 01:34:08.130
Auf der einen Seite, sehr cool,

01:34:08.290 --> 01:34:08.890
auf der anderen Seite,

01:34:10.170 --> 01:34:11.970
ich vermisse bei Django

01:34:11.970 --> 01:34:13.790
eben schon solche Sachen, dass halt da ist halt

01:34:13.790 --> 01:34:15.550
Registrierung, Authentifizierung, also

01:34:15.550 --> 01:34:17.970
wobei, ehrlich gesagt, ich finde es fast noch ein bisschen zu wenig, also

01:34:17.970 --> 01:34:19.850
Registrierung muss man ja auch immer dann schon überlegen bei Django,

01:34:20.410 --> 01:34:22.310
aber dass halt zumindest Authentifizierung

01:34:22.310 --> 01:34:23.970
und so halbwegs eigentlich alles schon

01:34:23.970 --> 01:34:26.050
drin hat und bei FastAPI

01:34:26.050 --> 01:34:28.030
das macht man schon mehr oder weniger

01:34:28.030 --> 01:34:29.990
so roh selber und das

01:34:29.990 --> 01:34:31.930
ist halt ein bisschen so, okay,

01:34:33.070 --> 01:34:33.770
ich muss hier wirklich,

01:34:33.770 --> 01:34:35.470
man kann die Hashfunktion auswählen und

01:34:35.470 --> 01:34:37.750
ja. Hat ja auch einen gewissen Security

01:34:37.750 --> 01:34:39.110
Impact. Jaja.

01:34:40.870 --> 01:34:41.270
Genau.

01:34:41.330 --> 01:34:43.550
Die Verantwortung will ich gar nicht haben. Don't do it yourself.

01:34:44.930 --> 01:34:45.290
Try.

01:34:45.690 --> 01:34:47.670
Ja, also insofern

01:34:47.670 --> 01:34:49.310
da muss man halt eine ganze Menge Dinge

01:34:49.310 --> 01:34:51.650
tun, die man vielleicht gar nicht

01:34:51.650 --> 01:34:53.650
machen will, aber auf der anderen Seite ist es halt so,

01:34:53.690 --> 01:34:55.050
man sitzt halt auch wirklich mit dem

01:34:55.050 --> 01:34:57.670
mit dem Hintern roh

01:34:57.670 --> 01:34:58.150
auf dem

01:34:58.150 --> 01:35:01.630
auf der Performance und kann halt auch,

01:35:01.630 --> 01:35:03.670
wenn man jetzt müsste, man muss zwar nie,

01:35:03.770 --> 01:35:04.630
war ein Götter.

01:35:06.530 --> 01:35:08.770
Man muss doch eigentlich gar nicht.

01:35:10.570 --> 01:35:12.370
Wir lösen das durch mehr Prozessoren.

01:35:13.970 --> 01:35:15.750
Ja, auf jeden Fall. Genau. FastAPI

01:35:15.750 --> 01:35:17.610
eigentlich auch eine sehr schöne Geschichte und macht

01:35:17.610 --> 01:35:18.610
diverse Dinge richtig.

01:35:19.570 --> 01:35:20.830
Zum Beispiel, dass das

01:35:20.830 --> 01:35:23.450
Webinterface so komplett

01:35:23.450 --> 01:35:25.450
integriert ist und alles. Das macht Dinge

01:35:25.450 --> 01:35:26.430
schon deutlich einfacher.

01:35:28.470 --> 01:35:29.190
Und ja,

01:35:29.510 --> 01:35:31.470
also ich bin mal gespannt, wie

01:35:31.470 --> 01:35:31.990
sich das noch entwickelt.

01:35:31.990 --> 01:35:33.070
aber das sieht schon, also

01:35:33.070 --> 01:35:35.790
Flask habe ich mir auch so ein bisschen angeguckt

01:35:35.790 --> 01:35:37.950
Flask ist schon so ein bisschen schwieriger mit

01:35:37.950 --> 01:35:39.890
Async, da gibt es dann auch so Geschichten

01:35:39.890 --> 01:35:41.770
ich weiß nicht, wie hieß denn das, Quad

01:35:41.770 --> 01:35:43.110
oder ich weiß es nicht mehr genau

01:35:43.110 --> 01:35:45.810
wo man das irgendwie so miteinander

01:35:45.810 --> 01:35:47.730
verheiraten kann, aber ehrlich gesagt

01:35:47.730 --> 01:35:49.470
ich glaube nicht, dass ich

01:35:49.470 --> 01:35:51.610
Flask noch wirklich verwenden

01:35:51.610 --> 01:35:53.470
also jetzt so, weil

01:35:53.470 --> 01:35:55.830
eben Salet oder Fast API macht eigentlich genau

01:35:55.830 --> 01:35:57.470
das gleiche oder ist halt krass

01:35:57.470 --> 01:35:59.270
und ist halt irgendwie deutlich moderner

01:35:59.270 --> 01:36:00.610
Ja, den Eindruck hatte ich auch

01:36:00.610 --> 01:36:04.030
Es gibt Leute, die verwenden das noch

01:36:04.030 --> 01:36:06.190
Ich meine, wir kennen ja beide Leute, die noch Pyramid

01:36:06.190 --> 01:36:07.490
verwenden oder BFG

01:36:07.490 --> 01:36:09.790
Ich meine, das ist natürlich auch so eine Sache

01:36:09.790 --> 01:36:12.470
Wenn man sich da einmal dran gewöhnt hat und da viel drin gemacht hat

01:36:12.470 --> 01:36:12.710
dann

01:36:12.710 --> 01:36:15.510
Ja, das ist, bevor man

01:36:15.510 --> 01:36:16.970
Seinen eigenen Vendor locken

01:36:16.970 --> 01:36:18.650
Ja, hat man sich dann selber

01:36:18.650 --> 01:36:22.090
ja, eingeschlossen

01:36:22.090 --> 01:36:22.790
Ja

01:36:22.790 --> 01:36:26.190
Genau

01:36:26.190 --> 01:36:28.370
Ja, letztens habe ich auch noch

01:36:28.370 --> 01:36:30.390
so einen Podcast gehört

01:36:30.390 --> 01:36:33.270
mit einem, jetzt habe ich leider den Namen nicht mehr parat,

01:36:33.870 --> 01:36:36.270
auch einen Python-Urgestein, der arbeitet bei

01:36:36.270 --> 01:36:36.870
Instagram

01:36:36.870 --> 01:36:42.830
und plaudert da so ein bisschen aus dem Nähkästchen,

01:36:43.230 --> 01:36:45.850
was sie da so alles machen und da waren auch so ein paar

01:36:45.850 --> 01:36:48.330
Aspekte noch dabei, die ich noch nicht so kannte,

01:36:49.650 --> 01:36:51.090
wie zum Beispiel,

01:36:51.430 --> 01:36:54.730
das war mir nicht klar, dass Instagram schon seit Jahren

01:36:54.730 --> 01:36:57.810
auf ASGI, nicht ASGI, den Standard

01:36:57.810 --> 01:36:59.930
gab es nicht, aber auf irgendeinem Async

01:36:59.930 --> 01:37:01.550
Interface zwischen

01:37:01.550 --> 01:37:03.110
Applikationsserver und

01:37:03.110 --> 01:37:05.930
Anwendung umgestiegen ist, obwohl sie

01:37:05.930 --> 01:37:08.050
ja eigentlich Django verwenden. Aber den Teil

01:37:08.050 --> 01:37:09.750
haben sie halt tatsächlich umgebaut.

01:37:11.270 --> 01:37:11.670
Und

01:37:11.670 --> 01:37:13.870
das war, weil

01:37:13.870 --> 01:37:16.090
das für sie dann wohl doch schon sehr wichtig war,

01:37:16.150 --> 01:37:17.950
dass das halt geht. Ja gut, wenn

01:37:17.950 --> 01:37:19.890
du viel Rechenlast hast und wenn du viele Dateien

01:37:19.890 --> 01:37:21.130
auslieferst. Ja.

01:37:22.850 --> 01:37:23.290
Und

01:37:23.290 --> 01:37:25.970
also das, auf der anderen

01:37:25.970 --> 01:37:27.830
Seite, sie waren lange auf Django 1.3.

01:37:27.830 --> 01:37:30.310
sind jetzt umgestiegen

01:37:30.310 --> 01:37:32.530
und das war auch irgendwie wohl der Treiber

01:37:32.530 --> 01:37:34.010
hinter dem Umstieg auf Python 3,

01:37:34.190 --> 01:37:36.110
weil dann Async alles sehr viel fluffiger wird.

01:37:37.730 --> 01:37:38.050
Und

01:37:38.050 --> 01:37:39.970
sind jetzt auf Django 1.8

01:37:39.970 --> 01:37:42.510
und das hieß halt so, das wird sich wohl auch nicht mehr ändern.

01:37:42.690 --> 01:37:44.290
Das ist jetzt die letzte Django-Version,

01:37:44.290 --> 01:37:45.370
die sie halt irgendwie nehmen.

01:37:45.550 --> 01:37:47.190
Die letzte Version, die es gibt.

01:37:48.110 --> 01:37:50.110
Ja, das war es dann da.

01:37:50.690 --> 01:37:52.090
Sie haben halt einige Teile

01:37:52.090 --> 01:37:54.290
komplett, die quasi identisch

01:37:54.290 --> 01:37:56.510
geblieben sind. Also irgendwie das ganze Request-Response-Handling

01:37:56.510 --> 01:37:56.950
ist irgendwie

01:37:56.950 --> 01:37:59.770
auch die Mittelwerkgeschichten, das ist alles gleich geblieben

01:37:59.770 --> 01:38:02.090
auch der View-Layer ist mehr oder weniger komplett intakt

01:38:02.090 --> 01:38:02.990
aber

01:38:02.990 --> 01:38:05.870
also bis auf, dass sie halt da eine Asing-Schnittstelle

01:38:05.870 --> 01:38:06.750
dazwischen haben, aber

01:38:06.750 --> 01:38:09.490
was sie komplett ausgetauscht haben, ist irgendwie

01:38:09.490 --> 01:38:12.070
also alles, was man irgendwie Plug-in austauschen kann

01:38:12.070 --> 01:38:13.730
ist ausgetauscht und den

01:38:13.730 --> 01:38:15.070
OR haben sie auch ausgetauscht

01:38:15.070 --> 01:38:17.530
weil sie

01:38:17.530 --> 01:38:19.510
irgendwann schaden mussten

01:38:19.510 --> 01:38:21.370
da brauchst du mehr der Kontrolle dann irgendwann

01:38:21.370 --> 01:38:23.710
ja und Schaden zu der Zeit

01:38:23.710 --> 01:38:25.650
ging das, also es geht ja inzwischen in Django auch so halbwegs

01:38:25.650 --> 01:38:27.310
aber damals ging das halt nicht.

01:38:27.790 --> 01:38:29.030
Also nochmal, Schaden ist

01:38:29.030 --> 01:38:30.830
Abteilen von Atemanfragen.

01:38:31.390 --> 01:38:32.650
Also der

01:38:32.650 --> 01:38:35.750
Königsweg bei Datenbanken,

01:38:35.910 --> 01:38:37.270
die zu skalieren ist ja einfach immer mehr

01:38:37.270 --> 01:38:39.370
Hauptsprecher reinstecken oder mehr Prozessoren

01:38:39.370 --> 01:38:41.430
so lange wie halt geht und wenn man denkt,

01:38:41.530 --> 01:38:43.390
ja jetzt geht nicht mehr, dann halt einfach nochmal

01:38:43.390 --> 01:38:45.370
eine zweite Datenbank

01:38:45.370 --> 01:38:47.390
und dann musst du halt aufpassen, wo deine Daten

01:38:47.390 --> 01:38:49.250
entspannen. Wisst ihr, wo das Wort herkommt?

01:38:49.430 --> 01:38:50.210
Das ist ein sehr schönes

01:38:50.210 --> 01:38:52.050
Wort.

01:38:52.610 --> 01:38:53.050
Genau.

01:38:53.050 --> 01:39:14.430
Ja, das Wort Shard heißt ja eigentlich so ein Bruchstück und es kommt tatsächlich aus der Ultima Online Welt. Die Geschichte von Ultima Online ist, dass der Weltstein in viele kleine Steine zerbrochen ist und jeder von diesen Shards ist jetzt eine Welt für sich und das heißt, wenn du eben in Ultima Online dich mit einem Server verbindest, dann heißt der nicht Server, sondern Shard.

01:39:14.430 --> 01:39:16.970
und das war deren

01:39:16.970 --> 01:39:18.710
Trick, wie sie so eine

01:39:18.710 --> 01:39:20.950
große Benutzerschar

01:39:20.950 --> 01:39:22.770
handeln konnten,

01:39:22.930 --> 01:39:24.210
indem die einfach auch verschiedene

01:39:24.210 --> 01:39:26.770
Bruchstücke von diesen Weltsteilen

01:39:26.770 --> 01:39:28.910
verteilt haben und da kommt dieses Wort Sharding

01:39:28.910 --> 01:39:30.810
her, weil es ist ja schon ein sehr spezifisches

01:39:30.810 --> 01:39:32.850
Wort, dass du

01:39:32.850 --> 01:39:35.030
eben einfach sagst, das ist eine eigene abgeschlossene

01:39:35.030 --> 01:39:36.590
Welt und du kannst nicht aus dieser Welt raus.

01:39:38.710 --> 01:39:39.190
Ja, genau

01:39:39.190 --> 01:39:40.690
und das musste Instagram mit den

01:39:40.690 --> 01:39:42.770
Muskeln halt auch die User dann irgendwann aufteilen

01:39:42.770 --> 01:39:44.650
auf unterschiedliche Datenbanken und dann hatten sie das

01:39:44.650 --> 01:39:45.730
zuerst so gemacht, dass

01:39:45.730 --> 01:39:48.670
quasi alle deine Daten, wenn du jetzt

01:39:48.670 --> 01:39:50.730
als User auf irgendeiner Datenbank lagst, dann alles, was du

01:39:50.730 --> 01:39:52.590
also dein kompletter Sheet und der ganze

01:39:52.590 --> 01:39:54.250
Content von denen, denen du folgst,

01:39:54.630 --> 01:39:55.910
der lag dann halt auf deiner Datenbank.

01:39:57.350 --> 01:39:58.750
Was ja auch irgendwie Sinn macht,

01:39:58.870 --> 01:40:00.810
weil dann die ganzen Quelldeskinder halt nur zu einer Datenbank

01:40:00.810 --> 01:40:02.070
und dann ist es eigentlich schön.

01:40:03.030 --> 01:40:04.550
Und dann war

01:40:04.550 --> 01:40:05.150
irgendwie

01:40:05.150 --> 01:40:08.390
wer war das?

01:40:09.290 --> 01:40:10.750
Justin Bieber oder sowas?

01:40:10.750 --> 01:40:11.570
Ich weiß es nicht genau.

01:40:11.570 --> 01:40:17.770
Irgendwie hieß es also, jeder kannte die User-ID von dem

01:40:17.770 --> 01:40:19.650
und wenn die irgendwo aufgetaucht ist, dann war immer

01:40:19.650 --> 01:40:20.210
irgendwie

01:40:20.210 --> 01:40:23.010
All hands on deck Zeit

01:40:23.010 --> 01:40:25.130
und man musste halt, weil immer wenn der gepostet hat,

01:40:25.250 --> 01:40:27.250
hast du natürlich das Problem, der hatte halt irgendwie

01:40:27.250 --> 01:40:30.850
Zillionen Follower

01:40:30.850 --> 01:40:33.470
und der Content, den er da irgendwo

01:40:33.470 --> 01:40:35.770
in seiner, der musste dann halt auf alle Datenbanken

01:40:35.770 --> 01:40:37.630
repliziert werden, das hat dann einen riesen Update-Sturm

01:40:37.630 --> 01:40:39.530
ausgelöst, weil, also sobald der

01:40:39.530 --> 01:40:41.250
irgendwas abgeladet hat, wurde der

01:40:41.250 --> 01:40:44.590
und wurde da quasi jede Datenbank rein repliziert.

01:40:45.470 --> 01:40:46.650
Und das ist natürlich dann nicht so gut.

01:40:46.710 --> 01:40:49.750
Das ist doch eine generelle Eigenschaft von so einem Netzwerk,

01:40:50.070 --> 01:40:53.370
von so Social Graphs, dass wir so eine exponentielle Verteilung haben.

01:40:54.050 --> 01:40:57.050
Dass es ein paar Knoten gibt, die mit allen verbunden sind

01:40:57.050 --> 01:40:59.270
und alle anderen haben nur ein paar Verbindungen.

01:40:59.570 --> 01:41:01.430
So ein zentrales Webding.

01:41:02.070 --> 01:41:02.570
Wie gesagt.

01:41:03.430 --> 01:41:04.190
Die Spinne.

01:41:05.470 --> 01:41:07.370
Ja, nee, dass du eben so eine Verteilung hast,

01:41:08.110 --> 01:41:09.890
wo es beide Extreme gibt.

01:41:09.890 --> 01:41:14.790
Du hast einige Knoten, die ganz viele Verbindungen haben

01:41:14.790 --> 01:41:18.210
und du hast aber auf der anderen Seite auch ganz, ganz viele Knoten,

01:41:18.350 --> 01:41:19.570
die ganz wenige Verbindungen haben.

01:41:19.790 --> 01:41:20.830
Also es ist irgendwie eine Menge der...

01:41:20.830 --> 01:41:22.050
Ja, irgendwo im Zentrum der...

01:41:22.050 --> 01:41:24.010
Irgendwo in so einer großen Graswolke, wo ganz viele Sterne sitzen.

01:41:24.010 --> 01:41:26.530
Die Menge der Edges ist irgendwie gleich verteilt oder so ähnlich.

01:41:28.890 --> 01:41:31.070
Ist es nicht sogar so, wenn du so einen Random Graph baust,

01:41:31.150 --> 01:41:33.430
wenn du in so einen Graph Random Edges reintust,

01:41:33.490 --> 01:41:34.630
dass du dann immer so einen kriegst?

01:41:34.950 --> 01:41:36.150
Das kann sein, das war gleich.

01:41:36.150 --> 01:41:38.850
Meine Grafentheorie-Vorlesungen sind lange her.

01:41:39.890 --> 01:41:45.430
Ja, also jedenfalls fand ich das auch witzig,

01:41:45.530 --> 01:41:47.530
fand ich das, dann wurde irgendwann gefragt,

01:41:47.610 --> 01:41:49.390
wie lange dauert das eigentlich, wenn man die testet,

01:41:49.490 --> 01:41:50.850
oder wie viel Code ist das eigentlich?

01:41:51.850 --> 01:41:53.550
Keine Ahnung, wie viele Millionen

01:41:53.550 --> 01:41:55.190
zahlen irgendwie und

01:41:55.190 --> 01:41:57.710
wie lange dauert das eigentlich, die Tests

01:41:57.710 --> 01:41:58.710
durchlaufen zu lassen?

01:41:59.730 --> 01:42:01.370
Also auf einer Maschine hat das schon ganz lange

01:42:01.370 --> 01:42:03.350
keiner mehr probiert. Sie haben sich halt auch

01:42:03.350 --> 01:42:05.390
so ein eigenes Ding gebaut, was dann halt die Tests

01:42:05.390 --> 01:42:07.550
irgendwie an diverse Maschinen

01:42:07.550 --> 01:42:08.710
Nightly, Nightly

01:42:08.710 --> 01:42:11.430
auf dem Testchart lief es auf dem anderen nicht

01:42:11.430 --> 01:42:14.630
ja, aber das dauert wohl tatsächlich nur 15 Minuten

01:42:14.630 --> 01:42:16.890
also normalerweise reicht es

01:42:16.890 --> 01:42:19.130
irgendwie die Lokaltests um dich herum

01:42:19.130 --> 01:42:20.750
laufen zu lassen, um zu sehen, ob das

01:42:20.750 --> 01:42:21.850
irgendwie alles noch funktioniert oder nicht

01:42:21.850 --> 01:42:24.170
und sobald es dann halt in Produktion geht

01:42:24.170 --> 01:42:26.250
muss es halt einmal komplett durchlaufen

01:42:26.250 --> 01:42:28.410
und das dauert dann halt auf x Rechnern

01:42:28.410 --> 01:42:29.510
15 Minuten ungefähr

01:42:29.510 --> 01:42:31.410
ja gut, aber das ist doch trotzdem noch cool

01:42:31.410 --> 01:42:36.470
das ist ja der Hammer

01:42:36.470 --> 01:42:38.190
da könnten sich ja viele Firmen

01:42:38.190 --> 01:42:40.590
das dauert ja bei vielen anderen Projekten

01:42:40.590 --> 01:42:42.310
Monate. Ja genau und

01:42:42.310 --> 01:42:44.310
die ganzen Teile

01:42:44.310 --> 01:42:46.270
fand ich auch, das ist aber auch

01:42:46.270 --> 01:42:47.730
respektabel und was ich auch gut fand

01:42:47.730 --> 01:42:49.790
es hieß so, ja wie macht ihr das eigentlich

01:42:49.790 --> 01:42:52.350
als Entwicklungsmodell mit Branches

01:42:52.350 --> 01:42:53.870
oder wie auch immer und dann hieß es so, naja

01:42:53.870 --> 01:42:56.330
Branches können wir schon ganz lange nicht mehr machen, weil

01:42:56.330 --> 01:42:58.330
es sind einfach zu viele Entwickler, die haben halt tausende Entwickler

01:42:58.330 --> 01:43:00.330
die da drin rumschreiben und

01:43:00.330 --> 01:43:02.190
sobald du einen Branch

01:43:02.190 --> 01:43:04.410
irgendwie weggehst, dann die kriegst du nie wieder zurück

01:43:04.410 --> 01:43:06.370
weil, ja, du gehst

01:43:06.370 --> 01:43:07.790
einfach in den Konflikten unter, weil es zu schnell ist

01:43:07.790 --> 01:43:10.010
Das ist einfach zu schnell. Das heißt, alle entwickeln

01:43:10.010 --> 01:43:12.030
immer auf dem gleichen Branch, aber verstecken

01:43:12.030 --> 01:43:12.810
alles... Subversion.

01:43:14.170 --> 01:43:14.610
Filelocking.

01:43:15.930 --> 01:43:18.090
Und packen halt alles hinter Featureflex.

01:43:18.750 --> 01:43:19.530
Und das geht dann wohl.

01:43:20.670 --> 01:43:22.010
Ja, aber das ist generell so eine Technik,

01:43:22.190 --> 01:43:23.450
wenn du größere

01:43:23.450 --> 01:43:26.130
Deployments auch hast, dass du Featureflex

01:43:26.130 --> 01:43:27.550
machst. Was ist ein Featureflex?

01:43:28.130 --> 01:43:30.150
Rolling Releases haben kannst

01:43:30.150 --> 01:43:32.010
und trotzdem sicher bist, dass

01:43:32.010 --> 01:43:33.270
du ein Rollback machen kannst.

01:43:33.750 --> 01:43:35.430
Dass du halt sozusagen ein Feature,

01:43:35.430 --> 01:43:37.250
an dem du jetzt irgendwie schreibst,

01:43:37.510 --> 01:43:39.850
das machst du halt

01:43:39.850 --> 01:43:41.070
ein- und ausschaltbar sozusagen.

01:43:42.470 --> 01:43:43.590
Also quasi die Commits kann man dann

01:43:43.590 --> 01:43:44.030
abschalten?

01:43:44.670 --> 01:43:47.250
Nein, nein, nur die Funktionalität.

01:43:47.750 --> 01:43:48.250
Ja, genau.

01:43:49.050 --> 01:43:51.250
Code kommt immer mit, aber der wird halt nicht immer

01:43:51.250 --> 01:43:51.870
angesprochen.

01:43:53.290 --> 01:43:55.270
Das ist eine große Tabelle, wo drinsteht,

01:43:55.330 --> 01:43:57.030
was jetzt gerade für Features aktiv sind.

01:43:58.150 --> 01:43:59.450
Okay, dann muss ich halt

01:43:59.450 --> 01:44:00.730
quasi jede Zeile flecken.

01:44:01.690 --> 01:44:03.430
Nö, nur die...

01:44:03.430 --> 01:44:05.590
Feature. Nur die Einstiegspunkte.

01:44:06.850 --> 01:44:07.090
Genau.

01:44:07.910 --> 01:44:09.390
Und du würdest auch nie

01:44:09.390 --> 01:44:11.670
ein neues Feature auf allen gleichzeitig

01:44:11.670 --> 01:44:13.450
anschalten oder so, sondern du schaltest das

01:44:13.450 --> 01:44:15.510
immer erstmal auf so einem Promille an und guckst,

01:44:15.550 --> 01:44:17.670
was passiert. Und dann nimmst du ein bisschen

01:44:17.670 --> 01:44:19.470
mehr und dann guckst du halt und dann kannst du

01:44:19.470 --> 01:44:21.210
messen und dann guckst du deine Graphen an

01:44:21.210 --> 01:44:22.490
und denkst, okay, sieht gut aus.

01:44:24.330 --> 01:44:24.890
Könnt ihr

01:44:24.890 --> 01:44:27.470
euch noch damals, ganz

01:44:27.470 --> 01:44:29.490
ganz früher, als das Internet noch jung

01:44:29.490 --> 01:44:31.190
war, könnt ihr euch an

01:44:31.190 --> 01:44:33.150
Audio Galaxy erinnern? Ja.

01:44:33.430 --> 01:44:36.090
Das war das bessere Napster

01:44:36.090 --> 01:44:37.010
Ja, das war super

01:44:37.010 --> 01:44:40.190
Einer von den Autoren, die das geschrieben haben

01:44:40.190 --> 01:44:41.950
Also die sind dann auch geschlossen worden

01:44:41.950 --> 01:44:43.750
Von der Musikindustrie relativ schnell

01:44:43.750 --> 01:44:49.630
Der hat sehr viele interessante Artikel veröffentlicht

01:44:49.630 --> 01:44:52.490
Und er hat halt gesagt, die sind irgendwann von Java auf C umgestiegen

01:44:52.490 --> 01:44:54.530
Aus Geschwindigkeitsproblemen

01:44:54.530 --> 01:44:56.770
Und natürlich waren diese Server erstmal nicht kompatibel

01:44:56.770 --> 01:44:58.750
Und die haben das einfach so gemacht

01:44:58.750 --> 01:45:01.250
Die haben diesen C-Server halt geschrieben

01:45:01.250 --> 01:45:02.270
Und der war dann halb fertig

01:45:02.270 --> 01:45:03.510
und dann haben sie ihn einfach laufen lassen,

01:45:04.830 --> 01:45:06.910
in den Pool reingetan, der ist nach einer halben Sekunde

01:45:06.910 --> 01:45:07.430
gecrashed

01:45:07.430 --> 01:45:10.290
und dann haben sie diesen Crash behoben.

01:45:12.190 --> 01:45:13.010
Und dann haben sie das

01:45:13.010 --> 01:45:14.830
so lange gemacht, bis der halt stabil genug

01:45:14.830 --> 01:45:16.890
lief, dass sie quasi die Hälfte

01:45:16.890 --> 01:45:18.090
ihres Pools ersetzen konnten.

01:45:19.170 --> 01:45:20.070
Das ist so eine Technik,

01:45:20.530 --> 01:45:21.990
wenn du viel Traffic hast,

01:45:22.770 --> 01:45:24.310
dann kannst du so statistische Sachen machen.

01:45:24.470 --> 01:45:26.930
Du kannst sagen, okay, wir samplen jetzt einfach mal

01:45:26.930 --> 01:45:29.050
einen Teil des Traffics raus

01:45:29.050 --> 01:45:30.870
und tun den auf einen anderen

01:45:30.870 --> 01:45:32.830
Server und schauen mal, ob der kompatibel ist.

01:45:33.150 --> 01:45:34.910
Oder du samplest da eben die,

01:45:35.090 --> 01:45:36.690
wie du sagst, Feature Flags raus und sagst,

01:45:36.750 --> 01:45:38.450
wir aktivieren jetzt dieses Feature mal für

01:45:38.450 --> 01:45:40.670
10.000 Benutzer.

01:45:40.770 --> 01:45:43.070
Und dann denkst du dir so, 10.000 Benutzer, so viele!

01:45:43.250 --> 01:45:44.910
Aber es sind halt nur 0,001

01:45:44.910 --> 01:45:46.190
Promille der aktiven Benutzer.

01:45:47.550 --> 01:45:48.610
Und wenn irgendwas schief geht,

01:45:48.610 --> 01:45:50.230
dann ist es schade für die,

01:45:50.350 --> 01:45:51.790
aber dann müssen die halt die Seite neu laden

01:45:51.790 --> 01:45:53.490
und du hast aber

01:45:53.490 --> 01:45:56.250
statistisch valide Daten.

01:45:56.730 --> 01:45:57.670
Also auch das ist ja was,

01:45:57.830 --> 01:46:00.270
was du nur kannst, wenn du viel

01:46:00.270 --> 01:46:03.710
viele parallele Anfragen hast.

01:46:07.710 --> 01:46:08.110
Naja,

01:46:09.110 --> 01:46:11.090
das fand ich eigentlich alles sehr fluffig

01:46:11.090 --> 01:46:13.270
und dann hat er noch was gesagt und da dachte ich so,

01:46:13.310 --> 01:46:15.670
oh shit, das hatte ich

01:46:15.670 --> 01:46:16.970
vorher schon so ein bisschen gehört bei

01:46:16.970 --> 01:46:18.190
einem Podcast,

01:46:18.510 --> 01:46:21.610
wo Andrew Godwin zu Gast war,

01:46:21.750 --> 01:46:23.170
der irgendwie bei Eventbrite, glaube ich,

01:46:23.270 --> 01:46:25.430
arbeitet, wo er auch meinte so,

01:46:25.530 --> 01:46:26.950
ah, also die Eventbrite

01:46:26.950 --> 01:46:29.130
Jumbo-Applikation hat er so um eine Million

01:46:29.130 --> 01:46:30.890
Zeilen irgendwie, Code.

01:46:31.810 --> 01:46:33.090
Und es dauert halt schon

01:46:33.090 --> 01:46:35.010
relativ lang, die zu starten.

01:46:35.310 --> 01:46:37.210
Und der Grund, warum es so lange dauert, sind halt die Imports.

01:46:37.490 --> 01:46:39.170
Weil die Imports

01:46:39.170 --> 01:46:40.090
laufen halt 20 Sekunden.

01:46:40.730 --> 01:46:42.230
Und da kann man nicht viel optimieren.

01:46:42.530 --> 01:46:44.810
Und er meinte, wir haben halt tatsächlich das Problem, dass wenn wir

01:46:44.810 --> 01:46:46.650
jetzt irgendwo schnell hochskalieren müssen,

01:46:47.210 --> 01:46:48.950
dann sind halt diese

01:46:48.950 --> 01:46:50.530
20 Sekunden, die fehlen ihnen einfach.

01:46:50.690 --> 01:46:52.810
Und es gibt tatsächlich Überlegungen, ob sie das Ganze nicht

01:46:52.810 --> 01:46:54.030
in einer anderen Sprache neu schreiben, weil

01:46:54.030 --> 01:46:56.070
es halt unoptimierbar ist.

01:46:56.450 --> 01:46:57.530
Kann man die Imports cachen oder so?

01:46:57.530 --> 01:47:00.230
Nee, leider kann man da nicht viel machen

01:47:00.230 --> 01:47:01.890
und das

01:47:01.890 --> 01:47:04.090
Kannst du einen Graphen aufbauen,

01:47:04.190 --> 01:47:06.090
der die dann in einer anderen Reihenfolge macht, das habe ich schon mal

01:47:06.090 --> 01:47:08.150
wo gelesen, aber das hilft halt auch nur

01:47:08.150 --> 01:47:10.130
Ja, das Problem

01:47:10.130 --> 01:47:12.090
das grundsätzliche Problem ist halt wohl irgendwie, dass

01:47:12.090 --> 01:47:14.190
auch, sobald ein neues Modul dazu kommt

01:47:14.190 --> 01:47:15.990
kann es halt die Reihenfolge ändern und

01:47:15.990 --> 01:47:18.330
das heißt, du kannst nicht, du müsstest

01:47:18.330 --> 01:47:19.390
irgendwie das

01:47:19.390 --> 01:47:22.030
Ich habe das mal gesehen, ich habe mal

01:47:22.030 --> 01:47:23.790
so einen Artikel gelesen, wo sie gesagt haben, sie mussten

01:47:23.790 --> 01:47:26.150
aber auch irgendeinen Internetanbieter aus

01:47:26.150 --> 01:47:29.210
2010er

01:47:29.210 --> 01:47:29.830
oder was weiß ich,

01:47:30.250 --> 01:47:32.890
die halt das Importsystem so

01:47:32.890 --> 01:47:35.170
anpassen mussten, dass sie die Importreihenfolge

01:47:35.170 --> 01:47:37.190
selber optimieren können,

01:47:37.610 --> 01:47:38.950
um genau das

01:47:38.950 --> 01:47:39.450
zu umgehen.

01:47:40.250 --> 01:47:42.550
Ja, und genau das sagte der dann halt auch.

01:47:42.650 --> 01:47:43.650
Der meinte so, naja, also

01:47:43.650 --> 01:47:46.670
sie haben das schon so ein bisschen zerlegt

01:47:46.670 --> 01:47:48.950
oder versucht, aber trotzdem ist es so,

01:47:49.210 --> 01:47:50.950
wenn du an Instagram

01:47:50.950 --> 01:47:52.730
entwickelst, hast du da auch deinen

01:47:52.730 --> 01:47:54.630
Entwicklungs-Server, deinen Django-Entwicklungs-Server

01:47:54.630 --> 01:47:56.450
so quasi, ganz normal, wie man das so kennt.

01:47:57.010 --> 01:47:58.290
Und jetzt änderst du da halt irgendeine

01:47:58.290 --> 01:47:59.590
triviale Geschichte

01:47:59.590 --> 01:48:02.430
und dann lädt er automatisch neu

01:48:02.430 --> 01:48:04.290
und dann willst du ja gucken auf der Seite,

01:48:04.530 --> 01:48:05.810
okay, hat das jetzt so funktioniert, wie ich mir das gedacht habe?

01:48:06.690 --> 01:48:07.590
Und das dauert dann halt eine Minute.

01:48:09.130 --> 01:48:10.550
Und du kannst nicht viel

01:48:10.550 --> 01:48:12.490
dran machen. So ist das dann halt.

01:48:13.070 --> 01:48:14.790
Und das ist natürlich extrem frustrierend.

01:48:14.910 --> 01:48:16.150
Also das macht dann nicht mehr so richtig viel Spaß,

01:48:16.150 --> 01:48:16.850
damit zu entwickeln.

01:48:17.990 --> 01:48:20.730
Und was man

01:48:20.730 --> 01:48:22.310
sich eventuell vorstellen könnte, was man da macht,

01:48:22.310 --> 01:48:23.370
ist halt eben über

01:48:23.370 --> 01:48:25.410
oder Type Hinting

01:48:25.410 --> 01:48:26.030
oder so

01:48:26.030 --> 01:48:29.330
vielleicht irgendwie auch

01:48:29.330 --> 01:48:31.030
in dem Modulsystem zu sagen,

01:48:31.370 --> 01:48:33.330
es gibt Module, die nicht mehr alles

01:48:33.330 --> 01:48:35.430
dürfen und dann kannst du irgendwie einschränken,

01:48:36.110 --> 01:48:37.450
dass sie zum Beispiel

01:48:37.450 --> 01:48:39.350
nicht mehr die Reihenfolge der Module, die importiert werden,

01:48:39.430 --> 01:48:41.270
ändern dürfen und dann könntest du sowas machen, wie

01:48:41.270 --> 01:48:42.810
du kannst es eben cachen. Du kannst ja sagen, okay,

01:48:43.230 --> 01:48:45.210
ich mache einen Reload, aber nur von dem

01:48:45.210 --> 01:48:46.270
Modul und sonst nichts.

01:48:47.330 --> 01:48:49.190
Und das geht aber momentan noch nicht so richtig

01:48:49.190 --> 01:48:51.290
und da sind sie halt auch irgendwie dran.

01:48:51.950 --> 01:48:53.190
Aber da kann man doch bestimmt

01:48:53.190 --> 01:48:55.050
in Python Interpreter irgendwelche Memory

01:48:55.050 --> 01:48:57.450
Snapshots machen, wo du alles importiert hast,

01:48:58.410 --> 01:48:58.970
was du einfach

01:48:58.970 --> 01:49:01.470
einmal komplett in den Hauptspeicher rein streamst.

01:49:02.510 --> 01:49:02.670
Ja,

01:49:02.990 --> 01:49:05.270
ich weiß nicht, es scheint nicht so ein einfaches Problem

01:49:05.270 --> 01:49:05.590
zu sein.

01:49:06.650 --> 01:49:07.050
Ja,

01:49:09.170 --> 01:49:11.130
aber das klingt natürlich, wenn schon mal mehrere

01:49:11.130 --> 01:49:13.070
Leute sagen, dass sie damit Probleme haben, das klingt dann natürlich

01:49:13.070 --> 01:49:14.330
nicht so richtig gut, aber ja.

01:49:15.770 --> 01:49:16.210
Ja.

01:49:17.750 --> 01:49:18.190
Ja,

01:49:18.370 --> 01:49:21.250
tatsächlich ist mir das auch schon in eigenen Projekten

01:49:21.250 --> 01:49:22.910
aufgefallen, wenn die größer werden, dann ist halt

01:49:22.910 --> 01:49:25.410
die Startup-Time langsamer und das ist

01:49:25.410 --> 01:49:26.890
nervig beim Entwickeln, weil du halt

01:49:26.890 --> 01:49:29.030
deine Sekunden warten musst,

01:49:29.110 --> 01:49:30.910
bis du deine Änderungen testen kannst.

01:49:31.810 --> 01:49:33.170
Das ist schon so.

01:49:34.930 --> 01:49:37.090
Ja, aber das ist irgendwas Interessantes gesagt,

01:49:37.150 --> 01:49:39.030
und zwar Typens. Ich glaube, das bringt uns jetzt

01:49:39.030 --> 01:49:40.970
quasi zum Ende dieser

01:49:40.970 --> 01:49:42.570
Folge. Und zwar

01:49:42.570 --> 01:49:44.850
hatte ich da einen Pick der Woche in der

01:49:44.850 --> 01:49:46.830
Standard, nicht Standard Library, wo wir ein bisschen

01:49:46.830 --> 01:49:48.910
Standard Library machen, aber ich hätte

01:49:48.910 --> 01:49:50.230
heute gepickt Typer.

01:49:50.870 --> 01:49:52.850
Und Typer macht nämlich genau das, das macht nämlich aus

01:49:52.850 --> 01:49:54.670
Typens Kommandos,

01:49:55.130 --> 01:49:56.410
die man sehr schön benutzen kann.

01:49:56.790 --> 01:49:57.690
Man kann jetzt seine eigene

01:49:57.690 --> 01:50:00.690
Kli zusammenklicken oder seine eigenen Kommandos,

01:50:00.770 --> 01:50:01.630
die man aufrufen kann.

01:50:02.930 --> 01:50:04.190
Ah, das ist für eine Kommandoteile?

01:50:04.370 --> 01:50:06.190
Ist das tatsächlich so, dass du dann

01:50:06.190 --> 01:50:08.990
Command-Line-Dinger hast?

01:50:09.230 --> 01:50:10.770
Ja, es gibt sogar Auto-Completion, die mitgeliefert

01:50:10.770 --> 01:50:12.470
wird und so, das hast du eigentlich ganz gut gemacht.

01:50:13.630 --> 01:50:14.950
Da gibt es ganz viele Bibliotheken,

01:50:15.050 --> 01:50:16.650
die das machen. Früher gab es ja immer nur

01:50:16.650 --> 01:50:18.590
eine, die ganz schlecht war und inzwischen

01:50:18.590 --> 01:50:20.470
gibt es ganz viele. Ja, also

01:50:20.470 --> 01:50:22.750
klick-klick drunter und man kann halt tatsächlich mit so Type-Annotations

01:50:22.750 --> 01:50:24.090
sagen, was für

01:50:24.090 --> 01:50:26.830
gültige Argumente man irgendwie mit

01:50:26.830 --> 01:50:28.910
parsen kann. Irgendwie, dann kannst du einfach

01:50:28.910 --> 01:50:30.790
ein Bolien flecken und dann kannst du halt einfach die

01:50:30.790 --> 01:50:32.470
Option setzen, dann kommt halt ein True oder False rein

01:50:32.470 --> 01:50:34.710
und kannst halt dann gucken, was du machen willst

01:50:34.710 --> 01:50:36.510
und das ist irgendwie sehr convenient

01:50:36.510 --> 01:50:38.830
für Projekte und kleine

01:50:38.830 --> 01:50:40.310
Abstraktionen.

01:50:40.590 --> 01:50:42.850
Ja, das ist spannend. Das ist tatsächlich

01:50:42.850 --> 01:50:44.370
ein Problem, an dem ich auch schon

01:50:44.370 --> 01:50:46.610
vor langer Zeit mal gearbeitet habe.

01:50:47.270 --> 01:50:48.490
Ah, der kommt mir.

01:50:48.490 --> 01:50:50.170
Das hat mich auch genervt. 2012

01:50:50.170 --> 01:50:52.130
habe ich meine eigene Bibliothek veröffentlicht.

01:50:52.750 --> 01:50:54.830
Commandier heißt die, die im Wesentlichen

01:50:54.830 --> 01:50:56.930
genau das gleiche macht. Die nimmt Funktionen

01:50:56.930 --> 01:50:58.770
mit ihren Types und Typehints und

01:50:58.770 --> 01:51:00.770
baut ja daraus eine

01:51:00.770 --> 01:51:02.810
Kommandozeile. Gibt es

01:51:02.810 --> 01:51:04.770
inzwischen tatsächlich einige, Google

01:51:04.770 --> 01:51:06.730
Fire heißt die, glaube ich.

01:51:08.490 --> 01:51:10.510
Ist quasi auf Google nicht zu finden.

01:51:10.750 --> 01:51:11.890
Ah, hier, Python Fire heißt es.

01:51:13.430 --> 01:51:14.690
Macht auch sowas ähnliches.

01:51:14.990 --> 01:51:16.070
Simple way to create

01:51:16.070 --> 01:51:18.050
Command Line Interface in Python.

01:51:18.990 --> 01:51:20.630
Ich bin ja sehr froh, dass

01:51:20.630 --> 01:51:50.610
und Jochen unterhalten sich über die Programmiersprache Python

01:51:50.630 --> 01:52:06.830
CMD, also CMD, das macht ein bisschen was anderes, das macht nicht ein Command-Line-Interface, sondern ein Shell-Interface. Das heißt, sowas wie das, was man in Python hat, der Python-Interpreter ist ja, wenn man den startet, ist der ein Shell-Interface, das heißt, ich habe eine Eingabezeile und wenn ich da was eingebe, dann passiert irgendwas.

01:52:06.830 --> 01:52:09.170
und mit

01:52:09.170 --> 01:52:11.390
dieser Bibliothek CMD

01:52:11.390 --> 01:52:13.810
aus der Standardbibliothek

01:52:13.810 --> 01:52:15.410
kann man solche Shells

01:52:15.410 --> 01:52:16.170
sich selber bauen.

01:52:17.130 --> 01:52:19.350
Das heißt, es ist quasi nicht auf der Kommandozeile

01:52:19.350 --> 01:52:21.170
die Befehle eingegeben, sondern in dem

01:52:21.170 --> 01:52:23.010
Programm dann drin. Auch mit voller

01:52:23.010 --> 01:52:25.250
Autocompletion und mit bestimmten Optionen,

01:52:25.370 --> 01:52:26.470
die direkt angezeigt werden und sowas.

01:52:26.770 --> 01:52:29.010
Also im Wesentlichen schreibt man eine Klasse, die

01:52:29.010 --> 01:52:31.230
von dieser Command-Klasse ableitet,

01:52:31.330 --> 01:52:33.110
also von der CMD-Klasse ableitet und tut dann

01:52:33.110 --> 01:52:33.850
da Funktionen rein.

01:52:33.850 --> 01:52:38.730
und der Rest, also der nimmt die Dokumentationen da raus, der nimmt die Parameter da raus,

01:52:40.910 --> 01:52:44.610
wenn man nicht die Standard-Library braucht, gibt es auch CMD2,

01:52:44.990 --> 01:52:46.550
das kann dann auch Farben und sowas alles.

01:52:47.270 --> 01:52:48.650
Ah, Farben, Spielerei.

01:52:48.650 --> 01:52:51.130
Ja, nein, nein, nein, das kann, glaube ich, noch ein, zwei andere Netze sein.

01:52:51.690 --> 01:52:52.470
Ich muss aber mal ausprobieren.

01:52:52.550 --> 01:52:57.730
Das Beispiel, was bei CMD in der Standard-Library drin ist, ist direkt Turtle,

01:52:57.890 --> 01:53:00.550
also wie man sich eine Turtle, eine interaktive Turtle baut.

01:53:00.550 --> 01:53:03.230
Ich weiß nicht, ob ihr damals schon

01:53:03.230 --> 01:53:05.130
alt oder schrägstrich

01:53:05.130 --> 01:53:07.110
jung genug wart, um die Turtle zu

01:53:07.110 --> 01:53:07.930
benutzen im

01:53:07.930 --> 01:53:11.170
Informatikunterricht

01:53:11.170 --> 01:53:12.550
Ja, Turtle Graphics

01:53:12.550 --> 01:53:14.990
Das war sehr schön damals

01:53:14.990 --> 01:53:17.510
In Pascal hatten wir das

01:53:17.510 --> 01:53:19.070
Wisst ihr, was

01:53:19.070 --> 01:53:19.610
Lead ist?

01:53:22.350 --> 01:53:23.370
Guckt ihr mal in den Spiegel?

01:53:24.050 --> 01:53:24.290
Der

01:53:24.290 --> 01:53:26.750
Oh, ich weiß nicht mehr, was es heißt

01:53:26.750 --> 01:53:29.150
Loyal Informatik Editor oder irgendwie sowas

01:53:29.150 --> 01:53:31.950
Es war so ein System, was wir in der Schule hatten

01:53:31.950 --> 01:53:33.310
Als ich in der 8. Klasse war

01:53:33.310 --> 01:53:34.710
Hatten wir das in Schulen

01:53:34.710 --> 01:53:36.990
Es war so eine Art Pascal

01:53:36.990 --> 01:53:38.710
Mit einem Turtle Interface

01:53:38.710 --> 01:53:40.950
Und das Beste ist, es hatte einen Editor mit dabei

01:53:40.950 --> 01:53:42.270
Und es hat auch sehr schöne Grafiken gemacht

01:53:42.270 --> 01:53:44.690
Der konnte aber nicht scrollen, dieser Editor

01:53:44.690 --> 01:53:47.610
Das heißt, alle Programme waren maximal eine Seite lang

01:53:47.610 --> 01:53:49.890
Sehr schön

01:53:49.890 --> 01:53:53.190
Und das musste halt ausreichen in der 8. Klasse

01:53:53.190 --> 01:53:56.910
Aber mit Turtle und allem also sehr, sehr gut

01:53:56.910 --> 01:53:59.370
Wir hatten damals tatsächlich

01:53:59.370 --> 01:54:01.350
Tupo Pascal 5.0, glaube ich

01:54:01.350 --> 01:54:04.030
Das war tatsächlich

01:54:04.030 --> 01:54:04.890
Spaß gemacht

01:54:04.890 --> 01:54:10.910
Ist auch sowas, was man nicht mehr

01:54:10.910 --> 01:54:13.390
Diese ganzen Dinge findet man nicht mehr im Internet

01:54:13.390 --> 01:54:15.550
Ich habe es gerade probiert und es geht nicht

01:54:15.550 --> 01:54:18.390
Ja, ist alles irgendwie weg

01:54:18.390 --> 01:54:21.210
Ja, gone, gone, gone

01:54:21.210 --> 01:54:22.950
Ja, Rechtervergess ist ja auch nicht schlecht

01:54:22.950 --> 01:54:25.250
Ja, kommt alles in die Show Notes

01:54:25.250 --> 01:54:26.830
Genau, ja gut

01:54:26.830 --> 01:54:28.590
Hast du noch was?

01:54:29.250 --> 01:54:30.130
Pick, Jochen.

01:54:30.290 --> 01:54:32.570
Ja, also ich würde jetzt einfach mal so, auch was

01:54:32.570 --> 01:54:34.690
so Async-Geschichten angeht, also man braucht ja nicht nur

01:54:34.690 --> 01:54:36.210
den Serverteil, sondern halt auch

01:54:36.210 --> 01:54:38.410
der

01:54:38.410 --> 01:54:40.830
kleine ist ja manchmal auch nicht so schlecht, wenn man den hat.

01:54:41.230 --> 01:54:42.490
Ansonsten, ja,

01:54:42.710 --> 01:54:44.510
will man jetzt eigentlich gucken, ob das funktioniert hat,

01:54:44.610 --> 01:54:45.810
was man da auf der Serverseite gebaut hat.

01:54:46.610 --> 01:54:48.190
Und ja, so

01:54:48.190 --> 01:54:50.630
üblicherweise würde man jetzt unter Python zum Web-Request

01:54:50.630 --> 01:54:52.470
machen, ja, verwenden die meisten wahrscheinlich Requests.

01:54:53.750 --> 01:54:54.690
Aber das Ding

01:54:54.690 --> 01:54:56.030
ist halt leider nicht Async, gar nicht.

01:54:56.030 --> 01:54:56.710
und

01:54:56.710 --> 01:54:59.570
sondern halt komplett synchron und

01:54:59.570 --> 01:55:01.210
kann man nicht viel machen.

01:55:02.030 --> 01:55:03.570
Und sozusagen der asynchrone

01:55:03.570 --> 01:55:05.790
Nachfolger irgendwie

01:55:05.790 --> 01:55:07.710
von Request oder vielleicht wird ja Request

01:55:07.710 --> 01:55:08.610
auch nochmal irgendwann asynch

01:55:08.610 --> 01:55:10.610
ist

01:55:10.610 --> 01:55:12.670
HTTPX

01:55:12.670 --> 01:55:13.910
auch von

01:55:13.910 --> 01:55:17.530
einem der Namen,

01:55:17.690 --> 01:55:19.030
die hinter ganz vielen Dingen stehen

01:55:19.030 --> 01:55:21.470
von Tom Christie, der halt Jungle REST

01:55:21.470 --> 01:55:23.850
Framework gebaut hat

01:55:23.850 --> 01:55:25.590
und dann Starlet und

01:55:25.590 --> 01:55:26.990
und viele andere Dinge.

01:55:27.650 --> 01:55:35.150
Und genau, der hat dann irgendwann quasi auch jetzt einen async-fähigen HTTP-Client geschrieben,

01:55:35.450 --> 01:55:37.490
der sich am Request-Interface halt orientiert,

01:55:38.930 --> 01:55:42.850
aber halt auch mit dem man dann async-Geschichten machen kann.

01:55:43.430 --> 01:55:45.990
Und genau, den verwende ich jetzt auch eigentlich meistens,

01:55:46.050 --> 01:55:48.770
wenn ich irgendwie HTTP-Geschichten mache und funktioniert eigentlich ganz gut.

01:55:50.510 --> 01:55:52.630
Und warum nicht jetzt nicht mehr Requests?

01:55:52.630 --> 01:55:54.830
Was ist jetzt besser als Requests? Es kann mehr als Requests.

01:55:54.830 --> 01:55:56.470
Nee, wie gesagt, I-Sync

01:55:56.470 --> 01:55:57.950
kann kein I-Sync.

01:55:58.070 --> 01:56:00.570
Also es ist jetzt quasi I-Sync-Request.

01:56:04.110 --> 01:56:05.090
Ja, also ich erinnere mich noch,

01:56:05.170 --> 01:56:06.770
früher habe ich immer sowas verwendet wie AEO,

01:56:06.930 --> 01:56:08.850
HTTP-Client und so, aber das war immer ziemlich,

01:56:08.970 --> 01:56:09.890
das muss man viel selber machen.

01:56:09.990 --> 01:56:11.150
Ja, da muss man selber frickeln.

01:56:11.150 --> 01:56:11.470
Ja.

01:56:13.690 --> 01:56:15.010
Ja gut. Ich würde sagen,

01:56:15.090 --> 01:56:16.230
come to the dark side, we have cookies.

01:56:16.550 --> 01:56:18.870
Und du hast auch noch ein nettes Video gemacht zum Cookies.

01:56:18.910 --> 01:56:20.090
Oh ja, das können wir ja auch mal verlinken.

01:56:20.230 --> 01:56:21.910
Ja, das kommt auch in die Show Notes, perfekt.

01:56:21.910 --> 01:56:22.310
Ja.

01:56:23.930 --> 01:56:25.030
Aus aktuellem Anlass.

01:56:27.130 --> 01:56:27.330
Ja.

01:56:27.690 --> 01:56:29.630
Ja, vielen Dank, dass ihr uns heute wieder zugehört habt,

01:56:29.650 --> 01:56:30.350
dass ihr eingeschaltet habt.

01:56:31.650 --> 01:56:32.890
Feedback, Kritik, Anregungen, was auch immer,

01:56:33.030 --> 01:56:34.630
hallo at pythonpodcast.de

01:56:34.630 --> 01:56:37.450
Schreibt uns, hört uns, wann auch immer ihr wollt,

01:56:37.570 --> 01:56:38.650
morgens, mittags, abends, nachts,

01:56:39.270 --> 01:56:40.850
zum Aufstehen, zum Schlafen gehen, zum Zähneputzen,

01:56:41.350 --> 01:56:43.530
zum Autofahren, zum was auch immer euch gerade

01:56:43.530 --> 01:56:45.530
einfällt, zum auf der Decke im Park liegen,

01:56:46.510 --> 01:56:47.490
bei den Temperaturen bestimmt

01:56:47.490 --> 01:56:48.210
wundervoll.

01:56:49.110 --> 01:56:49.510
Ja.

01:56:49.510 --> 01:56:51.690
Auch beim Autofahren

01:56:51.690 --> 01:56:52.670
Optionen sind eingeschränkt

01:56:52.670 --> 01:56:55.430
Wir sind immer noch Corona

01:56:55.430 --> 01:56:56.830
behindert

01:56:56.830 --> 01:56:58.750
in allem was wir tun

01:56:58.750 --> 01:56:59.730
Aber E-Mails schreiben geht

01:56:59.730 --> 01:57:02.170
Und Podcasts hören geht auch

01:57:02.170 --> 01:57:04.610
Bleibt uns gewogen und bis zum nächsten Mal

01:57:04.610 --> 01:57:06.410
Tschüss
