MP3Gain für macOS

Wer die Lautstärke von MP3s so anpassen möchte, dass diese im Mittel gleich ist, der kann dafür unter Windows die Software MP3Gain nutzen. Leider ist MP3Gain unter macOS in dieser Form nicht lauffähig. Allerdings existiert mit MP3Gain Express eine Portierung der Software für macOS. Mithilfe dieser Portierung können unter macOS ebenfalls die Lautstärken unterschiedlicher Titel normalisiert werden.

MP3Gain Express unter macOS

Heruntergeladen werden kann MP3Gain Express über die offizielle Projektseite. Lizenziert ist die Software unter der LGPL und damit freie Software.

Boulder Dash im Browser

Boulder Dash ist ein Klassiker der Computerspielgeschichte, viele von uns habe dieses Spiel sicherlich stundenlang gespielt. Tóth Krisztián hat sich nun daran gemacht und eine HTML 5 Umsetzung des Spieles entwickelt.

Boulder Dash im Browser

Boulder Dash im Browser

Zu finden ist das Spiel auf boulderdash.krissz.hu. Dabei umfasst die Implementierung nicht nur die Original-Level, sondern auch das Construction-Kit mit welchem man eigene Level erstellen kann. Neben Boulder Dash ist auch eine Implementierung des C64er Spieles Impossible Mission auf seiner Webseite zu finden. Damit kann der Abend in Nostalgie verbracht werden.

EncFS Portierungen

Bei EncFS handelt es sich um eine Implementierung eines Verschlüsslungssystems für bestehende Dateisysteme. Bei diesem System wird jede Datei für sich verschlüsselt und das darunter liegende Dateisystem genutzt. Neben der Originalimplementierung von EncFS gibt es auch Portierungen in andere Programmiersprachen. Mit diesen Portierungen können EncFS verschlüsselte Daten auch unter Java und .NET ausgelesen werden.

Die Javavariante von EncFS trägt dabei den Namen „encfs-java“ und ist auf GitHub zu finden. Neben dieser gibt es auch eine Variante für .NET welche in C# geschrieben ist und auf BitBucket zu finden ist. Ursprünglich handelt es sich bei „encfs-dotnet“ um eine Portierung von „encfs-java“. Mittlerweile wurde diese Implementierung aber komplett neu geschrieben. Wie bei der Originalimplementierung, handelt es sich auch bei den Portierungen um freie Software. Die Java-Portierung steht dabei unter der GPL, während die .NET Implementierung unter der LGPG steht, was deren Verwendung flexibler gestaltet.

Weitere Informationen gibt es unter:
https://de.wikipedia.org/wiki/EncFS

Libtiff und libjpeg für .NET/Mono

Bei Libtiff und libjpeg handelt es sich um zwei oft verwendete Bibliotheken zum lesen von TIFF und JPG Dateien. Die Biblitheken liegen dabei als C-Quelltext vor. Auf der Suche nach einer entsprechenden .NET Portierung bin ich auf der Seite http://bitmiracle.com/ fündig geworden. Dort gibt es .NET Portierungen der Bibliotheken unter der „New BSD license“. Augenscheinlich werden die Bibliotheken auch aktuell gehalten, so das der Abstand zwischen den Originalen nicht zu groß wird.

Weitere Informationen gibt es unter:
http://en.wikipedia.org/wiki/Libtiff
http://en.wikipedia.org/wiki/Libjpeg

C++ nach C# Portierungen

Portierungen sind eine schöne Sache wenn man sich die Zeit vertreiben möchte ;) Bei der Portionierungen von C/C++ nach C# wird dabei immer wieder Dinge sehen die Schema F betreffen wie z.B. bestimmte Datentypen:

unsigned int -> uint
unsigned -> uint
unsigned char -> byte
std:string -> string
size_t -> Int64

Andere sehr beliebte Sachen sind Kollektionen wie Listen oder die Vektorklasse. Aus Dingen wie:

std::vector Things;
std::list Things();

wird dann meist immer ein:

List<Thing> Things;

Die Map:

std::map<unsigned short, unsigned> nodes;

wird dabei durch ein Dictionary ersetzt:

Dictonary<unsigned short, unsigned> nodes;

Immer wieder schön sind die Typedefs wie z.B.

typedef std::vector<Account> Accounts;

welche bei mir dann auch in eine Liste umgewandelt werden, an den Stellen an denen sie benutzt werden:

List<Account> Accounts;

Beim portieren von Klassen werden Header und C Datei in eine gemeinsame Datei geworfen und die Doppelungen entfernt. Aus den Klassenfunktionen aller:

void Thing::MakeFoo(int value)

wird dabei ein:

void MakeFoo(int value)

Bei While Schleifen wird aus einem:

while (message.getUnreadLength())

ein

while (message.getUnreadLength()!=0)

Aus einem Vergleich:

if(!receiver)

wird ein

if (receiver!=null)

Iteratoren sind auch immer wieder schöne Sachen. Aus

for (ChatChannels::const_iterator i = mChatChannels.begin(), i_end = mChatChannels.end());

wird ein:

foreach(ChatChannel channel in mChatChannels)

Sicherlich gibt es auch noch andere Schema F Konstrukte, dies sind allerdings die bei mir am häufigsten vorkommenden.

Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/3659044/comparison-of-c-stl-collections-and-c-sharp-collections
http://stackoverflow.com/questions/6274878/what-is-c-time-t-equivalent-for-c-sharp