Cover Image

Ist das Kunst oder kann das weg?

Shadertoy - shading online

April 11, 2021 - Lesezeit: 3 Minuten

Shader sind Bausteine einer Grafikkarte, mit der der Pixel, der auf den Bildschirm angezeigt werden soll, nachbearbeitet werden kann. Jeder Pixel wird hierbei durch eine Pipeline geschoben und kann dabei sozusagen nochmal nachgearbeitet werden. Dieses Post Processing kann Wasser realistischer aussehen lassen oder Lava zusätzlich zum glühen bringen. Diese Shader werden mithilfe einer eigenen Programmiersprache implementiert. Dazu schreibt man einen Shader und lädt diesen dann in die Grafikkarte. Meistens nutzt man dafür eine Api wie OpenGL oder DirectX.

blub.png

Nun kann man sich natürlich die Erzeugung eines Bildes zum Anzeigen und Nachbearbeiten auch sparen und einfach direkt die Pixel manipulieren und damit dann eine Bildschirmausgabe erzeugen. Da der Shadercode immer auf jeden einzelnen Pixel auf dem Bildschrim angewendet werden muss (das sind bei einer HD-Auflösung 3000 Pixel pro Frame), muss die Implementierung effizient sein. In der Demoszene hat sich eine ganze Disziplin daraus entwickelt. Da das Manipulieren von Pixeln am einfachsten ist wenn man es mathematisch beschreibt, kommt man bei der Programmierung um Mathe nicht drum herum. Aber dafür wird man mit hinreißenden Bildern und Effekten belohnt.

penrose.png

Auch ein Browser kann mithilfe von WebGL entsprechende Inhalte repräsentieren. Damit kann man die Shader direkt in eine Website laden und anzeigen. Entsprechende Hardware vorrausgesetzt. Auf Shadertoy wird genau das möglich. Man kann die fertigen Shader sogar in die eigene Homepage einbetten. Auf dieser Website kann man sich auch den Quelltext jedes Shaders ansehen und gegebenenfalls sogar noch etwas lernen. Mathe hat noch nie soviel Spass gemacht.

IO.png

Wenn man mal sehen will, was mit aktuellen Grafikarten machbar ist und sich verzaubern lassen möchte, sollte man mal einen Blick riskieren. Also ich werde jetzt nochmal meine Mathekenntnisse auffrischen und auch ein bisschen zaubern.


Cover Image

Alle Teiler einer Zahl

Mathe in JavaScript

März 12, 2021 - Lesezeit: ~1 Minute

Mal schnell alle Teiler einer Zahl zu finden erfordert nicht unbedingt ein großes Programm. Statt dessen kann man das schnell in der Konsole erledigen.

The Power of JavaScript unleashed.

Hier eine einfache schnelle Lösung, CopyUndPaste fertig:


var totest = 120; // hier einfach die Zahl einsetzen.
// ermittelt alle Teiler und gibt sie auf der Konsole aus.
for(let i = 0;i < (totest+1); i++) {
  if(totest % i === 0) {
    console.log(i);
  }
}


Hier noch ein passender Generator für irgendwelche Zahlen.


for(let j = 0;j < 100; j++) {
let teilerCount=0;
for(let i = 0;i < (j+1); i++) {
if(j % i === 0) {
teilerCount++;
}
}
if(teilerCount === 6){
console.log(j); //,teilerCount);
}

}

Cover Image

Mit Node.js gegen den Rest der Welt

Heute: schnell mal was zippen

Januar 26, 2021 - Lesezeit: 6 Minuten

Wenn man mehrere Dateien transportieren will ist es meistens einfacher die Dateien in einer Datei zusammenzufassen. Dazu kann man die Dateien einfache in ein komprimiertes Archiv stecken. Eigentlich ist die Komprimierung dafür gedacht, die Dateigröße auf ein Minimum zu reduzieren und so Speicherplatz sparen zu können. Die Komprimierungsverfahren erzeugen aber Dateien, die erst wieder entpackt werden müssen um benutzt werden zu können. Das funktioniert sowohl bei Dateien wie auch ganzen Ordnern.

Es gibt Verfahren, bei denen wird vor der Ausführung der Datei ein eigenes Entpacken ausgeführt und dann wird die Datei gestartet. Sofern es sich um ein Programm handelt, ist das durchaus ein Möglichkeit. Dieses Verfahren ist in der Demo Szene sehr beliebt. Hier gibt es die Herausforderung möglichst viel Programmlogik in möglichst kleinen Dateien unterzubringen. Diese Verfahren sind sehr kompliziert und meist nur für den aktuellen Fall geeignet und machen teilweise von Systemlücken gebrauch, die unter Umständen vom Betriebssystemhersteller auch mal korrigiert werden, was dafür sorgt, dass im nächsten Moment ein entpacken nicht mehr möglich ist oder das Programm funktioniert nicht mehr korrekt. Jetzt gibt es aber auch Verfahren, die genormte Komprimierungs-technologien verwenden und keine Lücken nutzen, dafür nicht immer ganz so effektiv sind. Für unsere Anforderung ganze Verzeichnisse in einer Datei zu transportieren, fällt das aber nur gering ins Gewicht.

Jetzt kann man das Ganze von Hand manuell über Systemtools oder mithilfe vorhandener Software lösen. Hat man die Anforderung aber öfter, sagen wir mal man macht täglich Releases, dann darf der Vorgang gerne automatisiert werden. Das lässt sich in vielen Programmiersprachen sehr komfortabel erledigen. So auch in JavaScript und Node.js. Node.js stellt hierbei die Dateifunktionen und die Pakete und JavaScript macht das Ganze schön flexibel. Gerade wenn z.B. der Dateiname automatisch aus einem Datum erzeugt werden soll, macht einem JavaScript das Leben einfach.

Das Ganze in ein Skript gepackt könnte dann so aussehen:

const path = require('path');
const zipFolder = require('zip-folder'); // npm install zip-folder

// make some nice name
const filenameToUse = new Date().toLocaleString().replace(/\:/g'-');

(async () => {
  zipFolder(
    path.join(__dirname, 'FolderToZip'),
    path.join(__dirname, filenameToUse + '.zip'),
    (err) => {
      if (err) {
        console.log(`oh no! Error while create: ${filenameToUse} `, err);
      } else {
        console.log(`EXCELLENT: ${filenameToUse} created`);
      }
    })
})();

Das Ganze kann man z.B. ja auch noch mit einem ftp Upload kombinieren. Oder die Datei zum Beispiel danach noch zur Sicherung kopieren. So können hier einfach Schritte automatisiert werden und auch an andere Anforderung schnell und flexibel angepasst werden und das mit einem simplen Texteditor. Und und und...


Cover Image

Node und Python - Heute CLI

Erstellen einer CLI Applikation

November 15, 2020 - Lesezeit: 9 Minuten

Es ist toll, dass man sobald man die entsprchenden Umgebungen installiert hat, man sowohl in Python als auch in Node.js einfach so kleine und große Skripte ausführen kann. Gerade bei Linux ist das durch die Paketmanager sehr einfach gestaltet. Und da viele andere Installationen ja teilweise schon die Hälfte der benötigten Pakete mitbringen, muss auch meistens nicht mehr viel installiert werden.

Wie ist es aber jetzt, wenn ich ein kleines Skript einem Kunden zukommen lassen will ohne dem Kunden eine komplette installation zuzumuten. Nicht jeder möchte ein komplettes Enticklungsystem auf seinem Rechner haben oder als Admin auch noch diese Installationen supporten. Im schlimmsten Fall müssen gegebenenfalls auch noch zusätzliche Installationen druchgeführt werden, die nicht ganz so unkompliziert sind.

Es gibt in Python wie auch in Node.js die Möglichkeit die Skripte in eine CLI Applikation zu verpacken und somit unter Windows, Linux und macOS die Möglichkeit zu schaffen ohne komplizierte Installationen das Ausführen von Skripten zu ermöglichen. Hierbei konnen kleine 2 Zeiler verwendet werden als auch ganze, vollwertige Programme erstellt und weitergegeben werden.

Zwischen Node und Python gibt es bei kleinen Anwendungen, wie z.B. Auflisten und Vergelichen eines Verzichnisinhaltes kaum einen Unterschied in der Implementierung. Hierbei entscheidet die persönliche Preferenz und der persönliche Entwicklungstand des Entwicklers wohl am meisten über die Wahl der Umgebung. Aber es gibt noch weitere Fakten, die in die Überlegung mit einfließen sollten. Um mir hier einen Überblick zu verschaffen und weitere objektive Kriterien für eine Entschidung zu sammeln, habe ich ein kleines Testprojekt sowohl in Python als auch in Node erstellt, diese in eine CLI Applikation gepackt und verglichen. Eins vorweg, es gibt keinen Sieger, da auch hier die Entschidung immer vom Anwendungsfall abhängig ist. Mein Test kann hier nur grob in eine Richtung zeigen und vielleicht im Vorfeld Impulse liefern.

Der Test

Um die komplexität der Aufgabe nicht unnötig zu steigern und eventuell das Ergebnis unnötig zu verzerren habe ich absichtlich ein sehr einfaches Problem genommen.

Node Python
const readline = require('readline');

console.log("Hello World");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Press Enter to continue...', (answer=> {
  rl.close();
});
print("Hello, World!")
input("Press Enter to continue...")

Die Auswertung

Wie zu erwarten lies sich das Problem mit beiden Umgebungen lösen. In keiner der Umgebungen habe ich unnötige Klimzüge durchführen müssen um die Aufgabe zu lösen. Es haben sich allerdings ein paar Unterschiede gezeigt, die ich hier kurz besprechen möchte:

Die Dateigröße

Hier zeigt sich ein großer unterschied, der beachtung finden sollte. Die erstellte Datei ist in Node um einvielfaches großer als das Gegenstück in Python. Dieser Unterschied sollte im Hinblick auf ein Deploy beachtung finden. Klar Speicherplatz kostet nix und ein paar MB hat man immer frei. Aber Bandbreite ist immer noch ein Thema. Es kann also durchaus Sinn machen, je nach Projektumgebung zu prüfen ob kleinere Dateien hilfreicher sind.

Startgeschwindigkeit

Wenn die Applikation gestartet wird ist es in Python so, dass der Quelltest kompiliert wird. Das dauert einen kleinen Moment. Die Nodeapplikation hingegen interpretiert auch beim Start ganz normal. Es ist anzunehmen, dass die Ausführgeschwindigkeit eines Pythonprogramms damit deutlich performanter ausfällt als bei Node. Im vorliegenden einfache Fall ist es allerdings so, dass die Nodeapplikation schon wieder beendet ist, da ist Python noch nicht einmal richtig gestartet. Auch hier gilt wieder, dass es vom Anwendungfall abhängig ist ob dieses Verhalten erwünscht ist.

Portabilität

Während sich Nodeapplikationen auf einem Windowssystem auch für Linux und macOS erstellen lassen ist dies bei Python leider nicht möglich. Obwohl beide Systeme hier ein vorgefertigtes Kompilat runterladen und den eigenen Quelltest einfach núr einbetten. Wenn also Python auch für Linux laufen soll, muss man das Ganze auch unter Linux erstellen. Das ist, wenn man das Programm weiterreichen möchte und nicht dasselbe Betriebssytem wie das Ziel hat, etwas umständlich. Wenn man dann möglichst viele Ziele abdecken möchte ist das dann eher ein bisschen hinderlich.

Fazit

Wie schon erwähnt, so richtig sticht hier keine der Umgebungen hervor. Beide haben Stärken und Schwächen, auch wenn beide einfache Aufgaben erfüllen können. Trotzdem sollten die hier vorgestellten Punkte nicht außer Acht gelassen werden, da diese einem das Leben unter Umständen schwermachen können.