Linux: Cronjob einrichten

Ein Cronjob ist vergleichbar mit einen Scheduled Task (Geplante Task) in der Windows-Welt. Ausgeführt werden die Jobs über die sogenannte Crontab, einer Liste, die hauptsächlich die Zeitsteuerung und den ausführenden Befehl für den Job enthält.

Crontab einrichten, Cronjob anpassen
Ein Cronjob wird in der Crontab angepasst. Um die Liste aufzurufen oder zu ändern, muss ein Shell-Zugriff (zum Beispiel per putty vorliegen. Bearbeitet kann die Cronatb mit jedem Editor von Linux. Ich empfehle den Editor „vi“ und beziehe mich in diesem Artikel auf den Syntax dieses Editors.

Crontab Steuerbefehle
Der Befehl „crontab“ kann vier Parameter haben:

  • „crontab –e“: Mit diesem Aufruf wird die Crontab zum Ändern (editieren) aufgerufen. Wenn die Crontab noch nicht vorhanden ist, wird sie automatisch angelegt
  • „crontab –l“: Zeigt die Crontab auf dem Bildschirm an („l“ wie „lesend“, keine Eselsbrücke)
  • „crontab –r“: Löscht die Crontab („Remove“)
  • „crontab –v“: Zeigt das letzte Änderungsdatum der Crontab an. Dieser Befehl ist nicht auf allen Linux-Systemen vorhanden.

Der Aufbau einer Crontab-Zeile (Cronjob)
Der Aufbau einer Zeile erfolgt nach einem festen Muster. In jeder Zeile steht ein Job. Je nach Editor kann eine Zeile sich über mehrere Zeilen erstrecken (wenn der Aufrufparameter beispielsweise sehr lang ist). Es handelt sich jedoch nur um eine Zeile.

* * * * * Aufruf-des-Skriptes (Befehl)
| | | | |
| | | | +---- Tag der Ausführung (0 -6, Sonntag = 0)
| | | +------ Monat (1-12)
| | +-------- Tag (1-31)
| +---------- Stunde (0-23)
+------------ Minute (0-59)

Wichtige Parameter:
„*“ Der Stern steht für IMMER. Steht ein Stern im Feld „Monat“, wird der Job auf jeden Fall jeden Monat ausgeführt. Steht er im Feld Tag, wird der Job jeden Tag ausgeführt

„/“: Wiederholung: „/2“ im Feld Minute steht beispielsweise für „alle zwei Minuten“, „/5“ im Feld Stunde steht für „alle fünf Stunden“

Crontab Beispiele

Einen Cronjob jeden Tag zu einer bestimmten Uhrzeit ausführen

# Job wird jeden Tag um 23:30 Uhr ausgeführt
30 23 * * * /user/skript-pfad/skript.sh

Cronjob zu einer bestimmten Uhrzeit zum 1. eines bestimmten Monats ausführen

# Job wird jeden 1. im Januar, April,Juni und September um 0:30 Uhr ausgeführt
30 0 1 1,4,6,9 * * /user/skript-pfad/skript.sh

Einen Cronjob an einem bestimmten Tag ausführen

# Job wird jeden 10. eines Monats um 0:20 Uhr ausgeführt
20 0 10 * * /user/skript-pfad/skript.sh

Einen Cronjob im Intervall ausführen

# Job wird an jedem Sonntag um 0:30, 2:30, 4:30 (…) ausgeführt
30 /2 * * 0 /user/skript-pfad/skript.sh

Einen Cronjob jede Minute ausführen

# /1=minütlich, /5=alle fünf Minuten – wenn an erster Stelle
/1 * * * * /user/skript-pfad/skript.sh

Cronjob am ersten Werktag eines Monats ausführen

Leider kenne ich keine einzeilige Lösung für dieses Problem. Mit zwei Zeilen in der Crontab ist dies jedoch durchaus machbar.

0 8 1 * 1-5 /pfad/script.sh
0 8 2,3 * 1 /pfad/script.sh

Was machen wir hier? In der ersten Zeile starten wir um 8:00 Uhr („0 8“ ) jeden 1. eines Monats („1“) in jedem Monat („*“) das Skript, aber NUR Montag bis Freitag („1-5“). Diese Zeile trifft also zu, wenn der Monatserste auf einen Werktag trifft.
Fällt der Monatserste jedoch auf einen Samstag oder Sonntag, wird hierfür die zweite Zeile benötigt. Diese trifft zu, wenn der der 2. oder 3. eines Monats auf einen Montag fällt.
Gibt es eine bessere Lösung? Schreibt diese gerne in die Kommentare!

Crontab – die Zusammenfassung

Wie hoffentlich zu erkennen ist, kann diese anfangs doch sehr ungewohnte und erst einmal umständlich wirkende Schreibweise alle wünschenswerte Szenarien abdecken. Der Aufbau ist sehr flexibel und lässt keine Wünsche offen. Er bedarf jedoch einiger Übung. Ein Tippfehler oder gar ein „*“ an erster Stelle (=Minute) kann eventuell zu sehr unerwünschten Ergebnissen führen. Daher der Praxistipp, einen neuen Zeitplan erst einmal mit „harmlosen“ Jobs auszuprobieren (Administrator-Mail senden etc).

Cronjob Email
Je nach Einstellung verschickt das Betriebsystem nach jeder Ausführung eines Cronjobs eine automatische Mail. Wie Sie diese deaktivieren können, erfahren Sie im Artikel „Cronjob: Email abschalten

FritzDECT 200 Schaltsteckdose mit C# steuern

fritz dect 200 mit C# steuern

Der Markt an schaltbaren Steckdosen, die per LAN ansprechbar sind, ist sehr klein und die Geräte teuer. Bisher habe ich eine ALLNET ALL3075 für ein Projekt verwendet, bei dem ein weiteres Netzwerkgerät per Skript Strom zugeführt und genommen wird. Da nach etlichen Jahren die Steckdose defekt war und diese Version auch nicht mehr im Handel ist, musste eine Alternative gefunden werden.

Die Alternative ist die Fritz!DECT 200, eine Schaltsteckdose, die eigentlich ein Verbrauchsmesser ist. Als Zwischenstecker misst die Steckdose den Verbrauch und gibt die Daten via DECT an die FritzBox weiter.
Eher als Zugabe hat die DECT 2000 einen fest verbauten Taster, mit dem der Strom an- und ausgeschaltet werden kann. Aber auch über die FritzBox lässt sich die Schaltsteckdose regeln. Manuelles Schalten wie auch eine Zeitschaltung lässt sich über die Software der FritzBox realisieren.

Wie erhält die FritzDECT 200 ihre Schaltbefehle?

Die Befehle werden per DECT von der FritzBox zur Schaltsteckdose übertragen. Dies geschieht ohne große Latenz. Ohne dies genau gemessen zu haben, erfolgt die Schaltung unmittelbar nach dem Auslösen des Befehles.

Wäre eine Schaltung per LAN nicht besser?

Da in meinem Projekt die Schaltsteckdose im Netzwerkschrank verschwindet und in Armlänge ein Netzwerkswitch vorhanden ist, hätte mir eine LAN-Steckdose eher zugesagt. Doch die geringen Kosten der Fritz-Schaltsteckdose hat den Ausschlag gegeben, es auf diesem Wege zu probieren. Weiterer Vorteil, der jedoch bei mir nicht zutrifft: Durch die DECT-Funkverbindung ist man mit dieser Lösung LAN-unabhängig.

fritz dect 200 mit C# steuern
Über die sogenannte AIN wird die Fritz Schaltsteckdose angesprochen. Diese ist jeder Fritz200 individuell zugeordnet. Die AIN ist auf der Rückseite aufgedruckt, kann aber auch über die Fritz!Box abgefragt werden.

Was kostet die Steckdose an laufendem Strom?

Diese sind gering. Heise Online gibt in einem Artikel „Strom sparen mit smarten Zwischensteckern“ an, dass das Modell im Leerlauf ein halbes Watt benötigt, bei Volllast 1,1 Watt. Dies sind nach Berechnung von Heise 0,30 bzw. 2,89 Euro pro Jahr.

Code-Beispiel: Die FritzDECT 200 mit C# an- und ausschalten

Im folgenden C#-Code wird ein Login-Zugang mit der Fritz-Box durchgeführt und die SID ausgelesen. Hierfür nutze ich einen speziellen Benuter, der nur Rechte auf die SmartHome-Geräte hat.
Wenn man die SID ausgelesen hat, ist das weitere Vorgehen einfach. Der Aufruf einer URL mit bestimmten Parametern schaltet die Steckdose an und aus. In diesem Listing habe ich auf das Auslesen aller AIN verzichtet. Natürlich ist auch dies möglich und man kann eine Software schreiben, die alle Geräte ausliest, diese darstellt und zum An- und Ausschalten anbietet. Hier kann auf die eigene Anforderung eingegangen werden.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Net;
using System.Security.Cryptography;
using System.IO;

namespace FRITZ_DECT_200
{
class Program
{
static void Main(string[] args)
{
//Möglichst eigener SmartHome-Benutzer
string benutzername = "SmartHome";
string kennwort = "#HIER DAS PASSWORT#";

//Fritz!DECT AIN -> Über die Fritzbox ermitteln oder ablesen (ist auf dem Fritz!DECT 200 auf der Rückseite aufgedruckt
string sAIN = "119900143999";

// Die SessionID muss ermittelt werden
string sid = GetSessionId(benutzername, kennwort);

//Die Schaltung der Steckdose erfolgt nun über den Aufruf einer URL
string sURL = string.Empty;

//TODO: Hier Entscheidung treffen, ob Schaltsteckdose an- oder ausgeschaltet werden soll

//switchOn
sURL = string.Format("http://fritz.box/webservices/homeautoswitch.lua?switchcmd=setswitchon&sid={0}&ain={1}", sid, sAIN);

//switchOff
//sURL = string.Format("http://fritz.box/webservices/homeautoswitch.lua?switchcmd=setswitchoff&sid={0}&ain={1}", sid, sAIN);

//URL öffnen, der Schaltvorgang wird ausgelöst
string sRes = SeiteEinlesen(sURL);

//Logout senden
sURL = string.Format("http://fritz.box/login.lua?page=/home/home.lua&logout=1&sid={0}", sid);
sRes = SeiteEinlesen(sURL);

}

public static string GetSessionId(string benutzername, string kennwort)
{

//-------------------< GetSessionId() >-------------------

// Der Login-Vorgang wird ausgelöst und die SID zurückgegeben
XDocument doc = XDocument.Load(@"http://fritz.box/login_sid.lua");
string sid = fl_Get_Value_of_Node_in_XDocument_by_NodeName(doc, "SID");

if (sid == "0000000000000000")
{
string challenge = fl_Get_Value_of_Node_in_XDocument_by_NodeName(doc, "Challenge");
string sResponse = fl_GetResponse_by_TempUser_Passwort(challenge, kennwort);

string uri = @"http://fritz.box/login_sid.lua?username=" + benutzername + @"&response=" + sResponse;
doc = XDocument.Load(uri);

sid = fl_Get_Value_of_Node_in_XDocument_by_NodeName(doc, "SID");
}
return sid;

//-------------------</ GetSessionId() >-------------------

}

#region ----< helper-methods >------

public static string SeiteEinlesen(string url)
{
//-------------------< SeiteEinlesen() >-------------------
//*read page with sid access, by webrequest

Uri uri = new Uri(url);
HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(response.GetResponseStream());
string str = reader.ReadToEnd();
return str; //*return string-result
//-------------------</ SeiteEinlesen() >-------------------
}

public static string fl_Get_Value_of_Node_in_XDocument_by_NodeName(XDocument doc, string name)
{
XElement info = doc.FirstNode as XElement;
return info.Element(name).Value;
}

public static string fl_GetResponse_by_TempUser_Passwort(string challenge, string kennwort)
{
//-------------------< get fritzbox-challenge+hashcode () >-------------------
return challenge + "-" + fl_Get_MD5Hash_of_String(challenge + "-" + kennwort);
//-------------------</ get fritzbox-challenge+hashcode () >-------------------
}

public static string fl_Get_MD5Hash_of_String(string input)
{
//-------------------< fl_Get_MD5Hash_of_String() >-------------------
//*create hashcode from string
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Unicode.GetBytes(input));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.Append(data[i].ToString("x2"));
}
return sb.ToString();
//-------------------</ fl_Get_MD5Hash_of_String() >-------------------
}
#endregion ----</ helper-methods >------

//ENDE
}
}

Tutorial: Raspian OS unter Hyper-V installieren

In diesem Artikel beschreibe ich, wie man einen Raspberry Pi virtualisiert bzw. wie man das das Raspbian OS unter Hyper-V installiert. Dies birgt leider einige Punkte, die man bei der Installation beachten sollte. Natürlich stellt sich sofort die Frage, warum man einen Raspberry überhaupt virtualisieren sollte. Um etwas zu testen, sei es eine Installation oder eine Konfiguration, macht dies durchaus Sinn. Wenn man mit dem Raspberry PINs ansteuert, beispielsweise für das Smart Home, sind der Virtualisierung natürlich Grenzen gesetzt.

Wichtig ist, dass man im ersten Schritt die richtige Form des Betriebsystemes, hier Raspbian, herunterläd. Um die SD-Karte des Raspberrys zu bestücken, werden IMG-Dateien, also bereits vorgefertigte Abbilder, benutzt. Um Raspbian unter Hyper-V zu installierten, benötigen wir das ISO des Betriebsystemes. Dies gibt es aktuell hier: https://www.raspberrypi.org/downloads/raspberry-pi-desktop/

Also zuerst das ISO herunterladen, dann Hyper-V starten. Im Hyper-V-Manager wird mittels NEU ein neuer VIRTUELLER COMPUTER angelegt.

Im Hyper-V-Manager wird unter NEU/VIRTUELLER COMPUTER der neue virtuelle Raspberry angelegt.

Dann werden die Vorbemerkungen bestätigt und dem virtuellen Rechner einen Namen gegeben (hier: „Raspi“)

Im nächsten Schritt werden die ersten Einstellunge für den virtuellen Raspberry getroffen.

Im nächsten Schritt wird die Generation des virtuellen Computers angelegt. Ich wähle hier die „Generation 1“. Die „Generation 2“ läuft auch; es kam bei mir jedoch manchmal zu Problemen. Als Hauptspeicher kann „1024 MB“ verwendet werden. ACHTUNG: Nur in manchen Installationen verwende ich den „dynamischen Hauptspeicher“, wie hier zu sehen. In der Regel gebe ich dem virtuellen Raspberry nur fixe 1024 MB.

Als Generation wird die „Generation 1“ ausgewählt. 1024 MB Hauptspeicher genügen dem Raspberry Pi.

In den kommenden zwei Fenster wird der Switch, also die Verbindung zur Netzwerkkarte und die virtuelle Festplatte festgelegt. Hier langt eine Festplatte der Größe 8 oder 16 GB in der Regel aus, da der Raspberry mit einer SD-Karte nur in den seltensten Fällen Speicher jenseits der 16GB hat.
Dann wird die heruntergeladene ISO-Datei als DVD-Rom-Laufwerk eingebunden. Im nächsten Fenster sollte noch einmal alle Einstellungen überprüft werden. Wenn alles OK ist, den Button „FERTIG STELLEN“ drücken.

Wichtig: Hyper-V kann keine .img-Dateien für die Installtion verwenden. Sie müssen ein ISO einbinden.

Dann wird der virtuelle Raspi gestartet. Hyper-V läd die ISO-Datei und der Installationsprozess beginnt. Hier muss nun „Install“ gewählt werden. Je nach verwendeter Version des OS genau schauen, dass die „permanente Installation“ gewählt und das Betriebssystem nicht nur flüchtig im Hauptspeicher gestartet wird.

Nun wir die Disk partitioniert. Wenn nichts Spezielles gewünscht wird, nutzt die folgenden Einstellungen:

Die Partition wird per Standardeinstellung bestätigt.

Nun wird noch bestätigt, dass die Daten in eine Partition geschrieben werden soll und der „GRUB boot loader“ installiert werden soll.

Der GRUB Bootloader wird installiert

Nun wird noch das ZIEL für den „GRUB boot loader“ angegeben und die Installation ist gleich vollbracht.

Die Installation ds virtuellen Raspberry Pi ist erst einmal erledigt.

Im nächsten Schritt sollte die die grafische Oberfläche des Raspi OS melden. In den folgenden Menüpunkten sind die Spracheinstellungen und das Keyboard anzugeben.

Nun startet der virtuelle Raspberry Pi mit seinem gewohnten Setup. Hier haben wir die Version mit grafischer Oberfläche installiert. Natürlich kann auch die schmale Lite-Version installiert werden.

Kleine Helferlein

IPAdresse ermitteln

ifconfig

SSH aktivieren

In den aktuellen Raspi-OS-Versionen ist SSH bereits installiert, jedoch nicht aktiviert. Über die Konsole den nachfolgenden Befehl eingeben, um SSH zu aktivieren:
sudo raspi-config
Im nachfolgenden Menü „ssh“ auswählen und aktivieren

C#: Dateien löschen, die älter als x-Tage/Datum sind

Im Artikel „Dateien automatisiert löschen, die älter als x-Tage/Datum sind“ habe ich vor langer Zeit gezeigt, wie man Dateien mittels Batch-Datei löschen kann, die ein bestimmtes Alter überschritten haben. Eine solche Funktion ist sinnvoll, wenn man beispielsweise Logfiles nur eine gewisse Zeit vorhalten und verhindern möchte, dass die Festplatte voll läuft.
Eine ähnliche Funktion werden wir heute schreiben, jedoch mittels C#. Ziel ist es hier, dass eine Anwendung selbst ihr Logfile-Verzeichnis überwacht und Dateien löscht, die älter als X-Tage sind.
Die nachfolgende Funktion „DeleteFiles“ erledigt dies für uns. Der Funktion muss das entsprechende Verzeichnis (Pfad als String) und die Anzahl tage (als Integer) übergeben werden. Dann ruft die Funktion das Verzeichnis auf und ermittelt alle Files, die im Verzeichnis liegen. Auskommentiert ist ein TXT-Filter. Wenn also ein bestimmter Dateityp im Verzeichnis überwacht werden soll, kann „GetFiles(„*“)“ in beispielsweise „GetFiles(„*txt“)“ geändert werden.
In der folgenden foreach-Schleife gehen wir die ermittelten Files durch und ermitteln das Datum der Datei. Hier stoßen wir auf das erste Problem. Sinnvoll klingt das „fi.CreationTime“. In den meisten Fällen ist dies auch das Datum, nach welchem wir uns richten möchten. Leider handelt es sich bei diesem Datum nicht um das Datum, welches wir im Explorer bei einer Datei „sehen“. Wenn wir die Dateien beispielsweise von A nach B kopieren, bleibt das File-Datum im Explorer bestehen, die „CreationTime“ ist jedoch neu gesetzt. Abhilfe KANN das „LastWriteTime“ schaffen. Gerade bei Logfiles sollte dies zum gewünschten Ergebnis führen.
Der restliche Code ist hier sehr umständlich, damit man ihn gut nachvollziehen kann. Wir ermitteln mittels TimeSpan die Differenz zwischen File-Datum und aktuellem Datum (Double), und konvertieren es in einen Integer-Wert. In der folgenden If-Abfrage schauen wir nach, ob die Differenz in Tagen über einem bestimmten Wert liegt. Wenn ja, löschen wir das File.

Im nachfolgenden Beispiel sind noch Aufrufe zur Funktion „LogFile“, die natürlich individuell angepasst werden müssen.

 

public void DeleteFiles(string sDirectory, int iTage)
{
	DirectoryInfo di;
    FileInfo[] files;
    try
    {
		//ermittel das Verzeichnis
		di = new DirectoryInfo(sDirectory);
		
		//existiert das Verzeichnis?
        if (Directory.Exists(sDirectory))
        {
			//files = di.GetFiles("*txt");
            files = di.GetFiles("*");

            foreach (FileInfo fi in files)
            {
		//fi.CreationTime; CreationTime klappt nicht bei kopierten Dateien!
                DateTime dtFile = fi.LastWriteTime;
                TimeSpan t = DateTime.Now - dtFile;
                double NrOfDays = t.TotalDays;
                int iAlter = Convert.ToInt32(NrOfDays);


                // Lösche die Dateien
                if (iAlter >= iTage)
                   fi.Delete();
            }
        }
        else LogFile("Fehler in DeleteFiles: Das übergebene Directory ("+ sDirectory + ") existiert nicht!");
    }
    catch (Exception ex)
    {
		LogFile("Fehler in DeleteFiles: " + ex.Message);
    }
}

HowTo: Zweite FritzBox als „IP-Client“ einrichten

Im ersten Teil dieses Artikels („Mit zweiter Fritzbox WLAN Reichweite erhöhen„) habe ich erklärt, warum man vielleicht eine zweite FritzBox in einem LAN installieren möchte. Im vorliegenden Fall soll mit einer zweiten FritzBox WLAN zur Verfügung gestellt werden.

Die Schritte im Einzelnen:

  1. „Erweiterte Ansicht“ aktivieren
  2. Die Fritz Box als „IP-Client“ definieren. Dadurch versucht die Box nicht mehr, sich selbstständig einzuwählen. Hierzu wählt man die Kategorie „Internet“, „Zugangsdaten“. Dann die Aufklappliste „Internetanbieter“ und den Eintrag „Andere Internetanbieter“. Im Abschnitt „Anschluss“ nun die Option „Externes Modem oder Router“ und als „Betriebsart“ die Option „Vorhandene Internetverbindung mitbenutzen (IP-Client Modus)“ wählen. In den Eingabefeldern „Downstream“ und „Upstream“ soll die Geschwindigkeit des Internetzuganges eingetragen werden, damit die Priorisierung der Pakete ordnungsgemäß klappt. Bei einem Downstream von 32 Mbit/s wird in der Box „32000“, bei einem Upstream von 2 Mbit/s wird „2000“ eingetragen. Über speedtest.t-online.de kann beispielsweise der Zugang getestet werden.
  3. Nun auf „Verbindungseinstellungen ändern“ klicken.
  4. Nun muss verhindert werden, dass die zweite Fritz-Box selbst auch als DHCP-Client fungiert.  Ob die zweite FritzBox eine statische oder dynamische IP-Adresse von der ersten FritzBox erhalten soll, ist Geschmackssache. Ich persönlich habe der zweiten FritzBox eine  statische IP-Adresse vergeben. Hierfür NICHT die Option „IP-Adresse automatisch über DHCP beziehen“ wählen, sondern „IP-Adresse manuell festlegen“. In diesem Fall muss eine freie IP-Adresse, Subnetzmaske, Standard-Gateway sowie der Primäre DNS-Server“ eingegeben werden.
  5. Nun den Button „Übernehmen“ wählen.

FRITZ!Box ‎IP-Client
Hier die veraltete Oberfläche einer FritzBox. Wichtig ist die Einstellung als IP-Client, damit die zweite FritzBox nicht versucht, sich ins Internet zu verbinden.

Die FritzBox wird sich nun neu starten und steht unter statischen IP-Adresse bereit. Wenn man DHCP gewählt hat, sollte man spätestens jetzt die zweite Fritzbox ins LAN integrieren und über die zugewiesene IP-Adresse auf die FritzBox zugreifen.

Anschluss der zweiten FritzBox

Die zweite FritzBox wird nach diesen Vorbereitungen lediglich mit einem LAN-Kabel vom Switch (Anschluss an der FritzBox: LAN1) versorgt. Weitere Kabel oder Anschlüsse sind – ausgenommen natürlich der Stromanschluss – nicht notwendig.

WLAN aktivieren

Wenn man, wie in meinem Fall, das WLAN der ersten FritzBox deaktiviert, muss man lediglich in der zweiten FritzBox WLAN aktivieren. Mehr ist nicht zu unternehmen. Wenn Sie zwei WLAN-Accesspoint gleichzeitig nutzen wollen, müssen Sie LAN-Roaming aktivieren.

WLAN-Roaming aktivieren

  1. Wählen Sie in der Verwaltungsoberfläche der zweiten FritzBox „WLAN“ und dann auf „Funknetz“.
  2. Tragen Sie dort die SSID Ihres ersten AccessPoint in die Box „Name des WLAN-Funknetzes (SSID)“ ein und klicken Sie auf „Übernehmen“.
  3. Wählen Sie im Menü „WLAN“ „Funkkanal“. Aktivieren Sie im Abschnitt „Funkkanal-Einstellungen“ die Option „Funkkanal-Einstellungen anpassen“. Geben Sie dort das verwendete WLAN-Frequenzband Ihres ersten Routers (dort nachschauen) ein und wählen Sie „übernehmen“.
  4. Klicken Sie im Menü „WLAN“ auf „Sicherheit“
  5. Aktivieren Sie die gleiche Sicherheitsstufe, wie in der ersten FritzBox verwendet.
  6. Übernehmen Sie den WLAN-Netzwerkschlüssel von der ersten FritzBox auch in der zweiten FritzBox und wählen Sie „übernehmen“.

Bei dieser Option ist es notwendig, dass die WLAN-Einstellungen wie Sicherheit und Netzwerkschlüssel identisch sind. Nur so kann ein WLAN-fähiges Gerät sich von der ersten FritzBox problemlos auch in der zweiten FritzBox einwählen.

FritzBox: WLAN abschalten

Am sichersten ist natürlich ein WLAN, wenn es ausgeschaltet ist. Da in meinem Fall nur die zweite, also zusätzliche, FritzBox WLAN überträgt, muss diese nur mit Strom versorgt werden, wenn ich WLAN senden möchte. Stecker rein – und nach 10 Sekunden ist WLAN verfügbar. Stecker raus – WLAN aus und Strom gespart. Umständliches hantieren über die Weboberfläche der FritzBox kann man sich so sparen.

Mit zweiter Fritzbox WLAN Reichweite erhöhen

Von Haus aus bringt die Fritz!Box meist die Möglichkeit mit, einen WLAN AccessPoint einzurichten, also ein WLAN in einer Wohnung oder in einem Haus zur Verfügung zu stellen. Dies ist schnell administriert und arbeitet auch – sofern man bei WLAN überhaupt von sicher sprechen kann – stabil und sicher. Eben so sicher, wie das verwendete Passwort und die Verschlüsselungsart es hergeben.

Je nach räumlicher Situation kann es jedoch sein, dass das von der FritzBox gesendete WLAN Signal am Arbeitsplatz, Wohn- oder Kinderzimmer nicht mehr ausreichend zur Verfügung steht. Nicht selten fristet die FritzBox im Keller ihr Dasein, aber in den oberen Stockwerken wird das WLAN-Signal gebraucht. Nun kann man das WLAN-Signal mit WLAN-Repeatern verstärken, was in vielen Fällen eine gute Lösung ist. Dies bedingt aber, dass am Rande des WLAN-Signals auch eine Steckdose für den Repeater vorhanden sein muss. Und nicht selten sind nicht nur ein, sondern mehrere Repeater notwendig, um am gewünschten Zielort ein vernünftiges WLAN-Signal zur Verfügung zu stellen.

Zweite Fritzbox gebraucht bei eBay kaufen
Zweite FritzBox gebraucht bei eBay kaufen

Im folgenden Fall sieht es so aus, dass die FritzBox im Keller angeschlossen ist und ein LAN durch das ganze Haus führt. Im Keller könnte sogar gänzlich auf WLAN verzichtet werden. Lediglich im Obergeschoss soll WLAN – hier aber mit ausreichender Stärke – zur Verfügung stehen. Die Lösung liegt auf der Hand: Auf die WLAN-Funktion der FritzBox verzichten und im Obergeschoss einen separaten WLAN-Access-Point einrichten, der seine Anbindung per LAN erhält. Nach einigem gogglen und diversen Gesprächen mit Kollegen war klar, dass solche Geräte ab 20 Euro angeboten werden und in dieser Preisklasse alles andere als stabil arbeiten. Schnell kam die Idee auf, eine alte FritzBox dafür zu verwenden. Dank eines ISP-Wechsels stellte mir der neue Provider eine neue FritzBox zur Verfügung. Die alte FritzBox verstaubte im Keller. Wer keine zweite FritzBox herumliegen hat, kann sich auch bei ebay danach umschauen. Für wenige Euro wechseln diese den Besitzer. Auch „gebrandete“ Boxen, meist von anderen Käufern verschmäht, sind hier sehr günstig zu erwerben.

Eine neue FritzBox für diesen Anwendungsfall kaufen? Auf keinen Fall. Die FritzBox steht zwar für Qualität, doch selbst die günstigste FritzBox kostet neu deutlich mehr, als WLAN-Access-Points aus fernöstlicher Produktion.

Darauf sollte man bei der Suche nach einer zweiten FritzBox achten:

Ich würde – sofern keine zweite Fritzbox herumliegt – mich in Kleinanzeigenmärkten oder eben bei ebay umschauen. Diese wechseln zum Teil für einstellige Eurobeträge den Besitzer. Vor allem, wenn Zubehör fehlt (was man vielleicht auch nicht benötigt). Wie welche Fritz-Box ausgestattet ist, also ob sie WLAN zur Verfügung stellt, welche Geschwindigkeit etc, kann kann bei Router-FAQ nachlesen.

Wie man eine zweite FritzBox im LAN einrichtet und WLAN einrichtet

Um eine zweite FritzBox in ein bestehendes LAN einzurichten, benötigt man nur drei Dinge: Die FritzBox, ein LAN-Anschluss und Strom in Form einer Steckdose. Zuerst sollte man die neue/alte FritzBox direkt an einen Laptop etc anschließen und sich darauf verbinden. Daran denken, dass man in der Oberfläche sofort in den Experten-Modus („Erweiterte Ansicht“) wechseln muss, damit man in der Oberfläche auch alle Einstellungsmöglichkeiten erkennen kann.

Zum HowTo: Zweite FritzBox als „IP-Client“ einrichten

MySQL Fehler: Incorrect key file for table ‚./[TABELLENNAME].MYI‘; try to repair it

In den vergangenen Wochen ist mir dieser Fehler mehrfach bei einer sehr großen MySQL-Installation aufgetaucht. Es hat einige Zeit gedauert, bis ich diesen Fehler ausgemerzt habe, zumal die betreffende Tabelle über 20 Mio Einträge bei einer Tabellengröße über 14 GB besitzt. Da ist jeder Befehl, jeder Versuch, die Tabelle zu reparieren, nicht in einer Kaffeepause abgetan. Ein Repair dauert mehrere Stunden …

Da es sich um eine MyISAM-Tabelle handelt, ist der erste Versuch natürlich, die Tabelle per „myisamchk“ zu reparieren. Den genauen Ablauf habe ich im Artikel „MyISAM-Datenbank-Tabelle reparieren“ bereits ausführlich beschrieben. Je nach Tabellengröße ist es an der Zeit, in eine ausgedehnte Mittagspause oder gar ins Bett zu gehen. Dieser Befehl dauert seine Zeit und in meinem Fall hat die Reparatur zwar die Tabelle wieder lesbar gemacht, das defekte Key-File jedoch nicht repariert.

Methode 1: Das Keyfile löschen

1-myisamchkIn diversen Foren bin ich über die nachfolgend beschriebene Methode gestoßen, um das Keyfile wieder erneut zu stellen. Um es vorweg zu nehmen: Die Methode hat bei meiner Tabelle nicht funktioniert. Ich kann nicht behaupten, dass die Methode nie funktioniert. Aus diesem Grund beschreibe ich sie hier auch. Nur in meinem Fall führte sie nicht zum Erfolg.
Ziel der Methode ist, dass betreffende Keyfile zu löschen und neu erstellen zu lassen:

  1. Den MySQL-Server stoppen („sudo service mysql stop“)
  2. Das betreffende .myi-File im Dateisystem umbenennen (beispielsweise „name.old“)
  3. Den MySQL-Server wieder starten („sudo service mysql start“)
  4. Nun die Tabelle reparieren lassen ( http://dev.mysql.com/doc/refman/5.1/en/repair-table.html ). Hierbei soll das Keyfile neu erstellt werden, da es ja nicht mehr vorhanden ist.

In meinem Fall brach die Reparatur mit wilden Fehlermeldungen ab. Ich habe danach wieder das Keyfile der Tabelle hinzugefügt und die Tabelle wieder neu repariert („myisamchk“). Dieser Versuch hat mich dann insgesamt über 12 Stunden beschäftigt. In dieser Zeit war die Datenbank also offline.

Methode 2: Tabelle per Dump neu aufbauen

2-mysql-dumpBei dieser Methode wird von der betreffenden Tabelle ein Dump erzeugt. Dies geht relativ schnell mittels „mysqldump –h localhost –u USER –pPASSWORD DATENBANKNAME TABELLENNAME > mydump.sql“ Wir erzeugen also einen Dump der Tabelle mit dem defekten Keyfile. In meinem Fall einfach auf der lokalen Platte (sofern natürlich ausreichend Platz vorhanden ist). Zu beachten ist ebenfalls, dass die Tabelle nicht als defekt gekennzeichnet sein darf („marked as crashed“). Wenn dies der Fall ist, muss zuvor per myisamchk die Tabelle repariert werden (siehe oben).
Nun haben wir also auf der lokalen Platte den Dump „mydump.sql“ liegen. Dann wird es spannend: Wir löschen über mysql die Tabelle mit dem defekten Keyfile. Dann spielen wir den Dump wieder zurück. Dies geschieht mit dem Befehl „mysql –h localhost -u USER –pPASSWORD ZIELDATENBANK < dump.sql“. Wenn nach einem abschließenden Return nicht sofort ein Fehler in der Konsole auftaucht, kann sich unser Puls erst einmal wieder regulieren. Im Filesystem kann gesehen werden, dass die Tabelle angelegt wurde und die Größe der Tabelle stetig wächst. Irgendwann wird die Tabelle ihre vorherige Größe haben und das Keyfile wird neu erstellt. Dann meldet sich die Konsole (hoffentlich) ohne Fehlermeldung wieder zurück.
Diese Methode hat für mich großen Charme, denn einerseits hat der eigentliche Dump und das Zurückspielen – vergleichsweise – wenig Zeit gekostet, zum Anderen habe ich mir ein „Optimize Table“ gespart. Die Tabelle wurde ja durch das Rückspielen der Daten von jeglicher Fragmentierung befreit.

CSS Sprites erstellen

Kundenprojekt: Tabelle, 40 Produkte die in 40 Zeilen der Tabelle untergebracht wurden und dazu 40 Vorschaubilder. Die Webseite ist fertig, der Kunde zufrieden, und der Browser arbeitet klaglos beim Öffnen der Webseite 40 Zugriffe zum jeweiligen Image ab. Dank schnellem Server und guter Internetanbindung ist die Seite verhältnismäßig schnell aufgebaut. Doch ist dies der richtige Weg? Und was sagt Google Page Speed?

Was sind Sprites?

sprite beispiel
Ein CSS Sprite ist eine einzige Grafik, die viele verschiedene Grafiken enthält. Diese Sammlung wird nur einmal geladen – jede einzelne Grafik steht dann zur Anzeige bereit.

Wer beim Begriff „Sprite“ nur an mit Zucker versetztes Wasser denkt, hat Nachholbedarf. Wem beim Begriff „Sprite“ der Commodore C64 mit seinen Sprite-Grafiken in den Sinn kommt, ist schon ein wenig näher am Thema.  Doch mit den „Geister-Grafiken“, die damals die Spielewelt revolutionierten, hat das CSS-Sprite wenig zu tun. Unter einem CSS-Sprites versteht man eine einziges Grafikelement, das viele einzelne Grafiken enthält; also eine Art Grafiksammlung.

Warum ist der Einsatz von CSS-Sprites sinnvoll?

Wie oben beschrieben hatte ich in einem Kundenprojekt 40 einzelne, jeweils 70x70px große Bilder, die alle auf einer Seite angezeigt werden sollten. Dies bedeutet, dass der Browser beim Aufruf der Seite mindestens 41 Requests, also Zugriffe auf den Quellserver, sendete. Der Webserver wiederum musste 41 einzelne Dateien zum aufrufenden Kunden senden. Dies bedeutet zum einen Last für den Server, aber auch Wartezeit für den aufrufenden Kunden, da ein Browser nur eine begrenzte Anzahl von parallelen Anfragen verarbeiten kann. In meinem Praxisbeispiel habe ich die 40 kleinen Images in zwei Grafiken zu je 20 Teilgrafiken zusammengefasst. Nun hat der Browser nur noch drei Requests (also die eigentliche Seite sowie zwei Sprite-Grafiken) nachzuladen.

Sinkt auch die Dateigröße bei CSS-Sprites?

Nach meiner Erfahrung eher: Nein. Zumeist ist das CSS-Sprite ungefähr so groß wie die Summe der Einzelgrafiken. Wenn viele unterschiedlichen Grafiken (Stil und Farbe) zusammengefasst werden, kann die Dateigröße der gesamten Grafik sogar deutlich größer sein als die Summe der Einzelgrafiken, da eine Reduzierung der Farbpallette bei unterschiedlichen Grafiken in einem Gesamtimage nur schwer erreicht werden kann. Hier kann es sinnvoll sein, Grafiken mit gleicher Farbpallette zu gruppieren.
Beim Einsatz von Sprites geht es nicht um eine weitere Reduktion der Größe der nachzuladenden Grafiken, sondern um die Reduzierung der Serveranfragen. Dies rechtfertigt sogar eine Erhöhung der Imagegröße in der Summe oder das Laden von vielleicht nie anzuzeigenden Images (Hover Effekt)

CSS Sprite erstellen

mit gimp einfach ein sprite erstellen
Mittels Generator kann ein Sprite einfach erstellt werden. Aber auch manuell kann ein Sprite erstellt werden. Hier wird mittels GIMP eine Grafiksammlung generiert. Hilfslinien helfen beim Zusammenbau des Sprites.

Ein CSS Sprite zu erstellen ist kein Hexenwerk. Aber es ist mühselig. Vor allem, wenn die Grafiken in unterschiedlichen Größen vorliegen. Sind es nur eine Handvoll Grafiken jeweils in der gleichen Größe, können die Bilder einfach nacheinander oder untereinander mittels eines Grafikprogrammes wie beispielweise GIMP „zusammengeklebt“ werden.
Im Netz werden zahlreiche Generatoren angeboten, die das Sprite und sogar noch den dazugehörenden CSS-Code erstellen.

CSS-Sprite Beispiele

Beispiel 1: Transparentes Bild
Die folgende Möglichkeit, ein CSS-Sprite anzuzeigen ist recht einfach, zeigt aber eine Schwäche: Es wird ein IMG-Tag verwendet, der zu einem transparenten Pixel linkt. Dies bedeutet einen Request mehr (nicht pro Bild, da der Browser diese Abfrage nur einmal durchführt), also das Image cached. Mir ist in der Praxis jedoch aufgefallen, dass das Sprite-Image jedoch auf mobilen Browsern nicht immer angezeigt wird.
CSS:

img.mysprite {
/* Die Größe des angezeigten Image und Pfadangabe definieren */
	width: 70px;
	height: 70px;
	background-image: url(Pfad_zum_Sprite);
}

/* Das einzelne Image wird positioniert – Ausschnitt aus der Grafiktabelle */
img.sprite1 {
	background-position: 0 0;
}

img.sprite2 {
	background-position: -70px 0;
}

Aufruf im HTML-Code

<img class="mysprite sprite1"  src="img_trans.gif" width="1" height="1" />

Zu beachten ist, dass das „img_trans.gif“ auch wirklich vorhanden sein muss, da sonst der Browser ein fehlerhaftes Bild einblendet. Das transparente Gif wird einfach einmal mit Gimp angelegt (1×1 Pixel, transparent).

Beispiel 2: Hyperlink
Wenn dem Image ein Link mitgegeben werden soll, ist diese Möglichkeit von Vorteil. Allerdings kann der Link auch – wie hier – auf die eigene Seite zeigen.

.sprite {
	clear: both;
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: 70px;
	height: 70px;
        background: url(Pfad_zum_Image);
}

.wss1 {
    background-position: 0 0;
}

.wss2 {
    background-position: -70px 0;
}

HTML-Aufruf

<a class="sprite wss1" href="#"></a>

Beispiel 3: Wechselndes Sprite Image beim „Überfahren“ des Image mit der Maus
Bilder, die sich ändern, wenn sie mit der Maus „überfahren“ werden, sind schon recht alt, aber immer wieder schön anzusehen. Eventuell ändert sich die Hintergrundfarbe, das Bild verschiebt oder vergrößert sich – all das ist möglich. Bisher hat man solche Effekte per JavaScript via MouseOver generiert. Dank CSS-Sprite wird einfach per Hover ein anderer Teil des Sprite angezeigt:

CSS

#mysprite {
width: 70px;
height: 70px;
text-decoration: none;
display: block;
background: url(PFAD_zum_IMAGE.png) 0 0;
}

# mysprite:hover, # mysprite:active {
background-position: 70px 0;
}

HTML:

<a id="mysprite" href="#"></a>

 

Batch: Anzahl Dateien im Ordner und löschen

Auf die Problematik Dateien unter Windows zu löschen, die älter als X-Tage sind, bin ich bereits im Artikel („Dateien automatisiert löschen, die älter als x-Tage/Datum sind“) eingegangen. Darauf basierend stellt sich folgendes Problem: Ein Sicherungsskript erstellt jeden Tag ein neues Backup, welches auf einer NAS mit Windows-Zugriff gespeichert wird. Im entsprechenden Sicherungsverzeichnis laufen nun jeden Tag Dateien auf und das Verzeichnis belegt von Tag zu Tag mehr Speicherplatz. Also sollen alle Sicherungen, die beispielsweise älter als 5 Tage sind, automatisch gelöscht werden. Dies ist die Ausgangssituation des oben beschriebenen Skriptes.
In der Praxis kommt es leider vor, dass die Sicherung ausfällt. Ein Tag ist zu verschmerzen. Wenn die Sicherung jedoch dauerhaft ausfällt, ist nach wenigen Tagen auch jedes Sicherungsfile gelöscht. Und da Murphy des EDV-lers bester Freund ist, wird nach dem Löschen des letzten Backups auch ein Ausfall des Quell-Systems eintreten.

Also geht es nun darum, das Skript so zu optimieren, dass es Dateien nur löscht, wenn mindestens X (=2,3 (…) 10) Dateien im Ordner noch vorhanden sind. Fallen die Sicherungen aus, verbleiben immerhin die Sicherungen im Sicherungsordner und werden nicht gelöscht.

Optimal wäre in diesem Fall noch, wenn der Administrator benachrichtigt werden würde, wenn ein solcher Fall eintritt. Aber auch dies ist möglich. In der Zeile „IF „%countFiles%“ GTR „%minFiles%“ (“ beginnt der IF-Block, in dem der Code Platz findet, der die Files löscht. Es sind also genug Dateien vorhanden. Im folgenden „ELSE“-Block gibt das Skript lediglich ein Echo („ echo Zuwenig Dateien zum Löschen!“) aus, was wenig sinnvoll ist. Hier könnte das Skript um die Möglichkeit erweitert werden, dem Admin eine Nachricht zukommen zu lassen, sich die Sicherungen einmal anzuschauen.

Im Skript selbst sind nur zwei Variablen vor dem Einsatz anzupassen. Die Variable „minFiles“ muss mit der Mindestanzahl der Dateien gefüllt werden, die auf jeden Fall im Zielverzeichnis verbleiben sollen. Und der Ordner bzw. das Zielverzeichnis selbst muss deklariert werden. Dies geschieht in der Variable „path“.

Das Skript kann einfach als Batch über Scheduled Task aufgerufen werden.

Batch: Wenn Befehle aus Windowssystem32 nicht gefunden werden
Eine Falle, in welche ich mal wieder getappt bin. In einem Batch-Skript gibt es Probleme mit dem Aufruf von Befehlen wie forefiles, net use oder ähnlichen. Diese Befehle liegen alle im System32-Ordner, doch der Aufruf wird mit einem Fehler quittiert (Aufruf fehlerhaft oder er kann Datei nicht finden). In einem solchen Fall sollte man zuerst einen Blick auf seine gesetzten Variablen innerhalb des Skripts werfen. Ist dort ein „SET Path=“ vorhanden, hat man (versehentlich) den System-Pfad überschrieben. Nun versucht das Skript die Befehle in dem neu gesetzten Pfad zu finden, was sicherlich schiefläuft.

Linux: Für die Freunde von Linux und der Bash gibt es hier eine Anleitung, wie man etwas ähnliches unter Linux bewerkstelligen kann.

@echo off
REM **************************************************
REM *** Skript löscht Dateien aus einem Ordern, die älter als x Tage sind.
REM *** https://sirmark.de/computer/dateien-automatisiert-loeschen-die-aelter-als-x-tagedatum-sind-191.html
REM ***
REM *** Anpassung 2013: Es wird zuerst geprüft, 
REM *** ob noch mindestens X (minFiles) Dateien vorhanden sind.
REM *** Wenn Mindestanzahl an Dateien NICHT vorhanden sind
REM *** (beispielsweise weil ein Sync/Upload nicht mehr funktioniert),
REM *** löscht das Skript KEINE Daten mehr.
REM 
REM ### VARIABLEN ###
REM minFiles = 5 : Anzahl an Dateien, die mindestens im Verzeichnis liegen müssen
REM Pfad=C: (...) : Pfad zum Ordner, der überwacht werden soll
REM     -> Lokaler Pfad (cmd liegt im Verzeichnis) : Pfad=%~1
REM AlterTage: (min) Tage, wie alt die zu löschenden Dateien sein sollen 
REM Laufwerksbuchstabe: Da Forfiles keine UNC-Pfade beherrscht, wird dieser Laufwerksbuchstabe gemappt
REM countFiles : Interne Zählvariable
REM **************************************************

setlocal
SET minFiles=5 

REM Forefiles kann NICHT mit UNC-Pfaden umgehen
REM Hier wird ein Laufwerksbuchstabe aus dem UNC-Pfad mit NET USE gemappt
REM und nach dem FORFILES Befehl wieder gelöscht
SET Pfad=\\192.168.0.x\meine\Ordnerstruktur
SET Laufwerksbuchstabe=J
SET AlterTage=5
SET countFiles=0

REM Prüfe, wieviel Dateien im Ordner vorhanden sind
if (%Pfad%)==() set Pfad=%~dp0
set first=%Pfad:~0,1%
set last=%Pfad:~-1%
if not (%first%)==(^") set Pfad=^"%Pfad%
if not (%last%)==(^") set Pfad=%Pfad%"
for /F %%i in ('dir %Pfad% /B /A-d') do set /A countFiles=countFiles+1

REM Ausgabe der Daten 
echo %countFiles% Dateien in Pfad - Min: %minFiles%

REM Prüfung auf Mindestanzahl an Dateien
if %countFiles% GTR %minFiles% (
    REM Genug Files vorhanden, lösch die Dateien
                echo Mappe das Laufwerk ...    
                NET USE %Laufwerksbuchstabe%: %Pfad% /PERSISTENT:NO

                echo Loesche ...
                REM Achtung: Unterschiedliche Versionen von Forfiles -p != /P -> genaue Syntax lokal mit /? ermitteln!
                REM Test - Files nur anzeigen: forfiles -p%Pfad% -d-%AlterTage% -c"CMD /C echo @FILE"

                REM UNSCHARF: Zeigt nur die Files an. Zum Löschen das folgende echo in del ändern: "CMD /C del @FILE"
                forfiles /P %Laufwerksbuchstabe%: /D -%AlterTage% /C "CMD /C echo @FILE"          

                echo Gebe den Laufwerksbuchstaben wieder frei ...
                net use %Laufwerksbuchstabe%: /D /Y
) ELSE (
    echo Zuwenig Dateien zum Löschen!
)
endlocal

Gimp: Bild als Comic oder Strichzeichnung konvertieren

Gimp: Bild als Comic

Diese Schritte führen nicht bei jedem Portrait zu einem guten Ergebnis. Auch die Parameter müssen je nach Vorlage ausprobiert werden.

Gimp Bild als Comic
Wir starten mit diesem Bild und möchten einen Comic-Effekt erhalten

Schritt 1: Wir beginnen mit dem Gaußschen Weichzeichner. Dieser ist in Gimp unter „Filter – Weichzeichnen – Selektiver Gaußscher Weichzeichner“ zu finden. Dort wählen wir als Weichzeichenradius den Wert „20“ und als „Max. Delta“ den Wert „60“ aus (Bild 1).
Achtung: Je nach Portrait bzw. Bild muss hier schon experimentiert werden. Ziel ist es eine Einstellung zu finden, die das Bild von Details befreit, ohne es zu entstellen.

Schritt 2: Nun verwenden wir den Gimp-eigenen Filter „Cartoon“. Dieser ist unter „Filter – Künstlerisch – Cartoon“ zu finden. In unserem Beispiel wähle ich als Maskenradius „50“. Den Schwarzanteil lasse ich auf „0“. Bei anderen Portraits ist „0,7“ oft ein guter Wert.

Schritt 3: Nun möchte ich dem Bild noch Farben entziehen. Dazu wähle ich das Menü „Farben – Posterisieren“. Bei diesem Bild sind die Ergebnisse mit weniger Farben nicht optimal. Ich reduziere die Farben lediglich auf den Wert „30“. Bei vielen Bildern habe kann der Wert „2“ durchaus gute Ergebnisse liefern. In meinem Beispiel erhält auch der Hintergrund Farb-Morees. Da ich das Bild im Anschluss sowieso beschneiden möchte, ist dies kein Hindernis.

Gimp Cartoon Filter
Der Gimp Cartoon Filter liefert ein interessantes Ergebnis

Schritt 4: Nach dem Entziehen der Farben kann nun noch die Farbsättigung angepasst werden. Unter „Farben – Farbton/Sättigung“ kann der Wert „Sättigung“ beeinflusst werden. Meist muss dieser erhöht werden (Wert „100“). In meinem Beispiel habe ich den Wert jedoch auf „-60“ reduziert.

Sieht das Bild nun wie ein Cartoon aus? Nun, leider nicht wirklich. Je nach Vorlage führen diese Schritte durchaus zu einem optimalen Ergebnis. Aber zu einem Erfolg haben diese Schritte durchaus geführt: Das Ergebnis gefällt mir deutlich besser, also das Original.

Gimp: Portrait als Strich-Zeichnung

Strichzeichnung in Gimp
Strichzeichnung in Gimp: Farben entziehen

Um ein Bild in eine Bleistift-Zeichnung umzuwandeln, bedarf es ebenfalls nicht vieler Schritte. Hier ist zu beachten, dass der Hintergrund möglichst neutral sein sollte. Je nach Motiv ist es ratsam, das Bild zuerst freizustellen..

Schritt 1:  Zuerst wird die Ebene dupliziert (rechte Maustaste im Fenster „Ebenen“, „Ebene duplizieren“).

Schritt 2: Nun wird die duplizierte Ebene entfärbt. Unter „Farben – Farbton/Sättigung“ wird die Sättigung auf „-100“ eingestellt.

Schritt 3: Nun wird auch diese Ebene noch einmal dupliziert dupliziert (rechte Maustaste im Fenster „Ebenen“, „Ebene duplizieren“). Wir haben nun drei Ebenen unseres Bildes.

Schritt 4: Nun kommt der „Filter – Weichzeichnen – Gaußschwer Weichzeichner“ zum Einsatz. In meinem Beispiel habe ich den Wert „5“ gewählt.

Schritt 5: Da wir eine invertierte Ebene benötigen, wählen wir nun „Farben – Invertieren“

Schritt 6: Der invertieren Ebene wird nun eine Deckkraft von „50“ Prozent zugewiesen (siehe Bild) Nun haben wir ein graues Bild mit schwach erkennbaren Kanten und Konturen.

Schritt 7: Nun wird diese Ebene mit der darunterliegenden Ebene vereint. Im Fenster „Ebenen“ wird die oberste dritte Ebene ausgewählt. Rechte Maustaste – „Nach unten vereinen“

Gimp Ebene abwedeln
Ebene abwedeln

Schritt 8: Weil wir Ebenen noch nicht genug dupliziert haben, führen wir diesen Schritt mit unserer obersten Ebene erneut durch. Den Ebenenmodus der soeben duplizierten Ebene stellen wir auf „Abwedeln“.

Je nach Vorlage kann die Arbeit hier bereits enden. Wenn wir die Linien noch verstärken möchten, gehen wir wie folgt vor:

Schritt 9: Es werden nun die zwei obersten grauen Ebenen zu einer vereint („Nach unten duplizieren“) und danach die vereinte Ebene wieder dupliziert. Der Ebenenmodus der soeben duplizieren Ebene stellen wir auf „Multiplikation“

Schritt 10: Weitere Experimente gefällig? Mit jeder Duplikation der Ebene (Modus „Multiplikation“) verstärkt sich der Effekt.