WEBVTT

00:00:00.880 --> 00:00:06.000
<v Ingo>Hallihallo, herzlich willkommen zu Binärgewitter Spezialausgabe 6.

00:00:06.240 --> 00:00:07.760
<v Ingo>Heute mit Flydy.

00:00:08.080 --> 00:00:11.200
<v Ingo>Hallo Internet und Felix.

00:00:11.920 --> 00:00:13.440
<v Felix>Spezial heute.

00:00:14.000 --> 00:00:18.240
<v Ingo>Genau, und meiner einer und nicht nur spezial, spezial,

00:00:18.320 --> 00:00:22.560
<v Ingo>sondern auch auf einer anderen Weise spezial, weil wir sind alle woanders.

00:00:22.880 --> 00:00:24.320
<v Ingo>Also räumlich gesehen.

00:00:24.640 --> 00:00:26.560
<v Ingo>Nicht nur geistig, das sind wir ja immer.

00:00:26.960 --> 00:00:29.520
<v Ingo>Ja, sondern auch räumlich.

00:00:32.800 --> 00:00:38.880
<v Gast 1>Also ihr dürft mich bei der Bahn bedanken, dass es jetzt die erste komplett Remote-Sendung gibt.

00:00:39.040 --> 00:00:40.320
<v Gast 1>Das ist doch auch was, oder?

00:00:40.960 --> 00:00:41.280
<v Gast 1>Genau.

00:00:41.760 --> 00:00:43.920
<v Ingo>Schreibt Liebesbriefe an die GDL.

00:00:44.480 --> 00:00:46.000
<v Ingo>Ja, oder auch nicht.

00:00:46.160 --> 00:00:46.640
<v Ingo>Oder auch nicht.

00:00:46.800 --> 00:00:47.680
<v Ingo>Nichtsdestotrotz.

00:00:48.080 --> 00:00:51.040
<v Ingo>Wir wollen heute über Programmiersprachen reden.

00:00:51.120 --> 00:00:57.600
<v Ingo>Also vor allem Programmiersprachen, die zumindest Felix und Fly die sich dieses Jahr aneignen wollen,

00:00:57.760 --> 00:01:02.240
<v Ingo>weil irgendjemand hat so eine komische Regel aufgestellt, man soll mindestens in einem Jahr eine

00:01:02.240 --> 00:01:03.040
<v Ingo>Programmiersprache lernen.

00:01:03.120 --> 00:01:06.640
<v Felix>Es war irgendein Typ, der hat es mal gesagt und seitdem wird er gequotet quasi überall,

00:01:06.720 --> 00:01:08.720
<v Felix>aber es ist natürlich gelogen, man muss das nicht machen.

00:01:08.880 --> 00:01:10.240
<v Felix>Aber es ist eine gute Sache trotzdem.

00:01:10.400 --> 00:01:13.280
<v Gast 1>Also es ist halt generell eine gute Sache, neue Dinge zu lernen.

00:01:13.840 --> 00:01:15.680
<v Felix>Genau, das ist, denke ich, kann man so sagen.

00:01:16.480 --> 00:01:20.240
<v Gast 1>Also muss jetzt nicht unbedingt eine neue Programmiersprache sein, aber es bietet sich halt an,

00:01:20.320 --> 00:01:25.920
<v Gast 1>weil es gibt zu viele davon und machen irgendwie Dinge anders und dann lernt man mal vielleicht neue

00:01:25.920 --> 00:01:32.480
<v Gast 1>Blickrichtungen auf seine Probleme und kann vielleicht auch mal Dinge in seiner,

00:01:32.640 --> 00:01:36.640
<v Gast 1>sagen wir mal, normalen Programmiersprache, die man so tagtäglich benutzt,

00:01:36.720 --> 00:01:39.520
<v Gast 1>vielleicht auch auf eine elegantere Art und Weise lösen.

00:01:39.920 --> 00:01:43.520
<v Felix>Genau, und es sieht nicht mehr alles aus wie ein Nagel, vielleicht.

00:01:43.920 --> 00:01:45.120
<v Felix>Wenn man nur einen Hammer hat.

00:01:45.360 --> 00:01:48.240
<v Gast 1>Es sei denn, du benutzt PHP, dann sieht alles aus wie ein Daumen.

00:01:51.440 --> 00:01:55.760
<v Felix>Aber wenn es so ist, wenn es so ist.

00:01:56.000 --> 00:02:02.000
<v Ingo>Ja, es ist total gut, dass sich die besten Sachen sich durchgesetzt haben, JavaScript und PHP.

00:02:02.640 --> 00:02:06.480
<v Ingo>Ja, also es ist ein Wunder der Technik, sozusagen.

00:02:06.800 --> 00:02:07.600
<v Ingo>Ein Wunder der Welt.

00:02:07.840 --> 00:02:12.640
<v Gast 1>Naja, die waren halt gerade da, als man eine Sprache gebraucht hat und die gehen halt seitdem auch nicht weg.

00:02:12.720 --> 00:02:16.880
<v Gast 1>Also ich glaube, die haben schon eine Existenzberechtigung.

00:02:17.840 --> 00:02:20.400
<v Gast 1>Ist halt die Frage, wenn man jetzt unbedingt noch eine neue Sprache lernt,

00:02:20.560 --> 00:02:23.440
<v Gast 1>ob man da noch unbedingt PHP lernen möchte.

00:02:23.600 --> 00:02:28.880
<v Gast 1>Ich meine, JavaScript, da kommt man nicht ohne weiteres drum um, wenn man irgendwie interaktive

00:02:29.040 --> 00:02:30.800
<v Gast 1>Web-Anwendungen entwickeln will.

00:02:31.040 --> 00:02:34.320
<v Gast 1>Aber sagen wir mal, serverseitig ist man da flexibler.

00:02:34.720 --> 00:02:35.280
<v Gast 1>Genau.

00:02:35.760 --> 00:02:37.520
<v Felix>Das ist ja auch eine schöne Sache eigentlich.

00:02:37.760 --> 00:02:41.680
<v Gast 1>Ja, also ich meine, und Vielfalt tut ja dem Ökosystem im Normalfall auch ganz gut.

00:02:41.760 --> 00:02:47.040
<v Gast 1>Es sei denn, solange man jetzt nicht alle zwei Wochen den neuesten Trend hinterherhechelt und dann irgendwie

00:02:47.040 --> 00:02:50.560
<v Gast 1>überhaupt nicht mehr produktiv ist, weil man sich irgendwie nur noch Hello World Tutorials durchlese,

00:02:50.640 --> 00:02:51.040
<v Gast 1>dann ist glaube ich.

00:02:51.280 --> 00:02:52.640
<v Felix>Doch, alles klar, außer man sagt.

00:02:53.360 --> 00:02:58.720
<v Ingo>Ihr seid doch jetzt alle in Go und Rust und was ist gerade noch Hip?

00:02:58.880 --> 00:02:59.680
<v Felix>RustyGo.

00:03:00.320 --> 00:03:04.320
<v Ingo>Total in alles drin, oder?

00:03:05.200 --> 00:03:06.160
<v Felix>Zum Beispiel Alexier.

00:03:06.400 --> 00:03:10.800
<v Gast 1>Ja, also Go stand ja tatsächlich auch bei mir auf der Liste, was ich,

00:03:11.360 --> 00:03:15.360
<v Gast 1>also der Sprachen, bei denen ich mir überlegt habe, sie dieses Jahr zu lernen.

00:03:15.520 --> 00:03:18.640
<v Gast 1>Ich habe mich aus unterschiedlichen Gründen, zu denen wir vielleicht später noch kommen werden,

00:03:18.800 --> 00:03:19.600
<v Gast 1>dagegen entschieden.

00:03:19.760 --> 00:03:22.640
<v Gast 1>Aber ist nichtsdestotrotz ganz interessant.

00:03:23.200 --> 00:03:24.400
<v Felix>Ja, auf jeden Fall.

00:03:24.480 --> 00:03:27.280
<v Felix>Oder man hat halt einfach die Zeit, ich meine, wenn man Student ist,

00:03:27.760 --> 00:03:30.480
<v Felix>gibt es ja quasi solche Möglichkeiten, wo man das einfach machen kann.

00:03:30.640 --> 00:03:33.440
<v Gast 1>Ja, und man kann halt vielleicht auch irgendwo mal Credits abgreifen,

00:03:34.080 --> 00:03:36.800
<v Gast 1>indem man irgendwelche Softwareprojekte implementiert.

00:03:36.880 --> 00:03:39.200
<v Gast 1>Also das war für mich immer so ein Ding, so ich habe immer versucht,

00:03:39.360 --> 00:03:42.640
<v Gast 1>Klausuren zu umgehen, um dann irgendwelche Softwareprojekte zu implementieren.

00:03:42.960 --> 00:03:44.160
<v Felix>Gute Sache.

00:03:44.640 --> 00:03:48.800
<v Gast 1>Und ich meine, da ist es auch immer mal cool, so Dinge in neuen Sprachen zu machen.

00:03:48.880 --> 00:03:54.160
<v Gast 1>Ich habe dann irgendwie Projekte mal auf Android gemacht und mal irgendwelche Dinge in Skala implementiert

00:03:54.160 --> 00:03:58.160
<v Gast 1>oder mir einen Lisp-Interpreter gebaut und so und dafür immer schön Credits kassiert.

00:03:58.240 --> 00:04:02.880
<v Gast 1>Wenn man das alles richtig einrichtet, dann kann man da auch sein Studium mit irgendwie coolen Sachen

00:04:02.880 --> 00:04:03.680
<v Gast 1>verbringen.

00:04:04.480 --> 00:04:08.480
<v Ingo>Ja, was waren denn die ersten Programmiersprachen, die ihr gelernt habt?

00:04:09.840 --> 00:04:13.520
<v Gast 1>Ich glaube, der Felix fängt an, weil das waren nur eigentlich die gleichen.

00:04:14.560 --> 00:04:20.880
<v Felix>Ja, also es hat wahrscheinlich, also es, ich meine, also es hat so angefangen.

00:04:21.040 --> 00:04:23.600
<v Felix>Man hat Computerspiele gerne gespielt.

00:04:23.840 --> 00:04:25.360
<v Felix>Jedenfalls war das bei mir so.

00:04:25.600 --> 00:04:30.080
<v Felix>Und dann wollte man quasi bestimmte Sachen, die quasi zu nervig waren,

00:04:30.240 --> 00:04:35.120
<v Felix>irgendwann mal so weit automatisieren, dass man sich auf das eigentliche Spielen konzentrieren muss und nicht

00:04:35.120 --> 00:04:36.320
<v Felix>auf die langweiligen Sachen.

00:04:36.480 --> 00:04:40.080
<v Felix>Bei mir hat es dann quasi angefangen mit Counter-Strike-Konsolenscripting.

00:04:40.240 --> 00:04:43.360
<v Felix>Das heißt, im ersten Schritt einfach bei Scripts.

00:04:43.520 --> 00:04:46.960
<v Felix>Quasi du gehst auf den Server und dann musst du erstmal die ganzen Waffen kaufen.

00:04:47.440 --> 00:04:50.480
<v Felix>Früher, damals, ja, das kennen ja viele gar nicht mehr.

00:04:50.720 --> 00:04:56.800
<v Felix>Früher musste man quasi B13, quasi, um Sachen zu kaufen, ja.

00:04:57.040 --> 00:04:58.320
<v Felix>Man musste diese Sachen drücken.

00:04:58.480 --> 00:05:00.560
<v Gast 1>Ja, also es gab keine grafischen Menüs.

00:05:00.720 --> 00:05:06.720
<v Felix>Ne, und kein Auto, das letzte Kaufen-Skript, äh, Auto, letzte Kaufen-Dinge für die Karte.

00:05:06.880 --> 00:05:07.440
<v Felix>Ja, natürlich.

00:05:07.600 --> 00:05:08.400
<v Felix>Oh mein Gott.

00:05:08.640 --> 00:05:11.040
<v Felix>Ja, es hat sich alles weiterentwickelt.

00:05:12.720 --> 00:05:14.720
<v Felix>Man muss nicht mehr diese ganzen Sachen machen.

00:05:14.880 --> 00:05:20.720
<v Felix>Und man kann quasi jetzt nur noch drücken, kauft das letzte oder kauft eine gute Waffe oder so.

00:05:22.400 --> 00:05:26.480
<v Felix>Und damals musste die musste man diese Sachen quasi noch drücken und dann wolltest du noch eine Granate und

00:05:26.480 --> 00:05:32.480
<v Felix>dann wolltest du noch ein Dings, noch eine Armor und dann wolltest du aber noch eine Granate und dann Munition

00:05:32.480 --> 00:05:32.880
<v Felix>und so.

00:05:33.040 --> 00:05:38.400
<v Felix>Und damit man das quasi nicht jedes Mal machen musste, hat man ein Skript geschrieben.

00:05:39.200 --> 00:05:45.200
<v Felix>Wenn man eine bestimmte Taste drückt, dann drücke nacheinander folgende Tasten auf der Tastatur.

00:05:45.360 --> 00:05:46.640
<v Unbekannt>Oder führe folgende Befehle aus.

00:05:47.040 --> 00:05:52.160
<v Felix>Oder führe folgende Befehle aus, die dann quasi auf Tasten drücke mappen.

00:05:52.240 --> 00:05:54.560
<v Felix>Das war bei Counter-Strike jedenfalls so.

00:05:54.720 --> 00:05:58.000
<v Felix>Und dann hat man gesagt, okay, drücke B, drücke 1, drücke 1.

00:05:58.080 --> 00:06:04.640
<v Felix>Und dann, wenn man dann zum Beispiel Komma gedrückt hat, was früher keine

00:06:04.720 --> 00:06:07.040
<v Felix>Belegung hat, ich weiß nicht, ob sich das jetzt geändert hatten.

00:06:07.200 --> 00:06:11.040
<v Felix>Oder es war bei mir jedenfalls immer das Komma, dann hat er quasi die ganzen Sachen für dich nacheinander

00:06:11.040 --> 00:06:11.760
<v Felix>eingekauft.

00:06:12.480 --> 00:06:16.800
<v Gast 1>Ich glaube, Punkt und Komma ist irgendwie so mittlerweile so Munition nachkaufen oder irgendwie sowas.

00:06:17.040 --> 00:06:17.440
<v Gast 1>Aber keine Ahnung.

00:06:17.680 --> 00:06:18.480
<v Felix>Braucht natürlich keiner.

00:06:20.080 --> 00:06:26.240
<v Felix>Genau, und das war mein quasi erster Einstieg in Programmieren und Programmiersprachen,

00:06:26.320 --> 00:06:28.320
<v Felix>auch wenn es nicht, es war natürlich nichts Richtiges.

00:06:28.400 --> 00:06:34.400
<v Ingo>Es war quasi nacheinander Bash, also nacheinander sequentiell abarbeiten.

00:06:34.880 --> 00:06:35.200
<v Ingo>Ja, genau.

00:06:35.680 --> 00:06:39.840
<v Gast 1>Nicht mal Bash, sondern du hast da auch keine Conditionals und keine Schleifen und sowas.

00:06:39.920 --> 00:06:46.320
<v Gast 1>Das ist einfach nur so Befehle aneinanderhängen, um Dinge so weitestgehend zu automatisieren.

00:06:46.400 --> 00:06:48.960
<v Gast 1>Also du hast ja jetzt keine Kontrollstrukturen oder sowas.

00:06:49.200 --> 00:06:50.000
<v Felix>Genau.

00:06:50.400 --> 00:06:57.120
<v Felix>Und das ist quasi mein erster Zusammenprall mit Sachen automatisieren,

00:06:57.200 --> 00:06:58.960
<v Felix>weil das ist ja, was Programmiersprachen machen.

00:06:59.440 --> 00:07:02.960
<v Felix>Quasi sie ermöglichen dir bestimmte Sachen zu automatisieren.

00:07:03.280 --> 00:07:09.840
<v Felix>Und wenn das quasi Befehle sind, die du normalerweise irgendwie von Hand in deinen

00:07:09.920 --> 00:07:15.360
<v Felix>Interpreter eingeben würdest, zum Beispiel bei der Command-Shell, dann hast du da mit Programmiersprachen die

00:07:15.360 --> 00:07:22.160
<v Felix>Möglichkeit, die Sachen quasi in ein großes Stück zu tun und die

00:07:22.160 --> 00:07:24.640
<v Felix>dann nacheinander abfolgen zu lassen.

00:07:25.840 --> 00:07:30.480
<v Gast 1>Also ich habe ja dann tatsächlich auch irgendwann angefangen, so man konnte da irgendwelche Textdateien

00:07:30.480 --> 00:07:35.040
<v Gast 1>editieren, mit denen man dann quasi die Menüs,

00:07:35.120 --> 00:07:40.640
<v Gast 1>die im Counter-Strike selbst angezeigt werden, verändern kann.

00:07:40.720 --> 00:07:46.480
<v Gast 1>Also quasi, man konnte ein Menü erstellen, wo man irgendwie nur noch draufklicken muss und dann auf irgendein

00:07:47.360 --> 00:07:48.960
<v Gast 1>Skript auf irgendeine Taste legen kann.

00:07:49.200 --> 00:07:49.760
<v Gast 1>Ja, genau.

00:07:49.840 --> 00:07:52.720
<v Felix>Also das war ja das war die Idee, genau.

00:07:53.520 --> 00:07:58.720
<v Gast 1>Also ich habe mir dann irgendwann auch mal, also bei mir ist das Ganze mehr oder weniger daraus entstanden,

00:07:58.800 --> 00:08:02.160
<v Gast 1>dass ich eigentlich Counter-Strike spielen wollte und mich damit irgendwie beschäftigen wollte,

00:08:02.240 --> 00:08:06.960
<v Gast 1>aber ich hatte irgendwie nur einen begrenzten Internetzugang, weil irgendwie 56K-Modem und so.

00:08:07.600 --> 00:08:11.360
<v Gast 1>Und das war irgendwie teuer und meine Eltern hatten da keinen Bock drauf.

00:08:14.320 --> 00:08:20.240
<v Gast 1>Und ich habe dann auch irgendwann mal angefangen mit dann irgendwelchen Trial- und Shareware-Versionen von

00:08:20.240 --> 00:08:24.160
<v Gast 1>irgendwelchen Install-Wizard-Geschichten, mir dann Installer zu bauen,

00:08:24.240 --> 00:08:29.360
<v Gast 1>die dann automatisch die, ich weiß es gar nicht, Half-Life-Echse oder so finden und dann das richtige

00:08:29.360 --> 00:08:32.640
<v Gast 1>Verzeichnis raussuchen und dann das Skript da irgendwie reinpacken.

00:08:32.720 --> 00:08:35.600
<v Gast 1>Und ja, das war dann so.

00:08:36.480 --> 00:08:42.400
<v Gast 1>Das war quasi so die Hochzeit des Counter-Strike-Gedönses und irgendwann habe ich dann DSL bekommen und dann

00:08:42.400 --> 00:08:44.640
<v Gast 1>sind irgendwelche anderen Dinge interessant geworden.

00:08:47.200 --> 00:08:48.400
<v Ingo>Okay, ja.

00:08:49.040 --> 00:08:50.640
<v Ingo>Internet ist verporen und so.

00:08:51.040 --> 00:08:51.120
<v Ingo>Was?

00:08:51.440 --> 00:08:52.320
<v Felix>Dafür ist das Internet?

00:08:52.560 --> 00:08:55.600
<v Gast 1>Nee, tatsächlich rede ich jetzt so programmiertechnisch.

00:08:56.240 --> 00:09:00.480
<v Gast 1>Ich hatte dann irgendwann so einen dauerhaften Internetanschluss und dann kam das IRC.

00:09:01.520 --> 00:09:02.960
<v Gast 1>Und somit auch Mirk.

00:09:03.120 --> 00:09:08.560
<v Gast 1>Das ist so ein eigentlich der de facto Standard IRC-Client für Windows.

00:09:09.360 --> 00:09:13.360
<v Gast 1>Und das Interessante ist, er hat ein ziemlich mächtiges Scripting-Interface.

00:09:13.440 --> 00:09:19.280
<v Gast 1>Und dann gab es dann auch irgendwelche Distributionen von Mirk, irgendwie Gamers IRC und No-Name Script und

00:09:19.280 --> 00:09:20.400
<v Gast 1>wie sie alle hießen.

00:09:20.640 --> 00:09:25.360
<v Gast 1>Ja, und eines Tages bin ich dann auf die Idee gekommen, ich mache mir das jetzt selber.

00:09:26.400 --> 00:09:32.160
<v Gast 1>Und ja, man kann dann halt irgendwie so da so im weitesten Sinne Event getrieben.

00:09:32.320 --> 00:09:36.720
<v Gast 1>Also man kann auf irgendwelche Events, die im Chat passieren, reagieren und man kann,

00:09:37.520 --> 00:09:42.160
<v Gast 1>hat irgendwie Kontrollstrukturen wie irgendwelche Verzweigungen und Schleifen,

00:09:42.240 --> 00:09:44.080
<v Gast 1>man kann Funktionen definieren und sowas.

00:09:44.240 --> 00:09:46.880
<v Gast 1>Ich glaube, ich habe sogar dann mit Hilfe von irgendwelchen Tutorials,

00:09:46.960 --> 00:09:53.120
<v Gast 1>die ich eigentlich nicht wirklich grundlegend verstanden habe, habe ich dann auch mal

00:09:54.400 --> 00:09:59.840
<v Gast 1>Socketprogrammierung gemacht, aber halt nur, indem ich irgendwie ein paar Strings verändert habe und jetzt

00:09:59.920 --> 00:10:06.800
<v Gast 1>irgendwie ein paar Webseiten mit meinem Mirkbot abgeholt habe und dann irgendwie ein bisschen HTML

00:10:06.800 --> 00:10:08.160
<v Gast 1>daraus gefriemelt.

00:10:08.400 --> 00:10:12.000
<v Gast 1>Also es konnte auch reguläre Ausdrücke, ich wusste aber damals noch nicht,

00:10:12.080 --> 00:10:15.760
<v Gast 1>dass es reguläre Ausdrücke sind und dass es Socketprogrammierung ist,

00:10:15.840 --> 00:10:19.840
<v Gast 1>sondern da gab es halt irgendwelche Tutorials, wo dann drin stand, ey,

00:10:20.000 --> 00:10:24.560
<v Gast 1>nimm doch mal diesen Code und verändere diese paar Parameter und dann kannst du damit irgendwelche Dinge tun.

00:10:24.800 --> 00:10:25.840
<v Felix>Das ist eine gute Sache, also.

00:10:26.000 --> 00:10:31.600
<v Gast 1>Also das ist so, ich habe da so ganz unbedarft damit angefangen und einfach mal irgendwie so Tutorials kopiert

00:10:31.600 --> 00:10:34.960
<v Gast 1>und irgendwie später dann auch irgendwelche Windows-DLLs eingebunden,

00:10:35.040 --> 00:10:41.760
<v Gast 1>um mir dann irgendwie so Baumstrukturen statt irgendwie

00:10:41.760 --> 00:10:45.360
<v Gast 1>normaler Channel-Listen anzuzeigen und sonst irgendwelche Dinge.

00:10:45.680 --> 00:10:46.160
<v Gast 1>Oh shit.

00:10:46.400 --> 00:10:49.120
<v Gast 1>Also damit habe ich dann irgendwie relativ viel Zeit verbracht.

00:10:51.760 --> 00:10:55.840
<v Gast 1>Ich glaube, danach bin ich dann eher so in die Systemadministration abgedriftet und habe irgendwie mit meinen

00:10:55.920 --> 00:10:58.800
<v Gast 1>Kompass Sporthallen gefüllt und LAN-Partys veranstaltet.

00:10:59.040 --> 00:11:00.320
<v Felix>Oh ja, die gute Zeit.

00:11:01.040 --> 00:11:07.200
<v Gast 1>Und so richtig mit so in Anführungszeichen richtigen Programmiersprachen bin ich eigentlich erst im Jahr 2004

00:11:07.440 --> 00:11:11.280
<v Gast 1>in Kontakt gekommen, als ich meine Ausbildung zum Fach Informatiker,

00:11:11.520 --> 00:11:14.480
<v Gast 1>damals noch Fachbereich Systemintegration, angefangen habe.

00:11:15.120 --> 00:11:16.880
<v Felix>Also bei mir war es ein bisschen früher.

00:11:16.960 --> 00:11:23.280
<v Felix>Ich kaum habe nämlich in meinem Abitur gab es ein Fach Informatik

00:11:23.760 --> 00:11:30.720
<v Felix>und da hatten wir auch schon richtig programmiert, so mit Java und grafischer Oberfläche zusammenfricken

00:11:30.800 --> 00:11:30.960
<v Felix>und so.

00:11:31.040 --> 00:11:32.320
<v Felix>Und das war eigentlich eine coole Sache.

00:11:32.400 --> 00:11:35.680
<v Felix>Aber es war halt viel zu wenig, ist aber ganz oft so.

00:11:36.160 --> 00:11:40.000
<v Felix>Ich hatte dann auch anderweitig dann Spaß, wo die anderen Leute quasi,

00:11:40.160 --> 00:11:45.360
<v Felix>also die anderen meine Mitschüler quasi irgendwie diese Aufgabe gemacht haben,

00:11:45.440 --> 00:11:50.640
<v Felix>hatte ich dann halt auch genug Zeit, um halt so das, was man heute unter,

00:11:50.880 --> 00:11:54.880
<v Felix>was heute unter den Hacker-Paragrafen fallen würde, vielleicht gemacht zu haben.

00:11:58.080 --> 00:12:01.200
<v Felix>Ja, halt unterschiedlich.

00:12:01.840 --> 00:12:06.160
<v Felix>Es waren ein paar Sachen und viel Unheil getrieben, aber ich habe mich nie erwischen lassen.

00:12:06.240 --> 00:12:08.160
<v Felix>Das ist ein Unterschied zu ganz behandeln Leuten.

00:12:08.400 --> 00:12:09.200
<v Unbekannt>Auf jeden Fall.

00:12:10.720 --> 00:12:13.760
<v Gast 1>Bei mir war es so, als ich dann irgendwann mal so in die Ausbildung gekommen bin,

00:12:13.840 --> 00:12:16.640
<v Gast 1>dann war es so, ja okay, ich habe Systemadministrationsdinge gemacht,

00:12:16.720 --> 00:12:21.040
<v Gast 1>dann habe ich irgendwie auf der Arbeit irgendwie Pearl programmiert oder da irgendwie mal gelernt,

00:12:21.120 --> 00:12:22.000
<v Gast 1>Pearl zu programmieren.

00:12:22.080 --> 00:12:28.000
<v Gast 1>Irgendwie in der Berufsschule haben wir Java gelernt und ich hatte zwischendurch auch mal so einwöchige Kurse,

00:12:28.080 --> 00:12:31.040
<v Gast 1>wo ich irgendwie mal so JCL gelernt habe.

00:12:31.280 --> 00:12:32.560
<v Felix>Was ist denn ein JCL?

00:12:32.800 --> 00:12:35.760
<v Gast 1>Ein JCL ist die Shop Control Language.

00:12:35.840 --> 00:12:39.680
<v Gast 1>Das ist quasi sowas wie Bash für IBM-Mainframes.

00:12:40.160 --> 00:12:40.880
<v Gast 1>Mein Bylight.

00:12:42.000 --> 00:12:42.960
<v Unbekannt>Mein Beylight.

00:12:44.240 --> 00:12:47.760
<v Gast 1>Also sowas habe ich mal und ich hatte dann auch noch so einwöchige Schulungen,

00:12:47.840 --> 00:12:51.840
<v Gast 1>wo ich dann mal richtig objektorientiert programmiere mit Java oder mit C und ich glaube,

00:12:52.000 --> 00:12:56.560
<v Gast 1>irgendwelche anderen Azubis haben da auch mal noch so Kurse gemacht,

00:12:56.640 --> 00:13:01.840
<v Gast 1>wo man mal so ein Tamagotchi-Programm in C-Sharp, so mit richtig mit GUI und so programmiert hat.

00:13:02.000 --> 00:13:05.200
<v Gast 1>Also ja, das war so, das war so quasi mein Einstieg.

00:13:06.480 --> 00:13:09.760
<v Ingo>2004 war ich schon fast wieder raus aus der Programmierung.

00:13:10.080 --> 00:13:10.960
<v Felix>So schnell geht's.

00:13:11.120 --> 00:13:12.800
<v Felix>Wie gewonnen, so zerronnen.

00:13:13.360 --> 00:13:19.760
<v Ingo>Also ich habe es auch in der Schule gelernt, aber ich habe dann auch einen Leistenskurs Informatik

00:13:19.760 --> 00:13:20.400
<v Ingo>gemacht.

00:13:20.640 --> 00:13:25.920
<v Ingo>Und ich glaube aber auch selbst im Grundkurs hatten wir schon Pascal.

00:13:26.400 --> 00:13:29.120
<v Ingo>Haben also ganz normal, ich weiß nicht, wie es heute ist an Schulen,

00:13:29.200 --> 00:13:33.120
<v Ingo>ob heute schon Java gelernt wird, aber wir haben damals Pascal.

00:13:34.320 --> 00:13:35.520
<v Felix>Das ist Vorschule eigentlich.

00:13:35.600 --> 00:13:39.600
<v Felix>Also hier in Deutschland haben wir in der Vorschule quasi Informatik schon.

00:13:39.920 --> 00:13:41.040
<v Ingo>In der Vorschule.

00:13:41.360 --> 00:13:43.200
<v Felix>Ja, kann ich einfach mal behaupten, oder?

00:13:45.600 --> 00:13:47.120
<v Gast 1>Da fehlt mir gerade der Anschluss.

00:13:49.680 --> 00:13:50.320
<v Gast 1>Na gut, dann nicht.

00:13:50.560 --> 00:13:54.240
<v Gast 1>Na gut, so die Nichte meiner Freundin, die ist jetzt irgendwie, die wird glaube ich demnächst vier,

00:13:54.480 --> 00:13:57.760
<v Gast 1>die ist jetzt noch nicht in einem Schulalter, da kriege ich noch nichts von mit und alle anderen,

00:13:57.840 --> 00:13:59.920
<v Gast 1>die sind mittlerweile schon irgendwie in höheren Klassen.

00:14:00.000 --> 00:14:04.480
<v Gast 1>Also ich kenne, glaube ich, gar niemanden, der jetzt so irgendwie so gerade in der Grundschule ist oder so.

00:14:04.720 --> 00:14:10.160
<v Ingo>Ja, aber das meiste Mal ist Informatikunterricht ja irgendwie, wie klicke ich in Excel und Word rum.

00:14:10.240 --> 00:14:11.680
<v Felix>Ja, das ist ja schon mal eine gute Sache, oder?

00:14:11.840 --> 00:14:15.360
<v Gast 1>Also das war so bei mir, also bei mir, ich war ja auf der Realschule,

00:14:15.440 --> 00:14:21.440
<v Gast 1>da hieß das dann ITG, irgendwie informationstechnische Grundlagen und da hat man dann irgendwie Webseiten mit,

00:14:21.520 --> 00:14:24.080
<v Gast 1>wie heißt dieses schreckliche Microsoft-Tool?

00:14:24.960 --> 00:14:25.600
<v Gast 1>Frontpage.

00:14:25.840 --> 00:14:26.400
<v Gast 1>Frontpage, genau.

00:14:27.040 --> 00:14:28.400
<v Felix>Oh yeah, Frontpage, das weiß ich auch.

00:14:28.800 --> 00:14:32.960
<v Gast 1>Frontpage geklickt und irgendwie, ich weiß es nicht, Dinge getan.

00:14:33.040 --> 00:14:38.960
<v Gast 1>Und ich glaube, das höchste der Gefühle war, dass man dann mal irgendwelche so klickibunti-Dingsys hatte,

00:14:39.040 --> 00:14:41.760
<v Gast 1>wo man irgendwelche Fraktale programmieren konnte.

00:14:42.240 --> 00:14:43.040
<v Gast 1>Okay, krass.

00:14:43.360 --> 00:14:50.000
<v Ingo>Also wir haben erst Pascal gelernt und dann haben wir später auch Objekt Pascal gemacht mit Borland Delphi.

00:14:50.400 --> 00:14:57.200
<v Ingo>Und da hast du dann halt schon Windows-GUIs zusammengeklickt und musstest halt irgendwelche Sachen machen.

00:14:57.840 --> 00:15:02.720
<v Ingo>Aber ich weiß, wie gesagt, nicht mehr, ob das Grundkurs oder Lastenskurs, Informatik war.

00:15:03.680 --> 00:15:10.000
<v Ingo>Dann in irgendwelchen Kursen auch mal so ein bisschen mit Ja.

00:15:11.120 --> 00:15:12.960
<v Ingo>Aber Java hatten wir, glaube ich, nicht.

00:15:16.480 --> 00:15:21.920
<v Ingo>Und womit es so richtig angefangen hat, ich habe gerade nochmal gegoogelt, es hieß Niki.

00:15:24.000 --> 00:15:26.800
<v Ingo>Ist auch nochmal eine vereinfachste Variante.

00:15:27.200 --> 00:15:28.480
<v Ingo>Niki der Roboter.

00:15:28.640 --> 00:15:32.800
<v Ingo>Und dem konntest du dann sagen, irgendwie geh links oder drehe rechts, drehe links.

00:15:32.960 --> 00:15:39.280
<v Ingo>Und das war schon nochmal ein Einstieg, um überhaupt Programmiersprache Pascal zu lernen.

00:15:39.440 --> 00:15:44.880
<v Ingo>Aber da musstest du dann halt irgendwelche Sachen ablaufen oder dem dann irgendwelche Muster machen.

00:15:45.040 --> 00:15:47.440
<v Ingo>Ich weiß nicht mehr ganz genau, wie das war.

00:15:48.640 --> 00:15:55.520
<v Ingo>Aber wir hatten halt diesen Niki-Roboter und den musste man irgendwie programmieren, dass der Sachen macht.

00:15:56.480 --> 00:15:59.680
<v Ingo>Das waren so unsere ersten Dinge, die wir in der Schule gemacht haben.

00:15:59.760 --> 00:16:04.000
<v Ingo>Und dann da ja im Studium hatten wir dann natürlich C und Java.

00:16:04.640 --> 00:16:08.320
<v Ingo>Und ich habe dann ja dann auch relativ schnell wieder aufgehört mit dem Programmieren.

00:16:08.960 --> 00:16:12.080
<v Ingo>Das Einzige, was ich heute noch mache, ist halt so ein bisschen Bash-Skripting und so.

00:16:12.160 --> 00:16:13.200
<v Ingo>Und das war es dann schon.

00:16:13.360 --> 00:16:15.760
<v Felix>Aber Bash ist ja jetzt auch schon wieder eine echte Programmiersprache.

00:16:16.000 --> 00:16:16.640
<v Felix>Muss ich mir erstmal sagen?

00:16:16.720 --> 00:16:18.000
<v Ingo>Ja, ja, ja.

00:16:18.560 --> 00:16:20.880
<v Gast 1>Wovon kann man wieder mehrere Dialekte gibt.

00:16:21.280 --> 00:16:22.480
<v Unbekannt>Ja, verdammt!

00:16:22.640 --> 00:16:24.480
<v Felix>Fucking Cornchair, ey, wer hat sich so ein Schicksal gemacht?

00:16:24.720 --> 00:16:27.760
<v Ingo>Ja, deswegen sage ich ja, deswegen sagen wir ja Bash, ja.

00:16:28.560 --> 00:16:33.360
<v Ingo>Nicht Shell-Skript-Dinger, sich Bash, schon wenn du die ZSHGs hast ja wieder.

00:16:34.240 --> 00:16:38.160
<v Felix>Was schon super wäre, wenn alle einfach POSIX-Standard implementieren würden,

00:16:38.480 --> 00:16:40.960
<v Felix>was sie auch die meisten machen und dann kann man ja schon was damit anfangen.

00:16:41.040 --> 00:16:45.680
<v Felix>Sagt man, okay, POSIC-Shell, gut genug, passt auf alle Sachen und du nimmst einfach nichts anderes her,

00:16:45.760 --> 00:16:47.520
<v Felix>was die komischen Antwortensparen hergeben.

00:16:47.600 --> 00:16:50.240
<v Gast 1>Ja, aber ich meine, in POSIX-Shell hast du ja nicht mal irgendwie Arrays oder so.

00:16:50.480 --> 00:16:52.640
<v Felix>Nee, du hast ja auch in Bash keine anständigen Arrays.

00:16:53.120 --> 00:16:57.680
<v Felix>In Bash hast du so Cancer-Arrays mit so komischen, wenn du die einmal benutzt hast,

00:16:57.760 --> 00:16:58.560
<v Felix>dann weißt du, was ich meine.

00:16:58.720 --> 00:17:01.120
<v Felix>Es ist einfach ein riesen, riesen Scheißdreck, ja.

00:17:01.920 --> 00:17:06.240
<v Gast 1>Ich glaube tatsächlich, bei allem, wo ich irgendwie auf die Idee gekommen wäre,

00:17:06.400 --> 00:17:10.400
<v Gast 1>irgendwelche erweiterten Datenstrukturen zu nehmen, da habe ich dann tatsächlich irgendwann,

00:17:10.560 --> 00:17:14.000
<v Gast 1>keine Ahnung, sei es Pearl oder Ruby oder sonst irgendwas benutzt.

00:17:14.080 --> 00:17:20.800
<v Gast 1>Und irgendwie, also ich hab tatsächlich, ich bin da relativ schnell dann doch zu anderen

00:17:20.800 --> 00:17:24.160
<v Gast 1>Programmiersprachen gekommen, wenn es um irgendwelche Automationsdinge geht.

00:17:24.560 --> 00:17:27.760
<v Gast 1>Also irgendwie so ein bisschen mehr Logik brauchen.

00:17:27.920 --> 00:17:29.680
<v Felix>Ja, Mist ist jetzt schon ein paar Mal passiert.

00:17:30.000 --> 00:17:34.720
<v Felix>Dann denkst du, okay, ich mach diese ganz kleine Sache, ganz kurz in Shell hingehackt und dann merkst du so,

00:17:34.880 --> 00:17:36.080
<v Felix>oh fuck, jetzt brauche ich noch das.

00:17:36.160 --> 00:17:38.240
<v Felix>Und jetzt brauche ich noch das und eigentlich brauche ich ein Dictionary.

00:17:38.320 --> 00:17:40.240
<v Felix>Und so, oh, das ist schon wieder verloren.

00:17:40.720 --> 00:17:45.920
<v Felix>Hättest du es gleich richtig gemacht in Python oder irgendwas, dann hätten wir dieses Problem jetzt nicht.

00:17:46.080 --> 00:17:46.240
<v Felix>Richtig.

00:17:46.480 --> 00:17:51.680
<v Felix>Aber so ist es dann, dann hat man quasi Shell-Code, der sackt und dann muss man,

00:17:51.840 --> 00:17:55.520
<v Felix>also das Einzige, was da wirklich hilft, ist wegwerfen und in einer richtigen Probiersprache bauen.

00:17:55.760 --> 00:17:58.320
<v Felix>Wenn man das merkt, weil das hilft alles nichts, das ist viel zu spät schon.

00:17:58.720 --> 00:18:05.680
<v Gast 1>Also bei mir ist es tatsächlich so, wenn ich irgendwie ein Shell-Skript nicht mehr in meiner Shell direkt

00:18:05.680 --> 00:18:08.800
<v Gast 1>schreiben kann, sondern einen Texteditor aufmachen muss, dann überlege ich es mir,

00:18:08.880 --> 00:18:10.480
<v Gast 1>ob ich es in einer anderen Sprache mache.

00:18:10.640 --> 00:18:10.960
<v Gast 1>Ja.

00:18:11.200 --> 00:18:16.640
<v Gast 1>Also ich bin dann meistens so Einzeiler, so irgendwelche While-Loops mit irgendwie ein bisschen Magic und Set

00:18:16.640 --> 00:18:18.240
<v Gast 1>und Org und sonst was mit drin.

00:18:18.480 --> 00:18:20.640
<v Gast 1>Das kriege ich noch irgendwie so hin.

00:18:21.360 --> 00:18:26.080
<v Gast 1>Und alles außenrum, also alles, was ich irgendwie so direkt in der Shell reintippen kann und alles außen

00:18:26.080 --> 00:18:30.000
<v Gast 1>runter, gucke ich dann mal, ob sich das dann überhaupt lohnt.

00:18:30.080 --> 00:18:30.800
<v Gast 1>Sagen wir es dann so.

00:18:30.960 --> 00:18:31.440
<v Gast 1>Ja, ja, klar.

00:18:31.520 --> 00:18:32.880
<v Felix>Also das muss man auf jeden Fall.

00:18:33.200 --> 00:18:33.360
<v Felix>So.

00:18:33.600 --> 00:18:35.200
<v Felix>Jetzt sind wir auch schon ganz kurz abgeschlagen.

00:18:35.520 --> 00:18:36.000
<v Felix>Genau, genau.

00:18:36.080 --> 00:18:40.720
<v Ingo>Ich wollte auch gerade sagen, okay, machen wir Schleife drum, sagen wir,

00:18:40.800 --> 00:18:43.440
<v Ingo>okay, das waren, damit haben wir so angefangen.

00:18:44.080 --> 00:18:45.440
<v Ingo>Aber was war jetzt die Idee?

00:18:45.520 --> 00:18:49.120
<v Ingo>Warum wolltet ihr euch jetzt dieses Jahr was Neues angucken?

00:18:49.680 --> 00:18:51.280
<v Felix>Flydy, möchtest du anfangen?

00:18:51.600 --> 00:18:54.080
<v Gast 1>Ich weiß nicht, ich glaube, deine Sprache ist als erstes dran.

00:18:54.640 --> 00:18:59.440
<v Felix>Oh, na gut, dann wenn meine Sprache als erstes dran ist, ist ja auch L vor E.

00:18:59.600 --> 00:18:59.920
<v Felix>Ne, eigentlich.

00:19:01.200 --> 00:19:02.240
<v Ingo>Sprechen wir nicht alle Deutsch?

00:19:02.640 --> 00:19:03.840
<v Felix>Sprechen wir nicht alle Deutsch.

00:19:04.160 --> 00:19:04.640
<v Felix>Stimmt.

00:19:04.800 --> 00:19:07.200
<v Felix>Meine erste Sprache ist Deutsch.

00:19:07.680 --> 00:19:08.000
<v Felix>So.

00:19:08.240 --> 00:19:10.720
<v Felix>Meine zweite Sprache waren diese ganzen anderen Sprachen.

00:19:10.880 --> 00:19:11.520
<v Felix>Und jetzt.

00:19:12.000 --> 00:19:14.880
<v Felix>Dieses Jahr, meine erste Sprache ist Lua.

00:19:15.520 --> 00:19:17.440
<v Felix>Und zwar aus einem ganz pragmatischen Grund.

00:19:17.520 --> 00:19:20.640
<v Felix>Nicht, weil ich gedacht habe, irgendwie, ich kann es jetzt für coole Projekte gebrauchen,

00:19:20.800 --> 00:19:27.120
<v Felix>weil ich da was Neues ausprobieren will, sondern ich habe ein paar Mal schon bei Binärgewittert Talk drüber

00:19:27.120 --> 00:19:27.920
<v Felix>geredet.

00:19:28.720 --> 00:19:33.920
<v Felix>Es gibt zurzeit ganz kleine Computer, so Mikrocontroller,

00:19:34.160 --> 00:19:40.160
<v Felix>die haben relativ viel Energie und im Gegensatz zu den ganzen anderen kackigen Mikrocontrollern mit Arduino

00:19:40.160 --> 00:19:45.520
<v Felix>und so drauf, äh, oder die Arduinos und so, ähm, können kann der Mikrocontroller,

00:19:45.600 --> 00:19:50.960
<v Felix>wenn man da eine neue Firmware drauf flasht, kann der LUR als Programmiersprache,

00:19:51.040 --> 00:19:57.440
<v Felix>als interpretierte Programmiersprache und das ist einfach so viel geiler als dieses ganze andere Shit,

00:19:57.520 --> 00:19:59.680
<v Felix>das man sonst von Mikrocontrollern herkennt.

00:20:00.960 --> 00:20:01.280
<v Felix>Und

00:20:02.910 --> 00:20:03.710
<v Felix>Seid ihr noch da?

00:20:03.870 --> 00:20:05.790
<v Unbekannt>Ja, Glück gehabt.

00:20:05.950 --> 00:20:10.510
<v Felix>So, ähm und deswegen quasi,

00:20:10.590 --> 00:20:15.790
<v Felix>ich habe mich in diese MIM-Controller Dinge eingekauft, weil die halt einfach super billig sind aus China,

00:20:15.870 --> 00:20:19.390
<v Felix>irgendwie 2,50 Dollar oder 2 Dollar jetzt wohl auch schon.

00:20:20.750 --> 00:20:27.630
<v Felix>Der SP8266 kann Wi-Fi und kann quasi eine neue Firmware geflasht

00:20:27.790 --> 00:20:32.830
<v Felix>bekommen und kann dann entsprechend Lua als Interpreter auf der Serienkonsole.

00:20:32.910 --> 00:20:37.070
<v Felix>Und dann kann man da Sachen quasi direkt reinhacken und ausprobieren und irgendwelche Dinge machen.

00:20:37.150 --> 00:20:43.550
<v Felix>Und genau aus dem Grund habe ich Lua als Programmiersprache für dieses Jahr.

00:20:44.270 --> 00:20:46.190
<v Gast 1>Das ist schon mal ein ziemlich guter Grund.

00:20:46.430 --> 00:20:50.590
<v Felix>Das ist auf jeden Fall der beste Grund, weil ich habe es gebraucht und dann habe ich es gemacht.

00:20:50.830 --> 00:20:51.470
<v Felix>Auf jeden Fall.

00:20:51.550 --> 00:20:52.990
<v Gast 1>Ich meine, das ist ja eh das Beste.

00:20:53.070 --> 00:20:54.750
<v Gast 1>Also es ist mir halt auch aufgefallen.

00:20:55.070 --> 00:20:58.910
<v Gast 1>Ich habe mir schon viele Dinge irgendwann angeguckt und jetzt nicht nur Programmiersprachen,

00:20:58.990 --> 00:21:01.470
<v Gast 1>sondern auch irgendwelche Webframeworks oder sonst irgendwie was.

00:21:01.630 --> 00:21:06.270
<v Gast 1>Und das Problem ist, das ist alles sehr, sehr flüchtig,

00:21:06.350 --> 00:21:09.150
<v Gast 1>solange man es nicht regelmäßig anwendet.

00:21:09.390 --> 00:21:12.990
<v Gast 1>Also klar, man kann es irgendwie mal angucken, man kann mal ein Buch lesen.

00:21:14.110 --> 00:21:17.630
<v Gast 1>Man kann vielleicht die Konzepte irgendwie mal so ein bisschen versuchen zu verstehen,

00:21:17.710 --> 00:21:22.110
<v Gast 1>aber meistens bekommt man es erst mit, wie es dann tatsächlich anfühlt,

00:21:22.350 --> 00:21:24.750
<v Gast 1>wenn man es mal wirklich in einem konkreten Projekt benutzt.

00:21:24.830 --> 00:21:29.870
<v Gast 1>Und das ist schon cool, dann irgendwie zu sagen, ja, okay, man hat jetzt irgendwie eine Idee und bevor man

00:21:29.870 --> 00:21:33.070
<v Gast 1>dann irgendwie sowas in C macht, was wahrscheinlich ein ziemlicher Pain wäre,

00:21:33.390 --> 00:21:35.230
<v Gast 1>kann man sich doch mal eine andere Sprache angucken.

00:21:35.390 --> 00:21:39.630
<v Felix>Genau, also der Pain geht einfach schon los, wenn du sagst,

00:21:39.710 --> 00:21:44.510
<v Felix>okay, ich habe einen String, was ja kein echter String ist, sondern so ein so ein Char-Array und ich habe

00:21:44.510 --> 00:21:45.550
<v Felix>einen anderen String.

00:21:45.710 --> 00:21:51.870
<v Felix>Und du möchtest jetzt wissen, ob du willst jetzt nur diese beiden Strings

00:21:52.110 --> 00:21:53.790
<v Felix>zusammenbatschen, ja, in C.

00:21:54.030 --> 00:21:55.630
<v Felix>Und es ist so ein Pain einfach.

00:21:56.750 --> 00:22:00.110
<v Felix>Du musst auf so viele Sachen aufpassen, du musst aufpassen, dass dir der String nicht überläuft,

00:22:00.190 --> 00:22:04.750
<v Felix>du musst ja aufpassen, dass du, keine Ahnung, diese ganzen Boundary-Checks machst und so.

00:22:04.910 --> 00:22:07.390
<v Felix>Und das ist so, so anstrengend.

00:22:07.470 --> 00:22:13.630
<v Felix>Und wenn du quasi eine höher, wie heißt es, eine High-Level-Programming Language hast,

00:22:13.710 --> 00:22:16.750
<v Felix>also irgendwas, was nicht C ist, dann kannst du sagen: Eine Hochsprache.

00:22:17.550 --> 00:22:22.270
<v Gast 1>Die C ist ja technisch gesehen auch schon eine Hochsprache, aber eine Sprache auf einem höheren

00:22:22.270 --> 00:22:23.070
<v Gast 1>Abstraktionslevel.

00:22:23.150 --> 00:22:23.710
<v Gast 1>Kann man sozusagen sagen.

00:22:23.790 --> 00:22:28.910
<v Felix>Genau, also eine Sprache, die das Konzept von Strings kennt,

00:22:29.070 --> 00:22:35.790
<v Felix>die nicht nur Char-Arrays, also Character-Arrays hat, dann ist es einfach so viel

00:22:35.790 --> 00:22:40.430
<v Felix>besser und es macht dann auf einmal Spaß, so zu sagen, okay, ich habe jetzt irgendwie,

00:22:40.510 --> 00:22:45.070
<v Felix>ich buste mir mein HTTP-Request zusammen, den ich dann antworte oder so,

00:22:45.150 --> 00:22:49.870
<v Felix>weil es quasi ist ja immer noch Mikrocontroller, das heißt, alles ist quasi noch nicht fertig und dann batscht

00:22:49.950 --> 00:22:52.110
<v Felix>man sich sein Kleinzeug halt so zusammen.

00:22:52.190 --> 00:22:57.710
<v Felix>Und das ist halt so viel besser, als wenn du das halt direkt in C machen musst.

00:22:59.710 --> 00:23:03.870
<v Gast 1>Hattest du irgendwie konkrete Projekte so im Kopf, die du jetzt dann umsetzen willst,

00:23:03.950 --> 00:23:05.790
<v Gast 1>falls ja, willst du mal irgendwie kurz drüber erzählen?

00:23:05.870 --> 00:23:10.670
<v Gast 1>Also das, was man sich vorstellen kann, was man irgendwie so jetzt gerade damit tut?

00:23:11.070 --> 00:23:17.550
<v Felix>Also dieses ganze, diese ganzen Mikrocontroller-Dinge sind interessant vorher gewesen,

00:23:17.710 --> 00:23:22.430
<v Felix>weil man damit dann irgendwelche, also quasi,

00:23:22.510 --> 00:23:28.270
<v Felix>also Mikrocontroller sind bei mir dafür da, dass man mit der echten Welt interagieren kann.

00:23:28.510 --> 00:23:35.470
<v Felix>Egal, sei es irgendwelche Sensoren, die quasi Dinge von der echten Welt aufnehmen und damit

00:23:35.470 --> 00:23:40.350
<v Felix>irgendwas machen oder Aktoren, also quasi, die was mit der, mit der echten Welt tun.

00:23:41.310 --> 00:23:45.550
<v Felix>Und in meinem Fall ist es einfach so, ich habe angefangen,

00:23:48.590 --> 00:23:51.950
<v Felix>ich habe ein Projekt mit einem Kumpel angefangen.

00:23:52.270 --> 00:23:58.910
<v Felix>Wir haben solche Cubes aus Plexiglas gebaut

00:23:59.230 --> 00:24:04.270
<v Felix>und dort eine LED quasi in Mitte rein, eine von den WS2812,

00:24:04.350 --> 00:24:08.590
<v Felix>also die LEDs, die man jetzt so quasi super billig kaufen kann,

00:24:08.670 --> 00:24:10.910
<v Felix>die man aber auch RGB steuern kann.

00:24:11.150 --> 00:24:12.110
<v Unbekannt>Okay, super cool.

00:24:12.510 --> 00:24:16.670
<v Felix>Und davon dann halt ein paar in Reihe und jetzt ist quasi das Problem,

00:24:16.750 --> 00:24:21.630
<v Felix>okay, wie sagst du diesen super tollen RGB-LEDs, was sie jetzt tun sollen?

00:24:21.870 --> 00:24:26.430
<v Felix>Und da ist der, am Anfang waren wir noch dabei zu sagen,

00:24:26.510 --> 00:24:32.190
<v Felix>okay, wir machen das irgendwie mit einem, quasi mit so einem Mini-Router und einem Arduino und dann kann man

00:24:32.190 --> 00:24:33.630
<v Felix>die quasi so ansteuern.

00:24:33.870 --> 00:24:38.190
<v Felix>Und jetzt mit den ESP-Mikrocontrollern ist es halt so,

00:24:38.350 --> 00:24:42.590
<v Felix>dass du, ähm dadurch, dass es WLAN hat, kannst du es erstmal nehmen,

00:24:42.750 --> 00:24:48.270
<v Felix>um ganz einfach quasi mit deinem Netzwerk zu reden, also auch zum Beispiel mit deinem Handy.

00:24:48.510 --> 00:24:53.630
<v Felix>Und das zweite ist halt, dadurch, dass es genug Energie hat,

00:24:53.870 --> 00:24:57.630
<v Felix>andere Sachen auch noch zu tun in der Zeit, wo es WLAN macht, kannst du es auch direkt,

00:24:57.870 --> 00:25:02.830
<v Felix>kannst du den Mikrocontroller auch direkt hernehmen, um mit den RGB-LEDs zu sprechen.

00:25:02.910 --> 00:25:06.830
<v Felix>Das heißt, du kannst diesen 1, 2,50 Dollar Mikrocontroller hernehmen,

00:25:07.070 --> 00:25:11.390
<v Felix>um zum Beispiel in deinem Netzwerk einen Server,

00:25:11.550 --> 00:25:16.510
<v Felix>also einen Web-Server aufzumachen, der dann, wo du über den dann sagen kannst,

00:25:16.830 --> 00:25:22.670
<v Felix>mach jetzt die RGB, mach jetzt die LEDs in dem Muster oder lass sie faden oder mach halt irgendwelche anderen

00:25:22.670 --> 00:25:23.550
<v Felix>coolen Sachen.

00:25:23.710 --> 00:25:29.630
<v Felix>Und das war quasi mein erster Use Case, um den Mikrocontroller zu benutzen.

00:25:29.790 --> 00:25:36.430
<v Felix>Du hast du redest, du lässt die LEDs quasi mit deinem Handy reden,

00:25:36.510 --> 00:25:38.590
<v Felix>indem du einen Mikrocontroller zwischenschaltest.

00:25:39.230 --> 00:25:40.350
<v Gast 1>Das ist schon ziemlich cool.

00:25:40.430 --> 00:25:45.710
<v Gast 1>Und ihr benutzt dann quasi HTTP jetzt als Schnittstelle, um irgendwie eine App oder ein Webinterface oder

00:25:45.710 --> 00:25:46.510
<v Gast 1>sowas zu betreiben?

00:25:47.310 --> 00:25:53.550
<v Felix>Genau, also du aktuell ist es so, dass der ein Webinterface, also ein Web-Server auf Port 80 hochfährt,

00:25:53.790 --> 00:26:00.350
<v Felix>mit dem du dann, mit dem du dann quasi eine Web-API zusammenbaust.

00:26:00.590 --> 00:26:06.350
<v Felix>Also das ist so Rest REST-like, quasi nicht ganz REST,

00:26:06.430 --> 00:26:10.990
<v Felix>aber so ein bisschen, du hast keine echte Webseite, weil dann der Mikrocontroller dann doch ein bisschen

00:26:10.990 --> 00:26:17.390
<v Felix>überfordert ist, aber du hast halt quasi die API, die du dann mit einer App auf deinem Handy ansteuern kannst.

00:26:17.550 --> 00:26:18.750
<v Unbekannt>Okay, cool.

00:26:19.870 --> 00:26:21.950
<v Felix>Ja, genau, das war quasi das erste.

00:26:22.030 --> 00:26:28.670
<v Felix>Und das nächste ist halt, du kannst alles, was du davor an Mikrocontrollern gemacht hast und dann irgendwie

00:26:28.670 --> 00:26:33.630
<v Felix>einen Computer dazu gebraucht hast, damit der Netzwerk kann, kannst du jetzt über diesen einen Mikrocontroller

00:26:33.710 --> 00:26:33.950
<v Felix>machen.

00:26:34.030 --> 00:26:38.910
<v Felix>In Lua, in der Programmiersprache, die nicht sackt, weil es zu anstrengend ist, immer was zu machen.

00:26:39.070 --> 00:26:41.470
<v Gast 1>Ja, also das mit den Mikrocontrollern ist ja schon ganz lustig.

00:26:41.550 --> 00:26:47.550
<v Gast 1>Ich habe mir vor bestimmt fünf Jahren für relativ viel Geld damals irgendwie so ein Arduino-Toolkit mit

00:26:47.550 --> 00:26:51.790
<v Gast 1>irgendwie ganz viel Zeug gekauft und Netzwerk-Shield und sonstige Sachen.

00:26:52.190 --> 00:26:57.790
<v Gast 1>Ich habe es bis heute nicht dazu gebracht, mal irgendwie da eine Firmware drauf zu flashen und mal irgendwie

00:26:58.110 --> 00:27:02.110
<v Gast 1>dann ein Programm für zu schreiben, weil ich immer gedacht habe, ja,

00:27:02.350 --> 00:27:06.910
<v Gast 1>dann muss ich da wieder C machen und da habe ich irgendwie gar nicht so Lust drauf und dann muss ich gucken,

00:27:06.990 --> 00:27:10.270
<v Gast 1>dass es, dann hat, dann hat es teil kein Wi-Fi, sondern ich brauche immer ein Netzwerk-Port,

00:27:10.430 --> 00:27:14.430
<v Gast 1>weil das ist kein Ethernet, das ist nur ein Ethernet-Shield und kein Wi-Fi-Shield.

00:27:14.670 --> 00:27:20.270
<v Felix>Ja, und dann brauchst du noch einen echten TCP-Stack quasi, der dann auch ganz schön shit ist und so.

00:27:20.670 --> 00:27:23.070
<v Gast 1>Genau, und dann ist halt auch das nächste Problem.

00:27:23.310 --> 00:27:28.110
<v Gast 1>Dann habe ich irgendwie einen Prototypen für irgendein Projekt gebastelt und will dann vielleicht 10 davon.

00:27:28.270 --> 00:27:33.390
<v Gast 1>Und dann ist es einfach nicht mehr bezahlbar, weil so dieses ganze Arduino-Zeug ist halt auch nicht irgendwie

00:27:33.790 --> 00:27:34.990
<v Gast 1>nicht besonders billig.

00:27:35.310 --> 00:27:40.270
<v Felix>Ja, genau, also dadurch, ähm, also du hast jetzt quasi die ganze Energie,

00:27:40.430 --> 00:27:46.830
<v Felix>die ganze Netzwerkenergie und dieses ganze andere Zeug hast du halt so billig zusammengehackt,

00:27:47.230 --> 00:27:50.030
<v Felix>dass es einfach für alles hernehmen kannst und dass es dann einfach super,

00:27:50.190 --> 00:27:51.310
<v Felix>super cool wird.

00:27:52.270 --> 00:27:56.910
<v Felix>Also das ist jetzt, ähm das ist jetzt, wo ich gerade dabei bin, weil zum Beispiel,

00:27:56.990 --> 00:28:00.990
<v Felix>du kannst ganz billig Sensoren kaufen, die Temperatur messen, ja.

00:28:01.070 --> 00:28:03.550
<v Felix>Also abgesehen davon, dass man die auch einfach anders kaufen kann.

00:28:03.630 --> 00:28:08.830
<v Felix>Aber du hast irgendwas, was Temperatur misst, du hast irgendwas,

00:28:08.910 --> 00:28:14.350
<v Felix>was ein kleines Display, ähm, was ein kleines Display, was man normalerweise an Arduino anschließt.

00:28:14.430 --> 00:28:20.910
<v Felix>Und diese ganzen Sachen gehen halt jetzt einfach mit WLAN an einem anderen Microcontroller viel,

00:28:21.070 --> 00:28:23.630
<v Felix>viel billiger und viel geiler einfach.

00:28:24.910 --> 00:28:25.230
<v Felix>So.

00:28:26.590 --> 00:28:31.150
<v Felix>Und deswegen Lua, meine Waffe der Wahl,

00:28:31.310 --> 00:28:36.270
<v Felix>weil es halt einfach echt Spaß macht, auch dann diese ganzen Internet of Things.

00:28:36.350 --> 00:28:39.390
<v Felix>Ich hab's gesagt, Internet of Things Dinge zu machen.

00:28:39.790 --> 00:28:40.350
<v Felix>Buzzword.

00:28:40.830 --> 00:28:42.670
<v Gast 1>Internet of Things kommt später auch nochmal.

00:28:42.910 --> 00:28:44.350
<v Felix>Oh, oh, kommt's wieder?

00:28:44.590 --> 00:28:44.910
<v Felix>Nein.

00:28:46.110 --> 00:28:48.670
<v Gast 1>Ich habe gehört, das ist gerade ganz ein ganz heißes Eisen.

00:28:48.910 --> 00:28:51.390
<v Ingo>Genau, das ist ja fast so toll wie Smartwatch.

00:28:51.550 --> 00:28:53.870
<v Ingo>Läuft Lua auf deiner Smartwatch, die du nicht hast.

00:28:53.950 --> 00:28:56.830
<v Gast 1>Ja, ihr könnt jetzt eine Smartwatch aus seinen Microcontroller anbauen.

00:28:57.230 --> 00:29:02.350
<v Felix>Genau, also das habe ich jetzt tatsächlich auch schon gesehen mit dem ESP und so einem kleinen Display dran,

00:29:02.590 --> 00:29:03.710
<v Felix>eine Smartwatch zu waren.

00:29:03.870 --> 00:29:06.190
<v Felix>Ich glaube, das ist scheiße und ich würde es niemals hernehmen.

00:29:06.750 --> 00:29:08.430
<v Felix>Aber es gibt die Möglichkeit quasi.

00:29:08.510 --> 00:29:09.790
<v Felix>Ich kann das mal raus sagen.

00:29:10.990 --> 00:29:11.390
<v Felix>Ach du.

00:29:12.350 --> 00:29:13.710
<v Unbekannt>Smartwatch.

00:29:15.070 --> 00:29:15.390
<v Unbekannt>Lua.

00:29:16.190 --> 00:29:20.590
<v Ingo>Ja, Lua ist auch so oder so gerade irgendwie heißer Scheiß.

00:29:20.670 --> 00:29:25.070
<v Ingo>Also es gibt ja auch immer mehr Serverdienste, selbst der Proso,

00:29:25.150 --> 00:29:29.310
<v Ingo>die der XMPP-Server, den ich in letzter Zeit einsetze, der ist ja auch in Lua geschrieben.

00:29:29.390 --> 00:29:34.830
<v Ingo>Also scheint irgendwie eine Programmiersprache zu sein, die doch gut im Kommen ist.

00:29:35.070 --> 00:29:37.550
<v Ingo>Auch wegen den ganzen Spielen und so.

00:29:37.630 --> 00:29:39.230
<v Ingo>Da wird ja auch oft Lua eingesetzt.

00:29:39.630 --> 00:29:41.470
<v Felix>Mit eingesetzt, das ist immer das Besondere, ja.

00:29:41.950 --> 00:29:46.750
<v Gast 1>Also ich glaube, das hat auch einen, also es hat einen speziellen Grund, warum das so ist.

00:29:46.910 --> 00:29:49.390
<v Gast 1>Und ich glaube, den kann Felix mal erläutern.

00:29:50.190 --> 00:29:53.550
<v Felix>Genau, also wir können jetzt direkt schon damit anfangen.

00:29:53.630 --> 00:29:59.790
<v Felix>Und zwar, Lua lässt sich leicht in andere Projekte einbetten,

00:30:00.110 --> 00:30:02.190
<v Felix>besonders aus zwei Gründen.

00:30:02.350 --> 00:30:09.230
<v Felix>Einmal, es hat eine relativ gute Interface-Möglichkeiten zu C und

00:30:09.230 --> 00:30:09.870
<v Felix>mit C.

00:30:10.110 --> 00:30:16.670
<v Felix>Und das zweite ist, es hat der Kern, der Lua-Kern ist sehr, sehr, sehr klein.

00:30:16.750 --> 00:30:18.590
<v Felix>Ich glaube, wie groß waren es?

00:30:18.750 --> 00:30:20.910
<v Felix>180 Kilobyte?

00:30:21.470 --> 00:30:23.630
<v Felix>120 Kilobyte Interpreter.

00:30:23.710 --> 00:30:30.670
<v Felix>Das heißt, du hast die komplette Programmiersprache mit den quasi den kompletten Kern von Lua hast du

00:30:30.670 --> 00:30:34.430
<v Felix>einen 120 Kilobyte Interpreter zusammengefasst.

00:30:35.230 --> 00:30:39.070
<v Felix>Und 120 Kilobytes sind auch für Mikrocontroller nicht mehr so viel.

00:30:39.630 --> 00:30:40.270
<v Felix>Auf dem Redner.

00:30:40.510 --> 00:30:45.630
<v Gast 1>Denn hast du halt schon eine komplette Runtime mit einer mit Garbage Collection und mit Strings und mit,

00:30:45.950 --> 00:30:49.230
<v Gast 1>wenn du willst, dann vielleicht auch irgendwie eine Art Objektorientierung.

00:30:49.550 --> 00:30:54.910
<v Felix>Genau, also du hast eine Art von Objektorientierung, wenn du das möchtest.

00:30:55.150 --> 00:31:00.110
<v Felix>Das ist ähnlich wie man das von JavaScript kennt.

00:31:00.190 --> 00:31:03.390
<v Felix>Ich glaube, wir kommen da oder genau, wir machen einfach direkt weiter.

00:31:04.430 --> 00:31:08.990
<v Felix>Du hast Key Value Stores,

00:31:09.070 --> 00:31:12.270
<v Felix>also solche Dictionaries, wie man es aus anderen Programmiersprachen kennt,

00:31:12.510 --> 00:31:18.670
<v Felix>was das primäre, das primäre Datenstruktur ist,

00:31:18.830 --> 00:31:24.990
<v Felix>neben Strings, Zahlen und ich glaube,

00:31:25.150 --> 00:31:29.230
<v Felix>es gibt noch eine interne Datenstruktur, die man sonst noch haben kann.

00:31:29.470 --> 00:31:32.510
<v Gast 1>Naja, also ich denke, Funktionen sind wahrscheinlich auch Datentypen.

00:31:33.470 --> 00:31:35.070
<v Felix>Genau, Funktionen, richtig, richtig.

00:31:35.630 --> 00:31:40.030
<v Felix>Und ja, ich glaube, das war's.

00:31:40.270 --> 00:31:44.750
<v Gast 1>Ich glaube, du hast auch so ein so ein Guide verlinkt, da stehen die ganzen Sachen.

00:31:45.070 --> 00:31:46.350
<v Felix>Oh ja, so gut, ja.

00:31:47.870 --> 00:31:52.670
<v Felix>Aber halt nur so die Basics und ein Key-Value Store, das ist so die Grundidee.

00:31:52.830 --> 00:31:58.670
<v Felix>Du hast Funktionen, die auch gleichzeitig, also First Class Functions in dem Fall sind.

00:31:58.830 --> 00:32:03.470
<v Felix>Das heißt, du kannst zum Beispiel X ist gleich,

00:32:03.630 --> 00:32:06.910
<v Felix>Function und dann machst du da quasi deine Funktion rein.

00:32:08.030 --> 00:32:14.110
<v Gast 1>Also so mehr oder weniger wie bei JavaScript, dass dann so Function mit einer benannten,

00:32:14.190 --> 00:32:20.750
<v Gast 1>also mit einem Funktionsname ist dann mehr oder weniger nur so ein syntaktischer Zucker auf eine

00:32:20.750 --> 00:32:24.270
<v Gast 1>Zuweisung Variablen zuweisung.

00:32:24.670 --> 00:32:26.590
<v Felix>Ist gleich Lambda, ist genau Lambda.

00:32:28.590 --> 00:32:34.430
<v Felix>Du hast noch nil als Datentyp, was quasi eine

00:32:35.790 --> 00:32:37.630
<v Felix>Undefined Variable ist.

00:32:38.350 --> 00:32:40.750
<v Felix>Und genau, das war es dann auch schon.

00:32:44.110 --> 00:32:47.070
<v Felix>Dann, wie machen wir am besten weiter?

00:32:47.230 --> 00:32:51.710
<v Felix>Du hast du hast eine Community hinter Lua,

00:32:51.950 --> 00:32:57.070
<v Felix>die relativ, also die ist nicht so aggressiv,

00:32:57.630 --> 00:33:02.190
<v Felix>wir machen irgendwelche großen Conventions und so, aber es ist relativ aktiv,

00:33:02.510 --> 00:33:03.790
<v Felix>Lua weiterzuentwickeln.

00:33:03.870 --> 00:33:10.830
<v Felix>Das heißt, die Lua-Programmiersprache selber ist nicht fertig, sondern die ist gerade bei 5 oder so,

00:33:10.990 --> 00:33:11.950
<v Felix>irgendwie sowas.

00:33:13.710 --> 00:33:16.110
<v Felix>Und Lua wird weiterentwickelt.

00:33:16.190 --> 00:33:22.670
<v Felix>Das heißt, auch die Internas von Lua sind nicht zwangsläufig von Version zu

00:33:22.670 --> 00:33:27.790
<v Felix>Version quasi,

00:33:27.950 --> 00:33:32.990
<v Felix>du hast, du bist nicht immer abwärtskompatibel, aber im Großen, also die Major Release,

00:33:33.550 --> 00:33:39.630
<v Felix>bis auf die Major Releases bist du hast du quasi Abwärtskompatibilität.

00:33:40.190 --> 00:33:40.510
<v Felix>So.

00:33:42.910 --> 00:33:49.870
<v Gast 1>Hast du ungefähr so im Kopf, was denn so in den größeren Releases

00:33:49.870 --> 00:33:52.030
<v Gast 1>dann so geändert wurde, an der Sprache selber?

00:33:52.110 --> 00:33:57.470
<v Gast 1>Also sind das mehr oder weniger nur interne oder interne APIs oder ändert sich da vielleicht auch so sogar

00:33:57.470 --> 00:33:59.310
<v Gast 1>noch irgendwie Syntax?

00:34:00.910 --> 00:34:04.590
<v Felix>Also ich hab's gerade nicht im Kopf.

00:34:04.750 --> 00:34:10.030
<v Felix>Ich weiß, dass in irgendeiner Version Metatables zu den

00:34:11.310 --> 00:34:15.150
<v Felix>Standard mit in die Promiersprache reingekommen sind.

00:34:16.110 --> 00:34:18.030
<v Felix>Komme ich, glaube ich, später noch zu.

00:34:18.270 --> 00:34:20.430
<v Felix>Oder den komme ich auf jeden Fall noch später noch zu.

00:34:20.670 --> 00:34:25.310
<v Felix>Und es gibt auf jeden Fall Sachen,

00:34:25.390 --> 00:34:27.950
<v Felix>die erst später in die Programmiersprache reingekommen sind.

00:34:28.590 --> 00:34:34.190
<v Felix>Aber so im Großen und Ganzen die Syntax selber habe ich jetzt nicht ändern.

00:34:34.270 --> 00:34:38.430
<v Felix>Sehen das sind dann quasi, du hast im Core hast du dann neue Funktionen,

00:34:38.510 --> 00:34:42.110
<v Felix>die dann bestimmte neue Features abbilden einfach.

00:34:46.110 --> 00:34:48.830
<v Gast 1>Irgendwas wollte ich noch fragen, aber es fällt mir bestimmt später wieder ein.

00:34:49.150 --> 00:34:50.670
<v Gast 1>Mir ist die Frage gerade entfallen.

00:34:51.470 --> 00:34:52.510
<v Felix>Genau, so.

00:34:55.150 --> 00:35:01.710
<v Felix>Wie gesagt, dadurch, dass Lua ziemlich klein ist, wird es in viele Projekte jetzt mit rein

00:35:01.710 --> 00:35:02.590
<v Felix>eingebunden.

00:35:02.830 --> 00:35:07.310
<v Felix>Man kann in Lua selber auch relativ leicht C-Funktionen einbinden.

00:35:07.390 --> 00:35:12.830
<v Felix>Das heißt, man sagt, okay, ich habe irgendwas, was schnell, was sehr effizient sein muss.

00:35:13.150 --> 00:35:17.070
<v Felix>Und ich möchte aber für alles andere trotzdem noch Lua verwenden.

00:35:17.150 --> 00:35:21.950
<v Felix>Das ist jetzt so der typische Use Case für Mikrocontroller.

00:35:22.670 --> 00:35:28.910
<v Felix>Weil du hast, du hast zwar schon ein gewisses Subset,

00:35:29.310 --> 00:35:34.270
<v Felix>der sehr effizient sein muss, zum Beispiel der Netzwerkstack, aber du hast auch bestimmte Sachen,

00:35:34.430 --> 00:35:37.470
<v Felix>die du halt convenient und einfach verwenden willst.

00:35:37.790 --> 00:35:42.510
<v Felix>Und das genau da bietet dann Lua quasi die Möglichkeit,

00:35:42.910 --> 00:35:49.150
<v Felix>diese Brücke zu schlagen, indem du relativ leicht C-Code aus Lua

00:35:49.310 --> 00:35:50.350
<v Felix>aufrufen kannst.

00:35:51.790 --> 00:35:54.590
<v Gast 1>Jetzt ist mir gerade wieder eingefallen, was ich eigentlich sagen wollte.

00:35:54.670 --> 00:36:01.550
<v Gast 1>Und zwar der Grund, weshalb Lua so von der Sprache und von den Datenstrukturen so simpel gehalten

00:36:01.550 --> 00:36:07.790
<v Gast 1>ist, ist wahrscheinlich auch, weil man sich als Ziel gesetzt halt so möglichst interoperabel mit C

00:36:07.790 --> 00:36:09.150
<v Gast 1>interagieren zu können.

00:36:09.550 --> 00:36:13.470
<v Gast 1>Also ich würde mal sagen, dass es dann wahrscheinlich so wenige Datenstrukturen gibt,

00:36:13.630 --> 00:36:18.110
<v Gast 1>weil man die ja auch irgendwie dann alle auf C mappen muss und dann eine Möglichkeit bieten muss,

00:36:18.190 --> 00:36:23.630
<v Gast 1>dass man die aus C zugreifen kann und halt auch andersrum,

00:36:23.790 --> 00:36:27.790
<v Gast 1>dass man halt auch quasi von C Dinge benutzen kann.

00:36:27.870 --> 00:36:31.630
<v Gast 1>Also von C-Libraries oder von irgendwie deinen Betriebssystem-Calls oder sowas.

00:36:31.950 --> 00:36:38.830
<v Felix>Genau, also wenn man sich das in C, wenn man in C mal ein Modul

00:36:38.830 --> 00:36:40.750
<v Felix>schreiben will, dann funktioniert das normalerweise so.

00:36:40.830 --> 00:36:47.070
<v Felix>Du hast eine C-Funktion und die bekommt als Übergabe-Parameter ein LUR-Objekt,

00:36:47.470 --> 00:36:51.470
<v Felix>was du dann quasi mit ein paar Funktionen so auseinanderfremen kannst und kannst dann schauen,

00:36:51.550 --> 00:36:54.350
<v Felix>ob es eine Zahl ist oder ob es irgendwie ein Array ist oder so.

00:36:54.750 --> 00:36:56.910
<v Felix>Und das ist auch so schon die Grundidee.

00:36:56.990 --> 00:37:03.710
<v Felix>Du gibst auch als Rückgabewert immer ein LUR-Objekt zurück und alles andere,

00:37:03.790 --> 00:37:08.270
<v Felix>was dann quasi C ist, kannst du dann relativ leicht so einfügen, quasi.

00:37:08.590 --> 00:37:14.510
<v Felix>Sieht ähnlich aus wie die Python C APIs,

00:37:14.670 --> 00:37:15.710
<v Felix>wo das genauso funktioniert.

00:37:15.790 --> 00:37:20.670
<v Felix>Du kriegst dann quasi so ein Python-Objekt, was du dann dann auseinanderfrickeln kannst in C,

00:37:20.750 --> 00:37:23.710
<v Felix>um damit dann irgendwelche Sachen schnell zu machen.

00:37:23.950 --> 00:37:29.550
<v Gast 1>Ich habe da jetzt, also in Ruby gibt es sowas, das nennt sich FFI, das Foreign Function Interface.

00:37:29.710 --> 00:37:31.790
<v Gast 1>Und ich glaube, das macht so was ähnliches.

00:37:32.030 --> 00:37:34.510
<v Gast 1>Ich habe es jetzt selber noch nicht so direkt verwendet.

00:37:34.750 --> 00:37:39.470
<v Gast 1>Ich glaube aber, da ist es halt auch so, man erbt von irgendeinem Objekt und definiert dann irgendwelche

00:37:39.470 --> 00:37:41.870
<v Gast 1>Callbacks, die dann halt mehr oder weniger das Richtige tun.

00:37:41.950 --> 00:37:46.910
<v Gast 1>Und irgendwelche, wenn man jetzt zum Beispiel irgendwelche C-Strucks referenzieren will,

00:37:46.990 --> 00:37:51.550
<v Gast 1>dann baut man sich da halt Rapper-Klassen außenrum, die dann halt richtig zugewiesen werden und so.

00:37:54.350 --> 00:37:58.590
<v Felix>Genau, ich muss mich korrigieren, es ist nicht 5.5, sondern 5.3.

00:37:58.830 --> 00:37:59.470
<v Felix>Am 12.

00:37:59.870 --> 00:38:02.670
<v Felix>Januar 2015 kam die letzte Version raus.

00:38:03.390 --> 00:38:03.710
<v Felix>So.

00:38:05.310 --> 00:38:10.350
<v Felix>Wir haben es schon gesagt, Lua ist eine interpretierte, imperative,

00:38:10.670 --> 00:38:15.070
<v Felix>funktionale Programmiersprache, die, wenn man sich dann ein bisschen verkrepelt,

00:38:15.150 --> 00:38:17.310
<v Felix>auch objektorientiert verwendet werden kann.

00:38:18.750 --> 00:38:23.870
<v Gast 1>Wobei funktional würde ich sagen, sie hat funktional Eigenschaften.

00:38:25.470 --> 00:38:30.270
<v Felix>Ja, also es ist so wie mit den meisten Sachen, man in Lua,

00:38:30.510 --> 00:38:33.550
<v Felix>man kann das so hinbiegen, dass sich das funktional anfühlt.

00:38:34.750 --> 00:38:36.910
<v Ingo>Können wir nochmal kurz sagen, was funktional bedeutet?

00:38:37.070 --> 00:38:38.350
<v Ingo>Also was ist da der Unterschied?

00:38:38.990 --> 00:38:44.670
<v Ingo>Wenn ich jetzt eine objektorientierte, eine funktionale und eine prozedurale Programmiersprache habe.

00:38:44.990 --> 00:38:45.710
<v Ingo>Imperativ.

00:38:45.870 --> 00:38:46.750
<v Unbekannt>Oder imperativ, ne?

00:38:46.990 --> 00:38:50.430
<v Felix>Genau, imperativ heißt quasi nacheinander Dinge abarbeiten.

00:38:50.590 --> 00:38:52.030
<v Gast 1>Also sowas wie jetzt irgendwie C.

00:38:52.190 --> 00:38:58.990
<v Gast 1>Du hast halt so die Möglichkeit, Code auszuführen und du kannst halt irgendwelche Subroutinen

00:38:58.990 --> 00:39:01.950
<v Gast 1>oder Funktionen oder wie man es auch immer nennen will, definieren.

00:39:02.430 --> 00:39:05.630
<v Gast 1>Und dein Code wird halt von oben nach unten abgearbeitet.

00:39:05.790 --> 00:39:06.990
<v Unbekannt>So, mehr oder weniger.

00:39:07.310 --> 00:39:08.190
<v Felix>Genau.

00:39:08.830 --> 00:39:13.070
<v Gast 1>Und ja gut, die Idee in Objektorientierung ist halt, du hast Objekte,

00:39:13.150 --> 00:39:16.430
<v Gast 1>wie der Name schon sagt, und die haben halt Methoden und Eigenschaften.

00:39:16.590 --> 00:39:22.590
<v Gast 1>Und ich glaube, das hat wahrscheinlich so jeder der Hörer schon irgendwann mal gesehen.

00:39:22.910 --> 00:39:27.790
<v Gast 1>Im Normalfall ist es halt so, du hast halt klassenbasierte Objektorientierung oder viele Sprachen machen das

00:39:27.790 --> 00:39:30.350
<v Gast 1>so, da definierst du mehr oder weniger dann halt so ein Grundgerüst,

00:39:30.430 --> 00:39:36.110
<v Gast 1>wie sieht denn dein Objekt aus, definierst, was für Attribute hat das und was für Verhalten,

00:39:36.190 --> 00:39:38.190
<v Gast 1>also was für Methoden hängen da dran.

00:39:38.750 --> 00:39:42.910
<v Gast 1>Und dann hast du halt, keine Ahnung, zum Beispiel einen

00:39:44.830 --> 00:39:51.310
<v Gast 1>HTTP-Client, der wirft dann zum, äh, gibt dir zum Beispiel ein Response-Objekt zurück und dann kannst du das

00:39:51.310 --> 00:39:56.750
<v Gast 1>Response-Objekt zum Beispiel fragen, ob es denn, ob der Request erfolgreich war oder sowas.

00:39:57.230 --> 00:39:57.870
<v Gast 1>Ähm.

00:39:58.790 --> 00:40:01.990
<v Gast 1>Und ja, funktional ist dann halt wieder so eine Sache.

00:40:02.550 --> 00:40:07.910
<v Gast 1>Funktional kommt eigentlich eher so aus dem aus der mathematischen Definition von einer Funktion so,

00:40:07.990 --> 00:40:13.350
<v Gast 1>also das, was man einer Funktion in einer mathematischen Funktion übergibt,

00:40:14.070 --> 00:40:19.430
<v Gast 1>da bekommt man dann, also mit dem gleichen Input bekommt man immer den gleichen Output und wenn man von einer

00:40:19.430 --> 00:40:26.070
<v Gast 1>puren funktionalen Sprache redet, was die eigentlich quasi nicht viel Sinn hätte,

00:40:26.150 --> 00:40:31.190
<v Gast 1>weil dann könnte man eigentlich nur Input reinwerfen und würde jedes Mal den gleichen Output zurückwerfen,

00:40:31.270 --> 00:40:35.270
<v Gast 1>aber könnte sich halt kein State halten oder nicht mit der restlichen Welt interagieren,

00:40:35.350 --> 00:40:38.310
<v Gast 1>weil das mehr oder weniger gegen diese, wie soll ich sagen, die gegen.

00:40:38.630 --> 00:40:40.950
<v Felix>Nebenwirkung heißt es normalerweise.

00:40:41.030 --> 00:40:46.390
<v Felix>Also du hast bei rein funktionalen Programmiersprachen hast du keine Nebenwirkung.

00:40:46.550 --> 00:40:53.110
<v Felix>Und eine Nebenwirkung wäre zum Beispiel auch, wenn du in einer Funktion auf

00:40:53.110 --> 00:40:56.070
<v Felix>deine Konsole schreibst mit irgendwie Print.

00:40:56.150 --> 00:40:57.510
<v Felix>Das wäre zum Beispiel auch schon eine Nebenwirkung.

00:40:57.670 --> 00:41:02.870
<v Gast 1>Ich meine, das ist jetzt, sagen wir mal, bei so Real-World funktionalen Programmiersprachen,

00:41:02.950 --> 00:41:08.230
<v Gast 1>die es ja tatsächlich gibt, die tatsächlich auch im Einsatz sind, ist das jetzt nicht ganz so streng genommen,

00:41:08.390 --> 00:41:14.230
<v Gast 1>aber es gibt halt schon zum Beispiel die Einschränkung, dass Datenstrukturen nicht veränderbar sind,

00:41:14.390 --> 00:41:17.510
<v Gast 1>sondern dass eine Datenstruktur mehr oder weniger, also du hast jetzt eine Liste,

00:41:17.590 --> 00:41:19.830
<v Gast 1>da steht Fu Babs drin.

00:41:20.230 --> 00:41:23.430
<v Gast 1>Und diese Liste, da kannst du davon ausgehen, das ist wie ein Wert.

00:41:23.510 --> 00:41:26.950
<v Gast 1>Und wenn du einen Wert hast, der jetzt zum Beispiel 23 ist, so ein Integer,

00:41:27.030 --> 00:41:30.790
<v Gast 1>da gehst du auch nicht davon aus, dass du irgendwann mit diesem Wert was machst,

00:41:30.870 --> 00:41:35.110
<v Gast 1>sondern da steht plötzlich 24 drin, weil sich der unterwegs verändert hat.

00:41:35.350 --> 00:41:36.310
<v Gast 1>Und ja.

00:41:36.790 --> 00:41:40.630
<v Ingo>Also das heißt auch, wenn ich einmal definiert habe, dass es ein Integer ist,

00:41:40.710 --> 00:41:43.190
<v Ingo>dann bleibt der auch immer und ich kann ihn nicht überladen oder sowas.

00:41:43.750 --> 00:41:48.390
<v Gast 1>Nee, das, was du jetzt meinst, ist mehr oder weniger so die Typdefinition.

00:41:48.550 --> 00:41:49.830
<v Gast 1>Das muss nicht unbedingt sein.

00:41:49.910 --> 00:41:55.190
<v Gast 1>Also es gibt zum Beispiel, können wir ein bisschen vorgreifen, Elixir ist zum Beispiel eine dynamisch

00:41:55.190 --> 00:41:58.550
<v Gast 1>typisierte funktionale Programmiersprache.

00:41:59.670 --> 00:42:05.990
<v Gast 1>Du kannst da schon Werte neu zuweisen, aber das ist dann ein neuer Wert.

00:42:06.150 --> 00:42:09.510
<v Gast 1>Aber die Werte an sich, also wenn du jetzt eine Liste hast, da steht irgendwie,

00:42:09.670 --> 00:42:14.070
<v Gast 1>da stehen Inhalte drin, dann wird sich diese Liste nicht verändern.

00:42:14.230 --> 00:42:20.390
<v Gast 1>Also die ist nicht das gleiche Speicherobjekt, oder der gleiche Teil,

00:42:20.550 --> 00:42:25.430
<v Gast 1>der da quasi in deinem Arbeitsspeicher drin steht, den kannst du nicht modifizieren.

00:42:25.590 --> 00:42:29.270
<v Gast 1>Sondern du kannst halt nur sagen, okay, ich möchte jetzt vielleicht da ein Element hinzufügen,

00:42:29.430 --> 00:42:34.950
<v Gast 1>aber dann bekommst du halt eine neue Liste zurück und nicht wie du es zum Beispiel jetzt in C oder vielleicht

00:42:34.950 --> 00:42:41.430
<v Gast 1>auch in Java oder sowas machen würdest, du hängst jetzt was an und dann werden deine

00:42:41.430 --> 00:42:43.750
<v Gast 1>Objekte im Speicher modifiziert.

00:42:43.830 --> 00:42:44.390
<v Gast 1>Das ist halt so.

00:42:45.430 --> 00:42:50.710
<v Felix>In Lua hast du da beides von, also als Beispiel jetzt, du hast Strings,

00:42:50.870 --> 00:42:55.190
<v Felix>also ja quasi Strings, die,

00:42:55.430 --> 00:43:01.110
<v Felix>wenn du einen String an einen anderen String heranhängst, bekommst du als Rückgabe,

00:43:01.270 --> 00:43:03.350
<v Felix>bekommst du einen neuen String zurück.

00:43:03.430 --> 00:43:07.830
<v Felix>Das heißt, du veränderst den String oder einen von den beiden Strings nicht.

00:43:08.550 --> 00:43:15.510
<v Felix>Und dann hast du aber auch diese Dictionaries oder wie heißen diese Objekte,

00:43:15.830 --> 00:43:17.590
<v Felix>die selber Referenzen sind.

00:43:17.670 --> 00:43:21.430
<v Felix>Das heißt, wenn du die einer Funktion mitgibst und die hängt da irgendwas mit dran,

00:43:21.750 --> 00:43:28.230
<v Felix>dann wird das Objekt für alle, also für alle Instanzen, auch alle unterliegenden Funktionen und so

00:43:28.230 --> 00:43:29.030
<v Felix>geändert.

00:43:29.350 --> 00:43:35.910
<v Felix>Und das ist genau diese Nebenwirkung, die da dann quasi mit

00:43:35.910 --> 00:43:37.190
<v Felix>reinspielt.

00:43:38.390 --> 00:43:44.070
<v Gast 1>Genau, und also bei funktionalen Programmiersprachen, da ist halt, natürlich geht es darum,

00:43:44.150 --> 00:43:50.950
<v Gast 1>dass man mit Funktionen arbeitet und dass man die auch als Werte, also so man kann eine Funktion einer

00:43:50.950 --> 00:43:57.430
<v Gast 1>Variable zuweisen, man kann Funktionen, andere Funktionen, also eine Funktion kann eine andere Funktion als

00:43:57.750 --> 00:44:02.230
<v Gast 1>Wert zurückliefern oder du kannst eine Funktion als Wert übergeben.

00:44:02.310 --> 00:44:05.110
<v Gast 1>Das ist quasi dieses Konzept der First Class Functions.

00:44:05.430 --> 00:44:10.710
<v Gast 1>Da geht es auch drum, aber es geht halt auch sehr viel um State, was halt dann auch bei so

00:44:10.710 --> 00:44:14.870
<v Gast 1>Parallelprogrammierung interessant sein kann.

00:44:15.110 --> 00:44:18.230
<v Gast 1>Wo wir gerade beim Thema waren, gibt es da irgendwelche Konstrukte in Lua,

00:44:18.550 --> 00:44:24.790
<v Gast 1>um so, also entweder um Dinge zu parallelisieren oder um Gleichzeitigkeit irgendwie

00:44:24.790 --> 00:44:25.830
<v Gast 1>abzubilden?

00:44:28.310 --> 00:44:35.270
<v Felix>Du hast, also so wie es

00:44:35.270 --> 00:44:42.230
<v Felix>gerade im Mikrocontroller verwendet wird, hast du normalerweise callback-basierte Funktionsaufrufe.

00:44:42.310 --> 00:44:46.390
<v Felix>Das heißt, du registrierst Callbacks auf Funktionen, zum Beispiel auf I.O.

00:44:46.790 --> 00:44:50.150
<v Felix>oder auf, also zum Beispiel auf Netzwerkfunktionen und sagst, okay,

00:44:50.470 --> 00:44:55.270
<v Felix>wenn sich jemand auf diesen Port verbindet, dann rufe folgende Funktion auf.

00:44:55.430 --> 00:44:55.910
<v Felix>Okay, das ist ja.

00:44:56.470 --> 00:45:02.070
<v Felix>Aber du hast kein, also in Lua in der in dem kompletten,

00:45:02.230 --> 00:45:06.950
<v Felix>also in dem Groß-Lua mit allen Sachen, hast du was?

00:45:08.150 --> 00:45:10.710
<v Felix>Müsste ich jetzt aber erstmal raussuchen, aber ich finde das für dich.

00:45:11.030 --> 00:45:13.830
<v Gast 1>Ich habe irgendwas im Hinterkopf, das Lua Coroutine unterstützt.

00:45:13.910 --> 00:45:17.910
<v Gast 1>Dabei bin ich mir nicht sicher, ob das irgendwie eine Library ist oder ob das irgendwie.

00:45:18.470 --> 00:45:22.470
<v Gast 1>Ich hab da mal im Zuge meiner Bachelor-Thesis mal irgendwo eine Masterarbeit gelesen,

00:45:22.550 --> 00:45:27.910
<v Gast 1>wo einer, ich glaube, ein Actal-Model in Lua Coroutine implementiert hat oder so.

00:45:28.070 --> 00:45:34.550
<v Felix>Also du hast ein Modul, das nennt sich Coroutine ab Version 5.2?

00:45:35.350 --> 00:45:36.790
<v Gast 1>Also quasi ab der aktuellen.

00:45:37.270 --> 00:45:38.230
<v Felix>5.3 ist aktuell.

00:45:38.390 --> 00:45:39.750
<v Gast 1>Ah, okay, ab der vorletzten dann.

00:45:40.150 --> 00:45:40.470
<v Gast 1>Genau.

00:45:40.550 --> 00:45:47.270
<v Felix>Also genau, und das beschreibt quasi du hast eine

00:45:47.270 --> 00:45:53.510
<v Felix>Möglichkeit, Coroutinen mit neuen Entries zu erzeugen und die dann

00:45:53.910 --> 00:46:00.870
<v Felix>entsprechend du hast Resume-Status und Create quasi als von diesem,

00:46:01.030 --> 00:46:06.310
<v Felix>von diesem von dieser von diesem Modul und

00:46:08.070 --> 00:46:10.870
<v Felix>kannst du es dann quasi mit diesen Q-Routinen verwenden.

00:46:13.350 --> 00:46:19.510
<v Gast 1>Also was ich zum Beispiel weiß von so Sachen wie Prosody zum Beispiel,

00:46:19.670 --> 00:46:26.230
<v Gast 1>die benutzen dann halt so einfach so Event Loop-Libraries wie libf oder

00:46:27.510 --> 00:46:28.470
<v Gast 1>lib Event.

00:46:29.430 --> 00:46:34.790
<v Gast 1>Also die kann man das sind quasi in C geschriebenen Libraries für so Netzwerkdienste,

00:46:34.950 --> 00:46:40.950
<v Gast 1>die halt dann so relativ robust auf unterschiedlichen Plattformen dann eine Event Loop implementieren.

00:46:41.190 --> 00:46:44.710
<v Gast 1>Und da gibt es scheinbar dann Rapper für Lua, die man dann halt auch benutzen kann.

00:46:44.790 --> 00:46:51.190
<v Gast 1>Und zumindest bei Prosody, die benutzen, glaube ich, libev oder libf,

00:46:51.990 --> 00:46:56.230
<v Gast 1>was diese Event Library von,

00:46:57.190 --> 00:46:59.750
<v Gast 1>die aus Node.js raus entstanden ist.

00:47:01.910 --> 00:47:05.270
<v Gast 1>Und ja, genau.

00:47:06.150 --> 00:47:12.710
<v Felix>Genau, also ich weiß jetzt gar nicht, wie NoteM2, also das ESP-Mic-Controller-Zeug,

00:47:12.790 --> 00:47:16.950
<v Felix>das macht, aber ich glaube, die haben auch eine eigene Event-Loop oder sie haben eine hergenommen.

00:47:18.070 --> 00:47:19.750
<v Gast 1>A ne mittlerweile heißt Lib UV.

00:47:25.510 --> 00:47:32.230
<v Felix>So, genau, also das ist ja auch, wenn man Sachen so

00:47:33.510 --> 00:47:37.910
<v Felix>asynchron machen will, dann geht es, dann kommt man ja eigentlich gar nicht an der Event-Loop mehr vorbei.

00:47:38.070 --> 00:47:43.350
<v Felix>Weil das, also ich habe jetzt schon ein paar Sachen gesehen, ich habe auch viel mit Thread schon gemacht und

00:47:43.350 --> 00:47:43.590
<v Felix>so.

00:47:43.670 --> 00:47:45.590
<v Felix>Das ist eigentlich vor der Pain, ja.

00:47:45.750 --> 00:47:47.670
<v Felix>Also es ist richtig, richtig anstrengend.

00:47:47.830 --> 00:47:54.390
<v Felix>Und eigentlich willst du sagen, okay, mach mal irgendwelche Dinge und dann

00:47:54.710 --> 00:47:55.670
<v Felix>tu das auch noch.

00:47:55.750 --> 00:47:57.750
<v Felix>Und wenn es fertig ist, dann sag mir Bescheid.

00:47:57.830 --> 00:47:58.150
<v Felix>Quasi.

00:47:58.230 --> 00:48:03.750
<v Felix>Das ist, denke ich, also besonders auch, sieht man ja auch, sieht man ja quasi nur in,

00:48:04.230 --> 00:48:06.310
<v Felix>also das hat man früher nur in JavaScript gesehen.

00:48:06.470 --> 00:48:11.110
<v Felix>Was hat sich jetzt auch viel bei anderen Sachen durchgesetzt, dieses Callback-Driven

00:48:12.950 --> 00:48:15.430
<v Felix>quasi Verarbeitung von Dingen.

00:48:15.830 --> 00:48:22.550
<v Gast 1>Ja, also ich glaube, die Sache ist halt die, JavaScript ist halt eine Sprache, die ein GUI getrieben hat.

00:48:22.710 --> 00:48:29.350
<v Gast 1>Und bei GUIs ist es im Endeffekt eigentlich schon so, dass man da seit jeher mit Event Loops gearbeitet hat,

00:48:29.430 --> 00:48:34.310
<v Gast 1>weil du klickst irgendwo auf einen Button und dann wird ein Event abgefeuert und was du halt davor machst,

00:48:34.390 --> 00:48:38.710
<v Gast 1>ist dann irgendwie dir eine Struktur bereitzulegen, um dann auf diese Events zu reagieren,

00:48:38.790 --> 00:48:44.710
<v Gast 1>aber letzten Endes rufst du deinen Code nicht selbst auf, sondern du benutzt,

00:48:45.110 --> 00:48:50.230
<v Gast 1>also der wird mehr oder weniger von einer Bibliothek, die du außenrum verwendest,

00:48:50.310 --> 00:48:53.110
<v Gast 1>aufgerufen, wenn du irgendwie GUI-Programmierung machst im Normalfall.

00:48:53.270 --> 00:48:53.990
<v Gast 1>Ja, genau.

00:48:54.150 --> 00:48:59.350
<v Gast 1>Und ich glaube, aus dieser Welt kommt das und da passt JavaScript halt relativ gut rein,

00:48:59.430 --> 00:49:04.790
<v Gast 1>weil JavaScript halt mehr oder weniger dazu gedacht ist, ja, du klickst irgendwie Elemente auf eine Webseite

00:49:04.790 --> 00:49:05.910
<v Gast 1>und dann passieren Dinge.

00:49:06.150 --> 00:49:07.510
<v Felix>Ja, genau.

00:49:08.150 --> 00:49:13.430
<v Gast 1>Und ja, das Interessante ist halt, letzten Endes ist halt so ein Dienst,

00:49:13.750 --> 00:49:20.150
<v Gast 1>der irgendwie Netzwerksachen oder auf irgendwelche Netzwerke-Events reagiert oder

00:49:20.150 --> 00:49:25.190
<v Gast 1>irgendwie als Webserver fungiert oder sowas, ist ja letzten Endes auch nichts anderes.

00:49:25.270 --> 00:49:31.990
<v Gast 1>Der wartet halt irgendwo auf Dinge und reagiert dann dementsprechend drauf und da ist halt dann

00:49:31.990 --> 00:49:36.950
<v Gast 1>irgendwie, ist es dann halt auch sinnlos, das Rad jedes Mal neu zu erfinden und dieses Ganze drumrum,

00:49:38.230 --> 00:49:41.590
<v Gast 1>was schon öfters mal gelöst wurde, jedes Mal von Hand zu implementieren.

00:49:41.670 --> 00:49:42.870
<v Gast 1>Darum gibt es jetzt halt auch so.

00:49:42.950 --> 00:49:48.950
<v Gast 1>Es gibt irgendwie ein paar Libraries, die so Event-Loops implementieren und letzten Endes machen die alle das

00:49:48.950 --> 00:49:51.430
<v Gast 1>gleiche oder machen alle Dinge ähnlich, sagen wir es mal so.

00:49:51.510 --> 00:49:52.470
<v Felix>Ja, genau.

00:49:52.950 --> 00:49:58.710
<v Felix>Weil es sich einfach auch, also so wie ich das jetzt gesehen habe, das ist schon cooler einfach.

00:49:58.870 --> 00:50:04.070
<v Felix>Es macht einfach mehr Spaß, dann genau solche Sachen zu implementieren.

00:50:04.150 --> 00:50:08.150
<v Felix>Du sagst, okay, ich habe irgendwie was, was passiert und dann möchte ich wissen,

00:50:08.230 --> 00:50:10.070
<v Felix>oder möchte ich was machen, wenn es fertig ist.

00:50:10.630 --> 00:50:13.030
<v Felix>Und es fühlt sich mehr richtig an, einfach.

00:50:13.670 --> 00:50:18.390
<v Gast 1>Also, was noch eine Alternative dazu wäre, wäre das Ecta-Model, da können wir dann später bei Elixir noch ein

00:50:18.390 --> 00:50:21.430
<v Gast 1>bisschen drüber reden, weil das da sehr stark drauf sitzt.

00:50:22.310 --> 00:50:26.950
<v Gast 1>Aber sagen wir mal so generell für Dinge, die man vor allem,

00:50:27.030 --> 00:50:29.750
<v Gast 1>die man jetzt auf einem Microcontroller macht, ist es auf jeden Fall cool,

00:50:29.830 --> 00:50:31.910
<v Gast 1>sowas mit einer Event-Loop zu handeln.

00:50:32.950 --> 00:50:38.230
<v Gast 1>Ein Problem ist halt, wenn du jetzt zum Beispiel Sachen, du möchtest irgendwas super high-performance machen

00:50:38.230 --> 00:50:44.710
<v Gast 1>oder du möchtest irgendwie größere Berechnungen machen und möchtest dann auf mehrere CPU-Kerne

00:50:44.870 --> 00:50:50.230
<v Gast 1>gehen, dann ist so ein Event-Loop halt immer ein bisschen blöd, weil im Normalfall sind diese Systeme so

00:50:50.230 --> 00:50:54.150
<v Gast 1>gebaut, dass sie halt nur einen Prozessor ausnutzen und dass du dann halt,

00:50:54.230 --> 00:50:57.190
<v Gast 1>dass dann gesagt wird, ja okay, wenn du mehrere Dinge parallel machen willst,

00:50:57.270 --> 00:51:03.670
<v Gast 1>also tatsächlich parallel auf einem Mehrkernsystem, dann startet er halt dann mehrere Prozesse.

00:51:04.070 --> 00:51:04.630
<v Gast 1>Ja, ja.

00:51:05.030 --> 00:51:09.670
<v Gast 1>Und also da gibt es halt dann noch Schwächen und eine andere Schwäche ist halt,

00:51:09.750 --> 00:51:13.830
<v Gast 1>wenn du irgendwie sowas, solche Dinge tust, die irgendwie länger dauern,

00:51:13.990 --> 00:51:18.630
<v Gast 1>dann blockierst du damit halt auch alles andere, was in dieser Event-Loop passiert.

00:51:18.710 --> 00:51:18.870
<v Gast 1>Genau.

00:51:18.950 --> 00:51:23.670
<v Felix>Aber man muss immer sehen, speziell für so Kleinkomputer, dass ein Context-Switch,

00:51:23.830 --> 00:51:28.230
<v Felix>also ein Wechsel von einem Thread zum anderen, ist teuer.

00:51:28.550 --> 00:51:32.630
<v Felix>Das kostet relativ viel Zeit, das überhaupt zu machen, weil du ja quasi,

00:51:32.710 --> 00:51:37.750
<v Felix>du hast Register, die du dann zwischenspeichern musst, und du hast du musst den kompletten Call-Stack

00:51:37.750 --> 00:51:38.550
<v Felix>wiederherstellen.

00:51:38.870 --> 00:51:39.270
<v Felix>Genau.

00:51:39.910 --> 00:51:45.750
<v Felix>Genau, und du musst dann kompletten State wieder so zurücksetzen,

00:51:45.830 --> 00:51:48.790
<v Felix>wie der bei dem anderen oder bei dem jetzt Red ist.

00:51:48.950 --> 00:51:52.550
<v Gast 1>Genau, also im Endeffekt, du musst halt den kompletten State, den dein Programm hat,

00:51:52.710 --> 00:51:57.910
<v Gast 1>inklusive Register, inklusive Stack und so weiter, musst du einfach erstmal zwischenspeichern,

00:51:57.990 --> 00:52:02.710
<v Gast 1>dann lässt du irgendjemand anders so Arbeit tun und dann musst du den aber trotzdem,

00:52:03.110 --> 00:52:07.110
<v Gast 1>dann musst du den Status oder den Zustand wiederherstellen und dann kannst du erst weitermachen.

00:52:07.190 --> 00:52:12.550
<v Gast 1>Und das ist halt auf moderner Hardware ist das alles kein Problem, weil diese Tausendschnell.

00:52:12.870 --> 00:52:17.990
<v Gast 1>Ja, die sind einfach so super schnell, dass es, also die Prozessoren heutzutage sind einfach so super schnell,

00:52:18.310 --> 00:52:24.310
<v Gast 1>dass es einfach egal ist oder in vielen Fällen egal ist und auch wenn du mal irgendwie ein paar tausend

00:52:24.470 --> 00:52:28.710
<v Gast 1>Threads stattest, geht dann dein Computer nicht unbedingt in die Knie.

00:52:29.590 --> 00:52:31.910
<v Gast 1>Aber es ist trotzdem nichts, was du unendlich benutzen kannst.

00:52:31.990 --> 00:52:38.790
<v Gast 1>Und wenn du halt einfach nur ein bisschen mit der Außenwelt in Form von Netzwerk oder so

00:52:38.790 --> 00:52:41.030
<v Gast 1>kommunizieren willst, also wenn du einfach irgendwie I.O.

00:52:41.190 --> 00:52:46.070
<v Gast 1>machen willst oder einfach nur mit deiner Festplatte reden willst und Dinge vom Pfeilsystem lesen willst oder

00:52:46.070 --> 00:52:50.310
<v Gast 1>so, dann ist es halt vielleicht auch nicht angebracht, dafür jede Dateizugriff irgendwie ein Thread

00:52:50.310 --> 00:52:50.950
<v Gast 1>aufzumachen.

00:52:51.670 --> 00:52:54.710
<v Gast 1>Und da ist dieses Modell eigentlich schon ganz cool.

00:52:57.430 --> 00:52:58.870
<v Felix>Es funktioniert auf jeden Fall.

00:52:59.430 --> 00:53:04.870
<v Gast 1>Ja, dadurch, dass halt Lua, also wir haben es glaube ich mal kurz angesprochen,

00:53:04.950 --> 00:53:09.590
<v Gast 1>aber Lua hat ja dieses Konzept von, du hast eine Funktion als Wert.

00:53:10.790 --> 00:53:14.870
<v Gast 1>Und das macht es halt auch relativ einfach, um dann so mal schnell dir was zusammenzuhacken,

00:53:14.950 --> 00:53:21.830
<v Gast 1>was dann auf ein Event reagiert, weil du kannst einfach eine Funktion definieren und die irgendeiner anderen

00:53:21.830 --> 00:53:26.550
<v Gast 1>Funktion übergeben und sagst, registrier mich doch mal auf diesen Event und führ dann,

00:53:27.030 --> 00:53:28.630
<v Gast 1>wenn der auftaucht, diese Funktion auf.

00:53:28.790 --> 00:53:29.190
<v Gast 1>Bam.

00:53:29.350 --> 00:53:29.910
<v Gast 1>Ja, genau.

00:53:30.230 --> 00:53:33.750
<v Gast 1>Und ja, wie machst du das in anderen Sprachen?

00:53:33.830 --> 00:53:36.470
<v Gast 1>Wenn du jetzt sowas wie C hast, ja, okay, du kannst dann sagen, okay,

00:53:36.710 --> 00:53:39.670
<v Gast 1>du holst dir mal einen Pointer auf eine Funktion.

00:53:39.910 --> 00:53:41.190
<v Felix>Du hast Function Pointers.

00:53:41.350 --> 00:53:42.470
<v Felix>Ja, du kannst sie hernehmen.

00:53:43.030 --> 00:53:43.830
<v Felix>Du kannst sie die hernehmen.

00:53:43.910 --> 00:53:46.550
<v Gast 1>Das Problem ist bloß, du hast keine Closures außenrum.

00:53:46.950 --> 00:53:47.510
<v Gast 1>Ja, genau.

00:53:48.070 --> 00:53:49.350
<v Gast 1>Sollen wir mal Closure erklären?

00:53:49.590 --> 00:53:49.830
<v Gast 1>Ja.

00:53:50.070 --> 00:53:50.950
<v Gast 1>Willst du es oder ich?

00:53:51.430 --> 00:53:52.550
<v Felix>Nee, mach du, du darfst.

00:53:52.950 --> 00:53:57.350
<v Gast 1>Also Clojure ist quasi ein Mechanismus, wenn man so eine anonyme Funktion hat,

00:53:57.510 --> 00:54:03.750
<v Gast 1>dass man die Umgebung um diese Funktion außenrum

00:54:04.390 --> 00:54:06.630
<v Gast 1>in dieser Funktion zugreifen kann.

00:54:06.710 --> 00:54:10.710
<v Gast 1>Also man hat jetzt quasi irgendwie ein Skript und da ist eine Funktion definiert und da hat man vielleicht

00:54:10.710 --> 00:54:17.030
<v Gast 1>außerhalb irgendwie eine Variable foo und eine Variable bar und dann kann man in der Funktion drin

00:54:17.990 --> 00:54:22.790
<v Gast 1>diese Variablen lesen, im Zweifelsfall normalerweise auch schreiben,

00:54:23.110 --> 00:54:25.110
<v Gast 1>wenn es irgendwie eine imperative Sprache ist.

00:54:26.150 --> 00:54:29.990
<v Gast 1>Und heutzutage hat man eigentlich fast nur noch lexikalische Closures.

00:54:30.070 --> 00:54:34.710
<v Gast 1>Also das heißt, es gibt da so einen Unterschied, es gibt lexikalische und dynamische Closures.

00:54:36.390 --> 00:54:40.950
<v Gast 1>Lexikalisch bedeutet einfach, da wo die Funktion definiert ist,

00:54:41.590 --> 00:54:46.310
<v Gast 1>also in dem Scope, wo die Funktion definiert ist, kann man auf die Umgebung zugreifen.

00:54:46.390 --> 00:54:51.670
<v Gast 1>Und dynamisch bedeutet, in dem Scope, wo die Funktion ausgeführt wird, kann man auf den Scope zugreifen.

00:54:54.150 --> 00:55:00.390
<v Gast 1>Ist so ein bisschen ein Unterschied, aber heutzutage, ich kenne eigentlich kaum Sprachen,

00:55:00.550 --> 00:55:04.710
<v Gast 1>die einen dynamisch gescopte Closures haben.

00:55:06.310 --> 00:55:08.710
<v Gast 1>Also mir wird jetzt zumindest spontan keine einfallen.

00:55:08.790 --> 00:55:11.830
<v Gast 1>Vielleicht können uns da mal die Hörern den Kommentaren korrigieren oder so,

00:55:11.910 --> 00:55:13.510
<v Gast 1>wenn wir irgendwie Quatsch erzählen.

00:55:13.830 --> 00:55:15.830
<v Gast 1>Aber auf jeden Fall ist es halt so dieses Ding.

00:55:15.910 --> 00:55:20.310
<v Gast 1>Und klar, man kann sowas auch in C machen, aber es ist halt irgendwie mit Schmerz verbunden.

00:55:20.390 --> 00:55:24.150
<v Gast 1>Also man kann eigentlich quasi alles in C machen, aber es ist halt immer mit Schmerz verbunden.

00:55:24.390 --> 00:55:25.030
<v Gast 1>Ja, richtig.

00:55:25.270 --> 00:55:26.390
<v Felix>Das ist genau das Ding.

00:55:27.590 --> 00:55:31.510
<v Gast 1>Also ich weiß nicht, wenn ihr jetzt begeisterte C-Programmierer seid, dann nimmt es mir ein bisschen.

00:55:31.670 --> 00:55:32.470
<v Gast 1>Dann geht weg einfach.

00:55:33.110 --> 00:55:33.910
<v Gast 1>Einfach nicht zuhören.

00:55:33.990 --> 00:55:35.990
<v Gast 1>Nee, das ist einfach, das ist einfach eine Geschmackssache.

00:55:36.710 --> 00:55:37.030
<v Gast 1>Ja, genau.

00:55:37.110 --> 00:55:38.630
<v Felix>Und ihr habt einen ganz schön schlechten Geschmack.

00:55:41.670 --> 00:55:42.470
<v Felix>Nein, Quatsch.

00:55:42.630 --> 00:55:45.030
<v Felix>Also man kann alles machen und besonders wenn man dafür bezahlt wird,

00:55:45.110 --> 00:55:47.030
<v Felix>gehen ja ganz viele Sachen dann auf einmal doch.

00:55:49.110 --> 00:55:54.710
<v Felix>Aber so um ein bisschen Spaß zu haben, am Sachen zusammenhacken,

00:55:54.790 --> 00:55:57.750
<v Felix>ist C einfach nicht die richtige Waffe zu einfach.

00:55:58.310 --> 00:56:01.110
<v Gast 1>Ja, vor allem halt auch, weil man so viel falsch machen kann.

00:56:01.190 --> 00:56:05.110
<v Gast 1>Also das Problem ist halt, ja okay, du kannst hier schon mal irgendwas zusammenhacken,

00:56:05.190 --> 00:56:08.310
<v Gast 1>aber dann musst du dann deinen Code ständig kompilieren, dann musst du erstmal gucken,

00:56:08.390 --> 00:56:12.630
<v Gast 1>okay, was für einen C-Compiler hast du, was für eine Standard,

00:56:12.950 --> 00:56:17.030
<v Gast 1>was für eine Lib-C hast du, oder musst dich entscheiden, implementierst du,

00:56:17.350 --> 00:56:21.910
<v Gast 1>machst du den Superschmerz und implementierst alles in Ansi C, was es natürlich ziemlich portabel macht,

00:56:21.990 --> 00:56:27.750
<v Gast 1>weil du dann halt nicht auf irgendwelche unterschiedlichen Lib-C-Implementierungen und deren Differenzen

00:56:27.750 --> 00:56:28.710
<v Gast 1>angewiesen bist.

00:56:29.350 --> 00:56:30.630
<v Gast 1>Aber es ist halt dann immer so.

00:56:30.870 --> 00:56:31.670
<v Felix>Du kannst dann halt auch nichts.

00:56:31.830 --> 00:56:34.710
<v Gast 1>Ja, du kannst dann halt nichts und musst dann halt das komplette Rad neu erfinden.

00:56:34.870 --> 00:56:35.590
<v Gast 1>Verdammt.

00:56:36.230 --> 00:56:43.190
<v Gast 1>Und ja, das ist halt dann so in einer höheren, also in einer Sprache mit einer höheren Abstraktion ist

00:56:43.190 --> 00:56:48.230
<v Gast 1>man dann halt im Normalfall auch echt flexibler und produktiver,

00:56:48.310 --> 00:56:51.430
<v Gast 1>weil man halt nicht ständig das irgendwie da nur damit beschäftigt ist,

00:56:51.510 --> 00:56:55.110
<v Gast 1>das Rad zu entfernen, äh, neu zu entfernen, äh, neu zu erfinden, meine ich.

00:56:56.310 --> 00:57:00.470
<v Felix>Auf genau.

00:57:00.710 --> 00:57:05.830
<v Felix>Deswegen, also weil Leute ja nicht auf so viel Schmerz stehen, ganz oft,

00:57:06.070 --> 00:57:07.830
<v Felix>gibt es ja auch einfach nur andere Probleme-Sprachen.

00:57:07.910 --> 00:57:10.550
<v Felix>Also, sonst könnten wir ja auch alles in C machen, also es wäre ja alles kein Ding.

00:57:10.710 --> 00:57:16.550
<v Felix>Dann könntest du es im C in C zum Beispiel so machen, du willst einen Scope mitgeben,

00:57:17.110 --> 00:57:23.670
<v Felix>dann hast du quasi so eine andere Datenstruktur, die du halt dann zusätzlich mitgibst zu deinem Function

00:57:23.750 --> 00:57:23.910
<v Felix>Pointer.

00:57:24.150 --> 00:57:28.870
<v Gast 1>Ja, ich meine, du könntest ja die Sachen, die Daten, die deine Funktion jetzt zur Verfügung haben will,

00:57:28.950 --> 00:57:33.750
<v Gast 1>dafür könntest du dir jetzt einen Struct anlegen, was quasi mehr oder weniger einen Speicherbereich ist,

00:57:33.910 --> 00:57:38.470
<v Gast 1>in dem dann halt definiert große Daten drin sind, die du dann da zugreifen kannst.

00:57:38.950 --> 00:57:44.550
<v Gast 1>Dann musst du das halt jedes Mal mitnehmen und überall mitgeben und dann hast du halt vielleicht auch noch das

00:57:44.550 --> 00:57:49.510
<v Gast 1>Problem, dass du vielleicht aus mehreren Threads gleichzeitig irgendwo zugreifen kannst.

00:57:49.590 --> 00:57:54.710
<v Gast 1>Dann musst du irgendwie wieder dafür sorgen, dass da irgendwie keine parallelen Zugriffe deine Daten kaputt

00:57:54.710 --> 00:57:55.350
<v Gast 1>machen und ja.

00:57:55.750 --> 00:57:58.470
<v Felix>Genau, dann brauchst du Logging wieder und genau.

00:57:58.630 --> 00:58:02.150
<v Gast 1>Und dann hast du vielleicht irgendwelche, wenn du zu viel logst, hast du vielleicht wieder irgendwelche

00:58:02.150 --> 00:58:05.270
<v Gast 1>Deadlogs, dass dein Programm plötzlich steht und du weißt nicht warum.

00:58:05.510 --> 00:58:06.310
<v Gast 1>Ja, genau.

00:58:07.190 --> 00:58:08.150
<v Gast 1>Ist nicht so schön.

00:58:08.470 --> 00:58:11.190
<v Felix>Nicht so richtig, also nicht so richtig viel Spaß einfach.

00:58:11.270 --> 00:58:12.150
<v Felix>Das ist ja das Ding.

00:58:13.910 --> 00:58:14.230
<v Felix>So.

00:58:15.910 --> 00:58:18.390
<v Felix>Genau, haben wir das.

00:58:19.990 --> 00:58:23.910
<v Gast 1>Ich glaube, du wolltest noch ein bisschen über die Metatable-Geschichten reden.

00:58:24.070 --> 00:58:24.310
<v Gast 1>Genau.

00:58:25.350 --> 00:58:27.750
<v Gast 1>Also ich glaube, First Class Function haben wir soweit mal abgearbeitet.

00:58:28.950 --> 00:58:30.550
<v Gast 1>Ingo, gibt es von dir noch irgendwelche Fragen?

00:58:30.630 --> 00:58:31.350
<v Gast 1>Du bist gerade so still.

00:58:32.070 --> 00:58:35.510
<v Ingo>Ja, ich frag dann dazwischen nachher.

00:58:35.990 --> 00:58:42.710
<v Felix>Okay, genau, bei Lua, man muss es wissen, Indizes starten bei 1.

00:58:42.950 --> 00:58:43.270
<v Felix>So.

00:58:44.230 --> 00:58:46.630
<v Felix>Ich hab's gesagt und keiner mag es.

00:58:46.790 --> 00:58:47.110
<v Felix>So.

00:58:48.230 --> 00:58:48.550
<v Felix>Warum?

00:58:49.190 --> 00:58:49.590
<v Felix>Warum?

00:58:49.670 --> 00:58:52.150
<v Felix>Das ist eine gute Frage, ist sie beschrieben.

00:58:53.750 --> 00:58:54.470
<v Felix>Okay, ja.

00:58:54.790 --> 00:58:55.190
<v Felix>Und zwar.

00:58:55.430 --> 00:58:58.230
<v Ingo>Naja, mein kommt ja aus so einer katholischen Schule, gell?

00:58:58.950 --> 00:59:00.310
<v Felix>Irgendwo muss es herkommen, ja.

00:59:00.550 --> 00:59:07.430
<v Felix>Und zwar beschreibt diese, die Lua-Fuck beschreibt in Mathematical Notation

00:59:07.590 --> 00:59:10.630
<v Felix>Array Indices count from one and so does Lua.

00:59:10.870 --> 00:59:13.110
<v Felix>In other words, they are not offsets.

00:59:13.750 --> 00:59:17.430
<v Felix>Also kannst du quasi den Index kannst du nicht als Offset verwenden.

00:59:17.750 --> 00:59:23.510
<v Felix>Zum Beispiel sagst du, du willst jedes

00:59:24.790 --> 00:59:31.590
<v Felix>fünft Element nehmen, wenn du quasi hochzählst, dann sagst du den Index mal 5.

00:59:32.390 --> 00:59:38.470
<v Felix>Dann bist du nämlich bei 0 auf Index 0 und bei 1 bist du auf Index 5 und dann kannst du quasi so durchzählen.

00:59:38.790 --> 00:59:44.150
<v Felix>Das geht mit Lua nicht, weil es halt wie gesagt keine Offset sind, sondern ähm

00:59:44.830 --> 00:59:46.910
<v Felix>Ja, mathematische Indizes.

00:59:47.150 --> 00:59:49.950
<v Felix>Muss man wissen, ansonsten ist mich verloren.

00:59:50.350 --> 00:59:53.950
<v Felix>Und dann fangen an, Leute anzuweinen und so.

00:59:54.590 --> 00:59:56.030
<v Ingo>Muss man sich umstellen.

00:59:56.350 --> 00:59:57.390
<v Felix>Ja, das kann man.

00:59:58.990 --> 01:00:03.390
<v Gast 1>Also im Chat wurde gerade irgendwie so ein bisschen kritisiert, dass wir hier so auf C rumhacken,

01:00:03.470 --> 01:00:06.990
<v Gast 1>weil ja ganz viele anderen Sprachen auch in C implementiert sind.

01:00:07.070 --> 01:00:08.910
<v Felix>Ja, richtig, genau, und das ist der Punkt.

01:00:09.950 --> 01:00:12.430
<v Gast 1>Ist schon so, muss aber auch nicht zwingend der Fall sein.

01:00:12.510 --> 01:00:17.070
<v Gast 1>Also ich meine, wenn du mal in der Lage bist, also klar,

01:00:17.150 --> 01:00:23.230
<v Gast 1>du musst mit irgendwas anfangen, was nach was in nativen Maschinencode kompiliert,

01:00:23.310 --> 01:00:25.070
<v Gast 1>damit du das direkt ausführen kannst.

01:00:25.150 --> 01:00:30.030
<v Gast 1>Aber wenn du dann mal so einen Compiler hast, dann kannst du quasi den benutzen,

01:00:30.350 --> 01:00:34.590
<v Gast 1>um dir einen Compiler in deiner Sprache selber zu bootstrappen und das machen tatsächlich auch sehr viele

01:00:34.590 --> 01:00:34.990
<v Gast 1>Sprachen dann.

01:00:35.230 --> 01:00:39.390
<v Felix>Genau, zum Beispiel PyPy ist Python ein Beispiel dafür.

01:00:39.710 --> 01:00:44.350
<v Gast 1>Genau, PyPy, es gibt auch, sagen wir, mir fällt der Name gerade nicht mehr ein.

01:00:44.430 --> 01:00:50.430
<v Gast 1>Es gibt von Python gibt es ein Subset, was direkt nach C

01:00:50.670 --> 01:00:54.190
<v Gast 1>kompiliert werden kann und somit dann auch wieder einen nativen Code.

01:00:54.430 --> 01:00:58.510
<v Gast 1>Ich glaube, PyPy ist da drin geschrieben, mir fällt der Name nur gerade nicht ein.

01:00:58.670 --> 01:01:00.990
<v Felix>Uh, kriegen wir bestimmt Hilfe.

01:01:01.550 --> 01:01:02.270
<v Felix>Bestimmt Hilfe.

01:01:02.750 --> 01:01:03.870
<v Gast 1>Ich google mal schnell.

01:01:04.110 --> 01:01:05.550
<v Felix>Oh yeah, wir googeln.

01:01:07.470 --> 01:01:10.750
<v Felix>Es gibt für Lua gibt es.

01:01:12.350 --> 01:01:15.710
<v Gast 1>Also so wie Python, nur mit einem großen C vorne.

01:01:16.030 --> 01:01:18.030
<v Felix>Ja, also das ist okay.

01:01:21.230 --> 01:01:23.950
<v Felix>Unter Lua gibt es Lulu.

01:01:27.230 --> 01:01:30.430
<v Gast 1>Großartiger Projektname, wenn ich mal die Leute sagen.

01:01:32.430 --> 01:01:39.390
<v Felix>Genau, und es gibt noch Meta-Lua, was quasi ein

01:01:40.190 --> 01:01:46.510
<v Felix>Superset von Lua in Standard-Lua-Bytecode kompiliert.

01:01:47.470 --> 01:01:48.590
<v Felix>Und genau.

01:01:49.710 --> 01:01:52.910
<v Felix>Lulu auf jeden Fall für Lua 5.1.

01:01:53.870 --> 01:01:55.470
<v Felix>Unterstützt Lua 5.1.

01:01:58.270 --> 01:01:58.990
<v Felix>Was gibt es denn?

01:01:59.070 --> 01:01:59.310
<v Felix>Ruby?

01:01:59.390 --> 01:02:00.270
<v Felix>Komm, das muss jetzt sein.

01:02:00.590 --> 01:02:01.790
<v Unbekannt>Ruby gibt's Rubius.

01:02:02.750 --> 01:02:06.990
<v Gast 1>Das ist quasi, also das Ding ist ja, Ruby läuft ja auch in der VM.

01:02:07.630 --> 01:02:13.710
<v Gast 1>Und da ist es quasi so, Rubinius ist so ein ganz, ganz kleiner Typ auf,

01:02:14.910 --> 01:02:15.230
<v Gast 1>na?

01:02:15.470 --> 01:02:19.470
<v Gast 1>Jetzt fällt mir der Name von diesem Compiler-Dings hier nicht mehr ein.

01:02:20.350 --> 01:02:20.990
<v Gast 1>Damn.

01:02:21.230 --> 01:02:21.470
<v Gast 1>Na?

01:02:23.150 --> 01:02:26.750
<v Gast 1>Dieser alternative C-Compiler, der auch von Apple die ganze Zeit verwendet wird.

01:02:29.870 --> 01:02:30.670
<v Felix>Was meinst du?

01:02:31.790 --> 01:02:33.230
<v Felix>Wonach suchst du?

01:02:37.710 --> 01:02:38.670
<v Unbekannt>Mir fällt es nicht ein.

01:02:39.070 --> 01:02:40.190
<v Felix>Nein, da kommt er weiter.

01:02:40.510 --> 01:02:43.470
<v Ingo>GCC, sondern den C-Lang.

01:02:43.950 --> 01:02:48.990
<v Gast 1>C Lang und C-Lang basiert auf LLVM, genau, die LOL-Firden-Maschine.

01:02:49.070 --> 01:02:49.870
<v Gast 1>Oh, jetzt haben wir es.

01:02:50.110 --> 01:02:51.710
<v Gast 1>Sorry, ich stand gerade total auf dem Schluss.

01:02:51.950 --> 01:02:52.510
<v Gast 1>Das ist okay.

01:02:52.990 --> 01:02:53.790
<v Felix>Seid ihr vergeben?

01:02:54.110 --> 01:02:56.830
<v Gast 1>Und ja genau, bei Rubinius funktioniert das quasi so.

01:02:56.910 --> 01:03:03.390
<v Gast 1>Die haben, setzen auf LLVM auf, haben dann ganz kleinen in C  ⁇  implementierten Kern und implementieren

01:03:03.390 --> 01:03:07.390
<v Gast 1>quasi die ganzen Standardlibraries, die ganzen Datentypen, alles außenrum,

01:03:07.550 --> 01:03:11.630
<v Gast 1>was sie können, bis auf diesen minimalen Kern implementieren sie halt auch in Ruby.

01:03:13.390 --> 01:03:16.910
<v Gast 1>Es gibt, glaube ich, auch noch MAGLEF, das ist quasi eine Ruby-Runtime,

01:03:17.070 --> 01:03:20.830
<v Gast 1>die in Scythe und somit in Python implementiert ist.

01:03:21.470 --> 01:03:22.830
<v Felix>Was schon gut ist eigentlich.

01:03:25.230 --> 01:03:31.870
<v Gast 1>Und also ganz viele Programmiersprachen, die quasi nativen Code generieren oder

01:03:32.110 --> 01:03:36.670
<v Gast 1>dann irgendwie, ja, also die quasi zu nativen Code runterkompilieren,

01:03:36.750 --> 01:03:40.990
<v Gast 1>die machen das dann so, dass sie erstmal irgendwie in C oder in irgendeiner anderen Sprache,

01:03:41.150 --> 01:03:47.790
<v Gast 1>die sowas kann, ihre Compiler implementieren und

01:03:48.110 --> 01:03:54.830
<v Gast 1>diesen Compiler dann benutzen, um halt ihre Sache in der Sprache selbst zu bootstrappen.

01:03:55.470 --> 01:03:59.230
<v Gast 1>Und dann hat man eigentlich gewonnen, weil dann hat man halt irgendwie in der Sprache selber und muss das

01:03:59.310 --> 01:04:00.590
<v Gast 1>Ganze immer benutzen.

01:04:02.350 --> 01:04:02.910
<v Gast 1>Nice.

01:04:03.390 --> 01:04:06.590
<v Ingo>Ja, aber trotzdem, aller Anfang ist C.

01:04:07.150 --> 01:04:07.950
<v Ingo>Oh, goddammit.

01:04:08.270 --> 01:04:11.470
<v Gast 1>Ja gut, sagen wir mal so, C war ja auch nicht von Anfang an da.

01:04:11.550 --> 01:04:15.470
<v Gast 1>Da hattest du halt irgendwie Assembler, da hattest du irgendwie vielleicht einen Makro-Assembler,

01:04:15.550 --> 01:04:18.510
<v Gast 1>den du benutzen kannst, um dann irgendwie C zu bootstrappen.

01:04:18.670 --> 01:04:20.990
<v Gast 1>Es ist ja auch nicht so, dass C, also klar, C ist für uns.

01:04:21.310 --> 01:04:25.870
<v Gast 1>Doch, C ist für immer da, aber das ist jetzt ja tatsächlich so vor ein paar Jahrzehnten noch,

01:04:25.950 --> 01:04:29.870
<v Gast 1>dann hat man irgendwie komplexe Anwendungen in Assembler geschrieben.

01:04:30.110 --> 01:04:31.390
<v Felix>Oder Machine Code.

01:04:33.710 --> 01:04:35.470
<v Felix>I wish, it's Machine Code.

01:04:36.750 --> 01:04:37.150
<v Felix>Genau.

01:04:37.310 --> 01:04:40.750
<v Ingo>Gibt es jemanden, der das kann, der einfach nur Nullen und Einsen eintippt auf.

01:04:41.710 --> 01:04:44.030
<v Felix>Ja, es gibt den Supercoder 2000 so.

01:04:45.710 --> 01:04:47.150
<v Felix>Ich glaube, das kann doch jeder.

01:04:47.870 --> 01:04:49.390
<v Ingo>Für deine Maschine machen.

01:04:49.470 --> 01:04:51.150
<v Ingo>Das ist ja echt hardcore.

01:04:51.790 --> 01:04:55.310
<v Felix>Also es gibt, äh, es gibt auf jeden Fall eine Tastatur für genau das,

01:04:55.470 --> 01:04:59.950
<v Felix>nämlich die hat 0 und 1 und dann als Eingabe.

01:05:00.110 --> 01:05:00.590
<v Felix>Auf jeden Fall.

01:05:01.550 --> 01:05:04.030
<v Gast 1>Dann machst du das und dann hast du das alles im Kopf und dann ist gut.

01:05:04.190 --> 01:05:06.190
<v Felix>Ja, genau, du weißt ja, was du hast, was du eingetippt hast.

01:05:06.590 --> 01:05:09.390
<v Gast 1>Ja, jetzt mal nicht mit Nullen und Einsen, aber ich habe schon gehört,

01:05:09.470 --> 01:05:14.990
<v Gast 1>dass es irgendwelche Leute gab, die dann irgendwann den Assembler-Code nicht mehr gebraucht haben,

01:05:15.070 --> 01:05:17.550
<v Gast 1>sondern nur noch mit den Hexcodes dann arbeiten konnten.

01:05:17.710 --> 01:05:21.790
<v Felix>Ja, das tut mir auch echt leid, weil die Leute haben halt einfach jetzt nichts mehr.

01:05:21.870 --> 01:05:22.190
<v Felix>Weißt du?

01:05:22.430 --> 01:05:25.950
<v Felix>Sie haben diese ganzen Sachen im Kopf und es ist kein Platz mehr für Lua.

01:05:26.270 --> 01:05:29.630
<v Felix>Obwohl Platz für Lua ist immer kein Platz mehr für was anderes.

01:05:33.790 --> 01:05:40.750
<v Gast 1>Der Chip sagt gerade ja vor C war B und da vor BCPL und die wurden ja auch dann mehr

01:05:40.750 --> 01:05:42.830
<v Gast 1>oder weniger miteinander gebootstrappt.

01:05:44.030 --> 01:05:47.310
<v Felix>Genau, bis wir das ganze Alpha-Boot gebootstrappt haben.

01:05:50.270 --> 01:05:51.630
<v Felix>Alpha-Bet gebootstrappt.

01:05:52.030 --> 01:05:55.630
<v Gast 1>Ja, die D gibt es ja auch als Programmiersprache, ist sogar ziemlich cool.

01:05:55.790 --> 01:06:01.710
<v Gast 1>Also sieht so ein bisschen aus, ist so auch macht nativen Code, hat glaube ich auch Garbage Collection mit

01:06:01.710 --> 01:06:05.790
<v Gast 1>drin und irgendwie ganz moderne Features eigentlich.

01:06:06.430 --> 01:06:07.870
<v Felix>Ist das nicht für Statistik?

01:06:07.950 --> 01:06:08.510
<v Felix>Also quasi.

01:06:10.430 --> 01:06:14.830
<v Felix>Es hat auch nur ein F, sorry, es war nicht D, es war F, natürlich.

01:06:15.150 --> 01:06:16.030
<v Gast 1>Ich glaube, es ist F.

01:06:17.470 --> 01:06:17.950
<v Gast 1>R ist es.

01:06:18.270 --> 01:06:18.350
<v Gast 1>R.

01:06:19.230 --> 01:06:22.110
<v Felix>Oh ne, da sind ja schon viele Büchern dazwischen, das ist doof.

01:06:22.830 --> 01:06:28.430
<v Gast 1>Ja, also die ist vor kurzem sogar tatsächlich, also die Firma dahinter ist vor kurzem von Microsoft gekauft

01:06:28.430 --> 01:06:29.710
<v Gast 1>worden, wenn ich das richtig im Kopf habe.

01:06:30.190 --> 01:06:31.390
<v Felix>Sie wollten einfach auch Piraten.

01:06:31.550 --> 01:06:36.910
<v Gast 1>Ja, genau, das ist irgendwann demnächst ist wieder der Pirate, der Talk like a Pirate Day und dann brauchen

01:06:36.910 --> 01:06:38.270
<v Gast 1>wir ja die Programmiersprache dazu.

01:06:38.590 --> 01:06:38.830
<v Gast 1>R.

01:06:39.710 --> 01:06:43.070
<v Ingo>Also Programmiersprache Z, weil nur Z würde ich benutzen.

01:06:43.390 --> 01:06:45.150
<v Ingo>Z-Chell, Z-Programmiersprache.

01:06:45.310 --> 01:06:45.550
<v Ingo>Geil.

01:06:46.350 --> 01:06:48.190
<v Gast 1>Fällt mir gerade nicht ein.

01:06:48.590 --> 01:06:49.630
<v Felix>Z  ⁇  gibt es.

01:06:50.830 --> 01:06:51.630
<v Felix>Vielleicht lieber das haben.

01:06:54.750 --> 01:06:56.670
<v Felix>Also hier, Z  ⁇  gibt es.

01:06:57.070 --> 01:06:57.630
<v Felix>Kannst du ja nehmen.

01:06:58.350 --> 01:07:00.510
<v Felix>So wie C  ⁇ , nur nicht ganz so.

01:07:00.990 --> 01:07:02.430
<v Ingo>Nur besser, nur Z  ⁇ .

01:07:04.350 --> 01:07:04.910
<v Ingo>Na dann.

01:07:05.470 --> 01:07:06.270
<v Felix>Zum Glück.

01:07:06.590 --> 01:07:07.230
<v Felix>Genau.

01:07:08.110 --> 01:07:12.110
<v Gast 1>Aber auf jeden Fall auch für Lua gibt es viele Runtimes, die ganz cool sind.

01:07:12.270 --> 01:07:16.270
<v Gast 1>Also das eines, was mir jetzt einfällt, ist Lua JIT.

01:07:16.750 --> 01:07:23.550
<v Gast 1>Und das ist quasi ein Just-in-Time-Compiler, der so zumindest in diversen Benchmarks so fast so an C

01:07:23.710 --> 01:07:24.350
<v Gast 1>rankommt.

01:07:24.590 --> 01:07:26.270
<v Felix>Was eine krasse Sache ist, muss man ja sagen.

01:07:26.590 --> 01:07:30.510
<v Gast 1>Also für eine, vor allem für eine, also normalerweise ist es halt auch so,

01:07:30.670 --> 01:07:36.910
<v Gast 1>dass so dynamischen Programmiersprachen, die ja im Code selbst keine Typdeklaration haben,

01:07:37.070 --> 01:07:41.390
<v Gast 1>fehlt dann dem Compiler oft auch eine Info, um den Code so richtig schnell zu machen.

01:07:41.550 --> 01:07:47.150
<v Gast 1>Ich glaube, da ist es halt auch geschickt, dass Lua so klein ist und so simpel,

01:07:47.310 --> 01:07:50.590
<v Gast 1>dann kann wahrscheinlich der Compiler, also ich habe den Code nicht gelesen,

01:07:50.670 --> 01:07:52.510
<v Gast 1>ich mutmaße hier auch nur so.

01:07:52.990 --> 01:07:59.870
<v Gast 1>Aber ich vermute, dass der Compiler das deswegen auch einfacher optimieren kann und quasi

01:07:59.870 --> 01:08:06.670
<v Gast 1>effizienteren Maschinencode generieren kann, weil er halt relativ genau sagen kann,

01:08:06.990 --> 01:08:10.590
<v Gast 1>was die Sprache so tun kann, weil sie halt so klein und simpel ist.

01:08:12.590 --> 01:08:16.830
<v Felix>Ich weiß nicht genau, warum Luagit so schnell ist, aber ich habe das auf jeden Fall auch schon gelesen.

01:08:17.230 --> 01:08:19.710
<v Gast 1>Also ich habe auf jeden Fall im Kopf, dass er schnell ist und ich weiß,

01:08:19.790 --> 01:08:23.790
<v Gast 1>dass Google mal den Entwickler für, ich glaube, ein Jahr oder zwei gesponsert hat,

01:08:23.870 --> 01:08:26.030
<v Gast 1>um Luagit auf 64-Bit zu bringen.

01:08:26.190 --> 01:08:26.510
<v Gast 1>Ja.

01:08:27.710 --> 01:08:32.510
<v Gast 1>Und ich glaube, auf Lua Jit aufbauend gibt es dann noch Love It, wo wir,

01:08:32.590 --> 01:08:35.070
<v Gast 1>glaube ich, auch in der Talksendung schon ab und zu mal drüber geredet haben,

01:08:35.150 --> 01:08:37.150
<v Gast 1>dass es dann mehr oder weniger Love It.

01:08:37.470 --> 01:08:44.110
<v Gast 1>Love It ist mehr ist dann so Node.js und zwar mit quasi den gleich aussehenden

01:08:44.110 --> 01:08:47.310
<v Gast 1>APIs ist Node.js in Lua.

01:08:47.790 --> 01:08:51.470
<v Felix>Genau, also es sieht echt, echt nah an API.

01:08:51.630 --> 01:08:52.990
<v Gast 1>Also es sieht quasi gleich aus.

01:08:53.070 --> 01:08:57.950
<v Gast 1>Die Syntax ist ein bisschen anders, weil Lua und JavaScript ein bisschen eine unterschiedliche Syntax haben,

01:08:58.030 --> 01:09:01.790
<v Gast 1>aber im Endeffekt ist es quasi so eine Kopie von Node.js.

01:09:02.350 --> 01:09:07.710
<v Felix>Genau, also die Node.js-APIs, so zum Beispiel dieses Create-Server, HTTP-Create-Server und so.

01:09:08.270 --> 01:09:09.070
<v Felix>Solche Sachen.

01:09:09.310 --> 01:09:13.150
<v Gast 1>Und auch die Module, die Modul-APIs, die sehen auch alle ähnlich aus.

01:09:13.390 --> 01:09:18.910
<v Felix>Genau, das ist auch, wenn du dir das Node-MCU mal anschaust,

01:09:19.150 --> 01:09:25.150
<v Felix>die ganze API und alle Funktionen, das sieht einfach so ähnlich aus wie

01:09:27.470 --> 01:09:28.030
<v Felix>Node.

01:09:29.630 --> 01:09:35.470
<v Felix>Quasi, sie schreiben auch, glaube ich, sowas wie, das ist so ähnlich wie JavaScript,

01:09:35.550 --> 01:09:36.590
<v Felix>nur dass nicht JavaScript ist.

01:09:36.670 --> 01:09:37.870
<v Felix>Irgendwie solche Sachen.

01:09:39.150 --> 01:09:39.950
<v Felix>Note M2.

01:09:40.190 --> 01:09:44.590
<v Felix>Heißt ja auch schon Note M2, ist ja quasi schon Note mit im Namen.

01:09:45.550 --> 01:09:48.270
<v Felix>It even got Note in the name.

01:09:48.590 --> 01:09:49.870
<v Felix>Ah, so schön.

01:09:51.630 --> 01:09:54.590
<v Felix>Und ich verlinke verlinke das hier das NoteM2 mal.

01:09:54.990 --> 01:09:57.630
<v Gast 1>Also was ich hier noch verlinkt habe, ist LuaJit.io.

01:09:58.190 --> 01:10:02.430
<v Gast 1>Das ist dann wiederum auf LuaJit aufbauend, auch so was ähnliches,

01:10:02.510 --> 01:10:08.590
<v Gast 1>wo man halt noch so ein bisschen Async.io mitmachen kann und sich dann irgendwie so ein Webserver skripten

01:10:08.670 --> 01:10:09.310
<v Gast 1>kann in Lua.

01:10:10.190 --> 01:10:15.870
<v Gast 1>Also das ist halt mehr oder weniger so für generische, also das steht jetzt irgendwie so als

01:10:16.990 --> 01:10:22.190
<v Gast 1>Framework für generische TCP oder UDP-Server und das ist dann mehr oder weniger.

01:10:24.270 --> 01:10:30.670
<v Gast 1>Ich glaube, das basiert auch, es basiert auf Nginx und dem

01:10:30.670 --> 01:10:33.710
<v Gast 1>Lua-Modul für Nginx, so wie ich das jetzt gesehen habe auf der Webseite.

01:10:33.870 --> 01:10:34.590
<v Gast 1>Ist auch recht toll.

01:10:34.830 --> 01:10:37.550
<v Gast 1>Hatte ich eigentlich als News drin, aber wenn wir jetzt gerade eh über Lua reden.

01:10:37.710 --> 01:10:39.150
<v Felix>Oh Mann, wo wir so schön dabei sind.

01:10:40.670 --> 01:10:47.390
<v Felix>Ich wollte noch ganz kurz was über Metatables reden, weil ich es quasi als

01:10:47.710 --> 01:10:53.070
<v Felix>Konstrukt von der Programmiersprache ziemlich cool finde, weil es so einfach ist und doch

01:10:54.590 --> 01:11:00.990
<v Felix>ziemlich viel Power quasi als Programmiersprache

01:11:00.990 --> 01:11:01.790
<v Felix>mitbringt.

01:11:01.950 --> 01:11:07.630
<v Felix>Und zwar hast du ja in Lua hast du ja hast du Objekte,

01:11:07.710 --> 01:11:10.510
<v Felix>die quasi so Dictionaries sind, so Key-Value-Stores.

01:11:11.710 --> 01:11:18.270
<v Felix>Und du hast mit Metatables die Möglichkeit einer

01:11:18.510 --> 01:11:24.750
<v Felix>Table, du kannst ihr spezielle

01:11:26.510 --> 01:11:33.230
<v Felix>Funktionen quasi implementieren, die dann Verhalten für diese

01:11:33.230 --> 01:11:34.430
<v Felix>Table implementieren.

01:11:34.590 --> 01:11:40.590
<v Felix>Das heißt, du kannst zum Beispiel sagen, du hast in der Meta-Table ein Key namens

01:11:40.590 --> 01:11:41.710
<v Felix>unterstrich-unterst-add.

01:11:42.030 --> 01:11:46.910
<v Felix>Also so wenn man sich das anschaut, sieht ein bisschen aus wie die Python Magic Functions.

01:11:47.630 --> 01:11:50.510
<v Gast 1>Du kannst auch, glaube ich, in JavaScript sowas ähnliches.

01:11:50.590 --> 01:11:51.470
<v Gast 1>Ich google das mal.

01:11:52.430 --> 01:11:58.990
<v Felix>Hast du, wenn du unterstrich-unterst-add implementierst für diese Table,

01:11:59.150 --> 01:12:01.950
<v Felix>dann kannst du Table A plus Table B machen.

01:12:02.350 --> 01:12:02.670
<v Felix>So.

01:12:03.230 --> 01:12:09.390
<v Felix>Und wenn eine von diesen beiden Tables unterstrich-unterst-add in der Metable implementiert,

01:12:09.710 --> 01:12:13.470
<v Felix>dann wird entsprechend diese Funktion aufgerufen und dann passiert halt irgendwas damit.

01:12:13.550 --> 01:12:20.510
<v Felix>Ansonsten wird es halt nicht gehen, weil es ja quasi ist ja ein arithmetisches Plus und normalerweise kommt

01:12:20.510 --> 01:12:24.990
<v Felix>halt, wenn du zwei Dictionaries zusammenfügst,

01:12:25.150 --> 01:12:30.510
<v Felix>kommt dann nichts, also im Standard-Behavior kommt da halt nichts anständiges bei raus.

01:12:30.590 --> 01:12:35.150
<v Felix>Und wenn du das implementierst, dann kannst du dein eigenes Verhalten quasi dafür implementieren.

01:12:35.790 --> 01:12:37.230
<v Gast 1>Darf ich die kurz unterbrechen?

01:12:38.030 --> 01:12:41.630
<v Gast 1>Ich hatte nämlich jetzt, wo du gerade sagst, Dinge.

01:12:42.270 --> 01:12:42.830
<v Gast 1>Oh, Dinge.

01:12:42.910 --> 01:12:44.030
<v Felix>Ja, das habe ich gesagt, das stimmt.

01:12:45.790 --> 01:12:50.350
<v Gast 1>Ist Lua schwachtypisiert oder starkt typisiert?

01:12:51.230 --> 01:12:52.270
<v Felix>Schwachtypisiert.

01:12:52.510 --> 01:12:57.550
<v Gast 1>Also quasi auch wie JavaScript, du kannst jetzt sowas machen wie 5 plus einen String und dann.

01:12:58.190 --> 01:13:00.830
<v Felix>Genau, dann macht der automatisches Typecasting Magic.

01:13:02.750 --> 01:13:04.270
<v Felix>Wenn es halt funktioniert.

01:13:05.150 --> 01:13:10.030
<v Gast 1>Also im Zweifelsfall kommt dann irgendwie was Seltsames raus, aber es macht halt Typecasting.

01:13:10.270 --> 01:13:10.670
<v Gast 1>Genau.

01:13:10.910 --> 01:13:13.070
<v Felix>Und zwar on the fly Typecasting, ja.

01:13:13.630 --> 01:13:15.470
<v Gast 1>Also analog zu JavaScript.

01:13:15.710 --> 01:13:19.630
<v Felix>Genau, und du hast Duck-Typing, das heißt, wenn du quasi versuchst,

01:13:20.270 --> 01:13:26.750
<v Felix>eine Funktion von irgendwas aufzurufen, dann die heißt Punkt Quark und

01:13:27.070 --> 01:13:32.270
<v Felix>das Dictionary implementiert Punkt Quark, weil es das in den Keys mit drin hat,

01:13:32.350 --> 01:13:34.270
<v Felix>dann wird die halt einfach aufgerufen, das ist quasi ein schöner.

01:13:34.670 --> 01:13:40.030
<v Gast 1>Also man Übergabewerte werden nicht nach irgendwelchen Typen definiert,

01:13:40.110 --> 01:13:45.150
<v Gast 1>sondern einfach nur die Funktionen oder die Methoden,

01:13:45.230 --> 01:13:49.950
<v Gast 1>die du irgendwie auf dein Objekt aufrufen willst,

01:13:50.430 --> 01:13:52.990
<v Gast 1>die müssen dann halt vorhanden sein, ansonsten gibt es einen Fehler.

01:13:53.390 --> 01:13:55.470
<v Felix>Genau, ansonsten explodiert die keine Fall.

01:13:55.550 --> 01:14:01.790
<v Gast 1>Genau, also das analog zu ganz vielen dynamischen Programmiersprachen inklusive was weiß ich,

01:14:01.950 --> 01:14:03.950
<v Gast 1>Ruby, Python, JavaScript und so weiter.

01:14:04.190 --> 01:14:04.590
<v Gast 1>Genau.

01:14:05.470 --> 01:14:10.430
<v Felix>Du hast noch, wenn du quasi Parameter übergibst und zu wenig übergibst,

01:14:10.510 --> 01:14:14.110
<v Felix>dann ist es nicht, dass es dir explodiert, sondern dass dann quasi diese Parameter,

01:14:14.190 --> 01:14:19.790
<v Felix>diese oder die Parameter, die zu wenig sind, werden dann halt nil, also nicht gesetzt entsprechend.

01:14:20.030 --> 01:14:24.030
<v Gast 1>Ja, so ein Verhalten wird ja dann tatsächlich in JavaScript missbraucht,

01:14:24.270 --> 01:14:31.230
<v Gast 1>um dann sowas wie undefined in einem, also du kannst ein JavaScript undefined redefinieren

01:14:31.470 --> 01:14:35.790
<v Gast 1>und also du kannst undefined neu zuweisen und dann ist es nicht mehr undefined.

01:14:36.190 --> 01:14:37.630
<v Felix>Kein guter Ansatz.

01:14:38.350 --> 01:14:42.670
<v Gast 1>Und der Weg, wie du dich dafür schützen kannst, dass jemand, dass irgendeine Bibliothek,

01:14:42.750 --> 01:14:48.350
<v Gast 1>die auf dieser Webseite jetzt irgendwo geladen ist, undefined umschreibt,

01:14:48.510 --> 01:14:54.510
<v Gast 1>ist, du kannst halt einen Parameter mehr, also du machst eine Funktion und dann hängst du da einen Parameter

01:14:54.510 --> 01:14:56.830
<v Gast 1>mehr dran und der ist auf jeden Fall undefined.

01:14:57.310 --> 01:15:02.430
<v Gast 1>Aber also es ist im Endeffekt sowas wie Witz Nil in Lua.

01:15:03.470 --> 01:15:08.350
<v Gast 1>Dann kannst du dann halt sagen, ja, okay, du bist dann sicher, dass dieser Wert dann undefined ist.

01:15:09.150 --> 01:15:11.310
<v Gast 1>Ist jetzt irgendwie so ein bisschen seltsam.

01:15:11.870 --> 01:15:13.950
<v Felix>Sehr, sehr defensives Programmieren dann.

01:15:14.430 --> 01:15:17.950
<v Felix>Wenn du quasi Angst hast, dass jemand dann True und False umschreibt, ja.

01:15:18.190 --> 01:15:23.790
<v Felix>Das ist genauso wie in C, wenn ein Hash defin true zu false oder so.

01:15:24.030 --> 01:15:25.390
<v Felix>Dann kommst du nämlich auch in die Hölle.

01:15:25.470 --> 01:15:26.670
<v Felix>So ist es nämlich.

01:15:26.990 --> 01:15:28.750
<v Felix>Ganzen Leute, der zu.

01:15:31.390 --> 01:15:36.350
<v Ingo>Also ich meine, kannst du machen, solange du nie willst, dass jemand anders auf deinen Code draufguckt und.

01:15:36.990 --> 01:15:39.310
<v Felix>Nee, wieder einfach benutzt, weil draufgucken kann ja jeder.

01:15:39.390 --> 01:15:40.910
<v Felix>Und jeder kann nicht auslachen.

01:15:40.990 --> 01:15:41.870
<v Felix>Ohne Probleme.

01:15:42.190 --> 01:15:44.190
<v Felix>Aber es darf halt niemand deinen Code benutzen.

01:15:44.350 --> 01:15:44.670
<v Felix>Ja.

01:15:44.910 --> 01:15:46.270
<v Ingo>Also das sind auch so die Fach.

01:15:46.670 --> 01:15:47.310
<v Ingo>Achso, genau.

01:15:47.950 --> 01:15:52.110
<v Gast 1>Ich habe mir auch mal dieses Tutorial durchgelesen, was du da verlinkt hast, dieses Lua-Seal.

01:15:52.350 --> 01:15:56.350
<v Felix>In 15 Minuten, das beste Tutorial, was ich zu einer Programmiersprache bis jetzt gesehen habe.

01:15:57.070 --> 01:16:01.230
<v Gast 1>Super aus dem Code und dann einfach ein paar Kommentare außenrum und jetzt hier so geht's.

01:16:01.470 --> 01:16:02.270
<v Felix>Genau, und das ist.

01:16:03.550 --> 01:16:10.030
<v Gast 1>Wenn ich das richtig interpretiert habe, dann sind so Variablendefinitionen standardmäßig

01:16:10.030 --> 01:16:10.750
<v Gast 1>global.

01:16:10.830 --> 01:16:17.150
<v Gast 1>Und du musst es explizit als Local definieren oder mit dem Local

01:16:17.150 --> 01:16:19.390
<v Gast 1>Keyword quasi taggen.

01:16:19.470 --> 01:16:23.230
<v Gast 1>Oder das vor deine Zuweisung stellen.

01:16:23.470 --> 01:16:27.870
<v Gast 1>Ansonsten sind die wie bei JavaScript dann auch lokal, äh, global.

01:16:28.190 --> 01:16:32.270
<v Felix>Genau, das ist so bei Lua.

01:16:32.510 --> 01:16:37.230
<v Felix>Da gab es auch irgendwo in den Lua-Fugs, gab es auch irgendeinen Grund dafür,

01:16:37.470 --> 01:16:38.590
<v Felix>den ich auch schon wieder vergessen habe.

01:16:38.750 --> 01:16:43.230
<v Gast 1>Also ich glaube, ich weiß, warum es oder ich vermute, ich habe irgendwo mal eine Theorie gehört,

01:16:43.310 --> 01:16:45.230
<v Gast 1>warum es bei JavaScript so ist.

01:16:45.710 --> 01:16:51.870
<v Gast 1>Und zwar die Theorie ist, das sollte dann irgendwie eine Sprache für Programmieranfänger sein.

01:16:52.270 --> 01:16:59.150
<v Gast 1>Und denen scheint es schwer zu fallen, Scope zu verstehen, deswegen sind standardmäßig die ganzen

01:16:59.150 --> 01:16:59.390
<v Gast 1>Sachen.

01:17:00.110 --> 01:17:05.230
<v Felix>Okay, also ich hab aus der Lua Fark, ich lese ganz kurz den Punkt vor.

01:17:05.550 --> 01:17:12.430
<v Felix>It certainly feels easy to only explicitly declare globals when they are in the local context.

01:17:12.590 --> 01:17:17.550
<v Felix>The short answer that is that Lua is not Python.

01:17:17.870 --> 01:17:24.590
<v Felix>But there are actually good reasons why Alexically scoped local variables have to be explicitly declared.

01:17:24.670 --> 01:17:25.470
<v Felix>See Wikipage.

01:17:25.630 --> 01:17:26.990
<v Felix>Na gut, guck ich mal dahin.

01:17:27.070 --> 01:17:29.550
<v Felix>Oh, da steht ganz viel Text, das könnt ihr euch selber durchlesen.

01:17:29.790 --> 01:17:30.590
<v Felix>Kannst du ja mal verlinken.

01:17:30.750 --> 01:17:32.270
<v Felix>Genau, ich verlinke auf jeden Fall den Text.

01:17:32.750 --> 01:17:35.150
<v Felix>Genau, kurze Antwort, Lua ist nicht Python.

01:17:37.070 --> 01:17:38.670
<v Gast 1>Das ist auf jeden Fall auch mal eine Möglichkeit.

01:17:38.830 --> 01:17:41.870
<v Felix>Das ist auf jeden Fall die valide Antwort.

01:17:43.550 --> 01:17:46.910
<v Ingo>Okay, gibt es außer Lu in 15 Minuten noch irgendeine andere Quelle,

01:17:46.990 --> 01:17:50.110
<v Ingo>wo du sagst, da können die Leute mal einsteigen unter Lua Fuck vielleicht.

01:17:51.230 --> 01:17:52.030
<v Felix>Ich war noch nicht fertig.

01:17:52.270 --> 01:17:53.710
<v Felix>Ich war noch bei Metatables.

01:17:53.870 --> 01:17:54.190
<v Felix>Ganz kurz.

01:17:55.790 --> 01:17:56.270
<v Felix>Ja, sorry.

01:17:57.550 --> 01:18:00.510
<v Felix>Du kannst Unterstrich-Unterstrich-Call implementieren, wenn du das Dictionary callst.

01:18:00.590 --> 01:18:07.230
<v Felix>Das heißt quasi, wenn du sowas implementieren willst wie ein Konstruktor für Klassen, kannst du das so machen.

01:18:07.390 --> 01:18:11.390
<v Felix>Und du hast Unterstrich-Unstrich Index, womit du Vererbung implementieren kannst.

01:18:11.630 --> 01:18:12.990
<v Felix>Es funktioniert nämlich so.

01:18:13.390 --> 01:18:18.190
<v Felix>Wenn du, du hast ein Dictionary und wenn du dann einen Zugriff machst auf eine Variable,

01:18:18.270 --> 01:18:24.350
<v Felix>die nicht existiert in dem Dictionary, dann wird diese Unterstrich

01:18:24.430 --> 01:18:26.430
<v Felix>unterstrich-Index aufgerufen.

01:18:27.150 --> 01:18:27.470
<v Felix>So.

01:18:29.230 --> 01:18:34.190
<v Felix>Und dort kannst du dann sowas machen,

01:18:34.350 --> 01:18:38.590
<v Felix>okay, wenn dieses nicht existiert,

01:18:38.910 --> 01:18:44.830
<v Felix>dann suche in diesem folgenden anderen Dictionary und nimm dort halt die Variable her.

01:18:44.990 --> 01:18:50.990
<v Felix>Und nur durch dieses einfache Konstrukt, quasi, wenn nicht da, dann guck in dem anderen Dictionary nach,

01:18:51.070 --> 01:18:52.590
<v Felix>kannst du Färbung implementieren.

01:18:52.750 --> 01:18:57.150
<v Gast 1>Also es ist jetzt nicht so, also wir haben vorhin schon mal kurz über Objektorientierung geredet.

01:18:57.470 --> 01:19:03.710
<v Gast 1>Wenn man eine klassenbasierte Objektorientierung hat, dann definiert man in der Klasse quasi die Struktur,

01:19:03.950 --> 01:19:05.310
<v Gast 1>die die Klasse haben soll.

01:19:05.470 --> 01:19:05.870
<v Gast 1>Genau.

01:19:06.110 --> 01:19:12.190
<v Gast 1>Und in dem Fall Lua ist jetzt genauso wie JavaScript und ich glaube noch eine Handvoll andere Sprachen,

01:19:12.670 --> 01:19:13.790
<v Gast 1>gibt es noch ein paar.

01:19:14.510 --> 01:19:18.030
<v Gast 1>Ist quasi prototypbasiert.

01:19:18.830 --> 01:19:24.430
<v Felix>Ja, also du kannst Prototype Verhalten mit Metatables nachimplementieren,

01:19:24.590 --> 01:19:28.350
<v Felix>aber du kannst sagen, es ist Prototyp, du hast Prototyp.

01:19:28.590 --> 01:19:32.670
<v Gast 1>Und bei dem Prototyp ist es quasi so, wenn du jetzt Verhalten vererben willst,

01:19:32.750 --> 01:19:37.390
<v Gast 1>dann machst du das nicht über so ein Konstrukt wie eine Klasse, sondern über ein lebendes Objekt.

01:19:37.790 --> 01:19:38.350
<v Gast 1>Genau.

01:19:38.750 --> 01:19:42.910
<v Gast 1>Also du kannst halt quasi sagen, okay, du hast jetzt ein Objekt, das ist irgendwie Fahrzeug und das hat

01:19:42.910 --> 01:19:45.790
<v Gast 1>irgendwie möglich, äh ein paar Methoden.

01:19:46.350 --> 01:19:48.670
<v Gast 1>Und du möchtest jetzt sagen, du machst jetzt zum Beispiel ein Auto,

01:19:48.750 --> 01:19:55.150
<v Gast 1>dann sagst du halt nicht, du erbst von dieser Struktur, sondern von diesem lebenden Objekt und dann kannst du

01:19:55.150 --> 01:19:58.910
<v Gast 1>halt das Verhalten in deinem Kindobjekt auch mitverwenden.

01:19:59.230 --> 01:19:59.630
<v Gast 1>Genau.

01:19:59.870 --> 01:20:05.390
<v Gast 1>Und ist dieses Call dann so ähnlich wie sowas wie

01:20:06.350 --> 01:20:07.950
<v Gast 1>Method missing in Ruby?

01:20:08.030 --> 01:20:12.670
<v Gast 1>Also ist das dann was, ist das dann so eine definierte Methode, die aufgerufen wird,

01:20:12.830 --> 01:20:16.350
<v Gast 1>wenn es diese Methode auf diesem Objekt nicht gibt?

01:20:16.590 --> 01:20:19.310
<v Felix>Method missing ist unterschricht unterstrich-index.

01:20:19.850 --> 01:20:25.050
<v Gast 1>Achso, genau, äh, sorry, ich hab gerade unterstrich unterstrich Index gemeint.

01:20:25.130 --> 01:20:26.890
<v Gast 1>Das ist dann quasi sowas wie Method Missing.

01:20:27.050 --> 01:20:30.170
<v Felix>Nur, dass es halt nicht nur Method ist, sondern quasi alles.

01:20:30.570 --> 01:20:37.050
<v Felix>Also du könntest mit dem Unterstrich Index

01:20:37.450 --> 01:20:41.290
<v Felix>natürlich auch eine Funktion zurückgeben, die du dann entsprechend aufrufst,

01:20:41.370 --> 01:20:43.530
<v Felix>wenn du das mit so machst, quasi.

01:20:43.770 --> 01:20:44.090
<v Felix>Okay.

01:20:44.810 --> 01:20:51.210
<v Felix>Und du kannst das entsprechend so ein Verhalten mit dem Unterstrich Unterstrich-Index implementieren,

01:20:51.290 --> 01:20:52.810
<v Felix>was eigentlich, was ich ziemlich cool finde.

01:20:54.330 --> 01:20:58.650
<v Felix>Du hast, du kannst diese Sachen natürlich auch verschachteln,

01:20:58.810 --> 01:21:03.370
<v Felix>das heißt, du kannst sagen, okay, das ist ein Dictionary und dieses Dictionary hat dann wieder eine Metatable,

01:21:03.450 --> 01:21:10.090
<v Felix>dieses Unterstrich unter dieses Index implementiert und entsprechend so halt auch quasi

01:21:10.970 --> 01:21:15.370
<v Felix>eine tiefergehende Vererbung Verhalten nachimplementieren.

01:21:15.530 --> 01:21:18.730
<v Gast 1>Okay, das heißt du, ah, okay, ich verstehe.

01:21:19.210 --> 01:21:26.010
<v Gast 1>Das ist dann quasi sowas wie ich gerade mir

01:21:26.010 --> 01:21:26.250
<v Gast 1>überlegen.

01:21:26.330 --> 01:21:28.970
<v Gast 1>Ja, okay, das ist dann genau das Conceptual Method Missing.

01:21:29.290 --> 01:21:33.770
<v Gast 1>Und das Call ist dann quasi, wenn du so tun willst,

01:21:33.850 --> 01:21:36.490
<v Gast 1>als ob es eine Funktion eine Funktion ist.

01:21:36.650 --> 01:21:36.810
<v Gast 1>Genau.

01:21:36.890 --> 01:21:37.850
<v Gast 1>Okay, jetzt habe ich es verstanden.

01:21:38.170 --> 01:21:42.170
<v Felix>Genau, und dann hast du da quasi die Möglichkeit, so eine Art Konstruktor zu bauen,

01:21:42.250 --> 01:21:46.250
<v Felix>wo du dann quasi New nachimplementierst und das.

01:21:46.970 --> 01:21:48.170
<v Felix>Das geht dann quasi.

01:21:48.730 --> 01:21:55.610
<v Felix>Es ist besonders interessant, wenn du Module hast und du gibst ein Modul zurück und das Modul willst

01:21:55.610 --> 01:21:58.330
<v Felix>du aber nicht so direkt verwenden, weil es ja quasi auch ein Keyword-Store ist,

01:21:58.410 --> 01:22:02.650
<v Felix>der dann von allen anderen, die dieses Modul requiren, mitverwendet wird,

01:22:02.730 --> 01:22:06.170
<v Felix>sondern du willst dann ein neues Objekt machen und dann kannst du das so implementieren,

01:22:06.250 --> 01:22:07.930
<v Felix>quasi mit unterstrich Call.

01:22:10.810 --> 01:22:11.370
<v Felix>Genau.

01:22:11.770 --> 01:22:15.850
<v Felix>Noch kurz Konstrukt Module.

01:22:17.370 --> 01:22:23.850
<v Felix>Das ist auch quasi eine Möglichkeit, wie du Dateien in Lua nachladen kannst,

01:22:23.930 --> 01:22:26.170
<v Felix>also quasi Funktionalität nachladen kannst.

01:22:26.490 --> 01:22:31.530
<v Felix>Und normalerweise ist es so in Lua, dass du in deinem Modul ganz am Ende,

01:22:31.610 --> 01:22:36.010
<v Felix>also du baufst quasi ein Dictionary zusammen und ganz am Ende gibst du dieses Dictionary zurück.

01:22:36.250 --> 01:22:38.490
<v Felix>Oder dieses Table, wie es heißt.

01:22:39.450 --> 01:22:44.250
<v Felix>Und diese Table implementiert dann quasi, was auch immer dein Modul machen soll.

01:22:44.490 --> 01:22:50.010
<v Felix>Und da kannst du dann auch ein New implementieren, wo du dann quasi bestimmte neue Objekte damit erzeugst.

01:22:50.410 --> 01:22:51.850
<v Felix>Und ja.

01:22:52.890 --> 01:22:58.490
<v Felix>Also da in Luas tatsächlich gibt es nicht sowas wie ein

01:23:01.290 --> 01:23:08.170
<v Felix>Import, was es dann in den globalen Scope direkt reinlädt oder in deinen lokalen Scope reinlädt,

01:23:08.410 --> 01:23:14.650
<v Felix>sondern es funktioniert wirklich so, es wird quasi diese Datei

01:23:14.650 --> 01:23:20.810
<v Felix>evaluiert, nacheinander interpretiert und am Ende dann ein Dictionary zurückgegeben.

01:23:21.370 --> 01:23:25.050
<v Felix>Und das ist also, wenn man sich diese ganzen Sachen anschaut, das ist alles ganz,

01:23:25.130 --> 01:23:29.290
<v Felix>ganz, ganz einfach gehalten und es ist überhaupt keine Magie dabei und kein,

01:23:29.450 --> 01:23:36.330
<v Felix>so, du hast irgendwie verschiedene Sachen, die halt bestimmte bestimmte

01:23:36.330 --> 01:23:39.690
<v Felix>Magic im Hintergrund machen, sondern das ist alles total easy.

01:23:40.090 --> 01:23:40.490
<v Felix>Eigentlich.

01:23:40.810 --> 01:23:42.490
<v Felix>Auch diese Metatables, das ist total easy.

01:23:42.570 --> 01:23:48.650
<v Felix>Du hast irgendwie fünf Stück oder so und mit denen kannst du dann quasi die Magie nachimplementieren und du

01:23:48.650 --> 01:23:52.250
<v Felix>verstehst, was passiert, weil es halt eigentlich keine Magie ist.

01:23:52.490 --> 01:23:53.210
<v Felix>Und das ist cool.

01:23:53.930 --> 01:23:58.570
<v Gast 1>Also es passiert halt sehr wenig unter der Haube, was man so nicht versteht,

01:23:58.650 --> 01:24:03.130
<v Gast 1>sondern die ganzen Konstrukte sind halt so einfach, dass man sich damit mehr oder weniger so seine komplette

01:24:03.210 --> 01:24:07.930
<v Gast 1>Welt bauen kann, inklusive den Features, die vielleicht andere Programmiersprachen haben.

01:24:08.250 --> 01:24:08.810
<v Gast 1>Genau.

01:24:10.810 --> 01:24:16.170
<v Felix>Das Index ist, wofür ich das hergenommen habe, wo ich dann quasi das erste Mal wirklich verwendet habe,

01:24:16.570 --> 01:24:22.970
<v Felix>war ich quasi ein Table,

01:24:23.530 --> 01:24:26.730
<v Felix>die Default-Werte hat.

01:24:26.890 --> 01:24:33.770
<v Felix>Und dann habe ich ein anderes Table, die ich quasi von der Festplatte lade oder von irgendwo

01:24:33.770 --> 01:24:34.570
<v Felix>anders her.

01:24:34.810 --> 01:24:40.490
<v Felix>Und die hat dann halt die neuen Werte und die neuen Werte überschreiben die Default-Werte.

01:24:40.650 --> 01:24:41.770
<v Felix>So, das war die Grundidee.

01:24:41.850 --> 01:24:46.090
<v Felix>Und das ist halt einfach, indem du Index die Table,

01:24:46.250 --> 01:24:52.170
<v Felix>diese Default-Table setzt für dieses neue Objekt, hast du dieses Default-Behavior auf einmal.

01:24:52.250 --> 01:24:56.810
<v Felix>Und sobald du die neu setzt, also quasi sobald du was in dem neuen Objekt änderst,

01:24:56.970 --> 01:24:58.570
<v Felix>gelten die alten Werte nicht mehr.

01:24:58.650 --> 01:25:01.930
<v Felix>Und du überschreibst auch die alten Werte nicht mehr, weil dies ja eine andere Table ist.

01:25:02.490 --> 01:25:05.690
<v Felix>Und das ist eigentlich schon voll cool, weil es halt, also wie gesagt,

01:25:05.850 --> 01:25:08.570
<v Felix>es ist total einfach und aber auch total mächtig.

01:25:08.650 --> 01:25:11.210
<v Felix>Und das ist, das fand ich auf jeden Fall sehr cool.

01:25:11.690 --> 01:25:17.450
<v Gast 1>Dieses Modulsystem, das hat sich jetzt so angehört, so in der Art wie das Common.js,

01:25:17.690 --> 01:25:20.490
<v Gast 1>was zum Beispiel für Node.js verwendet wird.

01:25:20.570 --> 01:25:27.450
<v Gast 1>Also dass dann quasi, dass du einfach irgendwie sagst, hier Require oder ich weiß jetzt nicht,

01:25:27.530 --> 01:25:29.770
<v Gast 1>wie dann what dafür ist.

01:25:30.010 --> 01:25:33.530
<v Gast 1>Aber du sagst Require und dann bekommst du halt mehr oder weniger ein Objekt zurück,

01:25:33.610 --> 01:25:35.370
<v Gast 1>wo du dann Digi drauf aufrufen kannst.

01:25:35.610 --> 01:25:35.930
<v Gast 1>Genau.

01:25:36.250 --> 01:25:39.690
<v Gast 1>Und es ist dann halt gescoped, wie man es halt will.

01:25:39.770 --> 01:25:43.770
<v Gast 1>Also wenn man dann Local davor macht, dann ist es lokal gescoped und ansonsten ist es halt global gescopt,

01:25:43.850 --> 01:25:43.930
<v Gast 1>richtig?

01:25:44.170 --> 01:25:44.410
<v Gast 1>Genau.

01:25:44.570 --> 01:25:50.330
<v Felix>Und du hast, wenn du Require machst und das Modul,

01:25:50.410 --> 01:25:53.930
<v Felix>da werden halt irgendwelche Sachen global gesetzt, dann sind die halt auch global.

01:25:54.330 --> 01:25:55.850
<v Felix>So wie es halt in Lua ist, ja.

01:25:56.490 --> 01:26:00.730
<v Felix>Und also das einzige Problem, was ich mit Lua hatte am Anfang,

01:26:00.810 --> 01:26:04.250
<v Felix>beziehungsweise immer noch ein bisschen harp ist, dass nicht klar ist,

01:26:04.650 --> 01:26:08.650
<v Felix>wie man eigentlich dieses Modulsystem verwendet oder wie man es verwenden sollte.

01:26:08.810 --> 01:26:11.050
<v Felix>Weil es gibt halt 100 Möglichkeiten, das zu machen.

01:26:11.130 --> 01:26:16.090
<v Felix>Du könntest irgendwie sagen, okay, ich mache am Anfang ein neues Modul,

01:26:16.410 --> 01:26:22.410
<v Felix>setze da die ganzen Funktionen rein und return das oder ich bau

01:26:24.810 --> 01:26:29.610
<v Felix>ich habe lokale Funktionen und mache die dann quasi am Ende zusammen oder so.

01:26:30.730 --> 01:26:37.610
<v Felix>Und du hast auch die Möglichkeit, den Scope quasi von global auf lokal einzugrenzen und

01:26:37.610 --> 01:26:40.970
<v Felix>dann diesen Scope zu verändern und dann diesen Scope zurückzugeben.

01:26:41.050 --> 01:26:46.970
<v Felix>Also es gibt irgendwie 100 Möglichkeiten, Module zu bauen, aber am Ende ist es einfach so,

01:26:47.050 --> 01:26:52.490
<v Felix>dass du eine Table zurückgibst, die dann halt deine Funktion auch oder was auch immer drin hat.

01:26:52.730 --> 01:26:57.130
<v Gast 1>Okay, und letzten Endes ist es dann dir überlassen, wie du diese Table zusammenbaust.

01:26:57.450 --> 01:26:57.770
<v Gast 1>Genau.

01:26:58.730 --> 01:27:04.410
<v Felix>Aber es hat sich durchgesetzt, dass du in den Modulen am Ende eine Table

01:27:05.050 --> 01:27:05.770
<v Felix>zurückgibst.

01:27:05.930 --> 01:27:11.130
<v Felix>Weil mit Require ist es so, dass was auch immer da als Rückgabewert zurückkommt,

01:27:12.490 --> 01:27:14.010
<v Felix>das wird genau einmal gemacht.

01:27:14.090 --> 01:27:15.690
<v Felix>Also das Require wird einmal gemacht.

01:27:15.770 --> 01:27:20.090
<v Felix>Beim ersten Mal, wenn du Require für ein Modul aufrufst, und danach,

01:27:20.730 --> 01:27:27.610
<v Felix>wenn du dann Require an einer anderen Stelle nochmal machst, dann wird nicht nochmal dieser komplette

01:27:27.610 --> 01:27:32.730
<v Felix>Kontext evaluiert, sondern einfach nur das, was beim ersten Require zurückkam,

01:27:32.970 --> 01:27:34.890
<v Felix>die Table, die wird dann einfach zurückgegeben.

01:27:35.050 --> 01:27:37.370
<v Gast 1>Okay, das heißt, das ist quasi so ein Memoizing.

01:27:37.450 --> 01:27:44.250
<v Gast 1>Also der merkt sich dann den Return-Wert und optimiert es dann quasi in der Hinsicht,

01:27:44.330 --> 01:27:48.890
<v Gast 1>dass wenn du ganz oft irgendwelche Sachen requires, dass es halt nur einmal wirklich evaluiert werden muss und

01:27:48.890 --> 01:27:51.610
<v Gast 1>dann das nächste Mal wird dann der gecachedte Wert benutzt.

01:27:51.770 --> 01:27:56.570
<v Felix>Genau, wenn es gibt, wenn du das haben willst, dass es dann quasi jedes Mal wieder passiert,

01:27:56.650 --> 01:28:03.210
<v Felix>dann gibt es noch Do-File, was quasi einfach die Datei Line für Line nochmal interpretiert.

01:28:03.530 --> 01:28:09.130
<v Felix>Das ist halt der Unterschied zu dem Require ist halt, dass du, dass du es dann nicht in irgendeinem,

01:28:10.170 --> 01:28:14.650
<v Felix>quasi dass du es nicht zwischenspeicherst einfach, sondern einfach nochmal alles machst.

01:28:15.930 --> 01:28:18.250
<v Gast 1>Wo wir jetzt von Modulen geredet haben.

01:28:18.650 --> 01:28:23.530
<v Gast 1>Module sind cool, wenn man sie selber schreibt, aber im Zweifelsfall will man da vielleicht auch irgendwie auf

01:28:24.090 --> 01:28:26.890
<v Gast 1>Arbeit aus der Community zurückgreifen.

01:28:27.690 --> 01:28:33.370
<v Gast 1>Gibt es da dann irgendwie so einen Paketmanager oder sowas, womit man dann so seine LUR-Pakete und deren

01:28:33.370 --> 01:28:39.370
<v Gast 1>Abhängigkeiten verwalten kann oder muss man die dann irgendwie über GitSub-Module einbinden oder wie tut man

01:28:39.370 --> 01:28:40.010
<v Gast 1>das im Normalfall?

01:28:40.250 --> 01:28:44.970
<v Felix>Also normalerweise ist es so, dass du,

01:28:45.210 --> 01:28:48.490
<v Felix>also wenn du es ganz einfach haben willst, dann nimmst du einfach die Files und legst sie daneben,

01:28:48.650 --> 01:28:49.530
<v Felix>so ist fertig.

01:28:50.330 --> 01:28:55.130
<v Felix>Aber wenn du es natürlich cool haben willst, dann gibt es einen Paketmanager,

01:28:55.210 --> 01:29:00.010
<v Felix>der nennt sich Lua Rocks, also so wie Steine oder wie Lua ist cool,

01:29:00.090 --> 01:29:01.530
<v Felix>halt quasi die beiden Sachen.

01:29:02.730 --> 01:29:07.610
<v Felix>Und der bietet dir die Möglichkeit, dann sagst du Rocks Install,

01:29:07.770 --> 01:29:14.170
<v Felix>keine Ahnung, was auch immer du brauchst und dann lädt er diese Module quasi für dich nach und

01:29:14.170 --> 01:29:20.010
<v Felix>verwaltet entsprechend genau,

01:29:20.090 --> 01:29:22.490
<v Felix>also hast du so ein bisschen Konfiguration, wo du dann sagst, okay,

01:29:22.890 --> 01:29:28.650
<v Felix>das ist mein Modul und das hat diese folgenden Sachen und Title und Description und so und

01:29:29.530 --> 01:29:31.690
<v Felix>kannst du dann entsprechend so nachladen.

01:29:31.930 --> 01:29:37.050
<v Felix>Du hast eine ROC-Spec, die dann quasi beschreibt, wie dein, wie dein,

01:29:39.050 --> 01:29:40.730
<v Felix>wie dein, wie dein Modul aussieht.

01:29:40.890 --> 01:29:46.090
<v Felix>Und das ist dann auch eigentlich nur Lua-Code, der implementiert dann quasi.

01:29:47.290 --> 01:29:52.810
<v Gast 1>Das hört sich jetzt so ein bisschen an wie die Ruby Jam-Spec, wo dann quasi halt auch so,

01:29:52.890 --> 01:29:57.690
<v Gast 1>du hast dann so eine Domain-Specific Language, also so eine so eine interne API,

01:29:57.930 --> 01:30:01.930
<v Gast 1>in der du dann halt sagst, ja, okay, wie heißt denn mein Paket, denn was für eine Version ist es gerade,

01:30:02.010 --> 01:30:05.370
<v Gast 1>was hat das für Abhängigkeiten und vielleicht noch ein bisschen so Beschreibungen,

01:30:05.450 --> 01:30:08.810
<v Gast 1>was es denn so tut und die Webseite und sowas.

01:30:09.050 --> 01:30:09.850
<v Felix>Und die Lizenz halt.

01:30:10.250 --> 01:30:12.090
<v Gast 1>Ja, genau, Lizenz ist auch wichtig.

01:30:12.570 --> 01:30:13.690
<v Felix>Wichtige, wichtige Sache, ja.

01:30:13.770 --> 01:30:14.490
<v Felix>Ja, auf jeden Fall.

01:30:14.650 --> 01:30:17.290
<v Felix>Und hier ist es halt keine DSL, sondern es ist einfach nur Lua.

01:30:18.090 --> 01:30:21.130
<v Gast 1>Ja, mit DSL meine ich dann halt eine Ruby API.

01:30:21.290 --> 01:30:22.090
<v Felix>Ja, ja, ja, klar.

01:30:22.330 --> 01:30:26.010
<v Felix>Also du sagst einfach, okay, wenn das, was auch immer da drin steht,

01:30:26.170 --> 01:30:29.850
<v Felix>Package hat und Version hat, dann ist es quasi, dann beschreibst du einfach das,

01:30:29.930 --> 01:30:30.650
<v Felix>was du hast, ja.

01:30:30.890 --> 01:30:31.210
<v Felix>Ja.

01:30:33.050 --> 01:30:34.570
<v Gast 1>Okay, das hört sich auf jeden Fall mal richtig an.

01:30:34.650 --> 01:30:37.210
<v Gast 1>Und das funktioniert dann auch bei den Microcontroller-Projekten.

01:30:37.850 --> 01:30:40.010
<v Felix>Da habe ich es noch nicht hergenommen, muss ich ganz ehrlich sagen,

01:30:40.170 --> 01:30:46.250
<v Felix>weil du auch, wenn du quasi einen coolen Microcontroller mit 80 Megahertz oder mit 160 Megahertz hast,

01:30:46.570 --> 01:30:50.330
<v Felix>dass dann dir relativ schnell in Lure der RAM ausgeht.

01:30:50.650 --> 01:30:51.450
<v Unbekannt>Ah, okay.

01:30:51.770 --> 01:30:58.330
<v Felix>Und deswegen muss man immer schauen, ob man dann solche fullblown

01:30:59.450 --> 01:31:04.490
<v Felix>Sachen direkt in seinen Projekten drin haben will und ob man das, wenn es nur ein ganz bisschen ist,

01:31:04.650 --> 01:31:06.250
<v Felix>das vielleicht dann doch wieder selber macht.

01:31:06.410 --> 01:31:09.290
<v Felix>Speziell jetzt so mit HTTP-Servern und so Kram.

01:31:09.450 --> 01:31:11.450
<v Felix>Weil das passt dann halt einfach nicht mehr mit drauf.

01:31:12.810 --> 01:31:15.450
<v Gast 1>Ein Problem ist halt dann auch immer, du hast ja nicht nur so die Sachen,

01:31:15.530 --> 01:31:20.330
<v Gast 1>die du gerne selber benutzen würdest, weil du die vielleicht nicht selber implementieren möchtest,

01:31:20.650 --> 01:31:26.730
<v Gast 1>sondern du hast ja transitive Abhängigkeiten, also quasi die Abhängigkeiten deiner Abhängigkeiten.

01:31:26.810 --> 01:31:27.450
<v Gast 1>Ja, ja, ja.

01:31:27.690 --> 01:31:33.290
<v Gast 1>Und ich weiß jetzt nicht, wie das in der Lua-Welt aussieht, aber wenn man da so in der Ruby-Welt rumguckt,

01:31:33.370 --> 01:31:38.490
<v Gast 1>dann ist es halt ganz schnell so, dass man sich vielleicht sich irgendwie mal ein paar praktisch aussehende

01:31:38.490 --> 01:31:40.490
<v Gast 1>Ruby-Gems so importiert.

01:31:40.730 --> 01:31:43.370
<v Felix>Und dann bäm, eine Bazillon-Dependencies.

01:31:43.770 --> 01:31:48.970
<v Gast 1>Also, keine Ahnung, man hat irgendwie so 0815 Rails-Projekte und plötzlich hat man 150 Ruby-Gems in seiner,

01:31:49.130 --> 01:31:50.330
<v Gast 1>in seinem Gem-File.

01:31:50.650 --> 01:31:53.530
<v Gast 1>Oder also die halt mehr oder weniger geladen werden.

01:31:53.610 --> 01:32:00.570
<v Gast 1>Dabei hat man vielleicht eine Handvoll Gems irgendwie selbst benutzt und der Rest kommt dann halt

01:32:01.210 --> 01:32:04.730
<v Gast 1>durch Abhängigkeiten von diesen Abhängigkeiten mit.

01:32:04.810 --> 01:32:08.810
<v Gast 1>Und dann ist es dann oft auch so, dass man das, oder was heißt oft,

01:32:08.970 --> 01:32:14.330
<v Gast 1>es passiert dann halt schon mal, dass so Leute dann ihre Entwicklungsabhängigkeiten,

01:32:14.490 --> 01:32:17.690
<v Gast 1>die man halt so braucht, zum Beispiel, um die Tests auszuführen oder sowas,

01:32:17.770 --> 01:32:22.170
<v Gast 1>dann nicht als solche kennzeichnen, sondern dass die als normale Abhängigkeiten mitkommen.

01:32:22.250 --> 01:32:25.850
<v Gast 1>Das heißt, du musst dir dann auch noch irgendwie fünf Test-Frameworks installieren,

01:32:25.930 --> 01:32:29.930
<v Gast 1>obwohl du die eigentlich nicht benutzt in unterschiedlichen Versionen oder so.

01:32:30.570 --> 01:32:36.890
<v Gast 1>Das ist ein bisschen, ja, also gerade wenn man dann irgendwie sich auf Microcontroller beschränkt,

01:32:36.970 --> 01:32:42.810
<v Gast 1>dann ist es halt auch irgendwie so ein bisschen schwierig, weil man dann vielleicht auch nicht weiß,

01:32:42.890 --> 01:32:46.010
<v Gast 1>was diese Libraries, die man da benutzt, alles alle machen.

01:32:46.410 --> 01:32:47.770
<v Felix>Ja, auf jeden Fall.

01:32:49.130 --> 01:32:54.010
<v Ingo>Gut, dann nochmal zu meiner Ausgangsfrage von vor 20 Minuten.

01:32:54.330 --> 01:32:55.050
<v Ingo>Oh, sorry.

01:32:56.010 --> 01:32:57.690
<v Felix>Zurück zu deiner Ausgangsfrage.

01:32:57.850 --> 01:32:58.250
<v Felix>Genau.

01:32:58.490 --> 01:33:02.890
<v Ingo>Wenn ich jetzt anfangen will, Lua zu lernen, was ist so der beste Anstieg?

01:33:03.690 --> 01:33:08.250
<v Felix>Kauft ihr für 250, kauft ihr so einen Mikrocontroller und macht da so einen Sensor dran und dann ist das

01:33:08.250 --> 01:33:14.410
<v Felix>einfach der beste Ansatz, machst du da einen NotemZo-Flash oder drauf und dann hast du einen Interpreter über

01:33:14.410 --> 01:33:21.370
<v Felix>eine serielle Konsole und kannst einfach mal ausprobieren, den Sensor auszulesen und den über was auch

01:33:21.370 --> 01:33:23.130
<v Felix>immer dann irgendwo hinzugeben.

01:33:23.290 --> 01:33:29.290
<v Felix>Und ich denke, das ist eine coole Sache und du hast dann auch gleichzeitig was zum Spielen.

01:33:29.850 --> 01:33:36.730
<v Gast 1>Und das funktioniert dann quasi so, dass man irgendwie eine Shell auf seinem Rechner startet und die connecte

01:33:36.810 --> 01:33:39.290
<v Gast 1>dann auf die serielle Konsole und da kann man dann Lua-Code ausführen,

01:33:39.370 --> 01:33:39.610
<v Gast 1>oder wie?

01:33:39.930 --> 01:33:45.690
<v Felix>Genau, also es gibt, es gibt speziell für die Mikrocontroller den ESPLORA,

01:33:45.850 --> 01:33:48.490
<v Felix>also ESP LoRa geschrieben.

01:33:48.970 --> 01:33:54.410
<v Felix>Das ist ein super beschissenes Stück Java-Software, aber darum geht es nicht.

01:33:54.490 --> 01:34:00.970
<v Felix>Sondern es ist quasi so eine IDI, wo du dann, ja,

01:34:01.050 --> 01:34:05.050
<v Felix>also es ist wirklich nur, du connectest gegen die Serie-Konsole und dort kannst du auch direkt reinschreiben.

01:34:05.130 --> 01:34:10.330
<v Felix>Also auch wenn du da mit Screen gegen connectest, dann kannst du dort auch in den Interpreter reinschreiben,

01:34:10.410 --> 01:34:15.610
<v Felix>weil es ist nichts Stisches, sondern du kannst dort Live-Code ausführen und Live-Code ausprobieren.

01:34:15.690 --> 01:34:16.890
<v Felix>Und das ist echt, echt cool.

01:34:17.050 --> 01:34:18.170
<v Gast 1>Ja, das ist auf jeden Fall cool.

01:34:18.250 --> 01:34:22.970
<v Gast 1>Also das finde ich auch immer super, das hat mich so an dynamischen Programmiersprachen super begeistert.

01:34:23.050 --> 01:34:27.290
<v Gast 1>So das Erste, was so Leute dann mal so bei irgendwelchen Demos gezeigt haben, komm, lass doch mal Live-Coden.

01:34:28.170 --> 01:34:32.250
<v Gast 1>Wir machen jetzt eine interaktive Shell auf und du tippst da Code rein, der wird sofort ausgeführt.

01:34:32.330 --> 01:34:33.290
<v Unbekannt>Und ich dachte, boah.

01:34:33.530 --> 01:34:34.890
<v Felix>Boah, fucking Mad.

01:34:35.690 --> 01:34:36.650
<v Unbekannt>So fucking Magie.

01:34:36.730 --> 01:34:41.690
<v Gast 1>Und mittlerweile gibt es ja dann auch noch irgendwie so mit irgendwie Syntax-Highlighting und Autocompletion

01:34:41.770 --> 01:34:43.130
<v Gast 1>und wer weiß was.

01:34:43.530 --> 01:34:48.570
<v Gast 1>Und das ist einfach schon ziemlich cool, aber auch einfach mal, also ich benutze sowas halt auch ständig,

01:34:48.810 --> 01:34:53.210
<v Gast 1>um irgendwie so kleine Sprachfeatures auszuprobieren, um einfach mal so,

01:34:53.290 --> 01:34:57.610
<v Gast 1>ja, wie war denn das, wenn ich jetzt hier dieses Array und da irgendwas mitmachen will,

01:34:57.850 --> 01:35:02.570
<v Gast 1>dann probiere ich das halt mal kurz außerhalb von irgendeinem Programm auf der Shell aus und tippe das da

01:35:02.570 --> 01:35:02.890
<v Gast 1>rein.

01:35:03.370 --> 01:35:04.010
<v Gast 1>Ja, genau.

01:35:04.250 --> 01:35:06.250
<v Gast 1>Und so ist es gut.

01:35:06.570 --> 01:35:12.730
<v Ingo>Apropos IDE, Syntax-Highlighting und so, was benutzt du, Felix, um das zu programmieren?

01:35:13.450 --> 01:35:17.770
<v Felix>Ich benutze jetzt gerade diesen ESPR, aber eigentlich ist es scheiße, ja.

01:35:18.410 --> 01:35:19.690
<v Felix>Muss man sagen.

01:35:20.330 --> 01:35:27.290
<v Felix>Und eigentlich will man es anders benutzen, aber es geht auf jeden Fall ziemlich gut mit einfach mit Wim und

01:35:27.370 --> 01:35:30.890
<v Felix>dann hast du nämlich Syntax-Highlighting und dann funktionieren ganz viele Sachen einfach schon so.

01:35:31.050 --> 01:35:36.250
<v Felix>Und dann halt mit dem ESP-Tool kannst du dann die Sachen, kannst du dann quasi Files auf den Mikrocontroller

01:35:36.250 --> 01:35:36.650
<v Felix>schreiben.

01:35:36.810 --> 01:35:39.050
<v Felix>Weil es funktioniert aktuell wirklich so.

01:35:39.370 --> 01:35:44.970
<v Felix>Du hast diesen Mikrocontroller und dann, wenn du eine Datei auf den Mikrocontroller hochladen willst,

01:35:45.050 --> 01:35:49.290
<v Felix>dann sagst du LUR in dem LURA-Interpreter,

01:35:49.530 --> 01:35:54.010
<v Felix>öffne diese Datei mit dem Dateinamen, weil der Mikrocontroller ein Dateisystem hat,

01:35:54.410 --> 01:36:01.370
<v Felix>und Zeile für Zeile schreibst jetzt File.writewriteLine und dann schreibst du

01:36:01.370 --> 01:36:06.650
<v Felix>da quasi deine Zeile Code oder dann schreibt die ID deine Zeile Code,

01:36:06.730 --> 01:36:12.170
<v Felix>die du dann auf dem Mikrocontroller als Zeile haben willst, als Datei haben willst,

01:36:12.330 --> 01:36:13.450
<v Felix>Zeile für Zeile rein.

01:36:13.530 --> 01:36:16.490
<v Felix>Das ist eigentlich total absurd, wenn man sich das überlegt.

01:36:16.730 --> 01:36:21.290
<v Felix>Also wirklich Zeile für Zeile wird die Datei dann auf den Mikrocontroller geschrieben,

01:36:22.090 --> 01:36:23.290
<v Felix>über den LUR-Interpreter.

01:36:23.610 --> 01:36:24.730
<v Felix>Einfach nur, weil es geht.

01:36:24.810 --> 01:36:25.610
<v Felix>So, ich kann das.

01:36:25.770 --> 01:36:30.890
<v Felix>Ich kann, wenn man das so erklärt, hört sich das total absurd an, aber es funktioniert halt irgendwie.

01:36:31.050 --> 01:36:31.210
<v Felix>Okay.

01:36:31.370 --> 01:36:32.570
<v Unbekannt>Naja, ich meine, wenn es tut.

01:36:33.050 --> 01:36:36.970
<v Felix>Ja, also es ist wirklich so, du hast kein File-Upload-Tool oder so,

01:36:37.050 --> 01:36:43.530
<v Felix>sondern du hast einen LUR-Interpreter, mit dem du dann eine Datei öffnest und dann Zeile für Zeile die Zeile,

01:36:44.570 --> 01:36:48.730
<v Felix>was halt auf der anderen Seite steht, dort reinschreibst.

01:36:49.450 --> 01:36:55.370
<v Gast 1>Wie funktioniert denn das dann eigentlich so irgendwie mit, du möchtest jetzt Sachen debuggen?

01:36:56.730 --> 01:36:59.690
<v Gast 1>Also sagen wir mal, du hast irgendwie das Programm verhält sich nicht so,

01:36:59.770 --> 01:37:01.850
<v Gast 1>wie du es gerne, wie du es eigentlich erwarten würdest.

01:37:02.250 --> 01:37:06.570
<v Gast 1>Ich meine, du kannst, ich würde jetzt mal erwarten, dass du auf die seriellen Konsole wahrscheinlich

01:37:06.570 --> 01:37:08.890
<v Gast 1>Log-Nachrichten ausgeben kannst.

01:37:09.050 --> 01:37:11.770
<v Felix>Also Printf-Debugging funktioniert auf jeden Fall ziemlich gut.

01:37:11.930 --> 01:37:12.170
<v Felix>Okay.

01:37:12.730 --> 01:37:15.690
<v Felix>Und es funktioniert auch in dem, also quasi wenn du Callbacks hast,

01:37:15.770 --> 01:37:19.210
<v Felix>ist alles kein Problem, sondern der schreibt dir dann halt trotzdem auf deine seriellen Konsole an.

01:37:19.290 --> 01:37:20.410
<v Felix>Das ist ein ganz gutes Satz.

01:37:20.970 --> 01:37:23.930
<v Gast 1>Also okay, das heißt, du kannst auf der Konsole zumindest mal loggen,

01:37:24.250 --> 01:37:27.370
<v Gast 1>um dann irgendwie Inhalte von Variablen oder sowas zu sehen?

01:37:27.610 --> 01:37:27.930
<v Gast 1>Genau.

01:37:28.090 --> 01:37:33.610
<v Felix>Also du kannst da mit, äh, in Lua hast du, wenn du einfach nur Variable schreibst,

01:37:33.690 --> 01:37:37.930
<v Felix>dann ist es nicht so, dass der Interpreter dir dann sagt, was in der Variable drinsteht,

01:37:38.010 --> 01:37:40.650
<v Felix>sondern du musst quasi istgleich und dann die Variable.

01:37:40.890 --> 01:37:42.170
<v Felix>Also es ist kein Problem eigentlich.

01:37:42.330 --> 01:37:44.570
<v Gast 1>Okay, also du schreibst davor dann quasi ein istgleich.

01:37:44.730 --> 01:37:49.930
<v Felix>Genau, und dadurch, dass du dass du ja einen Lua-Interpreter hast,

01:37:50.010 --> 01:37:53.770
<v Felix>dann kannst du bestimmte, oder ganz am Anfang kannst du auch einfach alle Funktionen,

01:37:53.850 --> 01:37:57.130
<v Felix>äh, alle Variablen global machen und dann kannst du nämlich danach,

01:37:57.210 --> 01:37:59.930
<v Felix>also kannst du dann in dem Interpreter quasi nachschauen, wie die sich,

01:38:00.090 --> 01:38:02.090
<v Felix>wie die zu einem bestimmten Zeitpunkt sind einfach.

01:38:03.210 --> 01:38:09.050
<v Gast 1>Gibt es irgendwie eine Möglichkeit, da irgendwie so einen Debugger ran zu hängen und dann irgendwie so Schritt

01:38:09.050 --> 01:38:10.410
<v Gast 1>für Schritt durchzusten?

01:38:12.330 --> 01:38:14.650
<v Felix>Ein Step-Debugger habe ich bis jetzt noch nicht gesehen.

01:38:14.810 --> 01:38:18.090
<v Felix>Gibt es bestimmt für Lua selber irgendwie schon.

01:38:18.410 --> 01:38:20.010
<v Gast 1>Aber wahrscheinlich nicht für diese Microcontroller.

01:38:20.250 --> 01:38:21.930
<v Felix>Nicht für den Mikrocontroller, genau.

01:38:22.250 --> 01:38:22.570
<v Felix>Okay.

01:38:24.490 --> 01:38:28.890
<v Felix>Genau, aber es ist echt, also es ist schon echt geil,

01:38:29.050 --> 01:38:32.810
<v Felix>weil das halt nicht so scheiße ist, wie damals Mikrocontroller zu programmieren.

01:38:32.890 --> 01:38:34.490
<v Felix>Und ich glaube, es wird nur besser.

01:38:35.210 --> 01:38:38.970
<v Gast 1>Nee, ich meine, es ist ja schon mal irgendwie interessant zu sehen,

01:38:39.050 --> 01:38:45.050
<v Gast 1>was es bedeutet, Speicher selber zu managen oder halt Low-Level-Code zu schreiben,

01:38:45.130 --> 01:38:48.090
<v Gast 1>aber irgendwie, wenn man es dann mal verstanden hat, will man es wahrscheinlich nicht mehr tun.

01:38:48.410 --> 01:38:49.050
<v Gast 1>Richtig, ja.

01:38:49.770 --> 01:38:55.530
<v Felix>Obwohl du dir manchmal bei dem Mikrocontroller wünschst, dass du ein bisschen mehr quasi

01:38:57.930 --> 01:39:01.210
<v Felix>auf den Garbage Collector einwirken wolltest.

01:39:01.450 --> 01:39:05.450
<v Felix>Weil bei dir dann halt irgendwie doch der RAM vorläuft.

01:39:07.050 --> 01:39:10.730
<v Felix>Und aber so prinzipiell ist es schon cool, einen Garbage Collector zu haben.

01:39:11.130 --> 01:39:13.850
<v Felix>Und dass du dich nicht um solche krippigen Sachen kümmern musst.

01:39:15.930 --> 01:39:16.250
<v Felix>Okay.

01:39:17.210 --> 01:39:24.090
<v Ingo>Ich habe noch zwei Bücher gefunden, zumindest von dem Erfinder von Loa.

01:39:24.570 --> 01:39:26.730
<v Ingo>Also gibt es einmal in Deutsch, einmal in Englisch.

01:39:27.130 --> 01:39:30.650
<v Ingo>Vielleicht auch eine gute Möglichkeit, um da anzusteigen, wenn man will.

01:39:31.290 --> 01:39:34.570
<v Ingo>Und ja, ansonsten müsst ihr halt mal gucken.

01:39:34.730 --> 01:39:40.250
<v Felix>Also, wie gesagt, das Coolste und Beste ist, wenn ihr ein bisschen bei.

01:39:41.610 --> 01:39:45.210
<v Felix>Genau, kauft euch für 250 so einen Mikrocontroller aus China.

01:39:45.370 --> 01:39:49.530
<v Felix>Wartet, bis der in sechs Wochen da ist und dann habt einfach Spaß.

01:39:52.110 --> 01:39:54.590
<v Ingo>Okay, das zu Lua.

01:39:54.990 --> 01:39:56.190
<v Felix>Genau, jetzt sind wir durch.

01:39:56.830 --> 01:39:58.270
<v Ingo>Jetzt sind wir erstmal zu Lua durch.

01:39:58.510 --> 01:40:00.590
<v Gast 1>Ich habe etwas gefunden, ich habe noch Lapis gefunden.

01:40:00.910 --> 01:40:01.150
<v Gast 1>Oh.

01:40:02.110 --> 01:40:04.190
<v Gast 1>Das ist so interessant.

01:40:04.430 --> 01:40:09.070
<v Gast 1>Das ist ein Webframework, was für Lua funktioniert oder Moonscript, was auch immer Moonscript.

01:40:09.950 --> 01:40:12.270
<v Felix>Moonscript, äh, kennst du CoffeeScript für JavaScript?

01:40:12.830 --> 01:40:14.830
<v Felix>Moonscript ist das für Lua.

01:40:15.310 --> 01:40:15.550
<v Felix>Okay.

01:40:15.710 --> 01:40:21.630
<v Gast 1>Also ist es quasi, und das soll so ein bisschen API-mäßig, sieht es so ein bisschen aus wie Sinatra oder?

01:40:23.310 --> 01:40:26.190
<v Felix>Ich weiß nicht, ich finde es sieht aus wie CoffeeScript, muss ich sagen.

01:40:26.430 --> 01:40:29.630
<v Gast 1>Nee, ich meine jetzt dieses Lapis-Webframework.

01:40:29.790 --> 01:40:30.190
<v Gast 1>Achso, okay.

01:40:30.670 --> 01:40:35.470
<v Gast 1>So API-mäßig, du kannst halt irgendwelche Routen registrieren und dann irgendwie Dinge zurückgeben.

01:40:35.870 --> 01:40:36.670
<v Felix>Coole Sache auf jeden Fall.

01:40:36.750 --> 01:40:40.590
<v Felix>Ich wünsche mir das auf jeden Fall noch für einen Controller so ein Web-Framework,

01:40:40.670 --> 01:40:42.670
<v Felix>was einfach ist und was nicht so groß ist.

01:40:43.070 --> 01:40:45.230
<v Felix>Ich mache hier was für Moonscript hin.

01:40:45.390 --> 01:40:47.470
<v Felix>Moonscript sieht aus wie CoffeeScript, finde ich, ja.

01:40:47.710 --> 01:40:48.030
<v Felix>Okay.

01:40:48.990 --> 01:40:50.910
<v Gast 1>Gut, auch gut was dabei gelernt.

01:40:51.150 --> 01:40:53.550
<v Gast 1>Moonscript habe ich bis jetzt noch nicht gehört.

01:40:53.790 --> 01:40:57.630
<v Felix>Ja, aber der Name, äh, the name suggested.

01:40:58.750 --> 01:40:59.550
<v Felix>Quasi Moon.

01:40:59.790 --> 01:41:01.310
<v Felix>Lua, auch Moon.

01:41:06.190 --> 01:41:08.190
<v Ingo>Ja, kommt aus Brasilien, ne?

01:41:08.270 --> 01:41:10.510
<v Felix>Also Lua muss gut sein.

01:41:11.310 --> 01:41:11.950
<v Felix>Portugiesisch.

01:41:12.910 --> 01:41:13.550
<v Felix>Portugiesisch.

01:41:13.710 --> 01:41:20.670
<v Gast 1>Und das macht dann auch so ein bisschen, okay, das emuliert dann quasi auch so Klassen in Lua und die

01:41:20.670 --> 01:41:24.510
<v Gast 1>ganzen Geschichten und macht dann wahrscheinlich diese ganze Metatable Magic unter der Haube.

01:41:24.670 --> 01:41:25.390
<v Gast 1>Genau.

01:41:26.270 --> 01:41:29.550
<v Ingo>Okay, dann kommen wir jetzt zur zweiten Programmiersprache, nämlich die,

01:41:29.630 --> 01:41:31.950
<v Ingo>die sich Flydy angeschaut hat in letzter Zeit.

01:41:32.990 --> 01:41:33.630
<v Ingo>Elixier.

01:41:33.790 --> 01:41:37.230
<v Ingo>Und davon habe ich im Gegensatz zu Lua bisher noch nichts gehört.

01:41:37.310 --> 01:41:37.710
<v Ingo>Ich auch nicht.

01:41:37.870 --> 01:41:39.390
<v Felix>Gibt es Elixier in 15 Minuten?

01:41:39.470 --> 01:41:41.310
<v Felix>Ich hätte es gerne in 15 Minuten.

01:41:42.750 --> 01:41:43.790
<v Ingo>Genau, Tic-Tac, Tick-Tac.

01:41:44.110 --> 01:41:45.710
<v Felix>Nee, nee, die gleiche Webseite quasi.

01:41:46.510 --> 01:41:50.190
<v Gast 1>Aber ich habe hier den Getting Started Guide verlinkt.

01:41:50.430 --> 01:41:51.150
<v Gast 1>Und der ist cool?

01:41:51.310 --> 01:41:52.430
<v Gast 1>Und der ist super cool.

01:41:52.590 --> 01:41:57.470
<v Gast 1>Also der ist auch echt gut geschrieben und da kann man immer so, es ist ein Konzept pro Seite und die Seite

01:41:57.470 --> 01:42:00.430
<v Gast 1>kann man so in, weiß nicht, ein paar Minuten lesen.

01:42:00.670 --> 01:42:03.790
<v Gast 1>Gegen Ende wird es dann ein bisschen komplizierter, da muss man ein bisschen mehr nachdenken.

01:42:03.870 --> 01:42:10.110
<v Gast 1>Das ist alles relativ, ich soll ich sagen, relativ dicht gehalten, so von der Informationsdichte.

01:42:10.350 --> 01:42:14.430
<v Gast 1>Wenn man das ein bisschen auseinandergefriemelt will, dann habe ich noch ein paar Bücher verlinkt.

01:42:16.350 --> 01:42:18.590
<v Gast 1>Ja, wir können ja mal von dem Anfang anfangen.

01:42:18.670 --> 01:42:24.670
<v Gast 1>Also Elixir ist eine funktionale, dynamisch starkt

01:42:24.670 --> 01:42:31.470
<v Gast 1>typisierte Concurrent und nicht objektorientierte Programmiersprache auf der

01:42:31.470 --> 01:42:32.910
<v Gast 1>Erlang Virtual Machine.

01:42:33.470 --> 01:42:34.430
<v Felix>Oh, Erlang.

01:42:34.670 --> 01:42:37.150
<v Gast 1>Also Erlang habt ihr wahrscheinlich schon mal gehört.

01:42:37.950 --> 01:42:40.030
<v Felix>Funktionale Programmiersprache.

01:42:41.310 --> 01:42:42.190
<v Ingo>Erlang, ja.

01:42:42.910 --> 01:42:44.110
<v Ingo>Da stehen auch viele drauf.

01:42:44.590 --> 01:42:46.030
<v Felix>Was ich nicht verstehen kann, aber ne?

01:42:46.830 --> 01:42:51.790
<v Gast 1>Ja, das Ding ist halt, Erlang hat super viele coole Features, so was die VM hergibt und so,

01:42:51.870 --> 01:42:56.350
<v Gast 1>aber die Syntax ist ein bisschen weird und die, naja,

01:42:56.510 --> 01:43:00.990
<v Gast 1>Syntax ist dann letzten Endes nur so Schall und Rauch eigentlich, wenn man sich mal daran gewöhnt hat.

01:43:01.070 --> 01:43:04.110
<v Gast 1>Also ich habe so vor kurzem mal mit einem Freund von mir ein bisschen diskutiert,

01:43:04.350 --> 01:43:06.830
<v Gast 1>was so über Geschmäcker bei Programmiersprachen angeht.

01:43:06.910 --> 01:43:12.110
<v Gast 1>Und er hat halt bis jetzt hauptsächlich in Objective-C gearbeitet und finde das ganz toll und ästhetisch.

01:43:12.270 --> 01:43:15.710
<v Gast 1>Und ich finde, ich sehe da einfach nur komische, eckige Klammern.

01:43:18.270 --> 01:43:23.390
<v Gast 1>Aber da hat halt jeder so sein eigenen Geschmack und das ist halt auch so wahrscheinlich die Sache,

01:43:23.550 --> 01:43:28.750
<v Gast 1>aus was von der Welt man denn kommt und mit was für Sprachen man bis jetzt so gearbeitet hat.

01:43:28.990 --> 01:43:33.390
<v Gast 1>Und also ich hatte mal Lust, was Neues auszuprobieren,

01:43:33.630 --> 01:43:40.270
<v Gast 1>was so ein bisschen auch, wie soll ich sagen, mein bisheriges Weltbild so ein

01:43:40.270 --> 01:43:46.430
<v Gast 1>bisschen ergänzt oder wie soll ich sagen, ja, mir halt einfach neue Konzepte beibringt.

01:43:47.070 --> 01:43:50.190
<v Gast 1>Und funktionale Sprachen fand ich ganz interessant.

01:43:50.270 --> 01:43:54.590
<v Gast 1>Also mein letztes, mein letzter Kontakt mit einer so, sagen wir mal,

01:43:54.670 --> 01:43:57.550
<v Gast 1>zumindest im Ansatz funktionalen Sprache war Skala.

01:43:58.910 --> 01:44:01.230
<v Gast 1>Da ist halt das Dings, du kannst immer cheaten.

01:44:01.310 --> 01:44:06.190
<v Gast 1>Also so standardmäßig sind Datenstrukturen so immutable, also unveränderbar.

01:44:06.510 --> 01:44:12.830
<v Gast 1>Und gerade auch so diese Konzepte mit, du gibst Funktionen rum und du siehst Dinge wie

01:44:13.230 --> 01:44:18.110
<v Gast 1>so, du versuchst Seiteneffekte zu verhindern und so weiter, das ist in Skala auch mit drin,

01:44:18.190 --> 01:44:24.110
<v Gast 1>aber es ist halt letzten Endes eigentlich auch nur ein Rapper auf Java und du kannst halt auf Cheaten und dir

01:44:24.110 --> 01:44:29.710
<v Gast 1>irgendwelche Hashmaps benutzen, die du halt, wo du irgendwelche Keys hinzufügen kannst und überall Mutable

01:44:29.710 --> 01:44:30.190
<v Gast 1>State hast.

01:44:30.270 --> 01:44:32.590
<v Gast 1>Und du kannst es halt programmieren wie Java eigentlich.

01:44:32.670 --> 01:44:34.990
<v Gast 1>Mit ein bisschen anderen Syntax.

01:44:35.150 --> 01:44:40.430
<v Gast 1>Und da fand ich Elixir ganz interessant, weil es ist und Skala ist zudem auch noch objektorientiert,

01:44:40.670 --> 01:44:42.830
<v Gast 1>was bei Elixir jetzt nicht der Fall ist.

01:44:43.310 --> 01:44:43.630
<v Gast 1>Ja.

01:44:44.430 --> 01:44:49.070
<v Gast 1>Und also ich hatte mir Erlang schon lange mal angeguckt,

01:44:49.150 --> 01:44:53.070
<v Gast 1>so von den Konzepten her, und ich weiß, dass es viele coole Projekte gibt.

01:44:53.150 --> 01:44:57.790
<v Gast 1>Also wir haben jetzt schon mal irgendwie in einer der letzten Talksendungen über den E-JabberD geredet.

01:44:58.910 --> 01:45:02.350
<v Gast 1>Dieser Erlang-Jabba-Server.

01:45:02.990 --> 01:45:07.950
<v Gast 1>Und gerade für solche Geschichten ist halt Erlang schon recht prädestiniert,

01:45:08.030 --> 01:45:14.590
<v Gast 1>weil es sehr gut mit so Concurrency und viele Verbindungen offen halten und so weiter.

01:45:15.310 --> 01:45:16.830
<v Gast 1>Weil es damit gut umgehen kann.

01:45:16.910 --> 01:45:19.470
<v Gast 1>Warum können wir ja später nochmal ein bisschen drüber reden.

01:45:21.310 --> 01:45:25.550
<v Gast 1>Und ja, es gibt viele Projekte, die irgendwie cool waren,

01:45:25.630 --> 01:45:28.350
<v Gast 1>aber irgendwie habe ich mich an Erlang noch nie so richtig rangetraut,

01:45:28.430 --> 01:45:31.390
<v Gast 1>weil ich habe es mir da immer mal angeguckt, dann sah die Syntax so ein bisschen komisch aus.

01:45:31.470 --> 01:45:33.150
<v Gast 1>Die Konzepte sind auch alle ganz neu.

01:45:33.310 --> 01:45:39.950
<v Gast 1>Dann habe ich mir jetzt gedacht, okay, Elixir hat genau die gleichen Konzepte wie Erlang.

01:45:40.110 --> 01:45:42.030
<v Felix>Okay, das hört sich erstmal ziemlich gut an.

01:45:43.150 --> 01:45:49.790
<v Gast 1>Plus ist von einem Typen erfunden worden, der ziemlich groß in der Ruby-Community ist.

01:45:50.030 --> 01:45:52.190
<v Felix>Oh, da muss es quasi schon gewonnen.

01:45:52.590 --> 01:45:56.110
<v Gast 1>Und die Syntax sieht halt mehr oder weniger aus wie Ruby.

01:45:56.350 --> 01:45:56.670
<v Gast 1>Okay.

01:45:56.990 --> 01:45:58.350
<v Gast 1>Also oder sehr ähnlich.

01:45:58.430 --> 01:45:59.870
<v Gast 1>Es sieht sehr ähnlich aus wie Ruby.

01:46:00.830 --> 01:46:04.270
<v Gast 1>Viele syntaktische Eigenheiten sind ähnlich, nur mit dem Unterschied,

01:46:04.350 --> 01:46:08.510
<v Gast 1>dass es halt keine Klassen gibt, weil es halt nicht objektorientiert ist und so.

01:46:10.990 --> 01:46:17.070
<v Gast 1>Und was halt auch anders ist als bei Erlangen, man kann relativ einfach Polymorphie definieren.

01:46:17.630 --> 01:46:19.550
<v Gast 1>Also man kann so Mehrfachvererbung.

01:46:19.950 --> 01:46:24.590
<v Gast 1>Nee, nicht mehr vererbungen, sondern du hast ja keine Vererbung, weil du hast ja keine Objektorientierung,

01:46:24.670 --> 01:46:30.430
<v Gast 1>aber du hast halt so Sachen wie du hast Module,

01:46:30.590 --> 01:46:33.470
<v Gast 1>die enthalten Funktionen, mit denen kannst du Dinge tun.

01:46:33.870 --> 01:46:40.190
<v Gast 1>Und du hast zum Beispiel sowas wie ein Enumerable-Modul, mit dem du über Dinge iterieren kannst oder Sachen

01:46:40.190 --> 01:46:42.110
<v Gast 1>Map oder sowas aufrufen kannst.

01:46:42.270 --> 01:46:48.270
<v Gast 1>Und du kannst dann halt mehr oder weniger eine Syntax, mit der du da Interfaces definieren kannst,

01:46:48.350 --> 01:46:52.510
<v Gast 1>was für Funktionen ein Modul implementieren muss.

01:46:53.230 --> 01:46:55.870
<v Gast 1>Und dann kannst du halt zum Beispiel sagen, du hast jetzt einen Datentyp,

01:46:55.950 --> 01:47:01.230
<v Gast 1>das ist jetzt irgendwie kein Sagen wir mal ein anderes Beispiel.

01:47:01.310 --> 01:47:06.270
<v Gast 1>Wir haben einen JSON-Serializer, der Sachen, also da wirfst du ein Objekt rein,

01:47:06.350 --> 01:47:10.590
<v Gast 1>also da wirfst du eine Datenstruktur rein und der macht dann JSON draus.

01:47:10.830 --> 01:47:11.070
<v Gast 1>Okay.

01:47:11.390 --> 01:47:17.710
<v Gast 1>Dann hast du jetzt irgendwie deinen super Datentyp, aber du hast zum Beispiel sowas wie JSON.serializer oder

01:47:17.710 --> 01:47:19.230
<v Gast 1>JSON.encode heißt es, glaube ich.

01:47:21.150 --> 01:47:27.310
<v Gast 1>Und JSON.encode ist halt quasi ein Protokoll, was ein bestimmtes Interface

01:47:27.310 --> 01:47:28.190
<v Gast 1>voraussetzt.

01:47:28.590 --> 01:47:34.030
<v Gast 1>Und aber du kannst jetzt dann über Elemente, die diese Sprache zur Verfügung stellt,

01:47:34.270 --> 01:47:39.630
<v Gast 1>kannst du quasi dieses Protokoll implementieren und dann funktioniert JSON.encode plötzlich,

01:47:39.710 --> 01:47:44.670
<v Gast 1>wenn du für deine Datenstruktur und dieses Modul bestimmte Funktionen zur Verfügung stellst.

01:47:44.910 --> 01:47:50.750
<v Felix>Okay, das heißt, du implementierst in deinem Objekt quasi

01:47:52.670 --> 01:47:56.990
<v Felix>das Interface dafür, dass dann quasi andere Magic funktioniert auf einmal.

01:47:57.230 --> 01:47:57.630
<v Felix>Genau.

01:47:57.950 --> 01:47:58.430
<v Felix>Fuck.

01:47:58.910 --> 01:48:04.750
<v Gast 1>Also das ist mehr oder weniger sowas wie ein Interface in einer objektorientierten Programmiersprache,

01:48:04.830 --> 01:48:09.710
<v Gast 1>wo du sagst, okay, du akzeptierst als Argument nicht ein Objekt von einem bestimmten Typ,

01:48:09.790 --> 01:48:12.430
<v Gast 1>sondern ein Objekt, was ein bestimmtes Interface implementiert.

01:48:12.670 --> 01:48:12.990
<v Gast 1>Ja.

01:48:13.550 --> 01:48:18.430
<v Gast 1>Und hier ist es halt das gleiche Konzept, aber du hast halt keine Objekte und deswegen musst du das halt auf

01:48:18.430 --> 01:48:20.430
<v Gast 1>Modulbasis und Funktionsbasis machen.

01:48:20.670 --> 01:48:20.990
<v Gast 1>Okay.

01:48:21.630 --> 01:48:25.390
<v Gast 1>Also das ist so eine Sache, die anders ist als bei Erlangen und du hast,

01:48:25.710 --> 01:48:28.190
<v Gast 1>du kannst, die nennen das hygienische Makros.

01:48:28.350 --> 01:48:29.390
<v Felix>Hygienisch.

01:48:29.710 --> 01:48:32.110
<v Felix>Räumen die nach sich auf oder wie funktioniert das?

01:48:32.350 --> 01:48:33.470
<v Gast 1>Nee, die sind gescoppt.

01:48:33.630 --> 01:48:34.030
<v Gast 1>Ach so.

01:48:34.910 --> 01:48:41.550
<v Gast 1>Also du kannst quasi Makros, das sind mehr oder weniger Erweiterungen der eigentlichen

01:48:41.550 --> 01:48:48.270
<v Gast 1>Syntax kannst du definieren und kannst dann damit deine

01:48:48.270 --> 01:48:49.550
<v Gast 1>eigene Syntax erfinden.

01:48:49.630 --> 01:48:54.590
<v Gast 1>Zum Beispiel sowas wie eine Funktionsdefinition ist auch nichts anderes als ein Makro,

01:48:54.750 --> 01:49:00.830
<v Gast 1>was dann eine Lambda auf einen Wert zuweist.

01:49:01.390 --> 01:49:02.830
<v Gast 1>Zum Beispiel solche Geschichten.

01:49:02.990 --> 01:49:03.790
<v Felix>Achso, ja, okay.

01:49:03.870 --> 01:49:10.510
<v Felix>Also das quasi, dass du sagst, Dev-Module-Function mach halt

01:49:10.510 --> 01:49:15.390
<v Felix>irgendwas, ist quasi das gleiche wie x ist gleich Lambda,

01:49:15.950 --> 01:49:20.270
<v Felix>äh, nee, Quatsch, Fun, also das Function ist gleich Lambda,

01:49:20.350 --> 01:49:21.070
<v Felix>was auch immer dann.

01:49:21.310 --> 01:49:22.110
<v Felix>Genau, sowas in der Nähe.

01:49:22.430 --> 01:49:28.350
<v Gast 1>Also du kannst halt einfach sagen, also Dev ist so das Keyword für

01:49:30.030 --> 01:49:33.950
<v Gast 1>Funktionsdefinition, aber das ist wiederum eigentlich auch nur ein Makro.

01:49:34.190 --> 01:49:34.350
<v Gast 1>Okay.

01:49:34.510 --> 01:49:40.030
<v Gast 1>Und so ist halt die Sprache, im Sprachkern ist sehr klein, aber sehr viel der Sprache selber,

01:49:40.190 --> 01:49:44.110
<v Gast 1>was sich anfühlt wie irgendwie eine native Syntax, sind einfach nur Makros.

01:49:44.350 --> 01:49:50.670
<v Gast 1>Und damit kannst du halt sehr viel Metaprogramming machen und also kannst halt mehr oder weniger dir Dinge

01:49:50.670 --> 01:49:55.710
<v Gast 1>implementieren, die dir halt so das Leben einfacher machen, die du jetzt nur mit normalen

01:49:55.710 --> 01:50:01.550
<v Gast 1>Funktionsdefinitionen nicht könntest, weil du halt und auch, weil das zur Compile-Zeit passiert.

01:50:01.950 --> 01:50:04.830
<v Gast 1>Also Makros werden zur Compile-Zeit evaluiert.

01:50:05.070 --> 01:50:05.390
<v Gast 1>Okay.

01:50:05.550 --> 01:50:08.590
<v Gast 1>Und was dann da hinten rausfällt, ist ein Beam-File.

01:50:08.910 --> 01:50:14.910
<v Gast 1>Und Beam steht für Bockdown und Björns Erlang Abstract Machine.

01:50:15.230 --> 01:50:16.030
<v Felix>BAM!

01:50:16.910 --> 01:50:21.470
<v Gast 1>Und das ist quasi die virtuelle Maschine, also die Virtual Machinen von Erlang.

01:50:21.950 --> 01:50:22.270
<v Gast 1>Okay.

01:50:22.670 --> 01:50:28.110
<v Gast 1>Oder ich weiß nicht, ob es da noch andere gibt, aber das ist halt so der de facto Standard von der Erlang

01:50:28.270 --> 01:50:28.910
<v Gast 1>Virtual Machine.

01:50:29.070 --> 01:50:32.190
<v Felix>Ja, also es ist quasi so wie bei Lua-Bytecode einfach.

01:50:32.590 --> 01:50:32.830
<v Felix>Genau.

01:50:33.870 --> 01:50:38.750
<v Gast 1>Genau, das ist dann Bytecode und der wird dann von der virtuellen Maschine nochmal just in time kompiliert und

01:50:38.750 --> 01:50:41.950
<v Gast 1>letzten Endes ist halt auch nichts anderes wie bei Java Bytecode oder Python.

01:50:42.190 --> 01:50:47.630
<v Felix>Ja, wie alle, die ein Intermediate-Format machen oder in Python ist es dann PyS, Python Code, Python Bytecode.

01:50:48.430 --> 01:50:48.910
<v Felix>PyC.

01:50:48.990 --> 01:50:51.950
<v Felix>Genau, das heißt dann PyC, die File, die da rausfällt.

01:50:52.430 --> 01:50:54.430
<v Felix>Ist aber auch nur Bytecode quasi.

01:50:55.710 --> 01:50:57.310
<v Felix>Damit man es nicht so kompiliert.

01:50:57.470 --> 01:51:00.430
<v Felix>Also bei vielen ist es dann, dass man es nicht nochmal machen muss,

01:51:00.510 --> 01:51:05.310
<v Felix>quasi dieses Umsetzen von echtem Text zu Bytecode-Text.

01:51:06.430 --> 01:51:11.150
<v Felix>Und manche kompilieren da auch wirklich dann hin, damit es dann quasi so weit fertig ist.

01:51:12.190 --> 01:51:12.510
<v Felix>Okay.

01:51:12.910 --> 01:51:18.110
<v Gast 1>Und was halt auch noch so ein bisschen erweiterbar ist, so syntaxmäßig ist, es gibt Sigils.

01:51:19.230 --> 01:51:25.310
<v Gast 1>Und Sigils sind nochmal so eine auch lokal gescopte Syntax-Erweiterung,

01:51:25.550 --> 01:51:27.230
<v Gast 1>die mit einer Tilde beginnt.

01:51:27.470 --> 01:51:33.790
<v Gast 1>Also ein gutes Beispiel ist, die regulären Ausdrücke in Elixir ist

01:51:34.110 --> 01:51:38.590
<v Gast 1>tilde R und dann irgendein Trennzeichen.

01:51:38.670 --> 01:51:44.910
<v Gast 1>Also du kannst dann sagen, tilde R slash und dann nochmal ein Slash als Ende,

01:51:44.990 --> 01:51:50.030
<v Gast 1>aber du kannst zum Beispiel auch sagen, du machst, was weiß ich, geschweifte Klammern.

01:51:50.270 --> 01:51:50.590
<v Gast 1>Okay.

01:51:50.910 --> 01:51:56.190
<v Gast 1>Also und das ist egal, welches Zeichen du da benutzt, solange das Tilde R da vorne dran steht und die beiden

01:51:56.190 --> 01:52:02.750
<v Gast 1>Zeichen, also du das gleiche Zeichen als Anfangs- und als Endtrendzeichen benutzt.

01:52:02.910 --> 01:52:03.070
<v Gast 1>Okay.

01:52:03.310 --> 01:52:07.150
<v Gast 1>Und diese Syntax kannst du quasi auch selber verwenden und kannst jetzt sagen,

01:52:07.230 --> 01:52:13.230
<v Gast 1>du machst jetzt irgendwie, du willst irgendwas, was irgendwie ein Objekt oder was heißt ein Objekt,

01:52:13.310 --> 01:52:18.270
<v Gast 1>was irgendeine Datenstruktur oder irgendein Element in einen Integer umwandelt und kannst dann sagen,

01:52:18.350 --> 01:52:21.470
<v Gast 1>du definierst dir jetzt in deinem lokalen Scope ein Tilde i.

01:52:22.350 --> 01:52:27.470
<v Gast 1>Dann machst du einfach Tilde i und dann ein Trennzeichen und schreibst dann da irgendwie deinen Wert oder

01:52:27.470 --> 01:52:32.030
<v Gast 1>deine Variable rein und dann machst du das Trennzeichen wieder zu und dann wird halt diese Funktion

01:52:32.030 --> 01:52:34.990
<v Gast 1>aufgerufen, die du davor definiert hast.

01:52:35.630 --> 01:52:36.590
<v Gast 1>Und die macht dann das Richtige.

01:52:37.150 --> 01:52:38.110
<v Felix>Abgefahren.

01:52:39.870 --> 01:52:44.270
<v Gast 1>Also das bietet halt so die Möglichkeit, die Sprache mehr oder weniger nach seinen eigenen Bedürfnissen

01:52:44.270 --> 01:52:45.390
<v Gast 1>anzupassen.

01:52:48.190 --> 01:52:50.190
<v Gast 1>Und ja, ist ganz cool so.

01:52:50.350 --> 01:52:55.150
<v Gast 1>Also, wie gesagt, ich habe jetzt noch keine großen Projekte damit implementiert.

01:52:55.230 --> 01:53:00.190
<v Gast 1>Ich habe da mal ein bisschen so in der Shell rumgehackt und irgendwie mal ein bisschen so ein paar kleine

01:53:00.190 --> 01:53:04.430
<v Gast 1>Codeschnipsel, die in diesem Buch, was ich da gerade lese, drinstehen.

01:53:04.590 --> 01:53:06.990
<v Felix>Ja, also interaktiver Interpreter ist einfach gewonnen.

01:53:08.110 --> 01:53:11.150
<v Gast 1>Aber interaktiver Interpreter ist XI.

01:53:11.870 --> 01:53:13.870
<v Felix>Interaktiv Inter, Inter.

01:53:14.750 --> 01:53:16.750
<v Unbekannt>Also XI, quasi.

01:53:18.110 --> 01:53:18.430
<v Unbekannt>Okay.

01:53:22.110 --> 01:53:24.990
<v Gast 1>Ja, und das ist schon mal ganz natt.

01:53:25.950 --> 01:53:26.430
<v Gast 1>Krass.

01:53:26.750 --> 01:53:30.830
<v Gast 1>Und genau, was gibt es denn sonst noch zu sagen?

01:53:30.910 --> 01:53:35.070
<v Gast 1>Wir könnten vielleicht mal ein bisschen über diese Features der Erlang-VM reden.

01:53:36.590 --> 01:53:41.710
<v Felix>Ich glaube, wir müssen mehr über Erlang reden, weil Alexier sieht jetzt ein bisschen aus wie CoffeeScript für

01:53:41.710 --> 01:53:44.590
<v Felix>JavaScript, nur halt für Erlang quasi.

01:53:44.830 --> 01:53:50.590
<v Felix>Weil ich habe gesehen, du kannst auch direkt quasi Erlang-Module in Alexier hernehmen.

01:53:50.830 --> 01:53:51.630
<v Unbekannt>Genau, genau.

01:53:51.870 --> 01:53:53.310
<v Felix>Und ja, das fühlt sich an.

01:53:54.030 --> 01:54:00.270
<v Gast 1>Also es ist, die machen, also die setzen sich quasi zum Ziel,

01:54:00.350 --> 01:54:03.390
<v Gast 1>möglichst kompatibel mit Erlang und dem Erlang-Ökosystem zu sein.

01:54:04.110 --> 01:54:07.230
<v Felix>Erlang-Ökosystem ist hört sich auch ein bisschen absurd an irgendwie,

01:54:07.310 --> 01:54:09.230
<v Felix>weil davon habe ich einfach noch nie was gehört.

01:54:10.110 --> 01:54:11.550
<v Felix>Gibt es ein Erlang-Ökosystem?

01:54:11.710 --> 01:54:12.350
<v Felix>Ja, natürlich.

01:54:12.510 --> 01:54:17.390
<v Gast 1>Also es gibt irgendwie Cowboy, was irgendwie so einen Webserver ist.

01:54:17.550 --> 01:54:21.070
<v Gast 1>Es gibt irgendwie Webmaschinen, was so ein Framework ist.

01:54:21.150 --> 01:54:22.910
<v Gast 1>Also es gibt mehrere Web-Frameworks tatsächlich.

01:54:23.470 --> 01:54:28.910
<v Gast 1>Es gibt Frameworks für X oder Libraries für XMPP, für irgendwelche HTTP-Geschichten.

01:54:30.110 --> 01:54:33.470
<v Gast 1>Was du in Erlang halt auch hast, ist OTP.

01:54:34.350 --> 01:54:37.390
<v Gast 1>Da gibt es doch diesen lustigen mit irgendwie Psycho-Bitch.

01:54:37.710 --> 01:54:40.430
<v Felix>Ah ja, ja, excessive Psycho, irgendwas.

01:54:41.390 --> 01:54:41.630
<v Felix>Ja, genau.

01:54:41.870 --> 01:54:42.830
<v Felix>Wir können das irgendwie verlinken.

01:54:42.990 --> 01:54:45.070
<v Gast 1>Können wir mal verlinken, das ist ein lustiges Video.

01:54:45.390 --> 01:54:50.430
<v Gast 1>Und OTP ist die Open Telekom-Plattform oder Open Telephone Plattform.

01:54:52.510 --> 01:54:54.110
<v Gast 1>Ich google mal kurz.

01:54:57.070 --> 01:54:58.350
<v Felix>Ich hoffe, ich habe es gefunden.

01:54:58.590 --> 01:54:59.710
<v Felix>Erlangt a Movie?

01:54:59.870 --> 01:55:00.590
<v Felix>Ich weiß nicht, ob es ist.

01:55:01.710 --> 01:55:04.110
<v Ingo>Erlangt kommt ja aus von Ericsson und so.

01:55:04.510 --> 01:55:06.270
<v Gast 1>Ja, er ist eine Sprache von Ericsson.

01:55:07.070 --> 01:55:11.390
<v Gast 1>Und ich glaube, es ist die Open Telephone Plattform.

01:55:12.190 --> 01:55:15.950
<v Ingo>Wundert mich jetzt nicht, dass es bei Telefonen irgendwas zu tun hat.

01:55:16.350 --> 01:55:18.590
<v Felix>Das ist ja auch zu überraschend, ja.

01:55:18.990 --> 01:55:22.510
<v Gast 1>Und das ist, also, ist auch egal, für was OTP letzten Endes steht.

01:55:22.750 --> 01:55:24.910
<v Gast 1>Das ist so die Standard-Library von Erlang.

01:55:24.990 --> 01:55:27.070
<v Gast 1>Und da sind halt schon ganz viele Sachen drin.

01:55:27.630 --> 01:55:33.150
<v Gast 1>Da gibt es Sachen für Abstraktionen auf dem Aktor-Modell drauf.

01:55:33.230 --> 01:55:35.310
<v Gast 1>Ich glaube, wir sollten mal kurz erzählen, was das Ektor-Modell ist.

01:55:35.710 --> 01:55:38.830
<v Felix>Ja, erzähl doch mal, was das Aktor-Modell ist, weil das brauchen wir jetzt wohl öfter.

01:55:39.310 --> 01:55:43.550
<v Gast 1>Ja, und also das Ector-Modell in Erlangen ist es auch lustig, die implementieren.

01:55:43.630 --> 01:55:47.070
<v Gast 1>Das Ector-Modell, sie nennen es aber nicht Aktor, sondern sie nennen es Prozesse.

01:55:47.630 --> 01:55:50.110
<v Felix>Ja, das ist eine ganz einfache Sache.

01:55:50.270 --> 01:55:53.870
<v Felix>Du musst immer, wenn du eine neue Programmiersprache hast, musst du alles umbenennen.

01:55:54.030 --> 01:55:59.230
<v Felix>Deswegen heißt es ja auch in, deswegen heißt es ja auch in Lua nicht irgendwie Dictionary oder Objekt oder

01:55:59.230 --> 01:56:03.550
<v Felix>irgendwas anderes, sondern es heißt Table, genau, weil es ja quasi was ganz anderes,

01:56:03.710 --> 01:56:04.910
<v Felix>nur genau das gleiche, ja.

01:56:05.070 --> 01:56:05.390
<v Felix>Okay.

01:56:06.270 --> 01:56:08.270
<v Felix>Und deswegen heißen die da auch, äh, wie ist die?

01:56:08.750 --> 01:56:09.230
<v Felix>Schon vergessen.

01:56:09.550 --> 01:56:10.030
<v Felix>Processes.

01:56:10.190 --> 01:56:10.990
<v Felix>Processes, genau.

01:56:11.470 --> 01:56:11.790
<v Felix>Genau.

01:56:12.110 --> 01:56:14.990
<v Gast 1>Also ein Act ist im Endeffekt ein relativ einfaches Konstrukt.

01:56:15.070 --> 01:56:18.990
<v Gast 1>Das ist ein Ding, was für sich selbst gescheduled werden kann.

01:56:19.150 --> 01:56:20.510
<v Gast 1>Das hat eine Inbox.

01:56:21.310 --> 01:56:23.310
<v Gast 1>Da kannst du Nachrichten hinschicken.

01:56:23.550 --> 01:56:24.670
<v Felix>Quasi eine Que.

01:56:24.910 --> 01:56:25.150
<v Felix>Ja.

01:56:25.470 --> 01:56:29.310
<v Felix>Ah ja, okay, wir müssen es anders nennen, weil ansonsten verstehen es die Leute schon vorher.

01:56:29.470 --> 01:56:31.150
<v Felix>Das wäre dann keine Überraschung mehr.

01:56:33.310 --> 01:56:39.070
<v Gast 1>Und also die haben ihr, ein Aktor hält seinen eigenen State, was dann letzten Endes auch die einzige

01:56:39.070 --> 01:56:44.190
<v Gast 1>Möglichkeit ist, einen Erlangt dauerhaft State zu halten, nämlich indem du halt einen Aktor stattest,

01:56:44.350 --> 01:56:49.870
<v Gast 1>der dauerhaft läuft, an dem du Nachrichten schickst und der hält sich dann halt seinen Status.

01:56:51.150 --> 01:56:56.990
<v Gast 1>Und im Endeffekt ist es so ein Ding, sowas wie sowas wie tatsächlich ein

01:56:56.990 --> 01:57:01.630
<v Gast 1>Betriebssystem-Thread, äh, einen Betriebssystemprozess, aber sehr, sehr leichtgewichtig.

01:57:01.790 --> 01:57:07.950
<v Gast 1>Du schickst da asynchron Nachrichten hin und in diesem Ektor reagierst du auf diese Nachrichten.

01:57:08.110 --> 01:57:12.910
<v Gast 1>Die müssen aber nicht sofort wieder zurückkommen, sondern das kann halt auch alles asynchron passieren.

01:57:13.310 --> 01:57:19.870
<v Gast 1>Und das wird von der virtuellen Maschine so gescheduled, dass die dann halt mehr oder weniger so

01:57:19.870 --> 01:57:25.870
<v Gast 1>leichtgewichtig sind, dass du die benutzen kannst wie Objekte in einer objektorientierten Programmiersprache.

01:57:25.950 --> 01:57:30.590
<v Gast 1>Also du kannst halt wirklich sagen, ja, okay, du hast jetzt irgendwie so einen Erlang-Prozess und da leben

01:57:30.590 --> 01:57:36.430
<v Gast 1>irgendwie fünf Millionen Actors drin und das kratzt dann dein Rechner irgendwie nicht,

01:57:36.590 --> 01:57:38.190
<v Gast 1>weil die halt sehr leichtgewichtig sind.

01:57:38.430 --> 01:57:39.790
<v Felix>Das ist eine coole Sache auf jeden Fall.

01:57:40.510 --> 01:57:45.550
<v Gast 1>Und das Konzept ist halt, die können, die werden dann auch auf einem Threadpool gescheduled,

01:57:45.630 --> 01:57:51.390
<v Gast 1>die werden dann im Zweifelsfall auch von deinem Betriebssystem dann auf mehreren Cores gleichzeitig ausgeführt

01:57:51.470 --> 01:57:56.670
<v Gast 1>und du kannst dann dann halt damit sehr gut auch in die Breite,

01:57:56.750 --> 01:58:01.150
<v Gast 1>also in die Höhe, kannst du sehr gut skalieren, wenn du auf einer Maschine viele Kerne hast.

01:58:02.110 --> 01:58:08.590
<v Gast 1>Aber dadurch, dass halt so definiert ist, dass die ganzen Datenstrukturen unveränderbar sind,

01:58:08.670 --> 01:58:12.110
<v Gast 1>kannst du halt auch sagen, ja, okay, mich hindert jetzt eigentlich nichts dran,

01:58:12.350 --> 01:58:13.950
<v Gast 1>die übers Netzwerk zu schicken.

01:58:14.590 --> 01:58:18.510
<v Gast 1>Und tatsächlich bietet die Standard Library auch sowas wie Remote Actors.

01:58:19.230 --> 01:58:22.110
<v Felix>Das ist quasi einfach fertig, dieses ganze Netzwerk-Schiffel, alles fertig.

01:58:22.270 --> 01:58:26.190
<v Gast 1>Ja genau, du hast halt das komplette Netzwerkzeug, da ist schon ein Wire-Protokoll mit definiert,

01:58:26.350 --> 01:58:27.950
<v Gast 1>wie du das übers Netzwerk schickst.

01:58:28.110 --> 01:58:32.750
<v Gast 1>Und du kannst dir quasi mehr oder weniger mit relativ einfachen Mitteln oder mit Standardmitteln,

01:58:32.830 --> 01:58:37.390
<v Gast 1>die schon dabei sind, kannst du dir ein Cluster bauen, wo du ganz viele Dinge in parallel abarbeitest.

01:58:37.550 --> 01:58:41.310
<v Felix>Aber natürlich brauchst du dann noch coolere, also kannst du dir noch sagen,

01:58:41.470 --> 01:58:44.590
<v Felix>wie das realisiert wird auf dem Netzwerk und wie es funktioniert?

01:58:45.550 --> 01:58:46.590
<v Gast 1>Soweit bin ich noch nicht.

01:58:46.910 --> 01:58:52.190
<v Felix>Weil du brauchst auf jeden Fall Captain Proto mit einem unendlich mal schneller als alles andere.

01:58:52.430 --> 01:58:53.390
<v Felix>Wenn schon, dann schon.

01:58:53.630 --> 01:58:54.270
<v Felix>Also ich weiß es nicht.

01:58:55.390 --> 01:58:58.910
<v Gast 1>Ich glaube, dass das ein Wire-Protokoll, was von Erlang verwendet wird,

01:58:58.990 --> 01:59:04.030
<v Gast 1>um diese Remote-Actor-Geschichten zu machen, dass das halt so irgend so eine definiert ist.

01:59:04.270 --> 01:59:07.150
<v Gast 1>Und ich weiß jetzt nicht, ob man das irgendwie erweitern kann oder so.

01:59:07.390 --> 01:59:09.470
<v Felix>Nee, ist wahrscheinlich auch gut genug, ansonsten hätte sie auch.

01:59:10.910 --> 01:59:15.630
<v Gast 1>Und ein anderes Feature, was die VR mitbringt, was auch ziemlich cool ist, ist Hot Code-Reloading.

01:59:15.950 --> 01:59:19.950
<v Gast 1>Und zwar, also in Erlang wird jeder Code innerhalb eines Moduls definiert.

01:59:20.270 --> 01:59:25.630
<v Gast 1>Und ein Modul ist auch die Einheit, in der du Code nachladen kannst.

01:59:25.710 --> 01:59:32.030
<v Gast 1>Das heißt, du kannst quasi über Schnittstellen sagen, okay, bestimmter Code hat sich irgendwo geändert.

01:59:32.270 --> 01:59:37.230
<v Gast 1>Den kannst du im laufenden Betrieb neu laden.

01:59:38.190 --> 01:59:40.750
<v Felix>Und wie funktioniert das?

01:59:41.070 --> 01:59:44.430
<v Felix>Das, was da jetzt gerade quasi ausgeführt wird, also wenn

01:59:45.170 --> 01:59:50.130
<v Felix>Stell dir vor, du hast gerade irgendwie eine Funktion und die läuft gerade und dann sagst du es jetzt neuer

01:59:50.130 --> 01:59:51.890
<v Felix>Code, wartest du noch, bis die fertig ist?

01:59:52.370 --> 01:59:59.090
<v Gast 1>Nee, im Zweifelsfall ist es so, dass quasi du hast jetzt im Normalfall basiert

01:59:59.090 --> 02:00:05.890
<v Gast 1>deine oder besteht deine Anwendung aus sehr vielen Acts oder aus sehr vielen

02:00:05.890 --> 02:00:06.610
<v Gast 1>Prozessen.

02:00:06.930 --> 02:00:12.290
<v Gast 1>Und in dem Prozess gibt es dann mehr oder weniger eine Syntax, wenn du irgendeinen Call auf den Prozess über

02:00:14.530 --> 02:00:21.090
<v Gast 1>den Modulnamen aufrufst, dann wird der Code neu geladen.

02:00:21.410 --> 02:00:27.570
<v Gast 1>Und dann kannst du quasi an den Prozess eine bestimmte Nachricht schicken und der bearbeitet quasi noch seine

02:00:27.650 --> 02:00:29.170
<v Gast 1>letzten Requests.

02:00:29.970 --> 02:00:34.930
<v Gast 1>Und wenn das dann fertig ist und dann quasi die Aufforderung zum Neuladen kommt,

02:00:35.250 --> 02:00:42.130
<v Gast 1>dann wird da quasi unter der Haube ein neuer Actor gestartet oder auch halt ein neuer Prozess und der läuft

02:00:42.130 --> 02:00:43.090
<v Gast 1>dann mit dem neuen Code.

02:00:43.250 --> 02:00:47.570
<v Felix>Ja, dadurch, dass du quasi kein State hältst, kannst du diese Magic einfach machen.

02:00:47.810 --> 02:00:52.530
<v Gast 1>Genau, oder dadurch, dass dieser State einfach nur darauf basiert,

02:00:52.690 --> 02:00:58.210
<v Gast 1>dass du über bestimmte Callbacks immer wieder Datenstrukturen hin und her schickst.

02:00:58.450 --> 02:01:02.210
<v Gast 1>Also du kannst dir schon State halten, aber die Datenstrukturen, die diesen State halten,

02:01:02.290 --> 02:01:03.730
<v Gast 1>die sind unveränderbar.

02:01:04.210 --> 02:01:08.290
<v Gast 1>Und wie du das dann machst, ist halt im Endeffekt, dass du so definierte Funktionen hast.

02:01:10.450 --> 02:01:17.170
<v Gast 1>Und die geben dann immer wieder eine Datenstruktur zurück und die wird

02:01:17.170 --> 02:01:19.650
<v Gast 1>wieder an den nächsten Call weitergereicht.

02:01:21.490 --> 02:01:25.330
<v Gast 1>Und also ich hoffe, man hat das soweit irgendwie halbwegs verstanden.

02:01:25.570 --> 02:01:29.250
<v Gast 1>Und also im Endeffekt ist das so diese Geschichte, die Erlang so cool macht.

02:01:29.330 --> 02:01:34.130
<v Gast 1>Du kannst damit halt sehr hochverfügbare, sehr weit skalierende Anwendungen schreiben,

02:01:34.210 --> 02:01:40.610
<v Gast 1>weil du halt erstens auf mehrere Kerne oder dann auf mehrere Computer deine Anwendung verteilen kannst.

02:01:41.650 --> 02:01:45.810
<v Gast 1>Und du kannst auf der anderen Seite halt auch sehr hochverfügbare Sachen machen,

02:01:45.970 --> 02:01:51.810
<v Gast 1>weil du halt die Möglichkeit hast, im laufenden Betrieb Hotpatches oder neue Features oder sowas

02:01:51.970 --> 02:01:52.850
<v Gast 1>nachzuschieben.

02:01:53.650 --> 02:01:59.170
<v Gast 1>Ich bin tatsächlich, ich habe tatsächlich keine Ahnung, wie gut das in der Praxis so funktioniert und so,

02:01:59.250 --> 02:02:03.970
<v Gast 1>aber es scheint so gut zu sein, dass es irgendwelche Leute gibt,

02:02:04.050 --> 02:02:10.290
<v Gast 1>die so Erlang-Software anbieten und da eine Uptime mit neun Neunen hinterm Komma

02:02:11.090 --> 02:02:11.810
<v Gast 1>garantieren.

02:02:11.890 --> 02:02:18.530
<v Gast 1>Also das ist quasi 99 Komma und dann kommen 9-9% aufs Jahr Downtime.

02:02:18.850 --> 02:02:20.450
<v Gast 1>Das ist ein ganz schönes.

02:02:20.770 --> 02:02:22.930
<v Felix>99% Downtime ist nicht gut.

02:02:24.050 --> 02:02:24.370
<v Felix>Downtime.

02:02:24.850 --> 02:02:25.090
<v Felix>Uptime.

02:02:26.450 --> 02:02:26.690
<v Felix>Glück.

02:02:27.570 --> 02:02:30.930
<v Felix>Wir haben es geschafft, eine Sekunde hat es gelaufen und dann war es wieder kaputt gegangen.

02:02:31.010 --> 02:02:31.810
<v Ingo>War ein bisschen blöd.

02:02:31.890 --> 02:02:32.690
<v Ingo>Aber es hat funktioniert.

02:02:33.170 --> 02:02:34.130
<v Gast 1>So viel Downtime kann man.

02:02:34.450 --> 02:02:36.210
<v Gast 1>Das ist relativ einfach, das zu garantieren.

02:02:39.090 --> 02:02:40.850
<v Gast 1>Das ist ja mindestens so viel Downtime.

02:02:42.290 --> 02:02:45.730
<v Felix>Wir garantieren 100% Downtime, wenn sie für uns einkaufen.

02:02:46.050 --> 02:02:47.330
<v Unbekannt>Auf jeden Fall.

02:02:48.930 --> 02:02:51.810
<v Felix>Wir versprechen, dass wir niemals das System starten.

02:02:53.010 --> 02:02:54.850
<v Ingo>Und dafür kriegt man Geld.

02:02:55.090 --> 02:02:56.690
<v Ingo>Mist, ich hab einen falschen Job.

02:02:56.850 --> 02:03:01.810
<v Gast 1>Ja, du hättest einfach deine Requirements besser definieren müssen, Ingo.

02:03:02.450 --> 02:03:05.730
<v Gast 1>Du hast einfach, du bekommst unendlich viel Geld und hast 100% Downtime.

02:03:05.810 --> 02:03:06.050
<v Gast 1>Bam.

02:03:06.610 --> 02:03:09.010
<v Gast 1>Du musst es einfach so verkaufen, als ob Downtime was Gutes ist.

02:03:09.570 --> 02:03:10.930
<v Felix>Genau, wir haben voll viel Downtime.

02:03:11.330 --> 02:03:12.530
<v Felix>Wir haben letztes Jahr 50%.

02:03:13.090 --> 02:03:16.050
<v Gast 1>Ja, weißt du, du musst einfach sagen, ey, diese ganzen Kack-Hacker,

02:03:16.130 --> 02:03:21.170
<v Gast 1>die sind voll das Problem und wenn du 100% Downtime hast, dann bist du 100% geschützt gegen Hacker.

02:03:21.970 --> 02:03:23.090
<v Ingo>100% safe.

02:03:23.330 --> 02:03:23.970
<v Ingo>Auf jeden Fall.

02:03:24.130 --> 02:03:25.170
<v Felix>Ja, ist ja auch wirklich so.

02:03:25.570 --> 02:03:26.210
<v Felix>Sehr gut.

02:03:29.410 --> 02:03:34.690
<v Gast 1>Genau, Hot Code Reloading hatten wir und ja, wie gesagt, also OTP gibt da.

02:03:35.330 --> 02:03:36.690
<v Felix>Obsessive, was war das denn?

02:03:36.850 --> 02:03:38.130
<v Felix>Ach shit, ich krieg's nicht mehr zusammen.

02:03:38.210 --> 02:03:39.890
<v Felix>Egal, mach weiter, sorry, sorry, sorry.

02:03:40.770 --> 02:03:41.490
<v Felix>Ist egal.

02:03:43.170 --> 02:03:50.050
<v Gast 1>Ja, also die virtuelle Maschine zusammen mit dieser Standardbibliothek ist halt schon relativ mächtig,

02:03:50.290 --> 02:03:53.490
<v Gast 1>was halt auch dafür sorgt, dass halt Erlangen zum Beispiel auch bei,

02:03:53.570 --> 02:03:59.810
<v Gast 1>was weiß ich, bei Facebook Messenger, bei WhatsApp, bei diesen ganzen Kommunikationsdingen eingesetzt wird.

02:04:00.290 --> 02:04:04.210
<v Gast 1>Was halt auch interessant werden konnte, jetzt kommen wir wieder zum Anfang der Sendung,

02:04:04.290 --> 02:04:06.210
<v Gast 1>nämlich bei Internet of Things.

02:04:06.450 --> 02:04:07.650
<v Felix>Oh yeah, Internet of Things.

02:04:09.090 --> 02:04:15.010
<v Gast 1>Irgendwelche Systeme, die in Zukunft, was weiß ich, wie viele Millionen Devices irgendwie

02:04:15.570 --> 02:04:17.890
<v Gast 1>bedienen sollen auf Serverseite.

02:04:18.370 --> 02:04:21.810
<v Gast 1>Und da, wo man jetzt Lua quasi auf der Client-Seite einsetzen kann,

02:04:21.890 --> 02:04:25.490
<v Gast 1>da kann man jetzt halt irgendwie Elixir oder Erlang auf der Serverseite einsetzen.

02:04:26.290 --> 02:04:27.090
<v Gast 1>Das ist schon cool.

02:04:27.490 --> 02:04:28.770
<v Felix>Ja, ist auf jeden Fall eine coole Sache.

02:04:29.090 --> 02:04:32.770
<v Felix>OTP heißt übrigens Outlaw Techno Psycho-Bitch.

02:04:33.490 --> 02:04:34.050
<v Felix>Ich hab's gefunden.

02:04:34.930 --> 02:04:35.810
<v Gast 1>Das war diese Geschichte.

02:04:35.890 --> 02:04:37.730
<v Gast 1>Ich müsste noch irgendwas mit Psycho-Bitch.

02:04:39.170 --> 02:04:41.090
<v Gast 1>Aber Outlaw Techno Psycho-Bitch.

02:04:41.570 --> 02:04:42.450
<v Unbekannt>Gute Sache.

02:04:44.930 --> 02:04:45.650
<v Unbekannt>Genau.

02:04:45.890 --> 02:04:52.610
<v Felix>Ja, also genau, speziell dieses für das Internet of Things Zeug

02:04:52.850 --> 02:04:56.690
<v Felix>willst du ja eigentlich immer sowas so ein Konstrukt haben, möglichst,

02:04:56.930 --> 02:05:01.170
<v Felix>dass der, dass diese kleinen Computer sich dann irgendwo melden und dann sagen die,

02:05:01.250 --> 02:05:04.690
<v Felix>ja, ich bin hier und ich habe hier folgende Dinge ab und zu mal quasi.

02:05:04.770 --> 02:05:08.850
<v Felix>Und wenn die kaputt gehen, dann soll es möglichst noch die Möglichkeit geben,

02:05:08.930 --> 02:05:10.770
<v Felix>dass man weiß, dass es kaputt ist.

02:05:12.050 --> 02:05:16.850
<v Felix>Und ansonsten sollen die halt einfach in so eine Queue Sachen reinschieben und dann passiert Magic und dann

02:05:16.850 --> 02:05:18.930
<v Felix>gehen die Jalousien runter oder so ein Quatsch.

02:05:19.090 --> 02:05:23.650
<v Felix>Ja, das ist ja was, was jetzt gerade Use Cases ist, was auch vor der Quatsch ist.

02:05:24.210 --> 02:05:25.250
<v Felix>Super nervig.

02:05:26.290 --> 02:05:26.610
<v Felix>Ja.

02:05:27.170 --> 02:05:31.410
<v Gast 1>Aber wo du gerade sagst, Dinge kaputt gehen, das ist halt auch so ein super interessantes Konstrukt,

02:05:31.490 --> 02:05:34.850
<v Gast 1>was ich so aus eigentlich kaum anderen Programmiersprachen kenne.

02:05:35.250 --> 02:05:41.890
<v Gast 1>Und zwar in der Erlangen-Welt und somit auch in Elixir ist so dieses Motto

02:05:42.370 --> 02:05:43.490
<v Gast 1>Let it crash.

02:05:43.730 --> 02:05:46.210
<v Felix>Ja, let it go, let it go.

02:05:48.210 --> 02:05:49.650
<v Unbekannt>Ich gehe aus meinem Kopf raus.

02:05:52.210 --> 02:05:57.250
<v Gast 1>Und die Idee ist einfach, du musst nicht unbedingt immer ständig Fehler behandeln,

02:05:57.330 --> 02:06:01.010
<v Gast 1>sondern du kannst auch deine Prozesse einfach sterben lassen.

02:06:01.650 --> 02:06:07.090
<v Gast 1>Und du kannst dann so Supervisor definieren, die quasi, das sind dann quasi diese Module,

02:06:07.330 --> 02:06:09.490
<v Gast 1>die deine Prozesse starten.

02:06:10.050 --> 02:06:15.010
<v Gast 1>Die können dann quasi sich da ein Callback registrieren und wenn dieser Kind-Prozess dann wegstirbt,

02:06:15.090 --> 02:06:17.490
<v Gast 1>dann können die dann einfach sagen, sie starten einen neuen automatisch.

02:06:17.730 --> 02:06:22.290
<v Gast 1>Ja, das Problem ist, ja, sowas kannst du dann halt auch kaskadieren.

02:06:22.370 --> 02:06:27.970
<v Gast 1>Da gibt es dann sogenannte Supervision-Trees, wo du dann halt mehr oder weniger so die ganzen deine ganze

02:06:27.970 --> 02:06:34.690
<v Gast 1>Infrastruktur hast und wenn irgendwo was schief geht, dann überwachen sich mehr oder weniger deine

02:06:34.690 --> 02:06:35.890
<v Gast 1>Prozesse gegenseitig.

02:06:36.130 --> 02:06:36.450
<v Gast 1>Okay.

02:06:36.850 --> 02:06:40.370
<v Gast 1>Und die können dann halt automatisch neu gestartet werden oder du kannst entsprechend,

02:06:40.450 --> 02:06:43.970
<v Gast 1>wenn irgendwie bestimmte Dinge passieren, darauf reagieren.

02:06:44.930 --> 02:06:47.250
<v Gast 1>Und ist halt auch ganz cool.

02:06:47.330 --> 02:06:52.450
<v Gast 1>Und vor allem halt auch in Sachen Garbage Collection, weil so ein Prozess hat seinen eigenen Heap.

02:06:53.490 --> 02:07:00.370
<v Gast 1>Und das heißt, du musst, dein System muss Garbage Collection nur im Kontext von so einem kleinen

02:07:00.370 --> 02:07:02.050
<v Gast 1>Prozess auf einem kleinen Heap machen.

02:07:02.130 --> 02:07:06.370
<v Gast 1>Das heißt, Garbage Collection ist im Großen und Ganzen nicht so ein großes Problem.

02:07:06.450 --> 02:07:11.330
<v Gast 1>Und plus, wenn dein Prozess entweder fertig ist und nicht mehr läuft,

02:07:11.410 --> 02:07:17.650
<v Gast 1>oder wenn er stirbt, dann kann auch alles, was mit diesem Prozess in Verbindung gebracht werden kann,

02:07:17.810 --> 02:07:20.050
<v Gast 1>inklusive dem Heap weggeworfen werden.

02:07:20.210 --> 02:07:22.690
<v Gast 1>Das heißt, es macht da halt auch das Aufräumen nochmal einfacher.

02:07:22.850 --> 02:07:28.930
<v Felix>Also wird quasi der Prozess dann wie wenn du eine Funktion fertig hast und der Stack dann

02:07:29.170 --> 02:07:30.370
<v Felix>gefragt wird.

02:07:31.810 --> 02:07:36.850
<v Felix>Fand ich immer eigentlich eine coole Sache, wenn du quasi ein C dich nicht um Garbage Collection kümmern

02:07:36.930 --> 02:07:39.170
<v Felix>willst, viel, dann benutzt einfach nur einen Stack.

02:07:39.410 --> 02:07:42.690
<v Felix>Wenn du nicht so große Datenstrukturen hast, ist alles kein Problem wirklich,

02:07:42.770 --> 02:07:46.130
<v Felix>dann sagst du, okay, ich habe halt einfach so ein großes Ding und ich gebe das dann halt über den Stack mit.

02:07:46.210 --> 02:07:48.530
<v Felix>Ist scheißegal, wird halt immer kopiert, scheiß drauf.

02:07:49.010 --> 02:07:53.570
<v Felix>Aber du musst dich halt nicht um Garbage Collection kümmern, weil sobald die Funktion fertig ist,

02:07:53.890 --> 02:07:56.530
<v Felix>wird der Stack dann quasi Stack Pointer nach unten gesetzt.

02:07:56.610 --> 02:07:59.410
<v Felix>Das heißt, alles, was davor war, ist dann einfach quasi Garbage Collected.

02:07:59.570 --> 02:07:59.890
<v Felix>Genau.

02:08:00.210 --> 02:08:06.770
<v Gast 1>Und also wie das halt in so einem Dings passiert, in so einem Prozess in Elixir oder in Erlang,

02:08:06.930 --> 02:08:12.290
<v Gast 1>ist halt, also die haben, es gibt so ohne weiteres keine Loop-Konstrukte,

02:08:12.450 --> 02:08:14.610
<v Gast 1>wie jetzt so Vorschleifen oder While oder sowas.

02:08:14.690 --> 02:08:18.290
<v Gast 1>Du kannst sowas dann letzten Endes über Makros oder sowas nachimplementieren,

02:08:18.450 --> 02:08:25.090
<v Gast 1>aber ist so nicht vorgesehen, weil solche Konstrukte würden eigentlich imperative Programmierung

02:08:25.090 --> 02:08:25.570
<v Gast 1>bedeuten.

02:08:26.210 --> 02:08:28.050
<v Felix>Und das will man ja nicht, ist ja der Teufel.

02:08:28.530 --> 02:08:31.810
<v Gast 1>Genau, will man will man ja nicht und im Zweifelsfall würde das halt bedeuten,

02:08:31.970 --> 02:08:36.690
<v Gast 1>dass du irgendwo drüber iterierst und währenddessen Datenstrukturen veränderst und diese Möglichkeit hast du

02:08:36.690 --> 02:08:39.490
<v Gast 1>in Erlang eh oder in Elixir eh nicht.

02:08:40.770 --> 02:08:44.050
<v Gast 1>Und somit macht man das dann halt über Rekursion.

02:08:45.250 --> 02:08:50.690
<v Gast 1>Und dann kannst du halt einfach sagen, ja, okay, du hast ein Receive-Statement und das blockiert so lange,

02:08:50.770 --> 02:08:53.090
<v Gast 1>bis dein Prozess eine Nachricht bekommt.

02:08:53.730 --> 02:08:58.450
<v Gast 1>Wenn du nur dieses Receive-Statement hast und die Nachricht ist abgearbeitet,

02:08:58.850 --> 02:09:02.450
<v Gast 1>dann stirbt der Prozess quasi wieder, weil der hat ja dann nichts mehr zu tun.

02:09:02.530 --> 02:09:04.850
<v Gast 1>Das Receive wurde einmal ausgeführt.

02:09:05.090 --> 02:09:12.050
<v Gast 1>Aber du kannst natürlich sagen, wenn eine bestimmte Nachricht reinkommt, dann andersrum.

02:09:13.330 --> 02:09:18.530
<v Gast 1>Wenn im Normalfall, wenn du dann auf diese Nachrichten wartest, dann rufst du einfach deine Funktion rekursiv

02:09:18.530 --> 02:09:19.010
<v Gast 1>wieder auf.

02:09:19.410 --> 02:09:24.370
<v Gast 1>Also ruf die einfach nochmal neu auf, dann ist wieder das Receive, was so lange blockiert,

02:09:24.450 --> 02:09:25.730
<v Gast 1>bis es eine Nachricht bekommt.

02:09:25.970 --> 02:09:29.010
<v Gast 1>Und du kannst natürlich sagen, wenn du jetzt irgendeine spezielle Nachricht bekommst,

02:09:29.330 --> 02:09:33.490
<v Gast 1>dann mach keinen rekursiven Funktionsaufruf, sondern verlass halt diese Funktion.

02:09:33.650 --> 02:09:33.810
<v Gast 1>Ja.

02:09:34.050 --> 02:09:35.810
<v Gast 1>Und dann bist du halt fertig.

02:09:36.050 --> 02:09:37.250
<v Felix>Ja, cool.

02:09:37.730 --> 02:09:42.610
<v Gast 1>Und also ihr seht schon, das ist jetzt so eine ganz, ganz andere Welt,

02:09:42.770 --> 02:09:45.090
<v Gast 1>wie man es irgendwie aus anderen Programmiersprachen kennt.

02:09:45.890 --> 02:09:52.130
<v Gast 1>Und da fand ich es halt jetzt cool, dass so zumindest Elixir selber eine Syntax,

02:09:52.210 --> 02:09:58.450
<v Gast 1>die mir bekannt vorkommt, mitbringt, sodass ich sagen kann, okay, ich bin nicht so von der

02:09:58.690 --> 02:10:04.690
<v Gast 1>seltsamen Syntax über die anderen Konzepte, über das ganz andere Ökosystem irgendwie total geflasht,

02:10:04.770 --> 02:10:07.170
<v Gast 1>sondern ich kann zumindest sagen, ich halte mich so ein bisschen an der Syntax fest,

02:10:07.250 --> 02:10:10.210
<v Gast 1>weil die kenne ich und dann kann ich mir den Rest irgendwie nebenherbeibringen.

02:10:10.370 --> 02:10:14.290
<v Felix>Ja, auf jeden Fall, also ich finde, auch, egal was alle anderen sagen,

02:10:14.530 --> 02:10:19.330
<v Felix>Syntax ist irgendwie schon eine wichtige Sache, weil das macht Sachen sympathischer.

02:10:19.490 --> 02:10:24.610
<v Felix>Das ist also ein bisschen so wie das Aussehen von, keine Ahnung, je nachdem, worauf man halt steht, ja.

02:10:24.850 --> 02:10:31.330
<v Felix>Und man sieht dann halt irgendwas und denkt man so, oh, das sieht gut aus oder ich gehe lieber weiter.

02:10:31.570 --> 02:10:33.890
<v Gast 1>Ja, also sagen wir mal irgendwie ein ganz einfaches Beispiel.

02:10:33.970 --> 02:10:38.050
<v Gast 1>Manche Leute stehen halt einfach, sagen wir mal, bei Möbeln Autos oder sonst was,

02:10:38.130 --> 02:10:42.290
<v Gast 1>stehen vielleicht auf Ecken und Kanten und andere haben gerne runde Ecken.

02:10:42.450 --> 02:10:43.730
<v Felix>Runde Ecken, genau, runde Ecken.

02:10:44.290 --> 02:10:47.490
<v Gast 1>Und wenn du halt vielleicht irgendwie dein Leben lang mit runden Ecken groß geworden bist,

02:10:47.570 --> 02:10:50.690
<v Gast 1>ist es vielleicht ein bisschen schwierig, ein Auto zu dir zu kaufen,

02:10:50.930 --> 02:10:52.450
<v Gast 1>was jetzt total eckig ist.

02:10:53.090 --> 02:10:57.970
<v Gast 1>Ist vielleicht ein bisschen ein weit hergeholtes Beispiel, aber so kann man so ungefähr definieren.

02:10:59.170 --> 02:10:59.970
<v Felix>Ja, genau.

02:11:00.210 --> 02:11:04.770
<v Felix>Aber natürlich kann man sich an alles gewöhnen, wenn man mit genug Geld beworfen wird.

02:11:05.010 --> 02:11:05.330
<v Felix>Ja.

02:11:06.930 --> 02:11:11.890
<v Gast 1>Keine Ahnung, oder wenn es andere Gründe gibt, warum man irgendwie Interesse daran hat.

02:11:11.970 --> 02:11:14.370
<v Gast 1>Ich meine, Erlang ist jetzt auch keine furchtbar hässliche Sprache,

02:11:14.450 --> 02:11:18.770
<v Gast 1>sie ist nur syntaktisch sehr viel anders als die Dinge, die ich sonst so kenne.

02:11:19.650 --> 02:11:22.450
<v Gast 1>Plus sie hat das ganze coole Zeug mit den Makros und so nicht.

02:11:22.530 --> 02:11:26.610
<v Gast 1>Also in Erlangen gibt es so ein Konstrukt, das nennt sich irgendwie Parse-Transforms.

02:11:26.690 --> 02:11:32.850
<v Gast 1>Da kannst du denen irgendwie den Abstrakt-Syntax-Tree modifizieren, bevor er kompiliert wird und so.

02:11:33.010 --> 02:11:39.170
<v Gast 1>Aber das scheint ziemlich aufwendig und ziemlich kompliziert zu sein und deswegen macht man es selten oder

02:11:39.170 --> 02:11:39.890
<v Gast 1>wenig.

02:11:42.770 --> 02:11:48.690
<v Gast 1>Ja, ich meine, syntaxmäßig ist, glaube ich, auch so ein interessantes Ding,

02:11:49.250 --> 02:11:53.810
<v Gast 1>dass Elixir keinen Assignment Operator hat.

02:11:54.770 --> 02:12:00.610
<v Gast 1>Also du hast zwar ein Ist-Gleichzeichen und wenn du das verwendest wie eine

02:12:00.610 --> 02:12:05.570
<v Gast 1>Variablenzuweisung, also du sagst es irgendwie A ist gleich B, sagen wir mal andersrum,

02:12:05.810 --> 02:12:07.010
<v Gast 1>A ist gleich 5.

02:12:08.690 --> 02:12:13.970
<v Gast 1>Ist es schon so, dass du dem, dass du dem Identifier A den Wert 5 zuweist?

02:12:14.210 --> 02:12:14.450
<v Gast 1>Ja.

02:12:15.970 --> 02:12:17.890
<v Gast 1>Aber das ist nicht das Ende der Geschichte.

02:12:18.450 --> 02:12:19.650
<v Felix>But wait, there's more.

02:12:20.210 --> 02:12:22.370
<v Gast 1>Das ist nämlich ein Match-Operator.

02:12:22.930 --> 02:12:28.210
<v Gast 1>Und was der versucht, ist zum Beispiel, wenn du jetzt in anderen Sprachen sowas machen würdest,

02:12:28.290 --> 02:12:33.410
<v Gast 1>wie zum Beispiel sagst, A ist gleich 5 und dann sagst du direkt in der Zeile drunter,

02:12:33.570 --> 02:12:34.850
<v Gast 1>5 ist gleich A.

02:12:36.370 --> 02:12:41.330
<v Gast 1>Das würde in anderen Sprachen einen Fehler werfen, weil du da versuchen würdest,

02:12:41.650 --> 02:12:45.890
<v Gast 1>dem feststehenden Wert 5 einen anderen Wert zuzuweisen.

02:12:47.170 --> 02:12:50.690
<v Gast 1>Im Fall von Elixir oder in Erlangen ist es, glaube ich, genauso.

02:12:51.010 --> 02:12:55.250
<v Gast 1>Da ist es keine Zuweisung, sondern ein Pattern Match und was der Pattern Match macht,

02:12:55.330 --> 02:13:01.410
<v Gast 1>ist, um das ganz einfach zu beschreiben, er versucht, die linke und die rechte Seite gleich zu machen.

02:13:02.530 --> 02:13:07.970
<v Gast 1>Das heißt, also das heißt, 5 ist gleich A wäre ein valides Statement.

02:13:08.210 --> 02:13:08.530
<v Gast 1>Okay.

02:13:09.170 --> 02:13:11.330
<v Gast 1>Wenn der Wert vorher auch 5 ist.

02:13:11.730 --> 02:13:13.410
<v Gast 1>Also wenn A den Wert 5 hat.

02:13:13.490 --> 02:13:15.650
<v Gast 1>Wenn es einen anderen Wert hat, gibt es einen Match-Error.

02:13:17.250 --> 02:13:23.410
<v Gast 1>Was man aber damit machen kann, ist, du kannst auf Strukturen, Struktur von Datenstrukturen matchen.

02:13:23.890 --> 02:13:30.850
<v Gast 1>Du kannst dir zum Beispiel sagen, ja, okay, du hast eine Map und keine

02:13:30.850 --> 02:13:37.730
<v Gast 1>Ahnung, du hast eine Map, die hat einen Key, Foo, und der hat den Wert 1 und du hast einen Key bar und

02:13:37.730 --> 02:13:38.930
<v Gast 1>der hat den Wert 2.

02:13:39.650 --> 02:13:43.810
<v Gast 1>Und dann kannst du aber auf der linken Seite vom Assignment Operator sagen,

02:13:44.370 --> 02:13:48.610
<v Gast 1>Map Foo mit dem Wert 1,

02:13:49.890 --> 02:13:52.850
<v Gast 1>Bar mit dem Wert Variablename.

02:13:53.490 --> 02:14:00.450
<v Gast 1>Und dann machst du ist gleich diese Map und dann wird quasi matchst du auf diese Struktur und damit die

02:14:00.450 --> 02:14:06.850
<v Gast 1>auf beiden Seiten gleich sind, wird quasi dem Wert von bar in dieser Map wird dann der

02:14:06.850 --> 02:14:09.250
<v Gast 1>Inhalt dieses.

02:14:10.370 --> 02:14:12.370
<v Felix>Du implementierst quasi zugewiesen.

02:14:12.610 --> 02:14:15.730
<v Felix>Du implementierst quasi Verhalten damit.

02:14:16.370 --> 02:14:19.650
<v Felix>Quasi sagst, das soll so sein, quasi.

02:14:19.970 --> 02:14:23.330
<v Felix>Du sagst, was die Wahrheit quasi ist.

02:14:23.570 --> 02:14:29.410
<v Felix>So ein bisschen wie ist das an der Promis, die man immer in der Schule hat

02:14:31.330 --> 02:14:32.290
<v Felix>oder in der Uni.

02:14:32.690 --> 02:14:33.330
<v Felix>Du meinst Prolog?

02:14:33.570 --> 02:14:38.130
<v Felix>Ja, genau, Prolog, wo du quasi sagst, okay, am Ende muss das quasi das sein.

02:14:38.610 --> 02:14:41.570
<v Gast 1>Ja, nicht sogar, also eher so auf einer Strubene.

02:14:41.730 --> 02:14:41.890
<v Gast 1>Okay.

02:14:42.450 --> 02:14:44.290
<v Gast 1>Du sagst halt auf einer Strubene.

02:14:44.610 --> 02:14:49.970
<v Gast 1>Ein bisschen einfacheres Beispiel ist zum Beispiel, du hast du hast eine Liste,

02:14:50.130 --> 02:14:53.970
<v Gast 1>da sind Werte drin und du kennst irgendwie, du möchtest sicherstellen,

02:14:54.290 --> 02:14:58.610
<v Gast 1>dass die ersten zwei Werte Fu und Bar sind und den letzten Wert, der interessiert dich.

02:14:58.850 --> 02:15:05.730
<v Gast 1>Dann sagst du auf der linken Seite halt, okay, hier Liste mit Fu und Bar und danach Variablename

02:15:05.810 --> 02:15:10.770
<v Gast 1>und der Pattern Match sorgt dann halt dafür, dass diese Variable richtig zugewiesen wird.

02:15:11.010 --> 02:15:11.330
<v Gast 1>Okay.

02:15:12.850 --> 02:15:19.570
<v Gast 1>Was daran auch interessant ist, das funktioniert nicht nur bei so einfachen

02:15:19.570 --> 02:15:22.770
<v Gast 1>Sachen wie Maps, sondern du kannst es bei Structs machen zum Beispiel.

02:15:22.850 --> 02:15:29.170
<v Gast 1>Also du kannst zum Beispiel sagen, ja okay, du bekommst eine HTTP-Response und reagierst und du möchtest

02:15:29.330 --> 02:15:33.090
<v Gast 1>Sachen zugewiesen bekommen, aber nur wenn der Status quo 200 ist.

02:15:36.290 --> 02:15:40.610
<v Gast 1>Und also ja genau, das sind so bei den Standarddatentypen funktioniert das.

02:15:40.770 --> 02:15:44.370
<v Gast 1>Und das Interessante dabei ist, du kannst es für Funktionsdefinitionen machen.

02:15:44.530 --> 02:15:49.250
<v Gast 1>Das heißt, du kannst eine Funktion mit dem gleichen Namen ganz oft implementieren,

02:15:51.170 --> 02:15:55.570
<v Gast 1>aber mit unterschiedlichen Pattern-Matches bei den Argumenten.

02:15:56.130 --> 02:15:56.450
<v Gast 1>Okay.

02:15:56.930 --> 02:16:02.850
<v Gast 1>Also du kannst jetzt zum Beispiel sagen, keine Ahnung, du hast sowas wie du hast einen HTTP-Client und der

02:16:02.850 --> 02:16:04.130
<v Gast 1>bekommt eine Response zurück.

02:16:05.250 --> 02:16:09.330
<v Gast 1>Und dann kannst du sagen, du definierst eine Funktion, Handle Response,

02:16:10.290 --> 02:16:13.650
<v Gast 1>und dann kannst du quasi anhand von dem Statuscode, den du bekommst,

02:16:13.970 --> 02:16:16.370
<v Gast 1>unterschiedliche Funktionsdefinitionen bekommen.

02:16:16.610 --> 02:16:20.850
<v Felix>Du überlegst die quasi, aber nicht nur quasi, dass du sagst,

02:16:20.930 --> 02:16:27.490
<v Felix>ein, zwei oder drei Argumente, sondern wenn Argument 1 200 ist oder wenn Argument 100 400 ist.

02:16:27.730 --> 02:16:27.890
<v Felix>Genau.

02:16:28.450 --> 02:16:31.090
<v Gast 1>Unter der Haube ist es mehr oder weniger halt so, dass diese ganze Magie,

02:16:31.170 --> 02:16:35.330
<v Gast 1>die er lang VM macht, und die baut er irgendwie einen Binärbaum draus und macht es ziemlich effizient,

02:16:35.410 --> 02:16:37.250
<v Gast 1>dass halt dieser Pattern Match funktioniert.

02:16:38.050 --> 02:16:44.850
<v Gast 1>Und was halt auch ziemlich cool ist, da gibt es zum Beispiel das Phoenix Webframework und benutzt

02:16:44.850 --> 02:16:50.290
<v Gast 1>Pattern Matching, also Makros mit Pattern Matching für das Routing.

02:16:50.610 --> 02:16:55.810
<v Gast 1>Also das heißt, die nehmen halt einfach die ganzen URLs und splitten die anhand von bestimmten Identifiern,

02:16:55.890 --> 02:16:58.930
<v Gast 1>also jetzt anhand von Slashes im Pfad zum Beispiel.

02:16:59.250 --> 02:17:05.330
<v Gast 1>Und in deiner Routendefinition hast du halt Makros, mit denen du quasi diese

02:17:06.290 --> 02:17:10.850
<v Gast 1>sagst, welcher Code aufgerufen werden soll, wenn bestimmte URLs aufgerufen werden.

02:17:11.250 --> 02:17:17.090
<v Gast 1>Und unter der Haube werden diese Makros dann nach Pattern-Match-Funktionen definiert.

02:17:17.410 --> 02:17:17.730
<v Gast 1>Okay.

02:17:17.970 --> 02:17:21.170
<v Gast 1>Und so ist es halt super schnell, weil das dann die komplette VM macht.

02:17:21.410 --> 02:17:21.650
<v Gast 1>Okay.

02:17:21.810 --> 02:17:26.610
<v Gast 1>Also, weil die VM dann, also du hast dann quasi eine Funktion mit, ich weiß jetzt nicht mehr, wie sie heißt.

02:17:26.690 --> 02:17:29.810
<v Gast 1>Also es gibt halt eine Funktion, die heißt irgendwie Handle Request oder sowas.

02:17:29.970 --> 02:17:33.010
<v Gast 1>Oder Route oder irgendwie, ich weiß nicht mehr, wie sie heißt.

02:17:33.890 --> 02:17:39.890
<v Gast 1>Jedenfalls gibt es halt eine Funktion, die hat irgendwie wahrscheinlich ein paar hundert Implementierungen und

02:17:39.890 --> 02:17:44.850
<v Gast 1>die VM ist dann quasi in der Lage, die richtige aufzurufen anhand von den Patterns,

02:17:44.930 --> 02:17:45.810
<v Gast 1>die sie so matcht.

02:17:46.130 --> 02:17:47.490
<v Felix>Magic Pattern Matching.

02:17:48.450 --> 02:17:52.690
<v Gast 1>Also das ist so ein Feature, wo man sich so ein bisschen mit beschäftigen muss,

02:17:52.770 --> 02:17:56.370
<v Gast 1>weil das ist so nicht so ganz einleuchtend.

02:17:56.450 --> 02:18:00.690
<v Gast 1>Ich weiß auch nicht, ob das so besonders toll ist, da jetzt Ewigkeiten im Podcast drüber zu reden oder ob sich

02:18:00.690 --> 02:18:02.130
<v Gast 1>die Hörer schon langweilen.

02:18:03.090 --> 02:18:05.170
<v Felix>Ich glaube, man muss das einfach mal irgendwie ausprobieren.

02:18:05.330 --> 02:18:07.650
<v Gast 1>Genau, oder mal den Code dazu sehen, weil letzten Endes.

02:18:07.890 --> 02:18:08.850
<v Felix>Genau, den Code dazu sehen.

02:18:10.050 --> 02:18:10.370
<v Felix>Ja.

02:18:10.690 --> 02:18:14.690
<v Gast 1>Und Pattern Matching ist halt auch bei so Sachen wie Arrowhandling und so ganz interessant,

02:18:14.770 --> 02:18:18.450
<v Gast 1>weil es ist so ganz viele APIs, die geben quasi ein Tupel zurück.

02:18:18.530 --> 02:18:21.250
<v Gast 1>Also ein Tupel sind einfach nur so eine Liste von Werten.

02:18:21.490 --> 02:18:26.050
<v Gast 1>Und der erste Wert ist quasi der Status und der zweite ist vielleicht deine Fehlermelde oder den Wert,

02:18:26.130 --> 02:18:27.410
<v Gast 1>den du eigentlich erwartest.

02:18:27.490 --> 02:18:32.610
<v Gast 1>Und wenn dann OK zurückkommt, dann kannst du halt sagen, ja okay, du hast eine Funktionsdefinition,

02:18:32.850 --> 02:18:35.010
<v Gast 1>wo dieser Wert okay ist.

02:18:35.250 --> 02:18:35.410
<v Gast 1>Ja.

02:18:36.130 --> 02:18:41.170
<v Gast 1>Und im anderen ist er vielleicht Error und dann machst du da halt in der zweiten Funktionsdefinition eine

02:18:41.170 --> 02:18:41.970
<v Gast 1>Fehlerbehandlung.

02:18:42.050 --> 02:18:45.490
<v Gast 1>Das heißt, deine Funktionen werden auch relativ übersichtlich, weil du sie einfach,

02:18:46.290 --> 02:18:51.330
<v Gast 1>also weißt du, man kennt das ja bei anderen Sprachen so, wenn dann so Funktionen mehrere hundert Zeilen lang

02:18:51.330 --> 02:18:55.250
<v Gast 1>sind, wo dann je nachdem, was du an Parametern übergibst, komplett.

02:18:55.730 --> 02:18:57.250
<v Felix>Verschiedene andere Sachen passieren.

02:18:57.730 --> 02:19:02.450
<v Gast 1>Und sowas hast du halt in dem Fall nicht, weil du einfach die Methoden mehrfach definieren kannst und die dann

02:19:02.450 --> 02:19:07.330
<v Gast 1>halt je nachdem aufgerufen werden, je nachdem, wie die Struktur ihrer Parameter aussieht.

02:19:07.490 --> 02:19:08.930
<v Felix>Ja, finde ich ja cool, muss ich sagen.

02:19:09.570 --> 02:19:12.530
<v Felix>Hört sich auf jeden Fall nach was an, was auf jeden Fall Sinn macht,

02:19:12.610 --> 02:19:18.610
<v Felix>weil dann, also du hast halt auf einmal total coole Möglichkeit zu sagen,

02:19:18.930 --> 02:19:21.650
<v Felix>zu reagieren auf bestimmte Eingabewerte.

02:19:21.890 --> 02:19:22.370
<v Felix>Genau.

02:19:22.770 --> 02:19:28.370
<v Gast 1>Und du hast halt vor allem auch so ziemlich coole Möglichkeiten, um keine Ahnung,

02:19:28.530 --> 02:19:30.930
<v Gast 1>Sachen zu machen, die es in anderen Programmiersprachen nicht gibt.

02:19:31.010 --> 02:19:34.210
<v Gast 1>Jetzt wie zum Beispiel diese Geschichte mit den URLs oder so, überall,

02:19:34.290 --> 02:19:40.210
<v Gast 1>wo du irgendwie was auf Struktur ankommt, kannst du halt mit so einem Pattern Match arbeiten.

02:19:40.370 --> 02:19:44.370
<v Gast 1>Was auch ziemlich cool ist, du kannst ein Pattern Match auf Binärdaten machen.

02:19:44.610 --> 02:19:48.450
<v Gast 1>Und du könntest dir jetzt quasi sagen, du hast irgendwie ein Binärformat,

02:19:49.070 --> 02:19:52.350
<v Gast 1>Und du weißt, wie lang bestimmte Felder da sind, dann kannst du halt sagen,

02:19:52.430 --> 02:19:59.390
<v Gast 1>okay, ich mache jetzt ein Pattern, ich habe auf der rechten Seite eine binäre Datenstruktur und auf der linken

02:19:59.390 --> 02:20:06.030
<v Gast 1>Seite sagt mir, weiß doch mal die ersten 8 Byte der Variable food zu und die nächsten 32 Byte der Variable

02:20:06.270 --> 02:20:06.910
<v Gast 1>Bar und so weiter.

02:20:06.990 --> 02:20:11.390
<v Gast 1>Und du kannst dann quasi strukturell auf Binärdaten matchen, ohne dass du irgendwie wild in der Gegend

02:20:11.390 --> 02:20:12.350
<v Gast 1>Bitshifting machen musst.

02:20:12.590 --> 02:20:13.390
<v Gast 1>Das ist cool.

02:20:14.030 --> 02:20:16.350
<v Felix>BitShifting sagt nämlich, keiner mag BitShifting.

02:20:16.590 --> 02:20:18.430
<v Gast 1>Ja, Bitshifting macht meinen Kopf kaputt.

02:20:18.590 --> 02:20:19.550
<v Felix>Ja, richtig.

02:20:20.430 --> 02:20:21.390
<v Gast 1>Was ist noch cool?

02:20:21.550 --> 02:20:22.910
<v Gast 1>Es gibt einen Pipe-Operator.

02:20:23.150 --> 02:20:24.030
<v Felix>Oh yeah, okay.

02:20:24.350 --> 02:20:26.990
<v Gast 1>Also und zwar wie Unix Pipes.

02:20:27.630 --> 02:20:33.470
<v Gast 1>Das funktioniert im Endeffekt so, du hast bestimmte Funktionen,

02:20:33.710 --> 02:20:37.630
<v Gast 1>die geben Dinge zurück.

02:20:37.790 --> 02:20:39.790
<v Gast 1>Oder sagen wir mal, du hast eine Collection.

02:20:40.110 --> 02:20:42.670
<v Gast 1>Eine Collection ist eine, sagen wir mal, du hast eine Liste.

02:20:43.390 --> 02:20:46.430
<v Gast 1>Und du iterierst über diese Liste drüber und dann kannst du das vielleicht sagen,

02:20:46.510 --> 02:20:50.350
<v Gast 1>ja, okay, du iterierst über diese Liste, du machst da eine Map-Operation,

02:20:50.830 --> 02:20:57.550
<v Gast 1>wo quasi auf jedes Element eine Funktion angewendet wird und dann wird da daraus eine neue Liste erstellt mit

02:20:57.550 --> 02:20:59.150
<v Gast 1>den neuen Werten.

02:21:00.110 --> 02:21:04.430
<v Gast 1>Und dann möchtest du die sortieren und dann möchtest du die irgendwie auf eine bestimmte Art und Weise

02:21:04.430 --> 02:21:04.830
<v Gast 1>filtern.

02:21:06.510 --> 02:21:11.310
<v Gast 1>Und es ist die Konvention, dass quasi Funktionen,

02:21:11.390 --> 02:21:16.030
<v Gast 1>die solche Dinge tun, dass die Datenstruktur,

02:21:16.910 --> 02:21:21.310
<v Gast 1>mit der sie diese Dinge tun, als ersten Parameter haben.

02:21:22.110 --> 02:21:22.430
<v Gast 1>Okay.

02:21:23.230 --> 02:21:28.110
<v Gast 1>Das heißt, du hast zum Beispiel sowas wie ein enam.map,

02:21:28.590 --> 02:21:34.910
<v Gast 1>was quasi auf ein Enumerable Objekt, also auf eine Ennumerable Datenstruktur eine

02:21:34.910 --> 02:21:37.630
<v Gast 1>Map-Operation ausführt.

02:21:38.190 --> 02:21:42.670
<v Gast 1>Und da übergibst du dann quasi deine Datenstruktur als ersten Parameter.

02:21:42.990 --> 02:21:43.310
<v Gast 1>Okay.

02:21:44.590 --> 02:21:50.350
<v Gast 1>Und für dieses ganze Ding ist quasi der Pipe-Operator jetzt eine syntaktische Syntax,

02:21:50.830 --> 02:21:55.870
<v Gast 1>syntaktischer Zucker, sodass du quasi sagen kannst, Liste,

02:21:56.110 --> 02:22:02.910
<v Gast 1>Pipe Operator inam.map und dann übergibst du nicht deine Liste als ersten

02:22:02.910 --> 02:22:08.510
<v Gast 1>Parameter, sondern nur eine Funktion, was damit gemacht wird, weil dieser Pipe Operator Syntaxmagie betreibt

02:22:08.510 --> 02:22:10.990
<v Gast 1>und es automatisch als ersten Parameter an das nächste.

02:22:11.390 --> 02:22:11.550
<v Gast 1>Okay.

02:22:11.790 --> 02:22:18.590
<v Felix>So was ähnliches gibt es auch bei Lua und zwar hast du normalerweise rufst du

02:22:18.590 --> 02:22:22.830
<v Felix>Variablen mit Punkt auf, quasi wenn die zu einem Objekt gehören.

02:22:23.470 --> 02:22:30.190
<v Felix>Und es gibt die Konvention, wenn du anstatt einen Punkt einen Doppelpunkt machst und es als

02:22:30.190 --> 02:22:34.750
<v Felix>Funktion aufrufst, dann ist der erste Parameter quasi Self, also das

02:22:37.550 --> 02:22:40.910
<v Felix>die Table selber, von der es aufgerufen wird.

02:22:41.070 --> 02:22:45.630
<v Felix>Und dann kannst du quasi solche Sachen machen, also dann hast du quasi wie Funktionen,

02:22:45.790 --> 02:22:50.270
<v Felix>die dann bei Python zum Beispiel immer Self als eigenen als ersten Parameter haben.

02:22:50.510 --> 02:22:54.270
<v Felix>Und das ist da auch genauso Syntaxtik-Sugar, aber das ist einer von den ganz wenigen Sachen,

02:22:54.350 --> 02:22:56.670
<v Felix>die Lua quasi zuckerig machen.

02:22:58.430 --> 02:23:03.070
<v Gast 1>Ja, wie gesagt, und dieser Pipe-Operator ist halt ganz cool, weil da geht es halt mehr oder weniger,

02:23:03.150 --> 02:23:06.830
<v Gast 1>also bei ganz vielen Programmen geht es halt um Datentransformation.

02:23:07.870 --> 02:23:12.030
<v Gast 1>Und so, das kannst du mit so einer Pipeline sehr gut modellieren, weil du siehst,

02:23:12.110 --> 02:23:16.350
<v Gast 1>okay, du hast jetzt diese Datenstruktur und die geht durch diesen Call und durch diesen Call und durch diesen

02:23:16.350 --> 02:23:20.830
<v Gast 1>Call, aber es ist nicht irgendwie Klammer auf, hier Methoden,

02:23:21.470 --> 02:23:24.910
<v Gast 1>hier Funktionsaufruf, nochmal Klammer auf, nächster Funktionsaufruf,

02:23:24.990 --> 02:23:26.670
<v Gast 1>nochmal, also und so weiter.

02:23:26.990 --> 02:23:33.630
<v Gast 1>Sondern es ist halt recht schön, so hier Pipe, pipe das mal in diese Funktion rein und das Ergebnis in diese

02:23:33.630 --> 02:23:34.270
<v Gast 1>Funktion und so.

02:23:34.430 --> 02:23:40.590
<v Felix>Ja, das ist, also speziell dieses Verhalten kann man noch relativ gut sehen bei

02:23:42.750 --> 02:23:47.070
<v Felix>PowerShell, weil die haben nämlich auch Pipes, aber mit Objekten.

02:23:47.150 --> 02:23:48.590
<v Felix>Und das ist eigentlich ziemlich cool.

02:23:48.750 --> 02:23:52.430
<v Felix>Also wenn man sich das so anschaut und ein bisschen benutzt, dann ist es, das macht was her.

02:23:52.510 --> 02:23:56.590
<v Felix>Also es ist schon noch ein Stück cooler, als wenn du quasi Standard Input,

02:23:56.750 --> 02:23:59.550
<v Felix>Standard Output selber wieder verkrepen musst, jedes Mal.

02:24:00.830 --> 02:24:01.790
<v Gast 1>Ja, das ist auf jeden Fall cool.

02:24:01.870 --> 02:24:05.630
<v Gast 1>Also man kann diesen Pipe-Operator, also das ist auch kein, nicht nur ein Pipe-Zeichen,

02:24:05.710 --> 02:24:07.470
<v Gast 1>sondern das ist Pipe-Größer-Zeichen.

02:24:09.070 --> 02:24:12.350
<v Gast 1>Weil Pipe ist ein Pattern-Match-Operator für Listen.

02:24:12.830 --> 02:24:14.270
<v Felix>Oh, schon verbraucht, quasi.

02:24:14.510 --> 02:24:15.470
<v Unbekannt>Schon verbraucht, ja.

02:24:18.430 --> 02:24:22.110
<v Gast 1>Genau, und im Endeffekt ist es halt dasselbe wie bei einer Unix-Pipe,

02:24:22.190 --> 02:24:27.390
<v Gast 1>nur dass du im Gegensatz zu, du nimmst jetzt irgendwas auf Standard IN entgegen und gibst das nach Standard

02:24:27.470 --> 02:24:34.270
<v Gast 1>Out wieder aus, ist es halt, du übergibst etwas an eine Funktion und das Ergebnis gibst du dann wieder an die

02:24:34.270 --> 02:24:35.230
<v Gast 1>nächste weiter.

02:24:35.550 --> 02:24:37.150
<v Felix>Ja, ist cool.

02:24:37.790 --> 02:24:38.190
<v Felix>Auf jeden Fall.

02:24:38.430 --> 02:24:39.870
<v Gast 1>Ja, was ist sonst noch cool?

02:24:40.190 --> 02:24:44.830
<v Gast 1>Es gibt ein ziemlich cooles Bild- und Automationstool, das nennt sich Mix.

02:24:45.150 --> 02:24:45.630
<v Gast 1>Ui ja.

02:24:45.710 --> 02:24:49.470
<v Felix>Das habe ich auch schon irgendwie in ein paar Projekten gesehen, wo ich hier durchgescrollt habe quasi.

02:24:49.710 --> 02:24:50.190
<v Felix>Tatsächlich.

02:24:50.350 --> 02:24:52.990
<v Felix>Ja, also die sagen immer Mix, d-d-d- und da.

02:24:53.470 --> 02:24:54.430
<v Unbekannt>Ja, genau.

02:24:54.750 --> 02:25:01.710
<v Gast 1>Und Mix ist quasi auch so, du kannst da halt für Mix unterkommandos definieren und dann

02:25:01.710 --> 02:25:05.790
<v Gast 1>hast du quasi jetzt hier dein Projekt und hast dann irgendwie ein Webframework und wenn du das Web-Framework

02:25:05.790 --> 02:25:11.230
<v Gast 1>in dein Projekt integrierst, dann hast du die Mix-Tasks von diesem Webframework mit drin und kannst damit zum

02:25:11.230 --> 02:25:12.910
<v Gast 1>Beispiel deinen Webserver starten oder so.

02:25:13.390 --> 02:25:18.910
<v Gast 1>Und zum Beispiel, also Elixir hat Hex, das ist der Paketmanager.

02:25:19.070 --> 02:25:19.390
<v Gast 1>Okay.

02:25:20.190 --> 02:25:26.270
<v Gast 1>Und Hex definiert quasi standardmäßig auch schon seine Mix-Tasks, sodass du über Mixed quasi deine ganzen

02:25:26.270 --> 02:25:27.950
<v Gast 1>Dependencies verwalten kannst.

02:25:28.190 --> 02:25:28.830
<v Gast 1>Okay, cool.

02:25:28.990 --> 02:25:32.510
<v Gast 1>Und in einem Mix-File, da definierst du halt nicht nur so deine Projektstrukturen und sowas,

02:25:32.590 --> 02:25:39.150
<v Gast 1>sondern auch deine Dependencies und die können dann halt quasi auch da über Mix dann verwaltet und

02:25:39.150 --> 02:25:39.870
<v Gast 1>installiert werden.

02:25:39.950 --> 02:25:43.310
<v Gast 1>Und es gibt, glaube ich, dann auch Tools, womit du dann Deployment und sowas machen kannst.

02:25:43.550 --> 02:25:50.190
<v Gast 1>Also Mix ist so ein bisschen erweiterbares Build-Tool

02:25:50.510 --> 02:25:56.350
<v Gast 1>inklusive, das kann deine Tests ausführen, das ist halt, das kann irgendwie Web-Server starten,

02:25:56.430 --> 02:26:01.310
<v Gast 1>das kann deine Dependencies verwalten, aber halt, es implementiert dieses Verhalten nicht alles selber,

02:26:01.390 --> 02:26:05.150
<v Gast 1>sondern es implementiert halt eine API, über die du Tasks definieren kannst und diese Tasks,

02:26:05.230 --> 02:26:06.910
<v Gast 1>die machen dann mehr oder weniger das Richtige.

02:26:07.150 --> 02:26:10.270
<v Felix>Das ist quasi wie Make, oder?

02:26:11.230 --> 02:26:12.270
<v Gast 1>So in der Art.

02:26:12.590 --> 02:26:17.150
<v Felix>Und Python heißt es, gibt es noch, wie heißt das, Scons?

02:26:17.470 --> 02:26:18.670
<v Felix>Scons heißt es.

02:26:19.390 --> 02:26:23.470
<v Felix>Und in Ruby ist es Rake, oder?

02:26:23.630 --> 02:26:24.830
<v Felix>Es sind einfach nur Rake-Files.

02:26:25.630 --> 02:26:28.510
<v Gast 1>Ja, also in Ruby ist es so ein bisschen sowas wie Rake in der Art, ja.

02:26:28.750 --> 02:26:28.910
<v Gast 1>Genau.

02:26:28.990 --> 02:26:31.790
<v Felix>Und dann, ja, dann passt ja wieder alles zusammen.

02:26:32.270 --> 02:26:39.070
<v Gast 1>Genau, aber halt auch sowas wie Rake mit der Funktionalität von Bundler und von Ruby Gems zusammen,

02:26:39.310 --> 02:26:46.030
<v Gast 1>weil, also du tust, du hast ja, du tust ja in Ruby nicht über Rake deine Dependencies managen zum Beispiel.

02:26:47.470 --> 02:26:48.430
<v Gast 1>Könntest du tatsächlich machen.

02:26:48.510 --> 02:26:54.590
<v Gast 1>Du könntest es Rake-Tasks definieren, die standardmäßig dann deine Dependencies irgendwie runterladen,

02:26:54.750 --> 02:26:57.630
<v Gast 1>installieren, macht aus irgendwelchen Gründen keiner.

02:26:57.710 --> 02:27:02.190
<v Gast 1>Und da ist es halt schon so von Haus aus mit integriert und das finde ich irgendwie ganz nett.

02:27:02.670 --> 02:27:04.110
<v Felix>Ja, ist cool auf jeden Fall.

02:27:04.590 --> 02:27:05.710
<v Gast 1>Was ist noch ganz cool?

02:27:05.950 --> 02:27:12.910
<v Gast 1>Es gibt ein Dokumentationssystem, wo du halt zum Beispiel auch Beispielcode in Dokumentation

02:27:13.150 --> 02:27:14.350
<v Gast 1>evaluieren kannst.

02:27:14.590 --> 02:27:15.310
<v Gast 1>Das finde ich super.

02:27:15.470 --> 02:27:19.470
<v Gast 1>Also du kannst quasi, du kannst quasi gucken, du kannst quasi ein Kommando,

02:27:19.710 --> 02:27:26.030
<v Gast 1>ein Kommandozeilen, ein Tool laufen lassen, was checkt, dass dein Beispielcode in deiner Programmdokumentation

02:27:26.030 --> 02:27:26.910
<v Gast 1>keine Fehler wirft.

02:27:27.230 --> 02:27:28.750
<v Felix>Das ist, finde ich, cool.

02:27:30.990 --> 02:27:37.710
<v Gast 1>Es ist X-Unit mit dabei, was so ein Unit-Testing-Framework ist.

02:27:38.110 --> 02:27:42.910
<v Gast 1>Was irgendwie auch ganz nett ist, das benutzt dann sowas wie, es benutzt dann ein Assert-Makro,

02:27:43.070 --> 02:27:45.870
<v Gast 1>wo du einfach nur Bedingungen hinterhergibst.

02:27:46.030 --> 02:27:50.030
<v Gast 1>Also du kannst einfach sagen, Assert A ist gleich B.

02:27:50.350 --> 02:27:54.830
<v Gast 1>Und dann kann der dir sogar sagen, was du denn erwartet hast und was nicht.

02:27:55.150 --> 02:27:57.550
<v Gast 1>Und also ist halt nicht viel Magie.

02:27:58.910 --> 02:28:02.350
<v Gast 1>Also es sieht nach nicht viel Magie aus, aber der kann dir dann halt,

02:28:02.670 --> 02:28:08.190
<v Gast 1>dadurch, dass der sich quasi in den Abstrakt-Syntax-Tree mit diesem Assert-Makro reinhängen kann,

02:28:08.350 --> 02:28:12.590
<v Gast 1>kann der dann halt relativ genau sagen, was für Bedingungen du erwartet hast,

02:28:12.670 --> 02:28:18.190
<v Gast 1>obwohl du eigentlich nur in anderen Sprachen, wenn du A ist gleich ist gleich B machst,

02:28:18.430 --> 02:28:23.630
<v Gast 1>dann wirft er entweder ein Assertion-Error oder halt er läuft durch,

02:28:23.710 --> 02:28:26.750
<v Gast 1>aber er sagt dir halt bei dem Error nicht, was du erwartet hättest.

02:28:26.910 --> 02:28:30.430
<v Felix>Ja, außer du hast halt ein Bonus-Assert, was du das dann bist.

02:28:30.590 --> 02:28:32.510
<v Gast 1>Genau, das ist im Endeffekt das Bonus-Assert.

02:28:32.590 --> 02:28:33.390
<v Gast 1>Okay, cool.

02:28:33.710 --> 02:28:34.750
<v Felix>Nächste gute Sache.

02:28:37.150 --> 02:28:42.430
<v Gast 1>Tja, ansonsten, wenn du jetzt keine Fragen mehr hast, also ich habe irgendwie vor,

02:28:42.590 --> 02:28:47.230
<v Gast 1>dieses Projekt jetzt mal für Webgeschichten zu benutzen, oder diese Programmiersprache,

02:28:47.310 --> 02:28:49.390
<v Gast 1>dieses Ökosystem für Webgeschichten zu benutzen.

02:28:49.550 --> 02:28:52.910
<v Felix>Okay, du musst Minigewitte neu bauen.

02:28:54.190 --> 02:28:55.230
<v Unbekannt>Es hilft nichts.

02:28:55.630 --> 02:28:59.310
<v Felix>Ich werde ständig angehubelt, dass es kaputt geht und es kann ja wohl nicht sein, ja.

02:28:59.950 --> 02:29:03.390
<v Ingo>Wir erinnern uns, es zeigt einfach Bilder aus dem Internet.

02:29:04.430 --> 02:29:05.790
<v Felix>Und es funktioniert sogar gerade.

02:29:05.870 --> 02:29:07.390
<v Felix>Es ist super, super langsam.

02:29:07.550 --> 02:29:10.030
<v Felix>Aber das liegt nicht an mir, das liegt an meinem Provider.

02:29:10.190 --> 02:29:11.390
<v Felix>Dafür kann ich nichts.

02:29:11.550 --> 02:29:15.070
<v Felix>Also, jedenfalls, du musstest neu bauen, weil dann hast du quasi echt was zu tun.

02:29:15.230 --> 02:29:15.870
<v Felix>Auf jeden Fall.

02:29:16.430 --> 02:29:19.390
<v Gast 1>Ich hatte jetzt mal vor, also mein Blog ist irgendwie seit, was weiß ich,

02:29:19.550 --> 02:29:23.550
<v Gast 1>seit einem Jahr oder so oder seit einem halben Jahr oder so irgendwie offline,

02:29:23.630 --> 02:29:26.750
<v Gast 1>weil ich irgendwie schon lange irgendwie, ich habe dann gedacht, ja,

02:29:26.830 --> 02:29:30.430
<v Gast 1>okay, ich benutze einen Static Side Generator oder ich benutze irgendwie so Dinge,

02:29:30.510 --> 02:29:32.510
<v Gast 1>die ich mal in Ruby gebaut habe oder sowas.

02:29:32.590 --> 02:29:36.190
<v Gast 1>Und ich bin jetzt der Hoffnung, dass ich mal sage, okay, ich implementiere mir mal ein ganz,

02:29:36.270 --> 02:29:40.910
<v Gast 1>ganz simples Blogging-System, um mal ein bisschen mit der Sprache klar zu kommen.

02:29:41.310 --> 02:29:46.350
<v Gast 1>Das ist so ein Problem, was ich schon öfters mal gelöst habe, deswegen weiß ich ungefähr, was ich so tun soll.

02:29:47.150 --> 02:29:53.230
<v Gast 1>Und dann kann ich halt mal da ein bisschen mit vertraut werden und ich habe halt noch so irgendwie so ein

02:29:53.230 --> 02:29:56.270
<v Gast 1>anderes Projekt im Hinterkopf, was ich irgendwann mal implementieren möchte.

02:29:56.910 --> 02:29:58.430
<v Felix>Ja, ein Mediengewitter nämlich.

02:29:59.710 --> 02:30:03.870
<v Gast 1>Ja, das ist tatsächlich, nee, tatsächlich, also für sowas ist halt Elixir auch super geeignet.

02:30:04.030 --> 02:30:04.590
<v Gast 1>Ja, perfekt!

02:30:05.070 --> 02:30:06.430
<v Felix>Oh, nicht schlecht!

02:30:06.830 --> 02:30:12.190
<v Gast 1>Also das Standard-Frame, also das Go-To-Web-Framework für Elixir Phoenix,

02:30:12.830 --> 02:30:19.070
<v Gast 1>das hat schon so komplett mehr oder weniger Support für

02:30:19.070 --> 02:30:25.470
<v Gast 1>Websockets und für so langlaufende, langlaufende Prozesse und sonst was ist halt mehr oder weniger schon

02:30:25.470 --> 02:30:30.030
<v Gast 1>eingebaut, weil es mit dem Ector Model halt ziemlich einfach ist, diese ganzen vielen Verbindungen alle zu

02:30:30.030 --> 02:30:30.350
<v Gast 1>handeln.

02:30:31.790 --> 02:30:32.670
<v Felix>Gute Sache.

02:30:32.910 --> 02:30:35.070
<v Gast 1>Was gibt es sonst noch, was man es irgendwie sagen könnte?

02:30:35.230 --> 02:30:41.550
<v Gast 1>Ecto ist so die Go-To-Datenbank-Mapping-Library.

02:30:41.710 --> 02:30:44.430
<v Felix>Oh oh, Go-To, GoTo sind böse, haben wir doch gelesen.

02:30:46.910 --> 02:30:48.510
<v Felix>Kein Go-To benutzen.

02:30:48.990 --> 02:30:49.710
<v Felix>Kein Go-To.

02:30:50.270 --> 02:30:54.750
<v Gast 1>Nee, das ist halt, also es ist kein ORM, weil es ist halt keine objektorientierte Sprache.

02:30:54.990 --> 02:30:59.070
<v Felix>Aber es macht dir quasi so, dass du diese ganzen Datenbanken leicht benutzen kannst.

02:30:59.310 --> 02:31:05.070
<v Gast 1>Genau, also du hast Postgres, MySQL und Microsoft SQL.

02:31:05.710 --> 02:31:07.310
<v Felix>Und Oracle, SQL auch?

02:31:07.550 --> 02:31:07.870
<v Felix>Nee.

02:31:08.510 --> 02:31:09.310
<v Felix>Also habe ich jedenfalls.

02:31:10.110 --> 02:31:12.030
<v Gast 1>Gibt es vielleicht irgendwelche Adapter, die man mal bauen kann?

02:31:12.110 --> 02:31:14.990
<v Gast 1>Ich habe auch noch keine Adapter für SQL Lite gefunden.

02:31:15.550 --> 02:31:16.430
<v Felix>Das ist blöd.

02:31:16.990 --> 02:31:20.030
<v Gast 1>Aber wird es früher oder später geben.

02:31:20.110 --> 02:31:24.190
<v Gast 1>Also man muss auch dazu sagen, der Grund, warum jetzt zum Beispiel der Ingo oder ich weiß nicht du vielleicht

02:31:24.190 --> 02:31:27.550
<v Gast 1>auch noch nichts von der Sprache gehört habt, ist, dass sie noch sehr jung ist.

02:31:27.710 --> 02:31:30.190
<v Gast 1>Also die gibt es, glaube ich, erst seit ein paar Jahren.

02:31:31.070 --> 02:31:32.510
<v Ingo>Das ist schon nicht schlimm.

02:31:33.070 --> 02:31:39.790
<v Gast 1>Nee, aber das bedeutet halt, also auf der einen Seite, man kann in der Community und im

02:31:39.790 --> 02:31:44.990
<v Gast 1>Ökosystem noch was reißen, weil viele Probleme noch vielleicht ungelöst sind oder man es vielleicht irgendwie

02:31:44.990 --> 02:31:45.630
<v Gast 1>besser lösen könnte.

02:31:46.830 --> 02:31:50.590
<v Felix>Und jetzt kommt das Problem, man muss viele Probleme noch reißen.

02:31:52.270 --> 02:31:52.910
<v Felix>Shit.

02:31:53.390 --> 02:32:00.350
<v Gast 1>Also ja, der Vorteil ist, man setzt halt auf eine über 20 Jahre alte Infrastruktur

02:32:00.350 --> 02:32:01.870
<v Gast 1>aus Erlangen zurück.

02:32:02.750 --> 02:32:03.070
<v Gast 1>Auf.

02:32:03.470 --> 02:32:04.510
<v Gast 1>Auf, so rum.

02:32:04.670 --> 02:32:06.030
<v Gast 1>Ich kann kein Deutsch mehr.

02:32:08.990 --> 02:32:13.310
<v Gast 1>Aber die Sachen, die jetzt in Elixir selbst so implementiert sind,

02:32:13.390 --> 02:32:16.350
<v Gast 1>die sind dann halt alle dementsprechend noch relativ jung.

02:32:16.510 --> 02:32:21.550
<v Gast 1>Auf der anderen Seite findet da vielleicht irgendwie Innovation statt und das ist das neue heiße Ding.

02:32:21.710 --> 02:32:22.270
<v Gast 1>Oh yes.

02:32:22.910 --> 02:32:27.630
<v Gast 1>Ich gucke mir das jetzt auf jeden Fall mal an und werde da irgendwie ein bisschen mit arbeiten und schau mal.

02:32:29.230 --> 02:32:30.830
<v Felix>Ja, coole Sache auf jeden Fall.

02:32:31.470 --> 02:32:32.670
<v Gast 1>Habe ich irgendwas vergessen?

02:32:32.750 --> 02:32:39.630
<v Gast 1>Also es gibt, was ziemlich cool ist, diesen Getting Started Guide und dann gibt es nochmal den

02:32:39.630 --> 02:32:41.630
<v Gast 1>Mix und OTP-Guide.

02:32:42.350 --> 02:32:46.190
<v Gast 1>Da baust du dann quasi in diesem Tutorial, wenn du das nachprogrammierst,

02:32:46.430 --> 02:32:53.390
<v Gast 1>eine Datenbank, also so ein Key-Value-Store mit Wire-Protokoll und TCP-Server und sonst was.

02:32:54.510 --> 02:32:57.790
<v Gast 1>Ist so ganz nett, kann man mal, also ich bin jetzt noch nicht ganz durch,

02:32:57.870 --> 02:33:00.110
<v Gast 1>aber ich bin jetzt so irgendwie ungefähr in der Mitte.

02:33:00.910 --> 02:33:06.270
<v Gast 1>Ist auf jeden Fall mal so ein Guide, den man durchmachen kann, wenn man mal so ein bisschen wissen will,

02:33:06.350 --> 02:33:09.390
<v Gast 1>wie man so im realen Leben Dinge in dieser Sprache implementiert.

02:33:09.470 --> 02:33:13.870
<v Gast 1>Was auch ganz cool ist, die erklären ist so inklusive, du schreibst jetzt hier mal einen Test und dann

02:33:13.870 --> 02:33:15.950
<v Gast 1>implementierst du mal dein Modul und so.

02:33:16.190 --> 02:33:17.070
<v Unbekannt>Ja, cool.

02:33:18.270 --> 02:33:19.870
<v Gast 1>Das kann man auf jeden Fall mal angucken.

02:33:19.950 --> 02:33:25.230
<v Gast 1>Ansonsten gibt es noch einen Metaprogramming Guide auf der Webseite und der Getting Started Guide,

02:33:25.310 --> 02:33:26.190
<v Gast 1>der ist eh super.

02:33:27.470 --> 02:33:34.430
<v Gast 1>Und Programming Elixir von den Pragmatic Programmern habe ich mir mal als E-Book

02:33:34.430 --> 02:33:34.990
<v Gast 1>gekauft.

02:33:35.630 --> 02:33:40.910
<v Gast 1>Ist von Dave Thomas geschrieben, der auch das ursprüngliche Ruby-Buch,

02:33:41.070 --> 02:33:44.510
<v Gast 1>was so mehr oder weniger so Ruby in der westlichen Welt bekannt gemacht hat,

02:33:44.670 --> 02:33:45.230
<v Gast 1>geschrieben hat.

02:33:45.390 --> 02:33:46.270
<v Felix>Oh yes.

02:33:46.590 --> 02:33:51.390
<v Gast 1>Und der ist jetzt irgendwie seit Neustem irgendwie total auf Elixier und findet es toll.

02:33:52.430 --> 02:33:53.230
<v Gast 1>Das muss gut sein.

02:33:53.950 --> 02:33:56.030
<v Ingo>Es klingt aber auch komisch, ich bin auf Elixier.

02:33:58.510 --> 02:34:02.030
<v Felix>Der neue heiße Scheiß, macht mich wirklich krass.

02:34:02.270 --> 02:34:03.230
<v Felix>Und dann bin ich so.

02:34:05.070 --> 02:34:08.750
<v Felix>Und dann bin ich dann bin ich total aufgehypt, dann muss ich irgendwelche Dinge tun, die ganze Zeit.

02:34:09.070 --> 02:34:12.030
<v Gast 1>Genau, mit der, wie war es, Techno Psycho Pitch?

02:34:13.470 --> 02:34:14.110
<v Gast 1>Outlaw!

02:34:14.350 --> 02:34:16.030
<v Felix>Outlaw Techno Psycho Pitch.

02:34:16.270 --> 02:34:19.790
<v Gast 1>Ja, genau, du kannst einfach in eine Runde Elixir saufen und dann mit der Outlaw-Techno.

02:34:20.270 --> 02:34:21.390
<v Felix>Psychobitch ausrasten.

02:34:21.550 --> 02:34:22.590
<v Felix>Einfach mal ausrasten, ja.

02:34:22.990 --> 02:34:24.430
<v Felix>So hart ausrasten.

02:34:25.550 --> 02:34:28.750
<v Gast 1>Also ich habe noch einen Haufen Blogposts hier verlinkt, zum Beispiel irgendwie,

02:34:28.910 --> 02:34:35.870
<v Gast 1>wie man mit den Konstrukten in Elixir so die Go-Channels nachimplementiert

02:34:36.510 --> 02:34:38.350
<v Gast 1>und irgendwelche YouTube-Videos und so.

02:34:38.430 --> 02:34:44.590
<v Gast 1>Ich habe da mal ein bisschen über die letzten paar Wochen Zeug gesammelt, was man mal irgendwie angucken kann.

02:34:45.070 --> 02:34:47.870
<v Felix>Hast du auch EXI in 15 Minuten?

02:34:48.830 --> 02:34:52.910
<v Felix>Ansonsten musst du es machen, weil ich finde diese Webseite echt geil und ich möchte es eigentlich für alle

02:34:52.910 --> 02:34:55.230
<v Felix>Programmiersprachen haben, weil das ist so cool einfach.

02:34:55.470 --> 02:34:57.230
<v Gast 1>Ich weiß halt nicht, ob man das in 15 Minuten schafft.

02:34:57.630 --> 02:35:01.710
<v Felix>Ja, dann machst du es halt in 50 Minuten oder so.

02:35:02.030 --> 02:35:02.990
<v Ingo>Nee, das ist so lang.

02:35:03.310 --> 02:35:07.710
<v Gast 1>Nee, aber in 30 Minuten habe ich ein Video verlinkt, Introduction to Elixir.

02:35:08.190 --> 02:35:12.830
<v Gast 1>Das ist ein YouTube-Video, was so, das geht relativ genau 35 Minuten.

02:35:13.070 --> 02:35:14.030
<v Unbekannt>Ist das gut genug?

02:35:14.350 --> 02:35:19.550
<v Gast 1>Und dann werden dann mal so Features gezeigt und somit ich tippe jetzt in der Konsole und Dinge passieren.

02:35:19.710 --> 02:35:19.950
<v Gast 1>Okay.

02:35:20.270 --> 02:35:22.830
<v Felix>Also ich hätte es auch gern, also ich finde das ja echt geil.

02:35:23.070 --> 02:35:28.430
<v Felix>Ich stehe ja immer auf dieses Ganze so, okay, du hast irgendwie Source-Code und dann stehen da zwei Kommentare

02:35:28.430 --> 02:35:30.670
<v Felix>dazu und das reicht ja meistens auch schon, ja.

02:35:31.870 --> 02:35:33.790
<v Ingo>Zumindest für die Leute, die programmieren können, ja.

02:35:34.030 --> 02:35:35.390
<v Felix>Für die Leute, die programmieren können, ja.

02:35:35.550 --> 02:35:40.670
<v Felix>Und wenn die, wenn die Sachen nicht ganz zu abgefahren sind oder ganz zu irgendwie,

02:35:41.070 --> 02:35:44.750
<v Felix>ja, also ja, man muss halt immer schauen, ob es funktionieren kann,

02:35:44.910 --> 02:35:51.310
<v Felix>weil wenn du bestimmte Konstrukte erst erklären musst, quasi, so was ist ein Actormodel oder was ist

02:35:52.030 --> 02:35:56.110
<v Felix>diese ganzen anderen krassen Sachen, dann wird es halt schwierig, das in 15 Minuten zu machen,

02:35:56.270 --> 02:36:01.470
<v Felix>aber ja, also Lua hat sich da wahrscheinlich einfach auch angeboten als 15 Minuten,

02:36:01.550 --> 02:36:04.430
<v Felix>weil du hast halt wirklich so ein paar Sachen, die sehen ein bisschen anders aus als in anderen

02:36:04.590 --> 02:36:08.590
<v Felix>Programmiersprachen, aber so die Grundidee, die Grundideen kennt man dann doch schon.

02:36:08.910 --> 02:36:14.510
<v Gast 1>Ich habe tatsächlich auch noch einen Artikel, der mal beschreibt, wie man so eine einfache CRUD,

02:36:14.670 --> 02:36:19.630
<v Gast 1>also Create, Read, Update, Delete-Anwendung in Phoenix baut.

02:36:19.870 --> 02:36:24.270
<v Gast 1>Und das ist schon, den Artikel kann man, glaube ich, schon mal in 15 Minuten runterlesen,

02:36:24.510 --> 02:36:31.470
<v Gast 1>wenn man schon mal mit irgendwie Webframeworks gearbeitet hat und vielleicht ein bisschen mit der

02:36:31.470 --> 02:36:33.630
<v Gast 1>Syntax von Elixir vertraut ist.

02:36:34.030 --> 02:36:40.350
<v Gast 1>Und überhaupt, das ist ein Blogpost, der auf der Domain gogoGarrett.sexi läuft.

02:36:40.590 --> 02:36:42.110
<v Felix>Oh yeah, GoGoGarrett.sexi.

02:36:42.510 --> 02:36:43.390
<v Gast 1>Das muss es einfach gut sein.

02:36:44.030 --> 02:36:48.030
<v Gast 1>Ich finde es total toll, wenn Leute ihre Blogs auf der Sexi hosten.

02:36:48.350 --> 02:36:49.390
<v Felix>Oh yeah.

02:36:51.070 --> 02:36:53.870
<v Gast 1>Ja, ich weiß nicht, ansonsten gibt es noch irgendwelche Fragen.

02:36:54.190 --> 02:36:56.750
<v Gast 1>Ich glaube, wir haben uns mittlerweile so halbwegs tot gequatscht.

02:36:56.830 --> 02:36:57.950
<v Felix>Ja, ich glaube, wir sind gut durch.

02:36:58.270 --> 02:37:04.990
<v Felix>Ich habe noch diese ganzen Sachen zu dem Mikrocontroller von Lua auf dem Mikrocontroller verlinkt.

02:37:05.310 --> 02:37:09.630
<v Felix>Es gibt eine Sache, die man auf jeden Fall ansprechen muss, wenn man einfach,

02:37:09.790 --> 02:37:15.950
<v Felix>also, man sehe ich nicht um diesen ganzen, so, oh, du brauchst irgendwie 3,3 Volt und brauchst ein USB-Seriell

02:37:15.950 --> 02:37:18.110
<v Felix>und so diese ganzen Dinge kümmern will.

02:37:18.190 --> 02:37:23.310
<v Felix>Dann gibt es ein Node-MCU-Devboard, wo dieser ganze Krempel alles drauf ist.

02:37:23.390 --> 02:37:29.390
<v Felix>Dann hast du da, du hast einen seriellen Adapter und dann machst du bloß einmal Micro USB ran und dann kannst

02:37:29.390 --> 02:37:30.670
<v Felix>du es quasi direkt hernehmen.

02:37:30.750 --> 02:37:35.950
<v Felix>Und das ist eigentlich das, was man hernehmen will für alles einfach mal ausprobieren, weil es cool ist.

02:37:36.350 --> 02:37:37.230
<v Gast 1>Was macht es dieses Ding?

02:37:37.310 --> 02:37:38.750
<v Gast 1>Also du gibst dem irgendwie Strom über die USB.

02:37:38.830 --> 02:37:41.070
<v Felix>Du gibst ihm einfach nur Strom über USB und dann ist es fertig.

02:37:41.150 --> 02:37:46.750
<v Felix>Und dann kommt da eine seri Konsole hoch und dann ist dieses ganze schon fertig.

02:37:46.990 --> 02:37:52.750
<v Felix>Genau, diese ganzen Pins, diese, du musst halt bei dem normalen ESP musst du noch achten,

02:37:52.910 --> 02:37:55.150
<v Felix>dass du 3,3 Volt hast.

02:37:55.390 --> 02:37:58.670
<v Gast 1>Oder musst du dann irgendwie da noch Widerstände davor löten und so, dass du auf die Karte hast.

02:37:58.830 --> 02:38:01.230
<v Felix>Genau, oder du musst musstest halt davor stecken.

02:38:01.310 --> 02:38:05.630
<v Felix>Also normalerweise machst du das dann quasi über einen Stepdown oder über so ein

02:38:09.470 --> 02:38:14.910
<v Felix>über andere elektronische Bauteile, die man dann davor noch braucht und das wird sie eigentlich nicht,

02:38:14.990 --> 02:38:19.710
<v Felix>sondern du willst einfach nur anstecken und dann ein bisschen Spaß haben und dafür kann man das Devboard dann

02:38:19.710 --> 02:38:20.190
<v Felix>hernehmen.

02:38:20.430 --> 02:38:26.830
<v Gast 1>Und das Devboard macht dann quasi, du kannst dann beliebige Dinge an irgendwelche Pins anklemmen und es macht

02:38:26.830 --> 02:38:31.550
<v Gast 1>dann, dass auf dem Mikrocontroller die richtige Spannung und so ankommt.

02:38:31.790 --> 02:38:32.190
<v Gast 1>Genau.

02:38:32.430 --> 02:38:32.750
<v Gast 1>Okay.

02:38:33.070 --> 02:38:39.710
<v Felix>Also die Data Pins können

02:38:40.030 --> 02:38:44.750
<v Felix>wohl nur 3,3 Volt Pegel ab,

02:38:45.230 --> 02:38:49.550
<v Felix>aber das alle anderen Dinge, die man da normalerweise ansteckt,

02:38:49.790 --> 02:38:51.070
<v Felix>die machen das auch nicht anders.

02:38:51.150 --> 02:38:58.110
<v Felix>Also zum Beispiel, wenn du USB-Seriell anschließt, dann haben eigentlich alle USB-Seriell

02:38:59.550 --> 02:39:03.630
<v Felix>Steckys einen 3,3 Volt Pegel, aber 5 Volt Strom quasi.

02:39:04.190 --> 02:39:05.790
<v Felix>Und das ist eigentlich alles kein Problem.

02:39:05.870 --> 02:39:12.030
<v Felix>Und du kannst alles quasi direkt so hernehmen, wie du das bei Arduino davor hast und einfach nur anstecken.

02:39:12.270 --> 02:39:12.590
<v Felix>Okay.

02:39:12.910 --> 02:39:17.150
<v Felix>Und genau, mit dem Devboard hast du quasi diesen ganzen Muster,

02:39:17.230 --> 02:39:20.430
<v Felix>die ich um nichts mehr kümmere, sondern kannst einfach direkt anstecken.

02:39:20.750 --> 02:39:22.990
<v Felix>So ein bisschen wie das Arduino einfach dann.

02:39:23.470 --> 02:39:25.150
<v Felix>Wie so ein Arduino ist schon cool.

02:39:25.790 --> 02:39:26.190
<v Felix>Cool.

02:39:28.270 --> 02:39:31.310
<v Gast 1>Ich weiß nicht, wie versorgst du denn deine Teile eigentlich mit Strom?

02:39:32.430 --> 02:39:35.790
<v Felix>Also wenn du das Devboard nimmst, steckst einfach USB an.

02:39:35.870 --> 02:39:41.470
<v Felix>Und ansonsten hast du wie heißt es, das Bauteil?

02:39:41.550 --> 02:39:46.430
<v Felix>Also entweder du nimmst dann einen Stepdown von 5 Volt auf 3,3 Volt.

02:39:48.110 --> 02:39:52.030
<v Felix>Also quasi du machst per USB dann dran und nimmst einfach einen USB-Netzteil.

02:39:53.870 --> 02:39:54.510
<v Felix>Oder

02:39:56.650 --> 02:39:57.850
<v Felix>Ja, eigentlich immer so.

02:39:57.930 --> 02:40:04.410
<v Felix>Also du hast 5 Void, also 5 Void kriegst du irgendwo immer her und dann machst du einen Stepdown oder einen

02:40:05.530 --> 02:40:12.330
<v Felix>LDO, ein Low Dropout, äh, Regulator,

02:40:12.410 --> 02:40:12.810
<v Felix>genau.

02:40:12.970 --> 02:40:13.770
<v Felix>Also es ist quasi so ein.

02:40:14.170 --> 02:40:15.530
<v Gast 1>Ich kenne manche dieser Wörter.

02:40:16.170 --> 02:40:21.210
<v Felix>Okay, also das macht, stell dir vor, das ist ein Ding, das macht aus 5 Volt 3,3 Volt.

02:40:21.290 --> 02:40:21.370
<v Felix>Ja, ja, ja, ja, ja, ja.

02:40:21.530 --> 02:40:24.410
<v Felix>Und das ist das, was du haben willst, genau.

02:40:24.490 --> 02:40:30.170
<v Felix>Und gibt es Sachen, die sind auch,

02:40:30.810 --> 02:40:33.770
<v Felix>das ist so ein ganz, ganz kleines Pinsy-Ding nur.

02:40:34.010 --> 02:40:40.250
<v Felix>Und dann kommt auf der einen Seite 5 Volt rein vom USB zum Beispiel und auf der anderen Seite

02:40:40.250 --> 02:40:44.090
<v Felix>3,3 Volt raus, was du dann in die Mikrocontroller anstecken kannst.

02:40:45.930 --> 02:40:47.930
<v Felix>Und das kann man schon gut hernehmen.

02:40:48.330 --> 02:40:48.890
<v Felix>Cool.

02:40:49.370 --> 02:40:50.570
<v Felix>Und genau.

02:40:50.890 --> 02:40:51.850
<v Felix>Auf jeden Fall gewinnen.

02:40:51.930 --> 02:40:56.250
<v Felix>Und ich glaube dran, ich glaube ans Internet der Dinge mit diesen Mikrocontrollern.

02:40:57.370 --> 02:41:00.330
<v Gast 1>Ich glaube, wichtig bei solchen Dingen ist halt einfach, dass es billig ist,

02:41:00.570 --> 02:41:03.930
<v Gast 1>damit du viele davon benutzen kannst und damit du halt auch irgendwie nicht denkst,

02:41:04.090 --> 02:41:07.370
<v Gast 1>oh, wenn ich jetzt irgendwie mal hier so ein Kabel falsch anschließe oder sonst was,

02:41:07.450 --> 02:41:08.330
<v Gast 1>dann ist es vielleicht kaputt.

02:41:08.570 --> 02:41:12.090
<v Felix>Ja, oder ich kann mir irgendwie, ich kann das irgendwie zwei Stück nehmen,

02:41:12.170 --> 02:41:14.250
<v Felix>weil die halt pro Stück 20 Euro kosten oder so.

02:41:14.650 --> 02:41:17.610
<v Felix>Das willst du natürlich dann auch nicht, sondern du willst ja möglichst viele verteilen,

02:41:17.690 --> 02:41:19.050
<v Felix>damit du mehr Dinge hast.

02:41:19.210 --> 02:41:21.850
<v Felix>Das ist ja Internet der Dinge und nicht Internet des Dings.

02:41:22.170 --> 02:41:22.890
<v Felix>Das sind das halt.

02:41:23.770 --> 02:41:25.130
<v Ingo>Oder der zwei Dinge nur.

02:41:25.290 --> 02:41:28.410
<v Felix>Ja, Internet, Internet deiner Mikrowelle.

02:41:29.930 --> 02:41:30.250
<v Felix>Ja.

02:41:33.290 --> 02:41:33.610
<v Felix>Okay.

02:41:34.330 --> 02:41:38.890
<v Felix>Genau, also ich habe das unten noch alles reingelinkt, kann man sich anschauen oder auch.

02:41:39.450 --> 02:41:39.770
<v Felix>Ja.

02:41:40.010 --> 02:41:44.970
<v Felix>Also wenn man sich Lua anschaut, dann es gibt aber, also für Lua,

02:41:45.130 --> 02:41:49.210
<v Felix>dadurch, dass es ja überall embeddet ist, kannst du, kann man das ja natürlich aus Versehen auch irgendwo

02:41:49.210 --> 02:41:53.050
<v Felix>anders finden, zum Beispiel in irgendwelchen Game Engines und so.

02:41:53.130 --> 02:41:56.570
<v Felix>Also das haben wir jetzt nicht viel drüber geredet, aber es ist natürlich überall anders auch embedded.

02:41:56.730 --> 02:41:57.050
<v Felix>Natürlich.

02:41:57.130 --> 02:42:01.450
<v Gast 1>Also ich glaube, man kann irgendwie sowas wie World of Warcraft oder so in Lua-Skripten,

02:42:02.170 --> 02:42:09.050
<v Gast 1>weil da ist es halt irgendwie einfach zu embieten und es ist halt wahrscheinlich schon drin.

02:42:09.290 --> 02:42:12.410
<v Gast 1>Weil im Normalfall ist es ja so, so ein Game implementiert man irgendwie so,

02:42:12.570 --> 02:42:16.570
<v Gast 1>man hat eine Engine, dann hat man so seine Game-Objekte außenrum und so.

02:42:16.970 --> 02:42:22.010
<v Gast 1>Aber so Charakterverhalten oder irgendwelche Storys oder so, die willst du ja nicht im Normalfall irgendwie

02:42:22.010 --> 02:42:28.970
<v Gast 1>vielleicht in C  ⁇  oder in C oder sowas runterbauen und dann hat man dafür halt irgendwie Skriptsprachen und

02:42:28.970 --> 02:42:30.890
<v Gast 1>da eignet sich halt Lua auch ganz gut.

02:42:31.130 --> 02:42:34.810
<v Felix>Zum Beispiel eine Skriptsprache, wo man zwei Strings einfach konkatinieren kann,

02:42:34.970 --> 02:42:36.970
<v Felix>ohne dass du dir das Bein ausreißen musst.

02:42:37.050 --> 02:42:38.490
<v Felix>Das wäre doch schon eine schöne Sache.

02:42:39.050 --> 02:42:40.650
<v Unbekannt>Ja, genau sowas.

02:42:41.450 --> 02:42:46.650
<v Ingo>Ja, also nur wenn ich mal kurz auf die Wikipedia gehe, Lua Scripted Video Games

02:42:46.970 --> 02:42:51.050
<v Ingo>152, die nur die Wikipedia auflistet.

02:42:51.450 --> 02:42:53.770
<v Ingo>Das heißt, es wird wahrscheinlich noch viel, viel mehr geben.

02:42:54.330 --> 02:42:59.290
<v Ingo>Und da sind sogar alte Klassiker dabei wie Grimfandango und ach.

02:43:02.170 --> 02:43:05.210
<v Ingo>Jetzt gleich wieder aus der Wikipedia rausgehen, sonst verklickt man sich nur.

02:43:05.450 --> 02:43:06.810
<v Unbekannt>Hast du eh schon gemacht jetzt.

02:43:07.690 --> 02:43:08.730
<v Felix>Bist du getrappt, quasi.

02:43:09.130 --> 02:43:13.930
<v Ingo>Ja, ja, das ist einmal auf die Wikipedia gehen und schon kommt man nicht mehr runter.

02:43:14.010 --> 02:43:14.410
<v Ingo>Gut.

02:43:15.290 --> 02:43:16.410
<v Gast 1>Nie wieder runter.

02:43:16.730 --> 02:43:18.730
<v Ingo>Ja, komme ich nie wieder runter.

02:43:19.050 --> 02:43:21.290
<v Ingo>Dann, das war's.

02:43:21.610 --> 02:43:28.010
<v Ingo>Soweit für die Programmiersprachen, die sich zumindest FlyD und Felix

02:43:28.010 --> 02:43:29.770
<v Ingo>2015 antun.

02:43:32.330 --> 02:43:38.250
<v Ingo>Und ja, ich habe in einer der letzten Sendungen so gesagt, ja, ich gucke mir mal vielleicht Python ein

02:43:38.250 --> 02:43:41.690
<v Ingo>bisschen näher an, aber ich programmiere einfach nicht genug.

02:43:42.410 --> 02:43:44.570
<v Ingo>Von daher lohnt sich das aber nicht.

02:43:44.810 --> 02:43:50.330
<v Gast 1>Du hattest doch in den alten in den alten Raditux-Talk-Folgen, da gab es doch immer mal so

02:43:52.330 --> 02:43:53.210
<v Gast 1>wer war es nochmal?

02:43:53.370 --> 02:43:54.730
<v Gast 1>Mir ist der Name entfallen.

02:43:55.050 --> 02:43:55.530
<v Gast 1>Andi.

02:43:56.490 --> 02:43:59.210
<v Gast 1>Andi probiert Linux-Distributionen aus.

02:43:59.290 --> 02:44:00.490
<v Gast 1>Das könntest du doch auch mal machen.

02:44:01.050 --> 02:44:04.010
<v Ingo>Ego probiert Programmiersprachen aus.

02:44:04.730 --> 02:44:08.570
<v Gast 1>Oder keine Ahnung, probier einfach mal ein bisschen irgendwie Dinge in Python aus und red mal drüber,

02:44:08.890 --> 02:44:10.410
<v Gast 1>wie du dich dabei fühlst.

02:44:11.610 --> 02:44:13.050
<v Unbekannt>Wie fühlst du dich?

02:44:13.370 --> 02:44:18.650
<v Gast 1>Ja, keine Ahnung, also was kannst du irgendwie Cooles damit tun,

02:44:19.210 --> 02:44:23.130
<v Gast 1>was du vorher mit irgendwelchen Chat-Skripten nur schmerzhaft machen konntest.

02:44:23.530 --> 02:44:24.090
<v Gast 1>Zum Beispiel Jason.

02:44:25.610 --> 02:44:27.610
<v Felix>Fucking Jason ist einfach verloren.

02:44:27.850 --> 02:44:28.170
<v Felix>Oh ja.

02:44:28.250 --> 02:44:30.490
<v Gast 1>Also es gibt irgendwie so Jason Selected.

02:44:31.770 --> 02:44:32.730
<v Felix>JQ gibt es, ja.

02:44:32.890 --> 02:44:34.650
<v Felix>Was sogar relativ cool ist, muss man ja sagen.

02:44:34.810 --> 02:44:37.130
<v Felix>Aber es ist halt trotzdem noch ein Riesenpain.

02:44:41.290 --> 02:44:41.930
<v Felix>Gut.

02:44:42.650 --> 02:44:44.250
<v Ingo>Dann ist es schon spät auch.

02:44:44.570 --> 02:44:48.170
<v Ingo>Also für die Hörer wahrscheinlich nicht so, aber für uns.

02:44:49.210 --> 02:44:56.010
<v Ingo>Ja, das war Binäge-Witter-Spezial 6 2015 Programmiersprachen

02:44:56.170 --> 02:45:01.210
<v Ingo>und gucken, was wir sonst noch so haben in den nächsten Jahren.

02:45:01.530 --> 02:45:06.810
<v Ingo>Vielleicht kommt ja noch was ganz, ganz Tolles vorbei, was wir jetzt nicht bedacht haben.

02:45:06.890 --> 02:45:10.090
<v Ingo>Und wenn ihr vielleicht auch noch eine andere Programmiersprache habt,

02:45:10.250 --> 02:45:16.010
<v Ingo>die wir uns mal irgendwann näher angucken müssten, spätestens vielleicht für 2016,

02:45:16.090 --> 02:45:19.210
<v Ingo>dann könnt ihr uns das ja natürlich auch in die Kommentare schreiben.

02:45:19.690 --> 02:45:23.610
<v Ingo>Und ansonsten wünsche ich euch wie immer eine frohe Zeit.

02:45:23.690 --> 02:45:24.650
<v Ingo>Passt auf euch auf.

02:45:24.890 --> 02:45:25.530
<v Ingo>Habt Spaß.

02:45:25.690 --> 02:45:25.930
<v Ingo>Kommt.

02:45:26.330 --> 02:45:26.890
<v Ingo>Am Gerät.

02:45:27.210 --> 02:45:27.930
<v Ingo>Achso, ups.

02:45:28.010 --> 02:45:28.250
<v Ingo>Sorry.

02:45:30.970 --> 02:45:32.570
<v Ingo>Im Internet der Dinge, vielleicht.

02:45:32.810 --> 02:45:33.930
<v Gast 1>Genau, im Internet der Dinge.

02:45:34.010 --> 02:45:36.410
<v Gast 1>Habt Spaß und lernt vielleicht mal was Neues.

02:45:36.490 --> 02:45:42.010
<v Gast 1>Wir können ja mal gucken, ob wir vielleicht aus damals so eine einmal im Jahr Sendung machen,

02:45:42.330 --> 02:45:44.010
<v Gast 1>was wir denn irgendwie gerade Neues lernen.

02:45:44.410 --> 02:45:45.050
<v Gast 1>Wäre auf jeden Fall cool.

02:45:46.090 --> 02:45:47.370
<v Gast 1>Also fände ich auf jeden Fall gut.

02:45:47.450 --> 02:45:48.330
<v Unbekannt>Vielleicht kriegen wir es hin.

02:45:48.410 --> 02:45:49.130
<v Unbekannt>Schauen wir mal.

02:45:49.450 --> 02:45:49.930
<v Unbekannt>Genau.

02:45:50.250 --> 02:45:51.930
<v Ingo>Dann bis zum nächsten Mal.

02:45:52.170 --> 02:45:52.570
<v Ingo>Ciao, ciao.

02:45:52.650 --> 02:45:53.050
<v Ingo>Ciao, ciao.

02:45:53.370 --> 02:45:53.850
<v Ingo>Ciao.
