 Hallo! Willkommen zum Tag 3 vom PushToTalk, dem verteilten Chaos-Event. Unser erster Sprecher heute ist Paul. Er spricht über den Betrieb und die Modifikation einer eigenen Compiler Explorer Instance. Falls ihr das noch nicht gesehen habt, findet ihr im Pre-Talks dazu eine Liste von Fragen, so als kleinen Paul, den ihr euch mal angucken könnt. Drei Stück an der Zahl. Die werden dann auch mit genutzt, um die weitere Entwicklung des Vortrags. Ich nehme die Schwerpunkte mit zu gestalten. Das heißt, wenn ihr das mit beeindruckend vollgeht, nehmt euer Zordonium, tragt euch ein und stimmt mit ab. Ansonsten, inhaltlich, ist das ein Thema, das auf der GPN 18 ins Leben gerufen wurde und eigentlich dieses Jahr auf der GPN 20 hätte vorgestellt werden sollen. Leider gab es da dieses Virus-Event, das das so ein bisschen verhindert hat. Euch allen viel Spaß mit Highlights aus C++ und einer Compiler Explorer Instance. Genau. Also vielen Dank, dass ihr alle da seid. Ich möchte euch passen zu der Compiler Explorer Instance, die ich zwei Jahre lang betrieben habe. Schneller Reminder, die erste Frage kommt ziemlich früh. Hier ist der Link, tippt den Schnellabscan den QR Code, damit ich weiß, wie viel Intro ich hier machen muss. Ein paar Disclaimer, worum es in diesem Vortrag nicht geht. Compiler Explorer kennt ihr vielleicht als Godbolt.org oder als Godbolt, einfach benannt nach Matt Godbolt, der das Projekt mal ins Leben gerufen hat. Von Matt findet ihr auf YouTube, ich glaube, drei Vorträge über Compiler Explorer, die ziemlich gut sind. Und obwohl ich eigentlich jede Woche Compiler Explorer benutze, habe ich in jedem von denen was gelernt. Ich glaube, ich werde hier keinen großen Mehrwert für die Gesellschaft schaffen, wenn ich einfach auf Deutsch wiedergebe, was er schon erzählt hat. Ich möchte hier eigentlich nur über die Modikationen, die addons reden oder wie ich Compiler Explorer im Produktiveinsatz genutzt habe. Und auch als mein background, ich habe mal Physik studiert, ich habe eigentlich keine Ahnung, wie man Web Services richtig betreibt. Klar, ich bin eigentlich C++ Entwickler mit Web Services und so kenne ich mich nicht richtig aus. Ja, das heißt, erwartet da jetzt nicht zu viel über Details über Web Security. Auch über das CERN hatten wir bei den vergangenen Kongressen vier ziemlich gut gemachte und aufwendig und schön gemachte Vorträge. Da möchte ich jetzt auch nicht groß reproduzieren, was ihr anders schon den Schönen seht, nur ein klein bisschen Recap. Es gibt das CERN, das ist so ein großes Teilchen Physik Forschungslabor in Genf. Und da gibt es Teilchenbeschleuniger, der LHC ist einer davon. An dem Beschleuniger stehen vier große und ein paar kleine Experimente. LHCB ist eines davon, das wird betrieben von Kollaborationen von Forschern, die durchaus, also die Kollaborationen stehen untereinander so ein bisschen in Konkurrenz. Die Detikoren sind alle so ein bisschen anders gebaut, weil sie ein bisschen andere Dinge untersuchen. Und ich war eben Mitglied bei LHCB von 2009 bis zum Frühjahr diesen Jahres. Das heißt, ich hatte so 400 bis 1000 Kollegen, mit denen ich zusammengearbeitet habe, je nachdem wie man zählt, weil jetzt nicht jeder Bachelor Studierende wird in der Datenbank registriert. Und manchmal ist es schwierig zu entscheiden, der Elektroniker, der uns ein Chip entwickelt hat, zählt er jetzt noch als Mitarbeiter oder ist das ein externer Contractor. Und auch um das ein bisschen einzuordnen, die meisten Forschenden sind keine ZNW-Tarbeiter. Ich glaube, departmentweit sind nur 10 Prozent der Forscher angestellt. Und der Rest ist eben bei irgendwelchen Unis, irgendwo auf der Welt, Berlin, Rio de Janeiro, New York angestellt. Manche haben ihr Büro in Genf, manche arbeiten aber von ihrer Heimat Omini. Und was jetzt so ein Alleinstellungsmerkmal von LHCB sein wird, klassischerweise, wenn euch die alten Vorträge anschaut, kollidieren am Teilchenbeschleuniger alle 25 Sekunden Teilchen, dann passiert Physik, Detektoren detektieren irgendwas. Und man muss entscheiden, ist das interessant, lese ich das aus, schreibe ich das auf Tape oder schmeiß ich das weg. Klassisch macht man das mit Custom Hardware oder FPGAs, die sich eben kleine ECS-Detektors anschauen und die Entscheidungen machen. Aber das war uns nicht flexibel genug. Wir wollten, dass man alle Informationen von allen Detektoren kriegt. Um diese Entscheidung trifft FPGAs sind da irgendwie nicht mehr optimal zu, weil eben die Fläche an Silizien, die man braucht, skaliert mit den Anzahlern eingängen und mit der Komplexität der Logik, die man baut. Das heißt, die Herausforderungen, die wir uns gestellt haben, sind, wie wird man in Software mit 40 Terabyte diese Kunden fertig. Und dazu hatten wir immer ein Software-Stack von 600.000 Zeilen C++ für CPUs. Diese 600.000 Zeilen, das ist so das, was mir Git an den Kopf geworfen hat, wenn ich ein Git-Clone gemacht habe, da zähle ich upstream Bibliotheken, wie Boost oder Inter Threadbuilding Blocks nicht mit. Das ist aber nicht alles aktiver Code, der wird je nach Konfig zu runtime geladen oder nicht geladen. Für manche Aufgaben hat man mehrere Implementierungen, eben eine alte, die schon 10 Jahre lief, von der man weiß, die es gut validiert und eine neue, an der ein Master Student vielleicht arbeitet, um Dennis Schnell und ThreadSafe nochmal neu zu implementieren, sodass man in Continuous Integration Tests eben schauen kann, macht alte Implementierungen, neue Implementierungen das Gleiche. Gut. Zu Compile Explorer selbst, es ist eigentlich relativ unspektakulär. Wenn wir uns das anschauen, das ist so eine Webseite. Da kann man irgendwie Quelltecks eintippen in C++ und es zeigt einem Diss Amply dazu und man kann sich denken, push ribbimofward pitter und ist da entweder froh oder nicht so froh drüber. Und ich selbst hab Compile Explorer vor vier Jahren als Diskussionskealer kennengelernt. Also, die meisten, die an so einem Merch-Request diskutiert waren, hatten halt wie ich Physik studiert. Und waren jetzt nicht die super Programmierer und wir wollten dann irgendwie eine API bauen, die intuitiv zu verstehen ist, wo jeder auch ohne Computing-Background versteht, was muss ich damit tun. Irgendjemand kam in die Diskussion und hat gesagt, hey, das könnt ihr auch voll anders schreiben. Und das macht noch nicht mal schlechter Assembly, wie ihr hier seht. Zu dem Zeitpunkt war es zehn Jahre her, dass ich das letzte Mal Assembly gesehen habe. Ich habe nichts verstanden. Ich bin ausgestiegen aus der Diskussion. Viele anderen auch. Aus dem Pull-Request ist nichts geworden. Und auch sonst ist, meiner Meinung, Assembly anschauen, um zu entscheiden, ob Code gut und effizient ist, ist schön und gut. Aber eigentlich will man repräsentative Benchmarks, weil CPUs machen, out of order Executions, speculative Executions, haben Branch Prediction. Man hat irgendwie ein Cache, dass irgendetwas tut. Und natürlich, wenn ich wissen will, ob Code schnell ist oder langsam, will ich mich auf ein Benchmark verlassen und nicht darauf, was irgendein Experte zu Assembly sagt. Und auch ansonsten, also C++ in Assembly verwandeln, dafür gibt es Compiler. Compiler habe ich auf meiner Workstation. Wozu brauche ich so eine Webseite? Jetzt aber ich frage, was haltet ihr von der Angelegenheit? Und okay, eine Minderheit ist, wie ich täglich ernutze, von godbolt.org, die wenigsten arbeiten damit aktiv. Das heißt, es gibt ein bisschen mehr Intro. Und zwar hat sich meine Meinung zu Compiler Explorer geändert. Heute vergeht eigentlich keine Woche, in der ich bei der Arbeit nicht auf godbolt.org gehe, um da irgendwas zu tun. Wahrscheinlich könnte ich auch ohne arbeiten, aber ich will es einfach nicht. Und dabei ist in der Tat diese Assembly, die die Webseite einmal anzeigt, für mich relativ unwichtig. Die Juna, auch wenn ihr euch auf YouTube C++ Weekly anschaut, was da eigentlich passiert ist, Jason tippt irgendwie einen Konstrukte rum, schaut, kompliert er oder kompliert es nicht. Was ändert sich, wenn ich hier Kunstexperte dazuschreibe? Kann ich die Funktionen, die ich hier geschrieben habe, nutzen? Wie kann ich sie benutzen? Welche Warnungen spuckt der Compiler aus, wenn ich was falsch mache? Das heißt, was eigentlich interessant ist, ist, man hat da so ein Pad, wo man reintippen kann und der Compiler erzählt einem, was der Compiler davon hält. Assembly, kann man sich anschauen, muss man sich nicht. In anderen Worten, godbolt.org wird als readevaluate print loop benutzt. Was anderes, das Ganze ist auch irgendwie ein reproducible Setup. Also ich hatte vor Jahren mal so eine Frage auf der Google-Benchmark-Discussion-Mailing-Liste, weil irgendwas hat nicht so funktioniert, wie ich wollte. Ich habe den CodeSnipot geschickt, erklärt, was ich versuche zu tun, was meine Beobachtung ist. Und auf der anderen Seite dieses Works for me, irgendwie kann ich das nicht reproduzieren. Ich habe sie aber mal in Compiler Explorer eingetippt und hier ist der Link. Kannst du das zurechtfrickeln, dass wir bei uns die gleiche Sache anschauen. Und das hat super funktioniert. Ich habe den Link gekriegt, habe einfach weiter getippt bis es lief und dann den neuen Link sharing Link zurückgeschickt. Das heißt, godbolt.org funktioniert einfach als Pacebin mit Compiler Support und als reproducible environment. Und das ist ziemlich cool. Natürlich könnt ihr sagen, hey, lokales Tooling. Ich habe meinen Lieblings Text Editor mit vielen Plugins konfiguriert. Die kann ich nicht alle auf der Webseite installieren. Stimmt, es ist so ein Trade-off. Auch ich habe ziemlich viel Arbeit in meine WIM-Konfig gesteckt. Aber trotzdem, also dieses reproducible environment und Link sharing und die schnelle Iterationszügel sind es einfach wert. Okay, also zusammengefasst. Compiler Explorer als Webseite ist einfach bequemer als lokales Tools aufsetzen und zu maintainen und um mit mehreren Nutzern zusammen zu interagieren. Vor allem auch, weil man so eine Web-Service-Instanz sie setzt man einmal auf und kann die mit beliebig vielen Nutzern nutzen und alle haben das gleiche Setup. Das skaliert einfach besser. Und auch ein anderer Vergleich. Wie sieht das aus, wenn ich irgendwie lokal mit Code arbeite? Ich lock mich an auf meine Workstation. Ich bin nicht so richtig schnell im Tippen, hol mir mein Workspace zurück und führe dann einen neuen Bild aus. Und was dann gut und gerne passiert ist, mein Bildsystem entscheidet, ich muss neu konfigurieren. Und dann passieren Dinge. Und dann warte ich. Und dann warte ich. Und es dauert lange und das ist lästig und da muss man einfach mal so ein bisschen dickköpfig sein und sagen, alles über 400 Millisekunden ist zu lang. Solange will ich nicht warten. Das heißt, da schreibe ich doch lieber auf in der Webseite irgendwas rein und es kommt wieder sofort. Ein Problem allerdings ist für Jason Turner in C++ Weekly in den Trainingslites ist das okay, wenn man Code ohne Abhängigkeiten schreibt und einfache Konstrukte schreibt. In der Praxis schreibe ich eigentlich nie Code ohne irgendwelche Include-Statements, weil alle komplexen Aufgaben, die man so in Computer Science hat, hat schon mal irgendjemand gelöst und in eine gute Bibliothek geschrieben und die im Internet zur Verfügung gestellt. Die ist besser debackt als alles, was ich heute Nachmittag schreiben kann. Da sind alle Cornercases abgedeckt. Das heißt, da benutze ich doch lieber externen Code, als dass ich alles schlecht selber implementiere. Und das ist eigentlich auch gar kein Problem. Auf godball.org, ich meine, wenn ich einfach schreibe Include-Boost irgendwas, dann sagt mir dann Compiler-Header nicht gefunden. Es gibt aber diesen Libraries-Button. Da sind super viele Bibliotheken installiert. Ich kann mir die Richtige aussuchen und dann ist der Compiler froh. Haha, toll. Das funktioniert allerdings auch nur begrenzt. Also, alle meine, da sind viele wichtige Bibliotheken installiert. Wenn irgendeine fehlt, kann man auch ein Pull-Request machen. Der Support ist eigentlich echt super da. Aber es wird nicht jede Bibliothek, die mal geschrieben wird, für immer da verfügbar sein. Es gibt auch noch andere Features. Compiler Explorer hat noch mal so einen eigenen Pre-Prozessor mit eingebaut. Man kann also einfach Include und dann eine GitHub URL eintragen und dann wird der Header von GitHub geholt und eingebettet. Das funktioniert aber nicht für transitive Includes. Also, wenn ich eine Datei inkludiere, die auf GitHub liegt und die inkludiert irgendwas anderes, dann schlägt das halt irgendwann viel. Manche Bibliotheken auf GitHub haben genau deswegen auch einen Brunch, wo alles in einer einzelnen Datei zusammengelegt drin ist. Und wenn das immer noch nicht erreicht, dann könnt ihr auch einfach auf die Webseite oder auf das Git Repository von Compiler Explorer gehen. Und wenn das lädt, ein Git Clone machen. Hier. Und wenn ihr ein halbwegs vernünftiges Betriebssystem habt, also so ein Ubuntu Long-Term Support, reicht, denke ich auch schon, und Make installiert hat und Node.js installiert hat, dann macht ihr in dem Verzeihsender einfach an Make und dann startet ein Web Server und dann habt ihr lokal Compiler Explorer. Und das habe ich hier mal ausprobiert. Ich wollte von der Guidelinesupport Library irgendwas inkludieren, und zwar von der Version, die auf meiner Workstation inkludiert war und konnte dann hier eben Compiler Argumente angeben, minus i, langer, langer, langer, langer, fahrt. Das hat kompiliert. In der Praxis war das aber noch nicht richtig praxistalklich, denn wenn ich mir anschaue, was mein Bildsystem macht, so ein typischer Compiler-Aufruf ist lang und da werden richtig viele Bibliotheken eingerichtet. Das heißt, vielleicht seid ihr super Elite-Hacker und habt euch einen Keyboard-Controller geschrieben und könnt 2000 Zeichen schnell fehlerfrei eintippen. Ich kann das nicht. Und jetzt ist die Frage, warum muss man da so viel eintippen? Die Sache ist, wir haben ein Support-Team, was uns Upstream-Bibliotheken bündelt in diesen LCG-Releases und da kriegen wir eben 18 Upstream-Bibliotheken regelmäßig gebündelt rein. Die Versionen sind alle gleichzeitig installiert. In jedem von den Releases sitzt dann die Bibliotheken, die wir inkludieren in ihren Versionen drin. Und die sind dann auch mehrfach gebaut, eben für i3-86, für X86-64, für Scientific Linux 6, für CentOS 8, manche auch für Ubuntu und manche sogar für MacOS. Die sind dann gebaut mit GCC8, GCC9, Klang8, Klang9, vielleicht inzwischen auch mit GCC10. Wir haben Releases mit einem Optimized-Bild, mit einem Bild ohne Optimizer und Debug Flex, damit man da ordentlich mit GDB arbeiten kann. Ein Bild, der voraussetzt, dass man auf eine Architektur mit SSE4 läuft, mit AVX2 oder auf Intel Skylake. Das heißt, ich kann nicht einfach ein Include-Fahr zu Root angeben. Ich kann 100 verschiedene Include-Fahse zu Root angeben und wahrscheinlich sind 109 davon nicht die Version, die ich haben will. Und nur eine ist die richtige, das ganze 18-mal. Mein eigener Code ist zu allem überfluss auch noch nicht mono-Repo, sondern wir haben so über 10 Git-Repositories, die ihre eigenes Tagging machen. Und eine Version, eben dieses Fuss-Pakets, ist halt nur API-Kompatibel mit genau einer Version, das REC-Pakets und so weiter. Das heißt, wenn ich richtige Include-Fahrer angeben kann, muss ich auch noch Versionskompatibilitäten berücksichtigen. Und das mache ich doch als Nutzer nur falsch. Also es gibt zu viel Möglichkeit, das falsch zu machen. Und wir können uns fragen, läuft CMake noch? Nein, okay, CMake ist inzwischen fertig. Genau dafür haben wir nämlich ein Bildsystem, um sowas für den Nutzer zu erledigen. Das dauert aber acht Minuten. Und wenn ich mal schnell ein Bild-Setup ändern will, dann ist das zu lange. Das heißt, Automatisierung muss her. Bevor ich erkläre, was ich automatisiere, ein Strain, den ich mir gesetzt habe, war, eigentlich hatte ich von meinem Supervisor keine Approval, da viel Zeit reinzustecken. Das war so ein Spaßprojekt, was ich halt irgendwie bei GN und MIMCD und am Wochenende entwickelt habe. Das heißt, ich wollte jetzt nicht anfangen, irgendwie zu fragen, kann ich dafür ein Projekt-Account haben, kann ich da CPU-Riss-Wissenfarben, da hätte ich zu meinem Supervisor gehen müssen als Gruppenleiter und als Projektleiter und dann zur Projekt-Planning-Group und dann vielleicht zur Core-Software-Group, die dann entscheiden müssen, für dieses komische kleine Webprojekt, was Paul da nutzt, sollen wir da CPUs aus dem CPU-Budget für Simulationen rausnehmen. Die Antwort wäre vielleicht ja gewesen, aber es hätte halt mindestens eine Woche gedauert, bis ich da wäre, statt dass ich einfach irgendwas mache mit den Ressourcen, die ich selber habe. Die nächste Frage ist dann, was ist schon verfügbar? Und zwar gibt es aus der LLWM-Welt diese Compile-Commands, JSON-Datenbanken, die werden von CMake zum Beispiel erstellt oder auch von anderen Build-Tools und eben auch im Nightly-Build von unserem Software-Stack. Das heißt, wenn ich wissen will, wie muss ich ein Compiler aufrufen, kann ich einfach in diese Datenbank reinschauen und sehe da zu jeder Translation-Unit, welcher Datei wird da kompiliert, welcher Compiler wird aufgerufen, mit welchen Compiler-Flex wird das aufgerufen, welche Defines werden gesetzt, ja, da, ja, da, ja, da extrem viel Zeug. Des Weiteren ist der Nightly-Build wahrscheinlich auch das, was viele Entwicklerinnen interessiert, denn der Nightly-Build läuft nachts. Man hat irgendwelche Test-Failures oder Compiler-Failures oder Compiler-Warnings, und die will man am Tag testen und fixen. Das heißt, ich will meinen Nutzer in irgendein Environment zur Verfügung stellen, wo ich der so nah wie möglich am Nightly-Build draten ist. Und diese Nightly-Builds werden auch tatsächlich auf unseren Workstations deploy. Ich kann einfach so ein LS irgendwo ins Datei-System reinmachen. Da habe ich für jeden Slot, also für jedes Merch-Request, für jedes Upstream-Release von Bibliotheken ein Verzeichnis. Ich habe die letzten sieben Nächte als Bild verfügbar. Ich habe ein Bild für jedes Repository zu verfügbar und eben auch wieder für jede Plattform, für jeden Compiler ein Release-Directory, wo alles drin liegt. Gut. Das heißt, ich habe also im Wesentlichen 4.000 sinnvolle Settics, wie man einen Compiler aufrufen kann. Eine Alternative wäre natürlich gewesen, einfach den GetMaster-Brunch von meiner Software auszuchecken. Habe ich aber nicht gemacht, weil aus historischem Grund unsere Nightly-Builds eben nicht Master bauen. Und als Entwickler will ich halt die Bugs im Nightly-Build fixen und nicht die in Master. Dann produziert der Nightly-Build auch Binarys, die ich vielleicht interaktiv testen will, wenn ich gerade nicht kompiliere. Und wir hatten auch lange Zeit im Nightly-Build Code Generation drin. Das heißt, Hader-Dateien, die einfach nicht im GetRepositor drin lagen. Also das wäre einfach frustrierend gewesen, wenn ich irgendjemand GetMaster angeboten hätte. Gut, dann ein anderer Schritt. Wie komme ich an den Code ran? Installation läuft ziemlich komfortabel. Es gibt dieses Cern Virtual Machine File System. Das funktioniert ohne Authentifizierung. Das heißt, beispielsweise gibt es als Arch-User-Repository-Paket. Das kann man auf dem Laptop installieren. Das hatte ich auch, glaube ich, fast vier Jahre hier auf dem Laptop, von dem ich Stream installiert. Und da kann man die Software einfach reinschauen, weil alles, was wir da geschrieben haben, ist open-source. Da kann man eigentlich auch gleich das Deployment zur Verfügung stellen. Und wir haben das als Kanal benutzt, um Software-Distribution auf alle Computing-Centren zu machen. Das heißt, da ist meine Compile-Commands-Jail. Wenn ein Nightly-Build erfolgreich war, finde ich. Und wenn das Deployment erfolgreich war, finde ich diese Datenbank und kriege da alles raus, was ich für eine Compiler-Konfiguration brauche. Ich muss die halt nur pasen. Nur. Und anfangs, also bei der GPN vor zwei Jahren, habe ich das halt von Hand gemacht. Ich habe dem im Text-Editor aufgemacht, ein bisschen Copy-and-Paste gemacht und damit meinen Compile-Explore-Instanz konfiguriert. Aber dadurch, dass ich halt nur sieben Nightly-Slots immer gleichzeitig verfügbar habe, was spätestens nach sieben Tagen wieder kaputtgegangen wäre. Und einfach String-Replacement wollte ich nicht machen, weil hin und wieder kommen ja neue Upstream-Bibliotheken, wechselnden Standard-Compiler, wechseln auf eine neue Architektur. Das heißt, das Ganze muss automatisiert werden. Ich habe einen kleinen Pasa in Go geschrieben, der so eine Compile-Commands-Jail braucht. Das findet ihr auf GitHub. Das ist sogar vielleicht nutzbar für euch. Also das ist extrem generisch. Ich habe das mit dem JSON-Wartenbank zuwerfen und das erstellt eine Konfigurations-Datei für Compiler-Explorer. Das habe ich sogar mitgenommen zu meinem neuen Job. Das lief innerhalb von ein paar Minuten und jetzt habe ich eben auch nicht sehr ein spezifisches Setup, wo ich Compiler-Exploren kann. Warum Go? Eigentlich war das eine schlechte Entscheidung, denn als Entwicklungssprachen bei LACB hatten wir C++ und Python. Das heißt, ich habe da jetzt Code geschrieben, um das zu maintainen kann. Compiler-Explorer selbst ist auch in Node.js. Das heißt, wenn ich das in Node.js geschrieben hätte, hätte ich das einfach in Bibliothek machen können und upstreamen können. Man könnte dann ein Fahrzeug in eine JSON-Datenbank konfigurieren und deshalb hat es startet und alles ist wunderbar. Ein Grund war, dass sehen wir vielleicht später im Vortrag noch, dass ich mich nicht mit unserer C++-Toolchain rumschlagen wollte, weil wir die Standard-Bibliothek auf C++-Deployen. Das heißt, wenn ich ein Netzwerk-Aussetzer habe, dann fällt mein Binary nicht fest. Hier ist keine Software und hört auf, sondern sie fliegt mehr vor um die Ohren mit einem unverständlichen Fehler. Und wahrscheinlich der Hauptgrund, ich wollte Go lernen und so lernt man halt Programmiersprache neunzehtage, indem man einfach irgendwas implementiert und das dann funktioniert. Der Code ist ein recht simpler Spaghetti-Code. Ich holen mehr einfach nur die Datenbank, Go hard parser für JSON, loop über alle Translation-Units, holen mir die Compiler-Kommandos für jede Translation-Unit, und wenn irgendwas mit Minus i anfängt, dann sage ich, das ist ein Include-Fahrt. Wenn irgendwas i-System ist, dann ist das nächste Wort im Fahrten Include-Fahrt. Dann macht man noch, habe ich noch absolute Fahre daraus gemacht, statt Relativen. Und bin fast fertig, denn in unserem Software-Stack haben wir auch viel so Pre-Prozessor-Zeugs, was abfragt, ist auf der Architektur für, die gerade gebaut wird, SSi4 verfügbar. Wenn nicht, dann soll SSi4 Float-V ein Alias sein für ein Float. Wenn es verfügbar ist, dann soll Float-V bitte eine Klasse sein, die als Data-Member so ein SIMD-Datentyp M128 hat. Das heißt, damit das richtig auf meine Instanz funktioniert, brauche ich auch die Minus D und Minus M Flex für G++. Und weil ich auch die Warnungen aus dem Nightly-Bild reproduzieren will, auch die Minus W Flex, und falls doch mal irgendjemand auf Assembly schaut, auch die Minus O Flex. Das ist das, was dabei rauskommt. Wenn man meinen Binary laufen lässt, es kommt halt irgendein Compiler-Kommando rein. Und es kommt so eine C++-Defaults.proper, die ist der Teil für Compiler Explorer raus. Da steht Zeug drin. Anfangszeichen müssen ein bisschen anders escaped werden. Das ist alles machbar. Und wenn wir jetzt vergleichen, was da passiert, so sieht godbolt.org aus. Man kann verschiedene Compiler auswählen, das sind viele installiert. Man kann sogar suchen, wenn man richtig tippt. Es sind auch viele Klang-Versionen dabei. Okay, cool. Und meine eigene Instanz habe ich ein bisschen gebrandet, also damit ihr auch weiß, wo ich gerade bin. Ein bisschen Artwork gemacht. Unsere Compiler, die wir benutzen, sind selbst gebaut und haben deswegen diesen Prefix-LCG. Und wenn man hier stopp, klickt, kann man eben sehen, wie wurde dieser Compiler jetzt aufgerufen. Und da stehen eben diese ganzen Minus-D die für einen richtigen Bild erforderlich sind eben drin. Ein paar Seamake-Standard-Variabenden habe ich ersetzt, einfach um nicht irgendwo eine Naming-Collision zu haben. Warnungen werden so aufgesetzt, wie im Nightly-Bild C++-Standard wird gesetzt, Optimizer wird gesetzt und eben auch die CPU-Architektur, die Feature, die aktiviert sein sollen. So viel dazu. Dann was hat es mit diesen gebrandeten Compilern auf sich? Ich habe es schon ein bisschen gesagt, wir haben als Entwicklungsbetriebssysteme Scientific Linux 6, CentOS 7, vielleicht irgendwann CentOS 8 und die sind verglichen mit Debian Stable oder Ubuntu Long-Term Support richtig, richtig alt und schippen mit richtig, richtig alten LibC und LibStandard C++-Versionen. Wir wollen aber modernen Coach schreiben mit den neusten, tollsten Compilern und damit eben diese ganze Toolchain von einem Compiler, DeepBinUtils, der Linker, der Pre-Prozessor, damit die alle richtig laufen, sind unsere Compiler eigentlich Shellscript, die Umgebungsvariablen aufsetzen und dann andere Argumente an das eigentliche Compiler-Binary weitergeben. Und für Klang kommt dann eben noch dazu, dass wir wollen, dass der Klang-Bild binary-kompatibel mit dem GCC-Bild ist. Das heißt Klang geben wir dann in der Stelle nur noch GCC Toolchain als Argument mit, ohne dass das ja, dann kam auch schon die Generalprobe für meine Instanz. Das hier war so eine Fehlermeldung, die wir im Software-Stack gesehen haben. Also ich wähle einfach aus von dem Gaudi-Paket, möchte ich den Bild von heute haben. GCC9 ist glücklich mit dem Code. Klang8 sagt, ne, fühlt mal da ein Standard-Move ein. Okay, hab ich ausprobiert. Standard-Move. Und ja, verarscht. Ne, das Move ist schlecht. Mach's wieder weg. Und wenn man so ein bisschen Erfahrung hat mit uns und Sternchen irgendwo einfügen in C++ Code, ist das halt der nächste Schritt. Man fängt das als Referenz. Okay, Klang ist glücklich. Wechsel zurück zu G++ und G++ ist auch glücklich. Und zum Vergleich zu vorher, jetzt hab ich hier 2-mal den Compiler gewechselt. Hätte ich jedes Mal Ziehmerk laufen lassen, hätte das 16 Minuten gedauert. Das hier waren jetzt keine 50 Sekunden. Also für mich, zumindest mit meinem Setup, wie ich die Toolchain auf der Workstation hatte, ist das ein klarer Mehrwert. Versteht mich bitte nicht falsch. Also das Ziehmerk-Setup kann man schneller machen. Wir hatten dann Sommerstudenten daran arbeiten, der gesagt hat, da können wir ein Block an Faktor 10 rausholen. Aber auch eine Minute zum Compiler wechseln ist doch ein bisschen lästig. In der Praxis gab's ein paar Probleme. Und zwar, wenn wir uns hier, das war auch einer der ersten Praxistests, genauer anschauen, was passiert ist. Ich hatte irgendwie eine Zeile C++ geschrieben. Nimm ein Pointer, rufen den Peter Rode an und gib den Return-Wert zurück. Das allein erzeugt schon 3 Megabyte Assembly. Die Standard-Einstellung von Compiler Explorer hat da irgendwo ein Limit. Das kann man konfigurieren. Das musste ich umkonfigurieren, dass ich größere Bineries, größere Assemblies zulasse. Und auch das Limit für wie lange darf eine Compilation dauern, muss ich hochsetzen. Ist alles irgendwie nicht dramatisch. Kann man schnell umstellen. Eine Sache, für die ich keine Lösung gefunden hab, ist, Compiler Explorer hat hier diese ganzen Settings, welche Symbole aus einem Binary rausgefiltert werden sollen und welche nicht. Und ich hab irgendwann mal in Assembly nicht gefunden, was ich gesucht hab und hab mir gedacht, vielleicht wird das rausgefiltert. Und dann ziemlich schnell festgestellt, wenn ich so eine Datei von meinem Dateisystem lade und die auf Compiler Explorer dann kompliere. Dann ist die Compilation nach ein paar Sekunden fertig. Also das hier war ein Boost Unit Test, der sich irgendwie komisch verhalten hat. Und an der Stelle seht ihr jetzt Links vielleicht, wenn man's lesen kann, der Compiler tut was. Der ist jetzt irgendwie 3-4 Sekunden beschäftigt. Und danach den kompletten Rest dieses 2 Stunden Videos ist nur Node.js damit beschäftigt, die Text Processing zu machen. Da hab ich keine Lösungen früh gefunden, außer dass ich diese Textfilter halt hartgecoded hab, dass die nie vom Nutzer deaktiviert werden können. Gut. Dann ein anderes Projekt, das ihr vielleicht kennt, ich glaube es ist weniger populär, ist C++ Insights. Das ist auch inspiriert von Compiler Explorer und das tut sowas ähnliches. Man hat auch 2 Textboxen. Man tippt C++ ein und auf der anderen Seite kriegt man was anderes raus. Nämlich Compilation in C++ besteht ja aus mehreren Schritten. Man hat einen Pre-Prozessor der Zeugs inkludiert, Definitionshandel, dann Macros auflöst. Dann hat man in C++ oft getemplated in Code. Das heißt, wenn man so eine getemplatete Funktion benutzt, werden die Templates instanciiert, was auch wieder Code generiert. In C++ kann man Funktionen überladen, wo der Compiler entscheidet, wenn ich eine Funktion Flubber aufrufe, welche von den vielen Funktionen die Flubber heißen, wird aufgerufen. Es gibt implizite Casts, es gibt name-dependent, nein, argument-dependent Namespace-Muckab. Das heißt, es ist manchmal als Mensch schon ziemlich schwer herauszufinden, was passiert in einer Zeile Code eigentlich. Und Cpp Insights fängt eben das ab, was dann an den eigentlichen Pasa übergeben wird. Und ich finde das in der Praxis eigentlich viel sinnvoller als Compiler Explorer. Zum Beispiel hatte hier Bryce Lellbach was gepostet, wenn man einen Array hat und von den Anfangs- und End-Iteratoren von einem Array ein Standard-Z konstruiert, dann kriegt man manchmal ein Set mit 2 Elementen und manchmal mit 5 Elementen. Und er hat da diesen Compiler Explorer-Link geteilt, der im Wesentlichen darauf geruht, was führt und dann C out macht. Und wenn man jetzt Language-Lawyer ist, kann man wahrscheinlich darüber nachdenken, was ist der Unterschied zwischen geschweiften Klammern und rumen Klammern. Aber ganz ehrlich, ich will nicht Language-Lawyer sein. Wenn der Compiler eh weiß, was er tut, dann soll es mir vielleicht auch sagen. Wenn ich das Ganze in Cpp Insights poste, sag mir Cpp Insights, hey, das erste ist ein Set von Pointer und das andere ist ein Set von Integer. Und wenn man das Fenster sogar noch ein bisschen sagt, aha, das eine hat einen Konstruktor, der einen Standard-Initializer-List aufruft genommen und das andere hat direkt die Iteratoren genommen und mit dem Wissen kann man eigentlich ziemlich zielstrebig die Referenzen der Standardbibliothek aufmachen und nachschlagen, was da passiert. Gut, die Frage wäre jetzt, soll ich mir abstrusen C++-Code zeigen oder weiter zu Operational Aspects gehen. Ein bisschen Hintergrund zu Cpp Insights, das basiert auf Klang und LLWM und wird von Andreas fertig gehostet und ich finde das ziemlich cool, wie er das macht, stellt nämlich den Sourcecode zur Verfügung, kompilierte Binary, ein Docker-Container und hostet das Ganze als Website und ich bin einfach gelegentlich gescheitert, das Ganze auf Scientifiklinux 7 irgendwie zu kompilieren und linken. Wahrscheinlich bin ich irgendwo an den Binutils gescheitert. Das heißt, was ich gemacht habe, habe ich in der Descript geschrieben, was nichts anderes tut als den Docker-Container von Andreas zu überprüfen, ob der läuft. Ich mache es mal ein bisschen größer. Wenn er läuft, dann wirft es die aktuelle Compilation in den Docker-Container und lässt Cpp Insights die Ersetzungen machen. Wenn er nicht läuft, wird er gestartet und das Ganze die ganze Übersetzung gemacht. Das heißt, ich habe das dann als Quasi-Compiler in meine Compiler Explorer Instance reingeschmissen. Die geht es jetzt hier zu, chain hat sich gerecht, da muss ich auch irgendwie erst drum frickelen, dass da lang die richtigen Compiler-Header gefunden hat, geht aber und dann hatte ich eben auf meiner Compiler Explorer Instance C++ gesehen und auf der anderen Seite anderes C++, um zu verstehen, was da passiert. Dann gibt es noch Linter, wie in jeder Programmiersprache Include what you use, ist einer davon, der einem Include Statements ein bisschen auch ruft. Das wollte ich auf meiner Seite verfügbar machen. Während ich daran gearbeitet hatte, hatte aber Partuff, glaube ich, daran gearbeitet, diesen Tools-Button auf godbolt.org zu gestalten, dass man da Linter wie Klang-Tidy einbauen kann. Die hat gedacht, oh, awesome, ich habe meine Include what you use Implementierung weggeschmissen, alles mit Partuff's Framework neu implementiert und das war dann auch aufgeräumt genug, dass ich das upstream konnte. Also ich bin schuld daran, dass ihr jetzt Include what you use auf godbolt.org benutzen könnt. Und die Frage war jetzt, wollt ihr kaputten C++ Code sein? Sehen? Ich hoffe nicht, denn ich verhasst bei mich wahrscheinlich. Okay, ihr wollt es sehen. Los geht's. Das hier ist ein Docker-Container, den ich damals an CRN benutzt hab. Den sollte man eigentlich ein bisschen anders starten, aber in der Generalprobe hat es funktioniert. Der ruft jetzt aus im Wesentlichen in meinem Fog von Compiler Explorer einen Make auf und tut da Dinge. Meine CPU ist hoffnungslos am Anschlag und sagt mir jetzt auf localhost240 kann ich Dinge tun. Yo! Das ist jetzt die Seite, so wie ich sie gehostet hab. Loading, loading, loading. Und das, was ich gerade erklärt hab, den Code wollte ich eigentlich live tippen. Der Browser hat ihn offenbar gecached. Das heißt, schauen wir erstmal auf den Code, was ich da so implementiert hatte. Und zwar das ist vielleicht schon durchgesickert, wir haben viel mit SIMD Code am CRN gearbeitet. Das heißt, wenn wir unsere Datenstrukturen hatten und da Zeug drin war und wir darüber loopen wollten, wollten wir auch nicht unbedingt in Schrittweise eins über die Elemente loopen, sondern vielleicht in Schrittweite 2, 4, 8 und das zu Compile Time entscheiden. Das heißt, das haben wir dadurch gelöst, dass wir zu den Strukturen, die unsere Daten einfach als Block haben, haben wir eine Iterator-Klasse, die ein Increment-Operator hat, der sich irgendwie anhand der Schrittweite richtet, wie viele Schritte der weitergeht. Unsere Datenstruktur hat eine Beginn-Methode, die getemplated ist, bei der ich abfragen kann, was soll die Standard-Schrittweite sein. Ah, jetzt weiß ich auch, worum es kompliziert, das war das Beispiel, was nicht funktioniert. Und das Problem ist, diese Iterator-Klasse, weil das ein bisschen kompliziert war, die Datenstruktur war in einem anderen Paket und wurde von Makros überhaupt geschrieben. Das heißt, wir haben da ein Makro, was Templates erzeugt, die dann irgendwo instanziert wurden. Die Datenstruktur selbst war wieder in einem anderen Paket und wieder in einem dritten Paket war mein eigentlicher Code, der so ein Datenstruktur instanziert und damit so ein Rangebase-Vorloop drüber läuft. Und ich habe halt nur diesen Code gesehen, habe irgendwo 100.000 Zeilen Code, wo drinstecken könnte, ich würde überhaupt nicht erkennen, was ist da die Schrittweite, die aufgerufen wird. Und in cpp-insights machen wir auch hier die Schrift mal ein bisschen größer, sieht man dann, wie die ganzen Tablets instanziert werden, langweilig, langweilig, langweilig. Das hier ist die Übersetzung meines eigentlichen Codes. Hier wird die Datenstruktur instanziert. Ich habe explizit ausgeschrieben, welcher Template-Parameter da reinging. Mein Rangebase-Vorloop wurde auch durch irgendwas ersetzt und da sehe ich eben die Beginn-Methode, mit Argument 1 aufgerufen. Das heißt, ich kann mir in der Stelle relativ sicher sein, hier dieser Loop läuft mit Schrittweite 1 und eben nicht mit Schrittweite 4 oder 8 oder sonst was. Dann ein anderes Beispiel, ah, warte, machen wir das doch eleganter, hier. Also cpp-insights und Compiler-Explorer sind auch voneinander verlinkt, wie ihr seht. Ein anderes Beispiel, was ich mir überlegt habe ist, wenn ich getemplated mit einem Code schreibe, dann sieht das irgendwie so aus. Ich habe eine Funktion, die irgendwas zurückgibt und ich weiß nicht was und die nimmt ein Argument und benutzt Reference-Corrupting. Das heißt, ich weiß nicht, ob hier eine R-Value-Referenz oder ein etwas per Value oder per Reference reinkommt und tut dann damit Dinge. Was möchte ich als Entwickler hier an der Stelle nur schreiben, ist das, was ich reinkriege, ein Container von Elementen oder ein Daten-Element selbst, weil ich mit den Daten irgendwas machen möchte. Also das heißt, ich brauche ein IF, kannst du erstmal was abfragt, ist das, was reinkommt, ein Standard-Vector von Float so und wenn ja, dann tue ich irgendwas, zum Beispiel gebe ich das nullte Element zurück, warum auch immer keine Ahnung, kann man ja machen und wenn nicht, dann hat mir der oder die Entwicklerin wahrscheinlich das Element schon selbst aus dem Container rausgeholt, dann kann ich damit irgendeine Modifikation machen. Sowas hier Wahrscheinlich braucht man hier noch ein paar Header, ich hoffe das funktioniert und wenn man das jetzt benutzt in irgendeine anderen Funktionen, hat man hier vielleicht ein Standard-Vector von Float und ruft meine Flubberfunktion auf und möchte Dinge tun und jetzt kompliert das nicht und was mir in der Praxis normalerweise passiert ist, dass ich an diesem Codeblock rumfrickel machen wir das mal weg, damit es kompiliert, was aber tatsächlich passiert ist und da hilft mir jetzt die Plus Plus Insights weiter, ist das Template hier, wurde gar nicht mit Standard-Vector implementiert, das heißt dieser Test hier, ob T ein Vector ist, schlägt einfach Fehl, weil die Funktion hier mit einer Referenz auf einen Vector implementiert instanziert wurde und die ständig vergesse hier StdK hätte hinschreiben müssen so, jetzt wird der andere Brunch das If-Const-Explos aufgerufen und hier dieser inaktive Code, von dem ich dachte, das inaktiv ist auch wirklich inaktiv, da kann ich dummes Zeug machen und ich konzentriere mich auf den richtigen Brunch in dem If-L Scrums gut dann noch so eine andere Sache Klangformat ganz ehrlich, meine Erfahrung aus anderen Programmiersprachen ist konfiguriert eurer Codeformat dann nicht, das ist einfach nur frustrierend auf Compile Explorer gibt es Klangformat und man kann das aufrufen mit diesen unterschiedlichen Styles, wir hatten nur unseren in-house Style und das ist eigentlich auch ganz nett Klangformat zu benutzen das Problem ist, den hatte ich nicht auf godbolt.org verfügbar, das heißt ich habe nicht eine Datei von meinem Lokal-Datei-System, öffne oder einfach schreibe und den Codeformat dann ist er wieder anders formatiert als ich es gewohnt bin und ich kann den einfach nicht lokal speichern oder ich muss mich wieder händisch selbst um den Code nochmal neu zu formatieren nachdem er eigentlich schon fertig war und das Ganze wird einfach nur noch schlimmer dadurch, dass wir im CNM mehr als ein in-house Style hatten, das heißt ich kann nicht einfach eine Klangformat-Style-Datei irgendwo in mein Datei-System legen und Klangformat hätte funktioniert und es gibt die Webseite weiß im Dropdown-Menü ist es 2 Einträge sein in der Konfig muss ich aktivieren diese 2 Styles sollen verfügbar sein und dann im Backend, was dies Formatieren handelt, kam dann dieser hässliche If-Blog dazu, der abfragt ist das unser einer Style, wenn ja dann Ruf Klangformat bitte mit Minus Style gleich Anführungszeichen, geschweifte Klammer, Access Modifier gleich auf wenn es der andere in-house Style ist die Einrückung eben nicht 2 Spaces sondern 3 Spaces und die White Spaces und die Klammern sind ein bisschen anders und wenn man irgendwie einen normalen Bild in Style von Klangformat benutzt, dann gibt das halt einfach weiter das ist so ein bisschen diminishing Returns, finde ich habe ich in dem Moment gebraucht ist sicherlich, wenn man nur schnell was aufsetzen will, eher nicht so wichtig gut und an der Stelle wird man dann greedy als ich angefangen habe, konnte man auf godbolt.org nur kompilieren und nicht ausführen wenn man das Repository gekloned hat und einen lokalen Make gemacht hat, dann ging das aber ja, man denkt, das geht das muss ich in Fullscreen machen, sonst seht ihr es nicht eben der Grund, warum wir diese gebrandeten Compiler hatten, ist dass so Standardbibliotheken halt doch irgendwie tricky sind im Beispiel habe ich einfach mal ein kleines Hello World oder Hello GPN oder Hello Push to Talk geschrieben kann das mit so einem GCC neuen kompilieren und das kompiliert dann auch sauber und gleich brauche ich den Pause-Button kompilieren mit O0, weil sonst konnte ich das den Fehler nicht reproduzieren in komplizierteren Beispielen passiert es aber auch mit Optimierung angeschaltet und das ist irgendwie so ein Fehler den viele von unseren Nutzern gesehen haben dass die Standardbibliothek aus dem Vom Betriebssystem genommen werden und dann die Glip CXX Symbole nicht richtig aufgelöst werden das heißt, ich wusste irgendwie Execution Environments richtig aufzusetzen wird harig und frickelig und das ist ja nicht nur die Standardbibliothek auch die ganzen Bibliotheken gegen die ich linken muss muss ich irgendwie ein Early Library Path reinsetzen und welcher das sind, kann ich auch sehr Compile Command Strays auch gar nicht rauslesen weil das ist Link Time spezifisch und nicht Compiler spezifisch diese Compiler Skripte Pausen ist ja auch irgendwie doof das heißt, das einzige was ich an der Stelle noch tun konnte war CMake Pausen und so sehr ich manchmal frustriert bin über CMake muss ich sagen, der Sonntag ist echt einfach um Pausa zu schreiben weil Funktionen geben nichts zurück das heißt so was wie F von G von X ist in CMake einfach nicht möglich man hat nie geschachte Klammern in der gleichen Zeile und ich habe auf godoc.org eben eine generelle Multipurpose Pausing Library gefunden daraus ein CMake Pausa geschrieben und dann mir angeschaut wie sehen denn so export.cmake-Dateien aus die in unserem Nightly Build erstellt werden, da wird einfach definiert es gibt diese Bibliothek die ist geschert und die hat folgende Properties und woran ich interessiert war ist eben diese Zeile Required Libraries die gibt an was sind die transitive Link Time Dependencies von der Bibliothek das können entweder Namen von anderen Build-Tage sein oder Pfade zu irgendwelchen Bibliotheken die deploit sind und es gibt auch an wie ist denn der Name dieser eigentlichen Bibliothek, das heißt was ich gemacht habe ist einfach über alle CMake-Export-Dateien drüber looten, alle Bibliotheken die es gibt einsammeln, schauen ob in all diesen Bibliotheken die ich habe alle Namen von Dependencies definiert sind hab dann auch rausgefunden, dass man fragen kann, was ist eine Standard Bibliothek und hab dann ein bisschen Text Replacement gemacht für jeden Bibliothek-Namen einen Compiler-Eintrag gemacht, der sagt minus WLA-Path das eben in jedem Binary was ich erzeugt hartgecoded ist, wo die Bibliotheken nachgelesen werden müssen, sodass ich mich nicht um LD Library Path oder so ein Grams kümmern muss das ist ein Go Executable was ziemlicher Spaghetti Code ist der eigentlich interessante Teil ist wie habe ich das auf die Compiler Explorer Extance eingebettet ich habe so ein Fake Compiler generiert das ist tatsächlich die Konflikt wie sie im Betrieb war, die liegt auf GitHub einfach als Backup und gesagt dieser Compiler Fuss der soll so kompilieren und linken wie wir das im Fussprojekt machen und da hängen eben in einem Aufruf ziemlich viel minus WL und minus L Direktiven drin damit das richtig linkt der Ferneshalber muss ich sagen soweit ich das gesehen habe bei Compiler Explorer Master wird auch das inzwischen aufgeräumt das geht also wahrscheinlich wenn man das heute macht einfacher und eleganter so viel dazu ich habe das dann auch ausprobiert das C++ hier ist glaube ich ein bisschen aufwendig zu erklären der springende Punkt war einfach nur ich habe eine Int Main definiert auf meine eigenen Instanz so gesehen der Code wird ausgeführt und er crasht nicht juhu ich bin froh und dann war die Frage teile ich das mit meinen Kollegen und der clickbaity Titel meines Vortrags war Anfangs Remote Code Execution as a Service denn mir ist aufgefallen wenn ich diesen Port im Netzwerk freigebe was dann tatsächlich passiert ist jeder in meinem Netzwerk kann auf mein Port 10.240 gehen da hat sie ein Code eingeben und dann Code ausführen als ich auf meinem PC und in dem Server von damals auch ohne irgendein Firejail oder Docker Environment das ist doch irgendwie eher uncool das heißt was ich gemacht habe ist eine VM irgendwo auf cern OpenStack gestartet die hoffentlich möglichst isoliert ist habe da ein SystemD Unit geschrieben die sobald Netzwerk verfügbar ist Make im richtigen Directory aufruft CompilerExpo selbst benutzt diese Supervisor Library die nachschaut ob sich die Konfiguration ändert und wenn sich die Konfiguration ändert einen fliegenden Neustart macht das war also ziemlich cool das heißt ich habe in einem Cron Job einfach mein Go binary was nach NightlyReleases sucht laufen lassen und wenn neue NightlyReleases da waren einfach die Konfig neu geschrieben und Supervisor kümmert sich darum den Web Server neu zu starten und schon ist die neue Konfig verfügbar und wenn nichts Böses passiert wollte ich dann natürlich keine Git Credentials liegen lassen d.h. da lief lokal nur ein Cron Job der Git Add, Git Commit macht aber keinen Push und auf einer zweiten VM die ich tatsächlich produktiv mit meinem echten Nutzer Account benutze lief halt ein Git Pull und Git Push d.h. solange Git keine Code Injection zulässt habe ich mir gedacht bin ich da relativ sicher dass ich kein malicious Code irgendwo ausführe mit User Credentials und so das ganze Setup führt aber halt dazu dass zwischen Nightly Build ist auf dem Netzwerk verfügbar Cron Job läuft erstellt die Konfig Cron Job läuft macht ein Git Commit Cron Job läuft macht ein Pull und Push bis in eine neue Konfiguration auf GitLab auftaucht ging halt mal so locker 2 Stunden rum d.h. richtig Low Latency war das nicht dann habe ich das ein paar Kollegen gezeigt und wollte mit denen kooperieren natürlich wollte ich das nicht einfach zu ins öffentliche Netzwerk hängen d.h. ich habe erstmal den Standard Port in IP Tabels zugenagelt und gesagt Leute wenn ihr das nutzen wollt müsst euch rein SSR tunneln d.h. wenn ihr zu Hause ist seid müsst ihr erstmal ins Zernnetzwerk rein Port Forwarding machen dann vom Zernnetzwerk aus auf meine Machine Port Forwarding machen und dann den Port 10.240 auf irgendeinen bei euch auf Local Horst ummappen und dann könnt ihr bei euch auf Local Horst und da habe ich eben keine Zernnutzer-Accounts genommen sondern Wegwerferaccounts für jeden erstellt und gesagt bitte, bitte legt keine wichtigen Informationen auf die Maschine oder irgendwas bei denen euch wehtäugt wenn es wegkommt an der Stelle stellt sich dann raus Kollegen die sich mit Zeug auskennen sind echt unersetzlich und total awesome haben gesagt hey nutz doch Zern Single Sign-On für das ich meinte hey nee ich baue jetzt in den Node.js Server nicht irgendwie Single Sign-On ein ich meine nee nee es gibt Apache Reverse Proxy ich keine Ahnung was das ist und die ja da macht Apache einfach bei dir auf Port 80 ein Port auf und leitet den ganzen Traffic intern auf Port 10.240 um das heißt Compiler Explorer denkt der Traffic kommt von Local Horst von außen erreicht man Port 80 und für Apache gibt es fertige Konfigurationen die du einfach copy und pasten kann wie man mit Single Sign-On redet und da gehen dann Credentials in die Schiene der Single Sign-On sagt er einfach nur ja der Nutzer ist autorisiert das ganze ist dann immer noch nur aus dem Zern Intern Netz verfügbar ist ein bisschen doof weil ich damit Kollegen die an externen Unis sitzen ein bisschen diskriminiere ist aber glaube ich vom Sicherheitsabspekt sehr sinnvoll weil man Leute wie mich nicht einfach so irgendwelche Web-Server betreiben lassen sollte das heißt was hätte da noch irgendwie schief gehen können zum einen der Externe Nutzer konnten halt wegen dem Port Forwarding beim Link Sharing nicht richtig mitmachen auch der Single Sign-On schneidet das Link Sharing manchmal ab und ich habe tausend Leuten eine Möglichkeit geben auf der vor allem irgendwie Code auszuführen das heißt und die hatten auch Schreibrechte auf wie der Web-Server aufgesetzt war die hätten da Bitcoin meinen können oder Malware auf die Webseite injecten können ich glaube die also ich meine die wissen ja alles dass das unsere eigenen Ressourcen sind die wir teilen und damit arbeiten müssen das heißt wirklich bösen Intent habe ich nicht erwartet sondern höchstens gedacht dass man versehentlich was kaputt macht aber ganz ehrlich ich hatte keinen Logging wenn da jemand böse Dinge getan hätte wäre ich voll darauf angewiesen dass der Single Sign-On-Server Logging macht ein anderer Security-Aspekt weswegen das auch noch wichtiger ist dass die Firewall in die Maschine abgeschirmt hat war ich habe nicht ganz verstanden wie auf SerenVM der Updater funktionieren soll denn es schippt irgendwie mit einer NordJS-Version die ist zu altem Compiler Explorer laufen zu lassen NordJS mantained eine Long-Term-Support-Version die läuft auch auf Scientific Linux die habe ich installiert nach Anleitung aber jedes mal wenn der Security-Updater also nicht Yam, sondern irgendein selbstgeschriebenes Paket ankam und gemeint hat Security-Updates zu installieren, wird mit die NordJS-Version downgraded wenn ich das jetzt für den Produktiv-Einsatz gemacht hätte und ernsthaft gemacht hätte ich wahrscheinlich ein Ticket und ein bisschen diskutieren, Support einholen und ein bisschen interessiert so habe ich gesagt, nee ich will, dass das jetzt funktioniert und Security-Updates deaktiviert Leute, machte das nicht nach bitte und dann kam irgendwann der nächste Kollegen an, hat das gesehen und gesagt, hey, es gibt OpenShift OpenShift für Leute, die wie ich das nicht kannten ist, man tippt irgendwo ein Fahrt zu einem Docker-Image ein, dann passieren Cloud-Dinge und plötzlich fängt ein Web-Service im Internet und im Self-Service-Anzernen kann man da auch irgendwie anklicken, aktiviere Single-Sign-On Mount, das Cernvirtual-Maschinen-Filesystem und so weiter, und das ist dann aus dem Internet erfügbar, weil Docker offenbar Dinge gut genug abregelt das heißt, ich dachte, super da kann ich den Single-Signern nicht falsch konfigurieren das mache ich, ich muss einfach nur das komplette Compiler Explorer-Setup in ein Docker-Container reinpacken das ganze war ein bisschen lästig weil Docker-Image-Bild unterstützt keinen Mount von CWMFS das heißt, meine GitLab Pipeline muss zwei Schritte machen, einmal alles C++-spezifische bauen und dann den eigentlichen Docker-Container bauen dazu kommt dann auch irgendwie dass ich nicht experimentieren wollte mit Docker in Docker, das heißt, ich musste doch das Beine von Andreas fertig benutzen und habe festgestellt, dass Ubuntu andere LLVM-Versionsnummern benutzt als Scientific Linux das heißt, da musste ich irgendwie zu Recht bild-frickeln dass CPP Insights die richtigen Standard-Librators findet ist aber machbar dann kommt dazu, dass ich ja meine Konfig im Wesentlichen über Git-Geschert habe und ein Git-Pull von Docker-Image-Bild über den Bildcash abgefangen wird das heißt, da muss ich noch ein bisschen hacken, dass der Bild auch wirklich stündlich neu passiert und das lief dann ein Problem war so ein bisschen dass mein Ramquoter nicht ausgereicht hat, um 2 Docker-Images gleichzeitig laufen zu lassen und normalerweise unterstützt OpenShift dass wenn neue Versionen von irgendwas reinkommen erst ein neuer Container gestartet wird, dann wird der URL-Redirect umgelegt, dann wird der alte abgeschaltet diese ganze WebKit-Geschichten die bei einem Make von Compile Explorer standardmäßig laufen, die brauchen einfach tierisch viel RAM, das heißt bei so einem Neustart das schauen wir uns jetzt nicht an hatte ich halt irgendwie 5 Minuten Down-Time und einmal die Stunde 5 Minuten Down-Time war mir dann doch zu viel da kann ich nur sagen, der Support zu Compile Explorer in Select Channel ist echt goldwert die haben mir da sehr geholfen zu erklären wie Webpack eingerichtet ist wie sie das in Production benutzen dass ich das in der Build Stage schon alle Notabhängigkeiten auflösen kann und Webpack machen kann und dann in der Deploy Stage nur aus dem Webpack Directory hosten muss und bin damit auf 2 Minuten Restart-Time runtergekommen und auch deutlich weniger RAM-Usage das heißt ich hätte Continuous-Deployment machen können also echt super man muss ein bisschen dran frickeln, also dadurch dass das ganze von Docker-Images läuft hat man keinen persistenten Speicher im Docker-Container man kann auf OpenShift persistenten Speicher einrichten das hat halt auf einer VM Out of the Box funktioniert ist halt gefrickel wenn man das ordentlich hosten will ist das sicherlich Zeit, die es wert ist da zu implementieren wie gesagt ich hatte überhaupt kein Monitoring also kein Wichtiges, das einzige was ich hatte war dass GitLab ja Activity Monitoring hat und diese stündlichen Commits da im Activity Lock auftauchen im Rückblick, was waren die Downtimes einmal habe ich versehentlich meine Binarys gelöscht uns erst eine Woche später gemerkt einmal hat sich die Verzeichnissstruktur in unserem Deployment geändert und ich habe es 2 Monate später erst gemerkt und einmal haben wir Standard-Compiler gewechselt und ich habe die Wildcard nicht richtig ausgetauscht das war auch irgendwie ein bisschen doof bevor ich zum Schluss komme ein Rückblick ist, ich hatte glaube ich insgesamt nur 5 Nutzer alle heterosexuell, weiß männlich und vom CERN angestellt das heißt genau die Leute die provilligiert sind, die wenn es C++ Probleme haben auch einfach über eine Fluss zum Core-Developer laufen können ich habe da ein Tool für Leute gemacht die eh schon den besten Support im Team haben das ist irgendwie nicht so cool es war ganz angenehm das Projekt so zu gestalten, weil es Leute waren mit denen ich eh ständig Kaffeepausen hatten, das heißt ich hatte ein gutes Verständnis was deren Use Cases sind und wir hatten schnelle Iterationszügel wie man Feature ausrollt ich glaube aber Analysten die jetzt nicht Software für nächstes Jahr geschrieben haben sondern die Daten der letzten 10 Jahre Herzernbetrieb analysieren die haben andere Workflows andere Constraints in denen sie arbeiten müssen wenn die Software patchen müssen sie doch achten, dass die Symbole in den Libraries diese bauen genauso heißen wie in der Deployed Software damit sie da bei Library Load Time richtig Referenz haben ja das heißt das war eigentlich eine verpasste Chance auszufinden wie man Compiler Explorer noch besser nutzen kann und auch ein Tool für Leute zu geben die in anderen Zeitzonen sind die einfach in Australien sitzen und die erste Hälfte ihres Arbeitstages keinen Support im Chat bekommen können weil der Support gerade schläft ja, Live Demo ich glaube das lassen wir anbetratzen dass ich vorher so ausführlich war aber bop andere Motifikationen es gibt farbenblende Menschen ich wollte das, wenn jemand einen Screenshot macht auf jeden Fall der Screenshot Colorblind Compatible ist deswegen habe ich die Standardpaletten deaktiviert auf meine Instanz alle Screenshots sind Colorblind Friendly das ist eine einfache Konfiguration wenn man das ganze professionell machen will sollte man wahrscheinlich an vielen Ecken noch arbeiten um den Delay-Zyklen von 2 Stunden bis ein Container aktualisiert ist besser dazu haben aber ja ansonsten war das glaube ich schon ein nutzbares Projekt ganz ehrlich, ich habe inzwischen einen neuen Job, ich werde nicht viel Zeit in den Support stecken können ziemlich viel, was ich geschrieben habe ist hardcoded auf unseren Zernsoftware-Stack bis auf dieses eine Binary was die JSON-Datenbanken liest das habe ich hier upstream in diesem Issue erklärt wie man das benutzt ich kann wahrscheinlich auch da wenig Support zu geben aber es fänds echt cool, wenn das irgendjemand benutzt und das irgendjemandem weiter hilft inzwischen arbeite ich mit dem Robot Operating System und es hat Out of the Box einfach funktioniert ja ansonsten, wenn ihr Fragen habt auf Social Media bin ich glaube ich schlecht zu erreichen vielleicht ist das einfachste, wenn ihr auf diesem GitHub Repository einfach ein Issue feilt und dann können wir da diskutieren ansonsten, wer ist das von mir so weit? dein erst mal vielen Dank für deinen Vortrag ich fand es so interessant was mich persönlich brandinteressiert würde ist du hast gesagt du wirst nicht viel Zeit drin haben, hast du da Lust drauf? ja, schon aber ich meine, der Tag hat nur 24 Stunden während der Arbeitszeit muss ich mich darum kümmern, dass unser Roboter keiner Menschen überfährt und ansonsten habe ich auch noch ein Privatleben also in der Zeit also wenn ich irgendwie gelangweilt zu Hause auf meinem Rechner rumnöre kann ich mich da gerne darum kümmern aber ich kann da keine Versprechen abgeben wie viel Zeit das sein wird die Menschen ihr wisst ja ihr könnt im Pad Fragen stellen zum Vortrag, ihr könnt gern Feedback geben zum Vortrag das findet ihr immer verlinkt im Pre-Talks in der Beschreibung des jeweiligen Talks so dass ihr dann dazu Details kommt und noch mal eine Frage reinschmeißen könnt traurigerweise finde ich gerade weder eingetragene Fragen noch Feedback zum Vortrag meine große Bitte wenn ihr den Vortrag jetzt live geliebt oder wenn ihr den später als Aufzeichnung guckt seid doch so gut und schreibt doch mal wie hat es euch gefallen, handelt ihr Spaß dran was fand ihr interessant würdet ihr euch vielleicht zu dem ein oder anderen doch mal mehr an Informationen oder an weiteren Details wünschen Pauli ich weiß nicht, hättest du sonst Motivation das vielleicht noch mal auf einer GPN oder MCD aufzubereiten falls da jetzt viele Rückfragen kommen ja also muss ich mal schauen, die Frage wäre halt was interessiert für mich an den Rest der Chaos Community also ich hatte ja so heute Morgen so eine kleine Live-Demo geplant und da riesig Lampenfieber das könnte ich vielleicht ein bisschen üben oder ich meine das C++ Beispiel was ich gezeigt habe war stark vereinfacht da könnte ich vielleicht auch ein paar versuchen noch ein paar Real-Life Examples zu reproduzieren oder keine Ahnung, andere Details über die ich ziemlich schnell gegangen bin ich bin da offen, wenn Interesse an irgendwas ist was hier zu kurz kam keine einfache Wiederholung dieses Vortrags kann ich gerne irgendwann mal machen zumindest mal ein Feedback-Boss, toller Vortrag vielen Dank, schöne Mischung aus Live-Demos und Folien, das sehe ich genauso und von der Nervosität hat man ich nichts gemerkt, Suspekt in dem Sinne vielen vielen Dank für deinen Vortrag dann kann die Organisatoren uns kontentieren und die Moderation und das Vogue alles aufzusetzen habe ich sehr gerne gemacht, hat super funktioniert