// Raspberry Pi: Basteln mit dem PiFace Control and Display

Neulich bin ich auf das PiFace Control and Display aufmerksam geworden. Die Erweiterungsplatine für den Raspberry Pi verfügt neben einem bequem mit Python programmierbaren Display über einen IR-Receiver, 5 Taster und einen Navigationsschalter. Die Dokumentation des Boards ist sehr ausführlich und enthält zahlreiche Beispiele.
Ich habe vor mit dem Board (und natürlich einem Pi) ein auf dem Musik Player Demon (MPD) basierenden Musikplayer zu basteln. Da ich die Hardware erst bestellt habe und noch nicht in den Händen halte, kann ich in diesem Post leider nur die beiden Komponenten – den Musikserver und das Erweiterungsboard – vorstellen und ein wenig auf die Möglichkeiten eingehen.

Hardware – PiFace Control and Display

Der IR-Receiver kann von LIRC verwendet werden, was die Hardware äußerst interessant macht. So kann der Pi prinzipiell von jeder IR-Fernbedienung aus gesteuert werden. Damit ist z.B. ein Musikplayer sehr gut realisierbar – von überall im Raum kann die Playlist gewechselt, die Musik pausiert oder die Lautstärke verändert werden.
Auch Timer (etwa nach 10min Pause) oder gar Weckzeiten könnte man damit einstellen. Mit den zusätzlich auf dem Board angebrachten Schaltern und Tastern lässt sich dies natürlich auch direkt am Pi erledigen.
Auf dem Displays des Boards können zusätzlich zahlreiche Informationen wie Musiktitel, Künstler, Lautstärke und Dauer dargestellt werden.

Musikserver – Musik Player Demon (MPD)

Musik höre ich in den eigenen 4 Wänden mit dem Musikserver Musik Player Demon (MPD). Die Software ist als Client/Server aufgebaut, wobei MPD eigentlich nur den Server bereitstellt.

  • Der Server (MPD) gibt die Musik wieder und verfügt über die Musiksammlung. Da der Server wenn möglich immer verfügbar sein sollte, macht es Sinn hier einen kleinen sparsamen Rechner zu verwenden, der außerdem passiv gekühlt/leise ist. Der Raspberry Pi erfüllt genau diese Eigenschaften und verfügt auch gleich über ein Audiointerface.
  • Der Client, der nun z.B. die Playlists erstellt und auswählt, die Lautsärke regelt, die Musik pausiert und fortsetzt, kann dann ein anderer Rechner mit entsprechender Software oder ein Smartphone mit passender App sein.

Aber auch eine Steuerung direkt auf dem Pi ist möglich und genau hier kommt nun das PiFace Control and Display zum Einsatz. Durch die zahlreichen Mensch-Maschine-Schnittstellen (IR-Fernbedienung, Taster/Schalter, Display) bietet es sich sehr gut zur Steuerung von MPD und zur Präsentation der relevanten Daten an.

Vorausblick – Wie gehts weiter?

Genug geschrieben, in der nächsten Zeit werde ich mich (sobald ich die Hardware habe) mit der Steuerung von MPD mit dem PiFace Control and Display beschäftigen …und mich in Python einarbeiten :-)
Zunächst habe ich vor einzelne Aktionen wie Pausieren der Musik oder Anpassung der Lautstärke über die Taster und später dann natürlich auch per IR-Fernbedienung zum Laufen zu bekommen. Das Display werde ich dann nach und nach einbinden. Wobei ich hier noch gespannt bin, wie das alles läuft.
Interessant ist auch die Anzeige des Wetters (siehe Beispiel) oder die Integration einer Weckerfunktion. Doch dazu in den nächsten Wochen mehr!

// Kurztipp: BIND – Cache leeren

Nachdem diese NoIP Geschichte nun doch noch ein gutes Ende genommen hatte, musste ich ein paar Backup MX-Einträge wieder zurückbiegen, die ich nach dem Domainklau durch Microsoft verbiegen durfte. In diesem Zusammenhang nochmal vielen Dank an die Redmonder ;-)
Wenn man Änderungen an DNS Records kontrollieren will, muss man wegen den Verzögerungen/Caching/TTL im Domainsystem meistens etwas warten (teilweise bis zu 24h). Ein eigener Resolver wie z.B. BIND verkürzt diese Wartezeit extrem, wenn man dessen Cache leert. Dies geht bei BIND mit dem Tool rndc:

$ sudo rndc flush       # mit Root-Rechten ausführen!

Die Änderungen kamen ca. 15min. später an! MX-Einträge lassen sich übrigens sehr gut mit nslookup oder host überprüfen:

$ nslookup -q=mx domain.tld
$ host -t mx domain.tld

// Matlab: Datenauswertung mit corrcoef() und der Statistics Toolbox

Vor Kurzem stand ich vor der Aufgabe eine große Anzahl an in CSV enthaltenen Daten auszuwerten. Neben der Berechnung der Korrelationsmatrix, der Varianz, des Mittelwerts, des Medians und der Standardabweichung, galt es auch diese Größen als Tabelle in LaTeX zu exportieren. Dazu habe ich eine kleine Matlab Funktion erstellt, die genau diese Aufgabe erfüllt.

Vorarbeit mit LibreOffice und dem CLI

Zunächst habe ich das Rohformat mit LibreOffice Calc grob vorbereitet. Dabei habe ich unter anderem nicht vorhandene Messwerte durch NaN (Not a Number) ersetzt und nachträglich durch Automatisierung nicht behebbare Probleme „von Hand“ gelöst. Die erste Zeile und Spalte (mit den Titeln/Inhalten) habe ich mit cut und sed automatisch entfernt um nachher die Daten in Matlab einfacher einlesen zu können (wäre natürlich auch mit diesen Zeilen/Spalten möglich gewesen). Dazu habe ich folgendes einfache Skript verwendet (hier wurden auch noch die Semikolons durch Kommas ersetzt).

#!/bin/bash
 
READY="../Fertig"
 
for i in *.csv
do
   cat $i | cut -d";" -f2- | sed 1d | sed 's/;/,/g' > ${READY}/${i}
done

Auswahl der passenden Funktionen in Matlab

Als nächstes suchte ich mir passende Matlab Funktionen und informierte mich über deren Parameter. Hilfreich ist in diesem Zusammenhang immer die Hilfefunktion (help function_name).

Import der Daten: csvread()

Die Daten konnte ich in Matlab nun einfach mit csvread() einlesen. An csvread() muss nur der Dateiname als String übergeben werden.

>> csvread('test.csv')
 
ans =
 
     1     2
     3     4
     1   NaN

Berechnung der Korrelationsmatrix: corrcoef()

Sehr wichtig bei der Berechnung der Korrelationsmatrix war es die zuvor eingetragenen NaNs zu berücksichtigen. Matlab meinte dazu folgendes:

>> help corrcoef
 corrcoef Correlation coefficients.
    [...]=corrcoef(...,'PARAM1',VAL1,'PARAM2',VAL2,...) specifies additional
    parameters and their values.  Valid parameters are the following:
 
        Parameter  Value
        'rows'     Either 'all' (default) to use all rows, 'complete' to
                   use rows with no NaN values, or 'pairwise' to compute
                   R(i,j) using rows with no NaN values in column i or j.
                   The 'pairwise' option potentially uses different sets
                   of rows to compute different elements of R, and can
                   produce a matrix that is indefinite.

Folglich stand die Funktion corrcoef() mit den Werten 'complete' oder 'pairwise' für den Parameter 'rows' zur Auswahl. Hier ein kleines Beispiel mit 'complete'.

>> M=[1:4,NaN;2:2:10;3:3:15]
 
M =
 
     1     2     3     4   NaN
     2     4     6     8    10
     3     6     9    12    15
 
>> corrcoef(M)                        % normal
 
ans =
 
     1     1     1     1   NaN
     1     1     1     1   NaN
     1     1     1     1   NaN
     1     1     1     1   NaN
   NaN   NaN   NaN   NaN   NaN
 
>> corrcoef(M,'rows','complete')      % hier dann mit 'rows','complete'
 
ans =
 
    1.0000    1.0000    1.0000    1.0000    1.0000
    1.0000    1.0000    1.0000    1.0000    1.0000
    1.0000    1.0000    1.0000    1.0000    1.0000
    1.0000    1.0000    1.0000    1.0000    1.0000
    1.0000    1.0000    1.0000    1.0000    1.0000

Berechnung weitere statistischen Werte: Statistics Toolbox

Für die anderen Größen habe ich jew. die passenden Funktionen der Statistics Toolbox (nanvar, nanmean(), nanmedian() und nanstd()) verwendet. Diese Funktionen berücksichtigen ebenfalls die NaNs bei der Berechnung.

>> mean([2;3;NaN])      % "normales" mean
 
ans =
 
   NaN                  % ...kann nicht mit NaNs umgehen
 
>> nanmean([2;3;NaN])   % nanmean
 
ans =
 
    2.5000              % ...hingegen schon 

Export der Daten: matrix2latex

Um diese Daten nun in LaTeX Files zu exportieren, habe ich die Funktion matrix2latex von Moritz Koehler verwendet. Eine ausführliche Beschreibung der Parameter findet sich in den Kommentaren der Funktion.

Fertige Matlab Funktion

Im folgenden die fertige Matlab Funktion. Statt fprintf() kann übrigens auch disp() verwendet werden.

function [  ] = auswerten( file )
%Funktion zum Auswerten der Daten
%   Berechnet KorrelationsM, Mittelwert, Median, Standardabweichung und Varianz
%   und exportiert diese Groessen in 2 LaTeX Tabellen
 
    % Daten einlesen
    fprintf('Daten:\n')
    M=csvread(file)
 
    % Korrelationen berechnen
    fprintf('Normal:\n')
    normalC=corrcoef(M)
    fprintf('Complete:\n')
    completeC=corrcoef(M,'rows','complete')
    fprintf('Pairwise:\n')
    pairwiseC=corrcoef(M,'rows','pairwise')
 
    % weitere stat. Werte
    fprintf('Mean (Mittelwert):\n')
    meanM=nanmean(M)
    fprintf('Median:\n')
    medianM=nanmedian(M)
    fprintf('Std (Standardabweichung):\n')
    stdM=nanstd(M)
    fprintf('Var (Varianz):\n')
    varM=nanvar(M)
 
    % stat. Werte in eine Matrix
    statM=[meanM; medianM; stdM; varM]
 
    % In LaTeX exportieren
    valDesc={'val1', 'val2', 'val3', 'val4', 'val5'};
    statDesc={'Mittelwert', 'Median', 'Standardabweichung', 'Varianz'};
    exportC=['../Export/' file '.tex'];
    exportS=['../Export/' file 'stat.tex'];
 
    matrix2latex(completeC, exportC, 'rowLabels', valDesc, 'columnLabels', valDesc, 'alignment', 'c', 'format', '%-6.2f', 'size', 'tiny');
    matrix2latex(statM, exportS, 'rowLabels', statDesc, 'columnLabels', valDesc, 'alignment', 'c', 'format', '%-6.2f', 'size', 'tiny');
 
end

An diese Funktion muss der Dateipfad eines bereits „zurecht geschnittenes“ CSV File als String übergeben werden:

>> auswerten('datei.csv')

Anschließend wird die Datei eingelesen, die Werte berechnet und in zwei LaTeX Tabellen, wovon eine die Korrelationsmatrix und die andere die statistischen Werte enthält, exportiert. Diese Dateien können dann in einem LaTeX Dokument mit \input{} oder \include{} eingebunden werden. Falls mehrere Datensätze ausgewertet werden, kann eine weitere Funktion (oder Aufruf) diese Funktion z.B. über eine For-Schleife ausführen.

// fail2ban: geblockte IP-Adressen entsperren

Hin und wieder kommt es vor, dass eine gesperrte IP-Adresse in fail2ban wieder freigeschaltet werden soll. Das Tool fail2ban-client sagt dazu:

$ fail2ban-client -h
Usage: /usr/bin/fail2ban-client [OPTIONS] <COMMAND>
 
Fail2Ban v0.8.6 reads log file that contains password failure report
and bans the corresponding IP addresses using firewall rules.
(...)
    get <JAIL> actionunban <ACT>             gets the unban command for the
                                             action <ACT> for <JAIL>
(...)

D.h. ich beziehe über folgenden Befehl den passenden Befehl um den Clienten/die IP zu entbannen:

$ fail2ban-client get <JAIL> actionunban <ACT>

<JAIL> und <ACT> können, falls nicht bekannt durch die folgenden Befehle bestimmt werden:

$ sudo fail2ban-client status          # Bestimmung von <JAIL>: Status/Liste aller aktiven Jails
$ sudo iptables -L                     # Bestimmung von  <ACT>: zeigt die Chains und Rules von iptables an

<ACT> müsste normalerweise iptables-multiport sein. Für den Jail apache ergibt sich nun folgende Ausgabe:

$ sudo fail2ban-client get apache actionunban iptables-multiport
iptables -D fail2ban-<name> -s <ip> -j DROP

Mit <name> wird der Jail bezeichnet. Somit kann ich den Client mit der IP <ip> wie folgt entsperren:

$ sudo iptables -D fail2ban-apache -s <ip> -j DROP
Hello World!

This is the personal website of Christoph Winkler aka chrisge.
Here you will find a sort of blog and some information about me and my projectshave fun!

Recent Comments
Latest Tweets

Follow me on Twitter...

QR-Code: aktuelle Seiten-URL
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported