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!

Computer Graphics Animation: Free Radicals; Return Of The O2!

Nach einem Semester voller aufregender Aufgaben und noch aufregenderen Deadlines neigt sich mittlerweile wieder alles dem Ende zu. Dieses Semester sind sogar einige schöne Dinge dabei entstanden, die visuell präsentierbar sind, unter anderem diese kleine Animation mit dem Namen „Free Radicals, Return Of The O2!

Diese Animation wurde im Rahmen der Übung zur LVA „Computer Graphics“ im Bachelorstudium der Informatik an der JKU Linz erstellt. Leider (oder zum Glück, da die Deadline dennoch existierte), musste man ein fertiges Framework verwenden, das die Übungsinhalte möglichst genau abbildet. Dieses Framework funktioniert im Normalfall sehr gut, sobald man aber etwas anderes machen will, kämpft man wie so oft einige Zeit lang, um alles so zu machen, wie es sich das Framework vorstellt. Am Ende hat dann aber dennoch alles funktioniert und diese kleine Animation konnte in enger Teamarbeit mit Simone Atzwanger entstehen.

Die Story

Viele Jahre lang waren die radikalen Sauerstoffatome gefangen. Nie konnten sie so herum fliegen wie sie es wollten. Doch nachdem sie ein Raumschiff entwickelt haben, wuchs ihr Hunger auf Freiheit plötzlich rasant an – die Maschine wurde aktiviert, der Motor hochgefahren und die Reise konnte beginnen! Auf dem Weg begegneten sie vielen Gefahren, verloren sogar knapp ihren rechten Scheinwerfer. Kurz vor dem Versagen ihres Raumschiffes schafften sie es aber dennoch, sicheres Land inmitten eines weiten Ozeans zu erreichen. Bei wolkenlosem Himmel begannen sie ihren Anflug, landeten und feierten ihre neu gewonnene Selbstbestimmung. Die Radikale sind wieder Frei!

Die Technik

Alles basiert auf dem oben genannten WebGL Framework, welches nicht verändert werden sollte. Ein Template wurde bereitgestellt. Durch die Mithilfe von Manuel Pöll konnten wir gute Typisierungsinformationen erhalten, wodurch die Entwicklung leichter wurde. Um die Animationen und die verschiedenen Szenen umzusetzen, entstanden unter anderem:

  • ein einfaches Animationsframework (Max),
  • eine Szenenverwaltung mit genauen Timings (Max),
  • viele Objekte und Texturen (sowohl manuell als auch aus Blender) (Simone) und
  • zusammengeführte Objekte mit getrennt animierbaren Teilen (das Raumschiff und die O2 Atome)(Simone)

Was hätte alles besser laufen können

Wir hätten gerne mehr gemacht und vielfältigere Effekte eingebaut! Leider ist der Zeitdruck trotzdem die hauptsächliche Limitierung, daher konnten wir nicht noch mehr dazu basteln. Wir hoffen dennoch, dass diese kurze Animation spannend ist und wünschen allen viel Spaß beim Ansehen!

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

Script zum automatischen Testen eines Programms mit festgelegten Inputs und Outputs

Um in Systems Programming automatisch Tests der letzten C Exercise durchführen zu können, wurde ein kleines Script praktisch, welches automatisch die eigene Binary für alle input.txt Dateien überprüft. Man legt es neben zwei Ordner namens „input“ und „output“, welche die passenden Dateien für die Tests beinhalten (wie im gegebenen Beispielordner)

# Aufruf
./test.sh build/minesweeper

Das Script ist hier in einem eigenen Gist enthalten, im folgenden als Auszug dabei und als Archiv auch als Datei an diesen Artikel angehängt.

#! /usr/bin/env bash

# This test script tries all inputs and compares them with
# their respective outputs. Supply it with
# the name of the executable.

name=$1

# Color Constants
SUCCESS_COLOR='\033[0;32m'
ERROR_COLOR='\033[0;31m'
NO_COLOR='\033[0m'

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"

if [ "$#" -ne 1 ]; then
    echo "Must supply path to minesweeper executable!"
    exit
fi

if [[ ! -x "$name" ]]; then
    echo "The file must be the executable!"
    exit
fi

echo "Running tests for binary in \"$name\"."
echo "Path of tests: \"$DIR\""

for file in $DIR/input/*.txt; do
    testname="${file##*/}"
    outputname="${testname/input/output}"

    expected=$(cat $DIR/output/$outputname)
    result=$($name $file)

    (diff <(echo "$result") <(echo "$expected") && printf "${SUCCESS_COLOR}Test in $file ran successful! $NO_COLOR \n") || printf "${ERROR_COLOR}Test in $file failed! $NO_COLOR\n"
done

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