Web + Mobile Blog / Berlin http://www.sebastianviereck.de PHP Freelancer Tue, 17 Apr 2018 06:57:10 +0000 de hourly 1 http://wordpress.org/?v=3.5.1 Symfony Security Passwörter hashen mit dem PasswordEncoder http://www.sebastianviereck.de/symfony-security-passwoerter-hashen-mit-dem-passwordencoder/?utm_source=rss&utm_medium=rss&utm_campaign=symfony-security-passwoerter-hashen-mit-dem-passwordencoder http://www.sebastianviereck.de/symfony-security-passwoerter-hashen-mit-dem-passwordencoder/#comments Tue, 17 Apr 2018 06:22:05 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3765-de Weiterlesen ]]> Der PasswordEncoder des Symfony Frameworks ist sehr gut geeignet auch in Zukunft sichere Hashes von Passwörtern in der Datenbank zu speichern und zentral zu konfigurieren.

Das SecurityBundle muss ggf. nachinstalliert werden:

composer require symfony/security-bundle

Man legt dazu in der security.yaml fest, welchen Hashing Algorithmus man verwenden will für welche Entität:

security:
    encoders:
        App\Entity\User: bcrypt

Die Entität muss das UserInterface implementieren:

namespace App\Entity;

use Symfony\Component\Security\Core\Encoder\UserPasswordEncoder; 
use Symfony\Component\Security\Core\User\UserInterface;

class User implements UserInterface{

/**
 * @param string
 *
 * @ORM\Column(type="string", length=100)
 */
protected $password;

/**
 * @return string
 */
public function getPassword()
{
    return $this->password;
}

/**
 * Returns the roles granted to the user.
 *
 * <code>
 * public function getRoles()
 * {
 * return array('ROLE_USER');
 * }
 * </code>
 *
 * Alternatively, the roles might be stored on a ``roles`` property,
 * and populated in any number of different ways when the user object
 * is created.
 *
 * @return (Role|string)[] The user roles
 */
public function getRoles()
{
 return array('ROLE_USER');
}

/**
 * Returns the salt that was originally used to encode the password.
 *
 * This can return null if the password was not encoded using a salt.
 *
 * @return string|null The salt
 */
public function getSalt()
{
 return null;
}

/**
 * Removes sensitive data from the user.
 *
 * This is important if, at any given point, sensitive information like
 * the plain-text password is stored on this object.
 */
public function eraseCredentials()
{

}

Dann kann man den PasswordEncoder injezieren per Dependency Injektion:

App\Repository\UserRepository:
      - '@security.password_encoder'

und zum speichern von Passwörtern in der Datenbank benutzen (ohne Dependency Injektion):

/**
 * @param User $user
 * @param string $password
 *
 * @return string
 */
protected function encodePassword($user, $password): string
{
    /** @var UserPasswordEncoder $passwordEncoder */
    $passwordEncoder = $this->container->get('security.password_encoder');
    return $passwordEncoder->encodePassword($user, $password);
}

und zum Überprüfen von Passwörtern beim Login (mit Dependency Injektion:

if(!$this->passwordEncoder->isPasswordValid($user, $password)) {
    throw new UnauthorizedHttpException('invalid login');
}
]]>
http://www.sebastianviereck.de/symfony-security-passwoerter-hashen-mit-dem-passwordencoder/feed/ 0
Angular deutsche Lokalisierung konfigurieren http://www.sebastianviereck.de/angular-deutsche-lokalisierung-konfigurieren/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=angular-deutsche-lokalisierung-konfigurieren http://www.sebastianviereck.de/angular-deutsche-lokalisierung-konfigurieren/#comments Wed, 11 Apr 2018 11:53:03 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3759-de Weiterlesen ]]> Um Angular ab Version2  die deutsche Sprache für Fehlermeldugen und auch das Datums-Format zu konfigurieren, muss man in der app.modules.ts folgendes einstellen:

...
import { LOCALE_ID} from '@angular/core';
import localeDe from '@angular/common/locales/de';
import localeDeExtra from '@angular/common/locales/extra/de';
import { registerLocaleData } from '@angular/common';
registerLocaleData(localeDe, localeDeExtra);

@NgModule({
 providers: [
 { provide: LOCALE_ID, useValue: 'de' },
 ]
})
]]>
http://www.sebastianviereck.de/angular-deutsche-lokalisierung-konfigurieren/feed/ 0
Tutorial Jenkins unter Windows einrichten http://www.sebastianviereck.de/tutorial-jenkins-unter-windows-installieren/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-jenkins-unter-windows-installieren http://www.sebastianviereck.de/tutorial-jenkins-unter-windows-installieren/#comments Fri, 06 Apr 2018 12:27:08 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3745-de Weiterlesen ]]> Einen Jenkins Server ist für jedes größere IT-Projekt ein großer Gewinn.

Im folgenden werde ich die Einrichtung unter Windows beschreiben.

Installation

Ein Installer kann unter Windows komfortabel benutzt werden, mit dem Jenkins dann einfach über einen Tomcat Webserver läuft und im Browser unter http://localhost:8080 erreichbar ist. Es startet automatisch die Installationsroutine, mit der der Jenkins rudimentär eingerichtet wird:

jenkins_installation

Automatische Installationsroutine beim Einrichten von Jenkins

Nach der Eingabe des Administrations Passwortes, welches sich in einer Datei im Jenkins Installations Ordner befindet (\Jenkins\secrets\initialAdminPassword), kann man die Jenkins Plugins installieren. Dabei empfielt es sich erstmal die von Jenkins vorgeschlagenen “von der Community am interessantesten” gehaltenen Plugins zu installieren.

jenkins_plugin_installation

Installation der Standard Community Plugins von Jenkins

Apache Ant

Um einen Build Prozess einzurichten, muss noch Apache Ant installiert werden. Apache Ant ist ein Java Tool, mit dem man über die build.xml einen Build Prozess definieren kann, es bneötigt das Java JDK um zu funktionieren.

Apache Ant und das Java JDK  kann komfortabel über Jenkins installiert werden. Für das JDK wird ein Oracle Account benötig.

Jenkins verwalten -> Konfiguration von Hilfsprogrammen

jenkins_jdk_installation

Automatische Installation von Java SDK

jenkins_ant_installation

Automatische Installation von Apache Ant

Einrichten des Jenkins Build Jobs

Jetzt sind alle Vorbereitungen getroffen, um einen neuen Jenkins Build Job anzulegen und den Build Prozess einzurichten (Menü -> neues Element anlegen -> “Free Style” Software Projekt auswählen).

jenkins_job_step1

Jenkins Job erstellen Step 1

Als Demo könnne wir ein Demo Jenkins Projekt verwenden: https://github.com/jenkinsci/testbed-ant-sample. Auf der nächsten Seite müssen wir das GIT Repository angeben:

jenkins_github_step2

Github Demo Repository konfigurieren

Als einzigen Build Step rufen wir das vorher konfiugurierte Ant auf, wodurch automatisch die Build Schritte aus der build.xml ausgeführt werden:

jenkins_buildstep_step2

Apache Ant auswählen

Abspeichern und der erste Build Prozess ist fertig.

Der erste Build kann gestartet werden mit einem Klick auf “Jetzt bauen”.

jenkins_build starten

Build starten

Das Ergebnis sollte blau = erfolgreich sein, um sich Details anzuschauen, kann man sich die Konsolenausgabe genauer anschauen, die besonders wichtig ist bei nicht erfolgreicher Einrichtung:

jenkins_build_erfolgreich

Konsolenausgabe des erfolgreichen Demo Builds

 

]]>
http://www.sebastianviereck.de/tutorial-jenkins-unter-windows-installieren/feed/ 0
puphpet.com – vagrant Boxen mittels GUI erstellen für die Entwicklung http://www.sebastianviereck.de/puphpet-com-vagrant-boxen-mittels-gui-erstellen-fuer-die-entwicklung/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=puphpet-com-vagrant-boxen-mittels-gui-erstellen-fuer-die-entwicklung http://www.sebastianviereck.de/puphpet-com-vagrant-boxen-mittels-gui-erstellen-fuer-die-entwicklung/#comments Tue, 20 Mar 2018 15:36:50 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3737-de Mit dem kostenlosen online Tool auf www.puphpet.com kann man ganz einfach Entwicklungsumgebungen in vagrant erstellen mit gewümnschten Kompoennenten wie MySQL, Elasticsearch, RabbitMQ, Redis und allem was man braucht. Es werden CentOS und Ubuntu unterstützt.

]]>
http://www.sebastianviereck.de/puphpet-com-vagrant-boxen-mittels-gui-erstellen-fuer-die-entwicklung/feed/ 0
Buch Review: Clean Architecture von Robert C. Martin http://www.sebastianviereck.de/buch-review-clean-architecture-von-robert-c-martin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=buch-review-clean-architecture-von-robert-c-martin http://www.sebastianviereck.de/buch-review-clean-architecture-von-robert-c-martin/#comments Mon, 12 Mar 2018 11:26:54 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3698-de Weiterlesen ]]> Der neue Klassiker von Uncle Bob beschäftigt sich mit Software Architektur: Was ist eine gute Softeware Arcjtektur und wozu braucht man Sie überhaupt.

Die wichtigsten Aussagen habe ich zusammengefasst im folgenden:

Wozu benötugt man eine gute Architektur? Es ist einfach ein Programm zu schreiben, das etwas bestimmtes tut, selbst Schulkinder schreiben Programme. Aber schwierig ist es ein Programm zu schreiben, was auch in Zukunft erweiterbar und felxibel ist, ohne große Kosten und Aufwand zu verursachen. Deswegen bracht es von Anfang an gute Architektur.

Die Evolution der Programmiersprachen besteht darin, dem Programmierer weniger Möglichkeiten zu geben, schlechten Code zu schreiben.

Man sollte nicht in die Falle tappen: Wir programmieren schnell das Projekt zu Ende um schnell am Markt zu sein und später räumen wir den Code auf. Das wird nie passieren.

Das User Interface (UI), die Datenbank und die Business Rules sollten unabhängig von einander über Interfaces mit einander verbunden und austauschbar sein (Plugin Architektur). Dies ermöglicht ein

  • unabhängiges Deployment der 3 Komponenten und
  • unabhängige Entwicklung in verschiedenen Teams

Funktionale Programmierung löst das Problem von Deadlocks und Multi-Threading Problematiken, da keine richtigen Variablen vorhanden sind.

Principles

Seperate the code that different actors depend on.

Actors sind verschieden Breieche einer Software, z.B. Buchhaltung und User-Management.

Protect higher level components from changes in lower-level components.

Depending on something that carries baggage that you don’t need can cause you troubles that you didn’t expect.

Add functionality without making changes to the interfaces.

Avoid depending on volatile concretions…use of stable abstract interfaces.

Keine Verweise auf veränderbare Klasse, verwende Interfaces statt dessen.

Leite nicht von sich ändernden Klassen ab. Sich ändernde Klassen sind solche, die sich während der Enticklung ändern können. Basisklassen eines Frameworks gehören nicht dazu.

Überschreibe keine Methoden in einer Vererbung. Anstelle dessen sollte die Funktion abstrakt gesetzt werden und mehrmals implementiert werden.

Niemals sollte der Name von etwas konkretem oder veränderlichem im Code auftauchen.

Gather together those things that change at the same time and for the same reasons. Seperate those things that change at different times or for different reasons.

Common Reusable Principle

Don’t force users of a component to depend on things they don’t need.

Ein guter Architekt

A good architect maximizes the number of decisions not made.

 

Business Rules

Die Business Rules Klassen einer Apllikation sollten keinerlei Abhängigkeiten enthalten zu Frameworks, Datenbanken sondern nur Daten erhalten und Daten zurückgeben über Interfaces.

 Frameworks

Frameworks sind wichtig und praktisch. Framworks sollten nicht die Ordnerstruktur des Projektes vorgeben. Wenn man ein Projekt öffnet, sollte man nicht sehen, dass es eine Symfony Applikation ist, sondern dass es sich um eine Healthcare Applkation handelt. Die Business Logik und die die Entität Klassen sollten keine Verweise of Framework Klassen beinhalten und auch die Unit-Tests dazu sollten keine Framrwork Klassen als Abhängigkeiten benötigen. Wenn man Webapllikationen baut, sollte dies in der Ordnerstruktur nciht erkennbar sein. Es ist ein Implementierungsdetail, ob die Applikation eine Web- oder Konsolenapplikation ist und es kann vorkommen, dass dieses Details ich verändert.

The Dependency Rule

Objekte dürfen nicht in eine höhere Ebene direkt miteinander in Abhängigkeit gebracht werden.

Die Rangfolge dabei ist die folgende (von unten nach oben):

Entitäten -> Use Cases -> Controllers / Presenters / Gateways -> Datenbank, UI, Web

Abhängigkeiten von einer oberen zu einer unteren Ebenen sind mittels Interfaces aufzulösen.

 Entitäten

Entitäten enthalten die kritischen Business Rules, die sich nur sehr selten ändern werden. Entitäten können in vielen Applikationen innerhalb des Unternehmens verwendet werden. Entitäten können Datenstrukturen und Funktionen enthalten. Bei einer Flugsuche wären das z.B.: Ort, Flüge, Passagiere, Fluggesellschaften.

Ein Flug wird von einer Fluggesellschaften betrieben.

Ein Flug geht von einem Ort zu einem anderen an einem bestimmten Zeitpunkt usw.

Use Cases

Use Cases sind Anwendungsspezifisch und steuern den Fluss der Daten zu und aus den Entitäten heraus.

Änderungen in diesem Layer haben keine Auswirkungen auf die Entitäten.

Interface Adapters

Der MVC  Layer gehören: Presenters, View und Controllers. Hier werden die Daten gemappt zwischen den Entitäten und z.B.: der Datenbank oder HTML-Formularen.

 

 

 

 

 

 

]]>
http://www.sebastianviereck.de/buch-review-clean-architecture-von-robert-c-martin/feed/ 0
Zertifizierung zum Zend Certified Engineer erfolgreich bestanden http://www.sebastianviereck.de/zertifizierung-zum-zend-certified-engineer-erfolgreich-bestanden/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zertifizierung-zum-zend-certified-engineer-erfolgreich-bestanden http://www.sebastianviereck.de/zertifizierung-zum-zend-certified-engineer-erfolgreich-bestanden/#comments Fri, 02 Mar 2018 08:05:30 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3680-de Weiterlesen ]]> Am 1. März habe ich die Prüfung erfolgreich abgelegt für die ich die letzten Monate gelernt habe. Wie zu erwarten war, waren die Fragen sehr, sehr kniffelig, aber die Vorbereitung hat sich bezahlt gemacht.

zce-2017-php-80x80

Vorbereitung

Ich kann jedem empfehlen sich vorher merhmals das Buch PHP7 Zend Certification Study Guide durchzulesen:

Außerdem sollte man alle Tests auf der Seite zendexam.com zu 80% erfolgreich beantworten können, dann ist man bereit für die Prüfung.

Anmeldung für die Prüfung

Man kann sich auf der zend.com Seite anmelden für die Prüfung , die man dann in der Nähe in einem Testcenter seiner Wahl absolvieren kann unter strengsten Bedingungen.

Einmal im Jahr gibt es einen Gutschein für die Prüfung auf retailmenot.com, wenn man Glück hat.

]]>
http://www.sebastianviereck.de/zertifizierung-zum-zend-certified-engineer-erfolgreich-bestanden/feed/ 0
Robert C. Martin über Programmierer und gute Architektur von IT-Projekten http://www.sebastianviereck.de/robert-c-martin-ueber-programmierer-und-gute-architektur-von-it-projekten/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=robert-c-martin-ueber-programmierer-und-gute-architektur-von-it-projekten http://www.sebastianviereck.de/robert-c-martin-ueber-programmierer-und-gute-architektur-von-it-projekten/#comments Fri, 16 Feb 2018 08:16:09 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3662-de Ich stimme Ihm in allem zu, was Oncle Bob zu sagen hat:

Über Architektur:

Über Programmierer und IT im Allgemeinem:

]]>
http://www.sebastianviereck.de/robert-c-martin-ueber-programmierer-und-gute-architektur-von-it-projekten/feed/ 0
PHPUnit returnCallback Beispiel http://www.sebastianviereck.de/phpunit-returncallback-beispiel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=phpunit-returncallback-beispiel http://www.sebastianviereck.de/phpunit-returncallback-beispiel/#comments Wed, 14 Feb 2018 09:26:08 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3658-de Mit dem PHPUnit returnCallback() Methode kann man dynamisch den Rückgabewert eines Mocks definieren.

Beispiel:

public function testCallback()
{
    $globalObject = [];
    $this->mock
        ->expects($this->any())
        ->method('method')
        ->will(
            $this->returnCallback(
                function($param) use ($globalObject) {
                     return globalObject;
                }
            )
        );
}
]]>
http://www.sebastianviereck.de/phpunit-returncallback-beispiel/feed/ 0
Travis CI: No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb) http://www.sebastianviereck.de/travis-ci-php-5-6-env-symfony_version3-4/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=travis-ci-php-5-6-env-symfony_version3-4 http://www.sebastianviereck.de/travis-ci-php-5-6-env-symfony_version3-4/#comments Mon, 12 Feb 2018 08:45:06 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3647-de Weiterlesen ]]> Bei der sehr kryptischen Fehlermeldung in Travis CI:

No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)

handlet es sich um ein Problem mit falschen Einrückungen im travis.yml File:

matrix:
  include:
    - php: 5.6
      env:
        - SYMFONY_VERSION='3.4.*'

Ein Leerzeichen zu wenig in der Zeile – SYMFONY_VERSION=’3.4.*’ und es kommt zu diesem wenig aufschlussreichen Fehler.

]]>
http://www.sebastianviereck.de/travis-ci-php-5-6-env-symfony_version3-4/feed/ 0
PHP: Parse Error: syntax error, unexpected ‘:’, expecting ‘;’ or ‘{‘ http://www.sebastianviereck.de/php-parse-error-syntax-error-unexpected-expecting/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-parse-error-syntax-error-unexpected-expecting http://www.sebastianviereck.de/php-parse-error-syntax-error-unexpected-expecting/#comments Tue, 30 Jan 2018 08:41:37 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3626-de Weiterlesen ]]> Bei der sehr kryptischen  Fehlermeldung

Parse Error: syntax error, unexpected ':', expecting ';' or '{'

handelt es sich in den meisten Fällen um eine PHP7 Inkompatibilität.

Der auszuführende Code enthält ein Sprach-Feature, was erst unter PHP7 verfügbar ist:

Return Type Definitions (Definition des Rückgabewertes). Beispiel:

function myFuntion($input): array
{
    return ['foo'];
}

Damit kann man festelegen, dass die Funktion ein Array zurückgeben muss, sonst wird ein TypeErrror ausgelöst.

Um den Code in einer niedrigeren PHP Version zum Laufen zu bringen, muss man die Return Type Definition entfernen:

function myFuntion($input)
{
    return ['foo'];
}

Spezialfall: composer

Bei mir kam dazu, dass es sich nciht um Code von mir handelte, sondern über Abhängigkeiten, die ich mit compser installiert hatte.
Typischerweise hat man bei composer die Minimum Version eingestellt von PHP:

"php": ">=5.6",

Es kann aber auch Sinn machen, die PHP-Version zu konfigurieren um Probleme zu vermeiden:

"config": {
    "platform": {
        "php": "5.6"
    }
},
]]>
http://www.sebastianviereck.de/php-parse-error-syntax-error-unexpected-expecting/feed/ 0