Console2 mit GnuWin32

Ich liebe Windows, sowohl privat, als auch zur Software Entwicklung. Trotzdem vermisse ich manchmal das überaus mächtige Terminal der diversen *nix Systeme. Die normale Windows Konsole cmd.exe hat dabei gleich zwei Schwächen gegenüber ihrem *nix Pendant. Einerseits ist sie überaus unansehnlich und bietet relativ wenige Komfortfunktionen. Anderseits stehen auf *nix Systemen mächtige Werkzeuge in der Konsole zur Verfügung, welche unter Windows ohne weiteres nicht vorhanden sind. Punkt 1 kann man sehr leicht durch eine der diversen Ersatz-Guis für die Windows beheben. Beispiele sind ColorConsole oder mein absoluter Liebling Console2. Punkt 2 macht scheinbar mehr Probleme, doch wenn man ein wenig recherchiert stößt man früher oder später auf GnuWin32. Dieses Projekt stellt einen Großteil der Standard Konsolenbefehle von *nix Umgebungen unter Windows zur Verfügung. Damit alles gut zusammen arbeitet und das normale Windows System nicht gestört wird, sollte man etwas Arbeiten in das einrichten stecken.

Die Installation von Console2 ist kein Problem. Bei GnuWin32 hat man zwei Möglichkeiten. Man kann die Tools einzeln laden und installieren oder das ganze automatisiert (und standardmäßig komplett) via GetGnuWin32 laden und installieren lassen. Ich empfehle letzteres. Dann ist lediglich die Ausführung der download.bat und der install.bat notwendig und anschließend stehen alle Tools in einem gemeinsamen Ordner zur Nutzung bereit. Die beiliegende Readme macht einige Vorschläge, wie man diese Programme am besten in das System einbindet, aber ich gehe in diesem Tutorial einen leicht anderen Weg.

Zunächst sollte man Console2 konfigurieren. Das sollte zum größten Teil kein Problem sein. Eine kleine Übersicht meiner bevorzugten Settings im Folgenden:

  • “Console”: Den Haken bei “Save on exit” setzen.
  • “Appearance”: Haken bei “Use tab titles”, “Show command”, “Show Command in tabs” und “Trim tab titles to”. Kein Haken bei “Use console window title”. Font auf “Consolas”. “Inital position” und “Save on exit” können ebenfalls nützlich sein.
  • “More…”: Haken bei “Show menu”, “Show toolbar” und “Show status bar” entfernen. Außerdem “Alpha” für aktiv und inaktiv setzen. Gut ist bei beidem 40.
  • “Behavior”: Haken bei “Copy on select” setzen.
  • “Hotkeys”: Hotkey für “New Tab 1” auf “Ctrl + T” (“Strg + T”).

Unter “Tabs” kommen die eigentlichen Einstellungen. Doch zunächst müssen wir noch GnuWin32 vorbereiten. Eine Möglichkeit zur Nutzung ist den Ordner GnuWin32/bin in die PATH-Variable einzutragen. Das kann aber aber zu Problemen führen. Beispielsweise ist der Befehl “sort” unter Windows schon vorhanden. Setzt man den GnuWin32/bin Ordner am Anfang von PATH, wird der native “sort” Befehl überschrieben. Setzt man es am Ende von PATH, wird der *nix Befehl nicht aktiv. GetGnuWin32 schlägt aus diesem Grund auch ein dynamisches aktiveren mithilfe eines einfachen Batchskripts vor. Ich muss gestehen, bei mir hat es nicht funktioniert und ich finde es auch recht unbequem, jedes mal ein zuerst ein Skript von Hand starten zu müssen. Gleichzeitig möchte ich aber auch keine Probleme mit nativen Windowsfunktionen riskieren. Aus diesem Grund habe ich folgendes kleines Batchskript geschrieben:

@echo off

:: DOSKey Manual: http://en.wikipedia.org/wiki/DOSKey

:: Inject Linux commands into PATH.
set PATH=<Pfad zum Ordner>\gnuwin32\bin;%PATH%

:: Greeting
echo Hello tea2code

Dieses Skript setzt den GnuWin32/bin Ordner automatisch an den Anfang der PATH-Variable (überschreibt somit alle nativen Befehle) und schreibt noch eine kleine Begrüßung in die Ausgabe. Zusätzlich könnte man hier noch weitere Befehle ausführen, wie zum Beispiel Aliase mit Doskey setzen.

Mit Hilfe dieses Skripts kann man jetzt unter “Tabs” in den Console2 Settings die wichtige Einstellung vornehmen. Ich habe zu diesem Zweck den Standardtab umbenannt in “Linux” und ihm einen hübschen Pinguin als Icon spendiert. Auf diese Weise erkennt man leicht in welcher Umgebung man sich gerade bewegt. Unter “Shell” wird jetzt folgendes eingetragen: “%comspec% /k <Pfad zum obigen Batchskript>”

Beim öffnen eines neuen “Linux”-Tabs wird jetzt das obige Skript ausgeführt und anschließend stehen die von GnuWin32 gelieferten Tools zur Verfügung. Sie sind dabei jedoch nur in der gerade offenen Konsole aktiv und stören somit nicht das restliche System. Sofern ich mal ein Terminal ohne *nix Befehle benötige, habe ich einen zweiten Tab angelegt, welcher unter “Shell” nichts enthält. Ähnlich kann man beispielsweise auch die Powershell in Windows einbinden.

Siehe auch: hanselman.com

Weitere nützliche *nix Konsolen Programme für Windows:

Einen Eintrag in das Kontextmenü kann man mit folgender Registry-Datei erreichen:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\open_console]
@="Open Console2 Here"

[HKEY_CLASSES_ROOT\Directory\shell\open_console\Command]
@="<Pfad zu Console2>\\Console.exe -d \"%v\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\Background\shell\open_console]
@="Open Console2 Here"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\Background\shell\open_console\Command]
@="<Pfad zu Console2>\\Console.exe -d \"%v\""

Diplomarbeit “Peer-to-Peer Payment via NFC”

Mittlerweile habe ich offiziell mein Studium abgeschlossen und wollte daher meine Diplomarbeit mit der Öffentlichkeit teilen. Möge sie dem einen oder anderen eine kleine Hilfe sein. Fragen sind natürlich jederzeit willkommen.

Diplomarbeit:

Folien des Abschlussvortrags:

Dynamischer Zugriff auf JSF Komponenten mit JavaScript und CSS

In einem aktuellen Projekt musste eine mit Java Server Facelets erstellte Seite, auf Kommando bestimmte Daten an den Server senden. Normalerweise werden diese Daten aus einem Formular bezogen und alles weitere macht der Browser selbst. In diesem Fall mussten die Informationen allerdings aus einem völlig anderem Formular ausgelesen werden. Für eine solche Client-seitige Aufgabe wird normalerweise JavaScript (in diesem Fall mit jQuery) verwendet. Die JavaScript Funktion registriert das Submit-Event des ersten Formulars und lädt beim Aufruf des Events die Daten aus dem zweiten Formular, setzt sie und erlaubt dann die Weiterleitung des Events an den Browser. Für diesen Ablauf ist es notwendig, dass die ID der entsprechenden Formularfelder bekannt ist. Bei durch JSF generiertem Code ist das nicht der Fall, da die Generierung der automatischen IDs nicht spezifiziert ist und man sich darum nicht auf vorhersehbare Werte verlassen darf und kann. Zur Lösung des Problems ist darum ein kleiner Umweg notwendig.

Das folgende Beispiel nimmt an, dass der Wert eines bestimmten Input-Elements in JavaScript ausgelesen werden soll.

<h:inputText id="email"/>

Wie man sehen kann, ist zwar eine ID definiert, diese wird von JSF jedoch umgewandelt und geht Bestenfalls in die neue ID mit ein. Die Problemlösung sieht folgendermaßen aus. Zunächst wird das Input-Element um ein “binding” erweitert.

<h:inputText id="email" binding="#{bean.emailMember}"/>

Damit erreicht man eine Bindung des Elements auf eine Membervariable eines Beans, welches grob folgenden Aufbau haben muss.

@Named(value = "bean")
@RequestScoped
public class MyBean {
    private UIInput emailMember = null;

    public MyBean() {}

    public UIInput getEmailMember() {
        return emailMember;
    }

    public void setEmailMember( UIInput emailMember ) {
        this.emailMember = emailMember;
    }
}

Damit hat man eigentlich auch schon alles was man benötigt. Die richtige ID kann man jetzt folgendermaßen in JavaScript und auch CSS erhalten.

<script type="text/javascript" charset="utf-8">
    var value = $( '[id="#{bean.emailMember.clientId}"]' ).val();
</script>

<style type="text/css">
    ##{bean.emailMember.clientId} {
        color: red;
    }
</style>

Grafikengines für 2D Anwendungen

Im Zuge eines neuen Projekts habe ich mich über die Darstellung von 2D Grafik in C++ informiert. Die Lizenz sollte das entwickeln von Opensource und kommerziellen Projekten ermöglichen. Folgende Möglichkeiten standen schlussendlich zur Auswahl:

Natives OpenGL oder DirectX

Der direkte Zugriff auf die bekannten Grafik-APIs bietet zwar viele Möglichkeiten, allerdings ist die Arbeit damit auch deutlich anspruchsvoller.

SDL

SDL ist ein häufig genannter Name, wenn es um 2D Anwendungen und generelle Multimediaprogrammierung unter C++ geht. Es wird auf http://www.libsdl.org angeboten und bietet prinzipiell alles was notwendig ist. Die Dokumentation und die Community ist sehr groß und gut eingearbeitet.  Allerdings ist die komplette API nicht objektorientiert.

Allegro

Etwas umfangreicher als die SDL ist Allegro. Der Funktionsumfang insgesamt ähnelt sich zwar, aber gibt es noch weitere nützliche Funktionalitäten. Die API ist ebenfalls nicht objektorientiert. Sie wird auf http://www.allegro.cc angeboten.

SFML

SFML ist die objektorientierte Alternative zur SDL. Sie besitzt einen ähnlichen Funktionsumfang und wird aktiv weiterentwickelt. Dokumentation und Community sind allerdings noch nicht so gewachsen. Man kann sie auf http://www.sfml-dev.org finden.

Ogre3D

Quasi das genau Gegenteil zu OpenGL und DirectX ist Ogre3D, eine vollständige 3D Grafikengine. Sie wird unter http://www.ogre3d.org angeboten.

Ich habe mich schließlich für SFML entschieden, da es eine moderne Engine bietet und die Entwicklung aktiv voranschreitet. Neben dem 2D Rendering ermöglicht sie auch diverse weitere Funktionalitäten wie Audioausgabe und Netzwerkprogrammierung. Die Einbindung in Qt ist sehr einfach zu bewerkstelligen. Sie wird unter der zlib-Lizenz vertrieben.

Pfad der Applikation in Qt bestimmen

Ein weiteres kleines Snippet mit dem man den absoluten Ordner Pfad der Applikation bestimmen kann. Es wurde erfolgreich unter Windows angewendet. Unter Umständen sind Anpassungen für andere Betriebssysteme notwendig.

QString pathToApp()
{
    QString path = qApp->applicationDirPath();
    if ( !(path.endsWith("/") || path.endsWith("\\")) )
    {
        path += "/";
    }
    return path;
}

Fenster zentrieren in Qt

Ein kleines Snippet, dass zeigt wie man ein Fenster, welches mit Qt erzeugt, wurde auf dem Bildschirm zentriert. Es funktioniert allerdings auf mehreren Monitoren nicht mehr korrekt, ich bin nach wie vor auf der Suche nach einer Lösung.

void centerWindow( QWidget *window )
{
    // Check pointer.
    if ( !window )
    {
        return;
    }

    // Check if widget is a window.
    if ( !window->isWindow() )
    {
        return;
    }

    // Use desktop size and window size to calculate new window position.
    QDesktopWidget *desktop = QApplication::desktop();
    int x = ( desktop->width() - window->width() ) / 2;
    int y = ( desktop->height() - window->height() ) / 2;

    window->move( x, y );
}

“Still there” – Stable version.

Mein kleines Website Monitoring Tool ist ab heute in der stabilen Version. Gegenüber der letzten Version kam die XML Schnittstelle für das Auslesen einzelner Statuswerte dazu.

This slideshow requires JavaScript.