Transcript: Python 3.10

· Back to episode

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.