WebAssembly und Limboole im Browser

Man stelle sich einmal vor, C Programme im Browser auszuführen. Jetzt die gleiche Vorstellung, nur ohne nervige Backends oder andere Probleme. Das ist mittlerweile möglich!

Okay, ich gebe zu – WebAssembly hat über die Jahre stark an Faszination verloren und ist mittlerweile einfach nur ein weiterer Bestandteil des Werkzeugkastens des WorldWideWeb, aber dennoch ist die Möglichkeit, direkt im Browser mit ehemals reinen Konsolenanwendungen zu arbeiten faszinierend. Ich habe mir diesen Sonntag die Frage gestellt, was mit dieser Technologie eigentlich noch alles so möglich ist, woraufhin ich nach einem kleinen abgeschlossenen Projekt gesucht habe, das vielleicht nicht ganz in der Leere steht. Gekommen bin ich auf den alten Propositional Logic Parser & Solver-Anbinder Limboole. Und entstanden ist Limboole on the Go.

Beispiel für Limboole on the Go fürs Debuggen von Hardware (okay, es ist nicht die GPU, nicht HDD, nicht … – okay, die CPU ist kaputt!)

Dieses Projekt wurde möglich durch kleine Veränderungen im Source-Code von Limboole, die weg von STDIN handling und hin zu einem einfachen const char* Parameter als Input gehen. Das Verarbeiten von STDIN im Browser hat bei mir weiterhin zu Problemen geführt, ich glaube das ist nicht der gedachte Use-Case für das Standard-Binding von Emscripten. Mit dieser Änderung wird nun aber der Code direkt heruntergeladen, in den Browser gespielt und über eine einfache Oberfläche ausführbar. Das ganze ging am Ende so gut, dass ich noch eine Verlink-Option eingebaut habe, mit der man automatisch auf beliebige Inputs und Modi verlinken kann – diese Links werden automatisch in der Adresszeile generiert, wenn man ein Problem lösen lässt.

Insgesamt bin ich also mit diesem kleinen Projekt aus der Rubrik „Hacking am Sonntag“ ziemlich zufrieden. Solche kleinen abgeschlossenen Projekte sind immer wieder schön als Ausgleich zu long-running Herausforderungen, wo man nie wissen kann, wann (und ob…) man damit fertig wird. Ich hoffe, andere können dieses Projekt auch verwenden und haben Freude an Propositional Logic!

Paracooba: Multi-Core Distributed Multi-Problem Cube-And-Conquer SAT-Solver

Nach einem Jahr harter Arbeit, können meine Kollegen vom FMV und ich nun Stolz den SAT-Solver Paracooba präsentieren! Er verteilt beliebig viele Probleme automatisch an alle anderen Instanzen im lokalen Netzwerk und erreicht über einen Cube-And-Conquer Mechanismus höhere Geschwindigkeiten durch parallelisiertes Lösen von SAT Problemen.

Um das alles gut darzustellen, haben wir ein Paper geschrieben, welches in den Proceedings der SAT2020 Konferenz veröffentlicht wird. Außerdem gibt es noch einen 2 minütigen Pitch-Talk und eine vollständige Präsentation, die zusammen mit den Slides hier zu finden sind. Auf YouTube ist die Präsentation ebenfalls hochgeladen.

Die Präsentation hat den Best Presentation Award gewonnen!

Ich freue mich schon, weiterhin an diesem spannenden Projekt arbeiten zu können und von euch zu hören!

Liebe Grüße,
Max

Neo4J und Graphenbasierte Datenbanken mit NoSQL Cool-Aid

Neo4J sieht nach einer interessanten Lösung für Datensätze aus, die starke Verknüpfungen untereinander aufweisen. Wenn man beispielsweise komplexere Strukturen in Datenbanken speichern möchte, hätte man in der relationalen Welt eine riesige Sammlung aus Verbindungen in den Tabellen. Das würde mit vielen JOINs zu langsamen Antworten führen. Mit graphenbasierten Datenbanken werden aber intern andere Trade-Offs gefahren, womit hochgradig verbundene Datensätze besser verwaltbar werden. Dabei wird aber nie auf die Garantien hinter ACID verzichtet, was diesen graphenorientierten Weg äußerst spannend macht.

Beispiel-Graph mit Filmen und Schauspielern

Diese Ansätze könnten für eine Idee die ich derzeit verfolge spannend werden. Statt alles in Datenreihen zu speichern oder sich mühevoll eine eigene Repräsentation zu basteln, die das alles persistiert, könnte ich auf diese bereits bestehende Infrastruktur aufbauen und um die Ergebnisse eigene Engines basteln, die diese Daten direkt konsumieren. In lese also komplexe Daten, führe Pattern Matching und Normalisierungs-Algorithmen darauf aus, speichere alles in die Datenbank und gehe zum nächsten Datensatz. Am Ende kann die Datenbank dann das erste Glied zum Auslesen der Daten werden, die dann über eine Client-Anwendung wieder transformiert und präsentiert werden.

Generell kann man mit derartigen Ansätzen also auf die eine allmächtige Datenbank die alle Daten in der aktuellsten Version ohne Redundanzen in der n+1ten Normalform speichert vergessen. Stattdessen bastelt man sich Applikationen mit Flows, die über Zeit die Daten/Änderungen in die letzten Ecken des Stacks propagieren. Bei manchen Anwendungen (Suchen und großen Indices) sollte das auch kein zu großes Problem darstellen.

Zusammenfassend bin ich also schon jetzt neugierig, wie ich diese „Neuerungen“ in meine zukünftigen Entwicklungen einbauen kann und ob ich das alles gebrauchen kann. Der typische Ratschlag von „No matter what, go relational and do fancy things later!“ kann bei solchen Paradigmenwechseln glaube ich auch mal ignoriert werden. Und wenn Speicherplatz eh billig ist, kann man auch alle Daten einfach parallel in eine relationale und eine graphenbasierte Datenbank schreiben, damit im Falle eines Ausfalls die relationale Datenbank als absoluter Safespace einspringen kann und den Rest des Stacks wieder befüllt. Vermutlich gibt es massenhaft Nachteile die man erst bei der Benutzung erfährt (unvorhersehbare Query-Performance, RAM Vorraussetzungen, …), aber Offenheit zu einer kombinierten Nutzung von z.B. PostgreSQL und Neo4J könnte am Ende zu einem Vorteil führen bei Anfragen, die zu dem jeweiligen System passen.

Vielleicht kann so etwas ja einer Leserin oder einem Leser helfen! 🙂

LG,
Max

OpenGL Injektor nun veröffentlicht!

Hochgeladen auf GitHub

Ich habe bereits einige Male über dieses Projekt geredet weil es mich weiterhin fasziniert, dass etwas derartiges möglich ist: Man kann sich (in diesem Fall unter Linux, aber eigentlich generell) beliebig in andere Programme hängen, Funktionen überschreiben und auf diese Weise den OpenGL Context stehlen und mit eigenen Bildern erweitern! Aus Interesse entstand ein Projekt, um sich in OpenGL Programme einzuklinken und eigene Daten anzuzeigen, die über die Grafikbibliothek Cairo gerendert werden sollten. Es sollten in diesem Ansatz beliebige Grafiken möglich werden, was mit dieser Grafikbibliothek auch sehr gut möglich geworden ist.

Der Rendering-Lag ist zwar etwas hoch, da nichts tiefer für diese Proof-of-Concept Arbeit optimiert wurde, aber dennoch ist diese Variante, sich in andere Programme zu hängen, eine spannende Möglichkeit. Später kann man diesen Ansatz natürlich auch noch erweitern, falls sich andere Möglichkeiten auftun.

Ich hoffe, jemand findet die Möglichkeiten hinter derartigen Tricks ebenfalls interessant und kann etwas mit diesem Projekt anfangen!

Liebe Grüße,
Max

CMake Templates veröffentlicht auf GitHub

Ich habe in den letzten Sommerferien zwei kleine CMake Templates geschrieben, die eine Vorlage zur Verwendung dieses Build-System Generators für noch unerfahrene Programmierer/Innen liefern soll. Wenn man CMake verwendet, verschafft man sich ohne viel Aufwand viele Möglichkeiten, die man nicht außer Acht lassen sollte. Die wohl größte Möglichkeit ist die vollständige Integration in IDEs wie dem Qt Creator, welche die Entwicklungserfahrung von C/C++ Code stark verbessern können.

Da ich mir jetzt gedacht habe, diese Vorlagen könnten anderen Leuten ebenfalls sehr nützlich sein, habe ich sie jetzt auf GitHub unter der MIT Lizenz veröffentlicht! Ich hoffe, jemand findet Nutzen und Spaß an dem kleinen Projekt und, dass es anderen Lernenden helfen kann, etwas mehr in die alte Welt von C/C++ Native Programming hineinzukommen.

Viel Spaß also mit dem Projekt und viele Grüße,
Max