Kategorien
PHP PHPUnit Testing Webdeveloper Tools

Run PHPUnit Unit and Integrations test with different configurations in PHPStorm

If you want to develop unit and integration tests with PHPStorm you can easily bootstrap your application and run your tests. But if you want to develop real unit tests in your local development enviroment without having a database connection or a cache, you need to make sure, that your application is configured differently, when unit tests are running. In this article you will learn how to do that and how to make PHPStorm will automatically recognize which tests/tests suites you want to execute.

Requirement:

Your integration and unit tests are seperated in 2 directories, like:

/tests/unitTests
/tests/integrationsTests

Overview

Kategorien
Elasticsearch PHP

Elasticsearch Subquery Scoring Optimization

If you want to build a search query in Easticsearch where you can give documents a bonus score depending on how often a property can be found in other documents

– you need is a Subquery which is not supported by Elasticsearch, you need another better solution.

An Example for a Subquery is the problem:

Imagine a CD online shop. You want to score CDs ( = documents) higher which

1. match a term query AND

2. and which artist has many other CDs in your shop database

You would need a field, which aggragts the artist count in your mapping (artistCount for Example) and on query time and boost the artistCount field with the score:

{
    "query" : {
        "custom_score" : {
            "query" : {
                "match_all" : {}
            },
            "script" : "_score + (1 * doc.artistCount.integerValue)"
        }
    }
}

It would be also a good idea, to have a second index, which holds the artistCount information, because on every update of the inventory of your shop, the artsitCount needs to be recalculated.

 

 

Kategorien
PHP PHPUnit Testing

PDOException: You cannot serialize or unserialize PDO instances

Beim Mocken von Objekten mit PHPunit kann es zur Fehlermeldung:

PDOException: You cannot serialize or unserialize PDO instances

kommen, immer dann, wenn im Constructor eine PDO Instanz injeziert wird. Dies kann unterbunden werden durch:

class PDOMock extends PDO{
    public function __construct(){}
}
Kategorien
GIT Version Control

PHPStorm .idea Ordner aus dem GIT entfernen aber lokal behalten

Wenn man ausversehen den .idea Ordner mit in seiner GIT Versionierung übernommen hat, ist es leider über die IDE PHPStorm nicht möglich, diese wieder zu entfernen.

Man kann aber einfach über die Konsole einen Befehl ausführen, der den Ordner aus dem GIT entfernt und lokal weiter behält (kein löschen der mühsam eingerichteten Einstellungen!).

git rm --cached -r -f  .idea/

Danach sollte in der .gitignore der Ordner eingetragen werden:

/.idea
Kategorien
Hardware

NAS / externe Festplatte selbst retten und reparieren

Wenn einem mal wieder die Festplatte ohne Backup abgeschmiert ist oder das NAS einfach nicht mehr die Verbindung aufnehmen will zum eigenen Rechner, interessiert man sich für die Datenrettung von Festplatten.

Mit ein paar einfachen Schritten und Gadgets lässt sich das schnell von zu Hause aus machen.

1. Schritt: Externe Festplatte entkernen, NAS zerlegen

Dabei geht es genauso brutal zu, wie es sich anhört: Die modernen Verpackungen sind schwer zu knacken. Die Bergung der Festplatte aus dem Gehäuse ist oftmals schwieriger als gedacht, aber mit ein wenig Gewalt und Köpfchen möglch. Am wichtigsten ist, das Verstecke der kleinen Mini-Schraube zu finden, die hinter einem Aufkleber in der hintersten Ecke des Gehäuses zufällig platziert wurde, damit man sein Gerät auf jeden Fall nie wieder zusammen bauen kann.

Wenn man fertig ist mit seinem NAS sieht das in etwa so aus:

IMG_4954
Mein stark beschädigtes und garantiert nie mehr funktionsfähiges NAS, oben links ist die ausgebaute Festplatte zu sehen, die im nächsten Schritt ausgelesen wird. 3 Jahre hat es gehalten das Miststück, danke Samsung für den Müll

2. Schritt: Auslesen der Festplatte mit dem Kloner

Kategorien
VBA Excel

VBA On Dropdown Change Event Aktion ausführen

Wenn man auf das Ändern eines Dropdowns oder einer Zelle/Range reagieren will und eine andere Aktion ausführen will, dann kann man dies mittels des Worksheet_Change Events und am besten mittels eines benamten Bereiches /Ranges:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim checkTarget As Range
    Set checkTarget = Application.Intersect(Target, Range("my_named_range"))
    If checkTarget Is Nothing Then
        Debug.Print "not active range, exit"
    Else
        MsgBox "success"
    End If

End Sub
Kategorien
PHP

PHP Wie verwendet man password_verify, password_hash und password_needs_rehash richtig

Mit der ab PHP 5.5. eingeführten Passwort-Hash Funktionalität kann man das Problem umgehen, dass ständig neue Hash Funktionen benutzen werden müssen, weil die alte zu leicht knackbar ist.

Bei bestehenden Projekten steht man dann an dem Punkt, wo man bestehenden Hashes in der Datenbank hat und diese nicht einfach neu hashen kann, weil man den Klartext nicht kennt. Diese Funktionalität wird einem durch die neue password_verify Funktion abgenommen.

So könnte ein neues Login-Funktion aussehen, welches dieses Problem umgeht. Beim Anheben der Hash-Sicherheit (Zeitdauer zum Berechnen des Hashes) kann man den Wert $currentHashOption[‚cost‘] erhöhen

$username = 'asd@asdasd.de';
$password = 'xxxxxx';

$user = User::findByName($username);

if(password_verify($password, $user->password_hash) === false){
 throw new Exception('Invalid Login');
}
$currentHashAlgorithm = PASSWORD_DEFAULT;
$currentHashOption = ['cost' => 15];

$passwordsNeedsRehash = password_needs_rehash(
 $user->password_hash,
 $algorithm = $currentHashAlgorithm,
 $currentHashOption
);
if($passwordsNeedsRehash === true){
 $user->password_hash = password_hash($password, $currentHashAlgorithm, $currentHashOption);
 $user->save();
}
Kategorien
PHP Server Administration

Analyse von sehr großen gzip/bzip2 gepackten Log-Dateien per Stream

Man kann per Stream in PHP beim verarbeiten der Daten sehr große Log-Dateien, die mehrere GB groß sind, sehr leicht analysieren mit Hilfe von Stream Compression Filter.

Damit kann die Datei ohne sie komplett in den Speicher laden zu müssen entpackt und analysiert werden beim Einlesen der Datei.

Dadurch kann man während des einlesens der Log-Datei schon nach beliebigen Stellen im Code suchen:

$file = 'X:/file.log.bz2';
$searchString = '2017-01-01';

if(file_exists($file)){
   $handle = fopen($file, 'r');
   stream_filter_append($handle, 'bzip2.decompress');
   while(!feof($handle)){
      $line = fgets($handle);
      if(strpos($line, $searchString) !== false){
         echo $line;
      }
   }
   fclose($handle);
}
Kategorien
Webdeveloper Tools

Warum man Software Projekte nicht bei Agenturen entwicklen lassen sollte

Agenturen beschäftigen meist Freelancer, die für die Entwicklung einegstellt werden, sollten kommen ausschließlich eigene Programmierer zum Einsatz. Der Fokus liegt dabei auf einer schnellen und kostengünstigen Programmierung des Projektes. Dies äußert sich in einer schlechten Code Qualität, d.h. praktisch, wenn ein anderer Programmierer später etwas ändern soll, dann dauert das Ewigkeiten, da der Code so schlecht ist, dass man nicht durchsieht. Guter Code ist vor allem gut lesbar und verständlich, wozu es erfahrene Programmierer benötigt, denen auch Zeit dafür eingeräumt wird guten Code zu schreiben.

Bei Agenturen wird der Programmierer nicht angehalten guten Code zu schreiben und oft entscheiden man sich als Freelancer nur „im Ausnahmefall“ bei einer Agentur zu arbeiten, weil dies meist mit vielen Überstunden, Zeitdruck und schlechter Bezahlung einher geht. Deswegen landen nicht die guten Programmierer bei Agenturen, sondern eher die schwarzen Schafe.

Meine Empfehlung ist, nicht auf eine Agentur zu setzen bei der Entwicklung von Software, sondern lieber auf einen oder mehrer gute Freelancer, der das Projekt gewissenhaft und in direkter Kommunikation umsetzt.

Beim Vergleich von Angeboten von verschiedenen Freelancern sollte nicht nur auf den Preis, sondern auch auf die Erfahrung des Programmierers und Qualität der dadurch entstehenden Software ein Augenmerk gelegt werden.

Meine Gedanken darüber habe ich aus meinen und den Erfahrungen von anderen Freelancern über die Jahre in Berlin gesammelt.

Kategorien
PHP

Verabreiten großer Dateien in PHP mittels Generator

Um große Datenmengen mit PHP zu verarbeiten benötigt man viel Memory Speicher, weil große Mengen Daten geladen und dann verarbeitet werden. Eine speichersparende Alternative bieten Generatoren ab PHP 5.5., die mit dem yield Befehl durch große Datenmengen iterieren können und nur Speicherplatz für einen Datensatz belegen.

Beispiel: Verarbeiten einer großen CSV Datei mittels Generators:

<?php
class CsvFile {

    protected $file;

    public function __construct($file) {
        $this->file = fopen($file, 'r');
    }

    public function parse() {
        while (!feof($this->file)) {
            yield fgetcsv($this->file);
        }
        return;
    }
}

$csv = new CsvFile('/pathTo/file.csv');
foreach ($csv->parse() as $row) {
    echo $row;
}