Web + Mobile Blog / Berlin http://www.sebastianviereck.de PHP und VBA Excel Freelancer Fri, 22 Sep 2017 08:16:36 +0000 de hourly 1 http://wordpress.org/?v=3.5.1 Elasticsearch Suggest Completion sehr langsam http://www.sebastianviereck.de/elasticsearch-suggest-completion-sehr-langsam/?utm_source=rss&utm_medium=rss&utm_campaign=elasticsearch-suggest-completion-sehr-langsam http://www.sebastianviereck.de/elasticsearch-suggest-completion-sehr-langsam/#comments Thu, 21 Sep 2017 09:05:58 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3499-de Weiterlesen ]]> Wenn das Auto-Completion Suggest Queries sehr langsam werden (beim mir um 1000ms = 1s), dann kann das daran liegen, dass contexts benutzt werden.

"titleSuggest": {
  "type": "completion",
  "contexts": [
    {
      "name": "contextName",
      "type": "category",
      "path": "path"
    }
  ]
},

Ohne Context werden diese Queries wieder schneller um den Faktor 100 (10ms).

]]>
http://www.sebastianviereck.de/elasticsearch-suggest-completion-sehr-langsam/feed/ 0
Die REST Webservice Architur – ein Überblick mit PHP http://www.sebastianviereck.de/die-rest-webservice-architur-ein-ueberblick/?utm_source=rss&utm_medium=rss&utm_campaign=die-rest-webservice-architur-ein-ueberblick http://www.sebastianviereck.de/die-rest-webservice-architur-ein-ueberblick/#comments Mon, 18 Sep 2017 17:03:51 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3481-de Weiterlesen ]]> Wenn man heutzutage einen Webservice bauen will, kommt man um REST nicht mehr herum. Als quasi Standard erfüllt es die Bedürfnisse an eine moderne Schnittstelle am besten, im Gegensatz zu den Alternativen aus der grauen Vergangenheit: RPC, DCOM, CORBA, RMI und SOAP.

Warum REST einsetzen?

1. Lose Kopplung

REST Schnittstellen können theoretisch gegeneinander ausgetauscht werden.

2. Interoperabilität

REST über HTTP ist in jeder Umgebung verfügbar und sehr einfach anzusprechen im Gegensatz zu den komplizierteren Ansätzen wie SOAP und CORBA.

3. Performance und Skalierbarkeit

Durch die Zustandslosigkeit können viele Anfragen aus dem Cache beantwortet werden und aufeinander folgende Anfragen müssen nicht von demselben System beantwortet werden (Skalierbarkeit)

Grundprinzipien von REST

eindeutige Ressourcen Identifikation

REST benutzt die URI (Uniform Resource Identifier) des HTTP Standards als eindeutige Kennzeichnung von Ressourcen.

Beispiel:

http://api.example.com/cart/1

Verknüpfung von Ressourcen (Linking)

Durch die Verknüpfung von Ressourcen mittels Links kann man Ressourcen verschieben und auch auf andere Server und Schnittstellen verteilen und erhält somit eine große Flexibilität. Dies setzt natürlich voraus, dass die Konsumenten die Links auch benutzten und nicht statisch darauf zugreifen.

Beispiel: GET http://api.example.com/post/21

{
    "name" => "post 1 heading here",
    "content" => "I write poems"
   "_links": {
      "related": [
         {
            "href": "http://api.example.com/comment/42",
         },
         {
            "href": "http://api.example.com/comment/78",
         },
      ],
      "author": [
         {
            "href": "http://crm.example.com/user/42",
         }
      ],
      "_self": {
            "href": "http://api.example.com/post/1",
        }   
   }
}

Mit Hilfe der Links ist es auch möglich Statusübergänge zu modellieren, indem man z.B. bei einer Bestellungs-Ressource einen Link für die Stornierung anbietet und “related” und nachdem die Bestellung storniert worden ist, diesen wieder entfernt. Dies sollte mit dem Caching abgewogen werden.

Die 6 HTTP Standardmethoden

REST Schnittstellen werden so aufgebaut, dass man theoretisch ohne Dokumentation mit Hilfe der 5 HTTP Methoden die Ressourcen beliebig manipulieren kann

  • GET – lesen
  • POST – ändern, im Zweifelsfall immer richtig
  • PUT – erstellen, ändern
  • DELETE – löschen
  • HEAD – existiert die Ressource, letzte Änderung der Ressource
  • OPTIONS – welche HTTP Methoden erlaubt die Ressource

Content Negotiation

Ein Client kann eine HTTP Ressource in einem bestimmten Format anfordern über den Accept Header.

Request:

GET http://api.example.com/post/21
Host: api.example.com
Accept: application/json

Antwort:

Als Antwort bekommt man die Informationen im JSON-Format zurück.

Statuslose Kommunikation

Die Kommunikation von Client und Server muss statuslos geschehen. Der REST Standard schreibt vor, dass der Zustand entweder vom Client gehalten oder vom Server in einen Ressourcenstatus abgelegt werden sollte

URI Ressourcen-Architektur bei REST

Im folgenden Fallbeispiel aus der Praxis, sollen Bestellungen für einen Online-Shop mittels einer REST API modelliert werden.

Als Ressourcen Namen dürfen keine Verben in REST benutzt werden, sondern nur Substantive.

1. Alle Bestellungen

a) sollen ausgegeben werden:

URI: /orders 
Methode: GET

b) sollen gefiltert nach den neuen Bestellungen ausgegeben werden

URI: /orders?state=created 
Methode: GET

c) sollen gefiltert nach den stornierten Bestellungen ausgegeben werden

URI: /orders?state=cancelled 
Methode: GET

d) sollen gefiltert nach den versandten Bestellungen ausgegeben werden

URI: /orders?state=shipped 
Methode: GET

2. Eine einzelne Bestellung soll:

a) angezeigt werden

URI: /order/{id} 
Methode: GET

b) erzeugt werden

URI: /order/{id} 
Methode: PUT

Woher soll der CLient die ID kennen? Erzeugt werden wird über /orders und POST. Der Antwort Code sollte HTTP 201- Created sein bei erfolgreichem Anlegen

URI: /orders 
Methode: POST

c) gelöscht werden

URI: /order/{id} 
Methode: DELETE

d) geändert werden

URI: /order/{id} 
Methode: PUT

e) die Lieferadresse angezeigt werden (Sub Ressource)

URI: /order/{id}/shipping-address 
Methode: GET

Sub-Ressourcen

Sind Teil von Ressourcen und können nicht ohne diese existieren. Diese Abhängigkeit wird in der URL manifestiert (/order/{id}/shipping-address).

Listen

Für alle Primärressourcen (order) gibt es meist Listenressourcen (orders). Sie bekommen eine eigene URI (/orders) zugeteilt.

Filter

Kategorien von Primärressourcen können Zustände sein wie im Beispiel (shipped, canceled) aber auch alle Bestellungen einer Region oder eines Monats. Für Filter wird an die URI ein GET Parameter angehängt, es gibt keinen eigenen Endpunkt (/orders/?state=canclled), es sei denn der Zustand hat spezielle Funktionen, dann kann auch eine Ressource für alle Stornierungen angelegt werden: /cancelations.

Paginierung

Eine Paginierung ist immer notwendig, weil die Menge an übertragenden Daten den Speicher des Servers oder Client ansonten irgendwann sprengen kann. Die Paginierungsmenge kann vom Server festgelegt werden, z.B. 10 Bestellungen und der Client blättert nur durch das Ergbenis (/orders?page=2) oder es kann auch ein dynamisches System gebaut werden mit der der Client entscheidet, wie viele Daten er benötigt (/orders?offset=40&limit=20).

Projektionen

Um die Datenmenge sinnvoll zu begrenzen, werden nicht alle verfügbaren Informationen einer Ressource ausgegeben.

Aggregationen

Im Gegensatz zur Projektion werden Attribute von verschiedenen Primär- und Listenressourcen zusammengefasst, um die Anzahl der Client Requests zu begrenzen.

HTTP Verben

 GET

Mit der HTTP  GET-Methode können Informationen von Ressourcen abgeholt werden. Es werden keine Seiteneffekte durch GET erzeugt werden, d.h. serverseitig darf sich kein Zustand ändern durch diese Operation. GET ist safe und idempotent und damit cachefähig. Der meiste Traffic einer API wird über GET Requests generiert.

Safe

Safe bedeutet: Die Aufrufe könnne gecacht und vorberechnet werden ohne Auswirkung auf die Ressource.

Idempotent

Bedeutet: Mehrmaliges Ausführen führt immer zum selben Ergebnis.

HEAD

Ist GET sehr ähnlich, nur ohne den Body der Response, es werden nur die Metadaten zurückgegeben. Damit kann der Client auf ressourcenschonende Weise feststellen, ob eine Ressource existiert und wann eine Ressource geändert worden ist. HEAD ist safe und idempotent und damit cachefähig.

PUT

Mit PUT werden Ressourcen aktualisiert oder erzeugt, falls nicht vorhanden. Auch PUT ist idempotent, ein mehrmaliges Aufrufen führt also zu demselben Ergebnis ohne Seiteneffekte. Dieses verhalten ist notwendig, da der Client eine PUT Anfrage an den Server senden kann ohne eine Antwort zu bekommen. Wenn er nochmals versucht den Request zu senden, sollte entweder die Ressource angelegt oder die schon im vorherigen Request erfolgreich angelegte Ressource geupdatet werden.

POST

Im engeren Sinne bedeutet POST das Anlegen von Ressourcen, aber es kann im weiteren Sinne auch für alle Zwecke eingesetzt werden, in dem keine andere Methode passt. POST muss weder idempotent und auch nicht save sein und ist niemals cachefähig.

DELETE

Eine Ressource kann hiermit gelöscht werden. Mehrmaliges löschen einer Ressource führt zum selben Ergbenis.

Options

Liefert die HTTP Methoden, die eine Ressource unterstützt.

Der Unterschied zwischen POST und PUT

Folgendes Szenario soll die unterschiedliche Nutzung von POST und PUT verdeutlichen:

Eine Bestellung soll den Zustand ändern von created auf committed und es gibt noch mehr Zustände einer Bestellung.

Mit einem PUT Request auf die Ressource müsste man den gesamten Inhalt der Bestellung übermittelt werden: Wann wurde sie aufgenommen, wieviel Geld kostet die Bestellung inkl. des neuen Status.

Bei einem POST Request würde man einen eigenen Endpunkt für die Ressource bauen /orders/1234/commit und mit einem leeren POST Request den Zustandsübergang herbeiführen.

Die POST Variante ist hier zu bevorzugen, weil nicht die ganze Ressource übertragen werden soll.

Außerdem gibt es dann die Möglichkeit die möglichen Zustandsänderungen mittels HAL (siehe nächstes Kapitel) zu verlinken und so für den Client die Businesslogik der Bestellungszustände zu verdeutlichen.

HTTP Status Codes

Eine Übersicht über alle Codes gibt es hier.

Der Server sollte mit einem passenden Status Code antworten. Wichtig ist die grobe Einteilung im Auge zu behalten:

2xx – Erfolgreiche Operation

3xx – Umleitung

4xx – Client-Fehler

5xx – Server-Fehler

REST Ressourcen Struktur: HAL

Eine Ressource kann in REST in einem beliebigen Format abgebildet werden. Das populärste Fomat ist HAL, welches vor allem die Verlinkungen der Ressourcen untereinander standartisiert.

{
....
    "_links": {
        "self": { "href": "/orders" },
        "curies": [{ "name": "ea", "href": "http://example.com/docs/rels/{rel}", "templated": true }],
        "next": { "href": "/orders?page=2" },
        "ea:find": {
            "href": "/orders{?id}",
            "templated": true
        },
        "ea:admin": [{
            "href": "/admins/2",
            "title": "Fred"
        }, {
            "href": "/admins/5",
            "title": "Kate"
        }]
    },
}

REST und PHP

Mit PHP gibt es folgende Frameworks, die einem dabei unterstütze gute REST Webservices zu erstellen:

Caching

Expirations-Caching

Beispiel:

Request:

GET /orders

Response:

HTTP/1.1 200 OK
Cache-Control: max-age=60 
#oder 
Expires: Sun, 22 Jan 2017 11:11:11 GMT

Der Server teilt mit Hilfe des Cache-Control Headers mit, das die Antwort 60 Sekunden lang gültig ist / gecacht wird und der Client solange nicht anfragen braucht. Alternativ kann er auch ein Expires Zeitpunkt setzen, bis zu dem die Informationen aktuell bleiben. Dies setz voraus, dass es sinnvoll ist die Daten zu cachen bzw. vorzuberechnen. Möglich ist dies z.B. bei allen Bestellungen, die 2016 gemacht worden sind. Bei den aktuellen Bestellungen ist dies nicht zwangsläufig sinnvoll.

Validierungs-Caching

Request:

GET /orders
If-Modified-Since: Sun, 22 Jan 2017 11:11:11 GM

Response:

HTTP/1.1 304 NOT MODIFIED

In diesem Fall entscheidet der Client, ob er eine Antwort benötig auf die Anfrage, wenn keine Änderungen vorliegen, seit einem bestimmten Datum. Der Server antwortet im Fall von nicht akutellen Daten mit einem Statuscode 304 ohne überflüssige Daten zu übertragen.

Der Cache-Control Header

Der Server kann mit Hilfe des Cache-Controls-Header dem Client mitteilen, wie clientseitig gecacht werden darf.

Dafür gibt es verschiedene Parameter:

max-age: die Dauer des Cachings in Sekunden

private: die Antwort darf nur im Client-Cache gespeichert, ist also User spezifisch

public: die Antwort darf auch in einem Shared-Cache gespeichert werden, ist nicht User spezifisch

s-max-age: die Dauer des Cachings in Sekunden für den Shared-Cache

no-store: bitte nicht cachen, bei Vertraulichen Daten

Caching-Systeme

Zum Cachen von HTTP Requests sollte man Varnish benutzen.

Security

Es sollte immer SSL und HTTPS verwendet werden.

Authentifizierung für private APIs

Basic Auth kann für private APIs schnell und einfach benutzt werden, dabei werden Username und Passwort in jedem Request mitgesendet. Es können auch sehr einfach LDAP oder NTLM Identity-Management Lösungen angeschlossen werden über den Webserver. Beispiel Apache Webserver mit LDAP.

Sichere Authentifizierung für öffentliche APIs

Mit Hilfe von Bearer Web Tokens Implementationen wie zum Beispiel JWT, kann man sehr einfach mit Clients kommunizieren, ohne das diese bei jedem Request Username und Passwort mitsenden müssen. Hierbei wird  beim ersten Authentifizierungs-Request ein JWT-Token zurückgegeben, der bei jedem weiteren Reqeust als Authentifizierung benutzt werden kann. Der Hashing-Algorithmus kann geändert werden und den aktuellen und immer steigenden Sicherheitsansprüchen angepasst werden.

Dokumentations Tools

Swagger

Swagger ist ein geniales Tool um sehr schnell einfache API Dokumentationen zu erstellen. Man schreibt damit in einem swagger File die YAML oder JSON die Dokumentation und kann mit der Swagger Library diese dann in eine schicke Dokumentation verwandeln. Live Demo

Apigility von Zend unterstützt Swagger via Adapter

genauso wie Symfony 2 und Yii 2

Es gibt natürlich auch ein PHPStorm Plugin.

RAML

Raml ist ähnlich wie Swagger, bietet aber noch mehr, z.B. die Funktionalität eines Mock-Servers für das Testen von Applikationen. Es gibt auch ein PHPStorm Plugin.

Asynchrone Verarbeitung von Anfragen

Um Reqeusts mit einer längeren Verarbeitungsdauer zu handeln, kann man diese Jobs asynchron verarbeiten, d.h. sie werden entgegen genommen und sofort beantwortet. Die eigentliche Verarbeitung findet nachgelagert statt. Für diese Funktion gibt es verschiedene Möglichkeiten:

Notifikation mittels HTTP-Callback

Bei der Variante übermittel der Client dem Server eine URL im Body, bei der der Client benachrichtigt wird im Erfolgsfall. Dies sett voraus, dass keine Firewall dazwischen geschaltet ist.

Beispiel:

POST /orders

{
    "notification-url" : "http:///client-ip/notify-me.php"
}

Response:

HTTP/1.1 202 Accepted

Job Accepted, will notify URL http:///client-ip/notify-me.php

Polling

Beim Polling fragt der Client eine bestimmte URL nach dem Ergebnis periodisch ab, bis das Ergebnis vorhanden ist.

Beispiel:

POST /orders

Response:

HTTP/1.1 202 Accepted

Job Accepted, check URL http:///example.com/your-result

Diese URL kann dann angefragt werden.

 

]]>
http://www.sebastianviereck.de/die-rest-webservice-architur-ein-ueberblick/feed/ 0
MS Excel: Fehler beim Kompilieren Projekt oder Bibliothek nicht gefunden http://www.sebastianviereck.de/ms-excel-fehler-beim-kompilieren-projekt-oder-bibliothek-nicht-gefunden/?utm_source=rss&utm_medium=rss&utm_campaign=ms-excel-fehler-beim-kompilieren-projekt-oder-bibliothek-nicht-gefunden http://www.sebastianviereck.de/ms-excel-fehler-beim-kompilieren-projekt-oder-bibliothek-nicht-gefunden/#comments Mon, 18 Sep 2017 12:53:43 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3487-de Weiterlesen ]]> Die Fehlermeldung “Fehler beim Kompilieren Projekt oder Bibliothek nicht gefunden” hatte ich heute, sie war an einer Stelle, an der eine Variable nicht vorher mit Dim initialisiert worden waren. Dort stoppte die Ausführung bei meinem Excel für MAC mit der Fehlermeldung:

Fehler beim Kompilieren Projekt oder Bibliothek nicht gefunden

Die Ursache war tatsächlich, dass eine Windows Bibliothek nicht verfügbar war, nachdem der Verweis entfernt worden war, ging alles wieder.

Visualb Basic Editor -> Extras -> Verweise

dort das Häckchen entfernen mit dem “NICHT VORHANDEN”:

Bildschirmfoto 2017-09-18 um 14.47.13

 

]]>
http://www.sebastianviereck.de/ms-excel-fehler-beim-kompilieren-projekt-oder-bibliothek-nicht-gefunden/feed/ 0
Projekt: Elasticsearch für XT-Commerce Shop Suche http://www.sebastianviereck.de/porjekt-elasticsearch-fuer-xt-commerce-shop-suche/?utm_source=rss&utm_medium=rss&utm_campaign=porjekt-elasticsearch-fuer-xt-commerce-shop-suche http://www.sebastianviereck.de/porjekt-elasticsearch-fuer-xt-commerce-shop-suche/#comments Wed, 13 Sep 2017 07:46:04 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3471-de Weiterlesen ]]> Das letzte Projekt war sehr spannend, es handelte sich um eine Erweiterung des PHP Shop-Systems namens XT-Commerce bzw. des Derivats SEO-Commerce um eine Suche aktuellem Standards für Zeedee Berlin.

Elasticsearch wurde auf einer eigene Amatzon MWS EC2 Instanz gehostet mit 1GB Ram und 1 CPU (sehr kostengünstig).

Die folgende Funktionalität kann ganz einfach wieder deaktiviert werden an zentraler Stelle, wenn es Probleme mit Elasticsearch gibt und die alte MySQL Suche tritt wieder in Kraft.

1. Autocomplete / Suggest Funktion beim Befüllen der Suche

Beim Eintippen des Suchwortes werden schon Vorschläge gegeben im Millisekundenbereich. Dadurch kann der Kunde viel Zeit sparen und bei der Rechtschreibung wird auch geholfen. suggest_zeedee

2. Suche nach Artikeln mit Ähnlichkeitsfunktionalität

Die Shop Suche wurde auch mit Hilfe von Elasticsearch verbessert und es werden jetzt mehr Artikel gefunden und auch auch sehr ähnlich klingende Artikel, was bei vertippern hilft, bspw. führt eine suche nach “Kettkar” auch zu Treffern der Band “Kettcar”.

suche_kettcar_zeedee

3. Ähnliche Artikel

Es werden jetzt zu jedem Artikel sehr gute ähnliche Artikel ausgegeben. So werden  z.B. bei einem Zeichentrickfilm, nachdem alle Artikel mit ähnlichem Namen ausgegeben werden auch andere Zecihentrickfilme vorgeschlagen zur Unterstützung des Cross-Selling.

aehnliche_aetikel_zeedee

]]>
http://www.sebastianviereck.de/porjekt-elasticsearch-fuer-xt-commerce-shop-suche/feed/ 0
Raspberry Pi SD card holder broken – 10 seconds fast repair http://www.sebastianviereck.de/raspberry-pi-sd-card-holder-broken-10-seconds-fast-repair/?utm_source=rss&utm_medium=rss&utm_campaign=raspberry-pi-sd-card-holder-broken-10-seconds-fast-repair http://www.sebastianviereck.de/raspberry-pi-sd-card-holder-broken-10-seconds-fast-repair/#comments Sat, 09 Sep 2017 12:29:49 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3428-de Weiterlesen ]]>  

IMG_5496

The problem: the sd card holder stopped working

When your Raspberry Pi 2 is does not hold the integrated sd-card anymore, than your one of many people who face the same problem.

I have found an easy way to repair the sd card holder without fire and iron and explosions:

You can use an elastci strap and you will only loose 2 of your 4 USB-slots with this method.

 

A small and strong elastic strap can hold the sd cartd in the sd card slot and fixes the problem easily and smooth.

IMG_5497

an elstic strap helps to hold the sd card in the slot

 

The Result

Your Raspberry Pi works again without any problems.

IMG_5495

you will loose 2 usb slots but 2 other ones are waiting for you

IMG_5494

works like a charme

Alternative repair

If you want to repair your sd-card slot like a pro, you should watch this youtube video:

Last alternative

Buy a new Raspberry 3 model:

]]>
http://www.sebastianviereck.de/raspberry-pi-sd-card-holder-broken-10-seconds-fast-repair/feed/ 0
Elasticsearch 5 Cluster mit Docker Beispiel http://www.sebastianviereck.de/elasticsearch-5-cluster-mit-docker-beispiel/?utm_source=rss&utm_medium=rss&utm_campaign=elasticsearch-5-cluster-mit-docker-beispiel http://www.sebastianviereck.de/elasticsearch-5-cluster-mit-docker-beispiel/#comments Fri, 08 Sep 2017 07:44:00 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3425-de Weiterlesen ]]> Mit der docker-compose.yml kann man sich schnell eine Container-basierte Umgebung mit Docker bauen. Anpassbar sind die Memory-Werte für die Java-VM (512MB) und für das Docker Image (1GB).

Um einen Cluster mit 2 Nodes zu betreiben, kann man die elasticsearch2 auskommentieren.

version: '2'
services:
  elasticsearch1:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.4.1
    container_name: elasticsearch1
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
    volumes:
      - esdata1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
#  elasticsearch2:
#    image: docker.elastic.co/elasticsearch/elasticsearch:5.4.1
#    environment:
#      - cluster.name=docker-cluster
#      - bootstrap.memory_lock=true
#      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
#      - "discovery.zen.ping.unicast.hosts=elasticsearch1"
#    ulimits:
#      memlock:
#        soft: -1
#        hard: -1
#    mem_limit: 1g
#    volumes:
#      - esdata2:/usr/share/elasticsearch/data
#    networks:
#      - esnet

volumes:
  esdata1:
    driver: local
#  esdata2:
#    driver: local

networks:
  esnet:
]]>
http://www.sebastianviereck.de/elasticsearch-5-cluster-mit-docker-beispiel/feed/ 0
Elasticsearch Server außerhalb von localhost verfübar machen http://www.sebastianviereck.de/elasticsearch-server-ausserhalb-von-localhost-verfuebar-machen/?utm_source=rss&utm_medium=rss&utm_campaign=elasticsearch-server-ausserhalb-von-localhost-verfuebar-machen http://www.sebastianviereck.de/elasticsearch-server-ausserhalb-von-localhost-verfuebar-machen/#comments Wed, 30 Aug 2017 14:55:32 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3418-de Weiterlesen ]]> Um eine Elasticsearch Instanz nach außen über HTTP verfübar zu machen, muss man folgendes tun:

1. Den Server nach außen verfübar machen, bei Amazon AWS z.B. durch das konfigurieren einer Security Group

2. Die elasticsearch.yml ändern ( /etc/elasticsearch/elasticsearch.yml):

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 172.44.11.222

3. Den Elasticsearch Service neustarten:

sudo service elasticsearch restart

4. Danach kann man den Status abfragen von außen um zu schauen, ob alles funktioniert hat:

curl -XGET '172.44.11.222:9200/_cluster/health?pretty'

Response:

{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
]]>
http://www.sebastianviereck.de/elasticsearch-server-ausserhalb-von-localhost-verfuebar-machen/feed/ 0
Amazon automatische Preisanpassung Tool http://www.sebastianviereck.de/amazon-automatische-preisanpassung-tool/?utm_source=rss&utm_medium=rss&utm_campaign=amazon-automatische-preisanpassung-tool http://www.sebastianviereck.de/amazon-automatische-preisanpassung-tool/#comments Thu, 17 Aug 2017 06:26:16 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3404-de Weiterlesen ]]> Für einen Kunden habe ich gerade ein Tool entwickelt, mit dem man die Preise der eigenen Waren bei Amazon automatisch anpassen kann.Dabei werden die Angote der Konkurrenz analysiert nach Zustand der Ware und nach Seller Seriösität und dadurch ein fairer Preis bestimmt für die Ware. Es werden alle Daten, die über die API verfügbar sind für die Preisbestimmung mit herangezogen, wie z.B. Seller Feedback (Bewertungen des Händlers), ob Amazon selber verschickt, Versanddauer und vieles mehr.

Das Tool vergleicht optional die Preise zwischen den verschiedenen Amazon Plattformen in Europa (DE, UK, IT, ES, FR) aber auch Plattformen außerhalb Europas, wie Japan oder Amerika und händelt die unterschiedlichen Währungen.

Das Ergebnis kann direkt zu Amazon mittels der API geschickt werden und die Preise werden sofort geupdatet.

Amazon Preisanpassung

Screenshot Preisanpassungs Tool

 

Die Anwendung ist in PHP mit Symfony 3 geschrieben und hat ein Frontend mit Twitter Bootstrap 3 und eine MySQL Datenbank. Außerdem gibt es eine Vagrant Umgebung für die Entwicklung mit PHP7.1 und nginx. Ausgeführt werden kann das ganze mit einer einfachen Xampp Umgebung oder Vagrant Virtual Box beim Kunden lokal auf einem PC.

Falls sie auch Interesse an einem solchen Tool haben, könnne sie gern Kontakt aufnehmen.

]]>
http://www.sebastianviereck.de/amazon-automatische-preisanpassung-tool/feed/ 0
Amazon MWS PHP: Compile Error: Redefinition of parameter $quotaMax http://www.sebastianviereck.de/amazon-mws-php-compile-error-redefinition-parameter-quotamax/?utm_source=rss&utm_medium=rss&utm_campaign=amazon-mws-php-compile-error-redefinition-parameter-quotamax http://www.sebastianviereck.de/amazon-mws-php-compile-error-redefinition-parameter-quotamax/#comments Sun, 23 Jul 2017 08:24:36 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3398-de Weiterlesen ]]> Die Amazon MWS Library hat zu Recht Probleme in PHP7.1 mit der Datei: /MarketplaceWebServiceProducts/Model/ResponseHeaderMetadata.php (line 31)

Vorher:

class MarketplaceWebServiceProducts_Model_ResponseHeaderMetadata {

...

  public function __construct($requestId = null, $responseContext = null, $timestamp = null,
                              $quotaMax = null, $quotaMax = null, $quotaResetsAt = null) {
    $this->metadata[self::REQUEST_ID] = $requestId;
    $this->metadata[self::RESPONSE_CONTEXT] = $responseContext;
    $this->metadata[self::TIMESTAMP] = $timestamp;
    $this->metadata[self::QUOTA_MAX] = $quotaMax;
    $this->metadata[self::QUOTA_REMAINING] = $quotaMax;
    $this->metadata[self::QUOTA_RESETS_AT] = $quotaResetsAt;
  }

Nach dem Fix:

public function __construct($requestId = null, $responseContext = null, $timestamp = null,
                            $quotaMax = null, $quotaMaxRemain = null, $quotaResetsAt = null) {
  $this->metadata[self::REQUEST_ID] = $requestId;
  $this->metadata[self::RESPONSE_CONTEXT] = $responseContext;
  $this->metadata[self::TIMESTAMP] = $timestamp;
  $this->metadata[self::QUOTA_MAX] = $quotaMax;
  $this->metadata[self::QUOTA_REMAINING] = $quotaMaxRemain;
  $this->metadata[self::QUOTA_RESETS_AT] = $quotaResetsAt;
}

Grund ist, dass die Variable $quotaMax doppelt benutzt wird in der Kontrultor Definition.

 

]]>
http://www.sebastianviereck.de/amazon-mws-php-compile-error-redefinition-parameter-quotamax/feed/ 0
Wie kann ich meine Maus und Tastatur auf mehreren Computern benutzen? http://www.sebastianviereck.de/wie-kann-ich-meine-maus-und-tastatur-auf-mehreren-computern-benutzen/?utm_source=rss&utm_medium=rss&utm_campaign=wie-kann-ich-meine-maus-und-tastatur-auf-mehreren-computern-benutzen http://www.sebastianviereck.de/wie-kann-ich-meine-maus-und-tastatur-auf-mehreren-computern-benutzen/#comments Fri, 30 Jun 2017 07:52:25 +0000 Sebastian Viereck http://www.sebastianviereck.de/?p=3332-de Die Antwort ist Synergy damit kann man auch Betriebsystemübergreifend einen anderen Computer steuern, ohne die Maus/Tastatur umstecken zu müssen. Funktioniert unter Mac, Linux und Windows.

]]>
http://www.sebastianviereck.de/wie-kann-ich-meine-maus-und-tastatur-auf-mehreren-computern-benutzen/feed/ 0