Freitag, 21. September 2012

rubygems file_split

Im Zuge eines Massen-Imports von SQL Daten haben wir dieses gem entwickelt. Damit kann man via Ruby-Modul als auch via Befehlszeile (mittels GLI gem) grosse Dateien in mehrere kleine aufteilen.

Das Modul FileSplit beinhaltet die Klasse FileSplitter mit folgendem Aufbau:
  • source (required, gli alias: -s): Die Quelldatei
  • target (required, gli alias: -t): Die resultierenden Dateien werden nach diesem Muster #{basename(target)}_n.#{extname(target)} gespeichert.
  • lines (default: 1000, gli alias: -l): Die Aufteilung erfolgt anhand der Anzahl Zeilen. Es kann ein Maximum von Zeilen festlegt werden.
  • maxlines (default: 0, gli alias: -m): Die Maximal-Anzahl der zu splittenden Zeilen.
  • header (default: 0, gli alias: -h): Anzahl der Zeilen in der Quelldatei, die den Header ausweisen, wird in jedem Target wiederholt.
  • footer (default: 0, gli alias: -f): Anzahl der Zeilen in der Quelldatei, die den Footer (also letzte n Zeilen) ausweisen, wird in jedem Target wiederholt.
Bei der Verwendung via Befehlszeile müssen die Optionen in den global Variables eingegeben werden, also noch vor dem Befehl split:

lib/file_split -s /in/source.sql -t /out/split.sql -l 2000 -h 2 -f 1 split

Als Modul:

FileSplit.start "/in/source.sql", "/out/split.sql", 2000, 0, 2, 1

Link zum gem: http://www.rubygems.org/gems/file_split

Montag, 9. Januar 2012

3D-Animation mit WebGL

Dieser Post zeigt wie man im Browser eine 3D-Animation mit WebGL programmieren kann. WebGL ist eine Mischung zwischen JavaScript und OpenGL. Der Vorteil davon ist, dass die Berechnung der Bildbearbeitung auf der Grafikkarte passiert und dadurch performanter ist. Weil WebGL eine relativ neue Technologie ist, gibt es auch einige Einschränkungen, welche beachtet werden müssen:
  • WebGL läuft nur auf Browsern, welche HTML5 unterstützen
  • Im IE ist WebGL nicht implementiert, es gibt jedoch ein kostenpflichtiges Plugin (http://iewebgl.com/) um dieses Problem zu beheben
  • Auf dem Client ist eine Grafikkarte die OpenGL unterstützt erforderlich
Wir programmieren einen 3D-Würfel mit einem Logo, welcher mittels der Maus um sämtliche Achsen gedreht werden kann. Das Resultat kann hier betrachtet werden. Im folgenden werden einige Aspekte angeschaut, Details können dem Blog Learning WebGL entnommen werden.

Shaders

Shader sind Miniprogramme, welche direkt auf der Grafikkarte ausgeführt werden um eine Grafik zu berechnen. Für jede WebGL Grafik gibt es zwei Shaders, ein Vertex-Shader und ein Fragment-Shader, welche in der Sprache GLSL geschrieben werden. Um Berechnungen durchzuführen wird als erstes der Vertex-Shader aufgerufen. In diesem werden die einzelnen Koordinaten (Vertices) mit einer Matrize multipliziert um die Positionen einer 3D-Grafik in Pixel zu berechnen. Der Output dieser Berechnung wird dem Fragment-Shader übergeben, welcher die einzelnen Punkte linear interpoliert um die 3D-Grafik als Ganzes darzustellen. Dieser Abschnitt ist keine Definition, sondern beschreibt nur den Ablauf des Renderings auf einem sehr abstrakten Level!

Vertex

Vertex oder in Mehrzahl Vertices sind Koordinaten von einzelnen Punkten in einem 3D-Koordinatensystem mit einer X-, Y- und Z-Achse. Diese dienen dazu, Objekte auf einer Leinwand (Canvas) zu positionieren. Jeder 3D-Grafik besteht aus n Vertices, welche ihr aussehen beeinflussen.

Aufbau des Programms

In ein HTML-Dokument wird ein canvas eingebettet, welches seit HTML5 zum Funktionsumfang gehört. Deshalb muss der Browser HTML5 unterstützen um WebGL-Objekte darstellen zu können.

Beim laden der Seite wird die JavaScript-Funktion webGLStart aufgerufen, welche dafür verantwortlich ist, dass das canvas mit der 3D-Grafik angezeigt wird. In dieser Funktion werden nacheinander die Funktionen initGL, initShaders, initBuffers, initTextures und tick aufgerufen.

Die Funktion initGL überprüft ob WebGL auf dem Client unterstützt wird und füllt im Erfolgsfall das GL-Objekt ab. In der Funktion initShaders werden die Shaders kompiliert und an das GL-Objekt angehängt. In initBuffers werden die Koordinaten für das Objekt in ArrayBuffers gefüllt und dem GL-Objekt angehängt. Dasselbe geschieht in initTextures mit den Textures. Textures sind Bilder, welche auf die 3D-Grafik gelegt werden.

Die tick-Funktion wird in einer Endlosschleife (requestAnimFrame) aufgerufen und zeichnet die Grafik mittels drawScene neu auf den Bildschirm.