Zur Zeit wird gefiltert nach: scripting
Filter zurücksetzen

14.02.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 0

Heim-Bilderserver mit llgal

Ein einfacher Bilderserver kann mit dem Programm llgal erstellt werden. Das Programm ist ein Nachfolger von igal and kann rekursiv Verzeichnisse durchsuchen und einfache HTML-Bildergalerien erstellen. Wer HTML-Code und Bilder trennen will, muss sich jedoch mit einem Trick behelfen.
[mehr]
11.02.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 0

E-Mail-Liste per Visual Basic oder Perl reinigen

Fazit

Wie man sieht, sind die Programme im Kern einfach. Das VB-Net-Programm ist natürlich nicht ganz vollständig, zeigt jedoch die wesentliche Funktionsweise.

Bei der Perl-Datei wird die bereinigte Liste auf die Standardausgabe ausgegeben. Um diese in einer Datei zu speichern, gibt man folgendes an: cleanmail.php liste.txt > bereinigt.txt. Dies funktioniert unter Windows (z.B. mit ActiveState Perl) und natürlich unter unixoiden Systemen (Linux, BSD, Mac).

Wer die Programme herunterladen will, kann das hier machen:

VB.Net-Programmteil "cleanmail.exe"

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. Sub CleanFile(ByVal file As String, ByVal outFile As String)
  2.     Dim line As String
  3.  
  4.     tbOut.AppendText("Cleaning file: " + file + vbNewLine)
  5.  
  6.     'Open File
  7.     Dim sr
  8.     Try
  9.         Dim fs As New FileStream(file, FileMode.Open)
  10.         sr = New StreamReader(fs)
  11.     Catch ex As Exception
  12.         tbOut.AppendText("Could not find file " + file + ".")
  13.         Exit Sub
  14.     End Try
  15.  
  16.     'Write File
  17.     Dim sw
  18.     Try
  19.         Dim fo As New FileStream(outFile, FileMode.Create)
  20.         sw = New StreamWriter(fo)
  21.     Catch ex As Exception
  22.         tbOut.AppendText(("Could not create file " + file + "."))
  23.         Exit Sub
  24.     End Try
  25.  
  26.     'Read File - each line...
  27.     Do Until sr.Peek() = -1
  28.         line = sr.ReadLine()
  29.         If line <> "" And EmailAddressCheck(line) Then
  30.             sw.WriteLine(line)
  31.         Else
  32.             tbOut.AppendText("Stripped: " + line + vbNewLine)
  33.         End If
  34.     Loop
  35.  
  36.     'Close everything
  37.     sr.Close()
  38.     sw.Close()
  39.  
  40.     tbOut.AppendText("Finished writing " + outFile + ".")
  41. End Sub
  42.  
  43. Private Function EmailAddressCheck(ByVal emailAddress As String) As Boolean
  44.     Dim pattern As String = "^[a-zA-Z][a-zA-Z0-9\._%+-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*\.([A-Za-z]{2,})$"
  45.     Dim emailAddressMatch As Match = Regex.Match(emailAddress, pattern)
  46.     If emailAddressMatch.Success Then
  47.         EmailAddressCheck = True
  48.     Else
  49.         EmailAddressCheck = False
  50.     End If
  51. End Function

Perl-Programm "cleanmail.pl"

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. #!/usr/bin/perl
  2.  
  3. #Parameter 1 muss eine Eingabedatei sein
  4. if(!$ARGV[0]) { print("Bitte eine Eingabedatei angeben!\n"); exit 1; }
  5. #Kann Datei geöffnet werden
  6. if (!open(HANDLE, $ARGV[0])) {
  7.     print("Konnte Datei ".$ARGV[0]." nicht finden!\n");
  8.     exit 1;
  9. }
  10.  
  11. #Datei zeilenweise abarbeiten
  12. foreach my $line (<HANDLE>) {
  13.     chomp($line); #Leerzeichen vorne und hinten entfernen
  14.     #auf E-Mail prüfen:
  15.     if ($line =~ /^[a-zA-Z][a-zA-Z0-9\._%+-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*\.([A-Za-z]{2,})$/) {
  16.         print $line."\n"; #falls ok: Ausgeben
  17.     }
  18. }
  19.  
  20. exit 0;
Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. info@testtest.com
  2. marcus.mueller@nocheintest.de
  3. Total falsch
  4. keine.@mail..xx
  5. Nicht@erlaubt
  6. root@sub.domain.com

Reguläre Ausdrücke

Um E-Mails auf Validität zu prüfen, ist der Einsatz von Regulären Ausdrücken (Regular Expressions) sinnvoll. Reguläre Ausdrücke können Texte auf Muster überprüfen. E-Mails sollten theoretisch dem RFC 2822 Standard entsprechen. Ein Regulärer Ausdruck zur Prüfung einer E-Mail nach diesem Standard findet man beispielsweise unter http://code.iamcal.com/php/rfc822/full_regexp.txt. Der Ausdurck ist dabei schlappe 3768 Zeichen lang und für die meisten Anwendungsfälle unnötig.

Folgender Ausdruck genügt für 99% der Fälle vollkommen: ^[a-zA-Z][a-zA-Z0-9\._%+-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*\.([A-Za-z]{2,})$. Hierbei werden folgende Schritte ausgeführt:

  • Am Anfang der Mail muss ein Buchstabe (a-z oder A-Z) stehen.
  • Dann folgen 1 oder mehrere Zeichen, die auch Zahlen oder ., _, %, + und - enthalten können.
  • Jede E-Mail besitzt ein @.
  • Dann folgt eine Domain aus Buchstaben und Zahlen.
  • Möglicherweise existieren weitere Domainnamen, wenn die E-Mail einer Subdomain zugeordnet wurde.
  • Die Toplevel-Domain besteht nur aus Buchstaben und muss mindestens zwei Zeichen lang sein.

Nun kann man kleine Programme schreiben, welche E-Mails entsprechend auswerten. Als Beispiel habe ich im Folgenden Perl und VB.Net genommen (wurde von den Kunden nachgefragt).

Hin und wieder kommt es vor, dass Kunden von mir Listen mit E-Mails bereinigen müssen, beispielsweise für Newsletter. Da die Datenbestände oft falsche E-Mails enthalten, habe ich zwei kleine Programme zur E-Mail-Bereinigung in Perl und Visual Basic geschrieben.
[mehr]
02.02.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 1

Codeschnippsel: PNG-Weltkugel per Generic Mapping Tools in PHP-Skript erzeugen (Linux/Ubuntu)

Wichtig ist, dass der Rechner, auf dem das Skript ausgeführt wird, bestimmte Voraussetzungen mitbringt:

  • GMT muss klarerweise installiert sein. Eine Anleitung gibt es hier im Blog. Windows-Dateien können von der GMT-Homepage heruntergeladen werden. Ob das Skript unten auf Windows funktioniert, weiß ich nicht.
  • Gegebenenfalls müssen die Pfade angepasst werden. Die meisten Distributionen verwenden inzwischen den GMT-Wrapper „GMT”. Falls das nicht der Fall ist, muss die Variable $gmtWrapper gelöscht werden und die Variablen $gmtCoast, $gmtXY und $gmtText mit Pfadnamen versehen werden.

Nachdem man alles eingestellt hat (unter Ubuntu sollte das Skript Out-of-the-Box funktionieren), kann man von es von der Kommandozeile ausprobieren: php $gmt_globe.php. Dazu muss php-cli installiert sein.

Das Ergebnis kann sich durchaus sehen lassen:

Dieser Globus wurde mit Generic Mapping Tools erzeugt

Die Größe der Weltkugel ist im Skript festgesetzt. Durch Ändern der Variable $dpi lässt sich bestimmen, wie groß das resultierende PNG ist.

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. <?php
  2. //gmt_globe.php - Code-Schnippsel
  3. //Copyright (c) 1010, Maximilian Kalus, auxnet.de
  4.  
  5. //Ausgabe:
  6. $lon = '11.566667'; //Längengrad
  7. $lat = '48.133333'; //Breitengrad
  8. $name = 'München'; //Name des Ortes
  9. $output = '/tmp/globus'; //Pfad und Namensteil für Ausgabedatei
  10. $is_utf8 = true; //System ist UTF-8?
  11. $dpi = 150; //DPI der Ausgabe: 72 oder 96 ist gut für den Bildschirm, 300 oder 600 für den Druck
  12.  
  13. //Umgebung:
  14. $convert = '/usr/bin/convert'; //Pfad zu ImageMagick convert (oder GraphicsMagick Wrapper)
  15. $gmtWrapper = '/usr/bin/GMT'; //GMT-Wrapper oder leer
  16. $gmtCoast = 'pscoast'; //Name oder Pfad zu pscoast
  17. $gmtXY = 'psxy'; //Name oder Pfad zu psxy
  18. $gmtText = 'pstext'; //Name oder Pfad zu pstext
  19.  
  20. $gmtEnv = array(
  21. ); //ggf. Umgebungsvariablen für GMT (PHP5)
  22.  
  23. //Ausgabe-namen
  24. $tmpname = $output.'.ps'; //Ausgabe in PS-Datei
  25. @unlink($tmpname); //ggf. alte Dateien löschen
  26.  
  27. //GMT-Generierung starten
  28. //Prozess-Pipes erzeugen
  29. $pipes = null;
  30. $descriptorspec = array(
  31.    0 => array("pipe", "r"),  // STDIN ist eine Pipe, von der das Child liest
  32.    1 => array('file', $tmpname, "a"),  // STDOUT ist eine Datei, in die das Child schreibt
  33.    2 => array("file", $output."_error.txt", "a") // STDERR ist eine Datei,
  34.                                                     // in die geschrieben wird
  35. );
  36.  
  37. //Globus selbst erstellen
  38. //PHP-Versionen unterscheiden sich...
  39. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtCoast.' -Rg -JG'.$lon.'/'.$lat.'/16c -B15g15 -Dc -A5000 -W0.3pt -G230 -P -K', $descriptorspec, $pipes);
  40. else $process = proc_open($gmtWrapper.' '.$gmtCoast.' -Rg -JG'.$lon.'/'.$lat.'/16c -B15g15 -Dc -A5000 -W0.3pt -G230 -P -K', $descriptorspec, $pipes, $cwd, $env);
  41.  
  42. if (is_resource($process)) { //keine weiteren Daten übergeben
  43.     $return_value = proc_close($process); //Prozess schließen
  44. }
  45.  
  46. //Punkt eintragen
  47. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtXY.' -Rg -JG'.$lon.'/'.$lat.'/16c -Ss0.15 -G255/0/0 -O -K', $descriptorspec, $pipes);
  48. else $process = proc_open($gmtWrapper.' '.$gmtXY.' -Rg -JG'.$lon.'/'.$lat.'/16c -Ss0.15 -G255/0/0 -O -K', $descriptorspec, $pipes, $cwd, $env);
  49.  
  50. if (is_resource($process)) { //Daten übergeben: Längen und Breitengrad
  51.     fwrite($pipes[0], $lon.' '.$lat);
  52.     fclose($pipes[0]);
  53.  
  54.     $return_value = proc_close($process); //Prozess schließen
  55. }
  56.  
  57. //Titel eintragen
  58. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtText.' -Rg -JG'.$lon.'/'.$lat.'/16c -G0/0/0 -Dj0.06/0.06 -O', $descriptorspec, $pipes);
  59. else $process = proc_open($gmtWrapper.' '.$gmtText.' -Rg -JG'.$lon.'/'.$lat.'/16c -G0/0/0 -Dj0.06/0.06 -O', $descriptorspec, $pipes, $cwd, $env);
  60.  
  61. if (is_resource($process)) { //Daten übergeben: Länge, Breite, Größe, Name...
  62.     if ($is_utf8 && function_exists('mb_convert_encoding'))
  63.     $name = mb_convert_encoding($name, 'ISO-8859-1', 'UTF-8');
  64.     fwrite($pipes[0], $lon.' '.$lat.' 10 0 0 1 '.$name);
  65.     fclose($pipes[0]);
  66.  
  67.     $return_value = proc_close($process); //Prozess schließen
  68. }
  69. //GMT ist abgeschlossen
  70.  
  71. //PNG erzeugen
  72. exec($gmtWrapper.' ps2raster -E'.$dpi.' -A -P -Tg "'.$tmpname.'"');
  73.  
  74. //PS-Datei löschen
  75. unlink($tmpname);
  76. ?>
Die Generic Mapping Tools (GMT) sind ein mächtiges Werkzeug zur Erstellung von Kartenmaterial. Mit etwas Aufwand kann man GMT auch in ein PHP-Skript einbauen und somit Karten von einem Server z.B. für eine Website erzeugen lassen. Folgendes Codeschnippsel zeigt, wie's geht.
[mehr]
04.09.2009
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 11

Webcam als Bewegungsmelder unter Ubuntu/Linux einsetzen

Bewegungsmelder sind relativ einfache Systeme, Schnittstellen für Computer sind jedoch relativ selten und teuer oder erfordern elektronische Ausrüstung. Mit einer einfachen Webcam geht es auch unter Linux.
[mehr]
27.08.2009
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 1

Teile eines MySQL-Dumps extrahieren

Es kommt immer mal wieder vor, dass ich bestimmte Tabellen aus einem MySQL-Dump extrahieren muss, um sie z.B. neu einzuspielen. Bei kleinen Datenbanken ist es kein Problem, die entsprechende Tabelle per Hand zu suchen. Wenn der Dump jedoch 1GB groß ist, geht ein Editor schon schnell mal in die Knie.
[mehr]