Archiv der Kategorie: php

MySQL: Spaß mit float

Man nehme folgenden Code:

DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
USE test;
DROP TABLE IF EXISTS test;
CREATE TABLE test (number_double DOUBLE, number_float FLOAT);
INSERT INTO test VALUES (1000000000000000, 1000000000000000);
SELECT number_double, number_float FROM test;

Exponentendarstellung

Exponentendarstellung

Okay, soweit noch keine Sensation. Wenn man nun aber MySQL dazu zwingt, den konkreten und exponentenfreien Wert rauszurücken, indem man folgendermaßen selektiert:

SELECT number_double * 1, number_float * 1 FROM test;

offenbart sich:

Exakter Wert

Exakter Wert

Gleiches Spiel selbstverständlich, wenn ich den Wert per PHP aus der Datenbank heraushole.

Veröffentlicht unter php, Datenbanken, webdev | 4 Kommentare

Javascript in PHP mit der V8-Engine

Googles V8-Javascript-Engine kommt u.a. in Chrome und NodeJS zum Einsatz und ist anerkanntermaßen sauschnell. Umgesetzt wird der Sprachstandard ECMA-262 (5th edition), was aktuell „bleeding edge“ ist. Nun gibt es die Möglichkeit, v8 zu experimentellen Zwecken auch mal aus PHP heraus zu bedienen. Dazu liegt v8js als PECL-Paket vor und kann recht schmerzfrei installiert werden. Aber step by step.

v8js installieren

Habe eben unter Ubuntu 12.04 erfolgreich folgendes Prozedere durchgeführt:

sudo apt-get install php5-dev php-pear libv8-dev build-essential
sudo pecl install pecl install channel://pecl.php.net/v8js-0.1.3
sudo echo extension=v8js.so >>/etc/php5/cli/php.ini

Dabei ist 0.1.3 die derzeit aktuellste v8js-Version, also einfach nachschauen was gerade aktuell ist. Soll auch die Apache-PHP-Version v8 abbekommen:

sudo echo extension=v8js.so >>/etc/php5/apache2/php.ini

Testen tun wir das ganze per phpinfo() bzw. mit

Veröffentlicht unter php, Javascript, webdev | 1 Kommentar

PHP WTF #7

Direkt entliehen von hier und ein schönes Beispiel für PHPs Handling mit Unicode-Zeichen:

<meta charset="utf8">
<?php
$a = 'äa';
echo "with space: " . $a[0] . " " . $a[1] . "<br />";  //� �
echo "without space: " . $a[0] . $a[1] . "<br />"; //ä

bzw. analog dazu:

<meta charset="utf8">
<?php
$a = 'äa';
echo "substr 0,1: " . substr($a, 0, 1) . "<br />"; //�
echo "substr 0,2: " . substr($a, 0, 2) . "<br />"; //ä

Klar: Das ä belegt 2 Byte:

<?php
$a = 'äa';
echo "strlen: " . strlen($a) . "<br />"; //3
echo "mb_strlen: " . mb_strlen($a, "UTF-8") . "<br />"; //2

Schon besser:

<meta charset="utf8">
<?php
$a = 'äa';
echo "mb_substr 0,1: " . mb_substr($a, 0, 1, "UTF-8") . "<br />"; //ä
echo "mb_substr 0,2: " . mb_substr($a, 0, 2, "UTF-8") . "<br />"; //äa

Mir war das zwar im Prinzip schon alles klar, durch so ein Beispiel wird aber nochmal deutlich, dass man die nicht-mb_* – Funktionen partout meiden sollte.

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

Best-of-the-Web 10

Neue Linkwelle!

Veröffentlicht unter php, Best of the Web, webdev | Hinterlasse einen Kommentar

Umkreissuche: Lat/Long und der Radius

Aufgabenstellung: Ich weiß, wo ich mich befinde (Lat / Long, ist ja aus den Smartphones easy herauszubekommen) und habe einen Radius in km, in dem ich POI’s mit der Open Streemap API suchen möchte.

Problem: Die OSM API bietet keine (mir bekannte) Möglichkeit, um meinen aktuellen Standort herum eine Radius-Suche in km auszuführen, sondern hätte gern eine Bounding Box angegeben, die die Ecken der Box als Geo-Koordinaten angibt – siehe hier:
http://www.overpass-api.de/api/xapi?node[bbox=8.62,49.85,8.68,49.89][amenity=fast_food|pub][@meta]

Dabei spezifiziert der Parameter bbox die Lat/Long-Koordinaten in der Reihenfolge links, oben, rechts, unten.

Dazu erstmal zum Verständnis:

Veröffentlicht unter php, webdev | 1 Kommentar

Open Streetmap API Tutorial: Umkreissuche

Für ein Hochschulprojekt („Ortsbezogene Freizeitgestaltung“) gilt es, die Open Streetmap API zum finden von POI’s in der Umgebung zu verwenden. In Darmstadt ist auf der OSM fast jede Parkbank kategorisiert. Also frisch ans Werk!

API Overflow! – Kurzvorstellung der einzelnen APIs

  • Die eigentliche OSM-Api (aktuell: v0.6) fokussiert sich eher auf das Erstellen, Bearbeiten und Auslesen von speziellen Punkten. Weniger hilfreich für den Zweck der Umkreissuche.
  • Die Overpass (X)API macht uns schon glücklicher. Per REST geben wir den Typ der zu suchenden Punkte in einem einzugrenzenden Bereich an. Beispiele folgen.
Veröffentlicht unter php, webdev | 2 Kommentare

Erwartete Exceptions richtig testen

Der klassische Ablauf beim Testen von Code, der eine Exception werfen soll, ist der Folgende (PHPUnit):

/**
 * @expectedException InvalidArgumentException
 */
public function testException()
{
   throw new InvalidArgumentException();
}

Problem dabei: Wir haben nicht spezifiziert, an welcher Stelle die Exception geworfen werden soll. Außerdem können wir nicht prüfen, ob die geworfene Exception genau die erwartete oder nur igendeine war.

Jetzt lässt sich das noch aufbohren:

/**
 * @expectedException        InvalidArgumentException
 * @expectedExceptionMessage Right Message
 */
public function testExceptionHasRightMessage()
{
    throw new InvalidArgumentException('Right Message');
}

Auch damit werde ich nicht glücklich. Wenn ich jetzt z.B. mehrere Exceptions in einem Test prüfen möchte (guter Stil hin oder her) stößt man an die Grenzen diesen Ansatzes.

Etwas feingranularer ist das Handling mit der nachfolgend vorstellten Methode setExpectedException.

Veröffentlicht unter php, webdev | 5 Kommentare

Per PHP-CLI die eigene IP herausfinden

Bekanntlicherweise ist die IP per $_SERVER auf der CLI nicht verfügbar. Was hilft: gethostbynamel. Die Funktion liefert eine Liste von IPv4 Adressen zu einem Hostname zurück.

print_r(gethostbynamel("microsoft.com"));

/*
Array
(
    [0] => 207.46.232.182
    [1] => 207.46.197.32
)
*/

Lässt sich leicht abgewandelt auch zum herausfinden der eigenen IP benutzen:

function getOwnIP($default = false)
{
	$ips = gethostbynamel('localhost');
	
	foreach ($ips as $ip)
		if ($ip != "127.0.0.1") return $ip;
		
	return $default;
}

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

Interessante Testarten: Mutationstest und Fuzzing

Bin heute über 2 Testverfahren gestolpert, die ich vorher noch nicht auf der Rechnung hatte. Fangen wir beim Mutationstest an.

Mutationstest

Dabei wird die zu testende Applikation vollautomatisch von einem Programm abgeändert. Das kann etwa so aussehen, dass in einer Schleife aus einem <= ein < gemacht wird. Hier orientiert sich die Art der eigebauten Fehler an den gern von Programmierern gemachten, also z.B. Schleifengrenzen und Verschachtelungen. Wichtig ist hierbei, dass pro Durchlauf immer nur eine Manipulation vorgenommen wird, sonst lässt sich die Auswirkung schließlich schlecht lokalisieren.

Veröffentlicht unter php, Software Engineering, Security, webdev | Hinterlasse einen Kommentar

Blick über den Tellerrand: LINQ

Ich habe aktuell beruflich wenig mit PHP zu schaffen, erklärt wohl auch die momentane Post-Flaute etwas. Joa, der angenehme Nebeneffekt davon ist aber, dass man beim Rumschlagen mit anderen Sprachen auch andere Konzepte verinnerlicht. So bin ich im Microsoft C# – Umfeld auf LINQ gestoßen. Bedeutet Language INtegrated Query. Was erstmal so unspektakulär klingt, ist eine verdammt mächtige Abfragesprache für Container (Arrays, Listen, Collections …).

LINQ?

string[] colors = new string[] { "Red", "Green", "Blue", "Blue", "Brown", "Pink", "Black" };

var result = (from c in colors 
              where c.StartsWith("B") && c.Contains("l") && c.Length > 3
              orderby c descending 
              select c).Distinct();

foreach (var color in result)
{
    Console.WriteLine(color);
}
/*
Blue
Black
*/ 

Veröffentlicht unter php, webdev | 7 Kommentare