Archiv der Kategorie: Computer

Tipps und Hilfe bei Computer-Problemen

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);
    }
}
GD Star Rating
loading...

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.

GD Star Rating
loading...

Incoming search terms:

  • fritzbox als wlan client
  • zweite fritzbox einrichten

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

GD Star Rating
loading...

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.

GD Star Rating
loading...

Incoming search terms:

  • sirmark de

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>

 

GD Star Rating
loading...

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 *** http://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
GD Star Rating
loading...

Incoming search terms:

  • batch anzahl dateien ermitteln

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.

GD Star Rating
loading...

Incoming search terms:

  • bild in comic umwandeln gimp
  • cartoon effekt gimp 2
  • comic gimp
  • gimp architektur strichzeichnung
  • Portrait 2 farben

C#: Wie man eine Grafik in eine Resource hinzufügt

In Windows-Form Anwendungen kommt man öfters in die Verlegenheit, irgendwelche Bilder, Icons oder Logos anzuzeigen. Auch in Tabellen oder in einem DataGridView können kleinen Grafiken die Lesbarkeit stark erhöhen. Die Grafiken der eigentlichen Exe beizulegen mag seine Vorteile haben, doch oftmals ist es besser, diese in der ausführbaren Datei zu inkludieren und aus dem Speicher abzurufen. Wie man eine Datei als Resource in Visual Studio bereitstellt, beschreibe ich hier.

Zuerst muss man zum Resourcen-Fenster navigieren. Ein Weg, dorthin zu gelangen, ist ein Rechtsklick im Projektmappen-Explorer auf die Applikation, dann „Eigenschaften“ wählen. Im sich öffnenden Fenster sieht man nun einige Tab-Reiter. Man wählt hier den Tab Reiter „Ressourcen“. Die Schaltfläche „Ressource hinzufügen“ ist eigentlich selbsterklärend. Man wählt die passende Eigenschaft (oder wählt „vorhandene Datei hinzufügen“), vergibt dem Bild bzw. der Ressource einen eindeutigen Namen. Wenn man eine Datei direkt hinzufügt, sollte man je nach Namenskonvention diesen noch anpassen.

Die Grafik Resource in C# ansprechen
Nun haben wir also eine Grafik als Resource hinzugefügt. Nun möchten wir diese auch im Programmcode verwenden. Dies ist in C# nun sehr einfach, denn wir verwenden die statische Klasse „Properties.Resources“. Diese Klasse gewährt uns Zugriff auf die eingebettete Resource.
Im nachfolgenden Beispiel verwenden wir eine PictureBox um eine Grafik anzuzeigen. Eine Grafik „link.jpg“ habe ich als Resource mit dem Namen „link“ hinzugefügt. Der Zugriff auf die Grafik ist nun per „Properties.Resources.link“ möglich:

/// <summary>
/// Wir zeigen eine Grafik in einer PictureBox an
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
            //Eingebette Resource: link.jpg. Resourcen-Name: link
            pictureBox1.Image = Properties.Resources.link;
}
grafik in datagrid

Einbettung eines Image

In Anlehnung an mein Beispiel im Artikel „C# Images in DataGridView anzeigen” greife ich im untenstehenden Beispiel direkt auf die Resource hinzu und spare mir dem Umweg, das Image erst noch explizit zuzuweisen. Wer nicht den direkten Weg über die Properies.Resource gehen möchte, kann den von Microsoft hier beschriebenen Weg über einen Stream gehen.

DataGridViewImageColumn dgv_pic = new DataGridViewImageColumn(false);
DataGridViewColumn dgv_text = new DataGridViewTextBoxColumn();

//Füge die Colums hinzu
dataGridView1.Columns.Add(dgv_pic);
dataGridView1.Columns.Add(dgv_text);

//Hier werden manuell zwei Rows hinzugefügt
dataGridView1.Rows.Add(2);

dataGridView1[0, 0].Value = Properties.Resources.lampe_rot; // (Image)lampe_rot;
dataGridView1[0, 1].Value = Properties.Resources.lampe_gruen; //(Image)lampe_gruen;
dataGridView1[1, 0].Value = "Server A";
dataGridView1[1, 1].Value = "Server B";

Vorteil einer eingebettenen Resource
Der größte Vorteil ist natürlich, dass die Ressource, beispielsweise eine Grafik oder ein Icon nach dem Release in der Exe enthalten ist. Man muss sich keine weitere Gedanken mehr über die Grafik machen und man kann sicher sein, dass die Anwendung auch auf das Bild zugreifen kann. Aber auch der Nachteil liegt klar auf der Hand: Jedes so integrierte Bild vergößert die Exe. Es dürfte also wenig Sinn machen, große Images so zu integrieren. Kleine Status-Bilder oder Icon-Sets können aber so elegant integriert werden.

GD Star Rating
loading...

Incoming search terms:

  • c# icon eingebettete ressource

C# Task Planer: Scheduled Tasks erstellen

Heute möchten wir durch ein C#-Programm automatisch den Task-Planer (Schedueld Task) nutzen, um unsere zuvor erstellten Twitter-Nachrichten zeitversetzt an unser Twitter-Account zu senden. Wir könnten selbstverständliche ein eigenes Programm mit einem Timer schreiben, der zum vordefinierten Zeitpunkt die Twitter-Nachricht sendet. Doch diese wäre eine weitere Anwendung, die ständig auf dem Rechner laufen müsste. Selbst professionelle Anwendungen wie beispielsweise Pinnacles WIN PVR gehen bei der Aufnahme des TV-Programmes inzwischen dazu über, den Windows-eigenen Scheduler zu nutzen. Dies spart Ressourcen und vereinfacht die möglichen Fehlerquellen. Auf einem Linux-System käme schließlich auch niemand auf die Idee, die Crontab nachzubauen …

Unser heutiges Ziel ist, vorhandene WordPress-Artikel über die folgenden Tage verteilt als Tweet zu senden. Hierzu haben wir bereits die WordPress-Tabelle „wp_posts“ von Revisionen befreit und eine Tabelle angelegt, die lediglich die Felder „post_title“ und die „guid“ enthält. Die „Guid“ ist der Link auf die ID in WordPress. Dies ist nicht der SEO-optimierte Link. Da wir sowie einen URL-Verkürzer nutzen, benötigen wir für die Optik keinen lesbaren Link. Suchmaschinen wie Google lieben lesbare Links. Diese werde ich ein wenig enttäuschen. Ich spare mir Zeit und Aufwand. Zumal WordPress von alleine diesen Link per 301 Redirect auf den SEO-optimierten Link auflöst.

Wir erstellen eine weitere SQL-Tabelle, die lediglich eine ID, ein Statusfeld (Tinyint, Default 0) und ein Textfeld enthält. Diese nenne ich „tw_sirmark“. In dieser Tabelle speichere ich die Tweets. Eine eindeutige ID erleichtert das Auffinden der Tweet-Nachricht. Das Statusfeld gibt Auskunft darüber, ob der Tweet „geplant“ oder bereits veröffentlicht wurde.

Scheduled Task: Erstellen und Löschen von Tasks im Task-Planer
Nun schreiten wir zum eigentlichen Thema von Heute: Die Scheduled Task. Wir möchten mittels C#-Konsole für jeden geplanten Tweet einen Scheduled Task erstellen. Wenn dieser abgearbeitet ist, soll der Eintrag gelöscht werden. In unserem Beispiel ist der Weg sicherlich nicht optimal, denn aktuell sollen über 200 Einträge „getweetet“ werden. Doch in einem folgenden Projekt sollen lediglich vier bis fünf Einträge pro Woche generiert werden. So dient dieses Projekt als Vorlage. Ferner werden wir gleich sehen, wie sich der Windows-Scheduler mit einer solchen Menge an Einträgen „schlägt“.

Um den Windows-Task-Scheduler anzusprechen, gibt es viele Möglichkeiten. Mir persönlich sagt die DLL „Microsoft.Win32.TaskScheduler.dll“ am meisten zu. Diese ist über Codeplex kostenfrei erhältlich.

Über den folgenden Beispielcode erstellen wir unseren ersten Test-Task. Dieser ruft einfach testweise das Notepad auf.

static void Main(string[] args)
{
    // Task Service auf der lokalen Maschine
    using (TaskService ts = new TaskService())
    {
        // Task erstellen
        TaskDefinition td = ts.NewTask();

        //Beschreibung hinzufügen
        td.RegistrationInfo.Description = "Meine Task-Beschreibung";

        // Task Trigger: Starte täglich um 15 Uhr  
        td.Triggers.Add(new DailyTrigger {StartBoundary = DateTime.Today + TimeSpan.FromHours(15)});

        // Zum Test das Notepad öffnen
        td.Actions.Add(new ExecAction("notepad.exe", "", null));

        // Register den Task im Root-Ordner
        ts.RootFolder.RegisterTaskDefinition(@"Mein-Test-Trigger 15 Uhr", td);
    }
}

Weitere  Trigger-Einsatzzeiten:

//Task Trigger: Einmaliger Task, 1 Tag nach Erstellung, um 3 Uhr
// Für weitere Verfeinerung: new TimeSpan(hour, min, sec)
td.Triggers.Add(new TimeTrigger { StartBoundary = DateTime.Today + TimeSpan.FromDays(1) + TimeSpan.FromHours(3) });

//Task Trigger: Einmaliger Task am 12.07.2012 um 13:35:36 Uhr
td.Triggers.Add(new TimeTrigger { StartBoundary = new DateTime(2012, 7, 12, 13, 35, 36) });

Für unser Projekt nutzen wir den TimeTrigger. Über diesen können wir einen exakten Zeitpunkt bestimmen. Nun benötigen wir noch eine Möglichkeit, den Task-Trigger wieder zu löschen.

//Zugriff auf einen bestehenden Task
string taskName = "Mein-Test3";

using (TaskService ts = new TaskService())
{
Task t = ts.GetTask(taskName);
       ts.RootFolder.DeleteTask(taskName);
}

Im obigen Beispiel benötigen wir den Namen des Task, den wir löschen möchten. Natürlich können wir dem per Task aufzurufenden Programm auch den Namen übergeben, damit dieser den abgelaufenen Task löschen kann. Besser ist es jedoch, nach abgelaufenen Tasks zu suchen und diese zu löschen. Vorsicht: Eventuell werden somit mehr Tasks gelöscht, als man vielleicht möchte. Da ich den Anfangsbestandteil des Tasknamen kenne („MeinTask1“,“MeinTask2“ -> „MeinTask%“), werde ich nicht nur nach abgelaufenen Tasks, sondern auch nach dem Namenbestandteil suchen, bevor ich den Task lösche.

Hinweis: Es kann einem Task selbstverständlich auch in den Setting mitgegeben werden, dass der Task sich nach Ausführung selbst löscht.

// Task löschen, wenn er nicht erneut geplant wird
td.Settings.DeleteExpiredTaskAfter = TimeSpan.FromMinutes(2);

// Task beenden nach ....
td.Settings.ExecutionTimeLimit = TimeSpan.FromMinutes(2);

Löschen von bestehenden Scheduled Task mit C#
Da wir den Task vom aufzurufenden Konsolenprogramm auch selbst löschen wollen, benötigen wir eine Möglichkeit, auf diesen zuzugreifen. Sonst würden alle abgelaufenen Tasks im Scheduler bestehen bleiben.

//Zugriff auf bestehende Scheduled-Tasks, Auslesen des Root-Ordners
TaskService taskService = new TaskService();
TaskFolder tasksFolder = taskService.GetFolder(@"");
TaskCollection listOfTasks = tasksFolder.Tasks;
foreach (Task theTask in listOfTasks)
{
//Zugriff auf den Namen aller bestehenden Tasks im Root-Order
       string s = theTask.Name;

       //Nächste Laufzeit: Abgelaufene Tasks zeigen: 01.01.0001 00:00:00
       string sNext = theTask.NextRunTime.ToString();
}

Ändern von bestehenden Scheduled Tasks

//Ändern von bestehenden Tasks

//Zugriff auf bestehende Scheduled-Tasks, Auslesen des Root-Ordners
TaskService taskService = new TaskService();
TaskFolder tasksFolder = taskService.GetFolder(@"");
TaskCollection listOfTasks = tasksFolder.Tasks;
foreach (Task theTask in listOfTasks)
{
    // Zugriff auf den Namen aller bestehenden Tasks im Root-Ordner
	// Nur bestimmte Tasks auslesen
    if (theTask.Name.StartsWith("Mein-"))
    {
        //Auslesen der Eigenschaften (Demo)
        string sName = theTask.Name;
        string sBeschreibung = theTask.Definition.RegistrationInfo.Description;
        string sAusfuehrung = theTask.Definition.Triggers.ToString();
        string sAction = theTask.Definition.Actions.ToString();

		using (TaskService ts = new TaskService())
        {
            // Neuen Task erstellen
            TaskDefinition td = ts.NewTask();

            // Setzen der Werte, die sich ändern sollen
            td.RegistrationInfo.Description = "Meine neue Task-Beschreibung";

            // Task löschen, wenn er nicht erneut geplant wird
            td.Settings.DeleteExpiredTaskAfter = TimeSpan.FromMinutes(2);

            // Task beenden nach ....
            td.Settings.ExecutionTimeLimit = TimeSpan.FromMinutes(2);

            td.Actions.Add(new ExecAction(@sAction, "", null));

            //RegisterTaskDefinition ändert den Task, wenn dieser bereits vorhanden ist
            ts.RootFolder.RegisterTaskDefinition(@sName, td);
        }
    }
}
GD Star Rating
loading...

Incoming search terms:

  • c# aufgabenplanung erstellen
  • c# windows task beispiel

Twitter Tweets mittels C# erstellen

Im Artikel „WordPress to Twitter Plugin installieren“ haben wir eine Möglichkeit gesehen, wie wir über ein WordPress-Plugin neue Artikel automatisch als Tweet in Twitter veröffentlichen können. Wer kein WordPress nutzt oder auch ältere Artikel in den kommenden Tagen „tweeten“ möchte, der muss sich nach einer anderen Lösung umsehen.

Im folgenden Artikel möchten wir mittels C# in einer Konsolenanwendung Tweets aus einer Datenbank lesen und an Twitter senden. Selbstverständlich sind auf diesem Wege noch viele weitere Verwendungsmöglichkeiten denkbar.
Wir nutzen für die Kommunikation die DLL „tweetsharp“, die auf Github  kostenfrei erhältlich ist. Unzippen Sie die TweetSharp-Binaries und binden Sie referenzieren Sie „Hammock“, „Newtonsoft.Json“, „TweetSharp“ und „TweetSharp.Twitter“.

using System;
using System.Configuration;
using System.Diagnostics;
using TweetSharp;
using TweetSharp.Model;

namespace TweetingTest
{
    class Program
    {
        static void Main(string[] args)
        {

            TwitterClientInfo twitterClientInfo = new TwitterClientInfo();
            twitterClientInfo.ConsumerKey = "Mein-ConsumerKey"; 
            twitterClientInfo.ConsumerSecret = "Mein-ConsumerSecret-Key"; 

            TwitterService twitterService = new TwitterService(twitterClientInfo);
            twitterService.AuthenticateWith(AccessToken, AccessTokenSecret);

            string tweetMessage = "Dies ist die Tweet-Nachricht";
            TwitterStatus twitterStatus = twitterService.SendTweet(tweetMessage);
        }
}

Wie wir aus dem C#-Beispielcode sehen können, ist die Kommunikation über die eingebundenen DLLs sehr einfach. In unserem Beispiel verzichte ich auf die sichere Verwendung der API-Keys. Diese stecken hardcodiert im Quellcode. Wenn wir eine Anwendung schreiben, die in die Masse geht, ist diese Methode natürlich ungeeignet.
Zum Code selbst gibt es nicht viel zu sagen. Wir erstellen ein TwitterClient-Objekt, versorgen es mit den benötigten API-Keys, sorgen für eine Twitter-Authentifizierung und senden mittels „twitterService.SendTweet(MESSAGE)“ unsere Twitter-Nachricht. An dieser Stelle sei darauf hingewiesen, dass die DLL hier nahezu alle gewünschten Möglichkeiten der Twitter-Kommunikation bereitstellt.

Nachricht aus Datenbank lesen und an Twitter senden
Unser Ziel war es, alle bereits vorhandenen Artikel aus unserem Blog nach und nach an Twitter zu senden. Mit jedem automatisierten Aufruf (Scheduled Task) (LINK#) einer Konsolenanwendung soll ein Artikel „getweetet“ werden. Also erstellen wir uns eine kleine Datenbanktabelle. Diese besteht lediglich aus zwei Feldern: „Text“ und „URL“. Ich persönlich bin ein Fan von einem eindeutigen ID-Feld für eine Zeile; aus diesem Grund erweitere ich die Tabelle um eine ID (Primary Key). Im Feld „Text“ füllen wir die Überschrift des Artikel, im Feld URL benötigen wir die komplette URL des Artikels.

Unsere Konsole soll starten, gemäß SQL-Select den ersten Datensatz laden und diesen Twittern. Vorher muss jedoch noch eine Short-URL angelegt werden. Im Code wird per API auf Bit.ly zugegriffen und eine Short-URL erzeugt. Diese wird dann dem Text angehängt. Hier gilt zu beachten, dass die Nachricht nicht größer als 140 Zeichen wird. Aus diesem Grund müssen längere Nachrichten gekürzt werden. Die Routine zum Kürzen ist nicht optimal. Wer sich Mühe geben will, sollte dafür Sorge tragen, dass die Nachricht nur an einem Wortende abgeschnitten wird.
Ist die Nachricht nun mit einer Short-URL versehen, wird diese per API getwittert. Wir benötigen hier wieder die API-Keys von Twitter sowie von Bit.ly. Wie man diese Schlüssel generiert, wurde im Artikel „WordPress to Twitter Plugin installieren“ beschrieben.
Nun wird noch die verschickte Nachricht aus der Tabelle gelöscht.

GD Star Rating
loading...