Archiv der Kategorie: webdev

Nette Metapher zum Thema ‚Testen‘

Nach der sträflichen Vernachlässigung des Blogs bedingt durch die fiese Klausurphase sind jetzt Semesterferien und die Liste des „Verbloggenswerten“ ist beträchtlich angewachsen – demnächst also wieder mehr Futter. Losgehen solls mit einem netten Spruch eines meiner Profs, der bei Bosch mal Softwarearchitekt war. Bezieht sich übrigens auf das Thema Softwaretests:

Stress ist, wenn man das Fahrrad so schnell schieben muss, dass man nicht aufsteigen kann.

Denkt mal drüber nach ;).… Den ganzen Post lesen

Veröffentlicht unter Software Engineering | 4 Kommentare

Needle/Haystack Übersicht

Ich schreibe bald eine Klausur (so richtig auf Papier). Und da sind keine Handbücher oder Funktionsreferenzen erlaubt. Das befinde ich jetzt erstmal für großen Schwachsinn, weil es total an der Realität vorbeigeht. So. Nun habe ich mal eine kleine Übersicht erstellt, wie die Needle/Haystack-Reihenfolge bei den meistgenutzten Funktionen ist. Durch die Hilfe der IDE ist man ja nicht gezwungen, sich das merken zu müssen. Naja, beim stöbern im PHP Handbuch ist mir nun aufgefallen, dass mein Gefühl der total willkürlichen Reihenfolge gar nicht zutreffend war ;-). Wenn man sich mal ein paar PHP-Basher anhört, ist das ja auch das erste Argument.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | 8 Kommentare

Best-of-the-Web 5

Und wieder gibts ein paar besonders lesenswerte Webfundstücke, die mir die letzten paar Tage über den Weg gelaufen sind.

Den ganzen Post lesen
Veröffentlicht unter Best of the Web, webdev | Hinterlasse einen Kommentar

MySQL Storage Engine Vergleich – Warum MyISAM?

Neuerdings ist InnoDB die Standard-Engine von MySQL, was ich echt vernünftig finde. Ich finde es erstaunlich, wie sich MyISAM so lange halten konnte und würde gern verstehen, warum. Meiner Meinung nach zeichnet die Verbreitung von MyISAM ein trauriges Bild für Webanwendungen im Allgemeinen. Foreign Keys sind ein Segen! Deshalb die gewagte Aussage: Webanwendungen werden oft als wilder Hack hingeschustert, weswegen auch auf Datenbankseite keine vernünftige Integrität gebraucht wird.

Anders kann ich mir jedenfalls nicht erklären, wie es MyISAM zu solch einer hohen Verbreitung geschafft hat. Nachfolgend führe ich nochmal eine kleine (von mir kommentierte) Gegenüberstellung auf, die die wichtigsten Unterscheidungsmerkmale umfasst:

MyISAM

  • Die Daten-Speicherung in little endian soll für eine Maschinenunabhängigkeit / Betriebssystemunabhängigkeit sorgen – Ich weiß nicht, in wiefern das im Webumfeld praxisrelevant ist (LAMP als Standard-Stack).
Den ganzen Post lesen
Veröffentlicht unter Datenbanken, webdev | 7 Kommentare

PHP WTF #4

…oder warum man überall wo möglich 3 Gleichheitszeichen verwenden sollte ;).

<?php
$var1 = 0;
$var2 = 'foobar';

var_dump($var1 == false); //true
var_dump($var1 == $var2); //true
var_dump($var2 == true); //true

Womit dann schlussendlich true == false gilt. qed… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, webdev | 7 Kommentare

Rechenungenauigkeit mit Javascript – Warum?

Schonmal in Javascript über ungenaue Berechnungen aufgeregt?

<script>
alert(0.2 + 0.4);
</script>

Ergebnis?

Das Problem ist mit parseFloat ja schnell behoben, aber darum gehts mir hier garnicht. Warum kriegt Javascript kein sauberes Ergebnis zustande, wohingegen bei 0.2 + 0.3 glatt 0.5 rauskommt? Javascript rechnet intern binär. Und Zahlen, die im Zehnersystem wunderbar aufgehen, können im Dualsystem unter Umständen periodisch sein. So auch die 0.6. Schauen wir uns mal die Berechnung an:

  1. Vor dem Komma hat unser Ergebnis logischerweise eine 0
  2. Die Zahl wird mit 2 multipliziert (0.6 * 2 = 1.2)
  3. Der „Vorkommaanteil“ von oben ist die erste Stelle der gesuchten Binärzahl, also 1.
Den ganzen Post lesen
Veröffentlicht unter Javascript, webdev | 3 Kommentare

Datenbank-Transaktionen von akademischer Seite: Behind the Scenes

Disclaimer

An diejenigen mit ordentlichen Vorkenntnissen auf dem Gebiet der Transaktionen: Bitte nicht Abschrecken lassen. Es geht nach der kurzgehaltenen Einführung noch ordentlich in die Tiefe.

Was sind Transaktionen

Nach Definition ist eine Transaktion eine logische Arbeitseinheit, die entweder ganz oder garnicht durchgeführt wird. Bei einem Fehler wird die Datenbank also in den Zustand vor Ausführung der Transaktion versetzt, als ob nie etwas geschehen wäre.

Beispiel: Wo könnte man Transaktionen mehr benötigen als auf einem Gebiet, auf dem Fehler richtig weh tun? Die Bankenwelt! Man stelle sich folgendes ultrasimples Datenmodell vor:

CREATE TABLE  `konto` (
`kontonr` INT NOT NULL PRIMARY KEY ,
`betrag` INT NOT NULL DEFAULT  '0',
`kundenid` INT NOT NULL
) ENGINE = INNODB;

CREATE TABLE  `ueberweisung` (
`ueberweisungsid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`from_kontonr` INT NOT NULL ,
`to_kontonr` INT NOT NULL ,
`betrag` INT NOT NULL
) ENGINE = INNODB;

Man beachte InnoDB als Engine, da MyISAM keine Transaktionen unterstützt.… Den ganzen Post lesen

Veröffentlicht unter php, Datenbanken, Security, webdev | 9 Kommentare

#1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘

Das war mal wieder grad mal wieder ein Fehler, wie er im Buche steht. Anwendung läuft seit Jahren astrein, aber auf einmal frisst die Tabelle keine neuen Einträge mehr. Als Entwickler sollte einem die Zahl 2147483647 ja bekannt vorkommen. Folgender Ablauf zum reproduzieren:

CREATE TABLE `produkt` 
(
  `artikelnr` int(11) NOT NULL,
  `preis` float NOT NULL,
  PRIMARY KEY (`artikelnr`)
);

Und der Inhalt:

INSERT INTO produkt (artikelnr, preis) VALUES (2147483647, 4.99);
INSERT INTO produkt (artikelnr, preis) VALUES (2147483648, 6.95);

Das zweite insert-Statement liefert: #1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘.

Simple Erklärung:

The number 2,147,483,647 is the maximum value for a 32-bit signed integer in computing.

Den ganzen Post lesen
Veröffentlicht unter Datenbanken, webdev | 7 Kommentare

PHP WTF #3

Und ein neuer WTF-Teil (Teil 1, Teil 2)!

var_dump(1/3 + 4/3 == 5/3);

Ergebnis? false natürlich! Wie auch sonst, wär ja anderenfalls kein WTF. Genaugenommen hat das „Phänomen“ nichts mit PHP zu tun sondern mit Floating Point-Berechnungen und deren Präzision. Trotz allem hat mich der Spaß gerade eine Viertelstunde Debugging-Zeit gekostet, und zwar in C++. Deswegen mal kurz in PHP getestet – mit gleichem Ergebnis.

Und noch einer:

var_dump(19.99 + 19.99 == 49.98); //bool(false)

Richtigstellung: Schande über mein Haupt und danke an Enrico (siehe Kommentar). Grober Rechenfehler meinerseits. Das Ergebnis lautet natürlich nicht 49.98, sondern 39.98, was dann auch zu einem bool(true) führt.… Den ganzen Post lesen

Veröffentlicht unter php, PHP-WTF, Quicktips, webdev | 3 Kommentare

fieser Bug in PHP 5.3 [Update]

Man stelle sich folgenden Quellcode in einem Onlinebanking-Formular vor:

<?php
if (!empty($_POST['ueberweisungsbetrag']) && filter_var($_POST['ueberweisungsbetrag'], FILTER_VALIDATE_FLOAT)!==false)
{
    $ueberweisungsbetrag = $_POST['ueberweisungsbetrag'];
}
else
{
    $ueberweisungsbetrag = 0;
}
?>
<input type="text" name="ueberweisungsbetrag" value="<?php echo $ueberweisungsbetrag; ?>" />

Sieht ja eigentlich erstmal ganz vernünftig aus, oder? Validierung des einigegebenen $_POST-Betrags, um dem Benutzer bei einem Fehler das erneute eintippen zu ersparen. Wenn man nun allerdings die verdammt kleine Gleitkommazahl 2.2250738585072011e-308 als Betrag eintippt, hat das den gleichen Effekt wie

while (true) {}

Nämlich: Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/test.php on line 3. Diese ominöse Zahl führt also PHP-intern zu einem verrecken des Scripts.… Den ganzen Post lesen

Veröffentlicht unter php, Security, webdev | 3 Kommentare