Nov 08

Weiter geht’s in der Reihe “weekly links”. Dies waren meine Highlights in der letzten Woche:

Linux auf dem IBM Thinkpad
Notebooks von IBM oder dem Nachfolger Lenovo eignen sich besonders gut für Linux. Hier ist eine kurze Anleitung für Kubuntu 9.10, wie man das Notebook zum Stromsparen überredet und noch mehr Sondertasten in Betrieb nimmt.
Closure Tools – Google Code
Die Google Online Tools nutzen alle ausgiebig Javascript. So ist es nicht verwunderlich, dass Google jetzt seinen Javascript Compiler, eine Bibliothek für DOM Manipulation und UI Elemente, sowie Templates für Javascript und Java unter dem Namen Closure Tools auf Google Code zur freien Nutzung bereitstellt. Ich freue mich schon auf die ersten Vergleiche mit der Yahoo UI Bilbliothek.
Technische Kurzdokumentationen von Torsten Horn
Ich stehe auf technische Kurzdokumentationen (Tutorials), besonders wenn sie die Qualität wie die von Torsten Horn aufweisen.
Continuous Integration für PHP mit dem Hudson
Testen macht nur Sinn, wenn die Tests regelmäßig durchgeführt werden. Hier ist ein Artikel, wie man PHP Tests in Hudson integriert.
google-maps-icons
Freie Icons kann man als Webentwickler nie genug haben. Hier ist eine große Auswahl, die Google bereitstellt.
PDF-Erzeugung mit dem Zend Framework
Die viel genutzte PHP Bibliothek FPDF zur Erzeugung von PDF Dokumenten gerät bei komplexen Layouts schnell an ihre Grenzen. Dieser Artikel beschreibt eine Alternative mit Zend, die über den Umweg von Office Templates auch komplexe PDF Strukturen ermöglichen soll.
Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , , , , ,

Oct 27

Der Urlaub ist vorbei – leider. Ein wenig verspätet, aber dafür mehr an der Zahl kommen die “weekly links”:

jQuery-Accessible-RIA – (barrierefreies jquery)
AJAX Frameworks und Barrierefreiheit sind momentan noch 2 Dinge, die nicht so recht miteinander vereinbar sind. Dass es auch anders geht, zeigt dieses auf GitHub gehostete Projekt.
Symfony Components – Standalone libraries for PHP
Symfony ist eines dieser schönen neuen Frameworks für PHP. Das Projekt hat ein paar Komponenten zur Verfügung gestellt, die sich auch ohne Installation des kompletten Frameworks nutzen lassen. Ich bin schon gespannt, auf den angekündigten Request Handler.
PHPUnit mittels PTI in Eclipse einbinden
Eine Anleitung, um das Testing Framework PHPUnit in Eclipse einzubinden.
SystemRescueCd
Die Rettungs CD mit vielen nützlichen Tools, wenn der PC mal Probleme machen sollte.
Raphaël—JavaScript Library for svg and vml
Eine Javascript Bibliothek zur Erzeugung von Grafiken und Charts im SVG und VML (Microsoft) Format. Sehr sehenswert.
Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , , , , ,

Oct 19

Während ich mich im ersten Teil in meiner kleinen Serie über HTTP Clients mit Pear beschäftigt habe, will ich nun im 2. Teil mein Augenmerk auf das Zend Framework richten.

Auch hier benötigt man 2 Packages zur Erledigung der Aufgabe (s. Teil 1). Das Package Zend_Http ist wie das Pear Package Http_Request2 zur reinen HTTP Kommunikation geeignet.
Mit Zend_Dom kann man das empfangene HTML zerlegen.

Ein Weg zur Lösung der Aufgabe könnte so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
require_once 'Zend/Http/Client.php';
require_once 'Zend/Http/Response.php';
require_once 'Zend/Dom/Query.php';
 
$url='http://www.google.de';
 
$client = new Zend_Http_Client($url, array(
    'maxredirects' => 0,
    'timeout'      => 30));
 
try {
   $response = $client->request('GET');
 
   if (200 == $response->getStatus()) {
 
      $dom = new Zend_Dom_Query($response->getBody());
      $forms = $dom->query('form');
 
      $form=$forms->current();
      $action=$form->getAttribute('action');
 
      $client = new Zend_Http_Client($url.$action, array(
          'maxredirects' => 0,
          'timeout'      => 30));
      $client->setParameterGet('q', 'http client examples');
      $response = $client->request('GET');
 
      $dom = new Zend_Dom_Query($response->getBody());
 
      foreach ($dom->query('a.l') as $link) {
         if ($link->hasAttribute('href')) {
            $href=$link->getAttribute('href');
            $linkText=$link->textContent;
 
            echo "<a href=\"$href\">$linkText</a><br />";
         } 
      }
 
   } else {
        echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
             $response->responseCodeAsText();
    }
} catch (Zend_Http_Exception $e) {
    echo 'Error: ' . $e->getMessage();
}
?>

Der Code spricht eigentlich für sich, deswegen werde ich ihn an dieser Stelle nicht so detailliert erläutern wie noch im ersten Teil.
Der Unterschied besteht im Parsen des HTML’s. Die Methode query() (Zeilen 18 und 31) liefert nämlich kein Array, sonder ein Objekt der Klasse Zend_Dom_Query_Result zurück. Da diese Klasse die beiden Interface Countable und Iterator implementiert, können die Ergebnisse der Anfrage mit einer foreach Schleife durchlaufen werden. Jeder einzelne Treffer wird über ein Objekt der Klasse DOMElement abgebildet.

Fazit:
Auch Zend bietet mit Zend_Http und Zend_Dom einen guten HTTP Client. Nutzt man in seinem Projekt bereits andere Klassen aus dem Zend Framework ist dieser Lösungsansatz empfehlenswert.

Ausblick:
In Teil 3 verlasse ich die PHP Welt und stelle mit HttpUnit einen sehr komfortablen und funktionsreichen HTTP Client für Java vor.

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,

Oct 17

So der Urlaub hat begonnen. Da bekommt die Familie natürlich mehr Zeit als der Rechner. Ein [pP]aar Links habe ich trotzdem (dem Ferienhaus mit Internet sei dank):

PHP Simple HTML DOM Parser
Ein sehr leichtgewichtiger HTML DOM (Document Object Model) Parser für PHP.
Konvertierung von Zeichen in Java
Mit der Konvertierung von Zeichen unterschiedlicher Zeichensätze kann man viel Zeit verbringen. Wie man mit Java dem Problem Herr wird, zeigt dieser Blog Eintrag.

urlaub

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,

Oct 16

Die übliche Kommunikation im Internet besteht aus einer Anfrage (Request) an einen Webserver über das Protokoll HTTP und eine Antwort (Response) vom Webserver auf dem selben Weg. Die anfragenden Programme nennt man deswegen auch HTTP Clients. Die bekanntesten sind ganz klar die Browser. Aber auch eigene Programme, die so kommunizieren, fallen in diese Kategorie.
Nun muss man das Rad nicht neu erfinden. Von daher möchte ich in einer kleinen Serie ein paar Lösungen vorstellen, die die Details des HTTP Protokolls abstrahieren. Die Aufgabe ist für alle gleich:

  • Aufrufen der Google Startseite
  • Starten einer Suche
  • Anzeige der Treffer Links ohne weitere Beschreibung

Den Anfang macht das Package HTTP_Request2 aus dem Pear Repository. HTTP_Request2 unterstützt allerdings nur die reine HTTP Kommunikation, d.h. man erhält Zugriff auf den Header mit seinen Metadaten und den Body mit dem im Normalfall versendeten HTML. Die Zerlegung des HTML’s (Parsen) ist nicht Bestandteil. Diese Aufgabe erledigt das SourceForge Projekt PHP Simple HTML DOM Parser.

Genug der vielen Worte, hier ist der Beispielcode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
require_once 'HTTP/Request2.php';
require_once '../includes/simple_html_dom.php';
 
$html = new simple_html_dom();
 
$url='http://www.google.de';
$request = new HTTP_Request2($url, HTTP_Request2::METHOD_GET);
try {
    $response = $request->send();
    if (200 == $response->getStatus()) {
 
      $html->load_file($url);
      $forms=$html->find('form');
 
      $form=$forms[0];
      $action=$form->getAttribute('action');
      $html->clear();
 
      $request = new HTTP_Request2($url.$action, HTTP_Request2::METHOD_GET);
      $url=$request->getUrl()->setQueryVariable('q', 'http client examples');
 
      $html->load($request->send()->getBody());
 
      foreach ($html->find('a.l') as $link) { 
         echo $link,"<br />";
      }
 
      $html->clear();
    } else {
        echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
             $response->getReasonPhrase();
    }
} catch (HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
}
?>

Die Zeilen 7, 8 und 10 rufen die Google Startseite auf. Der Erfolg dieser Aktion (HTTP Status 200) wird in Zeile 11 kontrolliert. Davon ausgehend, dass die Seite existiert, besorge ich mir in Zeile 13 das HTML und suche darin nach dem ersten Formular. Wichtig für die weitere Kommunikation ist die Aktion (Attribut action), die für diese Form definiert wurde.

Die URL + action + die Suchanfrage, die in Zeile 21 als Parameter dem request hinzugefügt wird, ergeben die neue Anfrage. Die Klasse Simple HTML DOM Parser kann nicht nur das HTML aus einer eigenen Anfrage zerlegen, sondern auch einen String als Quelle (Zeile 23) benutzen.
Dass was mich am meisten an Simple HTML DOM Parser begeistert, ist der Zugriff auf die HTML Elemente über die Syntax von CSS Selektoren. So wird mit a.l auf alle Links der Klasse l zugegriffen.

Danach sollte man noch ein bißchen aufräumen (Zeile 29) – fertig.

Fazit:
Das Gespann aus Pear HTTP_Request2 und PHP Simple HTML DOM Parser ist ein leistungsfähiger HTTP Client für die Skriptsprache PHP. Die einzige Voraussetztung ist eine vorhandene Pear Umgebung, die ich aber sowieso jedem PHP Programmierer empfehlen würde.

Ausblick:
Teil 2 wird sich mit dem Zend Framework beschäftigen. Artikel mit Lösungen für Java und Groovy sind geplant. Welche HTTP Clients nutzt ihr für eure funktionalen Tests oder zur Fernsteuerung von Webanwendungen?

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , ,