Web + Mobile Blog / Berlin http://www.sebastianviereck.de PHP und VBA Excel Freelancer Wed, 08 Nov 2017 14:54:40 +0000 de hourly 1 http://wordpress.org/?v=3.5.1 Symfony 3 Test-Datenbank einrichten für Integration Tests http://www.sebastianviereck.de/symfony-3-test-datenbank-einrichten-fuer-integration-tests/?utm_source=rss&utm_medium=rss&utm_campaign=symfony-3-test-datenbank-einrichten-fuer-integration-tests http://www.sebastianviereck.de/symfony-3-test-datenbank-einrichten-fuer-integration-tests/#comments Wed, 08 Nov 2017 14:54:40 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3580-de Weiterlesen ]]> In Symofny wird automatisch beim Ausführen von Tests die  app/config/parameters_test.yml geladen.
Dort sollte dann eine andere Datenbank angegeben werden, der Einfachheit halber mit demselben Datenbank User:

database_host: same_as_dev
database_port: same_as_dev
database_name: test_db
database_user: same_as_dev
database_password: same_as_dev

Dann müssen auf der Konsole folgende Befehle ausgeführt werden:
Cache leeren:
php bin/console cache:clear –env=test

Datenbank erstellen
php bin/console doctrine:database:create –env=test

Tabellen erstellen
hp bin/console doctrine:schema:update –env=test –force

Dann könnne Fixtures geladen werden und Integration Tests geschrieben werden.

 

]]>
http://www.sebastianviereck.de/symfony-3-test-datenbank-einrichten-fuer-integration-tests/feed/ 0
Bundle Konfiguration innerhalb des Bundles laden http://www.sebastianviereck.de/bundle-configuration-innerhlab-des-bundles-laden/?utm_source=rss&utm_medium=rss&utm_campaign=bundle-configuration-innerhlab-des-bundles-laden http://www.sebastianviereck.de/bundle-configuration-innerhlab-des-bundles-laden/#comments Tue, 07 Nov 2017 12:38:49 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3575-de Weiterlesen ]]> Damit die Bundle unabhängig voneinander funktioneiren und man Abhängigkeiten vermeidet, sollte ein Bundle sein eigenen Konfigurationen beinhalten

z.B. : src/MyBundle/Resources/config/config.yml

aber auch selber laden.

Das Laden der Konfiguration ist über den DependencyInjection Container möglich.

Beispiel:

Die folgende config soll geladen werden. Sie enthält eigene Bundle-Parametern und benutzen Extension Parametern:

my_bundle:   #Naming Convention!
  modules:

extension_x:
  param: "foo.html.twig"

Es müssen 2 Dateien angelegt werden:

src/MyBundle/DependencyInjection/MyExtension.php:

namespace MyBundle\DependencyInjection;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

/**
 * This is the class that loads and manages bundle configuration.
 */
class ApyExtension extends Extension implements PrependExtensionInterface
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {

        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $container->setParameter('my_bundle.modules', $config['modules']);

        //$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        //$loader->load('services.yml');
    }

    public function prepend(ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('config.yml');
    }
}

und src/MyBundle/DependencyInjection/Configuration.php:

namespace MyBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * This is the class that validates and merges configuration from app/config files.
 */
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('my_bundle');

        $rootNode
            ->children()
                ->arrayNode('modules')
                    ->defaultValue([])
                        ->prototype('variable')
                    ->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
}

Dann kann im Controller auf die Configuration zugegriffen werden:

$configuration = $this->getParameter('my_bundle.modules');

Hinweis:

Bei mir musste noch die MyBundle\MyBundle angepasst werden, damit die load() Methode aufgerufen wird.

namespace MyBundle;

use ApyBundle\DependencyInjection\ApyExtension;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyBundle extends Bundle
{
    /**
     * @return MyExtension
     */
    public function getContainerExtension()
    {
        return new MyExtension();
    }
}
]]>
http://www.sebastianviereck.de/bundle-configuration-innerhlab-des-bundles-laden/feed/ 0
Syfmony 3.3. – Wie man ein Repository als Service injeziert mittels Dependency Injection http://www.sebastianviereck.de/syfmony-3-3-wie-man-ein-repository-als-service-injeziert-mittels-dependency-injection/?utm_source=rss&utm_medium=rss&utm_campaign=syfmony-3-3-wie-man-ein-repository-als-service-injeziert-mittels-dependency-injection http://www.sebastianviereck.de/syfmony-3-3-wie-man-ein-repository-als-service-injeziert-mittels-dependency-injection/#comments Wed, 01 Nov 2017 13:21:22 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3572-de Weiterlesen ]]> In Symfony 3 wird standardmäßig immer der EntityManager injected, um dann darüber das entsprechende Repository zur Verfügung zu bekommen.

Meistens wird aber nur genau ein Repository benötigt und der Code und die Tests werden aufgebläht.

Es gibt eine einfach Möglichkeit in der Configuration einen Service von einem Respository zu erstellen:

service.repository.name:
 class: 'AppBundle\Repository\MyEntity'
 factory: 'Doctrine\ORM\EntityManagerInterface:getRepository'
 arguments: ['AppBundle\Entity\MyEntity']
]]>
http://www.sebastianviereck.de/syfmony-3-3-wie-man-ein-repository-als-service-injeziert-mittels-dependency-injection/feed/ 0
Testable PHP CSV Streamreader Class inklusive Shunks http://www.sebastianviereck.de/testable-php-csv-streamreader-class-inklusive-shunks/?utm_source=rss&utm_medium=rss&utm_campaign=testable-php-csv-streamreader-class-inklusive-shunks http://www.sebastianviereck.de/testable-php-csv-streamreader-class-inklusive-shunks/#comments Mon, 30 Oct 2017 15:06:56 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3568-de Weiterlesen ]]> class CsvReader implements ReaderInterface { /** * shunk size for file import */ private $shunkSize; /** * @param int $shunkSize */ public function __construct(int $shunkSize) { $this->shunkSize = $shunkSize; } /** * @param string $file * @param callable $callback * * @return array * @throws StorageException */ public function shunkCsvFile(string $file, callable $callback): array { $file = $this->getFileObject($file); $file->setFlags( SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY | SplFileObject::READ_AHEAD ); $row = 0; $data = []; if ($file->isFile()) { while (!$file->eof()) { $line = $file->fgetcsv(';'); $row++; if ($row === 1) { //skip header continue; } $data[] = $line; if (($row % $this->shunkSize) == 0) { $callback($data); $data = []; } } } $callback($data); } /** * @param string $file * * @return SplFileObject * * @codeCoverageIgnore */ protected function getFileObject(string $file): SplFileObject { return new SplFileObject($file); } ]]> http://www.sebastianviereck.de/testable-php-csv-streamreader-class-inklusive-shunks/feed/ 0 Symfony 3 Entity Pfad innerhalb des Bundles ändern http://www.sebastianviereck.de/symfony-3-entity-pfad-innerhalb-des-bundles-aendern/?utm_source=rss&utm_medium=rss&utm_campaign=symfony-3-entity-pfad-innerhalb-des-bundles-aendern http://www.sebastianviereck.de/symfony-3-entity-pfad-innerhalb-des-bundles-aendern/#comments Mon, 23 Oct 2017 08:24:20 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3563-de Weiterlesen ]]> Wenn man den Pfad für die Entitäten in Symfony 2 und 3 ändern will, der standardmäßig in @Bundle/Entity liegt, muss man nur das Mapping in der Konfiguration  anpassen.

Beispiel, das neue Mapping befindet sich im Ordner: @Bundle/Folder/Entity

doctrine:
   orm:
      mappings:
         Bundle: 
            type: annotation 
            is_bundle: true 
            dir: 'Folder/Entity' 
            prefix: Bundle\Folder\Entity
]]>
http://www.sebastianviereck.de/symfony-3-entity-pfad-innerhalb-des-bundles-aendern/feed/ 0
SSL für alle und kostenlos mit certbot.eff.org http://www.sebastianviereck.de/ssl-fuer-alle-und-kostenlos-mit-certbot-eff-org/?utm_source=rss&utm_medium=rss&utm_campaign=ssl-fuer-alle-und-kostenlos-mit-certbot-eff-org http://www.sebastianviereck.de/ssl-fuer-alle-und-kostenlos-mit-certbot-eff-org/#comments Thu, 19 Oct 2017 09:03:09 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3559-de Weiterlesen ]]> HTTPS und SSL ist wichtig für jede Webseite und oft ein lästiger Zeitvertreib, wenn die Zertifikate ablaufen und man ganz schnell die aktuellen Zertifikate installieren muss.

Eine einfache und ksotenlose Alternative ist Let’s Encrypt, die einen kostenlosen Service anbieten mit dem man nicht nur sehr schnell (5 Minuten) SSL Zertifikate installieren kann, sonder der sich auch um die Aktualisierung der Zertifikate kümmert, die alle 90 Tage ablaufen.

Dazu installiert man einen Client auf der Console namens certbot, der automatisch die Zertifikate beim hauseigenen Webserver/Loadbalancer einbindet (nginx, apache) und später per Cronjob aktuell hält.

Eine tolle Sache, habe ich auf der Seite baby-taschenrechner.de im Live Einsatz und bin sehr zufrieden.

]]>
http://www.sebastianviereck.de/ssl-fuer-alle-und-kostenlos-mit-certbot-eff-org/feed/ 0
React Native für hybride native Apps http://www.sebastianviereck.de/react-native-fuer-hybride-native-apps/?utm_source=rss&utm_medium=rss&utm_campaign=react-native-fuer-hybride-native-apps http://www.sebastianviereck.de/react-native-fuer-hybride-native-apps/#comments Sun, 15 Oct 2017 08:17:28 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3556-de Weiterlesen ]]> Ein sehr interssante Möglichkeit um native Apps für Android und iOS zu schreiben bietet React Native von Facebook, damit wird zwar in Javascript und react.js gecodet, aber es werden damit native Funktionen benutzt wie bei Titanium und im Gegensatz zu Phonegap.

Sicherlich eine höchst interessante Alternative zu Titanium und Phonegap.

]]>
http://www.sebastianviereck.de/react-native-fuer-hybride-native-apps/feed/ 1
Docker – eine Einführung http://www.sebastianviereck.de/docker-eine-einfuehrung/?utm_source=rss&utm_medium=rss&utm_campaign=docker-eine-einfuehrung http://www.sebastianviereck.de/docker-eine-einfuehrung/#comments Thu, 12 Oct 2017 13:45:04 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3524-de Weiterlesen ]]>

Docker Cookbook by Sébastien Goasguen (2015-11-25)

Docker ist ein Virtualisierungs-Tool, mit dem sich Betriebsystemumgebungen und dort lauffähige Software in Container verpackt werden kann und auch auf betriebsystemfremden Umgebungen ausgeführt werden kann.

Die Vorteile von Docker:

- mit Docker können sehr einfach Container ausgetauscht werden, dies hilft bei der Arbeit an gemeinsamen Projekten weiter, wenn Infrastruktur angeapsst werden muss, erst auf der dev Umgebung, dann auf der Test Umgebung usw. So können Test mit der passenden Umgebung ausgeführt werden, man hat somit eine dynamische Testumgebung, anstelle einer statischen

- performance Vorteile gegenüber virtuellen Maschinen

- die Container machen es einfacher, die Entwicklungsumgebung bei Softwareprojekten allen Teilnehmern schnell und einfach zur Verfügung zu stellen. Dadurch wird das Onboarding einfacher und Abhängigkeiten werden vermieden, wie z.B. ein Development Server, auf dem alle arbeiten, der aber nicht verändert werden darf

- auch verteilte Systeme könnne so endlich im Development und Testing Umgebung simuliert und getestet werden. Dadurch könnne Fehler früher gefunden und vermieden werden. Wer kennt das nicht, das Produktivsystem besteht aus mehreren Nodes hinter einem Loadbalancer mit Master/Slave Datenbank, aber das Dev/Test/Staging System hat nur eine Node ohne Slave.

- Plattformunabhängikeit: Man kann auf seinem MAC Windows Applikationen laufen lassen im Container ohne Probleme

Docker besteht aus mehreren Komponenten:

Docker Begrifflichkeiten

Bildschirmfoto 2017-10-01 um 14.14.42

Docker Engine

Die docker (Engine) ist eine CLI-Applikation mit der man mit dem Docker Daemon auf den Docker Hosts steuern kann.

Docker Host

Auf dem Docker Host laufen die Docker Container. Diese werden über den Docker Daemon orchestriert.

Docker Client

Auf dem Client läuft die Docker Engine. Von hier aus kann ein Docker Host gesteuert werden.

Docker Daemon

Der Docker Damon läuft auf dem Docker Host und orchestriert die Docker Container. Der Daemon kann über die CLI mit dockerd gesteuert werden. Im Regelfall wird der Daemon jedoch mit dem Docker Client gesteuert. Für die Steuerung existiert eine REST API und ein SDK in Go und Python.

Docker Registry

Auf der Docker Registry werden Docker Images gehostet. Beispielsweise sind Docker Hub und die Docker Cloud öffentliche Registries. Private unternehmseigene Registries könnnen sehr einfach selbst aufgesetzt werden.

Image

Ein Image ist ein Packet, das alles beinhaltet um eine Software zu betreiben, wie Code, Runtime, Bibliotheken und Konfigurationen. Docker Images können aus dem Docker Hub geladen und erweitert werden und selbsterstellt werden mit dem docker build Befehl.

Container

Ein Container ist eine laufende Instanz eines Images. Sie läuft isoliert auf dem Host-System und kann über Host Ports und Dateien zugreifen bei entsprechender Konfiguration. Container lassen Applikationen nativ auf dem Host Kernel ausführen und benötigen nur soviel Systemressourcen wie gerade benötigt, da sie in einem eigenen Porzess laufen auf dem Host Prozess. Virtuelle Maschinen dagegen haben nur eine virtuellen Zugriff auf die Host Resourcen.

Docker Toolbox

Die Docker Toolbox besteht aus der Docker Engine und verschiedenen Docker Utilities (Docker Compose, Docker Machine, Kitematic). Die Toolbox benutzt eine virtuelle Maschine, die mit Virtual Box ausgeführt wird, als Docker Host. Diese virtuelle Maschine ist boot2docker. Sie ist für MAC und PC erhätlich.

Docker Machine
Die Docker Machine wird meist lokal installiert und damit können verschiedene Docker Hosts administriert werden. Die Docker Engine kann damit auf den Hosts installiert werden. ALs Hosts kommen auch Cloud Provider wie Azure, AWs oder DigitalOcean in Frage,

Boot2Docker

Boot2docker ist eine extrem leichtgewichtige (27MB) Linux Distribution basierend auf Tiny Core Linux und kann direkt im RAM ausgeführt werden. Das Linux System dient als Docker Host und beinhaltet den Docker Daemon. Boot2Docker wird z.B. auf OS X eingesetzt, weil der Docker Daemon dort nicht läuft.

Docker Compose

Kitematic

Kitematic ist eine GUI um Container zu starten und zu verwalten, Teil der Docker Toolbox.

Docker Cloud

Die Docker Cloud dient zum Deployment und zum Testen von mit Docker entwickelten Applikationen.

 

 

 

 

]]>
http://www.sebastianviereck.de/docker-eine-einfuehrung/feed/ 0
Projekt: baby-taschenrechner.de http://www.sebastianviereck.de/projekt-baby-taschenrechner-de/?utm_source=rss&utm_medium=rss&utm_campaign=projekt-baby-taschenrechner-de http://www.sebastianviereck.de/projekt-baby-taschenrechner-de/#comments Thu, 12 Oct 2017 09:50:51 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3547-de Weiterlesen ]]> Das gerade fertiggestellt Projekt baby-taschenrechner.de beschäftigt sich mit den Fragestellungen rund um die Entwicklung des eigenen Kindes:

  • Wie groß wird mein Kind werden in x-Jahren
  • Wie schwer wird mein Kind in x-Jahren
  • Ist mein Kind zu schwer/zu dünn
  • Welche Kleidergröße wird es wann tragen?

Die Webseite soll Eltern dabei helfen herauszufinden, wann sie welche Kleidergröße kaufen müssen, um im nahenden Winter/Sommer das passende zu Hause zu haben.

Eltern können so einschätzne, ob das Kind zu dünn oder zu dick ist  für ihr Alter/Größe/Gewicht-Verhältnis.

Für die Realiserung wurden folgende Technologien verwendet:

Symfony 3, Docker, MySQL, PHP, GIT, Google Material Design, Amazon AWS

]]>
http://www.sebastianviereck.de/projekt-baby-taschenrechner-de/feed/ 0
Authentifizierung mit X-Pack für Elasticsearch einrichten http://www.sebastianviereck.de/authentifizierung-mit-x-pack-fuer-elasticsearch-einrichten/?utm_source=rss&utm_medium=rss&utm_campaign=authentifizierung-mit-x-pack-fuer-elasticsearch-einrichten http://www.sebastianviereck.de/authentifizierung-mit-x-pack-fuer-elasticsearch-einrichten/#comments Tue, 03 Oct 2017 08:22:58 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3540-de Weiterlesen ]]> Um eine einfach HTTP basic authentication einzurichten für Elasticsearch mit Username und Passwort muss man als erstes X-Pack installieren.

Danach sollten alle Funktionen automatisch mit Basic Auth geschützt sein. Nach der Installation steht ein Default-User bereit, um weiterarbeiten zu können:

Name: elastic
Password: changeme

Damit können dann erfolgreich Requests gemacht werden:

curl --user elastic:changeme -XGET 'localhost:9200'

Anlegen eigener User

Nun könnne eigene User hinzugefügt werden:

curl --user elastic:changeme -XPOST 'hlocalhost:9200/_xpack/security/user/SebastianViereck?pretty' -H 'Content-Type: application/json' -d'
{
  "password" : "thePassword",
  "roles" : [ "superuser"],
  "full_name" : "Sebastian Viereck",
  "email" : "",
  "metadata" : {
    "intelligence" : 7
  },
  "enabled": true
}

Danach können sofort Requests mit dem User gemacht werden:

curl --user SebastianViereck:thePassword -XGET 'localhost:9200'

Es sollten eigene Rollen angelegt werden und benutzt werden oder wie hier die vorgefertigten Rollen (superuser) benutzt werden.

Deaktivieren des Elastic Users

Sehr wichtig: Natürlich muss der Default elastic User mit dem “changeme” Passwort wieder deaktiviert werden. In der elasticsearch.yml muss dafür der folgende Parameter eingesetzt werden:

xpack.security.authc.accept_default_password: false

Und der elasticsearch Service neugestartet werden:

 sudo service elasticsearch restart

Zur Kontrolle sollte bei dem Request eine Fehlermeldung erscheinen:

curl --user elastic:changeme -XGET 'localhost:9200'

Weitere Verbesserungen der Sicherheit

Es sollte unbedingt eine Daten-Verschlüsselung mit SSL benutzt werden.

Der IP Raum, mit dem überhaupt kommuniziert werden darf, sollte auch eingeengt werden.

]]>
http://www.sebastianviereck.de/authentifizierung-mit-x-pack-fuer-elasticsearch-einrichten/feed/ 0