Transcript: Das Python Data Model

· 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 58.

Wow, 58.

Ja, gar nicht so schlecht, oder?

Über was reden wir heute? Über Flur und Python. Hi Jochen.

Jo, hallihallo Dominik. Herzlich willkommen.

Und hi Johannes.

Johannes, hi.

Schön, dass du da bist.

Ja, schön, dass ich da sein darf.

Wir hatten dich ja schon ein paar Mal hier, habe ich gehört.

Ich war schon, ich glaube ein- oder zweimal oder so ungefähr dabei.

Ja, glaube ich auch. Anderthalb oder so.

Also wir wollen heute bei einem Buch sprechen, Flo und Peißen von Luciano Ramalho.

Richtig ausgesprochen? Ich weiß nicht genau.

Ja, oder das haben wir uns so ein bisschen als Vorlage hergenommen.

Ich würde eher denken, wir, also es wurde, es wurde, wir hatten, uns erreichten, genau, uns erreichten irgendwie Zuschriften, die sagten, ah, mach doch mal ein bisschen was mehr für Anfänger und irgendwie mehr.

Und dann hast du dir das tollste Buch ausgedruckt, wo du dann.

mein Lieblings-Python-Buch

und dann dachte ich,

da kann man ja vielleicht mal so ein bisschen durchgehen.

Ich lese mal kurz aus dem Buch vor,

weil du sagtest, du bist ein Anfänger.

If you are just learning Python,

this book is going to be hard to follow.

Not only that, if you read it too early in your Python-Document,

it may give you the best and every Python-Script

and level-special-message

and metaprogramming-tricks und so weiter.

Also da steht für alle Leute, die es nicht verstanden haben,

es ist kein Anfängerbuch.

Ja, ja, gut, aber wir machen ja jetzt nicht Metaprogramming.

Also Metaprogramming-Zeugs ist da auch drin,

aber das machen wir ja jetzt gar nicht. Noch nicht.

Das machen wir dann nicht. Okay, dann steigen wir leicht

ein mit Datenstrukturen und sowas.

Genau, wir fangen jetzt mit so ganz grundlegenden

Dingen dann an.

Nicht, dass wir Struktur hätten in dieser Folge, aber wir versuchen es heute.

Ja, so ein bisschen. Also wir hatten ja auch schon mal

was zu Dicts gemacht und zu Listen

und ich weiß nicht, ob wir schon Strings hatten.

Hatten wir, glaube ich, noch nicht. Also wir haben

darüber schon öfter gesprochen, aber ich glaube, wir haben tatsächlich noch keine

Folge dazu gemacht. Steht noch auf unserer

Möchten-wir-gerne-machen-Liste.

Aber vielleicht jetzt noch zu News. Gibt es denn was Neues

von Python in der Python-Community?

Ja, also seitdem wir das letzte Mal aufgenommen haben, ist nicht so wahnsinnig viel passiert.

Es ist jetzt auch gar nichts mehr.

Letzte Woche war EuroPython, Jochen.

Ach ja, ja, EuroPython.

Wie war denn die EuroPython?

War gut, hat Spaß gemacht.

Ja, war cool.

Hat sehr viel nette Leute kennengelernt und mit ihnen geschnackt, wie das halt so ist.

Ich weiß aber nicht, ob das einen News-Charakter hat.

Also außer mich persönlich natürlich.

Was ich sehr genossen habe, war tatsächlich Luca Schlanger und der Python-Rapel-3.13-Talk,

der quasi der letzte war vor der

Abschlussrede, wo

man so ein bisschen interaktive Möglichkeiten

sehen konnte von dem, was so möglich ist.

Es war so ein bisschen eine Mischung aus

Eipeißen mit Bund und

man konnte richtig coole Sachen machen und

Beinlings und fancy stuff.

Ist so ein bisschen ein Spaß-Talk gewesen, also er hat dabei Musik gemacht,

hat Euroreq angeschlossen und seine MIDI-Synthesizer

damit bedient. Also genau war mein Ding.

Ja. Fanden die Talks raus und

schaut doch mal rein, ist mit Sicherheit sehr nett.

Und was ich auch ganz gut

fand, war, wir haben alle relativ viel darüber diskutiert,

was Armin Rodenhofer so erzählt hat,

zu

was Scheiße läuft in Python, und zwar das

ganze Packaging-Ding und so.

Das wissen, sind wir ja wahrscheinlich alle derselben Meinung,

dass das da irgendwann mal so ein Tool

geben könnte, das sowas macht wie vielleicht

Cargo für Rust oder so.

Der Meinung möchte ich aber nicht.

Ich bin der Meinung, dass es schön wäre,

wenn wir sowas hätten, aber ich glaube, ich fürchte, dass

wir sowas nicht kriegen können. Okay, aber das ist ja was anderes.

Aber da gibt es auch schon 23 Tools, die sowas

machen. Ja, genau, das ist der Punkt. Armin meinte

dann auch, dann gibt es halt noch ein 24 ist jetzt, aber

das ist so, ist ja altig

XKCD-Comic, ne?

Aber das ist so ein bisschen

vielleicht doch, also

vielleicht sollte man einfach miteinander reden und vielleicht doch

so ein Ding bauen, was dann

übrig bleibt, weil man

braucht halt was, was diese ganze Quark-Sache

wie Pakete managen und

PIP-Tools und

PyEnv und Conda und und und

und und und irgendwie so

schön nutzbar macht, dass

irgendjemand, der das noch alles nicht kennt, einfach mal

so ein Curl macht auf so eine Installation

und dann hat der ein Tool, mit dem

das alles geht. Das wäre schon

ziemlich gut. Also so vom

Paint-Faktor her.

Und immer dann, wenn ich jetzt Leuten versucht habe,

das beizubringen oder versucht habe, bei denen

Python zu installieren oder auf so einer

Schulung irgendwie kleine Sachen mit denen machen wollte oder

die zum ersten Mal so ein Notebook in die Hand nehmen wollten

oder irgendwie

irgendwas anderes, das war immer Schmerzen

damit verbunden.

Und da ja Rust gerade so ist.

Nein, eigentlich ist das ganz einfach.

Also du musst folgende Sachen installieren.

Es ist wirklich nur eine sehr kurze Liste.

Also erstmal brauchst du Build Essentials

und dann brauchst du die ganzen Abhängigkeiten

und libjpeg und libjpeg98

und libjpeg2k

und dann musst du PyRAMP installieren

und dann bist du schon fast so weit.

Und dann Apfel und eine Banane

und wie Jochen sagt, den ganzen Dschungel.

Und ja, also ich habe am Sprint

und für PyRAMP so ein paar Sachen installiert,

weil ich es kompilieren wollte.

Es hat tatsächlich drei Stunden gedauert,

bis es kompiliert ist auf meinem Tool.

langsam sieht. Klasse.

Aber so ist das manchmal.

Ja.

Ja, also ich bin mal gespannt.

Also ich bin da, also ich habe ja auch schon

dann irgendwie gehört, was Leute dazu sagen, die sich

mit diesem ganzen Thema schon lange besch und es gab auch schon mehrere Versuche das zu vereinheitlichen und da auch Peps zu etablieren die quasi das standardisieren und die sind gescheitert alle bisher Auch das letzte Mal

als jetzt, wie heißt der jetzt noch, einer ganz

bekannter, einer der bekanntesten

Core-Entwickler, der halt auch da irgendwie so ein

Großteam bei Microsoft leitet,

der große Kanadier, wie heißt der noch?

Ne, ich hab den Namen vergessen, keine Ahnung.

Auf jeden Fall, der hat da versucht,

einen Peps zu gemacht, das ist halt hinterher gescheitert, weil

ja, also mit dem Fazit, es geht

nicht. Armin meint, es braucht vielleicht noch ein Jahr,

dann sind viele der Grundvoraussetzungen geschaffen,

die da noch fehlen und das wären gar nicht mehr

so viele. Okay, ich bin gespannt. Also, wenn das

dann funktioniert, dann lasse ich mich überzeugen,

aber das, ja, gut.

Werden wir dann sehen.

Was auch interessant ist, ja, es gibt

einmal diese UV-Geschichte, da gibt's

dann auch noch diese Firma

von Charlie Marsh, die hat ja das irgendwie übernommen,

das zu maintainen, das UV, ne? Ja, genau.

Ja, also genau, UV und

Ray, was war von einem?

Quatscht, genau, und hat nicht

die UV übernommen, sondern Ride, sondern genau.

Die integrieren sich tatsächlich relativ, die reden

auch voneinander und übereinander und so

und die integrieren einander relativ viel und

Ride benutzt das UV statt

Pip-Tools, glaube ich, oder so, ne, über,

dann darüber, das sieht alles gar nicht so schlecht aus

und die Firma, glaube ich, Astral oder so

und die machen ja auch Ruff und das,

was eigentlich auch relativ gut

funktioniert, finde ich. Ja, ja, die machen so

eben ganz viel um Ruff. Gibt's auch

eine Firma hier, also es gibt ja da irgendwie

auch eine schnellere Alternative zu Conda,

Mamba von

Präfix-Dev oder weiß ich nicht,

Wolf Vollbrecht

oder so. Den könnten wir vielleicht auch mal

über diesen Thema fragen.

Ja, du weißt ja gerade, dass du für dich zuhörst.

Ja, und genau.

Und das kommt da auch irgendwie

mit rein.

Und deren

Geschichten sollen da auch irgendwie

mit integriert werden, weil das ist halt unten drunter auch alles

Rust. Und ja, also

okay, es tut sich was. Also insofern ist es schon mal gut.

Ja, mal mal gespannt.

Ja, und ich finde es auch gut, dass man tatsächlich jetzt echt

irgendwann durch ist mit diesem ganzen

Snarft. Und vielleicht also Standards,

also ich mag ja zum Beispiel diesen

Go nicht, weil zu viel Standard und so,

das sind immer zu viele Opinionen und so. Und dann, okay,

dann nutzt man dann doch Black.

Aber

vielleicht gibt es da so ein paar... Moment, das habe ich nicht verstanden.

Was nützt mir nicht? Also ich mag Standards nicht.

Also ich mag es eigentlich nicht, wenn irgendjemand sagt, wie es sein muss.

Wenn jemand so opinionated ist und sagt,

wir machen jetzt, keine Ahnung,

Tabs instead of Spaces, weil

ich will das so.

wenn ich das anders möchte.

Und das nervt mich immer so ein bisschen,

weil das da schon in Python ist,

ist halt dynamisch. Ich kann es mir halt aussuchen, wie ich es mache.

Ja, aber gut.

Also ich meine,

aber würdest du das

sozusagen, würdest du,

du würdest aber nur das konfigurieren wollen, wie es aussieht,

aber du würdest schon Autoformaten wollen.

Ja. Ja.

Okay, ja gut, kann man machen, wie man will.

Ja, also ich meine, aber wenn man jetzt bei Black

dann irgendwie eine Konfigurationsdatei jedes Mal mit schieben muss,

ist halt auch irgendwie ad absurdum, ne?

Ja genau, weil vielleicht gibt es das halt nicht.

Dann musst du halt was anderes nehmen.

Das ist so eine Sache,

die denke ich mir schon lange,

dass eigentlich diese ganze Code-Formatting-Debatte,

die ist doch Quatsch, oder?

Eigentlich sollte doch eine Python-Datei

den AST enthalten

und dann hast du einen Editor

und der kann dir den AST anzeigen

auf eine Art und Weise, wie es dir passt.

Und wenn du die Sachen in grün oder gelb haben willst

oder in Dateien oder Modulen aufgeteilt

oder wie auch immer du es haben willst,

da gibt es so viele Sachen, die man

auf der Ebene machen könnte, aber stattdessen haben wir

Textdateien.

So ein bisschen so,

da müsste mal jemand was machen.

Da kommt dann immer der Einwand,

dann mach doch mal was dagegen.

Das Problem ist halt, wie kriegst

du denn aus dem Ast wieder was,

wenn du jetzt tatsächlich was manuell

anders haben willst. Also du möchtest dir eine

VR-Brille aufziehen und dann hast du

vor dir den einen Balken, den einen

Grafen und hast die Notes, musst du alle durchmaschinen.

kannst du dich auf dein Laufband stellen und hinlaufen.

Ne, also da gibt es

bestimmt Leute, die das so wollen, aber da

ich will ja nicht laufen, ich bin ja ein Softwareentwickler.

Aber

ob du jetzt Tabs oder Spaces hast oder

ob du die Variablen

so oder so nennst oder ob du, keine Ahnung,

viele Dinge,

die du da, ob du Einrückungen

oder Braces haben willst, ja, das ist doch auch völlig

egal. Wenn Leute lieber Braces haben wollen,

dann sollen sie halt sich ihren Editor so einstellen,

dass der die Blöcke mit Braces umfasst.

und umgekehrt, wenn ich

TypeScript schreibe oder so,

dann will ich da nicht überall Braces haben,

dann muss doch mein Editor, muss doch smart genug

sein,

das umformen zu können und warum ist

das so schwierig?

Ja, also ein Grund, der mir jetzt sofort...

Das ist so eine Debatte, die jetzt auch ins Gebüsch führt.

Ja, also ein Grund, der mir direkt so einfallen würde,

ist halt, was ist, weil das hatte ich jetzt letztens

wieder, ist halt, was ist,

wenn ich Dinge anders machen möchte,

als jeder andere?

Du meinst Innovation?

Nein, einfach optisch

Müll, achso, äh, Entschuldigung

Ja, das muss doch dein Editor können

das muss doch eine Einstellungssache bei dir sein

weil am Ende kommt ja der gleiche Python raus Ja aber wenn jetzt sozusagen du kriegst jetzt Code von jemand anders Wie soll denn das so wie ich das sehen will

wie soll der denn dahin transformiert werden?

Das kannst du nur mit Sprachmodellen machen.

In der Standardform geht leicht, aber

der umgekehrte Weg geht halt nicht.

Ich glaube, das geht

in alle Richtungen.

Aber das wäre halt das, was da zu beweisen

wäre. Und ich glaube, dass

die richtige

Darstellungsart eben nicht

Text in

ASCII oder Unicode ist, sondern halt

ein

strukturierteres Modell. Und aus diesem strukturierteren

Modell kannst du dann ja mehr Sachen auch rausziehen.

Ja, gut.

Aber es ist unbewiesen.

Das ist hier so ein, wie gesagt, so ein

Jemand-sollte-das-mal-tun-Projekt.

Ja.

In meiner vierstelligen Liste

der Nebenprojekte ist es nicht auf Platz eins.

Also jedenfalls, ich wollte eigentlich für Standards

an der Stelle sprechen, weil ich tatsächlich finde, dass das

so ein bisschen anstrengend ist. Und es wäre schon gut,

wenn so ein Standard das so löst, dass diese ganzen

Pains und Probleme

eine Lösung haben, die

tatsächlich von allen so

mitgetragen wird.

Das wäre schon irgendwie nice to have.

Also so ein kolorabotives

Spiel.

Zungenbrecher. Ihr wisst, was ich meine.

Ein Koloraspiel? Aber du meinst

jetzt für Codeformat?

Nein. Achso, okay.

Packaging. Und also Installation

und Python generell und Binary verteilen

und Setup und

und Vents und Dependencies

und sowas alles.

Naja, ich habe mir halt diese Diskussion

halt so ein bisschen angeguckt und die

hat mich so ein bisschen hoffnungslos

zurückgelassen, weil

also auch die Leute, die sich damit beschäftigt haben,

die haben das ja auch,

das war ja das Ziel und das Ergebnis war,

geht nicht. Ja, das Problem ist halt,

man will sich aber damit gar nicht beschäftigen.

Doch, doch, da haben sich, oh yeah,

da haben sich viele Leute ganz lange mit beschäftigt.

Ich möchte mich nicht damit beschäftigen, was für

Problem Python beim Package installieren beim

Wendfahrt, sondern ich möchte Packages installieren, die die benutzen.

Ja, aber... Weil ich möchte halt Programme schreiben.

Ja, aber die Frage ist, ist das überhaupt möglich bei einer so

alten Sprache? Geht das?

Und bei Rust, also die Antwort ist,

warum geht das bei Rust, ist halt,

die Antwort darauf ist halt, das geht deswegen, weil das

eine sehr junge Sprache ist. Und weil man all

die Dinge, die man früher bei Python macht, da halt nicht drin hat.

Ja, aber da müssen wir auftämmen.

Ja, aber das Problem ist,

dass man...

Ja, aber ein Großteil von dem Zeug,

das verwendet wird, ist halt älter als 20 Jahre

und macht Dinge, die total komisch sind.

Und dann...

Jochen, was würdest du sagen,

wann ist Rust erschienen?

Wann war das erste Release von Rust?

Ich glaube, das ist etwas mehr als zehn Jahre her.

Irgendwann 2013, 2015?

15. Mai 2015, also neun Jahre.

Ah, gut.

Nicht so schlecht.

Habe ich sogar ein bisschen zu alt geschätzt, ja.

Ja, okay.

Aber also ganz junge Sprache ist es auch nicht mehr.

Nee, aber viel, viel jünger als Python.

Viel, viel jünger, ja.

Ja, gut, das stimmt natürlich.

Wobei Python 3 ist jetzt auch noch nicht.

ist doch auch erst seit ein paar Jahren.

Ja.

Ich dachte, ich habe Zeit

für Python 4. Okay, ja.

Die nächste Version ist

Python 8, oder? Da gab es doch mal so

einen April-Scherz.

So ein Pep, wie die nächste Python-Version heißen sollte.

Und dass man dann immer additiv vorgeht.

Der große Vorteil von dem Versionsschema

ist, dass man alle anderen Versionen einholt.

Das war auch ein lustiger Talk.

Wer ist nochmal der Release-Manager von

13 und 14?

Thomas Waters?

Warp Hots?

Ich meine,

der war auch lustig, weil er meinte nämlich, er möchte

gerne das Versioning von

Python ändern, einfach auf Jahreszahlen

anpassen, dann wäre es halt demnächst

Python 24 einfach,

dann Python 25.

Und dann aber mit drei da vorne, wenn wir drei behalten, dann 325,

weil es im Antikvorson irgendwie Blut wäre.

Da müssen sie sich aber auch noch irgendwelche lustigen Tiernamen

ausdenken, die da dazu passen.

Und bitte alphabetisch aufsteigend.

Ja genau, so ungefähr.

Ja, das war dann die Debatte.

Ja, also es gab viel Spaß und die Talks

sind sicher auch irgendwann bald da und die kann man sich alle

angucken. Es gab ja verschiedene

Tracks, der Data-Track war relativ viel vertreten

wieder. LLMs und so

sind ja wie immer

hoch dabei. Ich hatte

nicht das große Glück, dass ich jetzt da so einen Talk

erwischt hatte, der mich so total faszinierte.

Die waren immer sehr, ich sag mal High-Level, was

auch nicht schlecht sein muss. Aber

ja, bis auf so ein paar Sachen, die halt darum

gingen, so wie man das vielleicht mit dem

Trainieren noch ein bisschen besser hinkriegt oder mit dem Feintunen,

das so ein bisschen effektiver sein kann und nicht so viel

Speicher dafür braucht oder so, aber das müsste

uns eigentlich mal für eigene Episoden irgendwann aufheben.

So was.

Ja.

Was haben wir noch, Jochen?

Ah ja, jetzt wo es um

Europe-Halten ging, was mir eingefallen ist,

stimmt, wir hatten ja letztes Mal auch über die DjangoCon

Europe 2024 geredet

und die Vorträge sind jetzt

online, kann man sich angucken und da bin ich jetzt

gerade dran, die so ein bisschen nach und nach

anzugucken, die ich interessant finde

und da habe ich auch schon interessante gesehen.

Da war auch jetzt diese Woche

ein Treffen der

Python User Group,

Django Cologne User Group wo es dann halt auch einen Vortrag gab Background Tasks was ganz interessant war genau Und ja das klingt alles tats ziemlich interessant

Also da haben sich schon Gedanken über das Interface

gemacht. Salary ID.

Ja, könnte sein, was eine gute Sache wäre.

Ja, und es wäre richtig gut.

Ja, aber

da wollte ich noch sagen, weil du gesagt hast, die ganzen

Talks gucken, das war tatsächlich auch super. Ich mag

dieses hybride Format von Konferenzen.

Auch bei der Europice konnte man halt

abends, wenn man ganz

schon durch war von dem ganzen Tag

und die ganzen Konferenzen live gesehen hat,

sich nochmal den Track von den Sachen, die man verpasst

hatte, bei YouTube auf anderthalbfach angucken

zum Einschlafen oder zum Runterkommen.

Das war sehr cool.

Das heißt, man kann alle Sachen parallel gucken gleichzeitig

oder länger frühstücken, wenn man mag.

Was echt schön ist.

Sehr zu empfehlen, sehr zu empfehlen.

Ja, ansonsten so

in Ermangelung von Dingen, die jetzt mit Palten

so viel zu tun haben, was mich

hier gerade so noch so ein bisschen umtreibt,

ist halt, ach ja, es war bald Urlaub

und ich habe ein bisschen neue Hardware irgendwie mir zugelegt.

Jochen, das ist keine Werbeveranstaltung hier.

Nee, aber was ganz cool ist,

es gibt jetzt tatsächlich,

also dieser Haushalt enthält Computer,

kann Spuren von Computern enthalten.

Und der schnellste Computer in diesem Haushalt ist jetzt ein iPad.

Und ja, also da sind ja diese M4-Dinger drin,

die sind sackschnell, also das ist unglaublich.

Also lässt du das jetzt deine Machine Learning Modelle tunen?

Aber das ist doch kein General Purpose Computer.

Nee, leider nicht.

Argumentiert, dass es kein General Purpose Computer ist.

Ja, das ist blöd.

Aber es wäre voll cool, wenn es ein General Purpose Computer wäre.

Aber es wäre nämlich der schnellste, den ich hätte.

Bau doch einfach die CPU aus.

Ja.

Kannst nicht wandertangluten.

Nee.

Genau, also ja, das ist so ein bisschen so.

Aber das Ding ist tatsächlich, also es gibt das,

M4 gibt es auch noch in keinem anderen Gerät irgendwie von Apple,

also nur im iPad.

Ja, es ist schon so ein bisschen traurig.

Es gab auch eine Tastatur diesmal

mit einer Escape-Taste, sodass

mit der Escape-Taste kannst du eigentlich auf iOS

überhaupt gar nichts anfangen. Sodass halt viele Leute

gedacht haben, es kommt irgendwann ein MacOS

für iPad, was voll cool wäre. Aber

nein, kam nicht.

Und jetzt habe ich ein iPad

und kann es nicht benutzen.

Ein bisschen doof. Aber ja, ansonsten

wirklich sehr schnell.

Ich darf jetzt schnell YouTube gucken.

Ja, genau.

Ich habe noch so eine Platine mitgebracht, die kann man sich

ankleben und mit so einem Magneten

und da kann man so einen Text hin und her laufen lassen.

Und da gibt es so ein Python-Modul, da kann man

dann den Text auswählen.

Und das ist dein schnellster Computer?

Ja, genau.

Ansonsten

gab es noch so ein bisschen irgendwie

LLM-Krams.

Ja, da gibt es doch immer was.

Also Asopik hat tolle neue Modelle

rausgebracht, die ziemlich beeindruckend sind.

Ja, und Mistral

hat jetzt, ich glaube heute

ein neues Modell rausgebracht.

Nemo heißt das, mit einem neuen Embedding.

Die haben einen neuen

Embedder trainiert, der wohl

deutlich besser ist. Das müsste man

sich mal anschauen. Und dieses Nemo-Modell

hört sich auch interessant an. Das ist Zusammenarbeit mit

Nvidia entstanden.

Ein 12B-Modell.

Das ist also etwas

größer als diese 7B-Modelle und das ist

wohl genau so trainiert, dass

das auf einer normalen Grafikkarte

laufen lassen kannst, also auf eine 4090.

Ja, die haben ja alle

11-12 Gigabyte

Hauptspeicher, ja. Genau.

Und das ist wohl auch schon so trainiert, dass es mit

FP8 geht, ohne

Leistungsabfall und das ist natürlich direkt

sehr praktisch.

Ja, ich habe auch letztens gesehen, dass irgendjemand

quasi, also

war das Microsoft

Research? Ich weiß es nicht, ich hatte ein Paper veröffentlicht.

zu einem Modell,

das

die gleiche Performance

irgendwie über viele unterschiedliche,

oder sogar deutlich bessere Performance über viele

unterschiedliche Benchmarks hingekriegt hat,

als GPT-3.5,

aber auf einer einzelnen GPU läuft.

Also auf so einer Consumer-GPU.

Und das war auch zum ersten Mal,

dass das jemand geschafft hat,

GPT-3.5 auf irgendwie so Consumer-Hardware

zu schlagen.

Also das geht jetzt,

du kannst da wirklich auf deinem Rechner zu Hause

irgendwie Sachen laufen lassen, lokal,

auf deiner Grafik, auf deiner

Spielegrafikkarte, die halt irgendwie

das Chat-GPT

vom Anfang halt

deutlich schlagen. Und das ist interessant.

Also, ja, es geht heran.

Ja, da tun sich doch viele Dinge.

Das ist schön, dass da so

auch so völlig

sage ich mal

normale Sachen, ja, dass

sich jetzt hier GPT-4

und 4.0 und so, dass die sich weiterentwickeln

und Cloud Sonnet und so weiter.

Ach so, und das Mistral Nemo-Modell

hat ein 128K

Contacts-Window. Das ist eine Besonderheit.

Das ist auch was Interessantes,

weil die anderen lokalen Modelle hatten ja immer nur

irgendwie 4K oder 8K.

Und das macht doch nochmal deutlich...

Dass sich so ganz normale Sachen weiterentwickeln, dass man eben, genau wie du sagst, Jochen, dass jetzt auf normalen GPUs laufen lassen kann und dass die Modelle größer und schneller und trotzdem skalierbar werden und dass es auch in der Richtung Entwicklung gibt, das finde ich eigentlich ziemlich cool.

Das ist nicht nur so eben in diesen

Hochburgen und in den

Diensteanbietern festhängt,

sondern die Szene ist auch

sehr lokal. Und wenn man sich da mal so dieses,

wenn man sich Hugging Face anguckt, ja, und wie viele

Anleger von Lama es gibt und dann gibt es manche,

wo das Sicherheitstraining

weg ist und einst spricht nur die

Sprache und einst nur diesen, das und jenes kann.

Ja.

Es ist schon schön, dass da was passiert.

Ja, genau. Ja, und die

andere Seite, also OpenAI und so, das ist auch

interessant. Also überhaupt, da wollte ich

auch noch wegen Apple irgendwie

drauf zu sprechen kommen. Die bauen ja jetzt

dann irgendwie die Dinger ein

in iOS

und was eingebaut wird,

ist auch GPT-4.0.

Also du kriegst halt

jetzt, wenn du ein iPhone oder sonst irgendwas kaufst,

wahrscheinlich dann ab jetzt, wenn die neuen Geräte kommen,

kriegst du halt, oder eine neue

iOS-Version, kriegst du halt

quasi die Bezahlversion von OpenAI

irgendwie in deinem

Gerät und

ist halt ein relativ

dicker Deal wohl

und dafür kriegt, also das

ist glaube ich nur ein Gerücht, das ist noch nicht bescheidigt, aber

Er hat noch sogar einen Board-Seed.

Genau, die haben jetzt

Microsoft hat doch die Daten von einem iOS-Mutant.

Haben sie wieder aufgegeben, sind nicht mehr.

Sowohl Microsoft

als auch Apple haben ihren Board-Seed aufgegeben.

Es waren eh nur Beobachtende, aber haben sie beide

zurückgezogen.

Achso, okay, ich dachte eigentlich

das jetzt sozusagen das Gerücht war,

dass das Velfiller irgendwie ins Board von

OpenAI geht, aber...

Ja, haben sie aber wieder zurückgezogen.

Ah, okay. Dann war ich da schon nicht mehr so aktuell.

Aber ich meine...

Es bewegt sich so schnell, dass...

Wahnsinn.

Wenn man hinguckt, ist schon wieder alles ganz anders.

Aber naja, gut, in gewisser Weise

verstehe ich es ja auch. Also das große Problem von OpenAI

ist ja irgendwie, dass sie halt zwar

irgendwie ganz gute Modelle haben, aber

sie haben halt die Geräte nicht da draußen.

Also sie haben halt einen strukturellen Nachteil

gegenüber sowas wie Google oder so. Google braucht das alles nicht.

Die können einfach irgendwie über

Android, haben sie halt

einen riesen Hebel.

Aber OpenAI, wenn sie halt nicht

Partnerschaften mit Microsoft

oder mit Apple haben, dann haben sie halt ein Problem.

Weil, ja,

sonst passiert ihnen das, was halt

irgendwie, keine Ahnung, Slack passiert ist mit

Teams oder so und dann sind sie halt weg.

Ja, insofern

ja, es sind auf jeden Fall interessante Zeiten.

Bin mal gespannt. Aber

4.0 ist auch so gut, also ich finde das hier auch

dauernd, also dass das

wahrscheinlich irgendwie... Aber was denn, Jochen?

Was machst du denn damit? Ja, programmieren.

Achso, ja gut, okay.

Ich gehe nicht in den Flow rein.

Ja, aber auch

Opus, das ist schon... Ja, Opus ist auch

super, also ja, absolut.

Oder so nett. Ja, du gibst halt einfach

so Fragen und das stimmt dann auf einmal

doch eher mehr als früher.

Noch mehr als früher.

Und dann, man kann es halt so steuern,

Habt ihr das irgendwo integriert?

Ja, ja, ID.

Also auch Konsole halt.

Und wenn man halt, dann kannst du halt auch

Pipen mit Cut reinpipen, irgendwas

oder sag dann halt Template

mach einen

PyTest drauf oder so. Und das

ist gut. Gute Vorschläge.

Also die sind nicht immer ganz rein, aber man kann das ja auch

modifizieren. Man kann sagen, ja, ein bisschen mehr

in, ne, ein bisschen mehr Fixtures, ein bisschen weniger dies,

ein bisschen weniger das, wenn man das nicht schon im System

drinstehen hat. Und dann ist das ziemlich

das, was man will. Man kann ja so ein Beispiel geben, wie

hey, und so wie ich das hier gemacht habe,

so dass es ungefähr so könnte es aussehen.

Und dann

fertig.

Ich bin ja mal neidisch, wenn da Leute

das so erzählen, weil ich komme mit

solchen Systemen einfach irgendwie nicht in den

ich komme nicht in den Flow.

Vielleicht muss man sich da mal zusammensetzen.

An Emax Johannes.

Ich habe doch Peitscham, bin doch

Peitscham-Unterstützer.

Ja, aber hast du da den Co-Pilot zum Beispiel an

oder so, weil das ist auch schon ganz okay.

Also ich finde ehrlich gesagt, das ist nicht so gut, wie wenn man jetzt quasi direkt mit...

Wann hast du das letzte Mal probiert, Jochen?

Keins dieser Systeme hat mich je überzeugt.

Okay.

Ich habe es ein paar Mal probiert und das war jedes Mal so...

Johannes hätte es besser gewusst.

Vielleicht ist das das Problem.

Vielleicht weiß ich es einfach besser.

Ja, ich würde es auch sagen.

Na gut, kann man.

Da würde ich aber sagen, dass das genau das...

Wenn der Jochen sagt, dass das bei ihm hilft, dann kann es bei mir nicht sein, dass ich es besser weiß.

Das wäre sehr überraschend.

Wundervolle Überleitung jetzt übrigens, weil Tim Peters,

der Cowork-Entwickler

und Autor von Zen of Python, das ihr bestimmt alle kennt,

import ist,

dann meinte er, der Plan wäre, wenn jemand

ein Feature entwickelt, das du nicht verstehst, dann

knall ihn einfach ab. Und das ist der

Einstieg in das wunderschöne Buch

von Tim Peters. Ja, muss man direkt mal klar machen,

wie die Sachen dann so laufen und genau Das ist auf jeden Fall einfacher halt etwas Neues zu lernen Ja und dann am Schluss hat man nur noch Leute die irgendwie kein Problem mehr haben das zu verstehen was man sagt Ja und bevor die einzelnen lebenden Entwickler dann

kann man ein kleines Stück

von dem, was man schon tun kann, dann verwenden

und kommt damit weiter.

Also sind wir jetzt

bei Flutpaten?

Ja, ich würde tatsächlich jetzt

so ein bisschen unser Quatsch

versuchen, in eine Struktur zu überführen,

die uns ein bisschen zurückführt auf dieses

wundervoll.

Fluent, was heißt denn Fluent?

Flüssig? Also ich wollte nicht über das Buch sprechen.

Fließend.

Eigentlich wollte ich gar nicht erwähnen,

dass sie das Buch klauen.

Ach so, du wolltest einfach so tun,

als ob das deine...

Entschuldigung.

Den Spaß verdauern.

Okay.

Ja, wir können das auch sagen, das ist ja kein Problem.

Aber genau, was wir...

Was es heute

im Grunde geht, ist halt, wie

nennen das Python Data Model oder

im Buch wird es auch so genannt, es wird auch in der Referenzdokumentation

so genannt. Es gibt andere Leute, die nennen das irgendwie

anders, Python Object Model oder so.

Und im Grunde geht es darum,

was ist denn das jetzt überhaupt wieder alles?

Also ich tue jetzt mal einmal so.

Tu mal so, als ob du das nicht wüsstest.

Ja, genau, das sage ich doch.

Wie immer.

Also zum Beispiel

ist halt

ein super Beispiel ist halt,

um da vielleicht einen Einstieg zu finden,

sagt man in Python eigentlich irgendwie

len von irgendwas, irgendeiner Collection

oder so und nicht

Collection.len, Klammer auf Klammer zu,

wie man das jetzt vielleicht in Ruby machen würde oder so.

Ich weiß ehrlich gesagt gar nicht, wie man es in Ruby macht, aber

In Java, sehr geile Frage.

Die machen das komisch.

Genau, warum macht man das eigentlich so?

ja, also der, das was

halt

Python an der Stelle halt anders macht,

ist halt, dass es irgendwie ein bisschen

objektorientierte Purity sozusagen

irgendwie opfert, um halt

eine Menge andere Vorteile zu kriegen.

Und ja, das macht es, also

das ist überhaupt so eine charakteristische Geschichte von

Python, dass man halt

oft irgendwie, ja halt

nicht die reine Lehre irgendwie macht,

sondern halt irgendwie etwas, was nicht ganz so rein ist,

aber was halt praktisch viel besser funktioniert.

Ich verstehe jetzt meine Sache nicht. Also warum ist erstens irgendwas mit

Klasse und Attribut und Methode

called die reine Lehre und zweitens, was ist

das Problem, wenn man irgendeine Funktion hat oder eine

Call it whatever you like

oder Closure und kippst da

ein Objekt rein und dann

passieren Dinge damit.

Also sozusagen, wenn du jetzt reine Objektorientierung

machen wollen würdest, dann würde man ja

sagen, naja gut, du schickst halt irgendwie Nachrichten

an ein Objekt oder du rufst halt Methoden auf oder was auch

mal, wie man das nennt. Und

das ist dann die Sache des Objekts.

Warum?

Das ist zum Beispiel in Java so.

Ja, aber warum ist das so?

Java heißt Kingdom of Nouns

und es gibt quasi keine

Funktionen in Java, sondern es gibt nur Objekte

und denen kannst du Nachrichten schicken und die

machen dann irgendwas. Und das ist der einzige

Mechanismus, den es im Wesentlichen gibt.

Und selbst wenn du sowas hast wie eine Main-Funktion,

dann hast du da irgendwo eine Klasse und dann ist

es halt eine Static-Methode

auf dieser Klasse drauf.

Und anstatt, dass du sagst,

wenn unser Programm läuft, dann rufen wir die

Main-Funktion auf, sagst du, wir schicken

eine Main-Nachricht an unsere

Main-Klasse. Aber warum

würde man auf die Idee kommen, dass das

eine gute Idee sein könnte?

Naja.

Also was ist das, ich muss mal kurz über die Trade-Offs reden,

um das mal so zu retten. Warum wollte man

denken, dass das eine gute Idee sein könnte,

sowas zu tun?

Naja, es reduziert natürlich schon die Anzahl

von Dingen, die es so gibt.

Es hat nur Objekte und Methodenaufrufe und mehr nicht.

Und das ist warum gut?

Also Simplicity.

Einfach eine Sache lernen.

Auch haben es Razer, weil Einfachheit ein Wegweiser

zur Wahrheit ist oder zur Schönheit oder so.

Okay.

Point 1 für den Java-Entwickler.

Ich bin dir.

Ja.

Okay, und Alvar, warum ist es denn nicht auch einfach,

einfach sowas wie funktionale Programmierung zu machen

und da Zeug hintereinander hin und her zu reichen?

Was fehlt einem denn da in diesem Vergleich?

Funktionale Programmierung ist auch was anderes.

Das gibt es auch, aber das ist was ganz anderes.

Also das ist ja ...

Also kann man auch machen.

Aber dann ...

Kannst du auch Pure haben, sowas wie Haskell oder so.

Oder Erlang oder weiß ich nicht.

Ah, Standard-ML.

Ja.

Das ist halt ein anderes Konzept als jetzt Objektorientierung.

Naja, aber wir sprechen gerade von ästhetischer Einfachheit oder so.

Jaja, ist es auch, aber es ist halt anders.

Da gibt es halt nur Funktionen sozusagen.

Okay, aber ich wollte kurz auf die Trade-offs hinaus, weil, warum ist das jetzt?

Naja, also der Grund, warum man jetzt denken könnte, dass es halt im Python nicht so schön ist,

halt, dass man sagt, das muss man halt auch noch

so, jetzt haben wir so Build-Ins wie Lenn oder so,

die so ein bisschen komisch sind,

aber tats hat es halt praktisch sehr viele Vorteile wie naja also einmal du musst dir nicht f jedes Objekt merken wie das denn jetzt nun hei mit dieser Methode

weil das kann ja jeder dann anders machen, das wäre ja

irgendwie schlecht.

Das ist zum Beispiel ein Problem, was PHP hat

oder JavaScript, da heißt es

manchmal Size und manchmal Length und manchmal

Count.

Und eine andere Geschichte ist

halt, es ermöglicht dir halt

irgendwie

so ein paar dreckige Optimierungen zu machen,

die halt irgendwie die Dinge,

die wirklich Zeit kosten, irgendwie

deutlich schneller zu machen. Wie zum Beispiel

du kannst halt da diese

Sachen, so tatsächlich was Len halt

macht, ist ja schon dann

quasi, wenn das ein Objekt ist

einer Klasse, die du erstellt hast, dann wird

halt dann da Len

aufgerufen. Schon doch die Methode, die geheime

Methode aufgerufen.

Aber die ist halt nicht dafür da,

dass irgendwie andere die aufrufen,

oder dass man die von Hand aufruft

zu Fuß oder wie auch immer,

sondern die ist halt dafür da,

dass der Interpreter die aufruft,

wenn man halt len von irgendwas sagt.

Und dann ruft der Interpreter die auf,

aber der Interpreter kann halt auch andere Dinge tun.

Der kann zum Beispiel jetzt,

wenn das irgendwie so ein native,

also ein Ding im Interpreter selber ist,

also irgendwie ein C geschriebenes Ding

wie ein Dikt oder eine Liste oder sowas ist,

dann kann es halt direkt irgendwie

in diesem PyObject irgendwie drauf gucken,

wie lang ist denn dieses Ding

und gibt es dann halt zurück.

und muss halt keine Methode aufrufen.

Also Methodenaufrufe sind halt etwas, was halt in Python

super langsam ist. Oder in allen

interpretierten Programmiersprachen,

die so ähnlich sind wie Python, sind halt Funktionsaufrufe,

Methodenaufrufe immer total langsam.

Da ist wirklich so ein Faktor 1000

dazwischen, zwischen reinem C

und Funktionsaufruf

und Python oder so.

Und ja,

für die ganzen Standardfälle, wo

man das halt benutzt, kann der

Interpreter das halt alles wegoptimieren und dann

macht er das halt einfach nicht, sondern da wird gar nichts

aufgerufen.

Also das sind halt zwei große Vorteile,

die man halt kriegt, wenn man halt ein bisschen

Reinheit opfert, sozusagen.

Und genau, das ist halt

irgendwie diese Balance zwischen

Reinheit

und funktioniert super.

Und Magie.

Genau, ist halt so eine Spezial...

Magie mag jetzt zum Beispiel der Autor von

Flo und Python an der Stelle gar nicht so

gerne.

Man nennt die Dinger ja irgendwie

Magic Methods auch, also dieser

Magic Methods.

Das finde ich eine sehr schöne Diskussion

über diese Namen, über die Magic

Methods und über die nicht Magic Methods.

Ja, fand ich auch so.

Das kommt halt so aus der Ruby Community,

das wusste ich gar nicht. Ich dachte eigentlich,

es gibt halt ein paar Python-Entwickler, die nennen das halt

Magic Methods, die dann sagen halt Dunder Methods

oder sowas.

Ja, aber in der

Ruby-Welt ist das wohl üblich.

Und ja, aber der...

Das ist der offizielle Name, oder, an Ruby?

Ja, ja.

Die heißen Magic Methods.

Genau.

Ja, oder auch in IPython oder so heißen die auch irgendwie Magic.

Und dann gibt es diverse ...

Aber das ist ja auch wirklich Magic.

Das ist wirklich Magic, okay.

Aber eigentlich sind halt eben die Python-Dinger gar nicht Magic,

sondern das ist halt eigentlich völlig klar,

das dokumentiert, was das ist und was das tut.

Und insofern, der Autor sagt selber, er findet das nicht gut.

Die sollten lieber Muggel-Methoden heißen,

weil sie halt so unmagisch sind.

Aber ja.

Ja, er nennt es ja dann auch auf Special Methods einfach.

Special Methods, das ist auch ein guter Name.

Ich glaube, das, was da magisch ist,

ist, dass man die implementiert

und dann werden sie irgendwo her aufgerufen.

Und wenn ihr das nicht weißt,

dann ist das schon magisch.

Ja, ich glaube auch.

Da gibt es Lenden von irgendwas ein

und es wird aber was ganz anderes.

Dass du für Anfänger,

es ist nicht ersichtlich,

dass wenn du irgendwie so eine Methode dazufügst,

die Dinge macht, wo du nicht weißt, warum.

Weil das unter der Haube passiert.

Natürlich.

Aber das Spatial war ja auch nicht.

Also magisch schon gut.

Das macht ja Magie.

Ah, es passiert irgendwas,

dann machst du einen String auf irgendein Objekt und dann kommt da irgendwas raus,

weil du eine Rappermethode beschriebst.

Ah, Magie.

Ja, wobei das natürlich

eine sehr dünne Schicht Magie ist.

Wie der Jochen schon gesagt hat,

da gibt es eine Liste, so viel Magie

gibt es und die sieht auch so und so aus

und im Wesentlichen ist das ja nur eine

syntaktische Umformung.

Damit syntaktische

Magie, genau.

Ja, aber das ist dann quasi echte Magie.

Echte Magie, da fummelt jemand vor den Augen

mit deinem Finger an Schnipsen rum

und auf einmal zieht er hinter seinem Ohr

eine große, goldenen, glänzende Münze.

Ja, das sind Illusions, das ist keine Magie.

Das ist so ein bisschen, aber so eine taktische Magie.

Ja, aber echte Magie ist doch das,

was man aus Harry Potter kennt.

Dann schwingst du da in den Zauberstab und dann passiert irgendwas.

Die richtigen Worte in der richtigen Reihenfolge sagen.

Genau, das ist so.

Das macht irgendwas, was thermodynamisch nicht möglich ist.

Ja, genau, da sind wir uns eigentlich alle relativ einig.

Das gibt es halt auch nur in Harry Potter oder in...

Ich weiß nicht, also ich finde tatsächlich...

Und in Ruby.

Die Analogie auch gar nicht so schlecht f Programmierer insgesamt Also ich meine man sagt irgendwie die richtigen W in der richtigen Einfolge und dann passieren Dinge Ich finde das ist gar nicht so weit hergeholt dass man das vergleicht Deshalb sind wir alle Wizards Ich habe auch so einen Wizard Es gibt auch tats Leute die Nicht als Muggel bezeichnen Also ich wei so weit w ich jetzt nicht gehen vielleicht

Echt, ich bezeichne die mal als NPCs.

Ja.

Tatsächlich, das erste

Beispiel in einem

nicht näher benannten Buch, was ich kürzlich gelesen habe,

das hat

mich tatsächlich etwas überrascht. Da war tatsächlich

ein bisschen Magie drin. Und zwar

da wird ein CardDeck

implementiert

und er implementiert nur zwei von diesen

Methoden, ja für

Kartentricks dann

und er implementiert nur zwei Methoden, nämlich

dann der Len und dann der GetItem

und das reicht

aus für Slicing und Ranges

und Iteration, das hat

mich etwas überrascht, dass der

Python-Interpreter sich aus einem GetItem

aus dem Len, kann er sich alles zusammenbasteln

ich meine es ist nicht, wenn man so ein bisschen

drüber nachdenkt, ist es einfach nur smart,

dass das geht und

das ist auch klar, dass das geht. Wenn ich weiß,

wie viele es sind und ich ein einzelnes holen kann,

dann kann ich auch mehrere

holen. Okay, gut.

Und ich kann auch

Reverse machen drauf. Okay, auch das ist nicht

arg überraschend. Und ich kann auch

Iteration machen drauf. Okay, auch das ist nicht arg

überraschend mehr. Aber

dass das implementiert ist, das fand ich

sehr cool. Ja, man delegiert

im Grunde die ganze

schlaue oder die ganze schwierige Funktionalität

von, wie das halt so

funktioniert, an die interne Liste in der Datenlage.

Genau, wie das schnell auch funktionieren kann, indem man einfach so eine

Längen-Get-Item definiert.

Nee, Jochen ist nicht delegiert.

Sondern der ruft

Längen-Get-Item an. Ja, aber das macht ja die interne

Repräsentation von Längen, wird ja aufgerufen.

Also das heißt, die Magie, die wirklich

dann in C-Python passiert, die ja damit

schnell ist und so.

Gut, in dem Beispiel wird

nicht implementiert,

wie du tatsächlich Objekte speicherst, sondern

benutzt eine Liste. Genau, es wird halt

sozusagen, das wird weitergereicht, die Position wird

weitergereicht an die Liste. Genau.

Und die kann halt auch slice.

Die Implementierung dieser

beiden Attribute ist

tatsächlich, also ist einfach

durchdelegiert. Aber dass du dann daraus

eine slicing Syntax

kriegst mit ranges, das ist

ja, das macht ja der Interpreter für dich.

Ja. Also der macht

sich diese ranges und ruft dann die einzelnen

get-items auf. Ja.

Also hat mich auch gewundert, hätte

hätte jetzt auch nicht gedacht, dass man

dann schon iterieren kann.

Genau, das war mir gar nicht

klar, dass das reicht, GetItem zu implementieren.

Also ich muss meine naive Karteninterpretation

von meinem Kartenspiel, von meinem Pokerspiel

auch nochmal anpassen, wenn ich das so sehe, weil

tatsächlich ich da auch immer dann ein Objekt

gemacht habe, an dem Karten dran waren, was natürlich dann eine Liste war,

was aber nicht hieß, dass man

einfach das Ding mischt, sondern

muss halt diese Mischmethode aufrufen. Ich glaube, das ist einfach totaler Quatsch.

Ja,

da gibt es aber auch verschiedene Ansätze, da kannst

auch auf verschiedene Arten und Weisen drangehen.

Du kannst drangehen und sagen, ich mache jetzt

eine neue Klasse,

die eine Liste einpackt

und dann halt so ein paar magische Methoden,

ich sage jetzt ja magische Methoden, exportiert.

Oder du kannst sagen,

ich behandle jetzt eine Liste wie ein

XYZ und

dann implementierst du erst mal

selber gar nichts, sondern

benutzt halt die Werkzeuge, die es gibt

auf eine bestimmte Art und Weise. Das sind ja schon

zwei unterschiedliche, aber gleich lästige

Herangehensweisen. Aber dieser letzte Ansatz, das ist irgendwie

wirkt also smart.

Weil man halt tatsächlich nicht das Rad

neu machen muss.

Der ist ein bisschen impliziter, ja.

Aber trotzdem sehr personisch, sehr sens-implizit.

Und in der Kombination,

indem man das halt irgendwie schön

modularisiert, kann man tolle Sachen machen.

Also man muss da so ein bisschen Boilerplate

schreiben vielleicht, aber wie man es dann hinterher

wirklich benutzt, wenn man diese Objekte in der Hand hat,

wirkt einfach wie pure Python.

Wenn man halt dann direkt auf diesem Deck,

was man in der Hand hat, Indizes

machen kann, Vendors machen kann und so.

Ja gut, hier geht es ja vor allen Dingen

darum, diese Methoden zu erklären. Insofern

überhaupt, ob man das jetzt so implementieren würde, weiß ich nicht.

Also keine Ahnung. Kommt drauf an, was man damit machen

möchte, aber ja.

Ja, ja, also ich finde es auch,

also es sieht gut aus. Kann jetzt keiner

sehen, weil es ein Podcast leider.

Aber ja, ja.

Kannst du das teilen? Ist das public?

Nee.

Oh.

Na gut, also ich glaube, es gibt

irgendwo bestimmt auf irgendwelchen

YouTube-Kanälen oder sowas. Ja.

Das nächste

Beispiel, was er bringt, fand ich auch interessant,

aber das ist natürlich so ein bisschen

dieses Vektorbeispiel, das ist natürlich

mehr so ein bisschen,

ja.

Du musst das einfach weiterleuchten, bitte, für alle unsere Hörer,

was denn das Vektorbeispiel ist.

Ja, er macht sich eine Klasse,

eine zweidimensionale

Vektorklasse.

Also mit Richtung XY.

Genau, also ein Koordinatmodell,

ein zweidimensionales Koordinatmodell.

er sagt auch gleich im Vorhinein,

könntest du auch die

Bild-In-Klasse Komplex verwenden.

Die kann alles, was wir gleich

hier machen und noch viel mehr.

Aber zum Zeigen ist es ja ganz schön.

Und da implementiert

Hier hat er drei Special Methods, nämlich Add, Abs und Mool.

Und kriegt daraus dann die Möglichkeit, zwei Vektoren zu addieren.

Abs wird hier als die Metrik implementiert, das heißt, es ist die Länge eines Vektors.

Und Mool ist eine Skalarmultiplikation, das heißt, du kannst deinen Vektor mit einem Integer oder mit einem Float multiplizieren, kannst du die Länge verändern.

Auch das mit wenigen Methoden

schon relativ viel erreicht

und auch relativ viel Syntax erreicht.

Das fehlt aber noch Vektor mit Vektor multiplizieren.

Ja, das ist nicht so

einfach, das ist nicht so einfach dummerweise, weil

Das ist mathematisch nicht so einfach.

Genau, da steht

glaube ich im Buch irgendwas drin, ja, also wie man

das dann macht mit Magic Method, das ist dann

Kapitel 16 oder so viel weiter hinten,

weil das ist nicht so einfach.

Und er sagt auch, er verschiebt

auch, das tatsächlich in diesen ersten Kapiteln

verschiebt er relativ viel auf später.

Ja, hier, das kommt in Kapitel 17 nochmal.

Oder in Kapitel 38 oder Kapitel 12.

Tatsächlich auch

Skalar mit

Vektor multiplizieren, also

eine Zahl mal Vektor

verschiebt er auch auf später, weil da brauchst du

nochmal eine andere Special Method,

weil eben Mull nur

Vektor mit Skalar kann.

Und das ist dann so ein kleines bisschen

unbefriedigend. Was ich aber eigentlich,

worauf ich eigentlich raus wollte, ist,

er hat halt dann die Möglichkeit,

seine Klasse mit Plus, hat er zwei Vektoren,

zwei Instanzen von seiner Klasse, kann er mit

Plus addieren. Und

das fand ich nicht so beeindruckend,

weil

das gab es in C++ auch schon.

Das musste ich auch schon mal lernen.

Und da heißen die Methoden halt anders,

da heißen sie Operator Plus und Operator Minus

und Operator noch irgendwas. Und dann

kriegst du es aber auch. Da kannst du auch

Vektoren addieren und so weiter.

Deshalb, da war ich jetzt

nicht so beeindruckt davon.

Ja.

Ich habe das mit dem Multiplizieren nicht verstanden,

was du meinst mit Skalar mal Vektor und Vektor mal Skalar.

Wo ist der Unterschied? Ist das nicht kommutativ?

Das ist die Reihenfolge.

Eigentlich mathematisch gesehen

ist diese Operation kommutativ,

aber in Python an dieser Stelle ist sie noch nicht

kommutativ, weil wenn du

die Mull-Methode

implementierst

auf deiner Klasse,

dann musst,

wenn du x mal y machst,

dann wird x.mull

aufgerufen. Weil ansonsten wird dann tatsächlich

ja, genau, sonst von dem

Skalar die MUL-Methode aufgerufen, da gibt es

den Vektor nicht. Genau, und die kann natürlich nicht mit Vektoren

umgehen. Und damit es in die andere Richtung geht, brauchst

du eine zweite Special Method, da heißt

RMUL, also Reverse Multiplication.

Und die hat aber auch später verschoben, weil

die später nochmal kommt.

Ach, man kann auch RMUL? Interessant.

Das wusste ich auch nicht. Genau, damit du eben

diese Kommutativität.

Aber es wird zuerst MUL aufgerufen.

Das heißt, da geht es dann

auch noch um Präzedenz und deshalb verschiebt

du das, glaube ich, auch später.

Wie kriegt man denn die Präzedenz hin?

Also ich möchte das gerne spoilern.

Die kriegst du

hin, also ist in dem Fall jetzt

hier tatsächlich unproblematisch, aber du musst dann natürlich

Typechecks machen, dass du sagst, okay, was ist denn,

wenn ich ein R-Model mache mit

dieser oder jener Sorte von

Objekt, weil da kann ja dann prinzipiell alles

rein.

Matchcase.

Ja, so

mit einem Matchcase oder mit einem

Was du nicht implementiert hast,

wird einfach im Normalkreis abgehandelt und ansonsten

schreibst du für alle Kettes, die

einmal auftauchen, was

rein. Finde ich gut.

Ja, im Endeffekt macht der Interpreter

das ja auch so. Also wenn eine von

diesen Methoden halt einen Fehler wirft

oder keine Ergebnisse zurückgibt, dann

wird halt so lange weitere Methoden

durchprobiert, bis es eins gibt und wenn es

keinen gibt, dann sagt der Herr, das ist nicht definiert für

diese Typen.

Das haben wir ja auch alle schon mal gesehen, oder?

Dass man versätlich einen String zu einer Zahl

addiert hat und dann gesagt bekommen hat, das

Kannst du nicht. Es sei denn, man war in JavaScript.

Ja, ja, das ist halt

so ein fundamentaler

Unterschied zwischen JavaScript und

Python.

Ja, aber, ja, ja.

Ja, also ich, genau, ich finde das

ja auch sehr, ich finde, ich weiß nicht, haben wir überhaupt

schon definiert, mir fällt das gerade so heiß ein, jetzt reden wir

schon die ganze Zeit drüber, aber ich weiß nicht, haben wir überhaupt gesagt, was,

wie diese

Dunder-Methods denn aussehen?

Also die sind immer, haben

immer irgendwie zwei Underscores,

damit fangen sie mal an und hören immer mit zwei Underscores auf.

Genau, Dundar, für alle, die es nicht kennen,

ist Unterstrich, Unterstrich.

Dundar ist halt quasi die Abkürzung für

Double Underscore Before

und Double Underscore After.

Warum machen Underscores damit? Man denkt, die gibt es gar nicht,

damit man die nicht sieht, damit die nicht auffallen.

Nö, Konvention.

Keine Ahnung.

Wie du sie unterscheiden kannst von allen anderen.

Das ist eine Konvention im Python-Interpreter,

wenn du eine Methode hast, die zwei Unterstriche vorne

und zwei Unterstriche hinten hat,

dann verspricht der Interpreter gar nichts darüber.

Das kann sich jederzeit ändern und es kann jederzeit passieren,

dass die nicht mehr funktioniert.

Es ist einfach nur eine visuelle Abtrennung dass du siehst dass das was Spezielles ist Aber wenn ich das richtig verstehe ruft man solche Methoden niemals selber einfach so an Niemals stimmt nicht so ganz also ab und zu schon

Also eine ganz populäre ist, achso, das wolltest du auch gerade

sagen, ist halt

dann der Inet.

Ja.

Wann ruft man denn Inet explizit auf? Von außen?

Ständig. Nur mit Super?

Ständig. Nee, ständig.

Wenn du halt Klasse, Klammer auf, Klammer zu,

dann hast du schon aufgerufen.

Nein, aber das ist ja implizit.

Ja, aber das ist ja die implizite.

Ich meine, dass du explizit jetzt dran schreibst init.

Ja, okay, das passiert tatsächlich nicht so häufig, ja.

Ja, bei super aufrufen schon.

Ja gut, aber nur super,

das ist ja absolut im anderen init.

Und das offensichtlich.

Aber außer dem Fall kenne ich jetzt eigentlich keinen.

Also es sei denn, man will irgendwas debuggen oder sowas,

dann machen wir alles anders, aber ja.

Es ist halt auch nicht notwendig.

Das ist ja der Trick da dran.

Ja, aber deswegen braucht man jetzt eine App,

definiere, dann mache ich einfach einen String, dann kriege ich das Ergebnis.

Und wenn ich einen Abs definiere, dann möchte ich halt irgendwie

mit Dingen rechnen

und gucken, was passiert. Oder beim Bool

vergleiche ich mit irgendwas oder so. Oder ich mache ein If vor.

Aber ich würde dir niemals selber das

vormachen. Und das ist ja vielleicht das Interessante an den

Thunder-Messages, dass sie halt quasi die

Reimplementierung sind, um

mit normaler Python-Syntax und den

Objekten zu interagieren. Also zum Beispiel Equals

oder so oder Lesser-Send oder

ein komparatives Verhalten zwischen einzelnen

Objekten von Klassen

oder von Instanzen.

Ja, du kannst halt sozusagen mit dem Interpreter

so interagieren, wie die anderen

Teile in Python halt auch

und das ist halt eine Besonderheit von Python, das geht in vielen

anderen Sprachen nicht. Genau, das macht es halt toll

und das ist halt schön, das ist halt genau

das Schöne an diesen Magic

Methods ist, dass wenn man das ordentlich implementiert

man hinterher in seinem Code

Sachen machen kann, die sehr natürlich

aussehen und die auch in der

logischen Sprache dann natürlich Sinn

machen, wenn man Dinge miteinander vergleichen möchte

die man dann vielleicht auch vergleichen kann, weil man denen

ordentliche Namen gegeben hat und das aber einfach mit den

instanzierten Objekten geht und man halt nicht

irgendwie komische Dandan-Methoden oder

irgendwelche kryptischen Namen

an Objekten aufrufen muss,

wie das in anderen Sprachen der Fall ist. Und das ist toll,

weil dieser Syntax-Sugar Magie macht

und deswegen finde ich den Namen Mindigmas

jetzt auch sehr schön.

Ja, du kriegst also Zugriff auf die

Innereien

des Parsnip-Debretas und

du kannst dich da genauso rein integrieren,

als ob du dazugehörst

und das ist schon was sehr Schönes.

Aber du hast eben noch was anderes gesagt, Dominik,

was auch hier vorkommt, was ich auch in meinen Notizen

habe. Du hast gesagt, du möchtest hier

die Strill-Methode implementieren und dann kriegst du eine

schöne String-Repräsentation raus.

Ich habe die Repr-Methode gesagt.

Oh, dann muss ich noch mal

zurückscrollen und mir das anhören.

Aber das ist tatsächlich was, ich tendiere

auch dazu, immer die Strill-Methode zu implementieren,

weil man

das halt so gewöhnt ist. Bei Java machst

du Two-String, bei irgendwelchen

anderen machst du irgendeine Two-String-

Transformation oder was auch immer.

und in Python gibt es ja zwei davon.

Es gibt Repre und Stre.

Genau.

Und der Unterschied ist

schwer zu erklären,

weil

der ist nicht so was

formales. Ich versuche es trotzdem mal.

Die Repräsentation ist das, was in der Kommandozeile

auftaucht oder einem String, wenn du ihn

reingeschrieben hast und Stre ist das, was

rauskommt, wenn du die String

Conversion versuchst.

Ja, aber

Ja, aber warum macht man dann da überhaupt einen Unterschied?

Könntest du da genau mit einer machen dann?

Das eine identifiziert das Objekt.

Okay, erklär du, Johannes.

Das andere auch.

Nee, also das geht schon so ein bisschen runter

auf die Krux des Problems,

weil diese zwei Methoden doch relativ ähnlich sind.

Aber interessanterweise,

wenn du das DIR nicht implementiert hast,

fällt der zurück auf REPR, also auf die Representation.

Und die Representation ist in dem Sinne ein bisschen formaler,

weil das heißt, du sollst eine Repräsentation wählen,

die du idealerweise direkt in den Interpreter rein kopieren kannst.

Und das schränkt dich natürlich relativ ein.

Das heißt, da hast du üblicherweise dann sowas wie

eben einen Konstruktor da drin stehen.

Oder eine String-Repräsentation des Konstruktors.

Die Stereo-Methode soll einfach nur eine menschenlesbare

Beschreibung dieses Objektes sein.

Und die kann dann natürlich auch was anderes sein.

Also zum Beispiel für diese Vektorklasse,

da hat er als Representation halt

den Namen der Klasse, Vektor 2, Klammer auf,

dann die beiden

Koordinaten und dann Klammer zu.

Und das ist gut,

weil das kannst du direkt reinkopieren,

das identifiziert genau diese Sache.

Als Strill-Methode,

hat er jetzt hier kein Beispiel im Buch drin,

würde ich aber tatsächlich

was anderes wählen. Ich würde entweder

je nach Kontext

vielleicht eckige Klammern wählen

oder in einem mathematischen

Kontext vielleicht sogar runde Klammern.

Genaue Spitze-Klammern, Entschuldigung.

Oder vielleicht sogar runde, je nachdem,

welchen Kontext es hat. Und da hat man natürlich einfach

mehr Freiheit, weil das einfach eine

menschenlesbare

Darstellung dieses Objektes sein soll Und ich tendiere eher dazu die Strill zu implementieren und die Argumente

die hier der

Luciano uns gibt,

die

lassen mich jetzt doch auch tendieren, dazu

eher Rappern zu...

Also das ist sozusagen die Regel, die man da mitnehmen

kann, ist halt, wenn man

sozusagen sich entscheiden

muss, dann lieber eher nur die Rappermethode

implementieren, nicht unbedingt Strill.

ja, und das war mir auch

nicht so in der Feinheit

klar, was jetzt da der genaue Unterschied

oder Sinn dahinter ist und das weiß ich jetzt

voll gut, weiß ich schon wieder mehr.

Ja, das war gut, oder?

Ja.

Ja, ja, ja.

Ich war etwas überrascht, als ich das

Buch angefangen habe, weil das erste Kapitel schon

ordentlich rangeht.

Ein Fingerbuch, hat Jochen gesagt.

Nein,

das ist auf jeden Fall ein fortgeschrittenes Buch

und der macht auch keine

Pausen. Der geht direkt weiter

hier. Zwei

Klassen mit Operatoren, also das ist diese

Deck-Klasse und die Vector-Klasse

und dann macht er noch Bool

Implementierung und dann geht es gleich mit der

Collection-API weiter.

Auch das, sehr interessant.

Sehr interessanter

Abschnitt über die Collection-API, wo natürlich jetzt

mehr an Details drin ist, die

ich weder präsent hatte, noch jetzt

so präsent habe.

Ja, also jetzt muss man was trotzdem mal kurz

einmal aufräumen, bitte.

Ja, dafür ist das Buch halt, also das Buch ist schon

dicht, okay, ich gebe es zu, aber dafür ist es halt

auch nicht so lang.

Ja, das stimmt.

Die nächste Lüge.

975 Seiten.

Aber es ist ein Taschenbuchformat,

also kann man locker auch in die Tasche

stecken, ist auch relativ klein.

961.

Also vielleicht 18 mal 20 Zentimeter.

Ja, also das ist auf jeden Fall

doch die Größe, die man sich locker unter das Kopfkissen

legen kann. Damit sich von automatisch

lernt, ja. Du kannst dein Kopfkissen

ersetzen, kannst du das mit dem Buch.

Ja.

Ja, aber

tatsächlich, also diese,

da ist sogar ein UML-Diagramm.

Das muss ich sagen, weil ich so fast ein bisschen

abgeschreckt bin. Oh, jetzt kaufe ich es auch.

UML-Diagramm, oh Gott, oh Gott, oh Gott.

Aber ja, an der Stelle macht es tatsächlich Sinn.

Ja.

Dominik und ich,

wir blättern jetzt gerade für die Zuhörer.

Ja.

Genau, da gibt es halt

einen UML-Digramm von der Collection

API.

Was ist jetzt die Collection API? Ich habe es immer noch nicht genau verstanden.

Bitte wiederhol das doch nochmal.

Ja, also die ist

Was ist überhaupt eine Collection?

Worum geht es da?

Meta-Tools?

Da geht es darum, wie

grundsätzlich quasi

Objekte in

Python irgendwie so

funktionieren, die eine Collection von irgendwas sind.

und das sind halt die allermeisten.

Das sieht jetzt hier nicht so aus, das sieht nach irgendwas Speziellem aus,

aber das sind halt die allermeisten,

sowas.

Und da gibt es, also Collection

selber,

damit es eine ist,

also

damit es eine ist,

quasi müssen drei Sachen

irgendwie

implementiert sein. Also es gibt halt drei Methoden,

die sozusagen

dann ein Ding zu einer Collection machen

und das ist halt...

Iter? Iter, ja. Du kannst halt

irgendwie drüber iterieren.

Also einen Iterator bauen, einen Generator,

der irgendwas yieldet.

Nein.

Es muss halt irgendwie...

Fast. Mal ganz generell,

so eine Collection ist einfach

eine Sammlung von anderen Sachen.

Eine Sammlung von anderen Dingen.

Und um das zu ermöglichen,

gibt es jetzt hier diese verschiedenen Interfaces, die der Jochen

jetzt gerade...

Es muss ein Iterable sein, ja, und dann?

Es muss nicht, aber kann.

Doch, muss eigentlich.

muss, damit man irgendwie eine Collection ist.

Also ist this a part of your collection?

Wie viel bist du denn?

Und gib mal mehr von dir.

Von allem, was in dir drin ist.

Wenn ich über alles iteriere,

dann habe ich alles drin, was drin war.

Alles Toys.

For everything in collection.

Ist das so?

Muss ein Iterator über alle

drüber gehen?

Ich denke nicht.

Wenn du das implementierst,

dann kannst du da drin ja machen, was du willst.

Das kann jetzt auch von irgendwas anderem

abhängig sein, was das...

Du musst nur das ITER-Protokoll erfüllen.

Ja, genau.

Du musst nur das Protokoll erfüllen.

Ein nächstes rausgeben.

Ja, ja.

Also immer dasselbe.

Diese pathologischen Edge Gib mir mal alle deine Dinge Ich will das erste Nee du kriegst das erste Du kriegst doch das erste Nein darfst immer das Erste Immer das Erste Nee nee du rufst ja das Iterable ist ja du rufst immer Next auf dem Iterable Ach das ist doch ein kleiner Wartegang

Das heißt, du kriegst immer ein nächstes Element.

Aber das bedeutet nicht, dass du alle kriegst.

Und das bedeutet auch nicht, dass du alle kriegen kannst.

Es gibt ja diese pathologischen Edge-Cases,

die man immer in Einführungsveranstaltungen macht,

dass man sagt, hier, wir machen jetzt mal was Iterable.

Und das berechnet einfach die nächste Primzahl.

Es gibt ja alle Primzahlen.

Aber das ist natürlich keine Sammlung, die je aufhört.

Was ist denn da unter der Primzahlen-Iterin?

Unterschied, Joachim.

Mit dem Generator und dem

Next und dem Yield und dem...

Naja, also Iter ist halt die

grundsätzliche Geschichte. Das ist halt das,

was du brauchst, wenn du vor irgendwas in irgendwas

sagst. Ja, ein Generator

ist halt nicht so allgemein.

So ein Generator heißt halt dann

sozusagen da

kriegst du halt

eins nach dem anderen dringend.

Also wenn ich jetzt irgendwas iteriere, ist es was anderes

als ein Eins nach dem Anderen?

Also sagen wir mal so,

Generator ist nochmal eine speziellere Geschichte.

Das hat halt irgendwie, das ist jetzt

nicht das Gleiche, wie irgendwie was,

über was du iterieren kannst. Das ist was anderes.

Ein Generator implementiert ja.

Ein Generator implementiert das

Iterable-Protokoll.

Ja, genau. Also ist schon

Iterable ein Generator, aber es ist ja eine sehr spezielle

Art von was Iterable.

Aha.

Aha, okay.

Aber eine Liste ist auch irgendwie was

iterables, aber das ist kein

Generator, gar nicht. Nein? Nein.

Als Comprehension schon? Also wenn du eine List

Comprehension schreibst, kriegst du eine Liste zurück.

Du kannst den Generator-Expression

hinschreiben, dann kriegst du einen Generator, aber das ist wieder was anderes.

Also, ja.

Aber

interessant finde ich halt, dass das halt

reicht. Also diese drei Dinge,

also wenn du halt die, wenn du die

Danner-Methods iter, len und

contains implementierst, dann hast du halt

ein Collection quasi.

Und dann gibt es halt noch die eine

zusätzliche Geschichte, die halt

sozusagen dann daraus

etwas nochmal was Besonderes macht.

Das ist halt Reversible.

Wenn das irgendeine

Reihenfolge hat, dann ist es halt

eine Sequence.

Aber das ist halt das, was das unterscheidet.

Also eine Sequence kann halt irgendwie beliebig sortiert werden.

Das macht es halt besonders.

Und das klassische

Beispiel ist eine Liste.

Wenn man Sequence sagt, kann man immer an Liste denken.

Und genau, ansonsten ist halt ein Dikt,

ist halt auch ein Collection, ist halt ein Mapping sozusagen.

Ein Set ist keine Liste, aber ein Set ist schon eine Collection.

Genau, das ist der dritte Basistyp.

Aber keine Sequence.

Also das sind dann die Basistypen, die sie da ableiten.

Sequence, Mapping und Set.

Und die drei verhalten sich unterschiedlich.

Und daraus, das sind aber die Dinge, die man dann einsetzt.

Also diese Bausteine, also ein pures Iterable, ich meine, geht prinzipiell schon.

Oder ein pures Sized, wüsste ich nicht, dass ich das schon mal gesehen habe.

Aber natürlich Sequence und Mapping und Set, das sind die Sachen, die man dann tatsächlich benutzt.

Weil da hast du dann die Bausteine zusammengesetzt zu dem, was man tatsächlich einfach braucht.

Das, was dann sinnvoll ist.

Und da kann man dann auch Beispiele sagen.

Also ein Beispiel von einem Iterable könnte ich jetzt nicht unbedingt sagen.

Also von einem puren.

Ein Huhn.

Ein Huhn von einer Sequence ist easy.

Ein Huhn ist ein Iterator.

Legt ein Ei, legt noch ein Ei, legt noch ein Ei, legt noch ein Ei.

Ja, das

wüsste ich jetzt nicht, wenn man es in Python

implementiert, aber ja.

Es gibt

auch Hühner in Pythons.

Dann ist halt die Frage, was war zuerst da?

Das Ei oder das Huhn?

Wenn du eine große Schlange hast, kannst du

ja mal einen Huhn reintun und dann schauen, ob es

iteriert. Ich habe letztens irgendwo

so ein Schaubild gesehen, wo ein Biologe meinte

sowas, so eine Quatschfrage.

also wir malen hier einfach mal

so diesen evolutionären Schlamm auf und da haben wir

überall Eier, aber nur da ganz

unten ein Huhn.

Natürlich war das ein zuerst.

Völlig triviale

Frage.

Okay.

Genau und Mapping, ich meine das kennt man auch,

das ist ein Dictionary und Set kennt man auch, das ist ein Set

und das sind dann die Sachen, die man tatsächlich benutzt.

Aber diese Protokolle, also das, was

die tatsächlich an Funktionalität anbieten,

das ist hier zusammengesetzt

aus diesen ABCs, aus den

AbstractBaseClasses.

Benutzt die das eigentlich immer?

Der Trick ist, dass wenn du

diese ABCs implementierst, dann

genau wie vorhin bei den Special Methods

oder bei den Magic Methods, dann kannst

du dich in den Python-Interpreter so rein integrieren, wie

wenn du ein Dict wärst oder eine Liste

oder was auch immer.

Also dann habe ich ein Interface implementiert.

Kann man das so sagen?

Ja, es heißt hier nicht Interface, sondern Protokoll.

Aha, das heißt vom

Typing Protokoll kann ich das dann benutzen?

Das ist nochmal eine andere Geschichte, aber ja, das funktioniert dann, das ist eine andere Art, das zu machen.

Aber das macht quasi, deswegen, also AppStack-Base-Klasse, ja, braucht man das?

Also du kannst, also das Problem bei der AppStack-Base-Klasse, das funktioniert halt anders.

Es ist halt sozusagen, das hatten wir in der Typing-Episode auch, es ist halt sozusagen nominatives, nominative Typisierung sozusagen in dem Sinne, dass du jetzt bei jedem Ding, das du erzeugst,

dass du von so einer Abstract-Base-Class erbst,

sagst du halt genau, was es ist.

Und das ist das, weil

du es davon erbst.

Bei Protokoll nicht, weil es kann nicht das sein.

Deswegen ist Protokoll eigentlich viel flexibler für sowas

und auch viel besser geeignet.

Ja,

aber es hat dann natürlich auch wieder

Nachteile. Naja, wenn du sagst, es muss

eine Collection sein, die da reingeht, dann ist doch scheißegal,

was für eine Collection das ist.

Wenn du das Protokoll der Collection erfüllst

und die dann, des Mappings

oder des Sets oder sowas, und da ist irgendein Set,

das da rein muss, aber du sagst halt, es muss halt diese Sachen

da drin haben, die im

Protokoll definiert sind, also in

den Methoden, die man für ein Set halt braucht.

Genau, aber was sagt der damit?

Ja, aber dann ist das doch okay, aber da muss ich doch keine

Abstract-Base-Klasse verwenden, das ist irgendwie

komisch. Doch, klar.

Das ist ja genau die Formalisierung davon.

Du erbst von dieser Abstract-Base-Klasse,

dann hast du erstmal nichts umgesetzt, dann implementierst

du die ganzen Sachen. Nein, Protokoll.

Dann wirst du zu einer Collection. Deine Klasse

ist eine Collection. Dann kannst du es auch

überprüfen. Wenn du nur im Typing

sagst, das entspricht dem, dann hast du es nicht

überprüft. Wenn du Protokoll-Dings machst, dann würdest

du sagen, ist Collection, also ist Instance

of Collection, sagt dir halt,

nee, eher nicht.

Was du dann machen

kannst, ist halt,

dein statischer Type-Checker kann immer

noch Fehler finden.

Mein Linter sagt mir halt, ja, nee, aber

der will jetzt ein Collection haben und

nichts anderes. Ja, aber wenn da jemand anders

ein ist Instance auf deinem,

was auch immer das Ding ist, irgendwie

aufruft, dann kriegt der nicht und sagt, ist das ein Collection?

dann kommt er zurück, nur ist es nicht.

Ja, okay, weil das kein hartes

Geerbe ist. Weil es ist nicht wirklich eine Collection

in dem Sinne. Ja, man interpretiert nur das Protokoll

als wäre es eine Collection.

Genau, also das ist quasi die

Formalisierung davon. Du gibst

es technisch rein und sagst, das ist eine Collection.

Glaubst du der Sprache,

die das übergibt,

oder glaubst du deinem Linter, der dir sagt,

das könnte passen oder nicht?

Naja, es hat halt alle so Vor- und Nachweise.

Den Linter glaube ich überhaupt gar nicht. Ja, aber warum will ich denn

niemals testen, ob es Instance of Collection ist?

Ich will nur wissen, ob das lintet, weil es die

Methoden implementiert und ich will, ob es

Instance auf, keine Ahnung, meine

Superliste...

Da gibt es ja schon

Use Cases dafür, dass du sagst, okay,

ich will wissen, ist Instance Platten...

Ich habe eine Funktion, die alles Mögliche

verarbeiten kann, muss ja schon eventuell

auf unterschiedliche Arten drücken. Nein, aber ich will wissen,

ist Instance Buch, weil wenn ich nach der

Bücher-Collection gucke und ich will niemals

wissen, ob es eine Collection von

irgendwelchen abstrakten Dingen ist, deswegen ist es

Bullshit, das mit abstrakten Base-Classen. Meiner Meinung nach

dass du noch nie eine Bibliothek implementiert hast,

die so eine Funktionalität anbietet,

ist jetzt schade,

aber so ist es.

Ich meine zum Beispiel,

wo das halt häufig auftritt,

also wo ich das kenne mit den,

dass man halt irgendwie, es gibt halt viele Methoden,

zum Beispiel nehmen wir jetzt bei Data Science Geschichten

irgendwie sowas wie

Data Pipelines oder irgendwelche Modelle oder so

und da

kommen halt manchmal so wirklich

komische Sachen rein und

ich

habe auch schon viel

Scikit-Learn-Code zum Beispiel gelesen und so.

Viele Methoden oder

viele Funktionen, die fangen an mit

also, sag mal, bist du

eigentlich ein sowas? Oder bist du

vielleicht sowas? Und dann machen sie halt unterschiedliche Dinge, je nachdem

was das dann ist. Und

das ist halt teilweise, das ist wirklich lang

am Anfang. Und

ja, ich wüsste jetzt nicht, wie man das

anders machen könnte, außer so. Also

also, ja.

Eine Sorte Funktion, die man auch häufig sieht in Bibliotheken,

ist, wo du entweder einzelne Elemente reingeben kannst

oder gleich eine ganze Sammlung.

Und dann musst du halt auch am Anfang dieser Funktion

in der Implementierung unterscheiden können,

ob du jetzt gerade ein einzelnes Element in der Hand hast

oder ganz viele einzelne Elemente.

Und da musst du schon irgendwie eine formalisierte Unterscheidung machen.

Da hilft dir auch der Linter nix, weil der geht ja zur Laufzeit nicht.

Also es macht schon seinen Sinn, diese Sachen so zu deklarieren,

insbesondere, wenn du eben hier solche,

sage ich mal, grundlegenden Funktionen

implementierst. Man kann

das auch zu weit treiben. Wenn man das zu weit treibt,

dann kriegt man Java.

Ja.

Und man muss

da eine Balance finden.

Ja.

Aber es ist, um

wieder darauf zurückzukommen, es ist schon interessant, dass das

eigentlich so relativ simple Sachen sind.

Also hier dieses UML-Diagramm ist eine

Viertelseite und es stehen

ja wirklich nicht viele Sachen da drin.

Es sind nicht viele Methoden, die man umsetzen muss.

Ja, und das ist halt irgendwie

quasi, also die meisten

oder viele Leute werden sich niemals aus diesem

Universum von dem, was da definiert ist,

rausbewegen, weil damit

quasi fast alles erschlagen ist, was man so normalerweise

so tut. Das ist schon faszinierend, dass das geht, ja.

Ja, außer

Skalare, okay, die stehen da jetzt auch nicht drin.

Ja.

Ja, und dann ist

das erste Kapitel ja schon fast vorbei, dann haben wir noch hier

die der Dunder Da wird einmal nochmal komplett alle aufgef Sch so v ohne Zusammenhang hier mit Metaprogramming und Abstract Base Classes und Attribute

Descriptors und Attribute Management.

Also da

ist es interessant,

da reinzuschauen, was es alles gibt, aber ich wüsste

jetzt nicht bei allen, was die tun.

Was ist der Unterschied zwischen GetAttribute und GetAttribute?

Ja, es kommt

in Kapitel.

Also das eine

ist irgendwie nochmal ein Stückchen

allgemeiner, glaube ich, als das andere.

Ich glaube, Get Utter ist halt das

wirklich ganz allgemeine Ding und Get Out

Reboot ist halt, guckt halt wirklich

ganz tief runter.

Das eine ist näher dran, oder?

Also Get Utter kannst du auch

Methoden überschreiten. Genau, die Frage ist halt,

wann, welches Dick das reinguckt, wenn du guckst.

Aber

so ganz genau weiß ich das jetzt auch alles nicht.

Oder Init Subclass.

Wüsstest du, was Init Subclass macht, Johann? Oder Prepare?

Ich weiß es aus einem

sehr interessanten,

wir haben ja auch schon die Wechsel-Trips.

In der Subclass, das ist halt

der Grund, warum Leute Meta-Klassen

verwenden, ist eigentlich der, dass sie halt

irgendwie die Klasse-Instanzierung ab und zu

mal so ein bisschen modifizieren wollen. Und fast

alle Use-Cases lassen sich, also

Meta-Klassen selber zum Benutzen ist super

viertelig. Man muss extrem aufpassen,

was man da tut.

Und daher

ist das halt so ein bisschen auch in Verruf geraten

und Leute raten einem davon immer, das zu machen.

aber genau,

man kann,

wenn man jetzt

in eine Subclass verwendet, dann kann man fast alle

Anwendungsfälle, für die Leute normalerweise so Metaclassen

verwenden, halt damit hinkriegen

und hat all diese Probleme nicht,

die man halt sonst so kriegt, wenn man Metaclassen verwendet.

Und das ist

eingeführt worden mit Python 3.6

und ich weiß das halt nicht deswegen, weil

ich sowieso immer alles weiß, sondern in dem

speziellen Fall,

in dem speziellen Fall,

weiß ich es, weil...

In diesem Fall weiß ich es, weil

den Pep dafür hat irgendwie...

Wir hatten ja Martin hier auch mal zu Gast, der

irgendwie dann diesen X-File-Rondgen-Laser

geschrieben hat. Und den Pep zur Einführung

von In the Subclass, den hat er geschrieben

und ist damals in Python 3.6 reingekommen.

Ja.

Deswegen hast du natürlich ganz besonders... Okay, dann habe ich jetzt das Falsche gefragt.

Dann sag mal, was Subclass-Check macht

ja auch. Weißt du mal alles? Ja, siehst du.

Weiß ich nicht. Keine Ahnung. Ja, okay, gut.

Also das kommt dann in einem späteren Kapitel

und da sind auch MRO-Entries.

Also ich meine, dass man da sein MRO

bearbeiten kann, das ist ja schon hart.

Kann man sich einfach sagen,

ich bin jetzt trotzdem ein bisschen tiefer

implementiert und ich bin jetzt einfach type.

Ja, keine Ahnung,

ich weiß es nicht.

Wir werden es im Laufe

dieser Vortragsreihe

eine Type vielleicht lernen.

Ja, genau.

Aber was mich auch überrascht hat, ist,

oder machen wir jetzt das ganze Buch heute.

Genau, ja.

das wird jetzt ein bisschen dauern, ihr müsst jetzt

einmal anschneiden,

Türen schließen.

Was ich auch irgendwie

nicht erwartet hätte,

ist, dass halt so viel Zeug

sich um arithmetische Geschichten

und Operator-Overloading

handelt, also mehr als die Hälfte.

Und das wäre mir jetzt auch,

hätte ich jetzt nicht gedacht, wenn man mich jetzt

nachts geweckt hätte und gefragt hätte,

welche Magic-Messages gibt es und was mache ich so,

dann wäre ich jetzt bei sowas wie

Repre oder irgendwie

genau Bool oder weiß ich nicht, sowas gewesen.

Augmented Bitwise Arithmetic.

Ja, aber...

Ja, es ist auch, es geht in beide Richtungen

und dann gibt es mit Integer und dann gibt es mit Reversed

und dann gibt es mit Augmented und dann gibt es mit Bitwise

und mit Reversed und Augmented.

Also das gibt es alles in drei verschiedenen

Varianten jeweils.

Sonst sind es ja nicht so viele, aber

es...

Ja.

Ja, ja, ja.

Ja gut, Mathematik regiert die Welt.

Ja.

das, das, ja.

So ist es.

Ja.

Ja, dann, das ist doch interessant hier.

Und am Ende seines Kapitels hat er immer

noch einen Soapbox

Abschnitt. Eine Seifenkette. Den finde ich auch sehr

schön. Ja, ja, genau, wo er sich hinstellt

und mal ein bisschen predigt. Und das, das fand ich

tatsächlich auch sehr schön.

The Art of the Meta

Object Protocol.

Großartiger Buchtitel und

habe ich mir jetzt auch mal auf meine Liste

Das musst du nochmal genau erklären, bitte.

Ja, ich weiß es auch nicht, ich habe es auch noch nicht gelesen, aber ich fand den Titel gut genug, dass ich es mir direkt auf meine Leseliste gesetzt habe.

Was ich viel interessanter fand noch, war ganz am Ende was, wo er sagt hier, der Autor, der dieses Amob-Buch geschrieben hat,

der hat Aspect-Oriented Programming entwickelt oder getrieben.

Und ich habe es dann mal auf Wikipedia nachgelesen, was Aspect-Oriented Programming ist, aber nicht so richtig verstanden.

Also Aspekt ist auch irgendwas mit Magie, oder?

Da geht es entweder Wasser oder Feuer

oder

Irgendwas mit gegen die Muggel Ja vielleicht ich wei es nicht Ja muss uns mal jemand erkl Ich w gerne mehr wissen wie es geht Aber da sind auf jeden Fall in dieser

Soapbox sind schöne Pointer drin, wo man dann

dem

geneigten Leser als Übungsaufgabe

überlassen werden.

Vielleicht werden die Designer von Go irgendwann das

Meta-Objekt-Protokoll erweitern.

Aber das ist im Moment nicht das, was man

auf dem Niveau

mit dem man in Python arbeiten kann.

Genau, das ist halt das, was wir hier

dann sagt, in anderen Sprachen hast du diese,

hast du die Möglichkeit nicht. In Go gibt es

tatsächlich Magic-Sachen, weil die halt

im Interpreter drin sind, kommst du auch nicht dran, kannst nichts machen.

Und

Pech gehabt. Und das ist

in Python eben nicht so. Deshalb hier

Muggel-Methods. Kannst du,

jeder kann da hingehen und die Finger drauf

legen und dann so tun, als ob er zu Python

gehört.

Du wolltest damit einen exklusiven

Kreis aufmachen, lieber Johannes.

Du musst nur die magischen Worte

wissen und in der richtigen Reihenfolge sagen und

deinen Zauberstab in der richtigen Bewegung schwingen.

Ja, du musst aber schon noch in jede Ecke vom Raum schon eine Kerze

reinstellen und so.

Das ist dann,

das ist Metaprogramming, was du da meinst.

Und Metaklasse.

Man muss immer ein bisschen aufpassen, was man damit sich

heraufbeschwört, wenn man zu viel

Meta macht, dann das kann auch.

Zu viel Magie.

Ja.

Wie sagt man?

Merry meet, merry greet.

And Marry Me Again.

Wegen des Heraufbestandes.

Erster Kapitel war

nicht so lang. Nö, ich war überrascht.

Es fängt

ordentlich an

und ist dann aber nach 19 Seiten

schon vorbei.

Fand ich überraschend.

Er legt ordentlich los und macht dann aber gleich

direkt eine Pause.

Ja, ja.

Danach kommen dann jetzt Sequences

und... Ja, das ist ja deutlich

länger.

Da hatten wir schon mal drüber gesprochen.

Wir können einfach ein bisschen weiter...

Ja, Pattern Matching ist ja auch sowas, das haben wir auch noch nie

wirklich ausführlich besprochen.

Das sollten wir vielleicht auch mal tun.

Jetzt gibt es dann Kapitel 2.

Das ist dann, das ist tatsächlich

etwas über 60 Seiten lang. Das ist dann gleich

deutlich länger. Tja. Aber ich meine,

wenn man auf 980 Seiten kommen will,

muss man halt...

Ab und zu mal eine filmen.

Mal ein Kapitel machen.

Wie viele Kapitel gibt es denn?

Gar nicht nachgeguckt.

Ich habe einfach losgelesen, ohne zu lesen, wie viele Kapitel es gibt.

Ja, du hast doch viele.

900 Seiten. Hast du ein bisschen Platz?

24 Kapitel gibt es.

Ah ja.

Hätten es 25 sein sollen? Oder wie ist eine andere von den magischen Zahlen,

wenn man auch in die richtige Stelle kommt?

Nee, 24 ist doch gut.

Das ist eine

Abundant Number, oder?

Das ist doch eine, wo die Summe der Teile

größer ist als die Zahl selbst.

Okay.

Ist doch immer gut.

Ja, jetzt kommen die Mathe-Nerds raus.

Okay, kann ich auch noch nicht.

Ja, da habe ich eine Buchempfehlung

dazu, wenn dich das interessiert.

These Wonderful Numbers.

Da ist quasi zu jeder Zahl sind die Eigenschaften beschrieben.

Das ist ein sehr

nerdiges Buch für nerdige Mathematiker.

einfach keine Angst haben,

die Dunkelheit länger ins Auge zu schauen.

Je älter man wird, desto mehr versteht man davon auch.

Ach ja, als Mathematiker hat man da keine Angst

davor.

Hat auch wieder was mit Magie zu tun.

Worte der Weisheit.

Spezielle Art von Magie.

Genau.

Da wir die ganze Zeit von Magie reden, würde ich gerne

meinen Pick tatsächlich nehmen.

Ja.

Ich nehme tatsächlich noch einen Europe Heisen Talk,

weil

der liebe Rodrigo einen

sehr schönen Talk gemacht hat

über so Turtle.

Kennt ihr vielleicht. Auch ganz magische Sachen

macht das. Das kann Dinge auf die

Leinwand malen,

die sich drehen, spiralen. Und

dann kann man das erweitern, auch zu Fraktalen.

Und damit kann man animierte Fraktale

für Live-Performances

zum Beispiel schreiben.

Und zwar relativ einfach,

indem man so einfache mathematische Prinzipien

Und da war ein toller Talk zu und er hat auch einen schönen Blogpost dazu geschrieben.

Deswegen würde ich den gerne mal in die Schuhe umzudenken.

Okay, okay.

Okay, gut, cool, spannend.

Ich habe heute zwei Pics dabei.

Der erste Pic ist ein Buch ähnlichen Ausmaßes wie Fluent Parsons.

Ich halte mal hier die Kamera für die anderen beiden.

Oh, okay.

Als es kam, ist es ein tatsächlich ähnliches Format.

Das heißt Django 5

by Example

von Antonio Mele.

Und ich glaube,

dass das ist wie Fluent Python nur halt f Django Ach sehr cool Ganz frisch mit Django 5 Ah Weil also hier ich habe es leider noch nicht durchgelesen Es ist wie gesagt auch dieses Buch hat 750 Seiten

ein bisschen weniger, aber trotzdem ein ähnliches Format.

Was ist das mit diesen Autoren von Programmierhandmöglichkeit?

Warum müssen die immer so viel schreiben?

Ich weiß auch nicht.

Es ist doch viel Zeit.

Es dauert irgendwas nicht richtig mit denen.

Es gibt viel zu sagen.

Ah ja, gut.

Und ich glaube, der Trick da drin ist halt, dass es by example ist und eben sehr viele einfach handfeste Projekte enthält, wo er sagt, hier, wir machen jetzt mal einen Blog und jetzt machen wir mal noch mehr Blog und jetzt machen wir mal noch mehr Blog und jetzt machen wir mal noch Social Website und Social Authentication und Content Sharing und Online Shop und Tracking User Actions und Managing Payments and Orders and Extending Your Shop und Internationalization und Caching.

Und E-Learning und Content Management und

API.

Das ist, glaube ich, geht so ein bisschen in die

Richtung, wo

auch Fluentpacing hingeht, dass es halt

über die Basics hinausgeht.

Und ich glaube, dass das

eine Lücke in meinem Bücherschrank füllt,

von der ich bisher nicht wusste, dass ich sie hatte.

Und das freut mich sehr.

Also hast du jetzt

endlich Zeit, deinen Dango-Webshop zu

implementieren, von dem du schon die ganze Zeit träumst?

Mein Blog, ich werde jetzt endlich mal meinen Blog

Ja, genau.

Modernisieren.

Generators, das war gestern, jetzt ist es wieder.

Ja, nee, das ist doch langweilig.

Muss dynamisch sein und mit User-Tracking und mit

Payments and Orders.

Ja, das würde ja auch mal

Zeit. Ja, ja, klar.

Roy, Roy, Roy.

Wieder Magie.

Ja.

Der zweite Pick, den ich mitgebracht habe, ist eine

Bibliothek, die heißt Dramatic.

Oder vielleicht heißt sie auch Dramatic Q.

Und das kam auf in einer Diskussion über, was kann man denn statt Celery verwenden? Da gibt es jetzt zwar in Django was, die Background-Tasks hatten wir ja vorhin auch schon kurz erwähnt.

Du hast denselben Mastodon-Social-Thread gelesen.

Ja, offenbar, ja. Und ich habe mir aber die Links rausgeklickt. Und einer, der mir ins Auge gestochen ist, war eben Dramatic, was auch so ein Queuing-System ist, was aber ein bisschen eine pythonischere Syntax hat als Celery jetzt zum Beispiel.

und das sah auf den ersten Blick sehr gut aus

und ich freue mich da drauf, das

irgendwann mal einsetzen zu können.

Ja, bestimmt.

Habe ich mir auch angeguckt, das sank tatsächlich

nicht. Ich hatte noch keine Zeit und habe mir gedacht,

wenn ich jetzt eh noch bis April warten darf,

bis Tango Background Task rauskommt, dann

spare ich mir einfach.

Du kannst es auch jetzt schon verwenden.

Ich meine, es ist noch nicht wirklich dafür gedacht, dass man es jetzt

verwendet, aber

Tango Task kannst du einfach installieren

und dann verwenden.

geht. Ja.

Ja, warum

eigentlich nicht?

Na, kann vielleicht noch zu wenig, aber

ja. Also

ja.

Also ist auf jeden Fall eine gute Idee, dass

wenn man das noch nicht gemacht hat,

einfach mal das auszuprobieren, weil

dann hat man, muss man sich

nichts mehr umstellen, wenn es dann irgendwann

tatsächlich... Ja, also es gibt so ein paar Module.

Wie heißt das? Django Background Tasks tatsächlich?

Ich weiß nicht, dass du... Django Tasks heißt das Paket.

Genau, weil das habe ich gerade Background Tasks gesagt, weil das ist

ein fürchterliches Modul.

Und Django-Task ist tatsächlich

gut im Vergleich dazu.

Und bei Django-Background-Task gibt es das auch und das wird man

schwer wieder los.

Ja, ich verlinke das dann, aber es ist genau...

Es gibt mehrere Module,

die ähnlich benannt sind, die

alle versuchen, was ähnliches zu tun oder

mal so oder so naiv implementiert

sind und dann relativ anstrengend wieder zu enden.

Wie auch immer, also Django-Task ist glaube ich

das, was wir nehmen wollen.

Genau, ja.

Dann packe ich auch noch mal

was ich jetzt, ich habe

ich weiß nicht,

ist auch eher was Spezielleres, was

jetzt gar nicht so viel mit Partnern zu tun hat.

Du warst halt nur auf Shoppingtour.

Aber ich finde es ganz

interessant, weil

ich habe ganz lange jetzt

so Dinge verwendet, wie, also ich habe auch schon mal

also ich mache mal so

Du hast doch erst Geburtstag, Jochen.

Aber ich brauche es ja für was anderes.

Ich habe auch tatsächlich irgendwie

mal vor, mal nochmal wieder. Also ich weiß nicht, ich schaffe

irgendwie, ich wollte mal Videos machen.

Mehr wieder. Und dann

da brauche ich dann natürlich auch entsprechendes Equipment für.

Soll ich jetzt demnächst mal

meine Euro-Recksammlung picken?

Ja, mach das. Ich finde das gut.

Ja, also

wie kriegt man eigentlich quasi Bilder von der

Kamera irgendwie auf den Rechner?

Und ich habe auch schon sowas wie Lightroom verwendet

oder so früher mal. Und dann irgendwann dachte ich mir,

ach, das brauche ich alles nicht mehr. Und dann

habe ich irgendwie teilweise

auch eine Zeit lang sogar Apple Fotos verwendet

und fand das ganz okay, weil ich muss ja nicht viel machen

und es hat geklappt.

Und jetzt geht das aber nicht mehr,

weil die RAW-Files, die aus der Kamera rausfallen,

die mag Apple Fotos nicht mehr.

und

ja

und da gibt es aber

dann vom Hersteller

Nikon gibt es halt Nikon NX Studio

und die kann das

die Software kann dann halt tatsächlich das RAW Format lesen

und das coole ist und das wusste ich gar nicht, dass das geht

das

versteht das so gut, dass es

halt irgendwie auch die

die

also quasi Profile für

alle möglichen Dinge aus der Kamera drin hat

Das heißt, wenn du das halt jetzt in der Kamera schon so

eingestellt hast, dann kriegst du das halt automatisch

mit rein oder sowas, was bei anderen, bei Lightroom

oder so eben nicht kriegst. Und

du kannst auch dann dir deine eigenen Profile

zusammenstellen und wieder auf die Kamera

speichern und dann kannst

du halt Bilder machen, die genauso sind, wie du

das halt, wie

dein Look halt aussehen soll und so.

Das heißt, du kannst den vorher vorprogrammieren.

Ja, ja, also das ist wirklich, also

man kann damit halt Dinge machen, die sonst nicht so richtig gehen.

Das fand ich ganz nett und also

viele Leute schwärmen da auch von, dass das

halt irgendwie mit den Farben richtig umgeht und solche Sachen,

was halt immer so ein Problem ist bei Fotos.

Und das ist alles richtig und das ist wirklich

faszinierend. Das kann mehr, als man so erwartet. Auf der anderen Seite

ist es halt unfassbar schlecht programmiert.

Das ist unglaublich. Also einmal

ist es ultra langsam und dann ist

also man kann es halt nur

so ein paar Minuten lang verwenden und dann

verbraucht man... Das klingt als hättest du noch ein neues Hobby. Du hast ja gerade

schon Computerspiele in Rust programmiert.

Ja, ja, vielleicht zu viel zeitig,

weiß ich genau. Aber

also das leckt halt unglaublich,

was Speicher angeht und

Und das verbraucht halt innerhalb von,

so nach einer halben Stunde sind die 32 GB weg.

Dann muss man es neu starten.

Was natürlich irgendwie echt totaler Quatsch ist.

Hast du nicht genug Speicher oder warum musst du neu starten Nee das ist halt alles Wieso hast du nur so wenig Speicher Jochen Genau so ja Ich bin nicht nur GPU ich bin auch RAM ja Ja nur 32 GB

Ja, ja, ja, schon ziemlich lächerlich.

Ja, muss ich auch sagen, stimmt.

Ja, aber, ja, genau, also da kann man nicht genug,

kann man irgendwie mit dem RAM-Kaufen nicht hinterherkommen,

wenn man halt Software hat, die einfach irgendwie das,

das alles wegfrisst.

Einfach so, ohne Grund, ja.

Jedenfalls, genau, also aber wenn man das sich lange nicht angeguckt hat,

weil man immer dachte, ah, das ist alles furchtbar.

Vielleicht nochmal hingucken, ist ganz interessant, was da so passiert.

Also ich meine, ist auch so ein bisschen ärgerlich,

aber auf der anderen Seite auch faszinierend, was da alles so geht.

Ja, genau.

Tja.

Ja, vielleicht muss ich doch...

Das war jetzt aber schon ein sehr spezieller Pick, Jochen.

Ja, war sehr speziell.

Nochmal was über Foxtrot oder sowas machen wir hier die ganze Zeit,

nur so Mediensachen tun wie mit den Bildern.

Wir sind ja in so einem Medium-Dings hier auch, ne?

Ja.

so Musik, ja, die Musik, die ich mache,

die finde ich meistens sowieso abartig.

Wie der Rest. Ja, ich glaube,

dann sind wir für diese Episode tatsächlich

ausnahmsweise mal früh fertig.

Ich habe übrigens zwischendurch

Kritik bekommen auf die Pieces von Leuten, die den Podcast

hören. Ich meine, es wäre viel zu lang,

es wäre total nervig. Man könnte es gar nicht

mal zwischendurch hören, sondern müsste sich immer so viel

Zeit vernehmen. Man kommt da gar nicht durch,

man hört sich nie zu Ende. Ja, da müssen wir mal ein bisschen...

Also alles, was wir an weitere Kritikanregungen

fragen und so weiter,

hallo-at-pison-podcast.de

Bleibt uns gewogen,

hört uns weiter. Danke Johannes, dass du wieder da warst.

Das nächste Mal gerne wieder vor Ort.

Ich komme

jedes Mal gerne vorbei, wenn ich da bin.

Ja, wir freuen uns wieder drauf.

Ja, danke Jochen und

hört uns bald wieder. Bis dann.

Bis dann. Tschüss.