Transcript: Python Packaging

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast in der 34. Episode heute.

Ja, wir nehmen wieder abends auf, Ausnahmsweise, muss ja auch mal sein.

Schön, dass ihr wieder eingeschaltet habt. Was machen wir heute? Wir wollten ein bisschen was über Pakete besprechen.

Der Jochen ist natürlich wieder dabei und wir haben wieder einen Gast. Hi Jochen.

Und der Gast ist heute wieder der Ronny. Hi Ronny.

Hi.

Hallo.

Ich bin der Dominik.

Ja.

Ja.

Ja.

Ja.

Ja, ich weiß nicht, ob wir wieder Struktur machen wollten, ein bisschen News oder so.

Habt ihr News?

Nee, ich bin zu irgendwie nicht viel gekommen

und habe auch keine Newsletter oder sonst irgendwas gelesen.

Ja, okay.

Also es kam tatsächlich der Copilot

auf GitHub heute raus zum Coden.

Das fand ich ja ganz interessant.

Das ist jetzt keine Python-News, aber...

Ja, man kann sich da anmelden, irgendwie eintragen

in so einer Testerliste.

Es gibt auch ein VS Code Plugin für die Leute, die das nutzen.

Was macht das denn?

Das ist ein Copilot für GitHub,

der, wenn man Docstring schreibt,

automatisch die Funktion baut, der für

verschiedene Sprachen funktioniert. Sieht

ziemlich nice aus. Also so die Demo,

wenn das mal richtig gut funktioniert, irgendwie mit

Machine Learning dahinter wahrscheinlich so ein bisschen,

bleibt einfach ein coolen Docs-Ding und der

baut die ganze Funktion so zusammen, wie er es für richtig hält.

Ja, ich habe das irgendwie, ich habe nur so

ein Animated

GIF auf Twitter oder so gesehen,

wo da jemand bezeichnet Learn, was er gemacht hat und das

sah schon gut aus, aber

ehrlich gesagt, ich würde mir jetzt nicht trauen, dass ich

sage, okay, das tut jetzt genau das, was ich gerne hätte.

Das heißt, man muss den Code dann zumindest nochmal

lesen. Ja, ich glaube, lesen muss man es natürlich schon.

Aber es ist ja relativ super, um wahrscheinlich bekannte

Patterns so zu verstehen. Und auch für

Sprachen, die man vielleicht noch nicht so gut kann, dass man halt so

grundsätzliche Konzepte da sehr schnell mitlernen

kann. Das muss auch super interessant sein.

Außerdem wird man gezwungen, Dokumentationen zu schreiben.

Am Anfang, das ist vielleicht auch gar nicht

so doof. Also es ist halt die Frage,

wohin das hinschaut, wenn das halt nur KI-gesteuert ist,

irgendwann, je nachdem, wie gut die Qualität

heute ist, hier und da zu schreiben, was dann dabei rauskommt.

Ja, das ist

die durchschnittliche GitHub-Code-Qualität.

Ich meine, wenn das jetzt, also

kann ja eine Verbesserung sein.

Ja, genau. Also ich finde es wirklich interessant

und es sah auch echt top aus.

Documentation-Driven-Development.

Irgendwie so, ja.

Specification-Driven-Development.

Ja, also diese Beispiele auf der Seite vom

Co-Piloten da, die sahen echt schick aus, auch in

Python, die es da gab.

Okay, ja, cool. Das ist auf jeden Fall eine Neuigkeit, ja.

Ja, haben wir noch was?

Ich glaube, was hast du gesagt? Python 306?

Ja, egal. Ja, ist heute vor drei

Tagen oder so rausgekommen.

aber ich weiß ehrlich gesagt nicht mehr, was der Unterschied ist, weil mich die Wachsend gerickt

waren. Voll gut, nur so eine Erinnerung, dass man das jetzt mal dann installieren könnte.

Aber ansonsten. Nicht, was passiert. Dann würden wir doch direkt

darauf vorgekommen. Oder fällt dir noch was ein, Ronny? Ist doch eigentlich eine gute Überleitung, so GitHub

Packages. Stimmt. Packages, was ist denn das? Ein Package?

Genau, das ist das Thema. Packaging.

Was ist das? Wie macht man das denn? Wie spricht man das aus? Ganz wichtig.

ein Paket. Also ihr wollt irgendwas machen wie ein Paket schreiben, ein Modul schreiben.

Was ist ein Modul? Und das Veröffentlichen, vielleicht ist Veröffentlichen

eine der Sachen, die man damit machen will mit einem Paket? Oder Wiederbenutzen vielleicht?

Ja, selbst wenn man das nur irgendwie, wenn man einen Code miteinander teilen

will, ist es wahrscheinlich schon eine ganz gute Idee unter Umständen das halt als Paket

zu tun und nicht direkt als Repository.

Das heißt, da können bestimmte Dinge dazu, sowas wie eine Bauanleitung oder sowas?

Ja, also

es gibt unterschiedliche Arten von

Paketen. Das ist vielleicht schon mal so

ein grundsätzliches Ding, mit dem man anfangen kann.

Also es gibt halt zum Beispiel, also oder

weiß nicht, wo wir damit anfangen, oder mit der Geschichte

von Packaging.

Ja, okay, ich bin gespannt. Ich hätte gedacht, es gibt noch

DCPIP, aber tschuldigung.

Da gibt es auch Pakete.

Vielleicht nur so ganz kurz, es ist halt leider verwirrend,

es ist kompliziert und es ist komisch und es ist

alles nicht so einfach in Python leider.

Das hat glaube ich angefangen alles

1998 mit Bistutils

und

das ist auch in der Standardbibliothek, ist da immer noch

drin. Also es geht eigentlich darum, wie gibt ihr

denn euer Programm irgendwem,

der es dann ausführen möchte?

Ja, wie kann man

Code so verpacken,

dass man das irgendwo anders dann halt einfach nur

das Paket installiert und nicht den kompletten

Repository.

Oder der weiß

gar nicht, was für einen Computer der hat oder

verschiedene Herausforderungen.

Genau, und dann irgendwann kamen halt Setup-Tools

dazu, damit

hat man dann zum ersten Mal...

Wenn wir jetzt schon mal wieder bei Python-Podcast noch ein bisschen

einsteigen, was ist denn Distutils?

Genau, das ist halt so ein Ding, um

zum Beispiel,

ja, wenn man jetzt in einem

Verzeichnis ist, wo man den Code hat, daraus irgendwas zu

bauen, was man dann als Paket weitergeben kann.

Und da

kommen auch an so ein paar von den Begriffen, meine ich

jedenfalls her, sowas wie S-Dist zum Beispiel

oder BDist, aber ich weiß nicht,

ob es da schon wirklich dabei war.

Also S-Dist ist halt Source-Distribution

und

sagt eigentlich im Grunde, dass man halt nur

den Code irgendwie ins Paket packt,

also den Source ins Paket packt und dann halt

auf dem Zielsystem halt eventuell noch,

wenn da Extensions, zum Beispiel C-Extensions

oder so drin sind, muss man die dann halt

noch bauen. Also es ist halt noch nicht gebaut,

es sind nicht die pyc-Files, sondern

es sind nur tatsächlich die

.py-Files

und weil

die PYC-Files, das hängt auch von

Interpreter-Versionen ab und so.

Und dann gibt es halt die

BDIS, also die Build Distribution

Pakete.

Und das sind halt irgendwie TAR-Balls

vor allen Dingen gewesen oder manchmal auf Windows

glaube ich auch ZIP-Files, weiß nicht genau.

Aber es ist noch kein richtiges Paketformat.

Und dann kamen irgendwann Setup-Tools dazu

und weiß nicht, irgendwann

Anfang der Nullerjahre, keine Ahnung wann genau.

Und da war das Ziel

halt dann so ein Paketformat zu haben.

Das hatte man dann mit X auch.

aber das war es, was auch mehr oder weniger ein Zipfel war

und inzwischen sind es Wheels

das ist auch mehr oder weniger ein Zipfel

aber

so ein bisschen

sind die Dinge schon anders, also Wheels sind jetzt

deutlich schneller, kann man deutlich schneller auspacken

und verwenden als

X, X werden eigentlich nicht mehr verwendet

dann gab es irgendwie eine Zeit, in der ganz viel rumgeforkt

worden ist und dann sind Dinge

auch wieder zurück nach Setup Tools gegangen

und Setup Tools ist aber nie Teil der

Standardbibliothek geworden

Distutils war es dann aber auch schon immer schon lange

so dass heute ist es halt so

es gibt halt Dinge, die macht Distutils

wenn man ein Paket baut

es gibt Dinge, da benutzt man Setup-Tools für

was ein bisschen komisch ist, weil man

das ist halt nicht in der Standardbibliothek, man muss dafür Setup-Tools installieren

und Setup-Tools hat dann wiederum Plugins

für bestimmte Sachen, wie zum Beispiel wenn man Wheels bauen will

dann gibt es halt das Wheels-Paket

das man dann noch installieren kann und das bringt dann halt

ein Plugin für Setup-Tools mit

womit man dann halt auch Wheels bauen kann

Ja, okay

Das klingt aber so, als geht das halt nicht

out of the box und da brauchen wir schon noch andere Sachen

Ohne C-Compiler geht das wahrscheinlich dann nicht

Doch, also wenn man

zum Beispiel einfach nur

reine Python, also wenn der

Code, den man geschrieben hat, einfach nur

Python-Code ist, dann

braucht man eigentlich sonst nichts zu machen

dann ist auch eine Source-Distribution

im Grunde schon

ausreichend

aber wenn man jetzt halt C-Extensions dabei hat oder sonst

und Jochen unterhalten sich über die Programmiersprache Python

auf einer Maschine mit M1 oder so,

damit ich das mal da bauen kann, weil ansonsten kann man

halt keine Wheels bauen. Das geht halt nicht. Das kannst du nicht auf einer

Intel-Maschine

machen.

Und das ist alles so ein bisschen hässlich.

Und, ah ja, Gott.

Ja.

Es ist kompliziert, leider.

Okay, dann habe ich Wheels gebaut und die kann ich

dann irgendwie auf PyPI stellen und

das wäre heute der Weg. Aber nicht nur die

Wheels, sondern auch Source-Distribution

und Build-Distribution kann man auch auf

PyPI stellen.

und passiert auch oft. Und oft muss man es dann auch selber

kompilieren noch, wenn es halt keine Wheels gibt.

Zum Beispiel, was mir eben,

ich habe jetzt auch hier so ein M1 weg und das

passiert regelmäßig, dass ich irgendwie Pandas oder

NumPy und dann ein Großteil des Zeugs unten

drunter muss halt dann noch kompiliert werden

und das dauert halt relativ lang. Zum Beispiel, wenn

jetzt dann sowas wie Python 3.9.6

irgendwie rausgekommen ist,

dann gibt es halt für Pandas und NumPy noch keine

Wheels und dann wird dann halt schön selber

kompiliert, was dann halt mal ein paar Minuten

dauern kann.

und

einem zur Verzweiflung treibt,

wenn irgendwelche Details in dieser Compile-Pipeline

und irgendwann, wenn der Vortragskompiler nicht richtig

ist oder keine Ahnung, irgendwas

bei der Emulation von

bei der, bei der, das Intel-Prozessor

nicht richtig funktioniert oder so und dann hat man

sehr, sehr komische Fehlermeldungen aus den Tiefen

von irgendwelchen Compiler-Toolchains.

Ja, also tatsächlich auf

anderen Systemen bauen zu

wollen ist dann, oder an neuen Versionen

ist dann vielleicht immer nicht ganz so einfach.

haben. Aber das Gute ist, dass

man ja tatsächlich auch, wenn man jetzt, vor allem wenn man

jetzt mal anfängt, dass man ja dann doch eher in der

reinen Python-Welt bleibt und dass man dann das auch

relativ entspannt einfach

ohne irgendwelche großen Probleme

die Packages erstens bauen kann

und zweitens dann auch die dann auch wieder leicht

installieren kann.

Also man kann sich relativ

viel von diesem Complexities-Overhead sparen, indem man

quasi keine externen Libraries

verwendet oder sowas.

Genau, ja. Also reines

Python ist eigentlich relativ

einfach dann. Also das Einzige, was

halt dann mit in den

Build Distributions drin ist,

sind halt die PyC-Files.

Die was? PyC.

Ansonsten musst du die halt noch einmal von

Py nach PyC verwandeln, aber das ist auch alles...

Das merkt man heutzutage

gar nicht mehr.

Und dann hat man

so ein Paket und dann hat man das auf PyPI und dann kann

jeder das

laden. Ja. Über

PIP oder sowas. Genau.

Ja.

Ja, und die ganze Dokumentation

dazu, ich habe

mich ehrlich gesagt nicht wirklich

vorbereitet, aber ich habe einmal

geguckt,

was gibt es denn,

habe ich irgendwelche Bücher

zufällig, wo was drinsteht über Packaging

und da gab es irgendwie ein Buch

Python Expert Programming, da war ein bisschen was drin,

ein Kapitel und

ansonsten

ja, hier klingeln

Dinge. Das ist immer sowas,

Telefon auf Flugmodus stellen.

Ja, ja.

Wir müssen das alte QP mit dem Hintergrund,

du kennst das noch.

Oh ja, das ist lange her.

Was sind hier der Flugmodus?

Da ist er doch.

So.

Ja.

Genau.

Also die

autoritative Quelle für Dokumentation über

dieses ganze Packaging-Thema

ist

packaging.python.org

also die Python Packaging

Authority, PyPA nennt die sich auch.

Und da kann man

das alles, also die ganzen Details, die ganzen fiesen

Details, die stehen da alle drin. Und

was mich sehr gefreut hat, das ist

genauso aufgebaut wie

es gab da ja, das hatten wir das letzte Mal

auch schon von

documentation.divio.com

Ja.

Also es gibt auch einen schönen

Vortrag eben

von Daniele

Proshida über

wie schreibt man eigentlich

Dokumentationen sinnvollerweise und der teilt das halt

auf in, naja, es gibt halt

unterschiedliche Quadranten und

unterschiedliche Zielrichtungen und

dann schreibt man halt Tutorials, How-to-Guides,

Explanations oder Reference-Documentation

und das kann man alles mit

Pleasure.

Er hat mit dem Vortrag Programming for Pleasure gemacht.

Genau, das war dieses Jahr, das war glaube ich hier

wo er über Dokumentationen Vortrag gemacht hat,

war 2017 oder so.

Kann man sich auch angucken, haben wir letztes Mal schon verlinkt in der

JagoCon Europe Episode, sehr empfehlenswert.

Und was ich halt gesehen habe, ist, dass Pipey

hält sich genau da dran. Da sieht man halt, genau, sie machen Tutorials,

dann machen sie How-To-Guides und dann machen sie irgendwie Discussions

und dann gibt es dann halt irgendwie auch noch eine Referenz-Dokumentation.

Also sie haben das genau so aufgeteilt und sich daran orientiert,

das fand ich irgendwie...

Dokumentation ist auch sowas, was ich irgendwie zu wenig tue.

Ja, du sagst ja auch immer, guter Coach spricht für sich selbst.

Genau, braucht man das alles gar nicht.

So ein Quatsch, Dokumentation.

Ich versuche tatsächlich

alle Sachen, die ich wahrscheinlich wieder vergesse,

so aufzuschreiben, dass

da auch jemand anders, der das vielleicht liest,

dann auch noch machen könnte.

Man ist selber in einem halben Jahr und freut sich.

Ja, genau.

Das ist immer ganz nett.

Man ist auch schneller beim zweiten Mal, wenn man halt einfach seine eigene Doku lesen kann

und sich nicht immer komplett von neuem irgendwo

einarbeiten muss.

Ich finde tatsächlich, dass man auch mit inneren Dokumentationen sehr viel gewinnen kann.

Ja.

ein bisschen faul.

Aber das ist eigentlich gar nicht das Thema.

Ja, aber

ich meine immer

ja, also wobei, ich weiß nicht,

bei Dokumentationen innerhalb von

Source Code oder Kommentare

in Source Code finde ich immer ein bisschen schwierig.

Also es kommt darauf an, was es ist. Manchmal auch natürlich

stellen, wo das total sinnvoll ist, aber manchmal ist es halt auch echt,

weil das tendiert auch dazu, dann irgendwie so

auseinanderzulaufen. Also warum man so

bestimmte Sachen macht, die irgendwie komisch aussehen, dass das vielleicht

manchmal gar nicht so schlecht ist.

Nee, genau, genau. Durchaus sinnvoll.

aber

ja, von

wie heißt der noch?

Dingsdar

Dingsdar

CleanCode

Uncle Bob

der sagt ja immer, das erste was er macht, wenn du durch Code gehst, ist halt

die ganzen Kommentare entscheiden

weil sie verwirren nur

weil, ja

aber es kommt halt

drauf an, also ich meine, es gibt halt so die Fälle

wo es klar ist, dass es verwirrend ist, aber es gibt

halt auch die Fälle, wo es total sinnvoll ist

Ich finde, das kann sehr viel Vertrauen schaffen.

Also wenn ich ein Package mir angucke

und ich überlege,

ob ich das nutzen möchte und vielleicht auch produktiv nutzen möchte

und da ist halt gar nichts dokumentiert,

dann habe ich direkt schon mal so ein großes Fragezeichen im Kopf,

ob ich das wirklich nutzen möchte.

Wenn das gut strukturiert ist, gut dokumentiert ist,

dass das lesbarer Code ist,

vernünftig aufgeräumt ist, das macht schon echt viel aus.

Ja.

Ein bisschen moderner Stil. Wir haben ja alle so einen gewissen Taste

mittlerweile.

Ja.

Ja, aber wir

Wir sind gerade bei Dokumentation gelandet,

aber wir sind ja über Packaging

dahin gekommen.

Wir haben jetzt gesagt,

Setup-Tools des Utils,

PIP,

es gibt noch irgendwie dann so bestimmte Sachen,

die man dann braucht, was wie eine Setup-Pi,

oder ich habe gesehen, man kann sowas auch mit Poetry und dann Pi-Project-Hummel

jetzt so ein bisschen basic

einrichten.

Das ist doch mal...

Ja, also wie man jetzt

zum Beispiel die Metadaten zu einem

Paket.

Ah, Moment, man braucht Metadatentime-Paket natürlich.

Ja, ja, also zum Beispiel so was simples wie

wie soll das Paket heißen?

Das muss man ja irgendwo hinschreiben.

Und da gibt es halt mehrere Methoden.

Ja, das, was man,

ich glaube, das ist auch das älteste Setup-Py.

Also da ruft man halt Setup auf und

irgendwie die ganzen Parameter sind im Grunde alles

mehr oder weniger Argumente

dieser Funktion.

Das ist sehr dynamisch und so.

Da kann man natürlich tolle Sachen machen, da kann man dann

so Sachen reinschreiben, wie man holt sich

die Version von dem Paket

aus irgendeiner Init-Py in dem Paket

selber oder solche Sachen.

Aber auf der anderen Seite

macht das halt

der Infrastruktur drunter

das sehr, sehr schwer, dass das so dynamisch ist.

Und...

Bei Project Home ist das ja auch ähnlich.

Es geht ja mit Poetry, wenn man damit arbeitet, auch so

Bildbefehle. Und da kann man ja auch die

Version direkt reinschreiben und einen kleinen Doxing reinschreiben

und den Namen reinschreiben und so ein bisschen

sich überlegen, was denn da

stehen soll in dem Paket.

Ja, ich weiß jetzt gar nicht so ganz genau, wie das bei Poetry

dann tatsächlich darunter funktioniert. Also ich habe es schon benutzt,

aber tatsächlich ist das für mich so ein bisschen

eine Blackbox irgendwie. Poetry

tut dann irgendwas und dann fällt ein Paket

raus. Also der

Standardweg, wie man das mit

Setup-Tools

macht, ist dann setup.cfg

wo man dann halt so

statische Metadaten drin hat

und keine Setup.py mehr verwendet.

Das ist auch das, was empfohlen wird. Also die ganzen Leute,

die sich da um dieses Python-Packaging-Ding

kümmern, die sagen alle, oh mein Gott, bitte, bitte,

bitte verwendet Setup.cfg,

das macht uns das Leben so viel einfacher.

Setup.py ist für uns ein Riesenproblem

eigentlich. Also ich glaube, Setup.cfg

ist viel davon, ist auch in PyProject.toml

da gewandert. Genau, also

PyProject.toml ist mehr oder weniger ein neues Format

dafür, ja. Und das ist halt die aktuellste

Art, wie man die Metadaten

sozusagen erfasst. Und das ist halt auch

Standard, ich glaube das ist

PEP

518 oder sowas,

glaube ich.

Ja, also das wandert jetzt alles in

PyProjectHummel rein und dann kann man das mit

Poetry, wertet das dann halt irgendwie aus und baut das dann.

Ob Poetry dann nochmal Setup-Tools

unten drunter verwendet, weiß ich jetzt ehrlich gesagt gar nicht.

Aber es gibt dann auch mehr Tools.

Also Poetry

gibt es, es gibt aber auch, ich glaube das ist

habe ich in letzter Zeit

viel Gutes drüber gehört, ist Flit.

Oh, Flit?

und es liest halt auch PyProjectHummel aus

und baut halt Pakete

und vor allen Dingen benutzt es halt

nicht, glaube ich, nicht SetupTools,

sondern macht das alles selber und es benutzt auch

nicht Vine, um dann hinterher die Pakete

hochzuladen, sondern macht das auch selber.

Das ist halt so eine komplett integrierte Geschichte.

Was heißt Flit? Das Symbol ist ein

Kolibri. Ich frage mich, ob das auch Flit tut.

Ich weiß jetzt nicht, wo der Name

herkommt. Keine Ahnung.

Also ein einfaches Modul, um Packages auf PyPy

zu bekommen.

Kenne ich auch nicht.

Klingt spannend.

Ich habe es jetzt letztens davon gehört,

also ich hatte schon mal vorher davon gehört,

aber jetzt nochmal ausführlicher

in einer Podcast-Episode

Talk Python to Me, wo

nicht Talk Python to Me, haha, falsch,

Test & Code, glaube ich,

Brian Ocken, der hatte

da Brad Cannon

zu Gast und

der halt

auch für diese PyPA

irgendwie wesentlich zuständig

ist und

ja, der sagte also, er benutzt auch selber

Flit und das würde ihm sehr gut gefallen,

weil es halt einfach schnell

und so und macht das, was es soll.

Während Poetry,

ich verwende ja Poetry normalerweise,

aber ehrlich gesagt so manchmal, ich hatte das jetzt auch

ich glaube in dem Stream,

wo ich da so Live-Sachen

gerade irgendwie entwickle,

da habe ich

ich habe dann irgendwann mal das

Virtual-End-Fact schmeißen müssen und dann

habe ich nochmal als irgendwie

neu von PyPI gezogen

und Pootree

Update gesagt oder Install, ich weiß es gar nicht mehr genau.

Und dann hat das tatsächlich geschlagene

300 Sekunden

Dependencies aufgelöst.

Wo ich dachte so...

Das passiert, seitdem es das Async macht.

Ja, mir geht das an einen zu erscheinen auf die Nerven.

Da ist irgendwas richtig kaputt, weil

das darf nicht...

Ich kann mir nicht vorstellen, wie das irgendwie...

Welchen Grund es dafür

geben könnte.

Ich meine, so viele Pakete sind es nicht.

Vielleicht 50 oder so, die da drin sind, Abhängigkeiten.

Und dass das dann irgendwie,

also selbst ein paar Sekunden wäre viel zu viel,

die Abhängigkeiten da aufzulösen.

Wie kann das sein, dass das 300 Sekunden braucht?

Irgendwas ist da...

Oder es braucht es halt irgendwie, wenn es ein Netzwerk macht,

das kann natürlich auch sein,

und PyPI überlastet ist oder so,

vielleicht würde PIP auch so lange brauchen.

Aber Poetry bringt ja einen eigenen Resolver mit

und macht das halt nicht über PIP.

Aber offenbar ist das irgendwie nicht so ganz okay.

also Poetry hat mir schon so ein paar Mal

irgendwie tatsächlich echt

ich dachte so, okay, da ist irgendwas

nicht in Ordnung, insofern

Also falls ihr schon immer mal Open Source entwickeln

wolltet, scheint es, es gibt da ein paar

Pulverquests, die notwendig sind.

Keine Ahnung, vielleicht muss ich mal reingucken, was da los ist,

aber irgendwas, also das, da

kriege ich auf jeden Fall, wenn ich sowas sehe, kriege ich einen Schreck,

weil das finde ich ja so, oh, das ist ein Tool, auf das ich mich

verlasse und das macht komische Dinge

und

das hat auch so, was mich auch bei

Poetry so ein bisschen

wo ich auch dachte, ach das ist nicht so schlimm

aber das hat dann doch

macht auch immer wieder Probleme

ist halt, dass man

das gibt es bei den Setup-Tools

man kann Python Setup

py-develop ausführen

oder halt pip-i

und damit halt so eine editierbare

Version von einem Paket installieren

das halt, wenn man es entwickelt, super praktisch ist

und das geht mit Poetry

geht das nicht. Also geht einfach

gar nicht. Und was meinst du mit

editierbare Version installieren? Also da lädt quasi

seine lokale Datei

als Symblink

in... Ja, ja, ja, genau.

Es ist nur tatsächlich im

Virtual Env landet dann halt nur so eine Art Link

und sobald man den Code ändert, dann

muss man halt nicht irgendwie nochmal

neu das Paket installieren, sondern das ist halt

dann die geänderte Version vom Code

ist dann halt direkt da. Das ist tatsächlich

ein ganz, ganz wichtiger Punkt, den ich auch lernen

musste, wenn man mit einem Package arbeitet,

und Jochen unterhalten sich über die Programmiersprache Python

Ich habe gehört, Portree sei besser, keine Ahnung.

Ne, weiß ich nicht.

Naja, auf jeden Fall, ich bügele

das dann halt einfach nochmal, also alles mit

Pip installiert und so und dann einfach manuell nochmal

mit Pip dann das drüber bügeln, um diesen

Sim-Link zu machen und damit kann man dann sehr, sehr

entspannt und sehr cool, dann auch mit zwei

verschiedenen IDEs einfach, im einen

ändert man halt dann den

Package, was man gerade, oder den Source-Code des Packages,

im anderen hast du quasi deinen richtigen

Django-Web-Server oder was auch immer

dein Projekt macht und

das ist sehr, sehr convenient und da muss man

erst mal wissen, was man suchen muss.

Also du hast auch schon mal so ein paar

Pakete gebaut. Ich glaube, das hast du auch

bei GitHub hochgestellt.

Genau, ja. Ich habe vor ein paar

Jahren die

Ownership von dem Package übernommen

oder Maintainership von dem Package übernommen.

Das habe ich auch schon mehrfach

am Rande mal erwähnt auf ein paar Blog-Einträgen

und sowas. Das ist dieses wunderbare AI

Django Core Package.

Das ist entstanden

aus. Wir hatten

in der Frühzeit unsere Geschichte, also bei

AI hat nichts mit künstlicher

Intelligenz zu tun, etwas misleading.

Haben wir gemerkt, dass wir halt irgendwie

ganz praktische Sachen gebaut haben und dass man die halt

irgendwie immer vom Projekt zu Projekt kopieren ist doof.

Und da so, ja, machen wir mal ein Package

und dann ist es halt einfacher zu installieren.

Und hat man auch ein bisschen, wenn man mal einen Bug gefixt hat,

dann ist dann halt die Jahre.

Also für die verschiedenen Projekte, das heißt, du kannst in jedem

Projekt einfach sagen, okay, den Kone nehme ich jetzt immer mit und habe

die Basisfunktionalität. Genau, ohne dass man es halt kopieren

muss und hat halt dann keine Code-Renundanzen und so was.

Und wie gesagt, wenn man einen Bug fixen möchte oder irgendwas

Ja, vor allem, das ist halt blöd, wenn man halt irgendwas weiterentwickelt,

ein neues Feature, und dann muss das in jedem einzelnen Projekt

wieder nachbauen, das ist natürlich nicht so gut. Genau, das ist sehr mühsam.

Genau, und dann haben

wir uns dann, dann ist da halt

über Jahre dann so

Einbahnstraßen-mäßig da halt Code hineingeflossen.

Auch dann irgendwie gab's

dann irgendwann mal diesen großen Break, wo dann wirklich

alle von Python 2 weg sind.

Und dann waren da noch Python 2 Sachen drin, Python 3 Sachen

und dann irgendwann

habe ich mir das mal zur Brust genommen ich glaube das war so 2018 ungef habe ich mal angefangen zu gucken was ist da eigentlich drin weil ich da selber auch ziemlich viel kontrib habe weil ich halt oft Sachen gebaut habe wo ich dachte ach das ist cool das w ich im n Projekt auch gerne nutzen

Oder das, keine Ahnung, zum Beispiel Richtung Test-Setup oder so Sachen, die einfach das Ganze ein bisschen streamlinen und ein bisschen mehr so machen, wie ich das für richtig halte.

Dann habe ich irgendwann mal angefangen zu gucken, was ist denn da eigentlich alles drin und wie gesagt, da waren Kompatibilitätsprobleme und da war anfangs noch kein Linting drin und die Dokumentation, es war nichts dokumentiert.

und Jochen unterhalten sich über die Programmiersprache Python

und das habe ich die letzten Jahre halt dann angefangen und habe dann da in verschiedenen Wellen und Steps

ja, was gemacht. Also zum Beispiel super wichtig für mich

oder ein super wichtiges Learning für mich war, dass man ein Change Log macht, allein schon für einen selbst.

Ich habe keine Ahnung, was ich vor, also ich mache ungefähr

alle ein bis zwei Monate einen Release, also irgendeine Art von Release.

Kann mal ein Mad Release sein, wenn ich irgendwas Größeres wirklich rudimentär gemacht habe oder halt

was Kleineres, aber so ein bis zwei Monate. Das heißt, da kommen einige Releases

zusammen über die Zeit. Und wenn man

dann mal irgendein größeres

Projekt hat und das hochziehen möchte und denkt,

ich brauche jetzt dieses neue Feature, das da drin ist

und man nicht weiß, was man seitdem denn alles geändert

hat und nicht weiß, wie man sein

Projekt, dass man das aktualisieren möchte,

wie man das möglicherweise kaputt macht, das ist echt blöd.

Aber das geht ja dann auch direkt Richtung

wie vergibt man Versionsnummern

und was ist da?

Semantik-Versioning, glaube ich, habe ich gehört,

ist da en vogue.

Macht man das noch?

Ja, naja,

nicht, also ich weiß halt...

Wie immer lustig ist.

Ich guck mal...

Ich hab grad

einen Artikel,

der Semantic

Versioning won't save you.

Ja, also es kann ja zum Beispiel sein, dass man eine neue

Major Version rausbringt, so von 2 auf 3

oder sowas, dann gehen Dinge kaputt.

Das sind wir ja vielleicht nicht.

Ja, also genau, da gibt es einen sehr schönen Blogartikel

von

Hüneck, Heineck,

Schlawack, Semantic Versioning

will not save you, der ist auch jetzt, genau, der ist von Anfang März, den habe ich mich nicht erinnert.

Ja, leider ist das auch alles, also ich meine, es ist vielleicht besser als nichts, aber es ist halt,

es ist alles irgendwie...

Vielleicht, was ist das denn? Was ist denn Semantikwürfling? Was macht man denn da?

Naja, dass man sozusagen so ein bisschen, also nicht nur das hochzählt, sonst könnte man ja einfach

nur noch eine Zahl hochzählen, sondern dass da halt eine Bedeutung dran hängt, dass man zum Beispiel

so eine Dreiteilung hat.

Macht man bei

Setup-Tools auch oft so, dass man da

irgendwie dann Tuples verwendet, damit das klar ist, welche

und dann wird es halt, dann oft hat man dann

halt irgendwie Major-Version.minor

. irgendwie

Patch-Release oder so

und in den Patch-Releases sollten halt nur

Bugs gefixt sein, minor

sollte vielleicht kommen, vielleicht Features dazu,

aber es wird die

Abwärts-Komfortibilität nicht gebrochen und dann bei Major-Versionen

kann man halt irgendwie

eine neue App benutzen oder sowas.

Ja, kann man es halt inkompatibel machen.

Und oft sieht man das dann auch, dass Leute

das dann halt in, ja,

wenn sie halt ihre Abhängigkeiten definieren, dann so

reinschreiben, also alles, was größer ist,

größer gleich dieser meiner Version

zum Beispiel, sodass halt sie

kleinere Updates oder auch Features noch

bekommen oder halt alle Security-Patches, aber

halt nicht, dass die Kompatibilität

nicht gebrochen wird.

Nur das Problem ist natürlich, dass

tatsächlich garantiert ist halt auch ein Bugfix

kann natürlich die Kompatibilität brechen, wenn man sich

auch verlassen hat, dass sich etwas so verhält, wie es derzeit tut

und das aber ein Bug war.

Das ist natürlich insofern...

Ja, aber...

Bei 0.9.0.20, das ist auch super.

Ja.

Das gab ein sehr schönes Beispiel, das war

vor, ich glaube, einem Jahr,

vielleicht eineinhalb Jahren, zwei Jahren,

da hatte Flake 8 ein neues

Patch-Release rausgebracht.

Also die haben ja, glaube ich, von, weiß ich nicht,

0.96 auf 0.07 oder sowas

und haben da aber einen neuen Check eingebaut,

der nämlich gecheckt hat, ob F-Strings Variablen

enthalten. Und wenn du dann F-String ohne Variablen

hast, dann ist es rausgeflogen

und plötzlich sind halt dann bei diversen

Projekten geht die Pipeline nicht mehr

also ich hab da nichts geändert, was ist denn jetzt los?

War halt mit Star-Import einfach im

PIP-File und ja, blöd

Tja

Wie gesagt,

vielleicht hätte das schon vorher das überprüfen sollen

aber es war halt ein Bug und hat nicht funktioniert

haben sie den Bug repariert und schon

hast du auf einmal ein komplettes

komplett anderes Ergebnis und plötzlich ein Breaking-Change

in einer Pipeline, aber trotzdem.

Ja, dafür ist dann Push wieder ganz gut,

wegen der Log-File, wo es halt dann genau

die Penalties print.

Ja, ja, auch eben, weil

falls halt irgendwie andere Dinge,

also einfach um reproduzierbare

Umgebungen zu bekommen und auch

wenn jemand es schafft, irgendwie

malicious Pakete irgendwo hinzulegen,

das ist ja auch so etwas, was dann zumindest

sehr überprüft wird, dass der Herrscher stimmt und so.

Ja.

Würde dich auch nicht davor retten, wenn da schon ein malicious Paket drin wäre,

und was soll ich immer wieder erledigen?

Nee, das hast du schon verloren, genau.

Wenn es halt jemand später schafft, genau.

Ja, ja.

Ja.

Aber tatsächlich bin ich jetzt auch ein großer Freund,

dass ich eigentlich alle Abhängigkeiten,

die ich habe, wirklich fixiere,

weil ich bin da schon zu oft auf die Nase gefallen mit,

weiß ich nicht, irgendwie Celery,

das Monitoring-Tool Flower hat eine Abhängigkeit zur Tornado,

die haben im Bugfix-Release irgendwie

ein Attribut deprecated und rausgenommen

und plötzlich steht man dann da und nichts mehr geht

und das komplette Async ist tot.

Das ist halt bitter.

Ja, ist schon doof.

Ich habe gerade ein Problem mit einer Pipeline,

weil

das irgendwie so doof gebaut wird, dass da Abhängigkeiten

zu Docker drin sind, dass aber

das System dann doch abhängig funktionieren

muss. Also das heißt, wir nehmen dann, weil wir auf einer

Windows-Maschine das aufbauen müssen,

PyWin mit rein und das installiert

sich natürlich nicht auf der Windows-Maschine, weil das

dann in den Dependencies mit drin hängt. Das heißt,

ich muss in der Pipeline das Blockfile wegschmeißen.

Hätte man sich auch direkt sparen können.

Verlasten, dass man halt

das Dependency-Resolving vernünftig funktioniert.

aber naja, da muss man halt auch wieder dann manuell pinnen, aber das geht dann schon irgendwie.

Ja, aber solche Sachen, das ist halt wirklich hässlich dann, aber ja.

Da gibt es keine richtig gute Lösung für, ne?

Also wie baut man denn jetzt Python so zusammen, dass es immer vernünftig funktioniert,

immer wieder auch in zwei Jahren noch irgendwo und das ist ein bisschen blöd irgendwie.

Also auch wenn man jetzt, ich nehme jetzt noch dieses Windows-Beispiel,

wenn man jetzt da eine Executable erzeugen möchte,

denen man Leuten gibt, die eigentlich gar kein Python können oder auch Programmieren nicht können oder sowas,

sondern die wollen einfach ein Programm haben, was sie ausführen können, was dann auf Python läuft und bestimmte Dinge tut.

Das bei denen auf den Rechner zu bekommen, das ist gar nicht so einfach.

Aber darum gibt es ja auch Websoftware. Das ist ja genau der Grund, dass man diesen Knatsch halt nicht mehr hat.

Ja gut, aber es gibt ja auch da verschiedenste Lösungen, wie man irgendwie so ein großes Paket zusammenspült,

wo man dann alles mit reinpackt und die Dependencies mit reinpackt und den Compiler mit reinpackt und so,

dass das dann halt selbstständig irgendwie aufgebaut werden kann.

Ja, kann man schon. Also ich meine, PyInstaller ist halt wahrscheinlich vielleicht so die populärste.

es gab ja einige

NUCA, PyOxidizer

wir hatten ja auch schon ein paar Mal drüber

inzwischen, wenn man auf die Tools

guckt, das sind PyOxidizer und so

das ist schon wieder alles verschwunden

aus den Empfehlungen

hat sich wohl dann

PyInstaller ist irgendwie erstaunlich konstant

ja, aber ich habe es noch nie richtig

funktioniert einfach nicht so wie man will, wenn man zu viele

extra Dependencies hat, das ist auch nicht schön

ja

kein einfaches

Problem, leider

Ja, aber

was macht man da? Also Paket bauen?

Ja, du sagst Web-Anwendung.

Ja, Web-Anwendung. Oder ich meine, klar, Docker-Image dürfte

schon relativ haltbar sein.

Ist natürlich so ein bisschen verschwenderisch.

Solange es Docker noch gibt.

Ja.

Ja.

Aber,

tja, ich habe auch keine

Lösung dafür. Meine Lösung ist,

nicht auf Systemen unterwegs sein, wo das

ein Problem ist.

Es gibt halt Leute, die halt andere Systeme nutzen,

das ist ja klar und wenn die darauf

relyen und wenn man von bestimmten

Konzernen, die halt dann bestimmte Policies haben

die man nicht verstehen muss, aber wo man das natürlich

dran halten muss. Die haben bestimmt 1998

Sinn gemacht, dass die jemand eingeführt hat.

Ja, also die sind auch veränderungsresistent

also da würden ja ganze Abteilungen sich als

Renewant erweisen vielleicht

aber wenn die so lange nicht gut verdienen, ist das halt

nicht notwendig, da irgendwas zu ändern

das ist halt dann so.

Ja, aber wie gesagt

also nochmal zur Versionierung zurück

ich mache tatsächlich auch dieses Semantic Versioning

Man kann halt damit wenigstens versuchen, dass man halt dem Nutzer, den man ja meistens nicht kennt, so ein bisschen den Pain zu nehmen, wie man mit Updates umgeht. Weil jedes Update, je nachdem wie groß das Projekt ist und auch wie stabil das Projekt ist, Stichwort Testing und sowas, kann das ja auch mit ziemlich viel Kopfzerbrechen verbunden sein, irgendwas überhaupt hochzuziehen.

und bei dem habe ich

jetzt halt gesagt, hey, wir machen ein Semantic Versioning

und da versuche ich mich auch sehr dran zu

halten, also darum habe ich jetzt auch schon in

den Jahren jetzt vier

Major Releases gemacht, weil

Python halt irgendwie komplett alles auf drei umgestellt ist,

halt ein Breaking Change, muss dann hochgehen, da kommt es halt nicht

drum rum. Fühlt sich manchmal so ein bisschen

verschwenderisch an, wenn man denkt,

schon wieder, das ist nicht so viel Code, aber

ja, und man kann halt

einfach nur hoffen, dass man es den Leuten halt möglichst einfach

macht, weil das Problem ist, da sitzt dann nachher

am anderen Ende der Welt jemand, der möchte genau das Package verwenden oder nutzt es im schlimmsten Fall vielleicht schon

und dann macht man ihm plötzlich was kaputt, der hat keine Chance, das irgendwie vernünftig zu erreichen,

zumindest nicht direkt und da sollte man

schon gucken, dass man das so stabil wie möglich baut.

Ja.

Ja, ist auf jeden Fall nett.

Ich glaube, manchmal machen Leute auch so ein bisschen zu viel

Google Schwurbel um, es muss

backwards kompatibel sein für

bis in alle Zeiten.

Ich finde es vollkommen okay zu sagen,

das Ding geht jetzt kaputt, wenn du das so nutzt wie vorher,

aber die müssen es halt wissen.

Es wäre schon nett, wenn man die

Versionsnummer dann vielleicht Major ändert.

Wenn jemand halt blind irgendwie drei

Majors hochgeht und sich dann ärgert, dass es nicht geht,

ja gut. Wie gesagt,

ich meine, manche Projekte haben ja leider wirklich kein

Change Log oder so ein ganz rudimentäres.

Da ist man wirklich angeschmiert, weil du kannst es halt nicht wissen.

Wie machst du das Change Log und wie schreibst

auf, schreibst du dann vor jedem Commit oder lässt du aus den Commit-Messages automatisch dein Login?

Ich mache das tatsächlich zu Fuß. Also da gibt es ganz viele Tools.

Ich fand das Stand irgendwie nicht dafür, weil wie gesagt, wenn ich irgendwas

mache, dann weiß ich ja, was ich mache und dann kann ich es auch einfach kurz ins Change-Logger.

Es ist einfach ein Markdown-File.

Es ist clean, vernünftig, deine Arbeit zu dokumentieren.

Ja, und vor allem, das sind ja auch Stichpunkte. Ich meine, inzwischen habe ich Dokumentation, da kann ich gleich noch was dazu sagen.

Auch ein Thema für sich.

aber

also ich habe einfach ein Markdown-File

und da ist halt, das ist halt eine lange Liste, wo

dann halt drin steht, hey, am so und sovielten

habe ich diese Version released und das hat sich geändert.

Ich habe da irgendwie, weiß ich, drei Rechtschreibfehler

in der Dokumentation gefixt, die Funktion ist neu

und die Funktion hat neun Parameter.

So und dann, das ist halt, das dauert eine Minute,

das zu schreiben, ich weiß ja, was ich da tue.

Und wenn ich jetzt sage, ich sammle ein paar Kleinigkeiten,

wo es sich nicht lohnt, ein Release zu machen, weil ich es gerade nicht so dringend

brauche, dann habe ich halt einfach so ein

Current, temporäres Ding

oben drin stehen und dann, wenn ich halt

fertig bin, dann sage ich, okay, das gebe ich

dem Namen, also sprich eine Versionsnummer und dann

habe ich die Sachen einfach schon zusammengeschrieben,

wenn von mehreren Seiten was, oder wenn mal

auch von Kollegen oder so ein Pull-Request reinkommt oder

sowas.

Das ist auf jeden Fall ordentlich.

Also ich tatsächlich

bin da halt einfach gebranntes Kind, weil ich es halt schon

zu oft hatte, dass ich denke, ja kacke, kann ich das

noch verwenden, kann ich es nicht verwenden so?

Also ich frage mich gerade, ab wann ich mit sowas anfangen würde,

weil ich würde jetzt zum Beispiel in der ursprünglichen

Entwicklung jetzt damit noch nicht anfangen, ChangeDocs zu schreiben, wenn ich

jetzt noch nichts habe, was richtig fertig ist und was funktioniert.

Wahrscheinlich bei Person 1.0

würde ich sagen.

Oder sobald halt Leute anfangen, das zu verwenden.

Was du natürlich auch nicht so genau weißt.

Ja, sobald du was

einigermaßen Nutzbares irgendwie hast.

Ja, genau.

Ja.

Ja, ja.

Ich mache das,

ja, ich überlege gerade, ob ich weiß, was ich so mache.

Und dann denke ich mir so, oh nein, ich breche es drauf und die kommen

an die Schulzeit.

Ich meine, es kommt doch immer darauf an, wenn das halt so ein Mini-Ding ist, also gut, selbst das kann irgendwie an eine zentrale Stelle eingebunden sein, aber zum Beispiel jetzt das Package, an dem ich jetzt arbeite, das ist halt eigentlich, das ist halt so eine Toolbox und ich bin eigentlich gar kein großer Fan, dass man so diese, sagt, hey, hier ist so ein Haufen von Zeug, das du so querbeet in dein Projekt einsetzen kannst.

Der Werkzeugkoffer bräuchte ich im Schrank. Da hängt auch alle möglichen

Schraubenschlüssel rum. Jeder hat seinen eigenen Werkzeugkoffer

mit eigenen Schraubenschlüsseln.

Da tauscht man zu selten aus.

Da sind aber die Farben, die hat man sich selber zusammengesucht.

Man weiß selber, wo man in der Kiste was findet.

Aber wenn jemand anders an diesen Werkzeugkoffer reinguckt, dann...

Ja.

Ich finde es eigentlich cooler, wenn man das...

Ich meine, da muss es nicht auf JavaScript-Level gehen,

wo jeder zwei Zeilen ein eigenes Package ist.

Das ist manchmal ein bisschen krass.

Aber wenn man die Sachen vielleicht auch ein bisschen...

Sagt man so, würde ich jetzt das Package nicht geerbt haben,

sondern würde es jetzt neu machen.

und sagen, hier dieser Code, der soll irgendwie Packages,

würde ich das wahrscheinlich nach gewissen Use Cases

strukturieren.

Das ist ja auch so ein Klassiker,

das haben ganz viele Firmen.

Ganz viele Firmen haben ein Paket, das heißt so wie die Firma.

Oder sie haben halt ein Paket, das heißt dann

irgendwie wie die Firma plus Core.

Das heißt halt Core.

Das ist ganz, ganz typisch.

Aber wie gesagt,

ich habe irgendwie ganz viele Sachen gebaut,

die mir bei Unit Tests helfen.

Dann würde ich sagen, hey, das ist dann jetzt das

Ambient Unit Test Paket oder so.

und dann alle Sachen, die haben irgendwas berechnen oder die irgendwas mit dem View-Layer zu tun haben,

weil viele Projekte laufen bei Django inzwischen auch headless,

das hat dann auch gewisse Dependencies, die man ja sonst nicht reinholen muss,

das ist dann auch nur das ein eigenes Paket.

Ich habe das jetzt mit Extensions tatsächlich gemacht,

weil am Anfang war es auch so, dass auch die ganzen Dev-Dependencies wurden alle mit installiert immer,

weil damals mir gar nicht so bewusst war, dass man das irgendwie trennen kann.

Ich habe das dann einfach irgendwann übernommen und so ein bisschen umstrukturiert

und dachte, okay, cool, funktioniert, wird schon passen.

aber man kann ja tatsächlich sagen, dass man

verschiedene Extensions macht, also das kennt man, wenn man

das aus dem Requirements

oder so, das ist so eine eckige Klammer, wo dann irgendwie

bei Celery kann man es mit SQS oder mit

Rabbit oder keine Ahnung welchen Extensions installieren

und da kann man natürlich auch sehr schön

die Dependencies wegkapseln, weil du kannst zum Beispiel sagen

hey, also zum Beispiel in meinem Fall ist

es jetzt, ich habe diverse Sachen, die halt nur

fürs Django Template Layer interessant sind,

also ein Middleware und sowas und da sind halt

ein, zwei Dependencies drin, die ich in anderen Cases nicht brauche.

Das heißt, ich kann einfach hingehen

und sagen, hey Leute, also die ist dokumentiert,

sagt, hey Leute, das ist das Standardpaket, das ist so

das normale Shit, den man so mit Django machen

kann und wenn ihr jetzt

irgendwas spezielles Julia haben wollt, das ist

hier dokumentiert und dann müsst ihr halt noch

die Extension mit installieren und dann kriegen die halt

auch die

Penalty.

Ja, das ist halt auch die Frage, bietet man den Leuten direkt

das volle Rundum-Sorglos-Paket an, dass die ja nicht

so viel Aufwand haben und das alles lesen müssen und

alles nachinstallieren müssen oder

macht man das halt sehr modular?

Also ich sag mal so,

und Jochen unterhalten sich über die Programmiersprache Python

Sachen sonst nachher in so ein Projekt rein, die man eigentlich gar nicht

haben möchte.

Genau, ich habe jetzt hier gerade nochmal

das letzte Paket, das ich irgendwie

gebaut habe, reingeguckt.

Das ist Django Fire Response.

Oh, da hast du auch in deinem Stream

einiges dran gearbeitet. Genau, da habe ich

jetzt bis letzte Woche noch was dran gemacht.

Falls ihr es noch nicht mitbekommen hattet, in der letzten Folge hatten wir

erwähnt, dass der Jochen jetzt nämlich auch streamt.

Relativ häufig und da könnt ihr zugucken, was der die ganze Zeit

für Unsinn anstellt und wie man dann so entwickelt,

wie man das sein macht.

Ich finde es eigentlich, es sieht cool aus.

und ja, wirklich.

Danke, danke, danke.

Genau, ja, technisch gar nicht so schlecht, glaube ich.

Inhaltlich muss ich noch ein bisschen feilen, glaube ich.

Nein, andersrum, weil ich finde auch tatsächlich, dass es inhaltlich

interessant ist, was man da alles so umsetzen kann.

Ich baue das gerade so ein bisschen nach, ehrlich gesagt.

Also, Feilresponses fand ich sehr interessant.

Ja, also, wo ich

tatsächlich noch Schwierigkeiten, ich merke das, das habe ich auch heute wieder

gemerkt, tatsächlich, was mir

schwerfällt und was ich nicht so gedacht hätte, nicht erwartet hätte,

also, wenn ich irgendwie so

an den Projekten rumentwickle und ich

weiß aber, das können sich Leute

nachher angucken, dann tendiere ich dazu zu sagen,

so, ah, jetzt gut, jetzt müsste ich

da jetzt mal tief graben oder irgendwie

versuchen rauszukriegen, das wird voll langweilig und ich muss

ganz viel probieren und ich habe absolut keine Ahnung, ob ich damit

irgendwie eine halbe Stunde fertig bin oder so und jetzt

kann es sein, dass sich Leute einfach eine halbe Stunde lang

fürchterlich langweilen und es ist

fruchtlos und dann, also das

merkt man, weil normalerweise würde mir das halt

nichts ausmachen, mir macht das ja Spaß,

und dann probiere ich halt rum und wenn es

halt geht, super, wenn es nicht geht, naja.

Also ich muss sagen, also mir macht das dann auch Spaß, weil dieses Rumprobieren,

das kriege ich dann ja mit und da lerne ich auch

mal was bei und ich glaube gerade dann, wenn man halt nicht

alles so perfekt vorher schon weiß,

sondern es so ein bisschen rausknobeln muss und man ist ja quasi

mit live dabei, das ist ein bisschen vielleicht wie ein Podcast,

durch dieses rausknobeln, das du ja

dann machst, dann knobelt man selber so ein bisschen rein

und man kommt halt tiefer in die Thematik rein

und man hat ein tieferes Verständnis für die

Zusammenhänge und das ist unheimlich wertvoll

dann, deswegen sollte man das auch so tun.

Ja, das ist tatsächlich vielleicht eine interessante Geschichte,

dass man genau dabei Leuten halt zuzutun,

aber wenn man das macht oder

für mich war das überraschenderweise so,

und Jochen unterhalten sich über die Programmiersprache Python

selber kurz draufdrücken, dann hast du einen

großen, sensierten Teil, dann kannst du wieder freischalten

und dann, okay, geht wieder.

Ja, genau, wird sich schon

irgendeine Methode finden. Kennt ihr das aus

Starship Troopers, wo es dann kurz diesen Zensur-Python gibt und in den Hintergrund

werden die Kühe dann zu den Elfen gegessen?

Ja, und hinten werden die Gedärme fliegen, genau.

Ja, das stimmt.

Das ist eine gute Idee.

Da fliegen noch nicht genug Gedärme in dem Stream.

Das ist wahr.

Genau, da habe ich ja dieses Django

FireResponse-Paket gebaut.

Da habe ich etwas verwendet, was ich jetzt vielleicht dann

auch nur aus Spaß

habe ich

MBDev, was in der Data Science-Welt

so ein bisschen verbreitet hat.

Vielleicht nochmal ganz kurz, das hast du auch schon mal

erklärt, aber MBDev ist quasi entwickeln mit dem

Notebook, aber das Notebook quasi

das bei dem Paket automatisch mit den Dokumentationen

und so erzeugen kann. Genau, also das

eigentliche Ding, was das so interessant macht, ist, dass man

so ein bisschen Literature Programming

machen kann und halt Dokumentationen,

Code und Tests irgendwie

direkt zusammenstehen hat.

Und daraus dann halt sozusagen aus den Notebooks

wird dann das Paket erzeugt

oder das Modul, also der Source-Code

erzeugt und

aus dem Source-Code wird dann ein Paket gebaut

und das geht auch tatsächlich, ich habe jetzt nochmal nachgeguckt, weil ich

es gar nicht mehr wusste, aber ja, das macht das per

Setup.py und da hat

man halt auch eben

da schreibt man halt rein

extra Require

zum Beispiel und

kann dann halt, das sind einfach

und Dict und dann kann man da beliebige Dinge reinschreiben.

Zum Beispiel, was ich jetzt da nur drinstehen habe, ist halt

Dev und dann Dev Requirements, aber man kann halt

auch eben alle möglichen optionalen

Geschichten mit angeben, die man dann halt installiert oder nicht.

Und da wäre es zum Beispiel so,

dieses Django File Response-Dings hat selber praktisch

keine Abhängigkeiten,

aber wenn ich jetzt

die Dev Requirements da mit reinnehmen würde,

dann wäre das ziemlich übel,

weil dann würde der ganze NBDev-Kram mitkommen,

zum Beispiel. Es würden

Jupyter Notebooks mitkommen, es würde Pandas mitkommen, es würde

NumPy mitkommen, es würde irgendwie so

das halbe Deadline-Unternehmensumgang mitkommen.

Ja, und auf dem Web-Server hast du, wo du das Django verwenden willst, hast du das ja gar nicht.

Und plötzlich wird dann wahrscheinlich irgendjemand da vor einer Konsole sitzen und denkt sich,

warum kommt da jetzt ein Fortran-Compiler mit?

Und warum dauert das eine halbe Stunde, bis das kompiliert ist?

Ja, genau.

Nicht so gut.

Aber vielleicht noch mal kurz zur NBDEV.

Wie baut man denn quasi sein normales Notebook in ein NBDEV um, damit es halt dann auch als Paket...

mit.

Muss ich da quasi ein anderes Notebook nehmen

oder kann ich einfach Jupyter Notebook nehmen?

Das ist Jupyter Notebook, aber das einzige,

was man da braucht, ist im Grunde

dieses, man muss

mbdev installieren und dann halt mbdev

build lib und dann hat man so ein paar

Metaanweisungen

sozusagen für mbdev in dem Notebook selber.

Das heißt, das ist eine Extension für das eigentliche Notebook

und wo man dann quasi ein bisschen anders strukturiert,

als man das macht?

Das ist keine Extension, sondern es liest es einfach nur.

Und wenn man da sowas

reinschreibt wie Kommentar und dann Export

oder Default Export.

Diese Sachen werden dann ausgewertet

und werden dann benutzt, um dann daraus

zum Beispiel die Python-Module zu erzeugen.

Also es ist

nicht mal irgendwie ein

Jupyter-Plugin oder sowas.

Das heißt, man muss einfach richtig seine Zellen vom

Typ her definieren im Jupyter-Notebook und

dann Docs hinschreiben.

Und das schreibt dann halt den Source-Code dann raus.

Okay.

Also ich fand es eigentlich ganz nett.

Ich finde das sehr spannend. Also es ist sehr cool.

Ich benutze auch relativ viele Notebooks zum Entwickeln.

Also gerade auch so Django, so IO-Sachen

oder Modellsachen, Funktionen,

Methoden.

Die kann man einfach super schnell dann testen. Die gehen halt an,

Django schnell auf und dann kann man testen.

Ich mache das tatsächlich, das haben wir aber auch beim

letzten Mal, als ich bei euch eingeladen war, schon mal drüber gesprochen.

Ich mache das tatsächlich so, dass

ich das sich oft mit dem Debugger

entwickle.

Ja, das ist auch eine Option.

Das mache ich nicht so oft, aber

das wollte ich mir auf jeden Fall auch nochmal angucken.

Du benutzt ja auch PyCharm.

und das ist, glaube ich, sehr komfortabel.

Man muss sich auf jeden Fall abgewöhnen,

STRG-S zu drücken, weil dann

speichert ihr die Datei und dann fliegt ihr lieber raus.

Aber ich finde, das ist

eigentlich ganz cool, vor allem wenn man

so viele Funktionen und

irgendwie externen Daten

und sowas bekommt, wo man dann oft, okay,

da muss ich mir auf die dritte Array-Stelle zugreifen,

du weißt, es ist da irgendwo, du weißt

nicht genau, wo es ist und da macht man

normalerweise viele Runden und das ist dann einfach angenehm,

wenn du dann direkt einfach

in diesem Evaluate-Expression

einfach die Sachen da zusammen klopfst und dann direkt auf den Knopf drückst

und weißt, jo, läuft, passt.

Ja, das muss ich auch wieder in den Land sprechen.

Das geht auch in anderen Entwicklungsumgebungen

tatsächlich ganz gut, wenn man die richtig

einträgt.

Das haben wir so ein bisschen gefummelt, weshalb man halt

den Debugger halt so laufen hat, wie man das gerne hätte.

Aber hast du da schon diesen Debugger, den wir

letztes Mal vorgestellt haben,

gesehen? Und zwar

Kodo, oder wie hieß der? Kodo App?

Kodo App, genau. Das ist ein neuer

Dango-Debugger, der

relativ coole Sachen machen kann, wie Visualisierung

der Code-Pathes und sowas. Cool.

Relativ geil, müssen wir schauen. Ist aber nicht für Python.

Ja.

Ja, aber das wäre auch auf jeden Fall

genau, also das habe ich mir auch zum Ziel gesetzt.

Ich meine, normalerweise benutze ich ja immer Vim oder so,

aber das eben jetzt mal explizit

nicht zu machen, sondern im Stream halt

versuche ich jetzt, zum Beispiel habe ich jetzt immer eher

VS Code benutzt.

Einfach nur, um das halt auch so ein bisschen

zu lernen. Oder halt auch PyCharm würde ich auch

auf jeden Fall machen. Ja, also, ach so, was du auch

noch dabei machen solltest.

Vielleicht ist so ein bisschen so die Konfigurationsteilung, ein bisschen so die Magie

zeigt, wie man das Tool dann jeweils benutzt.

Das ist, glaube ich, auch nochmal sehr lehrreich. Also vielleicht kurz

darauf eingehe ich so, wie man es

danach macht. Kann ich mir einfach mal vornehmen,

das zu versuchen zu verwenden.

Je mehr man halt neue Sachen lernt,

die man noch nicht lernt.

Ja, okay,

ich werde es mal versuchen.

Ja, ja.

Ja, das ist schon richtig. Man muss einfach ab und zu mal

Dinge ausprobieren.

Ja, stimmt.

Ja, wenn man sonst immer noch bei seinen Sachen bleibt, dann wird man darin auch ein bisschen besser, aber was neue Sachen ist schon spannend

Ja, oft sowas wie Programmieren oder sowas kann ja auch für einige Leute neu sein

Ja, eigentlich bin ich schon fast zu lange dafür dabei, um das nochmal zu erzählen, aber ja, ist noch wahr

Das Gefühl geht auch nicht weg

Ja, okay, man hat halt von allen Sachen immer keine Ahnung, aber irgendwie hat man dann doch mehr Ahnung hinterher, so Rückblicken von einigen Sachen, die man eigentlich gar nicht wissen wollte

Aber so da vorne ist immer der Berg wird immer gr anstatt kleiner das ist so ein bisschen das Problem Ja wei nicht was mir zu zunehmender Erfahrung auff ist oft muss ich gar nicht also was mir heute leichter f oder der Unterschied zwischen heute und

den Zeiten, wo ich halt wenig Erfahrung hatte, war halt,

ich hatte früher immer mehr das Gefühl,

bewusst Dinge zu tun oder bewusst irgendwie Sachen

auszuprobieren. Und heute muss ich

eigentlich nur, denke ich mir so, okay,

ich habe keine Ahnung, wie genau es passieren wird, aber

irgendwie in der nächsten halben Stunde wird mir schon irgendwas

einfallen. Und dann bin ich halt da rum und dann hinterher

denke ich so, okay, das war es, aber keine Ahnung, ich weiß gar nicht,

und Jochen unterhalten sich über die Programmiersprache Python

neben den Seiten des Packages steht und dann

einen Bug hat, beziehungsweise auch

irgendwie so ein gewisses Maintenance machen muss, zum Beispiel

gibt es eine neue Dango-Version und man wird dann inkompatibel,

das passiert ja leider immer wieder mal

und das ist tatsächlich auch

eine Sache, dass wenn man

so ein Package in die Welt setzt, ich nehme jetzt mal

extra dieses Wort, dass man

halt da schon ein bisschen im Kopf behalten sollte,

wie gehe ich denn damit um mit der Maintenorship?

Also wenn man sagt, ich mache das jetzt für mich, mal zum Ausprobieren,

das nutzt eh keiner. Ich suche immer noch kurz

den Übergang von der Dusche, aber okay, du bist für

ein Maintenorship, ja.

wegen Bugs und Problemen.

Ja, gerade, wie lange man darüber nachdenken sollte.

Genau.

Und das ist tatsächlich

auch eine Sache, das merke ich

halt auch oft, dass ich halt vor allem in älteren Projekten,

die ich habe, dass ich da halt ein sehr cooles Package

verwendet habe, würde ich heute nicht mehr machen,

aber ich habe halt den Code so gebaut, dass es halt funktioniert.

Und dieses Package ist halt irgendwann mal hart

abandoned worden, also dass dann wirklich die Leute

einfach kein Interesse mehr daran haben.

Also die dann nicht mal mehr das Interesse haben, zu sagen,

hey, ich schreibe einfach

sorry, ich weiß nicht, bin jetzt irgendwie Gärtner und ich mache kein Programmieren mehr,

kann ich nicht helfen, sondern es einfach kommt gar nichts mehr,

obwohl die Leute halt immer noch aktiv sind.

Also man kann es ja auch sehen, was Leute so machen.

Mir ist halt immer wieder sehr ärgerlich und ich glaube, dass wenn man so ein Paket in die Welt setzt,

dann man irgendwann merkt, okay, ich habe jetzt den Fokus verloren und das nutzt aber vielleicht noch irgendwer.

Ich glaube, das Erste, was man machen kann, ist halt, dass man irgendwo Prominenten im Möglichen hat,

dass den Leuten das Feedback geben können.

Also offensichtlich ist es einfach bei GitHub die Issues.

wie kann man übrigens auch sehr schön über die

zum Beispiel SetupPyodot oder

ProjectSetupTommel direkt verlinken

in PyPy, das wird direkt

in das ChangeLog und so kann man alles perfekt verlinken,

dass die Leute gar nicht lange suchen müssen.

Und dass man dann auf jeden Fall Leuten, die das halt nutzen,

die Möglichkeit gibt, dass sie Feedback geben.

Also zum Beispiel, ich habe die ersten zwei Issues bekommen

tatsächlich mit Übersetzungen, weil halt

in dem Package halt ein paar

Models, die ich da bereitstelle, waren halt auf Deutsch,

weil die meisten Projekte, die wir nutzen, sind halt auf Deutsch.

Und es ist halt nicht aufgefallen, dass da der Übersetzungshelper

fehlt. Und das war dann

für die Leute halt echt super ärgerlich, weil die halt das irgendwie nutzen

wollten. Wahrscheinlich haben die Blog-Artikel von mir gelesen,

weil dann so, ja Mist, in dem Projekt ist alles auf

Sprache X und das plötzlich auf Deutsch.

Wenn der gut anslät, dann kommt irgendein unteren raus.

Genau, und das hat mich

dann total gefreut. Es kam auch direkt ein Podcast hinterher,

hey, hier so und so, und hab dann auch die Übersetzung nachgezogen

und alles super. Also,

hätte ich sonst niemals rausgefunden, weil bis die irgendwie

die Webseite irgendwie mich anonym

anschreiben oder mich über LinkedIn suchen oder keine Ahnung

was, ist das ein riesen Overhead und so. Einfach

kennt halt jeder, ist schnell gemacht und

das ist, glaube ich, so ein kleiner

kleiner Convenience, die man dann

seinen Usern irgendwie bereitstellen kann,

weil es kostet ja auch nichts, das ist ja schnell gemacht.

Und wie gesagt, das andere mit der

Metaindership, wenn man halt wirklich sagt,

okay, ich gebe das jetzt auf,

es gibt ja so, entweder so

Projekte, so wie Jazzband oder sowas, da gab es

noch in der DjangoCon einen schönen Vortrag dazu,

wenn das wirklich ein größeres Projekt ist, dass man die da einfach abgeben

kann und sagen kann, hey, sorry, ich bin raus

hier mit dem Kram, aber das nutzen noch Leute,

bitte kümmert euch drum.

Und auf der anderen Seite,

dass man natürlich auch dann notfalls auch andere Leute

einfach befördern kann und einfach

sagen kann, hier

das,

also ich habe jetzt im Interesse und ich muss das reparieren

und sage, gut, ich habe selber keine Zeit, dann ach halt,

ist immer noch besser, wenn es gar keiner macht.

Ja,

ist ja gar nicht so einfach, also gerade bei Leuten, die halt

for pleasure entwickeln,

da muss man sich halt auch überlegen,

will man nicht auch mal was Neues machen oder sowas,

dann ist das schon klar, dass das schon schwierig ist,

immer an den alten Sachen die irgendwie so mitzuschleppen.

Aber das ist ja oft, also bei mir ist das keine

bewusste Entscheidung, sondern das ist ja so,

und so.

auch anstrengend.

Welche Größe du hast irgendwann.

Das kann auch sehr overhelming werden.

Das Leben von Leuten ändert sich ja auch oft.

Also Situationen oder sowas.

Wenn da irgendwie dann die

Prioritäten sich privat verschieben und die Leute dann nicht

mehr von morgens bis abends dann noch in ihrer Freizeit

partizipieren können, dann...

Ja, absolut. Ich meine, das ist natürlich ein Problem.

Es hat ja auch Carlton Gibson, glaube ich,

macht gefühlt jede zweite Jungle Corner einen hervorragenden Vortrag

zu dem Thema.

Das ist natürlich ein Problem, aber

ich sage, es gibt halt relativ einfache Möglichkeiten,

die zwingend natürlich nicht bei jedem zutreffen

wenn einer wirklich sagt, hey ich habe es

im Beruf gewechselt oder ich bin weggezogen oder keine Ahnung

was und habe meinen GitHub Account geschlossen

das war es jetzt für mich, okay kann immer

passieren, aber ich sage eben in meisten

Fällen ist es wahrscheinlich oft, dass

Leute noch irgendwie latent am Ball bleiben

und da gibt es halt ganz einfache

Wege, das Problem zumindest für einen selbst

irgendwie zu lösen.

Ja, ich sage mal so, es ist schon schön, wenn man halt so ein paar Issues irgendwie

nicht die größten nicht offen lässt

sondern zumindest ein Team findet, das dann Lust hat

wenn man gerade wirklich viele Leute hat, die dann

was benutzen, dass denen halt wenigstens mal

deren Pull-Request-Merch oder denen die Möglichkeit gibt,

dass sie selber Sachen merchen können, also die Interesse

dann haben. Ich meine, klar kann man auch einfach forken

und dann irgendwie ein neues Package machen und sowas, aber

es ist halt

natürlich schon schön, damit das alles irgendwie ein bisschen

zentralisiert ist, aber ja.

Aber die Jazzband hast du ja erwähnt, das ist glaube ich eine ganz gute Möglichkeit,

das zu tun, ja?

Ja, ja, da bin ich

jetzt, ach, naja, da hat sich da letztes Mal auch was

getan, da bin ich jetzt auch mal da beigetreten.

Aha, cool.

Und dann, weil ich habe mich gesehen in dem

Projekt, an dem ich momentan gerade da rumschraube.

Da habe ich diverse Geschichten, die in Jasmine

drin sind, reingewendert.

Sozusagen, damit ich die

anpassen kann und eigentlich

kann ich das ja auch dann einfach so machen vielleicht.

Einfach direkt, ja. Cool.

Cool. Dann löst du quasi

dein Problem und hilfst aber noch ganz

vielen. Genau. Ja, gut.

Vielleicht mache ich auch demjenigen, der dann die

nächste Release baut, Kopfschmerzen. Das kann

auch sein.

Aber ja, mal schauen.

Ist auf jeden Fall interessant.

Das ist ja vielleicht auch eine kleine Verbesserung

Ja, ja

Ja

Tja, was haben wir denn

Was gibt es denn noch so für Dinge, die wir

über Paket-Ding

irgendwie erzählen sollten

Habt ihr irgendwie

also habt ihr irgendwelche Tools

die ihr bevorzugt verwendet, also Flit

Okay, kann das ihr jetzt nicht, hab ich auch nicht

Werd ich dann demnächst mal ausprobieren, mal gucken

Ja, ja

Ja, Poetry

verwende ich meistens,

aber... Ja, tatsächlich, so zum

normalen lokalen Verwalten schon, zum Bauen.

Du verwendest pipenv,

aber das ist nur für die...

Genau, nur für die Requirements

oder Logfile. Ja, genau.

Tatsächlich,

das Package, das

schiebe ich noch mehr oder weniger genauso hoch, wie

das damals 2012 war, also so eine ganz

fiese Set, also das heißt fies, aber aufgeräumt ist sie

aber eine sehr angestaubte Setup-Pi.

Setup-Pi, ja.

und ja, dann auch, ich baue da auch ein Wheel draus, weil das für, also ich selbst bin ja tatsächlich ein Windows-Nutzer,

das wird jetzt auch ein bisschen populärer, aber wieder beim Coden, aber tatsächlich ist das mit den Wheels sehr, sehr angenehm,

weil die Sachen sich einfach alle installieren lassen und man da keinen Knatsch mehr hat.

PyCurl ist aktuell mein einziger Endgegner, wenn ich das installieren möchte.

Aber genau, von daher, das habe ich mir aber auch aufgeschrieben.

und der

wie Entwickler das machen und das erinnerte mich

jetzt gerade daran, ist halt, dass sie irgendwann mal

sich damit beschäftigt haben und dann haben sie ein Setup

für Wi-Fi geschrieben und das kopieren sie halt

Projekt von Projekt zu Projekt immer weiter.

Das Problem ist halt

sozusagen aus

Infrastruktursicht dann, ja, Abwärtskompatibilität

ist halt super wichtig,

weil es

sind halt oft viele Dinge immer noch im Einsatz,

die von irgendwann an und dazu mal kopiert

worden sind. Das heißt, man kann die Abwärtskompatibilität

nicht mehr brechen, weil ansonsten bricht ganz

ganz viel, ganz, ganz viele Dinge

und dessen

Vorschlag war auch eher

SetupCFG zu verwenden

und dann halt auch mal, oder irgendein

Projekt-Template oder so, oder eben ein Tool,

was einem das halt abnimmt.

Das klingt aber auch alles schon

wirklich, also ganz im ganzen Packaging-Ding,

so gordischer Knoten. Ja, das ist

wirklich gemein. Ich meine, was will man machen, wenn du

ja, ein Großteil der Pakete

da draußen verwenden halt uralte Geschichten

und du kannst es nicht mehr ändern, weil wenn du es änderst, dann

brichst du all die Pakete. Ja, wegschmeißen, neu machen,

auf Features verzichten, vielleicht braucht man die alle gar nicht.

Ich habe das wesentliche

konzentriert.

Ja, genau, ich habe auch einmal so ein

Cookie-Cutter-Template verwendet, also es gibt ja auch

Python-Package

Cookie-Cutter-Template

von...

Genau, und das

fand ich auch ganz nett, aber...

Der übrigens auch auf Twitch streamt.

Ja, ja, richtig, genau, das habe ich mir

auch schon

auch ein bisschen angeguckt.

Genau, fand ich auch gut.

Was ich auch ganz interessant finde,

apropos

Projektsetup,

der Code, der

jetzt in meinem Package drin ist, der ist natürlich

auch logischerweise getestet.

Am Anfang war nicht so viel getestet.

Inzwischen ist er getestet.

Zumindest Großteils.

Die Sachen, die ich halt tatsächlich nutze, die sind jetzt auch getestet.

Und am Anfang war es auch so,

dass diese Testfiles dann

einfach mit in dem Package gebundelt wurden.

Also die

Metatests quasi, also die Sachen, die das Testen

sich nachher ausliefere, mir ist dann nachher mal aufgefallen,

die muss ich ja gar nicht mit ausliefern, weil das

interessiert einfach keinen. Also ich meine,

vielleicht ist es doch, weil die wissen wollen, ob ich vernünftig

das abgedeckt habe, aber eigentlich liefere

ich eine Datenmenge aus, die eigentlich nichts mit der

eigentlichen Funktionalität zu tun hat.

Und das war für mich so der erste

Erkenntnispunkt, also sollte man mal reingucken,

wie das damals mal irgendwie strukturiert hat, weil

da kann man nämlich auch einstellen, welche Dateien dann

von diesem Bundler gefunden werden sollen.

und Jochen unterhalten sich über die Programmiersprache Python

ausschließend hat, aber

ja, die kleinen Hürden.

Das ist auch eine der häufigsten Sachen,

wenn man so, oder wie mir passiert,

wenn man so eine Git-Action-Pipeline hat,

die halt auch testet und so,

das lokal funktioniert alles und dann macht man

einen Push und dann geht die Pipeline kaputt und dann sagt man,

hä, warum? Und ja, ganz oft ist es halt,

weil in den Dev-Requirements irgendwas drin war,

was man halt tatsächlich gebraucht hat, aber dann in den Produktions-

Requirements nicht mehr und dann...

Ich würde sagen, fast besser als andersrum,

weil dann fällt es einem ja direkt auf und dann kann man es einbauen.

Das ist wahr. Dafür sind ja Pipelines

dann auch da oder dann die E-Mail-E-Mail kommt,

dass das schon wieder kaputt gegangen ist oder so.

Ja, ja, ja.

Das ist ja ganz praktisch.

Stichwort Pipelines.

Ja.

Hatten wir ja auch im Vorfeld noch drüber gesprochen.

Was ja bei GitHub sehr, sehr cool ist,

sind ja diese Travis-Matrizen,

wo man, ich glaube, Travis ist das Richtige, ne?

Kann sein, ja.

Ja, die Tox-File, genau.

Und Travis nutzt das dann.

Man kann da einstellen,

wie viele verschiedene Python-Versionen das einmal durchdauert.

Genau, mit welchen Django-Versionen

und dann kann man halt relativ simpel

in so einer Art YAML-Datei, glaube ich, ist das,

kann man dann halt eingeben

und sagen, okay, ich unterstütze explizit

Python 3.6.

Genau, gehe ich durch und dann

halt mit der und der Django-Version, da baut er dann eine Matrix auf

und testet halt wirklich die Sachen gegeneinander

durch und das ist halt sehr cool, weil auch wieder so eine

Sache, man kann in der Setup oder wie auch immer

man sein Projekt Meta deklariert, kann man

halt auch explizit angeben, welche Django und Python

oder was auch immer Versionen

man unterstützt. Also ich bin ab 3.8

und 3.2.

Ja.

mit dieser Matrix, gibst du die Sachen halt einfach ein,

Problem gelöst,

läuft. Da muss man sich ja nicht mal weiter drum kümmern.

Das ist halt echt cool. Das bin ich auch

tatsächlich, dadurch, dass wir intern

GitLab nutzen,

weiß ich gar nicht genau, wie das funktioniert. Das ist so

ein Newscast, den man halt im normalen

Geschäft vielleicht nie hat. Also was ich auch sehr cool finde, sind diese ganzen,

wenn wir jetzt bei GitHub schon sind,

sind die ganzen GitHub Actions, das habe ich bei GitLab noch nicht

so hinbekommen. Und zwar kann ich ja aus

Code Actions

generieren, zum Beispiel, indem ich Tags in den Code

reinschreibe. Und dann kann ich ja

daraus dann bestimmte Dinge machen. Also ich könnte zum Beispiel

direkt Issues erzeugen aus To-Do's oder aus

Issues hier oder Fix-Me's,

die halt irgendwo im Code drin stehen und habe halt

dann direkt die Issues damit offen und das finde ich halt

sehr nice, weil man halt dann das dann auch schließen

kann, wenn man das richtig konfiguriert

und dann halt quasi gar nicht mehr seinen Code verlassen

muss, um halt einen vernünftigen Issue-Tracker

auch zu haben, wo sind denn die Issues, wo sind denn noch

was zu tun oder halt zu warten, wenn jemand anders

kann halt direkt sehen, oh ja, da ist jetzt noch das Fix-Me

offen, da muss ich jetzt einfach mal kurz gucken, dass ich

dann vielleicht was dazu beitragen kann. Das ist schon

sehr, sehr schön gemacht. Ja, das ist echt

cool.

Ja, wo du Pipelines sprachst, Pipelines sind

eigentlich die Hölle, dass man irgendwie auf

Produktionsumgebung da kommen kann, wenn man eine einigermaßen

komplexe Infrastruktur dann irgendwann da hat

und bauen muss.

Also ich habe da Jammelhölle im Moment

von mehreren Jammelfights, ich glaube

es sind neun, die

über 2000 Zeilen jeweils lang sind,

wo halt dann über irgendwelche Skripte passieren,

die gemixt sind aus

PowerShell und Bash und halt Python

und dann passieren da

komische Dinge und Wurzling,

tolles Version. Ich habe auch Semantic Versioning eingebaut

und ich wollte halt einfach die Version bekommen.

Und da der Punkt, wo ich die Versionsnummer

pinne, meine PyProjekt Hummel war

oder ist, da habe ich mir gedacht, okay, ich

parse die einfach und benutze die weiter.

Dann habe ich meine Version geändert von 0.9.9

auf 0.9.10, weil

es ging immer noch nicht weiter. Und bumm.

Jetzt sind wir eine Pipeline auseinandergeflogen,

weil ich einfach den Regex falsch geparsed hatte.

Aber solche Kleinigkeiten halt, dass halt so was

ist, ja. Das ist halt lustig, aber

solche kleinen Sachen, die führen immer zu,

dass ein Pipeline läuft, die manchmal ziemlich lange

gedauert. Anderthalb Stunden oder länger.

Ja, das

klingt nach einem Problem, ehrlich gesagt.

Ja, das ist nicht lustig.

Man hat halt auch irgendwelche Regeln von außen, die man gar nicht

beeinflussen kann, in denen man sich halten muss.

Ja.

Man muss irgendwelche Türen aufmachen,

da ein Kabel zwischenhängen, dann die Türe so wieder

zumachen, dass nur das Kabel durchpasst und dann

da durchrufen mit so

Flüstertüten und dann am Ende muss man das alles

wieder abhängen. So was, ja.

Ja, ja.

Furchtbar.

Ja, also das ist auch irgendwie, ja, so wirklich gelöst ist das alles noch nicht auch irgendwie.

Ich weiß nicht, ob der Produktionsrelease auch so eine Art Package ist.

Also vielleicht, also das ist halt so, was wir halt zum Beispiel machen müssen ist,

wir haben ja keine richtige Staging-Umgebung oder so.

Das heißt, was wir machen ist, wir müssen quasi einmal Produktionsversionen komplett nachbauen

und dann da ein Update drauf machen.

Weil, wenn wir halt direkt eine neue Version bauen, dann kann es ja sein,

dass das anders ist als Produktionen zu updaten.

und damit uns halt da nichts schief geht, müssen wir halt erstmals nachbauen.

Das dauert halt dann immer doppelt so lange, weil er zweimal neu bauen muss.

Und dann muss er am Ende, weil wir halt Budget und so,

muss er halt die ganze Station-Gegend erstmal wieder abreißen,

bevor er anfängt zu bauen.

Deswegen dauert das halt auch alles immer so lange.

Aber ja, das ist halt vielleicht auch was mit Paketierung zu tun.

Ist das nicht so ganz public in dem Fall, aber...

Also ich glaube, wir hatten es ja vorhin ganz kurz schon angerissen.

Ich glaube, eine Sache, die, wenn man so ein Package baut,

die wirklich so ein bisschen

ja, unterm Radar läuft, weil es halt

irgendwie niemand so gerne macht, ist halt einfach, dass man die Doku

schreibt, also

es gab ja jetzt, glaube ich, letztes oder vorletztes JungleCon

diesen schönen Vortrag, Docs are didn't happen

das war in Kopenhagen, ich glaube das war

vorletztes Mal

das ist einfach, ich habe es halt auch gemerkt, dass

also selbst in meiner eigenen Firma

wo ich ja echt jetzt keine weiten Wege

zu den Leuten habe, ja, wenn ich sage, hey

da ist das drin, nutzt das mal

das ist halt eine Blackbox, ne

dagegen. Also selbst wenn du dann irgendwie

doch mal jemand irgendwie den Code reintraut und da mal rumguckt,

wenn da halt nicht ordentlich dokumentiert

ist, ich meine vielleicht mal irgendwo ein

kurzer Docstring oder so,

ist schon schwierig. Also da wirklich mal

das irgendwie zusammenzuschreiben, das habe ich

tatsächlich auch im letzten Quartal

relativ viel gemacht und habe da mal bei Read the Docs

da so ein bisschen Markdown

mit Zphinx gepublished, also

Zphinx kompliertes Markdown.

Und da geht...

Auch übrigens ein bisschen nervig mit RestructureTest, geht das

immer besser? Ja, ich

Ich komme mit dem Dokumentformat irgendwie nicht.

Nein, das ist schlecht, aber Sphinx macht das halt sehr ungern mit Markdown.

Ich weiß, ich habe da mehrere, ich habe da so ein paar Adapter.

Man kann das halt ineinander konvertieren, genau.

Ich habe so ein paar Adapter eingebaut.

Musste ich auch ein bisschen googeln, aber inzwischen geht das jetzt ganz gut.

Das bin ich ganz happy damit.

Der war zwischen mich kaputt, der Adapter, ja.

Ja, genau.

Nein, aber das ist tatsächlich, da ist sehr, sehr viel, also dieses Dokumentieren

und auch wenn man vielleicht nicht nur einfach sagt, dass es die Methode und die gibt,

sondern wenn man vielleicht auch so ein bisschen den Kontext herstellen möchte,

so eine Art How-to, das wäre wahrscheinlich eher ein How-to,

wie du vorhin bei deiner, bei dem,

also dass du sagst, hey, guck mal, ich habe diesen Use-Case, ich möchte

mir Daten anonymiasieren, habe ich hier irgendwie einen Rapper, der hilft

dir, oder wenn du irgendwie E-Mails testen möchtest,

da habe ich hier eine fancy Klasse oder ein Mix-In,

das hilft dir, dass man die Leute

auch ein bisschen abholt und erklärt, warum

willst du das überhaupt nutzen, also welches

Problem löse ich für dich? Wenn du dann

nur sagst, so sieht der Code aus, dann

hilft den Leuten das halt nicht. Wo ich das am liebsten mache

und wie es irgendwie am besten auch funktioniert, dass das dann

nicht nur aus meinem Kopf kommt, ist, wenn man das halt tatsächlich

im Art-Pair-Programming macht, wenn man halt dann gemeinsam mit seinem Team oder mit anderen Leuten drauf guckt

und denen das quasi erklärt, was man da gebaut hat oder warum man das gebaut hat, weil dann fallen einem

erstens so die ganzen Bugs auf, die man sonst übersieht, wenn man da irgendwie immer nur selber

mit seinen eigenen vier Augen drauf schaut. Und dann halt

am Ende, wenn man das den Leuten halt erklärt, kann man halt direkt das dann als Docstring dann auch so reinschreiben,

was das dann halt macht. Das macht meistens relativ viel Sinn. Und man merkt halt, dass nochmal der Name, den man da

verwendet hat, irgendwie Quatsch ist. Und das macht man dann noch ein bisschen hübscher. Und dann so kommt man auf eine relativ gute

Qualität, glaube ich. Das ist aber dann wirklich essentiell, dass man mit anderen Leuten das gemeinsam

macht. Das ist auf jeden Fall eine gute Idee.

Aber dann ist auch die Dokumentation in Ordnung. Also was ich

bei Dokumentation oft merke, das finde ich sehr nervig, da habe ich auch noch keine Lösung für gefunden,

die ist halt irgendwie hyperschnell veraltet. Das heißt, wenn ich mir irgendwie Mühe gebe, dass ich so detailliert

aufschreibe, was denn da irgendwie gemacht werden muss, damit das dann läuft, dann muss ich dann

ein oder zwei Wochen da nochmal Zeit reinstecken. Wenn ich nicht jeden Tag irgendwie dann zehn Minuten

wieder die Doku anpasse, die ist halt dann nach diesen zwei Wochen

einfach nicht mehr benutzbar.

So, das ist irgendwie ein bisschen blöd.

Und das führt halt auch dann dazu, dass man nicht

so Lust hat, dann das immer zu

machen ordentlich, weil... Also da hatte ja

der Kalten Gibson jetzt bei dieser

DjangoCon einen Vortrag bezüglich

wie dieses Static Dynamic Websites,

Static Dynamic Pages

hieß es, glaube ich. Ja, mit einem Zwings und...

Genau, ich habe vergessen, wie das Package heißt, das er gebaut hat.

Müsste man mal nachschauen.

Benutzt das dann einfach doch Zwings irgendwie?

Also die Idee dahinter ist, dass du quasi

über Django Markdown,

also du schreibst Markdown

und das wird dann als Django HTML

Template gerendert, rausgerendert.

Und da... Hast du das nicht auch die Django Docs,

die Dokumentation, die tatsächlich in diesem Format

irgendwie selber ist? Möglich, möglich.

Auf jeden Fall, der hat das da halt ein Package draus gemacht

und das ist halt, also ich glaube

ein Problem, das man damit lösen kann, ist halt

genau, also jetzt nicht Docstrings, weil die musst

du halt, die sind eh im Code, aber wenn du halt

diese, zum Beispiel so eine How-to-Dokumentation,

bei mir läuft das halt irgendwie,

ja, es ist halt schon irgendwie im Code drin, aber

ist auch jetzt irgendwie separat gehostet und

wenn du jetzt, bei Pactis ist es eh schwierig,

weil die laufen ja nirgendwo, wenn du zum Beispiel

sagst, ich möchte jetzt irgendwie Dokumentation für

meine eigene Seite, also zum Beispiel ich möchte irgendwie

die Business-Logik und die Technik und irgendwie sehr

detailliert das aufschreiben, muss ich vielleicht auch, wenn es irgendwelche

Compliance-Sachen gibt.

Wie hingehen das nochmal mit dem Backup oder so, ja. Genau,

dass du die Sachen dann einfach direkt im Code,

im gleichen Repo, im gleichen Commit machen kannst und

dann zum Beispiel auch einfach da ein

Linting reinbauen kannst, sagst du, Moment mal, du hast da was angefasst,

du hast das

Markdown nicht dazu angepasst.

Das sind, glaube ich, sehr, sehr coole Use Cases.

Dafür, wenn man da halt wirklich, wenn das wirklich

wichtig ist, also du hast

halt dann die Nähe von Dokumentation,

die sich eigentlich weit weg anfühlt, das ist irgendwo

ein Marktanteil, die irgendwo umliegt und die irgendwo gehostet

ist, dass du dann wirklich ins Projekt

reinbringst. Ich habe es noch nicht ausprobiert

tatsächlich, aber ich könnte mir vorstellen, dass das

genau für solche Use Cases, also für sehr große

Projekte, wo man das machen muss,

das vielleicht so ein bisschen dann

näher bringt und damit auch die Motivation erhöht,

dass man es da wirklich tut. Also ich war ja echt Fan

auch von diesen autogenerierten Swing Stocks,

Autodoc aus den Docs-Sinks heraus und so,

dass du einen halt so ein bisschen dazu zwingst, den Docs-Sinks aktuell

zu halten. Aber noch besser sieht das

tatsächlich, jetzt muss ich noch kurz für Jochen und Lasse

brennen, dieses NBDEV aus, weil man in Notebooks

halt das Markdown auch direkt mit

reinschreiben kann, wenn das ordentlich aussieht.

Mein Notebook hat was, was ordentlich aussieht,

ja, und was dann automatisch dann

zur Dokumentation von diesem Code führt, das dann

irgendwie aus einem Guss hat. Das ist schon irgendwie

sehr charmant für bestimmte Sachen.

Ja, gerade wenn man, glaube ich, so Pakete

neu entwickelt, irgendwie das dann hinterher nochmal

angucken will, das ist schon schön.

Ja, ich sage mal

gerade bei Data Science

Geschichten ist es besonders schön, weil

das halt, zum Beispiel man hat

ja oft dann irgendwelche Visualisierungen

Visualisierung ist natürlich besonders

Das hast du ja sonst eigentlich, weiß ich nicht, wenn du jetzt irgendwie ein Django-Paket

hast oder so, hast du das im Grunde kaum

Insofern ist es da nicht so schlimm, wenn man das halt

im Notebook hat und auch

wenn du bei so Data Science Geschichten, wenn jemand

eine Visualisierung verbessern möchte, dann

kannst du halt da in einem Pull-Request direkt

den Unterschied in der Visualisierung sehen

und direkt im Notebook und musst halt nicht

erst das Paket bauen,

also den Pull-Request dann bauen,

angucken, dann die Visualisierung anzeigen,

erstmal bis dahin kommen. So was ist halt direkt da.

Dafür ist es halt total super.

Wenn man das jetzt gar nicht braucht, dann

hilft es einem nicht so sehr,

auch wenn es sonst auch ganz nett ist.

Ich habe jetzt gerade nochmal geguckt, ich glaube das Paket ist

Django Sphinx View

von Carlton Gibson.

Ja, ich finde das auch

auch total interessant. Es gibt ja so diverse Ansätze.

Den kannte ich jetzt auch noch gar nicht mehr, war das

auch überhaupt nicht klar, dass die Django-Dokumentation

das so macht, dass das halt irgendwie

nur

JSON ist, was im Grunde aus Sphinx rausfällt

und dann man halt noch dynamische

Geschichten mit dazu machen kann.

Aber das ist auf jeden Fall

auch eine sehr interessante Geschichte. Markdown, dann den

Mistparser, dann das Ganze

in Restructured Text, das Ganze

dann wieder dynamisch vielleicht serven,

ist sehr interessant.

MBDev finde ich interessant

ich finde voll interessant, was in dieser

Vue.js, Vue.js mache ich auch so ein bisschen

versuche ich auch reinzukommen, was die da machen

die nehmen ja VuePress

beziehungsweise VitePress jetzt

genau, das ist auch total

toll, das sieht super aus

bitte?

excuse me, Vite

das ist auch so blöd, wenn man dann

irgendwie, da habe ich auf irgendeinem

Vue Meetup

einen Vortrag über VitePress

gehalten und dann

mit der White Press gesagt oder sowas

und dann kam die erste Frage und jemand sagte dann Viet Ich habe es gerade gestern halbe Stunde lang jedes Mal falsch gesagt Aber genau so ist das halt

Und das ist aber auch

voll toll, weil was

daran super ist, ist, dass man direkt sieht,

wenn man was an der Dokumentation ändert oder so,

das ist halt sofort alles live.

Mit Sphinx und so, das ist ja dann doch eher so,

man muss das erstmal dann irgendwie bauen.

Das dauert alles ein bisschen, bis dann auf einer Webseite ist,

das dauert nochmal.

Während bei VitePress oder so, das ist halt sofort da.

und man editiert es quasi live.

Aber

so das rundum

sorglos Ding für alles gibt es irgendwie nicht.

Es gibt so diverse, sehr interessante

Geschichten, die so in Teil-Communities

irgendwie so

entwickelt worden sind.

Also ich würde auch fast sagen,

Beatpress irgendwie,

das ist schon nett für Markdown-Sachen,

Markdown-Sachen hosten oder hochladen, aber das

generiert halt immer noch nicht seinen Content.

Den muss man halt immer noch selber schreiben.

Aber man kriegt ihn damit

sehr gut aussehen.

Die Vue-Dokumentation ist ja

VuePress, weil das kann halt auch mal ein bisschen mehr.

Und das ist eigentlich, das ist auch

alles Markdown, mehr oder weniger.

Das sieht schon sehr schick aus, muss man sagen.

Gerade auch im Vergleich

zu Django-Dokumentationen. Django-Dokumentationen ist jetzt

deutlich mehr und deutlich umfangreicher und vollständiger.

Aber

die Vue-Dokumentation sieht schon besser aus.

Und

das sind ja auch so kleine Animationen

und diese ganzen Geschichten, die halt bei Vue so drin sind.

Ja, also relativ einfach, dass

alles mit direkt auch als Paket kommt.

Dann funktioniert das einfach.

Das ist sowieso ein bisschen das Problem

von Dango-Sachen, dass das immer so sehr

statische Seiten sind immer.

Ja, aber nicht unbedingt.

Also wenn man das halt hätte, das macht man

zum Beispiel wieder nicht, aber das ist halt dann

unheimlich der Overhead, das dann halt in die Projekte dann alles

mal reinzubringen und man muss halt eigentlich an mehreren Stellen

gleichzeitig die Sachen bauen und das

wird dann alles so ein bisschen, man verliert halt Features,

die man vielleicht möchte oder so, das ist

alles noch nicht so. Ja, man hat halt

immer Entscheidungen zu treffen, für welchen Case man was lieben möchte.

Das ist allerdings wahr.

Ja, Pakete. Hast du noch was, Ronny?

Also tatsächlich, ich habe bis noch so zwei, drei Kleinigkeiten,

die mir jetzt aufgefallen sind, als ich da, wie gesagt,

jetzt so ein bisschen Streamlining gemacht habe bei dem Package.

Das eine ist, ich habe angefangen, bei allem, was ich anfasse,

jetzt nochmal Type Hinting zu nutzen.

Es ist ja so, mit der Konto, wer es diskutiert hat,

ob es gut oder schlecht ist.

Also ganz radikal, jedes Argument in jeder einzelnen

Methode. Ja, also es ist

immer ein bisschen schwierig, wenn du halt

Klassen hast, die aus einem eigenen Scope

kommen, weil du halt dann super schnell in den Circular Imports rennst.

Da ist es dann so, dass ich zum Beispiel sage,

okay, wenn ich jetzt, keine Ahnung, ein User

Query Set habe, dass ich dann nicht sage, das gibt ein User

Query Set zurück, sondern es gibt einfach nur Query Set

zurück. Also das abstrakte Django-Ding.

Aber ich finde das halt super

praktisch, also vor allem...

Was ist falsch?

Also wenn du halt eine...

Ja, ist halt der Vater.

Also es ist ja so ein Typ Curricet

Ja, weißt du, ja, na, ist dann nur die Base

Ja, aber das ist schon, glaube ich,

auch, wie man das

man sollte halt irgendwie die Abstraktion

von der halt abhängen und die dann halt auch

Also im Endeffekt, wenn ich halt nix zurückgebe

also nicht halbhinter, dann weiß jemand nix

Wenn ich weiß, da kommt ein Curricet zurück, dann weiß ich

immerhin schon mal Edits keine Liste

Ja, aber okay, aber das ist schon besser

Also man macht das ja in sowas wie TypeScript

oder sowas so relativ detailliert, dass man

irgendwelche Interfaces dann dafür baut, ne

und die dann halt dann die Typen exenten, die man

aber auch verwenden muss, weil ansonsten ist das ja falsch.

Also wenn du jetzt ein User-Query-Set hast, weil vielleicht

hast du ein Custom-Query-Set, wo du irgendwas

Besonderes dran gemacht hast, irgendeine Methode, die

andere Query-Sets nicht können oder so.

Und wenn du dann halt sagst, das ist nur ein Query-Set und dann

kommt da irgendeine Methode, die Query-Sets gar nicht können,

das wäre irgendwie seltsam dann. Und das müsste eigentlich

auch gelintet werden, finde ich.

Also du hast recht, es ist nicht ganz trennscharf.

Dadurch, dass ich das Problem mit den Circular-Imports

noch nicht gelöst habe und ich auch gar nicht weiß,

ob es eine Lösung gibt,

habe ich mich jetzt einfach dafür entschieden, ich gebe

dem Nutzer halt einfach

einen Ticken mehr

Informationen mit.

Eine Verantwortung.

Meistens finde ich es eh, also sehr sinnvoll ist es

vor allem eh bei trivialen Datentypen,

weil du halt dann, ob das jetzt irgendwie Decimal oder Float

oder ein Integer oder sowas ist, das macht ja schon

schnell irgendwie die Berechnung kaputt.

Aber ich finde das

tatsächlich praktisch, wenn du vor allem, wenn man so Helper-Methoden

oder irgendwie Sachen hat, also wo

andere dann meinen Code nutzen,

das ist ja total praktisch, dass dir dann direkt die

Ideen anzeigt, so sorry, da stimmt irgendwas.

Genau, das ist, finde ich, auch das Wichtigste an diesen Type-Links in Python,

dass du halt tatsächlich, wenn du den Lint richtig konfiguriert hast,

während dem Schreiben siehst,

findest du da irgendeinen Arch-Boss und das ist wirklich praktisch.

Aber ich benutze es auch tatsächlich meistens nur für

komplexe Dinge, also wo es fraglich ist

oder wo du noch nicht genau weißt, was es ist. Dann sage ich halt direkt,

das ist jetzt explizit und die anderen Sachen, die gehen halt einfach so durch.

Also tatsächlich

auf der

PyCologne, das ist ein Python-Meetup

in Köln, das monatlich stattfindet,

da hatte

der Organisator mal irgendwann gesagt,

dass er inzwischen jetzt übergegangen ist,

dass er quasi in jeder Funktion, die er schreibt, das erzwingt, dass man die Keyword-Arguments nimmt.

Das geht ganz einfach, indem man zum Beispiel aus einer Methode, das ist dann irgendwie von einer Klasse,

da ist dann nur der erste Typ ist immer, nicht Typ, die erste Variable ist immer self.

Dann machst du Komma, Sternchen, Komma und danach deine anderen.

Und dieses Sternchen sagst du ihm quasi, es kommt hier quasi kein normales Argument.

Dahinter kommen die Keyword-Argument.

Das heißt, es ist verboten, dass du sagst, ich gebe den ersten Parameter normal rein.

Habt ihr verstanden, was ich meine?

Ja, also kein normales Argument gibt so ein Keyword-Argument.

Genau. Und das finde ich jetzt, also bei manchen Sachen ist es natürlich Unsinn.

Ich meine, wenn du eine Sache hast und das auch klar ist, aber insbesondere bei so Methoden

oder wenn man mal irgendwie dann doch mal so vor so einer Funktion steht,

wo dann irgendwie doch mal so drei, vier, fünf Sachen reingehen,

was ja irgendwie auch so ein bisschen unlesbar ist,

da den User zu erzwingen, vor allem wenn da mal einer hinkommt

und das irgendwie ein bisschen refactoren möchte,

dann ist er auf jeden Fall sichergestellt, dass niemand aus Versehen,

also zum Beispiel wenn man die Reihenfolge tauscht und man möchte irgendwas da vorne rein,

dann kann man das einfach machen, weil es ist der Keyword-Argument

Aber das schluckt ja nicht das

mit dem ständigen Rest einfach weg dann? Ich überlege gerade, wo

der dann rausfällt

Also der

Argument wird ja wegschlucken, die würden einfach nicht mehr

auftauchen, aber die werden halt nicht in den Keywords dann gemappt

Nee, der macht dann tatsächlich einen Fehler

Der wirft bei ganz, das darfst du nicht

Also das ist sehr praktisch, weil ansonsten, das wäre ja blöd

wenn das passiert, was du sagst. Tatsächlich sagt ihr dann

Sorry, da müssen Keyword-Arguments drin sein

Und das

finde ich, wie gesagt, es gibt Methoden, da macht das keinen Sinn

Aber wenn das irgendwas

sehr, sehr wichtig ist oder sehr, sehr ähnliche

Variablen reinkommen. Dass man zum Beispiel,

weiß ich nicht, du hast irgendwie User 1 und User 2 oder sowas,

die irgendwie eine andere Semantik haben,

aber halt vom gleichen Typ sind und das

einfach dann dir trotzdem zu Ende rechnen würde, was du da tust.

Da finde ich das echt nett, wenn man das

macht. Einfach, weil

du halt dem

weiteren User, ob das du bist oder

jemand anders, mehr Semantik erzwingst.

Ja, also

exklusiv nur Keyword-Arguments erlaubt.

Gibt es nicht doch irgendwie ein Parameter für, ich habe da irgendwie

Es gibt da irgendwas mit dem Slash, ich weiß es nicht mehr genau.

Aber ich weiß es jetzt auch nicht mehr genau.

Es gibt also Position-Only-Arguments, es gibt

auch Keyword-Only-Arguments mit dem Stern.

Ja, aber genau.

Also ich würde

jetzt sagen, wenn man viele Argumente hat,

dann ist erstmal, also ich würde sagen,

naja, es gibt schon mal Fälle, wo das gut ist,

oder wo man das halt einfach braucht,

aber wenn es jetzt so deutlich mehr als drei

werden, dann denke ich mir schon so, okay, kann man das

nicht vielleicht irgendwie anders machen, weil das kann sich

ja eh keiner merken. Also ich meine, wenn die

Idee das vervollständigt, okay, dann geht es vielleicht, aber

ansonsten...

Wenn man ja immer durchpipen muss durch irgendwie mehrere Ebenen.

Was ich dann oft sehe, ist halt

irgendwie, oder wo ich denke,

da macht es dann nicht mehr so viel Sinn, ist halt, du hast

eine Riesenliste, wo dann Leute dann anfangen,

okay, Funktion geht auf, Klammer auf

und dann kommt dann halt irgendwie so

eine Riesenliste von Zeug, ja, dann

Klammer zu und dann kommen erstmal 100 Zeilen

Überprüfung, was man denn da bekommen hat

und Fehlerbehandlung, wenn

das irgendwie nicht so richtig zusammenpasst und so

und ich denke so, ja, okay,

Das kann man bestimmt in die besser machen.

Ja, aber

ja, es ist schon

interessant, ja, überhaupt diese ganze

Teilpainting-Geschichte oder so, da bin ich auch noch nicht so richtig

Ich mag es natürlich, wenn die

IDE mir hilft und irgendwie Dinge vorschlägt

oder unterkringelt, wo ich einen Fehler gemacht habe.

Kann Wim das auch?

Gutes Linting?

Ich weiß es gar nicht.

Ich habe das nie wirklich verwendet, glaube ich.

Also irgendwer aus dem Offline bestimmt ja.

Bestimmt, ja. Ich habe das jetzt aber gar nicht

darin verwendet bisher.

Ja, ich habe das auch selber, benutze ich das

fast nie, weil ich würde sagen,

es macht ja eigentlich auch, also wäre jetzt mein

Bauchgefühl nur dann Sinn, wenn man Pakete

schreibt, die dann halt irgendwie von anderen Leuten verwendet

werden und das mache ich eigentlich auch nicht so richtig

häufig. Daher,

ja, ich habe das, aber müssen wir mal eine Sendung

zu machen und muss ich mich damit beschäftigen, das wollte ich

auch schon immer mal tun. Das ist wirklich ein guter Grund, das mal zu

machen, ja.

Ja, und sonst, was ich auch ganz praktisch

finde, wie gesagt, man kann halt über diese

über die Package-Metadaten

kann man halt super viele praktische Sachen

mitgeben und da die PyPy-Seite halt wirklich

die gibt da unendlich viel vor und

viele Packages, die man so sieht, die nutzen das alles gar nicht,

was sehr schade ist. Also nicht nur, dass du halt dann

direkt an vorgegebener Stelle den Bug-Tracker,

das Repo, den Maintainer,

keine Ahnung was mitgeben kannst, du kannst halt auch

diese Badges nehmen, wo du dann zum Beispiel

sagst, hey, hier, das ist die aktuelle PyPy-Version

oder der Bild läuft durch oder meine Docs funktionieren

und es gibt ganz unendlich viele Sachen,

unendlich viele Tools, die man da einfach anbinden

kann und damit kann man halt,

wenn man halt mal ein Package macht und auch gerne möchte, dass Leute

das nutzen, kann man halt sehr viel

ja, ist einfach

auf die Seite. Du hast ein bisschen Convenience

dazu. Genau, Convenience und auch die Leute

einfach so ein bisschen so, hey, guck mal, ich weiß, was ich hier tue,

ich habe hier irgendwie an alles gedacht. Auch bei

diesen, da gibt es auch so Metadaten, wo du zum Beispiel sagen kannst,

in welchem Status befindet sich das?

Ist das gerade eine Alpha, ist das eine Beta, ist das

Production-ready so? Da kannst du

genau auflisten, welche Dependencies,

was ich vorhin schon meinte, bei der Matrix,

die und die Python-Version unterstütze ich, die und die Django-Version

unterstütze ich. Ist halt super praktisch, wenn halt

jemand kommt, der einfach gerade ein bisschen browset bei Python

und einfach sucht, okay, ich möchte mein Problem lösen,

welches Package geht denn für mich? Ich habe vielleicht

eine Nebenbedingung, weiß ich nicht, ich bin noch auf Django 2 oder

sowas und kann nicht so ohne weiteres hochgehen

und dann einfach siehst, ach cool, dann zerstützt das,

steht da, da muss man nicht irgendwie sich lange durch Dokus

durchgraben oder weiß der Geier,

aber es ist einfach super convenient und

da gibt es sehr viel, ich mache das tatsächlich immer so,

dass wenn ich irgendein Package gefunden habe,

dass das sehr ausführlich nutzt, dann gucke ich mir GitHub

an und klau dann da die Sachen

und schaue es mir ab,

was man alles machen kann.

Also ein gut geklautes Hype gewonnen.

Ja, auf jeden Fall.

Das wollte ich eben noch sagen, das habe ich dann

vergessen.

Inzwischen mache ich das auch meistens so,

dass ich dann halt die Tests in einem Verzeichnis habe

und das kommt halt nicht mit ins Paket.

Ich lese mir oft,

wenn ich jetzt wirklich verstehen will,

was irgendwie Software macht,

dann fange ich oft mit den Tests an, mir die anzugucken.

Aber da mache ich sowieso einen Checkout von dem

Repository, dass ich dann

in das Paket selber reingucke.

eigentlich auch nicht.

Insofern, genau, ich mache das inzwischen

auch so, dass die Tests halt nicht mehr in dem Paket mit drin sind.

Ja.

Ja, man kann schöne Sachen im Paket machen.

Auf jeden Fall. Habt ihr noch was?

Ja, also ein großer Teil, den wir jetzt

nicht haben, aber vielleicht machen wir den dann auch mal irgendwann anders,

weil es jetzt auch gar nicht so,

das betrifft ja auch eher wieder so den Data Science

Teil

Conda, das ist natürlich auch wieder eigene

Pakete. Im Grunde auch

ein eigener Teil wäre halt sowas wie

bau ich ein Binary, einfach

ein Executable-Ding irgendwie bauen kann.

Das

hätte man jetzt auch hier noch machen können,

aber ich bin nicht vorbereitet.

Keine Ahnung.

Ich muss das Ganze nochmal angucken, wie das so funktioniert.

Ich habe gerade benutzt, Leute. Also ich bin kein Fan davon

persönlich, aber

es nimmt sehr viel Kontrolle, die ich nicht

abgeben möchte, immer ab. Das muss man immer so

im Zaum halten.

Ach so. Wieso?

relativ intrusiv. Das heißt, man kann es nicht einfach so

daneben in den Rest packen.

Also ich muss zum Beispiel, um es mit PyEnv

zu benutzen, als PyEnv zu funktionieren,

mal so ein bisschen rumhacken, dass das vernünftig geht.

Ja, manchmal funktioniert es halt

auch nicht mehr richtig, das stimmt schon.

Oder es macht halt irgendwelche Pfade kaputt oder

schreibt sich in irgendwelche Systemkonflikte rein,

wo es eigentlich gar nichts zu suchen hat, wo man es dann wieder rauslöschen

muss und so. Ja, anstrengend.

Genau,

aber ist auf jeden Fall auch noch eine interessante

Geschichte. Ja, ansonsten

und

ne, war's nicht.

Fällt mir jetzt auch nichts mehr ein.

Ja.

Ja, ich glaube, eine Sache, die ist noch ganz cool,

also ich habe tatsächlich gemerkt, dass

selbst wenn ich, also wenn ich Code schreibe, dann bemühe

ich mich dann ja auch, dass der ordentlich ist, dass der getestet ist

und so weiter, aber sobald man dann anfängt,

den in Package zu legen, fallen einem sofort noch

10 Use Cases ein, die man eigentlich noch mit abdecken

sollte und die Codequalität

ist auf jeden Fall nachher immer nochmal 20-30%

besser gefühlt, wenn ich das wirklich Package-Ready

gemacht habe. Einfach, weil man dann

und denkt, ach komm, du hast so ein Spezial

für dein Projekt, ja, das weiß ich nicht,

du hast so ein separates User-Model,

das lasse ich einfach so nachdenken.

Nee, das funktioniert nicht so. Das muss man nochmal sauberziehen

und geradeziehen. Also das kann

tatsächlich sehr, sehr pädagogisch wertvoll sein,

einfach die Sachen mal

zu versuchen auszulagern,

weil man irgendwas Cooles gebaut hat.

Ja, auf jeden Fall.

Ja, wollen wir

noch Pics machen?

Habt ihr Pics der Woche?

Ja, okay.

Dann fange ich direkt an. Allerdings ist es kein Paket oder Software, sondern es ist ein Artikel, ist aber auch lang.

Viel Spaß mit. Auch von Hinex Subclassing in Python Redux.

Ich weiß nicht, ob wir den jetzt irgendwie...

Den kannst du nochmal wiederholen, bitte.

Subclassing in Python Redux.

Ja.

am 22. Juni rausgekommen.

Das ist jetzt, also gefühlt noch gar nicht so lange her,

vielleicht eine Woche oder, ja, müsste eigentlich

etwas mehr als eine Woche vielleicht sogar.

Ja, ich glaube eine Woche, zwei Tage, Jochen.

Kann sein. Ist auf jeden Fall sehr interessant,

genau, schöner, langer Artikel,

wo er irgendwie so seine Erfahrungen über die

letzten paar Jahre viel beschreibt

und was alles nicht funktioniert. Er verlinkt auch

viele sehr interessante Quellen.

Und genau, das ist so,

die Erfahrung habe ich auf jeden Fall auch schon gemacht,

dass wenn man Interfaces so,

auch wenn man Libraries schreibt, so definiert, dass sie darauf basieren, dass man dann irgendwie von den Sachen erbt, die man da geschrieben hat, dann hat man so am Anfang das Gefühl, das ist voll gut und dann irgendwann denkt man sich, oh mein Gott, was habe ich getan? Das ist schrecklich. Ich komme da nicht wieder raus.

Und ja,

beschreibt er, also das ist

auf jeden Fall,

die Zeit nehmen wir mal so einen langen, dunklen Nachmittag.

Jetzt ist gerade Sommer.

Zeit hat, dich das mal durchlesen

und da ist viel lehrreiches

Zeug drin. Sehr, sehr gut.

Guter Artikel.

Okay, interessant.

Ronny, hast du auch einen

Pick der Woche? Ein Modul, das du

wahrscheinlich möchtest?

Ich glaube tatsächlich

gerade nicht aus dem FF.

Oder irgendein Talk oder irgendwas

Interessantes?

Ja gut, ich meine, Dominik hat es ja

gerade schon irgendwie fünfmal angesprochen, dieser erste

Talk von der DjangoCon mit dem

Programming for Pleasure.

Ach ja, okay.

Ich meine, das war so schön heretisch.

Das hat auf jeden Fall

sehr, sehr viel Spaß gemacht, den zu hören.

Ich glaube,

der Talk ist so meta, den kann man sich auch gut anhören,

wenn man selbst nicht so tief

im Coding drin ist.

Das wäre vielleicht auch nochmal ganz interessant.

Es passt jetzt zwar nicht so richtig da rein, aber wie war denn

die DjangoCon, wie ist das eigentlich

aus Sicht,

ihr wart ja irgendwie Sponsor,

als Firma, wie war das

eigentlich sozusagen aus dem

Blickwinkel?

Ja, es ist schon, also wir haben uns alle

immer, also wir haben mit ein paar wenigen

Leuten im Büro geguckt, also

ein paar Leute haben von zu Hause geschaut, ein paar wenige Leute waren im Büro

und Corona und so ist ja alles nicht so einfach

und haben uns natürlich

alle immer schon gefreut, wenn dann unser nagelneues

Promo-Video dann da über ein Bildschirm

gelaufen ist

und ja, ist auf jeden Fall auch

cool, also irgendwie da das mit zu unterstützen,

da irgendwie ein bisschen

was zurückgeben zu können, weil ich meine,

wir nutzen ja schon Dango irgendwie sehr, sehr viel

und

ja, ansonsten,

man kriegt da halt so ein paar Möglichkeiten,

du kannst dann irgendwie einen Job auf

einem Slack posten, du kriegst einen Kanal,

den du dann bearbeiten kannst, das haben wir tatsächlich

gar nicht so wirklich gemacht,

weil

ja,

ja,

wir hatten da irgendwie

gar nicht so drüber nachgedacht, sage ich mal.

Also, weil es war immer so, ja klar, wir sind im Slack

und dann schreibst du mit den Leuten und

ein paar Leute haben sich noch gefragt wegen den Bewerbungen,

wie es denn damit aussieht und wie es denn ist

mit, wenn man halt

irgendwie kein Deutsch kann und mit Remote und alles mögliche.

Aber da haben halt

manche Firmen, haben da halt dann richtig Party gemacht

in ihrem Kanal und richtig dann da

den Kanal bearbeitet und

ist eigentlich auch ganz cool, weil das da so ein bisschen

ein anderes Element dazu gibt, weil das ja

es ist irgendwie,

also ich weiß gar nicht, wer das war,

und das ist schon ganz cool, weil das ist irgendwie auch eine ganz coole App,

mit den Leuten so auch jetzt als Firma

zu interagieren, ohne dass man jetzt irgendwie so direkt mit der

Mega-Werbe-Call oder sowas kommt und so

hey, ich will euch was verkaufen.

Von daher denke ich mal, also wir haben

und Jochen unterhalten sich über die Programmiersprache Python

Ich tippe mal, dass dieses Hybrid-Ding

wird auch einfach bleiben.

Ja, vor allem, ich meine,

es waren glaube ich 700 Leute

oder so im Slack, habe ich gesehen.

Normalerweise sind Django-Cons auf 300 irgendwas begrenzt

oder 400 oder so. Super für Leute, die halt gerne

irgendwie quasi denen das Geld geben möchten

und gerne dabei sein möchten, aber eh nicht können,

weil die halt irgendwo ganz weit weg wohnen

oder keine Kohle haben oder keinen Urlaub kriegen oder so.

Und die Leute einfach mitzunehmen

und trotzdem teilhaben zu lassen,

ist halt schon cool.

Ja, stimmt.

lassen. Manchmal ist es weniger Commitment,

es ist mehr so Leaching

und es gibt natürlich auch die Ausnahmen

mit Leuten, die eigentlich gerne was machen

würden, aber sich nicht trauen rauszugehen. Das ist halt

immer so schwierig.

An welcher Seite setzt du da

jetzt an? Ich habe noch nicht so

rausgefunden, was denn da die ideale

Hybridform von ist, wie man das machen kann,

ob es verschiedene Sachen dazu geben muss. Aber ich glaube also

jetzt bei der Jungle-Community, glaube ich, gibt es so viele Leute,

die da wirklich Spaß dran haben. Die Tickets sind ja auch eigentlich immer

ausverkauft, also die For-Or-Tickets. Da muss man

sich, glaube ich, keine Sorgen machen, dass man sich da selbst kannibalisiert.

also das kann ich mir jetzt nicht vorstellen

ich meine beim DagoMeter

jetzt

werden wir auch, ich meine es ist frei so wie es mit Corona

und so weiter geht, aber ist es auch

der Plan, dass wir jetzt vielleicht beim übernächsten Mal

auch wieder das im Büro machen

am nächsten Mal müssen wir mal schauen, wie das so klappt

aber dass man auch sagt

komm, wir stellen auf jeden Fall einfach eine Cam

auf und wenn jemand Lust hat, sich irgendwie

remote zuzuschalten, dann machen wir das halt

ich weiß noch nicht, ob das gut funktioniert, ob das irgendwie doof ist

ob dann vielleicht alle Leute eh sagen, boah geil

vor Ort Bier trinken

mit Leuten reden,

socialisen.

Das ist viel besser, das braucht man gar nicht.

Aber ich glaube, die Möglichkeit würde ich jetzt einfach schon

anbieten, weil wie gesagt, für manche Leute, die dann halt

irgendwo von weiter weg kommen oder

wenn jemand in der Eifel oder sowas,

also jetzt hier, Kölner Raum, Eifel ist ja

irgendwie so.

Ist dann halt teilweise vor allem

abends schwierig, hin und zurück zu kommen, wenn du nicht

extra ein Auto fährst oder so.

Und einfach die Leute noch mitzunehmen,

wenn die da Spaß dran haben, das fände ich

schon gut, das möglich zu machen. Wie gesagt,

und hat gesagt, wir müssen mal gucken, welchen Modus wir nachher dann tatsächlich fahren,

aber ich tippe mal, dass wir wahrscheinlich auf Hybrid gehen.

Du warst auch in Berlin beim Django Meter Pass, wird sich.

Ja, genau. Ich bin vom Philipp, der ist jetzt seit Januar der Organisator davon,

angeschrieben worden über LinkedIn, habe mich gefunden und hatte mich nach ein bisschen Austausch gefragt

und haben uns direkt sehr gut verstanden.

Und dann habe ich einen Gastvortrag gemacht

und habe ein

kleines, persönliches, very strongly

opinionated Best-of der Dungocon

zum Besten gegeben.

Ich dachte, du hättest über Packages geredet, schade.

Nein.

Und einfach quasi kurz erzählt, was die Talks sind

und einfach den Leuten

einfach so, hey, wenn du dich für dieses Thema interessierst,

dann kann dieser Vortrag für dich interessant sein.

Vorträge, die so ein bisschen mir vorbeigegangen

sind, habe ich dann auch relativ offen

gesagt, dass das bei mir persönlich vorbeigegangen ist, aber

und mir ging es auch gar nicht darum, zu sagen,

irgendwer ist doof oder so, sondern das waren wirklich so meine Eindrücke,

die ich quasi beim

davor sitzen, acht Stunden am Tag

mir aufgenommen habe

und einfach dann so, ja,

keine Ahnung, also zum Beispiel gab es einen Talk

über diese Interactive Shells, das ist

einfach nicht meine Welt gewesen. Ich habe

noch nie andersweise

mit diesen Sachen arbeiten müssen und

mehr als irgendwie mal mit der Django Shell

mal kurz ein Model irgendwie aus der Datenbank gucken, habe ich halt noch

nicht gemacht, so ungefähr, ja. Und dann

irgendwie zu sagen, ich will da irgendwie Betriebssystem drauf installieren

oder sowas. Es war

einfach sehr weit weg. Das nicht heißt, dass

der Talk schlecht war oder sowas. Das hat mich halt

der Webentwickler einfach nicht

abgeholt, was ja auch total legitim ist. Es ist ja auch schön,

dass das breiten Wissen ist, aber das ist

im Endeffekt das, was ich dann da

so ein bisschen erzählt habe einfach.

So, hey, wenn ihr euch dafür interessiert,

ist das cool und so, dass man halt dann,

weil wenn man nicht dabei war,

dann trotzdem vielleicht

so ein paar Ideen hat, wenn es dann irgendwann mal auf YouTube kommt.

Ich glaube, die wollten, dass die so nächste Woche mal online

stellen, die Talks. Ich weiß gar nicht, ob die das schon gemacht haben.

einen Monat, das müsste ja genau

dieses Wochenende sein.

Wann war die JungleCon? 2. Juni oder so?

2. bis 6. Juni, ja. Genau, und jetzt haben wir ja

morgen. Ja, morgen ist es weiter.

Genau, mal gucken. Ich werde das auf jeden Fall

dann auch noch in die Show Notes packen, wenn

sich das dann geben soll.

Sehr interessant. Achso, ich habe auch noch

einen Pick der Woche. Und zwar, ich weiß nicht,

ob ihr TLDR kennt.

Das gibt es auch auf PyPy und das ist eigentlich so ein

Shell-Tool. Ihr kennt bestimmt

Linux Command, um sich die

Mainpages anzugucken von einem. Was macht denn das?

und TLDR geht einen bisschen anderen Weg, ist aber sehr, sehr geil.

Also ich stehe im Moment total drauf.

Du kannst einfach das Gleiche machen wie bei Man.

Das heißt, du gibst TLDR, du kommst mal ein

und es zeigt dir nicht die Man-Patches an, sondern

die häufigsten vier oder fünf Use-Cases,

wie man das Ding benutzt.

Ah, okay, das ist super.

Das ist echt geil, weil du siehst halt direkt, wie man das benutzen kann, wenn man das benutzen will

und musst nicht erst mal irgendwie in den Man-Patches gucken,

wie war das und was heißt denn der Parameter.

Nee, du siehst halt direkt irgendwie,

wie ging das jetzt nochmal mit dem Grab oder

mit dem Find und dann weißt du direkt, ah, so benutzt man das.

Ah, total super und

Cool.

Gehe ich auch ein Short auf einer kleinen Seite, das ist auch meistens wirklich nur

passt alles auf eine Seite, kannst du angucken.

Mega geil, kann ich echt empfehlen.

Das habe ich gefunden als Teil über die

modernen Linux-Commands oder sowas.

Kennt ihr das?

Das heißt tatsächlich

Modern Linux,

muss ich kurz gucken, ja genau, Modern Unix, Entschuldigung, nicht Linux,

es gibt ja einen Unterschied,

von Ibrahimdiv und das ist

sehr schön, gibt es die verschiedensten

Erweiterungen.

Genau, das habe ich, genau, Watt, Exa, ja, ja.

Genau, genau, genau. Da ist auch das TLDR dabei.

Und viele tolle Implementierungen

auch in Rust und so, aber das ist

sehr nice, wenn man modernen Linux mag,

UDUX mag.

Ja, das TLDR ist auch auf PyPy tatsächlich und

kann sich einfach nicht schnell ziehen

und macht Spaß.

Ja, sehr cool. Wunderbar. Muss ich mir auch mal angucken.

Vor allem.

Ja, ich glaube, wir sind am Ende für diese Folge.

Vielen Dank, dass du wieder da warst, Ronny.

Vielen Dank für die Einladung.

Hat viel Spaß gemacht.

Ja, und ich würde sagen,

hört uns, wann ihr uns hören wollt, bleibt uns gewogen

morgens, mittags, abends, nachts beim Fahrradfahren

passt trotzdem ein bisschen auf

und bleibt gesund und

ja, bis zum nächsten Mal.

Alles klar. Tschüss. Tschüss. Ciao.