Notizen zum Thema 'Programmierung'

°\°|°/°/°

°\°|°/°/° von leicagirl (photocase.de)

Themen:

MySQL-Rowcount bei 'ON DUPLICATE KEY UPDATE' (22.5.2012)

Bisher habe ich gedacht, 'affected rows' bedeutet 'betroffene Zeilen', aber MySQL hat da einen kleinen Spezialfall parat:

Nach dem Ausführen eines MySQL-Befehls 'INSERT INTO ... ON DUPLICATE KEY UPDATE ...' liefert mysql_affected_rows() im Fall eines Neueintrags 1 zurück, bei einer Aktualisierung 2 (siehe Dokumentation). Summiert man also wie gewohnt die Rückgabewerte kann man zu falschen Ergebnissen kommen.

Andererseits es es natürlich nur so möglich zu unterscheiden, was bei der Ausführung passiert ist.

Gespeichert unter: Programmierung

 

PDFs mit PHP erstellen (15.4.2012)

Bei meiner Suche nach einer Bibliothek, mit der ich aus PHP heraus PDFs erzeugen kann, bin ich auf drei Kandidaten gestoßen: fdpf, tcpdf und Zend_PDF. Es ist auch möglich, damit vernünftige PDFs zu erstellen, allerdings haben sie alle einen Haken: für eine optimale Layout-Kontrolle müsste ich die Style-Eigenschaften des Dokuments im PHP-Code setzen.

Das sieht dann ungefähr so aus:

$pdf = new YourPdfLib();
$pdf->addPage();
$pdf->setFont('sans');
// Text an einer bestimmten Stelle zeichnen
$pdf->drawText('Hello World', 70, 120);
$pdf->render('output.pdf');

Echte Fronarbeit also im Gegensatz zu HTML und CSS. Da übernimmt der Browser die undankbare Aufgabe, Texte, Bilder und Container an der richtigen Stelle zu positionieren. Doch es gibt eine Alternative zum Pixelschubsen: das Kommandozeilenwerkzeug wkhtmltopdf. Es verwendet die WebKit-Rendering-Engine (wie Safari und Google Chrome) und kann deshalb HTML mit den von WebKit unterstützten CSS-Angaben formatieren (und das sind die allermeisten von CSS2).

Für ein PDF musste ich also nur eine HTML-Seite erzeugen, im CSS die Besonderheiten von Druckformaten berücksichtigen (Seitengrößen, Seitenumbrüche bei Überschriften, etc.) und sie an wkhtmltopdf schicken.

Eine PHP-Klasse findet man auf der Google-Code-Seite von wkhtmltopdf

Aber natürlich lässt sich wkhtmltopdf auch über Cronjobs und mit anderen Programmiersprachen ansprechen. Das ist ja das Schöne an einem Kommandozeilenwerkzeug.

Gespeichert unter: Programmierung

 

Der feine Unterschied zwischen '[A-z]' und '[a-zA-Z]' (17.10.2011)

Bei regulären Ausdrücken kommt es auf die Feinheiten an, wie ich heute festgestellt habe. Bisher dachte ich, der Ausdruck '[A-z]' würde alle großen und kleinen Buchstaben im ASCII-Zeichensatz finden und auch nur Buchstaben.

Dann sind wir über ein Backtick-Zeichen '`' gestolpert, was auch von '[A-z]' gefunden wird und jetzt weiß ich, dass

 

Gespeichert unter: Programmierung

 

Ein mysteriöser PHP-Bug: Doppelpunkt statt 0 bei Float-Rundung (23.12.2009)

Sowas Schräges hab ich noch selten erlebt. Ein Fehler, der reproduzierbar ist, aber doch nicht immer. In bestimmten PHP-Versionen gibt es beim Konvertieren oder Runden von Floats das Phänomen, dass aus '19' ein '18.:' wird (bei reddit nennt es jemand ASCII rounding mode, da PHP die Periode .999999 ASCII57='9'  zu ASCII58=':' rundet).

Allerdings passierte das in unseren Tests nicht bei jedem Aufruf, sondern mal bei 3/4 aller Aufrufe, mal bei jedem vierten (genauere Berechnungen mit bcmul() etc. reduzierten die Häufigkeit). Es gibt einen offenen Eintrag im PHP-Bugtracker, der auf das Problem hinweist (#47304). Nur stammt der bereits vom 4. Februar. Seitdem kamen nur weitere obskure Hinweise dazu. Kurzfristig half auch mal ein Neustart von Apache, um den Fehler zu eliminieren. Aber am nächsten Tag trat er wieder auf. Dauerhaft erfolgreich waren wir nur mit der Rückkehr zu PHP 5.2.6.

Ein Decimal-Typ wie in Python ist doch was Feines.

Gespeichert unter: Programmierung Systemadministration

 

Problem beim Aufzeichnen von Selenium-Tests (20.9.2009)

Heute erstellte ich mit Firefox und Selenium Testfälle für den Terrashop-Bestellvorgang. Wie immer zeichnete ich die längeren Abläufe mit der Recording-Funktion von Selenium und passte die Reihenfolge der Kommandos danach manuell an.

Diesmal traten bei der Wiedergabe jedoch Fehler auf, die ich nicht nachvollziehen konnte, wenn ich die Aktionen direkt im Browser ausführte. Bis mir auffiel, dass Selenium für das Abschicken eines Formulars das Kommando 'Click' aufgezeichnet hatte.

Bei der automatisierten Wiedergabe des Tests dauert die Beantwortung der Anfrage durch den Server manchmal jedoch länger als die Standardwartezeit des Abspielmodus. Dann prüft Selenium die Bedingungen, die eigentlich für die neu aufzurufende Seite gedacht sind und gibt unerwartete Fehler aus, die bei der manuellen Ausführung der Befehle nicht auftreten.

Nachdem ich die Kommandos in 'ClickAndWait' geändert hatte, lief alles wunderbar fehlerlos. Eigentlich logisch, dass bei allen Aktionen, die eine Serververbindung erwarten, der Befehl 'ClickAndWait' sein müsste (oder ein 'WaitForPageToLoad'), doch dafür müsste Selenium beim Aufzeichnen die mit dem Link verbundenen Aktionen auf eine Serververbindung hin überprüfen. Das ist natürlich ein bisschen viel verlangt.

Gespeichert unter: Programmierung