01.01.2013

Perl-Skripte parallelisieren

Wenn Perl-Code parallel ablaufen soll, könnte man das Skript mehrfach im Hintergrund starten. Es geht aber auch eleganter.

Das Perl-Modul Parallel::ForkManager bietet eine einfach anzuwendende Möglichkeit, Codeteile wie z. B. Schleifen zu parallelisieren. Dabei muss sich der Programmierer nicht um Threads oder ähnliches Zeug kümmern. Er muss nur angeben, an welcher Stelle im Code die Parallelisierung beginnen soll und wo sie enden soll. Zusätzlich muss noch darauf geachtet werden, dass der Vaterprozess erst beendet wird, wenn alle Kindprozesse terminiert haben.

Dem Konstruktor von Parallel::ForkManager kann die maximale Anzahl an parallelen Threads as Parameter übergeben werden.

Beispiel:

#!/usr/bin/perl

use Parallel::ForkManager;
my $m = new Parallel::ForkManager(4);

for(1..100) {
$m->start and next;

do_some_weird_calculations();

$m->finish;
}

$m->wait_all_children();

Im obigen Beispiel wird in einer Schleife hundert Mal die Prozedur do_some_weird_calculations aufgerufen. Dabei werden jeweils vier Aufrufe parallel ausgeführt. Nach erfolgreichem Aufruf von start springt der Vaterprozess mit next sofort zum nächsten Schleifendurchlauf weiter. Zum Schluss wird noch gewartet, bis alle Kindprozesse beendet sind.

Wenn parallelisiert auf eine Datenbank zugegriffen werden soll, muss die Datenbank-Verbindung innerhalb von start und finish jedesmal neu geöffnet werden. Die Verbindung außerhalb zu öffnen und alle Kinder auf diese Verbindung zugreifen zu lassen, funktioniert meist nicht.

Kategorie: Programming, Perl


13.11.2012

Web-Forumulare per Skript absenden

Wenn man in einem Perl-Skript Web-Formulare ausfüllen muss, um bestimmte Informationen von einer Webseite herunterzuladen, bietet sich das Perl-Modul WWW::Mechanize an.

Dieses Modul simuliert einen ganzen Webbrowser und lässt den Skript-Programmierer durch Webseiten navigieren wie mit einem normalen Webbrowser. Einzig Javascript ist nicht möglich.

In unserem Beispiel loggen wir uns mit Benutzernamen und Passwort auf einer Webseite ein und laden von dort eine PDF-Datei herunter. Wir kennen den Namen der PDF-Datei nicht, aber wir wissen, dass es der einzige Link auf der Seite ist, der die Zeichenkette ".pdf" enthält, also suchen wir nach diesem Link. Zum Schluss speichern wir die PDF-Datei als "newest.pdf" ab:

#!/usr/bin/perl

use WWW::Mechanize;
my $mech = WWW::Mechanize->new();
$mech->agent_alias('Linux Mozilla');

my $username = 'ChuckNorris';
my $password = 'mypassword';

$mech->get('http://www.example.com/login');

$mech->submit_form(form_name => 'LoginForm',
fields => { UserName => $username, Password => $password });

my $link = $mech->find_link(url_regex => qr/.pdf/);
$mech->get($link->url());

$mech->save_content('newest.pdf');

Kategorie: Perl, Programming


06.08.2012

Apple Appstore Receipts mit PHP verifizieren

Entwickler von Apps für iphone oder ipad stehen machmal vor dem Problem, Daten von einem Server zu laden und dabei überprüfen zu müssen, ob der Benutzer ein gültiges receipt vom Appstore besitzt. Dies geht mit PHP mit Hilfe von curl:

function getReceiptData($receipt)
{
 $postData = json_encode(array('receipt-data' => $receipt, 'password' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'));

 $url = 'https://buy.itunes.apple.com/verifyReceipt';

 $curl = curl_init($url);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($curl, CURLOPT_POST, true);
 curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);

 $response = curl_exec($curl);
 $errno= curl_errno($curl);
 $errmsg = curl_error($curl);
 curl_close($curl);
 if($errno) return "ERROR: curl error: $errno, $errmsg";

 $data = json_decode($response);
 if(!is_object($data)) return 'ERROR: Invalid response data';

 return $data;
}


Das password ist das ensprechende App-Password.

Kategorie: Programming


 
Telefon:
E-Mail:
Fax:
Web:

+43 2682 24080
office(at)epb.at
+43 2682 205 7700 9963
zum Kontaktformular