HdRs Blog

yet another blog

CakePHP 2 und PHPUnit

Beim Updaten auf CakePHP 2.0.5 und PHPUnit 3.6.7 ist mir beim Schreiben von Tests aufgefallen dass ich keine debug-Meldungen mehr angezeigt bekomme. Außer debug() funktioniert auch kein print_r() oder echo() mehr. Nach einiger Suche bin ich schließlich auf diesen Blogeintrag gestoßen: Unit-Testing Tips for 2.0 and PHPUnit

Kurz zusammengefaßt lässt sich sagen, dass PHPUnit ab 3.6 alle Ausgaben schluckt, für die CLI Veriante schlagen die CakePHP-Entwickler vor –debug zu verwenden. Da ich aber meine Tests lieber im Browser anschaue war das natürlich auch keine Option.
Die Lösung für mein Problem war dann schließlich eine eigene debug-Methode zu schreiben:

debug
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
public function debug($data, $pre = true) {
$data = print_r($data, true);
if ($pre)
$data = "<pre>" . $data . "</pre>";
echo $data;
if (empty($_SERVER['HTTP_HOST'])) // for cli mode use: --debug
return;
ob_flush();
}

Rufe ich nun im TestCase diese Methode mit $this->debug() statt debug() auf erhalte ich (fast) wie gewohnt meine Debug-Ausgaben.

UPDATE:
Alternativ kann man auch &debug=1 an die URL anhängen um die Ausgaben von debug(), print_r() und Co zu erhalten.

RSA mit JAVA und PHP – Teil 1 (JAVA -> PHP)

Daten zwischen PHP und JAVA mit RSA verschlüsselt auszutauschen gestaltet sich doch etwas schwieriger als anfangs gedacht. Nach etwas längerer Suche nach der Lösung habe ich mich entschlossen meinen Lösungsansatz hier zu veröffentlichen:

  1. Zuerst benötigen wir für den Server (PHP) und für den Client (JAVA) jeweils einen privaten und einen öffentlichen Schlüssel, diese erzeugen wir mit dem Kommandozeilentool openssl:
    1
    2
    openssl genrsa -out serverPrivateKey.pem 2048
    openssl rsa -in serverPrivateKey.pem -pubout -outform DER -out serverPublicKey.der

    Mit dem ersten Befehl wird der private Schlüssel für den Server erzeugt und im openssl Standardformat PEM abgespeichert. Der zweite Befehl speichert dann den dazugehörigen öffentlichen Schlüssel im DER Format ab. (Das DER Format ist das Standardformat für JAVA’s RSA.) Umgekehrt benötigen wir dann noch noch den privatenSchlüssel des JAVA Client (im DER Format) sowie den öffentlichen Schlüssel des Clients im PEM Format:

    1
    2
    3
    openssl genrsa -out clientPrivateKey.pem 2048
    openssl pkcs8 -topk8 -nocrypt -in clientPrivateKey.pem -outform der -out clientPrivateKey.der
    openssl rsa -in clientPrivateKey.pem -pubout -outform PEM -out clientPublicKey.pem

    Die Zahl 2048 gibt die Größe des Schlüssels in Bit an. Weniger als 2048 sollte man heutzutage nicht verwenden. Wer auf Nummer sicher gehen will nimmt hier 4096.

  2. Im nächsten Schritt importieren wir den öffentlichen Schlüssel des Servers in unserem JAVA Client:

    Java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    File pubKeyFile = new File("keys/serverPublicKey.der");
    byte[] buffer = new byte[(int) pubKeyFile.length()];
    DataInputStream in = new DataInputStream(new FileInputStream(pubKeyFile));
    in.readFully(buffer);
    in.close();
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(buffer));

  3. Nach dem importieren des publicKey können wir nun Daten verschlüsseln:

    Java
    1
    2
    3
    4
    5
    String text = "Geheimer Text!";
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] encrypted = cipher.doFinal(text.getBytes());

    Um mit den verschlüsselten Daten weiter arbeiten zu können, speichern wir diese ab:

    Java
    1
    2
    3
    4
    FileOutputStream fos = new FileOutputStream("/tmp/encrypted");
    fos.write(encrypted);
    fos.flush();
    fos.close();
  4. Verschlüsselte Daten mit PHP entschlüsseln.
    PHP
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $encryptedData = file_get_contents('/tmp/encrypted');
    $privKeyFile = file_get_contents('keys/serverPrivateKey.pem');
    $privKey = openssl_get_privatekey($privKeyFile);
    openssl_private_decrypt($encryptedData, $decrypted, $privKey, OPENSSL_PKCS1_PADDING);
    print "$decrypted\n";

    Und als Ausgabe erhalten wir (wie erwartet):
    Geheimer Text!

So das wars mit dem ersten Teil, der zweite Teil, mit der Verschlüsselung in der anderen Richtung folgt hoffentlich bald.

Video konvertieren für Android

Auf die Frage hin wie ich Filme/Serien auf meinem Android Gerät anschaue, habe ich mich dazu entschlossen einen kleinen Blogeintrag zu diesem Thema zu schreiben.

Ausgehend von meiner Suche nach den optimalen Einstellung für das Motorola Xoom mit einer Auflösung von 1280×800 (720p Videos möglich) bin ich auf folgende Seite gestoßen: Motorola XOOM – Optimal video setting, kurz zusammengefasst wird ein x264 Baselineprofil mit folgenden Eigenschaften empfohlen:

- No CABAC entropy coding.
- No B frames
- No 8×8 transforms (DCT)
- No Weighted Prediction

Die Konvertierung habe ich dann mit HandBrake durchgeführt und die Ergebnisse waren einwandfrei, als VideoPlayer auf dem Android Gerät empfehle ich übrigens den MX Video Player, wichtig ist dabei aber zusätzlich den richtigen Codec zu installieren, für das Motorola Xoom (aber auch das Nexus One) ist das dieser hier: MX Video Player Codec (ARMv7)

Für das Nexus One war nur die Änderung der maximalen Auflösung notwendig, die restlichen Einstellungen lieferten auch hier die gewünschten Ergebnisse.

Damit ihr gleich loslegen könnt hab ich meine HandBrake config hochgeladen, einmal für das Motorola Xoom und einmal für Smartphones mit einer Auflösung von 800×480 (wie zum Beispiel das Nexus One oder das Galaxy S1+).

Viel Spaß damit ;)