Transcript: Python 3.10
Full episode transcript. Timestamps refer to the audio playback.
Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast, Episode 35.
Ja, schön, dass ihr wieder eingestellt habt. Wir waren etwas länger nicht da, das tut uns etwas leid.
War ziemlich viel zu tun und ja, Ferienfieber und so weiter, was man nicht alles kennt.
Ja.
Der alte Wahnsinn.
Ja, genau. Herzlich willkommen Dominik auch zurück. Bist du sicher, dass das Folge 35 ist?
Ja, das ist ein bisschen schwierig zu sagen.
ein bisschen trackt.
Das ist übrigens Jochen.
Ja, genau.
Vielleicht sagen wir das nächste Mal einfach
herzlich willkommen ohne Episode.
Das ist ja auch sowas.
Apple Podcasts, iTunes hat ja so
Richtlinien, wie man das... Die haben irgendwann mal gesagt,
sie hätten gern die Episoden-Nummer nicht mehr im Titel.
Das hat man früher immer so gemacht. Ich habe das auch so gemacht.
Und dann habe ich das rausgenommen.
Ich weiß nicht. Am Anfang sind die, glaube ich, noch mit dabei.
Und irgendwann habe ich...
Letztens hatten wir jedenfalls 34, dann 33,
jetzt sind wir 35 und wir haben eigentlich noch einige
unveröffentlicht. Das heißt, das ist auch nicht ganz so einfach an unseren
Files. Aber ja,
schön, dass ihr wieder da seid. Wir machen heute eine Mixed-Folge,
also ein bisschen über Python
wollen wir erzählen, drei Themen und so.
Genau, da muss man ja eigentlich was zu sagen.
Genau, und vielleicht noch über
die alten Neuerungen, die es so gab. Und dann wollen wir
noch ein bisschen über
Shared Memory von Python
und Prozessen sprechen vielleicht.
Ja, je nachdem, wie viel uns da entfällt.
Oder sonst so Dinge.
Andere Dinge auch.
Bist du noch nicht so genau. Mal schauen.
Ja, wir müssen uns wieder strukturierte Formen
kriegen, aber das haben wir bisher noch nicht hinbekommen.
Ja, genau.
Bevor wir jetzt mit Python 3.10
anfangen, was haltet ihr eigentlich von Werbung?
Beiden
fangen wir an zu beschreiben.
Ob wir es so mit Helge Schneider halten sollen,
so Werbung ist scheiße.
Oder ist das für euch ein No-Go? Es wäre cool,
wenn ihr jetzt so ein bisschen Feedback gebt, ob das für euch
in Ordnung wäre oder nicht.
Wir haben uns aus einigen technischen Perspektiven gefragt,
ob das Sinn macht oder
das mal ausprobieren.
und sind aber eigentlich noch nicht so wirklich selber davon überzeugt.
Ja, wäre es natürlich praktisch, wenn es irgendwie
die ganzen Kosten wieder so ein bisschen, also so
wahnsinnig hohe Kosten sind es jetzt nicht, aber wenn die auch ein bisschen
Ich kaufe mir ein Schloss, Jochen.
Wann das wieder reinkriegen könnte
oder so, keine Ahnung, muss man schauen.
Ja, das ist auch so ein Thema, genau.
Ja, ich warte
nur darauf, dass ich wegen dem Podcast
ein Schloss ziehen kann.
Ich glaube, da wirst du noch ein bisschen warten müssen.
Das wird noch etwas dauern.
Ich habe Zeit.
Liebensverlängernde Maßnahmen.
Ja, genau. Wollen wir so ein bisschen News machen?
Dann könnten wir mal wieder...
News, ja.
Also am Montag kam Python
3.10.0 heraus.
Ja. Also letztes Mal also am 4.10.
Voll gut, genau.
Und dazu gab es auch so ein
Release-Stream
irgendwie, fand ich auch nicht.
Oh, wir haben dich nicht gesehen, nein.
Ah, ja, genau, kann man sich auf YouTube nochmal angucken, also ehrlich gesagt, ich weiß nicht, ob ich den sich wirklich komplett angucken will, das ist irgendwie so über drei Stunden, aber man kann mal reingucken, einfach um die Leute zu sehen, die das machen, das ist vielleicht ganz interessant, die hatten auch lustige Hüte auf, das ist auch super.
Oh, cool.
Genau, ja und das war
auch ganz witzig
Ja, es war eine komplizierte Geschichte
so ein Release und
ja
genau, ich habe jetzt auch schon so ein bisschen
ich weiß nicht, hast du das schon mal versucht
irgendwo zu installieren oder mit was?
Ja, ich benutze es schon relativ lange, jetzt fast drei Monate
also den Re-Scanned-Edit, der so dann draußen kam
den habe ich auch schon dann daily benutzt
und habe so ein bisschen gemerkt, was da ging, was nicht ging
also ich muss den ja
meistens oder oft unter Windows benutzen
leider. Aber ja, da gibt es
ein großes Problem mit Python 32.
Das kann man aber relativ einfach fixieren,
man weiß, wie es geht, aber das erzähle ich vielleicht etwas später.
Ja, okay.
Genau, ich habe es eigentlich, ich habe es vielleicht auch mal
ich habe auch mal eine Beta
oder ein Release-Kandidat, weiß nicht, mal installiert,
mal so ein bisschen zu gucken. Oder ich glaube,
wir hatten irgendwann mal, haben wir uns über
das Structural-Pattern-Matching auch schon mal
unterhalten, das ist schon eine Weile her. Ich glaube, das habe ich auch
mal kurz ausprobiert oder so.
Aber ansonsten habe ich das noch nicht verwendet.
Und jetzt aber doch dann mal installiert
auch. Ich habe jetzt versucht, das Projekt gerade...
Ja, das sind ja so die Hauptfeatures, ne?
Also das ist das gleiche Patch-Hand-Matching und die
Typing-Syntax so ein bisschen angepasst und so.
Na gut,
also das ist ja die Frage, wie man es sieht. Also ich glaube,
so
das, was...
Also so ein bisschen kontrovers.
Aber klar, ich kann schon verstehen,
warum man die als die wichtigsten neuen Features
klassifizieren würde.
Ich glaube, das positivste
Feedback hat
und haben die verbesserten Fehlermeldungen bekommen.
Ja, die sind tatsächlich super.
Die werden sogar mit 3.11 noch ein bisschen schöner.
Ja, ich weiß.
Und dass man tatsächlich nicht nur irgendeinen Quatsch bekommt, sondern tatsächlich die
Stelle, an der es steht und warum, vielleicht auch
einen Hinweis, warum es falsch sein könnte und was da
falsch ist, das wird direkt gut beschrieben.
Genau, also bisher ist halt, wenn
man da irgendwo eine Klammer vergessen hat zuzumachen oder so,
dann kriegt man halt einen Syntax-Error
beim nächsten Statement, irgendwie beim Gleichheitszeichen
oder irgendwie sowas.
Und das ist halt dann irgendwie verwirrend, weil man kriegt
halt den Fehler angezeigt, nicht an der Stelle,
wo er passiert ist
und wo der Interpreter dann halt drüber fällt.
Aber genau
und jetzt ist es halt besser
und das ist halt auch alles konsequent.
Man unterkringelt jetzt richtig die Stelle, an der es ist
mit Numbers und so.
Von dem Pack-Parser, der jetzt da neu ist
und mit dem kann man einfach mehr machen.
Ja,
weiteres Feature, was halt
dem neuen Parser sozusagen
der
für zuständig ist, ist, dass jetzt
das ist auch eher so eine Randhässlichkeit,
aber das ist halt
schon komisch, wenn man diese Limitierung
irgendwie, wenn man auf die gestoßen ist
das in
Context Manager, also wenn man sagt
Context Manager S irgendwas
da konnte man
vorher nicht das so klammern
also dass man das über mehrere
Zeilen, das musste in einer Zeile sein
und man konnte auch glaube ich nicht mehrere
sondern musste das dann
mehrfach verschachteln, was dann natürlich
also wenn auf dieses Problem gestoßen ist, man hat
jetzt mehrere Context Manager
und dann irgendwann
kommen einem große Nöte, weil
wenn man immer weiter verschachteln muss,
wenn man jetzt mehrere davon hat, dann wird der Platz
auf der rechten Seite eng und wenn man die aber
nicht umbrechen kann, weil diese Klammer
dazu noch nicht funktioniert, dann hat man irgendwann
das Problem, das geht ja jetzt gar nicht
mehr so richtig. Hässlich wird das.
Das wird dann sehr hässlich.
Und das geht jetzt.
Mit Klammern, sodass man
mehrere Zeilen verwenden kann und halt auch mehrere
in einem Dings, sodass man das halt
quasi, wenn man viele
Context-Manager
benutzen möchte, das kann man jetzt einfach
in eine Zeile schreiben
beziehungsweise halt untereinander.
Ja, kann man tun.
Da sind wahrscheinlich nicht so viele
Leute drauf geschossen auf das Problem, aber ja.
Genau.
Das macht schon Sinn. Also wenn man das schafft,
könnte man ja auch anders lösen, wenn man Dekoratoren verwendet
oder so, aber...
Ja, aber ich meine, dafür gibt es die Syntax ja, dass man das halt
verwendet.
Wenn man das dann nicht so richtig
verwenden kann. Das ist halt ein bisschen blöd.
Meistens hat man ja nur so ein, zwei
Dinger, die man machen möchte.
Also in diese Verschachtelung,
oder dass es blöd wurde, ist mir dann
die einzige Male, wo mir das mal passiert ist,
das ist halt, wenn ich
in Tests mehrere Sachen
also wenn ich da mehrere Sachen
wegmocken will oder wegpatchen will
und teilweise
kann man ja auch einen Dekorator machen,
manchmal geht das auch nicht, weil das basiert halt auf anderen Sachen
und dann muss man das halt
im Test selber machen und dann
wenn man viele Sachen hat, die man
wegmocken möchte, dann wird es halt komisch.
Und das ist aber die einzige
Stelle, wo das praktisch jemals irgendwie begegnet ist.
Ansonsten, hm.
Na gut. Also was ich sehr gerne
benutze, ist diese neue Typing-Syntax, wo man
jetzt halt, ich weiß gar nicht, wie heißt das Zeichen überhaupt?
Dieser senkrechte Strich, die Pipe.
Pipe-Operator, ja. Genau. Den kann man halt jetzt
verwenden als Typing zwischen einem
oder-Zeichen, einfach sagen.
Es ist jetzt ein Dict oder ein List, der wartet jetzt diese Funktion, dann gibt sie raus,
dann macht man einfach Pipe dazwischen. Das ist irgendwie
sehr intuitiv und man muss nicht immer alles vom Typing
direkt importieren und ein Union draus machen.
Ja, es sieht auf jeden Fall deutlich besser aus.
Stimmt.
Genau, ja.
Das ist schön. Ich bin bei dieser TypeHint-Syntax
immer so, ich habe mich ehrlich gesagt auch noch nie so richtig
wirklich viel damit beschäftigt, muss ich sagen.
Will ich auch noch irgendwann machen, aber
ich habe es bisher nie so genutzt.
Aber ich finde das immer ein bisschen
verwirrend von der, ich weiß nie so genau,
was sind jetzt die aktuelle Formen von Syntax, die man da verwenden kann
und bis welcher Python-Version geht
zurück, geht das denn und so.
Aber ja, also so sieht es
auf jeden Fall schon mal viel besser aus. Sieht sowieso schon mal viel besser aus,
dass man nicht die ganzen Typen von
irgendwie aus Typing importieren
muss, sondern dass man halt direkt die echten...
Es funktioniert halt leider noch nicht immer so komplett, je nachdem wie
komplex und wie vollständig man das irgendwie so machen will.
Aber ja, es ist schon mal auf jeden Fall ein Schritt
in die richtige, sehr richtige Richtung. Sieht auch gut aus.
Was mich halt noch so ein bisschen nervt,
ist halt so, wenn du zirkuläre Abhängigkeiten hast
oder sowas. Das
passiert halt bei Typing relativ schnell
und das ist auch nicht so richtig gelöst.
Es gibt ja irgendwie so zwei Dinge, die man machen kann, dass man
von Typing irgendwie das einmal importiert
und dann nur dann, wenn Typing Type-Checking
ist, dann die nutzt.
Das geht auch nicht, weil manchmal kann man es dann als String
dann doch hinschreiben, weil dann hat man einige Types, die als
Klassen definiert sind, einige als Strings, das ist auch irgendwie
hässlich und naja.
Da wollen sie aber irgendwie dran arbeiten. Aber ich weiß noch nicht genau,
wann das eingeführt wird, dass man das halt einfach
da machen kann, dass er halt erkennt, dass es ein Type ist
und es halt dann tatsächlich lazy importiert
oder so und das dann halt kein Problem ist
beim Kompilieren.
Okay. Auch interessant, ja.
Ja.
Also das heißt, auch das wird noch besser.
Das heißt, wir bekommen insgesamt im Moment so ein bisschen
hübschere, ästhetischere Sachen für so
Errors und Syntax und so.
Je nachdem, ob man Typefins überhaupt mag.
Genau, deswegen, also ich meine, ich würde sagen,
das ist halt durchaus eine kontroverse
Geschichte, weil es gibt halt auch viele Leute,
die finden das gar nicht gut.
Nicht bei Sonic, aber ursprünglich,
da gab es das nie.
Und ja, ich kann es so ein bisschen nachvollziehen auf der anderen Seite.
Also ich glaube, man muss es halt
dafür einsetzen, wo es halt Sinn macht.
Ja, genau.
Was ich auch komisch finde, ist, wenn Leute das dann überall
verwenden, weil
es macht halt nicht überall Sinn. Also ich habe auch das Gefühl,
dass zum Beispiel, wenn ich gerade an den
Sachen, an denen ich schreibe,
wenn das halt so, das ist halt
ein Projekt, was halt andere Bibliotheken
verwendet, aber selber keine Bibliothek,
an der Stelle macht es nicht so wahnsinnig viel Sinn, weil
ich, also
es ist schön, wenn ich in der IDE sozusagen
die Ergänzung, also sozusagen
eine Idee des verwenden kann, um
mir zu helfen,
aber wenn ich sowieso
wenn das die Libraries, die Verwender tun
und brauche ich das, also sozusagen
für meinen eigenen Code, den ich quasi nie aufrufe
brauche ich das ja gar nicht, weil der halt nur
verwendet wird
um halt irgendwas zu tun
das ist halt irgendwie da, an der Stelle brauche ich es
bis jetzt nicht, ob ich es wirklich brauche
Also ich mache wahrscheinlich auch im Moment zu viel hints, also weil es gerade
irgendwie ein bisschen noch reiner als weniger
aber ich finde das dann schon sehr praktisch, wenn ich halt
wirklich das Objekt
quasi schon so getitletet habe, dass ich halt
weiß, was für ein Objekt ich da in der Funktion in der Hand habe,
weil das so getyped ist oder auch bei der
Variablenzuweisung, dass halt schon relativ klar ist, was das
halt mal sein wird oder so, weil
dann relativ, also auch manchmal kann man halt so eine Base-Klasse
nehmen, dann weiß man halt, was hat man denn da in der Hand und das ist
irgendwie, also A, natürlich vom Editor, der das
halt super dann linden kann und dann halt auch die Types
dann feststellt auch, wenn das halt irgendwie nicht stimmt,
das kann er halt relativ gut feststellen irgendwie, die
meisten modernen können das ja.
Und das ist irgendwie schon echt hilfreich, also gerade wenn ich
jetzt irgendwie mit anderen Leuten irgendwie gleichzeitig irgendwie
Features entwickle und wieder irgendwie so einen kleinen
Type-Out und was meint der denn da, wenn die Leute
nicht immer so gut nehmen oder so manchmal.
Da sieht man das halt auf jeden Fall am Type auch schon,
was das dann halt sein könnte.
Also für mich macht das so deutlich verständlicher.
Ja, man kann es wahrscheinlich auch too much machen
an zwei Stellen, aber ja, also ich finde
das Linting, das ist mir so oft aufgefallen,
dass irgendwo, wenn man dann mal die
Type-Pins dann reingebaut hat in so ein Code,
der irgendwas war komisch von
Coworker oder sowas, dann merkt man so, oh ja,
klar, wird direkt gelintet, da ist der Typ irgendwann kaputt gegangen
und er gibt halt dann doch nicht das zurück, was er erwartet hat
und vielleicht ist irgendwo doch ein None rausgefallen
oder sonst irgendwas. Und solche Sachen, die sieht man halt
durch die Typhons einfach deutlich schneller und deutlich
häufiger. Ich meine, klar, wenn man sowieso
ein so super Coder und Programmierer ist wie du,
lieber Jochen, dann...
Ich würde sagen, das ist echt, also mir hilft
es vielleicht, also ja, vielleicht nicht überall, aber...
Ja, ich glaube,
ich muss einfach mehr damit mal rumspielen.
Ja, was interessant ist, es gibt halt auch
so...
immer ja, also gerade diesen ganzen
Typing, das Ding, also alles auf so Interfaces aufzubauen.
Ja, also halt so Datenklassenbaus, wo halt
relativ klar ist, was für Attribute das
und welchen Datentypen sind.
Ja, ja, ich meine, das habe ich auch schon, also Pydentic
finde ich auch total super.
Pydentic macht das natürlich. Also genau,
was ich total, also gerade mit Fast
API zusammen, was ich total super finde, ist,
dass man halt einfach dann Objekte
auch in serialisierter Form halt einfach hin und her schicken kann.
Das ist total super mit Fast API.
Bei Fast API kannst du einfach dann quasi von einem anderen
Modell erben und lässt dann beispielsweise für
dein Datenmarktmodell ein paar Spalten weg
oder sowas und kannst es halt einfach dann als Modell einmal
definieren und kannst es als Response-Modell ausgeben und
das ist alles dann mit drin. Das ist schon
sehr nice. Genau, und das
funktioniert einfach alles so magisch.
Oh, Apropos, fast ab, wie kennst du das SQL-Model?
Ja, ja, ja.
Das ist auch von Sebastian Ramirez und da
macht er quasi einen Rapper noch um
Pydentic und SQL-Alchemy rum
und baut das alles zusammen in eine Klasse
rein, dass man halt nicht mehr so viel duplicated
Code hat und gleichzeitig irgendwie SQL-Alchemy-Modelle
und Pydentic-Scheme nachschreiben muss.
Ja, ja, das ist eine Frage, die ich mir, ich hab
irgendwann, ich weiß nicht, wenn ich
war es auch schon über ein Jahr her,
als ich zum ersten Mal angefangen hab, so ein bisschen mit
mit FastAPI rumzuspielen.
Dann dachte ich so, okay, SQL Alchemy,
schon ein schöner ORM, aber was halt doof ist,
ist halt, dass man die Modelle immer doppelt definieren
muss, einmal als SQL Alchemy
Modell und dann halt nochmal als Pidentic
Modell, damit man es rausländern kann.
Und mit dem neuen TKM und
sagst einfach TAB gleich 2.
Und das ist wirklich echt angenehm.
Ja, und da dachte ich schon, das ist aber blöd, dass man das
zwei Mal machen muss und das ist jetzt weg.
Und das würde ich auch gerne mal ausprobieren. Ich habe es bisher noch
nicht hingekriegt, aber ich glaube, das mache ich demnächst mal.
Ja, das ist sehr geil.
weil ich glaube, ich fange jetzt
ich nehme mir noch mal
dieses Deployment-Dings, was ich mal auch
das, wann habe ich das gebastelt?
Das war auch ungefähr letztes Jahr
um die Zeit, ein bisschen später
nochmal vor und dann mache ich das
nochmal mit FastAPI,
Vue.js und vielleicht mal mit SQL-Model.
Ja, also was
mir noch so ein bisschen fehlt, ist das letzte, so ein paar von den
SQL-Alchemy-Features, sowas wie Unique
Constraints oder so, habe ich aber vielleicht auch noch
nicht rausgefunden, wie das gut geht. Ich glaube, man kann das so mit
SQL-Achemy-Extra-Quarks machen oder so, aber
ja,
das funktioniert noch nicht so ganz einwandfrei,
aber da fehlt auch noch so ein bisschen Dokumentation,
das ist noch gerade relativ frisch.
Ja, das wird ja gerade erst neu.
Genau, und ja, also Migrations dazu
kann man natürlich auch schön machen.
Einfach mit, wie machen wir das, mit
Alembic, glaube ich, die heißen da, wie heißt das?
Nicht Migrations, sondern Revisions,
Revisionen oder so.
Und das Coole ist, wenn man dann
quasi sein Management macht mit Typer,
auch von Sebastian,
dann hat man quasi auch seine Management-Commands
direkt da mit drin, was das irgendwie alles ist.
Ja, das verwende ich ja auch schon lange, das verwende ich jetzt auch
seit über anderthalb Jahren schon.
Ja, das verwende ich sogar auch mit Django.
Ja, verwende ich auch mit Django, genau. Ich verwende das dann meistens mit
Pultree zusammen.
Und dann, genau,
gibt es halt, da kann man Skripts definieren
und dann sind sie halt
ich meine, ich weiß noch nicht, ob das so hübsch ist,
in so einem Commands-Py habe ich die dann
und das ist eine Funktion.
Also vor allem, du kannst das halt hinterher dann sogar in einem Notebook importieren
und kannst halt dann bestimmte
Sachen einzeln ausführen in deinem Notebook.
Das heißt, du kannst die Management-Commands sowohl auf der Kommando-Teile
als auch in deinem Notebook einfach laden und benutzen.
Und das ist halt dann schon auch sehr cool,
weil dann kannst du einfach mal on the fly einen User erstellen
und den User-Create-Command
hast du dann halt in den Commands zum Beispiel drin.
Das gibt es ja zum Beispiel bei Dango ist natürlich mit
inbound, aber das ist dann bei FASTA
ein bisschen anders. Das ist schon cool.
Das ist schon cool.
Ja, aber da hätte ich auch noch gleich mehr Fragen zu,
weil da hatte ich ein Problem, das würde ich gerne mit dir
besprechen.
Da ging es halt genau über diese
Shared-Memory-Sache. Aber vielleicht
machen wir nochmal mit Python 3.10 weiter.
Ich weiß nicht, wollen wir das schon inhaltlich nochmal
Ich meine, wir haben das ja schon mal besprochen.
Ich weiß gar nicht, ob man da jetzt nochmal was dazu sagen muss.
Also man kann halt jetzt ein Match
Statement und
dann kann man halt irgendwie so
Sachen auspacken und dann
gucken, ob das da drauf matcht.
Und dann führt man halt
dann, es ist so ein bisschen wie ein Case-Statement auf
Cooks
Speed, ich weiß nicht.
und Steelworks. Genau, und man
kann auch noch so Guards setzen davor, das heißt
man fällt dann halt da so durch und
dann kann man halt da noch
ein if hinterschreiben und dann, je nachdem, ob
die Bedingung erfüllt ist oder nicht, dann matcht es da
halt rein oder halt... Jetzt kannst du kurz sagen, was ist ein Guard?
Genau, also wenn man jetzt sagen kann,
wenn man sagt,
wenn man jetzt
die Bedingungen hat,
sozusagen, und man
möchte aber zusätzlich noch irgendwie, und dann sagt man noch,
wenn irgendeine andere Bedingung erfüllt ist, dann kann man
hintendran an den Ausdruckerfragen schreiben,
if irgendwas x gleich y oder so
und dann läuft das da rein und
wenn das nicht so ist, dann läuft es halt weiter in den Default-File
zum Beispiel.
Okay, das ist der Gart.
Genau, das ist halt auch nett, weil
ich habe noch nicht wirklich tolle
Anwendungsfälle dafür, ehrlich gesagt.
Ja, es ist halt so ein bisschen zum
Filtern von so Dingen. Das war irgendwie mit if,
das ist halt irgendwie sehr verschachtelt, da muss man tausendmal
den Code schreiben und in diesem Match-Case,
da kann man relativ schön gucken, was denn da übergeben wurde.
zu kennen. So ein Command-Parser zum Beispiel kann man
sehr schön mit Match-Case, glaube ich, abbilden
oder so. Ja, vielleicht wenn man irgendwelche Dinge parsed.
Das könnte man wahrscheinlich deutlich einfacher
hinkriegen. Oder was ich mir auch vorstellen kann,
ist, dass wenn man halt so...
Also du hast zum Beispiel so einen generischen Endpunkt
für irgendwas, da kommt irgendwas rein.
Ja, aber das ist eine gute Idee,
ist das da.
Ja, du kannst zum Beispiel sagen, nur dann, wenn es
ein bestimmtes Format hat, dann mach ich
aber was mit, ansonsten schmeiß ich es einfach weg.
Ja, genau. Also das
Einzige, wo ich praktische Dinge gesehen habe,
Ich meine, das kommt natürlich, also man müsste wahrscheinlich mal so in die Elixierwelt gucken oder so.
Da ist das halt häufig eine Geschichte, die man da verwendet.
Vielleicht gibt es da irgendwie ganz tolle Anwendungsfälle für.
Du gehst häufig in Elixier, ich sehe immer das Buch in der Ecke.
Ja, ich bin immer noch nicht so richtig weitergekommen.
Manchmal muss man es halt nicht nur rumliegen haben, sondern auch mal reingucken.
In einem Kopfkissen hilft am besten.
Ja, genau.
Oder halt irgendwie eine andere Sprache, die das halt kann.
Ich lege mir auch immer ganz viel Gold in das Kopfkissen.
Ja.
Aber
irgendwie
genau, weil ich jetzt
bei Python, also der einzige Fall, wo ich
das Gefühl habe, da ist etwas, das ist so ähnlich
und
ist halt, wenn man jetzt in
JavaScript im Frontend, da gibt es
zum Beispiel React, so Redux oder so,
so Eventsysteme hat
und
da hat man halt
häufig auch so Dinger, die diese Struktur haben,
dass man halt ein Case Statement hat und dann wird das
halt je nachdem,
was da passiert ist,
man hat halt irgendwie ein Event, was da reinfällt
und dann splittet man das halt auf
und ruft dann entsprechend Funktionen auf
oder updatet irgendwie ein State oder macht halt irgendwas
und im Kern von diesen
Stores ist halt häufig ein großes Case
Statement irgendwie
und das könnte man dann halt, in Python könnte man das
dann auch so machen und halt eleganter mit dem
Structural Pattern Matching, das wäre jetzt so
eine Anwendung, die mir einfallen würde, aber ansonsten
Du musst ja natürlich jetzt alle If-Statements durch
Match-Case ersetzen erstmal, um zu testen.
Das Problem ist halt auch, so wirklich
einfach nur so
verwenden ist halt auch, weil man hat ja oft
das Problem, dass man einen Code hat, der auch noch auf älteren
Python-Versionen laufen soll und dann
man kann das ja nicht einfach so, also man kann das
in irgendeinem Projekt verwenden, das
komplett neu ist oder so, das man in Kontrolle hat, aber
wenn das irgendwo, wenn man jetzt zum Beispiel eine Library schreibt,
dann kann man das nicht gut verwenden, weil
dann müsste man sagen, geht erst ab 3.10 und
Das ist dann halt Pech.
Ja gut, aber
auch ein Ding, was ich daran
so ein bisschen blöd finde, ist
wenn man das momentan irgendwo reinschreibt
und lässt
dann Black drüber laufen, dann geht das nicht.
Black mag das nicht?
Nicht bei 3.10?
Nein.
Das heißt
Autoformat
funktioniert nicht mehr, wenn man
Das kann ja gar nicht sein.
Das muss doch schon gefixt sein.
Da muss doch schon ein Pull-Request irgendwo zu geben.
Ja, ja, das kommt bestimmt dann irgendwann, aber
momentan jetzt halt noch nicht.
Okay, muss ich mir mal anschauen.
Auch, ah, das war das Python Bytes Podcast,
ich weiß nicht genau, das ich gehört habe. Es gibt einen,
fand ich auch schön, man hat ja immer so das Problem,
wenn man Sachen, Basen umstellt
auf
Black, dass das dann halt so
riesige
Diffs erzeugt und
das ist halt irgendwie kacke, weil man dann halt nicht mehr sehen kann,
wann irgendwas passiert ist, weil
man landet immer bei diesem riesen Änderungsding.
Ja.
Da gibt es
ein Projekt, das nennt sich, glaube ich, Darker
Darker? Ja
Und das macht quasi Black, aber immer nur
für die Änderungen, die man
Also wenn man einen Code ändert, dann macht es sozusagen
das gleiche wie Black, aber nur auf dem Diff
So dass es halt immer so
dunkler wird mit der Zeit, aber
Das heißt, es ändert
nur Sachen, die man eh angefasst hat und das war nicht auch
eine nette Idee, eigentlich eine völlig offensichtliche Idee
Aber ja
Ja, okay
Ja, fand ich ganz faszinierend
Genau
Structural
Pattern Matching, was haben wir denn noch?
Ja, also die Disutiles sind deprecated.
Ja, oh, das ist mir auch
und genau,
Disutiles sind deprecated, da ist auch ein Ding drin,
das mir auf den Fuß gefallen ist, als ich versucht habe, die Sachen
dann, die ich so mache,
mal zu gucken,
ob das unter 3.10 auch läuft
und da gibt es eine Abhängigkeit, die hat
Wagtail.
Das schöne Wagtail, ja,
das liebe ich auch so sehr.
Das fängt ab von L18N,
das ist irgendwie das Paket.
L, ich dachte immer es wäre ein I.
Ja, nee, das macht so leicht was an. Ich weiß, was es genau macht, weiß ich gar nicht.
Aber das ist halt so ein Ding, das ist halt
irgendwie
zwei Stars auf GitHub
von irgendjemandem
und Wagtail hängt davon ab.
Und das Ding
verwendet im Setup-PY-Skript
irgendwo ein BDist
Wininst oder sowas
und das ist in Python 3.8 defrecated worden
und in 3.10 ist es rausgeflogen.
Und deswegen baut es nicht mehr.
Das heißt, man kann unter 3.10
Python 3.10 Wagtail nicht mehr installieren.
Das ist halt so ein bisschen
Kacke.
Und ja, das ist halt
ja, ich habe da mal
ein Full-Request gemacht, mal gucken.
Aber das ist halt
ja, schon ein bisschen
vielleicht ist diese Abhängigkeit nicht so
toll.
Da wo wir so blöden Abhängigkeiten sind
mit Python 3.10 kaputt gehen, da müsste ich jetzt noch mal
auf das PyWin32 Problem gehen, weil
PyWin32 ist unter Windows relativ wichtig,
weil es halt relativ oft gebraucht wird
für bestimmte Sachen, um die zu laufen zu lassen.
Das heißt, ohne PyWin32 geht viel
von Python Wheels bauen nicht.
Das heißt, du kannst es fast nicht benutzen, was halt sehr blöd ist.
Und die Abhängigkeit, die viele Projekte
haben, ist sowas wie PyWin32-301.
Das gibt es aber jetzt
im Moment nicht für 3.10 und auch nicht für 3.8.
Keiner weiß, warum. Die Wheels werden irgendwie
nicht richtig bei Python ausgeliefert. Ich glaube, der
Maintainer ist auch so ein bisschen,
ich sage mal, vorsichtig sperrig, was
das angeht.
Ja, und das ist halt blöd, weil du kannst
halt, dass dann keine Projekte mehr installieren
oder Pultree geht nicht mehr oder so Und das ist halt extrem f Leute die Windows entwickeln Und was man aber machen kann also ich habe einen kleinen Workaround gefunden man installiert einfach Python 32 301 also auch irgendwie komische Varianten
die Versionen gehen von 200 auf
301, dann kommt dann
301.1, warum?
Na gut, vielleicht ist irgendwann so manche Version
reingeflogen, ich weiß es nicht, es ist auf jeden Fall
seltsam und naja, man kann
es 301 manuell installieren
und dann, das ist ein bisschen hacky,
einfach in das
Side-Packages-Verzeichnis gehen und im Manifest
die Version von 301.1 auf 301
ändern und dann denkt
tatsächlich unter den Folien-Namen umbenennen
auch von 301.1 auf 301
und dann denkt tatsächlich PIP,
dass das vernünftig installiert ist und fragt nicht mehr
und es funktioniert alles. Und so
kommt man halt drumherum, aber das ist halt schon sehr,
sehr hässlich und es gibt auch da wohl ein paar
Pull-Requests, aber anders gehen
bestimmte Sachen da leider nicht zu fixen, das ist
ein bisschen blöd.
Ja, also
oder das sind, ich meine...
Ja, wenn es so ein wichtiges Paket gibt,
wo dann so ein Maintaining auf einmal nicht mehr stattfindet und so,
das ist schon ein Anstrengung.
Ja,
das ist schon
fies. Also mir ist auch
wieder jetzt bei dem Upgrade,
also einmal im Jahr fällt einem das dann auf,
mindestens, wenn es halt eine neue
Python-Version gibt. Aber bei den Miner-Versions
oder Updates von Python fällt es mir auch häufiger auf,
dass es halt alles noch echt ziemlich
wild ist, weil also auch
Poetry hat da so Schwierigkeiten.
Das Lustige ist halt, wenn man Ragtale
per PIP installiert, dann funktioniert es nämlich nicht.
Mir ist es halt auf die Füße gefallen,
weil ich es per Poetry installiert habe und Poetry
macht halt was anderes als PIP.
Ja, es checkt auch noch die Site Dependencies und so.
Und ja, aber das macht es halt
und es guckt sich halt dann teilweise die
Setup UI an und so.
Und das ist halt nicht so gut unter Umständen.
Wenn dann Reel ist, dann installiert
es halt stumpf das Reel, das funktioniert dann.
Das ist halt auf Nahe, wenn man halt nicht auf Windows ist.
Und ja,
Poetry macht das halt nicht und dann geht es halt schief,
weil dann irgendein Import nicht mehr funktioniert oder so
und Poetry macht sowieso komische Sachen teilweise.
Im Moment, ich bin auch so ein bisschen, also die
Version 1.2 habe ich gesehen, ist gar nicht so schlecht,
die haben einfach umbestellt das Installation, das heißt,
ich muss auch in den Docker-Files überall von Get-Poetry
auf Install-Poetry umstellen und so und
dann funktioniert es aber auch noch nicht so richtig überall
und dann das Update auf 1.2,
also es gibt ja so ein Safe-Update, da mit der neuesten Version,
da kann man jetzt halt Safe-Update machen, muss nicht mehr
irgendwie jedes Mal neu das
vom GitHub-Input ziehen. Das funktioniert schon mal ganz gut auch, ja.
Ja, aber das funktioniert halt dann noch nicht so richtig.
Und dass die Preview-Versionen nicht schützen,
wenn man die ausprobiert, einfach ab und so.
Naja.
Ja, also ich muss sagen,
Poetry ärgert mich in letzter Zeit auch irgendwie.
Ich verstehe gar nicht, warum.
Zwischendurch lief es wirklich gut, einwandfrei.
Irgendwer hat irgendwas kaputtgecodet.
Ja, ich weiß es nicht so genau.
Aber ich bin ja bereit anzuerkennen,
dass das halt auch nicht so ein ganz einfaches Problem ist.
Aber irgendwie läuft es nicht rund.
Und jetzt auch nach dem Update.
und also
natürlich, so die üblichen Kandidaten, das funktioniert alles
wieder nicht, also
ich glaube auch
Poetry hatte mit 3.10 auch Probleme
irgendwie, da hat auch irgendwas nicht so richtig funktioniert,
aber halt NumPy und so, das
funktioniert natürlich auch nicht
und ich meine, gut kann man verstehen, es dauert
ein bisschen, bis da die Wheels und die
Binary Star sind, aber
ja, also
so richtig rund ist das alles irgendwie
nicht, ja. Ich war ja meistens
bei wichtigeren Sachen auf 3.1 oder 3.2
oder sowas.
Ja, aber ich meine,
vielleicht sollte man tatsächlich hingehen
und das einfach vorher schon mal ausprobieren
und dann gucken, wo es kracht und dann da halt versuchen,
so ein bisschen zu helfen. Ich meine, das ist
wahrscheinlich irgendwie hilfreicher als wenn man nur meckert.
Ja, ja, ja.
Eigentlich schon.
Ich muss das eigentlich mal irgendwo hinschreiben.
Aber naja.
Ja, jetzt kommt Werbung.
Dö, dö, dö, dö.
Was haltet ihr eigentlich von Werbung?
Hier.
3.11 haben wir noch was?
3.11?
Weil das ist ja 3.11
Ja, 3.11 ist
Main-Branche bei Python
Ich glaube,
was da ganz interessant, ich weiß es gar nicht,
da gibt es auch Verbesserungen, wenn man
jetzt Fehler hat
Weitere, genau
aber es gibt auch noch, es soll jetzt
mit 3.11, was da, habe ich jetzt letztens
irgendwie, gab es auch ein Podcast-Interview
mit Guido
zu, was denn jetzt so alles
ansteht, zu Performance-Optimierung.
Oh, da gab es auch mal ein schönes Artikel,
ein Blogpost von
Mark Shannon zu einem Interview.
Ja, Mark Shannon, genau, der hat
beschäftigt sich mit der auch schon wahnsinnig lange,
aber den habe ich nicht gesehen, den musste ich mir
mal schicken, weil dann...
Ja, genau, den haben die schon genutzt.
Jedenfalls, genau,
genau, in die
Richtung geht das halt und
da wird jetzt viel dran gearbeitet
und da gibt es jetzt erstmal so Basisgeschichten
für in 3.11. Bis das
sich wirklich auswirkt, wird das alles noch ein bisschen
dauern.
Aber was halt
dann in 3.11, glaube ich, also
wird es auf jeden Fall die Infrastruktur dafür geben,
dass halt Funktionen sich
zum Beispiel, also eines der Probleme bei Python ist
halt Funktionen langsam
aus diversen Gründen.
Also einer der Gründe ist halt, dass
sie halt sehr, dass man ja nicht
einfach, wenn man jetzt sagt, eine Funktion, die
nur zwei Zahlen addiert oder so,
und Jochen unterhalten sich über die Programmiersprache Python
jetzt. Der Interpreter könnte zum Beispiel bemerken,
okay, jetzt diese Funktion ist tausendmal
aufgerufen worden und zwar immer nur mit Integer.
Jetzt ersetze ich die Funktion,
die da aufgerufen wurde, halt durch
eine
schnellere Funktion,
sozusagen, also anderer By-Code,
der halt nur Integer
macht, sonst nichts.
Und das geht dann halt viel schneller.
Und das Problem
dabei, was das halt schwierig macht, ist,
dass, wenn jetzt das
schief geht, wenn jetzt plötzlich doch ein Float reinkommt
oder so, dann muss es irgendwie
wieder, muss es
trotzdem funktionieren und wenn das
häufiger passiert, weil das dann besonders
ätzend ist, performancetechnisch,
muss dann halt auch diese Optimierung wieder rückgängig
gemacht werden, wenn halt sozusagen der normale Bytecode
besser gewesen wäre. Oder ja genau, dann die
Vorwärtsumme cached ein. Das macht alles ziemlich
kompliziert und dann eine Geschichte, die mir nicht so klar war,
das fand ich auch interessant, ist, dass halt
die Frame-Objekte gibt
in Python, also wenn man eine Funktion
aufruft, dann wird erstmal so ein Frame-Objekt
erstellt. Was ist ein Frame?
Oh je
Ja, das muss man auch erklären
Ich würde sagen, ja, letztlich so ein Stackframe
das war dann schon sehr maschinennah
Ein Stackframe?
Ja, also letztlich in Python ist das
Frame-Objekt sowas, da steht halt drin
welche Globals es gibt, welche Locals es gibt
was das
Code-Objekt ist, so Zeugs
Also quasi der aktuelle Namespace quasi
das dickt in dem quasi drinsteht, was alle gerade aktuell ist
Also sozusagen
alles was man braucht halt, um so diese Funktion
auszuführen.
Und es ist ja auch gut,
das zu haben. Wenn man jetzt zum Beispiel
Code debuggt oder so, dann ist das halt total praktisch,
wenn man das halt direkt alles
nachgucken kann und wenn man es auch ändern kann und so.
Auf der anderen Seite, wenn man jetzt
Code wirklich ausgeführt ist, dann braucht man das nicht unbedingt.
Und die Dinger
werden halt auch dynamisch alloziert,
also sowieso alles dynamisch und dann hat man halt
den ganzen Heap voll, wenn man jetzt viele
unterschiedliche Funktionen aufruft, hat man jetzt den ganzen
Heap voll gesprengelt mit diesen Dingern.
Und das macht halt alles irgendwie langsam.
und jetzt also eine Optimierung,
ich weiß nicht, ob das kann auch sein, dass das eine von denen war,
die Marc Schender vorgeschlagen hat,
ist halt zu sagen, man allociert irgendwie
erstmal eine ganze Reihe von den Dingern, packt die irgendwo hin
und dann nimmt man die halt und nicht nur
nicht so komplette Objekte, sondern
für, dass das halt, wenn das ausgeführt werden soll,
dann sind das halt einfach nur Structs und
die liegen da an einer bestimmten Stelle und die müssen
das wird, und das ist halt
im Speicher dann lokal und keine Ahnung,
also seine Performance ist besser und nur wenn man
es debugt, verwendet man halt
diese vollen
Frame-Objekte, die man sonst normalerweise immer hat.
Und das ist Instruct?
Ja, das ist jetzt so eine C-Spezialität.
Eine Datenstruktur
quasi mit
mehreren, die halt
aus mehreren Sachen besteht.
Man hat die grundlegenden
Datentypen, sowas wie Integer, Float,
Charakter
und
Instruct kann dann zum Beispiel
ein Character-Array haben
und ein Float und ein Int oder so.
und dann der, genau.
Also ein komplexerer Datentyp
in C quasi, sowas wie ein Base-Model.
Ja.
Ist halt kein Objekt,
aber auch die Art,
wie man dann Objekte in C implementiert.
Ja, da braucht man halt noch
Pointe auf die Funktionen, die das Ding hat.
Ja, genau.
Aber genau,
was ich auch noch interessant fand,
so an Metageschichten zu dieser
Performance-Optimierungsgeschichte ist halt,
dass
wie du da so ein bisschen drüber erzählt hast
was, ich muss den
Link auf die Episode, muss ich auch nochmal in die
Show Notes packen, was
bisher immer so schief gelaufen ist, so
PyPy hat ja nicht so richtig, muss man leider sagen
wahrscheinlich nicht so richtig funktioniert
und
der Grund ist halt, dass
aus einer Perspektive
dass sie
haben halt ein Problem gelöst
aber das
schwierige Problem halt nicht und das ist
wie kriegt man das so hin, dass es schneller wird
plus, dass die ganzen
C-Extensions halt noch funktionieren
das ist ja auch immer genau das Problem
PyPi
ist halt natürlich
so ein bisschen Just-in-Time
wobei kann man auch nicht so richtig sagen
Just-in-Time-Compilation ist halt auch so ein schwieriger Begriff
aber es macht halt irgendwie
dein Python
die Ausführung von deinem Python-Code deutlich schneller
nur das Problem ist halt
die ganzen C-Geschichten funktionieren
halt nicht mehr. Und das ist
natürlich ein großes Problem, weil das ist halt
das, wo du normalerweise deine
Performance-Gewinne herbekommst. Also wenn ich halt
Sachen in NumPy mache, dann statt in
mit Python-Listen
oder so, dann ist das natürlich viel, viel schneller.
Und ja,
das geht dann halt so nicht mehr,
wenn man halt PyPy verwendet.
Daher macht das alles
keinen großen Sinn. Und
diese Geschichten sind halt nie,
vielleicht auch einfach nicht lösbar und daher
ist das einfach nicht funktioniert.
und sie haben halt große Schwierigkeiten, irgendwie
up-to-date zu bleiben,
weil sich natürlich auch immer alles ändert,
irgendwie mit neuen Python-Versionen
und dann ändert sich halt auch die
DC-CAP
und so, es ist alles nicht so einfach.
Jedenfalls, dieser Weg hat halt nicht so
richtig funktioniert irgendwie
und dann gab es ja noch ein paar andere Wege, es gab noch
Pisten und es gab noch
irgendwie Sachen, momentan gibt es auch noch,
ich glaube, es gab es nicht nur,
das gibt es auch wieder, es gab bei Microsoft
noch Leute, die das versucht haben auf der .NET
Runtime irgendwie laufen zu lassen. Die machen auch irgendwie lustige Sachen.
Aber...
Was ist dein Pisten?
Ja, auch ein Projekt,
was halt so eine Art...
Lass mich lügen,
ich weiß jetzt gar nicht genau, was sie
an Optimierungen gemacht haben.
Es gab auch vorher schon
ein paar Sachen,
wie hießen das noch? Psycho?
Das gibt es
auch schon ganz lange nicht mehr, glaube ich.
Naja, es gab auf jeden Fall schon so ein paar Versuche,
schneller zu machen, aber das alles,
wenn das halt darauf hinaus lief,
dass es halt irgendwie anders
funktioniert als C-Python-Bytecode,
dann ist es halt nicht gut.
So richtig, weil
das ist halt
dann doch, weil das Problem
ist, dass viele Sachen, die halt da dranhängen,
gehen dann halt nicht mehr. Unter anderem
die ganzen
C-Extensions.
Was mich dazu führt, also es gibt ja noch
Alternativen vielleicht dazu. Ich habe jetzt schon ein paar Mal
so Rust-Python-Issens irgendwie.
Ja, Rust, das ist auch interessant, ja, auf jeden Fall.
Also das wäre wahrscheinlich auch für die Zukunft
halt, das ist eine Geschichte, die
also einmal Extensions
in Rust schreiben und nicht in C, das ist eine interessante
Geschichte.
Und natürlich, was auch
unter Umständen interessant wäre, halt vielleicht
einen Interpreter zu schreiben, der halt
nicht in C ist, sondern in Rust,
aber das ist natürlich noch ein weiter Weg.
Aber das hätte halt einen riesen Vorteil,
wenn man das mal irgendwann hinkriegt. Das muss man alles zwar neu
schreiben, aber ja. Man muss halt so ziemlich alles neu
schreiben, was ein bisschen schwierig ist, aber
wenn man das dann kriegt, dann könnte man das halt auch
da, man Rust halt irgendwie nach
WebAssembly irgendwie kopieren kann,
könnte man das halt in den Browser bringen.
Das wäre natürlich schon nett.
Dann könnte man einfach im Browser dann
Python ausführen.
Aber das ist
alles noch sehr weit weg.
Man muss halt einfach nochmal neu schreiben, das war noch ein bisschen
ein bisschen weg runter.
Leute entwickeln, finden die auch gut Rust können
und so, das ist auch nicht so einfach, gibt es ja auch noch nicht so ewig.
Und das dann in der Kombination,
und dann muss das dann in Rust sich dann auch wieder entwickeln
und die ganzen Fehlerchen dann wegkommen.
Aber es könnte
tatsächlich doch gar nicht so interessant sein, oder?
Also es könnte doch deutlich schneller sein als noch
in C. Sicherer auch als in C.
Ja, ja, klar.
Es ist auf jeden Fall
sehr interessant. Ich bin gespannt.
Aber genau, um mal wieder den Bogen
zurückzukriegen.
Guido hat ja jetzt
wieder im Ruhestand
zurückgekommen und hat jetzt
ein Team bei Microsoft und
und das ist auch komisch,
wie gedacht, dass er jeweils, also
so ist es halt.
Man kann es auch trennen.
Schon irgendwie, ja,
ist jetzt wieder cool und
genau,
er widmet sich da jetzt
hauptsächlich irgendwie Python Performance und das
natürlich auch schon mal, aber es wird halt noch ein bisschen lauern,
auch bis sich das dann wirklich auswirkt.
Aber
wir können wahrscheinlich damit rechnen, dass halt in den nächsten
Jahren Python halt nochmal ein gutes Stückchen
schneller wird und das ist auch schon mal eine schöne Sache.
Ja, genau.
Ich weiß nicht genau, hatten wir sonst noch
irgendwas zu Python 3.10?
Oder 3.11 haben wir gesagt?
Ja, 3.11 Better FacePacks haben wir auch schon gesagt.
Das sieht wirklich schick aus,
das heißt, man kann sie wirklich mal lesen.
Das macht Sinn. Das ist schon gut, ja.
Also ja, ich glaube, News gibt es halt noch
ein bisschen, Django vielleicht.
Ja, Django, da gibt es auch eine Alpha-Release von Django 4,
das habe ich auch mal ausprobiert,
geguckt, was dann alles so kaputt geht.
Und, was geht kaputt?
Wagtail zum Beispiel.
Ach so, so eine Überraschung.
Ja, noch so ein paar andere Sachen.
Ich meine, meine Lieblingskandidaten
für Sachen, die schief sind,
sind ja auch mal so
die ganzen Comments-Zeugs,
weil das halt auch nur noch so
marginal-Maintenant ist.
Stratag Comments, Fluent Comments,
Contrib Comments. Contrib Comments ist, glaube ich, sogar
halbwegs gut-Maintenant. Da gab es auch
Mai oder so wieder eine Version.
und Fluncommands und Threadedcommands
vor allen Dingen eher nicht so.
Und genau, Threadedcommands ist halt auch kaputt
gegangen und da habe ich dann halt irgendwie auch, glaube ich,
einen Pull-Request gemacht.
Und dann Wagtail ist auch kaputt
gegangen. Da habe ich dann auch
einen Pull-Request
irgendwie gemacht.
Dann habe ich mich nicht mehr drum herum gekümmert,
weil ich keine Zeit hatte. Und dann ist er
irgendwie so halb durchgegangen.
Das ist mir, ehrlich gesagt,
ein bisschen peinlich, weil ich habe da irgendwie nur so etwas
gerotzt und dann kamen dann noch so Anmerkungen und was ich noch tun könnte und so und ich habe einfach nicht mehr reagiert und dann hat irgendjemand dann irgendwie Teile davon einfach so gemerged und waren halt dann drin. Aber es ist irgendwie, ehrlich gesagt, sehr schlampig von meiner Seite aus. Aber ja, also... So, so, so. Ja. Ich kicke immer auf die Finger, wenn ich das nicht ordentlich mache. Ja. Aber prinzipiell geht Wagtail mit Django 4. Also das funktioniert schon. Also man muss da gar nicht so wahnsinnig viel...
prinzipiert, wenn man noch ein bisschen...
Es gibt zwei Dinge, die
nicht funktionieren. Das eine ist zwar
aus...
Wenn man ein All-Pass-Quote verwendet,
das hat sich irgendwie geändert.
Das war früher in Django selber
drin. In Django 4 fliegt das raus.
Das ist sowieso schon deprecated.
Und das bedeutet, man muss jetzt
von All-Pass-Import-Quotes sagen,
statt das aus Django zu importieren.
Weil das jetzt halt in der Python-Standard-Bibliothek
genau das gleiche macht wie halt vorher in Django.
Und das muss man ändern.
Also URL-Quoten, meinst du, um
irgendwie so Sachen rauszubekommen, oder?
Ja, genau, um zum Beispiel irgendwie
ein Dikt oder so,
dann willst du das halt
in URL-Parameter verwandeln.
Ich weiß gar nicht jetzt genau,
unter welchen Bedingungen man das jetzt wie verwendet,
aber ja, genau, also es ist halt so, dass
irgendwas, was nicht halt in der URL
stehen kann, was machen, was halt
da drin stehen kann.
Und
dann
eine andere Geschichte ist genau,
und Jochen unterhalten sich über die Programmiersprache Python
Also sowieso, es macht glaube ich nicht mehr als
irgendeinen Header zu überprüfen, ob der gesetzt ist.
Das ist nicht die richtige Methode, man soll direkt gucken, ob der Header drin ist.
Genau, das ist halt der empfohlene
Workaround, das einfach ersetzen durch
ist der Header da drin oder nicht.
Genau, das habe ich dann im Werkzeug auch gemacht.
Aber insgesamt
hieß es halt so
in der Django-Dokumentation
dazu, ja, also das ist sowieso
nicht so toll, das darüber zu machen, weil das ist halt
jQuery-spezifisch.
und jQuery ist auch so auf dem Weg
nach draußen und die
meisten verwenden halt inzwischen Fetch
in JavaScript, Fetch API
und die macht das sowieso irgendwie anders
und das heißt,
das ist ein bisschen nutzlos.
Das ist Ajax, das liefert halt einfach nicht mehr die
richtige, es ist ein Ajax
Call, aber das
kommt halt am Server so nicht an
beziehungsweise den Header
zu überprüfen ist so ein bisschen sinnlos und
weil das halt irgendwie nur von jQuery
gesetzt wird, das heißt
im Grunde muss man das streichen, weil das funktioniert so nicht mehr.
Und dann die andere Geschichte ist halt
auch so, ja wozu das überhaupt
überprüfen, das ist auch irgendwie Quatsch, weil
naja,
oder genau, das ist halt
empfohlen, was man dann überprüfen soll, weil
was möchte man eigentlich machen oft?
Man möchte halt so etwas machen wie,
ja, wenn da jetzt ein Browser
auf die URL geht zum Beispiel
und dann halt sonst JSON kriegen würde, dann
will man dem nicht einfach JSON
schicken, sondern vielleicht eine HTML
Fehlermeldungen, so
Hallo, bitte nicht mit dem Browser hier hin,
sondern geh lieber da hin, weil hier gibt es nur JSON,
sowas. Und dafür muss man halt
eine Fallunterscheidung machen und
da sollte man doch lieber
auf request.accept
gucken, ob das Ding jetzt zum Beispiel
HTML,
Text HTML haben will oder so.
Wenn es Text HTML haben will, dann sagt man halt
hier so, hier Fehlermeldung, ich gebe eigentlich nur JSON zurück,
ich kann gar nichts anderes als JSON
und das ist halt dann besser, das funktioniert
in jedem Fall eigentlich.
Wie der Request gemacht wird
von der kleinen Seite aus, ob über Fetch oder
Jackfairy. Genau, das ist halt das,
worauf man dann langfristig migrieren
sollte, kurzfristig, wenn man es
ja,
weil Ajax
ist halt weg mit Django 4.
Genau, aber ansonsten
das hat
relativ reibungslos funktioniert. Also Django 4
funktioniert bei mir schon relativ problemlos
und ja.
Also Timezone-Informationen
haben sich schon ein paar Sachen, glaube ich, geändert, wenn man die
vorwärts...
Python, wann hat das noch umgestellt? 3 irgendwas?
Das ist irgendwie
Zone-Info jetzt neu.
Ich weiß nicht, ob da Python 3 neu drin war,
dass das jetzt in die Standard-Bildung gewandert ist.
Genau.
Und da kann man ja wahrscheinlich mehr machen,
als Python, die das irgendwie raus soll irgendwann.
Und das ist
vielleicht ganz interessant noch.
Auch ein schönes neues Feature.
Und ansonsten, die anderen Sachen, ehrlich gesagt,
es gibt ein Standard-Redis-Cache-Weckend
jetzt, das muss man nicht mehr extra dazu packen.
Aber gut, keine third-party-library, aber
ja, also ich meine,
ändert sich da nicht so viel dran,
weil, ja,
ich meine, man konnte es ja auch bisher schon alles verwenden.
Also das war, gibt es eine
Umfrage, die sie irgendwie gemacht haben, wer verwendet denn
was für User denn so
für
Caching-Backends und
Memcache, die
ist halt drin als in Django,
da muss man nichts zusätzlich installieren.
Und dann kam in der Umfrage raus, oh, die Leute verwenden
aber alle Redes und nicht in einem Cache-D.
Und ja, das ist halt nicht drin.
Das heißt, alle müssen nochmal irgendwie Zusatzkram
installieren. Oh, das bringt mich fast schon zu meiner nächsten
Frage, weil das so ein bisschen daran anschließt.
Aber das, ja, vielleicht stellen wir das
noch kurz zurück. Wir machen Werbung.
Wieder ein Wissen.
Ja,
dann sind wir fertig denn tatsächlich mit
Python Dango News.
Lass mal überlegen.
Doch, also mit den News auf jeden Fall.
Aber, genau,
ich habe noch so ein paar, ach,
auch eine News, Psychic Learn
hat eine Version 1.0
das war ehrlich gesagt schon relativ lange stabil, aber
jetzt hat es auch tatsächlich irgendwie eine
offizielle 1.0 Version
Major Versionsnummer
was eine tolle Geschichte ist
super Projekt
genau
ja, das ist auch
so das Beispiel, ich habe letztens
Alex Friedman
der Gründer von Anaconda
und von Travis Olyphant, der hat auch NumPy,
SciPy, SciPy hat er zuerst, wusste ich auch nicht,
SciPy zuerst entwickelt und dann NumPy kam später
dazu, weil man Numeric und
das andere Ding, NumArray, irgendwie zusammenfassen musste,
weil es gab zwar eben diese beiden unterschiedlichen Implementationen,
dann ist es halt NumPy geworden.
Der erzählt halt auch so ein bisschen
und der hat dann
Cyclet Learn als so
beispielhaftes Projekt,
wie das hätte laufen sollen,
eigentlich dann erwähnt und
ein ganz tolles Projekt. Also Cyclet Learn,
wirklich voll gut. Es gibt auch noch Cyclet Image und noch ein paar andere.
Aber Cyclet Learn ist eigentlich so das
große Ding,
was dabei rausgefallen ist.
Ja, voll gut.
Was haben wir noch?
Tja.
Oh, es gab eine
Sicherheitslücke. Das hat jetzt gar nichts
mit Python zu tun. Ich fand das nur deswegen interessant,
weil es halt so eine
Geschichte ist, die etwas illustriert,
wenn man das einfach so erzählt, oft ist das nicht
so ein bisschen intuitiv,
aber das ist ein sehr schönes Beispiel
dafür, weil
ich habe halt oft das Gefühl, dass
es sozusagen die
Ansicht gibt, dass man Sicherheit irgendwie
dadurch herstellen kann, dass man
zus Dinge tut oder Dinge erweitert oder so also man wei ich nicht kauft irgendetwas was dann halt Sicherheit macht
Oder man installiert
zusätzliches Zeug, das dann Sachen sicherer machen soll.
Ich habe da immer so ein bisschen
Bedenken und ich habe das Gefühl, dass das geht eigentlich gar nicht.
Sondern eigentlich kriegt man wirklich Sicherheit nur
dadurch, dass man Sachen weglässt, weil
alles, was halt irgendwas tut, hat halt irgendwie
die Angriffsoberfläche
größer.
Und das ist halt ein Problem. Und jetzt hat es halt
einen so ein Ding erwischt und das fand ich
Was für ein Ding hast du denn überhaupt erwischt?
Fail to ban.
Das ist halt irgendwie so ein Ding, dass man sich zusätzlich
zu SSI installiert und das dann halt
irgendwie sich anguckt, was da passiert
und dann halt zum Beispiel den Port so macht.
Oder sonst irgendwie was.
Und das hatte jetzt,
ich meine, die Auswirkungen davon sind nicht ganz so schlimm,
weil, aber was das Ding
gemacht hat, ist halt
wenn da irgendwas,
wenn da jemand
irgendwie an diesem SH-Port rumgespielt hat, hat es halt
dann irgendwann ein Whois
auf
die IP, von der
diese Login-Versuche kommen, gemacht,
sich ja die Information rausgeholt
und das dann per Mail irgendwie an
den Admin geschickt.
Klingt jetzt erstmal noch nicht so schlimm.
Das Problem ist, da war
so eine Shell-Escape-Lücke
im Mail
erzeugen. Das heißt, das hat
irgendwie den Text aus dem Whois genommen, dann irgendwie
in die Mail und das dann per Kommandozeile
übergeben.
Wenn du das
cool ist, kontrollieren konntest, konntest du da halt dann
irgendwie durch so
Backtick irgendwie, weiß der Teufel,
irgendwie Spielereien
das Ding dazu bringen, einen beliebigen Code
auszuführen und dann konntest du halt einfach
einen Rutsch halt aufmachen.
Sehr gut, danke.
Also
einige Leute, passiert sowas auch sonst was,
aber da muss ich jetzt auch noch eine kurze andere
Security-relevante Geschichte erzählen
und zwar, ihr wisst ja, manchmal mache ich auch ein bisschen Asia.
und da war was ganz Tolles dabei.
Und zwar hat das, glaube ich,
2,5 Millionen Kunden betroffen
oder so, war auch gar nicht so relevant.
Jedenfalls alle Leute, die halt Linux-VMs bei Azure hosten,
was ja man ja macht, ich habe nämlich schon ein paar Mal gewundert,
warum die irgendwie komischen Windows-Fehlermeldungen abstürzen.
Ich dachte so, hä? Das kann doch nichts.
Die laufen halt tatsächlich auf irgendeinem Windows drauf.
Und was halt da irgendwie drumrum ist, ist halt
irgendwie so ein Wrapper und Microsoft macht da
irgendwelche Service-Prozesse irgendwie auf.
Und man kann irgendwie auf einen Endpunkt
einfach diesen Microsoft-Service-Endpunkt ansprechen.
Und dann
musste man halt dann sich authentifizieren, damit man da irgendwie
Service-Prams machen darf.
Und ganz besonders cool,
2021 wird das sowas irgendwie möglich,
das weiß man nicht genau, aber wenn man jetzt die Credentials
als falsch angegeben hat, gibt es halt ein Denied.
Und was passiert, wenn man gar keine Credentials angegeben hat?
Tja, dann war alles gut.
Dann war gut.
Einfach so.
Die haben gesagt, okay, eine Credentials, okay, muss wohl gut sein, ist wohl ein Admin.
Dankeschön. Und ja, tatsächlich,
diese Lücke war tatsächlich einfach da und einfach offen.
Das heißt, wenn du diesen Endpunkt kennst von der Applikation,
konnte ich einfach ohne Quintenz anmelden.
Da hast du eine Routet auf diese ganze Applikation
bekommen und es war völlig egal, was du da gemacht hast, weil
deine ganze Anwendung in deinem Linux4M-Container
einfach dann schreibbar war.
Da war es ein bisschen mittelgut.
Was auch sehr super daran ist,
das geht nicht automatisch zu patchen.
Das heißt, du musst hier dahin gehen und
musst das manuell ausbauen, falls er das irgendwie bei sich
aktiviert hat. Tja, und die sind
irgendwie default aktiviert.
Naja.
Aber okay.
Passiert halt wohl.
Also wenn ihr irgendwelche Dinos bei Ames of Azure habt, guckt da mal vielleicht nochmal nach diesem Backnapp.
Klingt auch nur so, nicht so, klingt eher so mittel.
Das war auf jeden Fall so eine Sache, wo ich dachte, oh mein Gott.
Ja, oh, Sicherheitslücken, wo wir gerade schon bei sind.
Das war vor ein paar Tagen auf Twitch.
Oh ja, Twitch wurde das geleakt.
Irgendwie komplett wohl, einfach mal komplett geleakt.
Tja, ja, komm, komm.
Kann halt mal passieren.
Aber immerhin nur Passwort-Hashes.
Ja, aber auch die Bezahlinformationen.
Ja, wer wie viel, wie auch jemand.
Gucken, wie viel das wert ist.
Da haben wir irgendwie ganz interessante Geschichten dabei.
Ja.
Also wenn ihr jetzt mal wissen wollt, wie viel euer Twitch-Facebook-Podcast verdient,
oder wie viel Jochen mit seinen Streams verdient vom Python-Podcast.
Ja, das ist leider relativ traurig, da ist nichts.
aber ich bin auf deiner Seite
Bist du eingetragen? Kann man da auch deine Informationen abrufen?
Ich nehme mal an, dass es
an der Stelle ein bisschen sinnlos ist, weil es ist eh öffentlich
ich habe da nichts, was irgendwie nicht öffentlich ist, aber
ja
Ja
Da verraten die
Return Investment bei Twitch bei dir im Moment null
Null, ich schaffe es auch nicht
in das Affiliate-Programm reinzukommen
weil ich habe noch nicht genug
Und jetzt kommt Flower
Genau
Ja
Ja, ja
Ja, aber ansonsten
ich finde das eigentlich ganz, ich mache ja jetzt halt schon eine Zeit
lang dieses Streamen, das ist eigentlich
schon ganz witzig, also das sind teilweise
schon
also damit hätte ich nicht gerechnet,
dass da Leute live
im Stream mir sagen, dass das, was ich
da mache, ist halt falsch und wie ich es besser machen soll
und das stimmt.
Das ist wirklich beachtlich.
Das ist wirklich hilfreich.
Das hätte ich ehrlich gesagt
nicht mit gerechnet. Also einmal hätte ich nicht
damit gerechnet, dass sich irgendjemand dafür interessiert, was ich da tue.
Wobei ich auch nicht gerechnet hätte, dass
wenn sich jemand dafür interessiert, dass er dann auch besser weiß als ich.
Aber, ja, gut.
Wahrscheinlich, wenn sich jemand darauf interessiert, dann weiß er
tatsächlich wahrscheinlich sogar besser.
Ja, offenbar. Und das finde ich faszinierend.
Was ist dir denn da aufgefallen?
Also bei PyTest
waren so ein paar Sachen dabei, wie man das richtig macht.
Und das wusste ich halt nicht.
Oder PyCharm, auch einige Sachen,
wie man da Dinge einstellt und so.
Gut, da kenne ich mich jetzt auch nicht so aus, das stimmt schon.
Aber da habe ich gerade Bär gesagt, Entschuldigung
Ich finde Python gar nicht so schlecht
Also inzwischen bin ich sogar ein bisschen
Also man, ja
Bist du ein Fan geworden?
Nee, das kann man nicht
Aber, also ich würde sagen, doch, die kann
Wahrscheinlich kann die tatsächlich alles, was man so haben will
Ja, also ich
Also VS Code kann ja noch nicht alles, was man so haben will
Aber ich schreibe fleißig Tickets herum und gucken
Vielleicht kann das ja in einem Jahr das alles, was ich haben will
Also das Einzige, was mir bei VS Code tatsächlich noch nicht gefällt
Ist tatsächlich Datenmantel
und Python-Programmierung.
ganz, habe ich es auch noch nicht hingekriegt, aber
dann ist zum Beispiel das
Working Directory ist halt dann einfach falsch oder so
und das funktioniert ja nicht mehr und dann
findet er die Datenbank nicht mehr und ich
erinnere mich daran, dass ich diese Geschichten bei PyCharm schon häufiger hatte
und dann war zum Beispiel
die Lösung für einen Großteil dieser Probleme irgendwie dann
auf das Root-Verzeichnis irgendwie
in der Projektübersicht rechtsklick drauf machen und dann
sagen Set as Test Root und dann hat es funktioniert.
So, okay.
Naja, also
solche Sachen halt. Aber das muss man halt, also
und vorher dachte ich so, naja, das mit den Tests funktioniert halt einfach nicht richtig.
Aber gut, das funktioniert schon, wenn man weiß, wie man es konfigurieren muss,
aber das ist halt manchmal schon ein bisschen...
Ja, so was ist eigentlich die IDE von selber wissen,
dass sie erstmal einen Root ausprobiert oder sowas, wenn es gerade nicht geht.
Ja, keine Ahnung.
Aber ansonsten,
eine Sache auch im Stream,
da habe ich dann geflucht darüber,
dass, oder nicht geflucht,
ich habe gerade gesagt, hier verwende ich ja PyCharm
auf Intel, aber wenn ich jetzt irgendwie
auf meinem M1 Mac unterwegs bin,
dann nehme ich immer VS Code, weil Pileschramm kann ich da gar nicht
verwenden, das ist einfach zu langsam, ich finde es ja auch schon
auf Intel langsam, aber auf
ARM geht es
gar nicht und
es fehlt die ganze Zeit Strom wie Hölle, ja, das heißt
eigentlich hat ja so ein M1
Mac super Akkulaufzeit, aber
wenn man Pileschramm benutzt, so wie ich das
getan habe, dann halt nicht, dann sagt das den Akku
sofort leer, also
und deswegen nehme ich immer
VS Code, dann kam
auch so ein Chat und so, ah ja
Bist du dir eigentlich sicher, dass du das
native, dass du
die für ARM
kompilierte Version da nimmst
und nicht die alte Intel-basierte,
die dann emuliert wird, weil die
oh Mist, ist tatsächlich so,
ein neues PyCharm genommen und
das ist deutlich besser.
Also offenbar
brauchte man da eine
JVM, die halt für ARM
kompiliert ist und nicht die für Intel,
weil wenn man die nimmt und die
auf dem M1 emuliert wird, dann
Also die Emulation funktioniert wohl ganz gut, aber wenn man sowas
emuliert, dann ist halt wohl scheiße.
Und das war auch eine Geschichte,
die mir jemand im Chat einfach so gesagt hat.
Voll gut.
Ja.
Tja.
Genau.
Security, genau. Twitch hatten wir.
War sonst noch irgendwas mit News?
Nee, mir fällt eigentlich, wie gesagt, nichts ein.
Meine Güte. Vielleicht liegt es auch einfach daran, dass wir so lange nichts mehr
gemacht haben.
Aber News und wir sind bei einer Stunde. Was ist denn da los?
Ja, vielleicht.
ein bisschen gequatscht.
Ja, okay.
Dann stelle ich jetzt einfach nochmal meine paar doofen Fragen
und vielleicht fällt dir jetzt sowas ein zu diesem Thema.
Und zwar ging es
tatsächlich darum, wenn ich jetzt in Python
irgendwie
mehrere
Prozesse habe oder sowas, oder
ich weiß nicht, ob das einen Unterschied macht,
und zwar
die ich nicht herausstarte aus einem
Manshade oder sowas, sondern die beispielsweise
wie beim Gunicorn einfach
weggeforkt werden, während er es aufmacht.
und macht dann verschiedene Prozesse auf und macht die gleichzeitig auf und so.
Ich möchte aber über all diese Prozesse hinweg
einen geteilten Speicherbereich haben
und da irgendwas am liebsten
Python-Objekte reinschreiben können
mit, weiß nicht, Funktionen drin
oder irgendwas, dass da halt einfach genau gecallt werden kann.
Wie mache ich das am besten?
Geht nicht.
Das würde ich sagen,
geht tatsächlich nicht. Also mit
ThreadSkills, da ist es halt so, die teilen
sich halt einen
Adressraum und
einen Speicher.
Aber das ist eigentlich der Hauptunterschied zwischen
Threads und Prozessen.
Auf der Betriebssystem-Ebene.
Also Threads
laufen halt im gleichen Prozess
und haben den gleichen Hauptspeicher.
Und Prozesse sind halt komplett voneinander getrennt.
Können gegenseitig
nicht auf Sachen zugreifen.
Da braucht man dann halt so Interprozess-
Kommunikationsgeschichten, um halt zwischen
den Prozessen zu kommunizieren.
Also das heißt, das geht tatsächlich gar nicht
aus Python heraus. Das heißt, ich muss irgendwie was Externes
nehmen, wie ein Memcached-D-Redis oder sonst
irgendwas, also eine quasi Art von Datenbank
im Speicher, die dann extra läuft und
auf dich dann von allen diesen Prozessen
irgendwie einen Zuruf bekomme über
URL oder irgendwas.
Ja, also, oder was auch immer, es muss ja
nicht irgendwie jetzt ein Redis oder
Memcached-D-Redis sein, oder es kann auch eine Datenbank sein
oder es kann halt ein File sein
oder es kann halt eine Pipe sein oder
Ja, das habe ich auch überlegt, also kann man
aus Preisnachweis einfach eine File in Memory aufmachen, auf die dann
alle Prozesse durchgeführt haben? Nein, auch nicht wahrscheinlich.
Doch, klar, das kann man schon machen.
in Memory?
In Memory, warum in Memory?
Ja, weil ich will ja nicht I.O. machen auf der Platte,
weil ich will ja genau diesen Speed halt nicht verlieren.
Naja, du kannst auch
Chat Memory, das geht auch, aber die Frage wäre halt,
du musst ja sowieso,
also dein Bottleneck wird dann ja eh
die Serialisierung und Deserialisierung sein.
Aber das heißt, also okay, das war nämlich genau,
nochmal die nächste Frage, ich muss quasi
meine Objekte immer serialisieren,
weil ich nicht darum rumkomme,
weil ich nur als irgendwie in Bytes oder so
im Speicher schreiben kann.
Genau, du musst halt das irgendwie in eine Form bringen, die man halt
irgendwo hinschreiben kann, genau.
Ja, und dann hatte ich die tolle Idee,
das dann zu picken, dann sagte Jochen, oh, oh, oh.
Kann man machen, ist aber,
ja.
Ja.
Ja, also Jochen hat gesagt, das wäre
keine gute Idee, weil man könnte ja dann da,
wenn man diesen Speicherbereich kontrolliert,
da was reinschreiben, dann wird es einfach sehr realisiert und dann macht es
bumm. Ja, genau, also Sachen
ausentpickeln ist halt quasi
das gleiche wie Code ausführen. Also daher muss man
ein bisschen. Da gibt es auch tatsächlich
Sicherheitslücken, die große Seiten,
ich weiß nicht, welche das war,
das war auch irgendein Contest,
ich habe es wieder vergessen, welche Seite das war,
war eine von den ganz großen,
die, wo jemand so reingekommen ist,
war Django, auch Django, und
da, die hatten irgendwie auch,
ich weiß nicht, Memcached oder Redis benutzt,
und da auch, die hatten
gepickelte Sachen in User Cookies abgelegt.
Und
das war noch nicht das Problem,
man konnte durch irgendeinen Trick, konnte man halt
den Kram irgendwie in den Memcached-Di bringen
und dann da
den Applikations-Server dazu bringen, das dann halt
zu entpickeln. Und dann
sind da
Leute so da reingekommen.
Also ja, das ist
problematisch. Also wenn
die Users schaffen, irgendwie
da in der Applikation was Gepickeltes zu geben,
wo sie Kontrolle drüber hatten, dann
ja. Oder es war auch irgendwie
signiert oder so und an der Signatur war
irgendwas kaputt, ich weiß es nicht genau.
Aber ja.
Das ist ja zirrelisch, wenn ich auf meinem eigenen Server
laufe, wenn einer dann da schon drin ist,
dann hat der eh schon Routen.
Ja, aber das ist ja
vielleicht, gibt es ja irgendwie, ich meine, wie kommen
die Daten da rein?
Wenn jemand
quasi, vielleicht hat ja jemand dann nur
Zugriff auf irgendein, ist irgendwo reingekommen
über, weiß nicht, der läuft vielleicht auch noch
irgendwelche anderen Services und kann halt nur eine Netzverbindung
aufmachen.
Dann lauscht er aber dann in Memcached
und dann kann er da was reinlegen und dann
wird das ausgeführt.
Also es ist halt, ja, die Frage ist, will man Leuten dadurch, also ich meine, sowas wird wahrscheinlich nicht ausgenutzt, wenn man da irgendwie eine kleine Geschichte selber hat, aber überhaupt, dass es die Möglichkeit gibt, dass man dadurch, dass man an irgendeinem Port irgendwas hinschreibt, dadurch sein Code in deiner Applikation ausführt, ist halt schon so, will man wahrscheinlich nicht.
Ja, also die Frage ist halt, wie es sonst gehen könnte, da muss man sich halt eine andere Lösung für überlegen.
Ja, also mein Anwendungszweck ist eigentlich nur, dass ich tatsächlich über verschiedene
Gannikon-Worker-Prozesse Zugriff auf ein gemeinsames Dict haben wollen würde,
dass ich halt so Dinge abblicken kann.
Ja, aber warum nicht einfach eine Datenbank nehmen?
Ich meine, dafür ist die Datenbank eigentlich da.
Ja, weil es da zum Beispiel keine gibt oder halt, dass du eine SQLite hast,
die halt dann schon gelegt ist und so.
Ach so, wenn du keine Datenbank hast, ja.
Warum nicht einen Pfeil nehmen?
Zu langsam?
Wieso ist das langsam? Muss ja nicht langsam sein.
Also ja, natürlich ist das eventuell langsam.
oder kommt auf deine Daten an.
Gut, aber theoretisch könnte, wenn dann jemand
durch das Pfeil hat, kann er auch alles Mögliche reinschreiben.
Ja, gepickelte Sachen darf man da nicht reinschreiben.
Ja, aber das ist ja genau dasselbe Problem dann.
Also mein Problem, ja.
Warum möchtest du gepickelte Sachen
abspeichern?
Um sie später zu verwenden.
Also weil ich zum Beispiel, ich habe bestimmte Routinen,
die ich ausfüllen möchte mit Argumenten und so weiter,
die quasi schon feststehen, aber
die zu einem späteren Zeitpunkt
gelaufen. Ja, aber du kannst ja
sozusagen durchaus sagen, ruf die
Funktion mit den Parametern auf. Die Parameter
kannst du ja schon vielleicht irgendwie, je nachdem
was das ist, also natürlich.
Ja, aber du kannst aber auch den Namen von der
Funktion einfach speichern. Ja, kann ich das?
Das kannst du machen. Ja, okay. Und wie kriege
ich die dann rausgepult? Muss ich nochmal kurz überlegen.
Jaja, das ist dann halt nicht mehr so einfach,
dass man einfach sagt, JSON
dumps und loads. Sondern da muss
man das halt selber wieder, sich daraus ein Objekt
zusammenbauen, aber das kann man ja auch machen.
Aber wie baue ich dann den Pfad zu dieser Funktion
zusammen?
Die muss ich dann irgendwie
später spontan ein, wie das geht.
Keine Ahnung, ich habe jetzt Pfad zu meiner
Applikation dot functions
dot fuba.
Kannst du einfach den Pfad reinschreiben.
Den Pfad zu der Funktion tatsächlich.
Dann machst du mit
Importlib, importierst du das Ding dann.
Mit Importlib.
Relativ oder absolut?
Ist das egal?
Ja, weiß ich nicht. Wahrscheinlich
ist absolut so ein bisschen,
also ja, kommt drauf an, wo das
wahrscheinlich wird man es
absolut zum Paket halt
Okay, ja, das muss ich mal probieren.
Weil vielleicht wäre das tatsächlich, also da den Namen,
anstatt der Callable zu nehmen, eine Rettung.
Dann hätte ich halt nur noch Argumente, aber
gut, die dürfen dann halt...
Die Frage ist, wie viele unterschiedliche Sachen können das denn sein?
Kann man da nicht, das ist sowieso
irgendwie eher in so einem Lookup, dann nimmst du halt
irgendeinen Namen, völlig egal, musst du nicht über Import
machen, das will ich gerade auch, das ist vielleicht
nicht so eine schlaue Idee, sondern
du hast halt irgendwo ein Dikt, wo die ganzen
Funktionen drin liegen, das halt irgendwie mal
installisierst und dann musst du nur noch deine Funktionen halt
du hast sozusagen
ein Registry für diese Funktionen.
Okay, ja, das Problem ist halt, dass wenn jemand
halt jetzt, also es geht halt um so
eine Event-Queue, ja, wenn jemand halt jetzt
neue Events anlegen möchte, die er halt quasi
dann einfach über so einen Dekorator subscriben
kann auf irgendeinen
Typ, den er sich da selber quasi aussuchen kann,
indem er das da subscribt, weil halt
Typen, die es noch nicht gibt, werden einfach erstellt.
dann müsste man ja quasi diese Funktion,
die ja dann, also ein Event
ist, dann auch registrieren.
Und wenn derjenige das dann vergisst, dann
funktioniert es halt nicht. Und das ist halt so ein bisschen nervig, weil
es halt an zwei Stellen, das dann halt
überprüft werden muss, der kann halt nicht irgendein
Event erstellen und das dann einfach registrieren und
dann einen Händler für nehmen, sondern der muss sich halt an eine
Stelle an die Registrierung wenden und das muss er halt
händisch machen. Das hätte ich mir halt gerne
gespart, weil es halt bestimmte Entwickler gibt, die das
verstehen oder nicht verstehen,
aber denen vielleicht einfach eine Methode schreiben können,
die dann irgendwas macht.
hat. Naja gut,
du kannst ja auch
irgendwie überlegen, wie man
die Funktion adressiert sozusagen
und das kannst
du ja dann selber machen.
Naja gut, ich weiß...
Ich glaube, dieses Pickeln ist halt
die einfachere Lösung.
Ja, aber das weiß ich nicht.
Also Pickel...
Die Frage ist halt, wo es geht. Ob es nur über so ein
Maincash-Di geht oder so ein Redis geht oder
halt noch eine andere Variante gibt, die
irgendwie einfacher ist.
irgendwie. Kann man aus Python raus
einfach so ein Chat-Memory außerhalb dann auch machen
oder geht das nur mit sowas wie Memcached-Dien-Redis?
Gibt es im Python-Modus das?
Man kann das schon machen, aber
ich weiß nicht, ob das empfehlenswert wäre, weil
du musst ja irgendwie auch darauf
zugreifen und
das dafür
bietet ja sowohl Memcached-Dien-Redis
Dinge an und wenn du das selber machst,
schwierig, weil was ist, wenn
dann der Applikations-Server
jetzt einen Prozess läuft auf einem anderen Rechner, dann ist das
auch wieder ein Problem.
Also gut, ich meine, klar, natürlich die Abhängigkeiten sind halt blöd, jetzt dann deswegen noch ein zusätzliches Redis braucht oder so. Das ist halt die Frage, ob es nicht schon irgendwas gibt, was man schon hat, eine Datenbank oder ein Redis oder ein Bank-Hashtag.
Ja, also auch die Frage, ob man halt, wenn man Projekte voneinander isoliert aufbaut, ob man dann, ja, eigentlich müsste man die Sachen dezentral voneinander betreiben, aber das ist halt dann wieder so ein Problem, dann ganze, mit Deployment, ganze Deployments zu machen, die vollständig sind und so.
und die dann jeweils unabhängig voneinander sind
und dann nicht erwarten, dass schon irgendwo anders so ein Redis rumliegt
und dann neue Verbindungen aufmachen,
neuen Redis-Nutzer mit neuem Authentic-Bit,
bla bla bla. Das ist ja relativ
aufwendig für so kleine Sachen, dass man irgendwo mal kurz
so zwei Kies im Dick ablegen will
und dafür halt so ein Rattenschwanz...
Dann wäre halt die Frage, wozu brauchst du denn dann mehrere Prozesse?
Ja gut, aber das liegt halt nur daran, dass
der Ganykorn da so ein bisschen mehr Power kriegen soll.
Wenn man jetzt dem Ganykorn sagt, du brauchst noch
einen Worker, dann reicht es ja halt.
Ich hatte irgendwo
bei Stack Overflow mal so eine Antwort gesehen,
hat er Preload gemacht, dann hat er erst die Applikation geladen
und dann die Worker. Ja, aber wozu brauchst du denn da mehrere
Prozesse? Das ist nochmal die Frage.
Warum mehrere Prozesse an der Stelle?
Panic On Work macht Worker-Prozesse auf.
Ja, aber musst du ja nicht. Du kannst ja einen aufmachen.
Genau, aber das heißt, das müsste man halt dann als harte Restriktion haben.
Das geht halt nur mit einem Worker-Prozess.
Und man hat dann unerwartete Seiten. Oh, du meinst, wenn da jemand
mehr startet. Ja, genau.
Dann schießt es halt danach und dann funktioniert das halt
nicht mehr so richtig.
Ja.
Ja, stimmt. Nun, die Frage ist auch, ob man halt so ein Workaround
hat für solche Fälle. Aber was geht da eigentlich
für alle Dinge, die halt irgendwie einzelne Instanzen haben.
Also du hast irgendwie von irgendwas einen Singleton-Pattern
oder sowas auf irgendeiner Klasse oder so
und das ist ja immer das Problem, dass das halt bei so einem
Forken in so einem Web-Applikations-
Server-Prozess
nicht mehr so wirklich identitär ist.
Okay, aber ich würde
sagen, das braucht man ja ganz selten oder sowas.
Na?
Ich bin ja in der letzten Halbzeit schon zweimal drüber gestolpert.
Oder
meine Vermutung wäre oft, dann ist
irgendwas an dem Problem nicht richtig oder
an der Lösung oder
weil wenn das die Lösung
für das Problem ist, dann ist wahrscheinlich
hat man das Problem nicht richtig verstanden
oder vielleicht ist, ich weiß es nicht genau
aber das gibt es echt fast nie
Ja, also als Beispiel
es darf ja nur eine offene
Verbindung zu irgendeinem anderen
Rechner geben, weil er nicht mehr als eine gleichzeitig
offene Verbindung akzeptiert
So, und dann könnte man jetzt irgendwie Verbindungen
durchreichen
und die halt von mehreren Prozessen
trotzdem nutzen
wenn man die nicht gleichzeitig nutzt, zum Beispiel
und Jochen unterhalten sich über die Programmiersprache Python
durchreichen.
Ich habe das Problem, glaube ich, noch nicht so wirklich verstanden.
Wie willst du das denn lösen? Das kannst du ja gar nicht lösen.
Ja, warum? Also so ein Zugangstoken
zum Beispiel, den ich dafür brauche, den will ich
ja nicht unbedingt jedes Mal irgendwo reinschreiben.
Außer vielleicht
in so eine Platte. Und dann die Frage ist, schreibe ich die halt in Redis rein,
hole mir den immer wieder ab, gucke halt, ob der da ist.
Wenn es nicht da ist, dann hole ich mir einen neuen oder so.
Benutze ich den halt immer wieder.
Weiß nicht.
Das ist halt so ein Prozessding.
Wie komme ich denn da sonst ran?
Ohne, dass ich dann jedes Mal wieder neu nachfrage.
Wieso muss das denn geteilt werden?
Also ich würde sagen, wenn du keins hast, dann holst du es erst halt.
Genau, aber das wurde jetzt, ich habe jetzt mehrere Prozesse.
Und ich habe halt den Zugangstoken.
Und beispielsweise darf man Zugangstoken nur alle so und so viele Sekunden holen.
Oder so.
Sonst kriegt man keinen mehr oder wird geblockt.
Da gibt es halt so komische Antworten, die sowas machen.
Das ist halt irgendwo zentralhandig.
Genau, ja.
Das Problem, daran stehen wir jetzt.
Was aber auch blöd ist.
Das willst du ja auch nicht.
Ist das nicht eher ein Deployment-Problem?
Nee.
Wo gehören solche Sachen eigentlich hin?
Solche Sachen gehören eigentlich in die Umgebungsvariablen
von dem Prozess. Ja, aber die kenne ich ja noch nicht.
Und ich kann ja nicht das im Deployment dann ablegen,
wenn der halt nach 10 Minuten wieder ausläuft.
Ich darf halt nur alle
5 Minuten fragen, aber nach einer Stunde ist es halt wieder weg.
Oder so. Und das ist halt blöd,
weil ich brauche halt alle 2 Sekunden.
Und das ist ja okay, wenn ich mir einmal eine Stunde
nur eine holen kann und den kann ich halt für eine Stunde benutzen,
dann ist der okay, aber ich muss halt von den verschiedenen Prozessen
der Anwendung, die parallel laufen, gleichzeitig
diesen Key halt haben
und den muss ich auch irgendwie teilen.
Klar, ich könnte lokal irgendeine File schreiben, was auch nicht so eine gute Idee ist,
wenn irgendjemand da auch die Filesysteme zugreifen kann.
Das heißt, ich muss den eigentlich irgendwo in den Speicher legen,
der geteilt ist über alle Prozesse hinweg.
Also eigentlich ist das ja nichts, was du
irgendwo hinspeichern willst Ja also eigentlich dann doch nur in die Datenbank oder so Auch nicht aber Aber die ist halt wenigstens ein bisschen verschl wenigstens so ein bisschen noch so ein Layer drumherum Ja oder halt dann in so einen geteilten Memory
Und da ist halt die Frage, wie das dann aussieht,
wenn du sagst, okay, ich finde die Idee gar nicht so falsch,
dass es von verschiedenen Prozessen auf verschiedenen Rechnern liegen können,
dann müsste das ja von sowas wie einem Redis oder einem Cache oder so
rausgegeben werden, weil das ja quasi auch nur die geteilte Key-Value-Store ist,
die dann das irgendwie...
Tja.
Aber in Python gibt es halt so eine Möglichkeit nicht.
Ja, aber ich
glaube nicht, dass das etwas ist,
was man, also ja, ich meine, das klingt
jetzt blöd, weil das natürlich dann ein Problem nicht löst,
aber ich glaube nicht, dass das etwas ist,
was man lösen will.
Ja, also ich glaube
tatsächlich, so eine Antwort wäre mit
CacheData, Redis und da muss man halt dann gucken, braucht man das
jetzt oder will man das jetzt oder nicht.
Also ich würde sagen, wenn du versuchst,
dieses Problem zu lösen, ist die Lösung
macht halt einen Haufen zusätzliche
Probleme.
Ja gut, aber manchmal kann man halt nicht anders, weil
Manchmal kann man nicht anders, ja, dann ist halt schlecht
Also wenn ich halt auf der anderen Seite zum Beispiel keine
Einflussmöglichkeiten habe, dann kann ich nicht sagen, dass
ich da irgendjemanden da anpasse, aber
Ja, ja, klar, klar, ja
Tja, ja
Ja, also okay, mit dem Serialisieren, das muss man wahrscheinlich im Kopf haben, dass das
auch ein sicherheitsrelevantes Problem sein kann
Aber dann, ja, also als Jason wäre
er wahrscheinlich sicher, weil das ja nur irgendwie Zeichenketten sind
das nicht ausgeführt ist, das heißt, ich muss irgendwie gucken
dass ich alles irgendwie JSON-serializable
mache. Genau. Und das
heißt tatsächlich, dass ich keine
Funktionen
angeben kann, sondern ich muss
eine Funktion
Pfad oder Import-Pfad angeben. Ja, aber ich meine, ich habe zum Beispiel
so einen Fall tatsächlich
von, gerade mit
Chars.api, ich fände mir das gerade so ein,
da habe ich das so
gemacht, tatsächlich auch,
deine Pidentic-Objekte,
die kannst du ja serialisieren. Zu JSON, ja.
Ja, genau. Aber wenn ich da eine Call-Label reinstecke,
und Jochen unterhalten sich über die Programmiersprache Python
auch. Also ich hatte das in diesem
Matchmark-Umfeld,
dass man sagt, okay,
ich baue mir zuerst meinen Server zusammen
auf einer kleinen Seite, dann schicke ich das Objekt an den Server
und der Server startet dann halt irgendwas damit.
Und meine Lösung war,
du hast halt in den
Pydentic-Modellen, da sind halt die Daten
für das Ding drin, aber
ausgeführt wird es dann woanders. Dann rufst du halt
das Ding mit den Daten, die
du serialisiert hast, auf und sagst halt
so, und jetzt starte mal oder so.
Ja, das geht schon. Also wenn das
Pydentic-Modell das hinbekommt, das zu
serialisieren, dann geht das auch so.
Aber das Problem ist halt die Serialisierung von Callables
in JSON-komplettives Format.
Das halt hinzubekommen, da muss man halt
dann Simulizer und Deserializer für
extra verschreiben für diese einzelnen Felder und
ist dann die Frage, wie man so ein Objekt serialisiert und da
verstehe ich halt wahrscheinlich gerade, vielleicht habe ich das schon nicht gemacht,
weil ich nicht weiß, wie ich so ein Pfad zu einer Funktion
dann realisieren kann.
Also ich habe da
auch tatsächlich so eine Art
Registry verwendet, wo man dann halt einfach sagen,
ich habe das dann so gemacht, dass man einen Dekorator
in die Klasse rechnen konnte und dann konnte man sagen, okay,
registriere das Ding mal und dann
konnte ich quasi
das halt
wieder komplett so aus dem
raus hauen.
Ja, aber genau,
das kann man mal drauf gucken.
Tatsächlich, man müsste dann quasi diese
einzelne Funktion dann quasi
selber registrieren. Das könnte man ja mit dem Dekorator machen,
der eh schon da benutzt wird für das Subscribe und dann könnte man
die quasi gleichzeitig durch das Subscribe
mit in diese Event-Registry registrieren unter
irgendwas.
und das, was dann dabei rauskommt, das könnte man
in das Pythonic Model mit reinschreiben, rauspolen und dann auch quasi
eine Methode dran schreiben, die dann diese Funktion ausführen kann.
Ja, das ist ein bisschen gepopelt, aber ja,
das ist das Schöne.
Genau, ich habe letztens
so ein, also was ich gerade im Stream baue,
ist halt irgendwie das Hosting-Ding für
für eben den Podcast hier auch.
Ich würde da gerne so eine
Software-as-a-Service-Lösung draus bauen
und da habe ich so ein
Spam-Filter-Dings für gebaut. Spam-Filter-Feature
habe ich vorletzte Woche, letzte Woche,
diese Woche, ein bisschen
daran gearbeitet und
da ist auch so ein
Ding, das fand ich ganz ähnlich,
auch ganz interessant.
Also ich möchte natürlich meine
Spam-Filter-Modelle auch irgendwie in der Datenbank
serialisieren und Postgres hat mal
ein JSON-Field, das ist ja voll gut.
Aber da habe ich
jetzt das Problem, okay, ich möchte jetzt
ja nicht irgendwie JSON
daraus haben, sondern ich möchte hinterher das fertige Modell,
auf dem ich dann Predict aufrufen kann,
aus der Datenbank bekommen.
Und da habe ich das auch mit Custom
Serializer, Deserializer gebaut,
den man dann beim
JSON-Field angeben kann. Da kann man sagen, das ist der
Decoder, das ist der Encoder.
Und der
Decoder, also der
Encoder guckt halt,
ja,
wie war das?
Der guckt halt, was ist das?
Und dann ruft er halt irgendwie,
gib mir mal ein Dict zurück.
Methode von so ähnlich wie bei Pandentic ist es.
Bei Pandentic ist es glaube ich auch .dict.
Das habe ich dann halt quasi genauso gemacht.
Dann .dict und dann kommen halt irgendwie Daten
aus diesem Modell zurück.
Habe ich dann ins JSON reingeschrieben und beim
dekodieren guckt er halt, okay,
gibt es da ein Attribut Klasse drin?
Class. Und wenn das NaiveBase ist,
dann genau,
und mache halt Spezialbehandlungen und
sage nochmal irgendwie
ja, übergebe
dieses Dict, was
in JSON war, halt als Dict
für diese Klasse und mache dann halt ein echtes
Modell draus, wo ich dann hinterher
Predict drauf aufrufen kann.
Und dann fällt das gar nicht auf. Dann sagt man halt
im Code
einfach nur Spamfilter.predict
irgendwas.
Spamfilter ist halt die Tabelle
in der Datenbank. Model ist
halt sozusagen dieses JSON-Field.
und dadurch, dass das
ein Custom
Deserializer hat, wenn man
darauf zugreift auf dieses Attribut, wird es ja deserialisiert
und ist dann halt das richtige Modell wieder.
Das heißt, man kann sagen,
Spamfilter.objects,
jetzt Django-Semantik,
Spamfilter.objects.first.model.predict
und dann übergibt man
irgendwas, einen Kommentar oder so und dann sagt einem das Spam oder nicht Spam.
Ohne, dass man da irgendwas machen muss.
Das funktioniert einfach so.
Und du hast da quasi ein fertig trainiertes Modell,
hängst du dann quasi per JSON
in das JSON-Feed rein?
Genau, also ich würde es zuerst trainieren und dann sagen,
ja, speichere das auch mal.
Also Model ist gleich,
ist halt das fertig trainierte Model und dann sage ich
halt, ist beim Filter, also ist beim Filter.model
gleich NaiveBase, also das
zuerst würde ich sagen, Model gleich NaiveBase
irgendwas, Punkt Fit,
irgendwann Trainingsdaten
und dann sage ich halt, ist beim Filter.model
gleich Model und dann sage ich, ist beim Filter.save
und dann ist es halt der Abmunk.
Nett, nett.
und genau, da ist
auch so ein ähnliches Problem.
Ja, das ging eigentlich
relativ problemlos.
Und überhaupt,
Nightbase, voll gut.
Ich habe das
im April, glaube ich, irgendwann mal auch
in die, weil die kommen fast bei mal
eine ganze Zeit lang, also bis
Anfang letzten Jahres oder so
haben sie es nie irgendwie,
war das nie ein Problem,
weil irgendwie
ja, wahrscheinlich diese CSRF-Protection
oder keine Ahnung was auch immer in Django da halt
an Dingen macht, die verhindern sollen,
dass man da beliebig
Dinge reinpostet, schon
dafür gesorgt haben, dass die Kommentarsperma draußen
geblieben sind. Irgendwann
sind deren Skripte halt
besser geworden.
Kommen halt mit diesem Kram klar und nehmen halt
das Token dann aus dem Get und
packen es in den Post rein und dann kommen sie halt
durch, weil wir haben da ja auch keine Authentifizierung
oder sowas. Jeder kann da Kommentare
reinschreiben, aber wenn man
das halt über ein Skript macht und nicht über einen Browser, dann
fehlen halt vielleicht Daten, die man mit angeben muss.
Und dann sagt Django direkt, nee, so nicht.
Aber sozusagen, wenn man es halt
mit dem Headless-Browser macht,
mit dem Script, das ein bisschen besser ist und das halt weiß,
wie diese Formfelder heißen und so,
dann geht es halt doch.
Also was man auch, glaube ich, ganz gut machen kann, ist,
so ein Feld auf jeden einfach reinmachen, das halt dann mit
im Formular drin steht, was halt automatisch
über das Script ausgeführt wird und wenn
was drinsteht, dann sagt halt der App Spam.
Ja, das kann auch sein.
Das habe ich mir auch zuerst überlegt, weil das wäre dann
die super simple Methode gewesen, dass erstmal alle
dann hätte sich jemand das Skript ändern müssen
für diese Seite und das macht dann natürlich keiner
aber ich bin mir gar nicht so sicher
ehrlich gesagt, also auch wenn ich mir
angucke, wie das Muster von den
also das hatte ich mir auch zuerst überlegt, dass das
vielleicht die einfachste Lösung für das Problem ist
und dann habe ich mir aber das ein bisschen angeguckt und dann
ich habe so den Verdacht
dass das gar keine Skripte sind
ich glaube, das sind
da gehen Leute tatsächlich
mit Browsern drauf, die halt
irgendwie dafür bezahlt werden, dass sie das machen
und machen das von Hand. Und da hilft das natürlich alles
nicht mehr, weil sobald da jemand mit dem Browser
drauf geht, dann ja.
Und ja,
also, und dann dachte ich mir so, okay,
das sieht schon verdächtig danach aus, dass das irgendwelche Leute
sind, die da tatsächlich für bezahlt werden und das
von Hand machen, dann kann ich mir das
auch, dann hilft das nichts.
Dann mache ich es auch gleich richtig
und nehme dann im Bauler halt so einen richtigen
Content-basierten Spam-Filter ein.
Und genau,
Django,
weiß ich nicht, Fluent Commands oder so,
hat halt auch so ein
Schnellschalter drin für Archismit oder so,
weiß nicht, dieses Spamfilter-Dings, aber das ist alles
ganz furchtbar, das darf man auch, glaube ich,
gar nicht so richtig verwenden,
weil man damit ja dann
Daten weiterreißt.
Das ist alles sehr unschön und
man kann das
aber relativ leicht selber bauen und dann
eben, und Nightbraces bietet sich da halt an,
weil das hat keine Abhängigkeiten zu irgendwas anderem,
sondern das kann man halt
rein in Python
mit Standard-Bibliotheksmittel irgendwie alles machen
und ich habe da auch eine
Stream-Episode nur
darüber gemacht, weil das kann man in anderen
Programmiersprachen genauso machen, das kann man in PHP ganz genauso machen,
das kann man halt irgendwie, egal was man
verwendet, kann man das relativ einfach
implementieren, es kommt mit wenig Trainingsdaten
aus, es ist schnell,
ja, es ist
wahrscheinlich für diesen Fall,
weil die Klassen gut getrennt sind,
ist es gut genug, also es ist
natürlich, wenn man das vergleicht mit anderen Sachen, nicht so gut
wie andere Dinge, aber in dem
Fall ist es vielleicht egal, dass es nicht so gut ist,
jedenfalls bei, das hat jetzt halt auf den Dingen hat es jetzt praktisch perfekt funktioniert mehr oder weniger, also es kommt kein Spam mehr durch
und die ganzen regulären Sachen kommen halt doch durch, also es funktioniert tatsächlich ziemlich super
ja, genau
ja
ja, da müsst ihr euch unbedingt Jochen's Stream-Channel anschauen
ja, genau, also die entsprechende Folge auf jeden Fall wäre super, ich will sie nämlich auch nochmal sehen
Ich bin glaube ich einmal ausgestiegen, als du einen Update gemacht hast von Jupiter oder so.
Ja, ich weiß ja auch oft nicht, was ich da vorher mache.
Jochen macht halt seine Arbeit.
Manchmal hat er langweiligen Kram halt da.
Ja, wie es halt so ist, wenn man täglich seine Arbeit filmt.
Irgendwas passiert nicht immer so, die ganzen megaspannenden Sachen.
Ja.
Ja, aber doch.
Ja, ja.
Ja, also das mit dem Naiv-Weiß, das finde ich sehr spannend.
Vielleicht ist das eigentlich fast schon eine eigene Folge wert, wie man...
Hatten wir schon, tatsächlich.
Für den Spam-Filter?
Ja, wir hatten schon eine Naive-Base-Volke, glaube ich, mal irgendwann.
Das ist ja jetzt schon ein bisschen was her, aber...
Ja, stimmt. Ja, ich glaube,
Maschinen-Unternehmen-Volke hattet ihr aber eh noch ein paar mehr
nachgefragt. Vielleicht müssen wir da nochmal...
Ja, da müssen wir sowieso...
Ja, also was
auch auf jeden Fall auf dem Plan
ist, ist
HTMLX. Das wird jetzt auch nochmal...
Also einmal
fand ich interessant zu sehen, dass das
halt, wenn man sich anguckt,
welche Talks sind eigentlich so
populär quasi. Kann man ja auf YouTube so ein bisschen sehen zum Beispiel
auf Konferenzen.
Ja, HTMX macht da Spaß.
Ich habe es, glaube ich, auch schon mal einmal so
spaßeshalber gebaut. Ich glaube, da ist noch ein kleiner Bug drin
beim Posten von dem Formular.
Die Validierung geht noch nicht richtig durch, aber sonst
müsste man eigentlich mal veröffentlichen.
Ich habe so ein Minimumbeispiel auf Django gebaut auch.
Ja, ja, ja. Es gibt ja auch Django, HTMX,
Adam Johnson hat das, glaube ich, gemacht.
Super. Ja, also da muss ich
auch mehr mitmachen.
Vor allem ist es halt wirklich so,
Das, was einen bei Dango Templates
insbesondere nervt, ist die Reaktivität
der Templates, die eigentlich nicht da ist,
sondern du hast jedes Mal einen neuen Request und musst dann hingehen
und musst immer komplett die ganze Seite abholen,
was natürlich beim Nutzer einmal Sack hat.
Musst du halt nicht unbedingt.
Mit HTMLX ist es relativ einfach
implementierbar, dass du das nicht musst,
sondern dass du Teile einfach validierst
und dann tatsächlich gleich Feedback anzeigst
für Formular, Validierung oder was auch immer
man da haben möchte.
Der Weg, wie man das früher gemacht hat,
üblicherweise ist halt jQuery oder sowas
oder halt irgendwie, weiß ich nicht,
heutzutage nennt man dann eher so AlpineJS oder
PTView oder so.
Aber
das Problem dabei ist natürlich, dass sobald
das dann halt komplizierter wird und sobald
man dann halt irgendwie sowas macht, also was ich ja gerne hätte,
ist ja irgendwie, dass auch Pagination darüber funktioniert
und man dann so weiterklickt und das halt so schnell ist wie
bei einer lokalen
App oder so, dass es halt dann
doch eher, da ist man dann schon eher schnell
im Single-Page-SPA-Land
unterwegs.
Aber genau, und ich dachte
bisher immer, und mit Jackfrey und so
wird das State-Management dann halt auch irgendwann, wenn es komplizierter wird,
sehr hässlich.
Und ich dachte immer so, naja, gut,
da muss man halt doch SBL machen.
Aber ich glaube,
tatsächlich, HTMLX ist vielleicht tatsächlich eine Lösung.
Ich weiß es noch nicht genau, weil ich habe es noch nicht ausprobiert, aber
Ja, wir müssen ein bisschen ausbauen,
dass das dann ein bisschen voll,
also die ein bisschen einfacher wird von
der Anwendung her, dass man vielleicht noch ein paar eigene Template-Text
für sowas nimmt oder sowas.
ist natürlich besonders toll, aber...
Ja, da bin ich auf jeden Fall gespannt.
In diesem Trend geht es ja jetzt auch schon einige Zeit
und der gefällt mir tatsächlich sehr gut. Also da würde ich sagen,
das ist ja super, wenn das ein bisschen mehr in die Richtung
läuft, dass man wieder mehr Server...
Ja, das sind halt immer so Hype-Cycles.
Macht alles auf dem Client.
Oh nein, macht alles auf dem Server.
Wenn das halt mit Rust,
bei Python, mit WebMX im Browser geht,
dann können wir auch das wieder beim Client machen.
Ja,
ich meine,
ich würde ja sagen, eigentlich macht das schon
Sinn, viel auf dem Server zu machen.
Eigentlich brauchst du eigentlich nur eine
Tastatur und der Rest ist auf dem Server.
Das einzige Problem ist, wenn die Verbindung abbricht, dann muss man halt
gucken, was übrig bleibt.
Naja.
Aber schon finde ich
auch interessant. Ich habe jetzt so ein bisschen
auch mal
bei Ruby on Rails gehört.
Ich würde ja sagen, sie beiden großen
oder tatsächlich
Ruby on Rails ist halt eher so das große
Webframework
Batteries Included
Ding.
Fand ich jetzt auch mal ganz interessant.
Ich habe jetzt auch irgendwie mal was drüber gelesen,
was das alles so kann.
Ich glaube, ich habe auch
letztens irgendwo eine Podcast-Revise dazu gehört.
Schon, oder?
Ja, genau.
Und das kann halt tatsächlich, glaube ich,
noch ein bisschen mehr als Django. Aber Django ist halt
immer so das, was man dann auch nennt.
Django ist so ähnlich. Aber
zum Beispiel, was ich nicht wusste,
Ruby on Rails hatte schon immer so eine relativ
ausgefeilte
Asset-Pipeline drin.
Bei Django gibt es so etwas
so ein bisschen, so mit Django-Kompressor
oder manchmal, also so ein bisschen gibt es Ansätze,
aber nicht im Ansatz vergleichbar
mit dem, was Ruby on Rails da macht.
Und Ruby on Rails hatte da so Dinge,
da hat sogar Webpack dann am Schluss eingebaut
und jetzt sind sie nochmal irgendwie auf was anderes umgestiegen.
Und
da war es ja auch so lange so, dass CoffeeScript
verwendet wurde, halt für die ganzen
wirklich von den Frontend-Teile und das
wird dann halt aber alles automatisch
gebundelt und so
und in JavaScript transpiliert und so.
Also das ist ein Teil,
wo Ruby on Rails halt nochmal echt mehr Zeugs
hat als Django, würde ich sagen. Und dann
ein
auch wichtiger Teil und da dachte ich so,
okay, das ist tatsächlich vielleicht etwas,
das ist auch sowas, das können wir auch machen, man muss sich einfach Ruby on Rails
angucken und dann vielleicht Dinge in Django nachbauen.
Das fehlt in Django.
Ist sowas wie
so ein
Job-Queue-System.
Und zwar gar nicht so,
also ich habe mich ja auch schon oft über
Celery geärgert und so.
Django-Background hast du.
Es gibt ja dann auch diverse Django-Queue,
es gibt
R-Queue für diese Redis-Queue-Geschichten,
dann gibt es aber auch noch
Yui oder weiß ich nicht, es gibt noch
diverse andere, es gibt halt irgendwie
zig unterschiedliche Queue-Systeme.
Und
gut, denkt man sich, oh gut, muss ja nicht unbedingt
in Django selber drin sein, ja wozu auch
es gibt ja genug Auswahl
halt irgendwie was einem am besten gefällt
aber der Punkt ist eigentlich bei
River and Whales ist das halt drin, da gibt es halt
da nennt sich das glaube ich Action Job
oder irgendwie so
ich weiß es auch gar nicht genau
und das eigentlich
witzige daran ist, dass das halt
so ein Ding ist
das ist so ein Interface in
Ruby und Rails selber. Genauso wie es
da auch so eine
Abstraktion gibt für Files
den Zugriff. Oder für Files irgendwie.
Und das gibt es ja in Django auch.
Django hast ja auch irgendwie Default
File
wie heißt das?
File Storage.
Default File Storage kannst du setzen.
Und dann ist egal, was du verwendest.
Ob du ein Object Store verwendest oder das File System
oder was auch immer.
Es muss halt
diese API anbieten und dann kann dahinter liegen,
was will, aber du kannst
es halt benutzen.
Innerhalb von Django ist es immer
das gleiche Interface. Du kannst halt immer Files
irgendwie, kannst aus denen lesen, kannst sie schreiben.
Oder wie Cache, Cache-Backend.
Genau, oder Cache-Backend.
Du kannst hinterher das Cache-Backend austauschen,
aber dein Applikationscode
muss sich dafür nicht ändern. Und das kannst du mit diesem
Jobkram halt dann auch machen.
Und das ist eigentlich,
in der Ruby on Rails
Welt gibt es halt viele Dinge, die dann
darauf aufbauen, dass diese Interfaces halt so sind,
wie sie sind.
Das heißt, du kannst halt
Third-Party-Packages
oder so bauen, die halt
dann irgendwie
deine Tasks
in diese Queue schmeißen und da irgendwie
und sie müssen nicht wissen, welche
Implementation du da verwendest.
Ob das jetzt RabbitMQ ist oder
was der Teufel, das ist halt alles hinter diesem Interface
versteckt und spielt dann auch keine Rolle.
Und diese
Geschichten gibt es halt in Django gar nicht, weil es dieses einheitliche Interface
nicht gibt. Das heißt, wenn ich in Django
sowas machen wollte, dann hänge ich halt ab,
direkt von Celery oder von sonst irgendwas, weil
es gibt nicht irgendwie das
Django-Background-Task-Interface.
Sondern das ist halt...
Ja, das fehlt tatsächlich noch.
Und da dachte ich so, okay, ja.
Und an den Scheinen hat RuinRates auch mal so ein bisschen mehr Zeugs.
Ja.
Ja, ja, auch HTMX kommt da ja daher
und diverse andere Geschichten.
Ja. Und sie haben
irgendwie für ihren ORM
da kann man auch
normalerweise default ist, relationale Datenbank
aber man kann halt auch MongoDB direkt dranhängen
ich dachte so, wow, krass, wie haben sie das denn, weil das ist auch immer
ein Ding, was in Django requestet wird, dass Leute sagen
ich hätte gern MongoDB, kann ich jetzt ehrlich gesagt
gar nicht so richtig verstehen, warum, das wäre vielleicht mal
wenn irgendjemand weiß, warum MongoDB cool ist
wir das mal erklären oder uns mal
schreiben, warum das toll ist, weil
also verstehe ich
gar nicht, warum nimmt man das aber
offenbar gibt es da großen
Bedarf und
das geht halt in Django nicht so richtig.
Aber könnte man sich auch vorstellen.
Dann sag doch mal ganz kurz,
warum du das denn doof nimmst als Wahl.
Was heißt doof? Ich würde nur sagen,
Jason Field
in Postgres ist schneller.
Ist schneller als MongoDB.
Mehr braucht man nicht.
Und es kann halt zusätzlich noch die ganzen relationalen Geschichten.
Also wozu dann MongoDB?
MongoDB ist ja quasi nur das Jason Field.
und kann halt die relationalen Dinge nicht, aber die relationalen
Features brauchst du ja eigentlich auch.
Die ganze Transaktionssicherheit und den ganzen
Isolationslevel und weiß der Teufel, die ganzen Sachen willst du ja eigentlich auch haben.
Naja, also irgendwie
keine Ahnung warum.
Ja, vielleicht auch, wenn man halt
sagt, okay, man hat es
irgendwie vereinheitlicht und es gibt halt nur MongoDB
und es kommt damit klar.
Das kann ich einfach irgendwie was anderes machen.
Okay, ja, dann ist es halt so.
Ja.
Ja, ich finde,
Wir haben jetzt eine sehr, sehr bunte Folge gehabt.
Ich glaube, es wird relativ schwierig, uns zu befolgen.
Ich hoffe, ihr habt bis zum Ende durchgehalten.
Vielleicht habt ihr das ja irgendwie geschafft.
Haben wir noch irgendwas?
Nee, ansonsten...
Hast du einen Pick der Woche? Ich glaube, ich habe das schon tausendmal.
Doch, ich habe...
Also, was ich ganz cool
fand,
habe ich letztens auch eingebaut.
Django Upgrade gibt es.
Ah, stimmt.
Für Python, glaube ich, hat Anthony Sotir
irgendwie auch so ein Ding geschrieben.
Python Upgrade oder so, ich weiß es nicht genau, wie das Paket
heißt und so ähnlich gibt es das jetzt auch
für Django, wo dann halt sozusagen...
Die neueste Syntax und die ganzen deprecated Sachen ersetzt
automatisch durch die Besserung.
Ja, und das habe ich dann halt als Pre-Commit Hook
eingebaut und so, dass dann halt immer,
wenn halt Sachen deprecated werden oder wenn es eine bessere Art
gibt, das zu machen, das wird dann halt automatisch ersetzt
und ich muss das nicht irgendwie von Hand machen.
Das war nice.
Und das ist nämlich,
das ist auch von Adam Johnson, glaube ich.
Ja, was nehme ich denn?
Ja, ich habe ja die ganzen Sachen
fast auf SQL-Model, habe ich ja schon gesagt
Habe ich auch schon mal Ridge erwähnt eigentlich irgendwo?
Ja, das habe ich ja auch schon mehrfach gehabt
Aber ich bestimmt schon mal
Ich nehme es einfach nochmal
Ja, das ist auch wirklich toll, da gibt es auch
Textual oder so
Der
Autor von Ridge
und Textual, der macht jetzt auch
der probiert das irgendwie
Open Source zu entwickeln, quasi
und versucht jetzt damit irgendwie durchzukommen,
seine Projekte zu entwickeln.
Und das fand ich auch faszinierend.
Ja, ich bin mal gespannt.
Also es ist ja auf jeden Fall sehr populär, was er macht.
Und es ist ja auch super.
Und ich hoffe mal, das klappt.
Das wäre toll, wenn das irgendwie mehr funktionieren würde.
Also falls ihr nicht wisst, was das ist,
Witch macht ein bisschen Farbe in eurer Command-Output.
Ja.
ganz nett. Oh, ich benutze das gerne mit
Humanize, vielleicht noch ein nächster Pick, falls ich jetzt schon mal
gepicks habe. Also Humanize macht auch
sowas wie Zahlen oder vor allem Daytime-Objekten
irgendwas vor drei Sekunden oder
vor kurzer Zeit und man kann so ein bisschen definieren,
dass das irgendwie nett sich anhört.
Ich mag das irgendwie ganz gerne für
ein, zwei Dinge.
Ein bisschen Human More Readable
Blogs oder sowas.
Ja, klingt gut.
Ja, der hat einen
Richard-Test, ich habe es gerade gesehen, ist gar nicht so lange her.
Eine Packaging-Folge.
Jetzt haben wir Humanize dabei.
Okay.
Okay, ja dann bleibt uns gewogen,
hört uns weiter, wann ihr wollt und
bis zum nächsten Mal.
Dann bis zum nächsten Mal. Tschüss.