Web + Mobile Blog / Berlin http://sebastianviereck.de PHP Freelancer Mon, 15 Apr 2019 09:25:29 +0000 de hourly 1 http://wordpress.org/?v=3.5.1 Angular ngx-translate TranslateLoader ohne http Modul http://sebastianviereck.de/angular-ngx-translate-translateloader-ohne-http-service/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=angular-ngx-translate-translateloader-ohne-http-service http://sebastianviereck.de/angular-ngx-translate-translateloader-ohne-http-service/#comments Fri, 12 Apr 2019 13:26:23 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3978-de Weiterlesen ]]> Um eine Kompatibilität mit alten Browsern, wie dem Firefox Version <= 5 zu erreichen, kann man das angular http Modul nicht verwenden. Das ngx-translate Module bneötigt einen Loader, der die richtige Sprache lädt per Ajax Request. Dies läst sich auch mit dem XMLHttpRequest und einem Observalbe lösen:

import {Injectable} from '@angular/core';
import {TranslateLoader} from '@ngx-translate/core';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class LanguageLoader implements TranslateLoader {

  getTranslation(lang: string): Observable<any> {
    return Observable.create(function (observer) {
    let url = `./assets/i18n/${lang}.json?=` + new Date().getTime();
    let xhr = new XMLHttpRequest();

      xhr.onreadystatechange = function () {
        if (xhr.readyState == XMLHttpRequest.DONE || xhr.readyState == 4) {
              let response = JSON.parse(xhr.responseText);
              observer.next(response);
              observer.complete();
        }
      }
      xhr.open('GET', url, true);
      xhr.send(null);
    });
  }
}

In der app.module.ts kann man dann den Loader wie folgt einbinden:

TranslateModule.forRoot({
  loader: {provide: TranslateLoader, useClass: LanguageLoader}
})
]]>
http://sebastianviereck.de/angular-ngx-translate-translateloader-ohne-http-service/feed/ 0
PHP Skript als Windows-Dienst ausführen http://sebastianviereck.de/php-skript-als-windows-dienst-ausfuehren/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-skript-als-windows-dienst-ausfuehren http://sebastianviereck.de/php-skript-als-windows-dienst-ausfuehren/#comments Sun, 07 Apr 2019 14:28:52 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3956-de Weiterlesen ]]> Unter Windows lassen sich Skripte, die endlos laufen sollen mit PHP mittels eines Dienstes realisieren.

Dies hat den Vorteil, dass der Speicherverbrauch nicht mit der Zeit ins unendliche geht, bei endloser Skriptausführungen und eine Recovery und Restart Funktionalität implementiert werden kann, um den Dienst über lange Zeiträume am Laufen zu halten.

Außerdem erhält der Dienst vom Betriebsystem Events, wenn z.B. eine Shutdown ansteht, um sich rechtzeitig selber beenden zu können und keine korrupten Daten zu produzieren beim Abbruch in einer nicht atomaren Operation.

Um einen Windows Dienst anzulegen benötigt man die win32service PHP-Library.

Diese kann man hier downloaden und in der php.ini einbinden:

extension=php_win32service.dll

Dienst anlegen

Um einen Dienst erstellen und steuern zu können, kann man folgenden Code verwenden und in der Datei win32_service.php speichern:

<?php
//No timeouts, Flush Content immediatly
set_time_limit(0);
ob_implicit_flush();

$serviceName = 'FooCommand';

$serviceAction = $argv[1];

switch ($argv[1]) {
    case  'install': {
        $result = win32_create_service(array(
            'service' => $serviceName,
            'display' => $serviceName,
            'description' => $serviceName,
            'params' => sprintf('%s\win32_run.php', __DIR__),
            'recovery_delay'        => 1000,                                               // Recovery action is executed after 10s
            'recovery_action_1'     => WIN32_SC_ACTION_RESTART,
            'recovery_action_2'     => WIN32_SC_ACTION_RESTART,
            'recovery_action_3'     => WIN32_SC_ACTION_RESTART,
            'recovery_reset_period' => 3600,                                                // Reset the fail counter after 1 hour
        ));
        break;
    }
    case  'uninstall': {
        $result = win32_delete_service($serviceName);
        break;
    }
    case  'stop': {
        $result = win32_stop_service($serviceName);
        break;
    }
    case  'status': {
        $ServiceStatus = win32_query_service_status($serviceName);
        if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOPPED ) {
            echo "Service Stopped\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_START_PENDING ) {
            echo "Service Start Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOP_PENDING ) {
            echo "Service Stop Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_RUNNING ) {
            echo "Service Running\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_CONTINUE_PENDING ) {
            echo "Service Continue Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSE_PENDING ) {
            echo "Service Pause Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSED ) {
            echo "Service Paused\n\n";
        } else{
            echo "Service Unknown\n\n";
        }
        exit;
    }
    default: {
        throw new Exception('unknow argument');
    }
}

switch($result) {
    case WIN32_ERROR_SERVICE_DOES_NOT_EXIST:
        throw new Exception('service not found');
    case WIN32_SERVICE_ERROR_IGNORE:
        die('service successfully installed/uninstalled');
    case WIN32_ERROR_ACCESS_DENIED:
        throw new Exception('access denied, run command as administrator');
    case WIN32_ERROR_SERVICE_EXISTS:
        throw new Exception('service already exists, uninstall service prior');
    case WIN32_ERROR_SERVICE_MARKED_FOR_DELETE:
        throw new Exception(sprintf('service has been marked for deletion, look here https://stackoverflow.com/questions/20561990/how-to-solve-the-specified-service-has-been-marked-for-deletion-error'));
    case WIN32_SERVICE_START_PENDING:
        throw new Exception('service start is pending');
    case WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
        echo 'can not connect to service controller'. PHP_EOL;
        break;
    default:
        # search for hex value of result win32service lib
        debug_zval_dump($result);
}

und ausführen (CMD als Administrator ausführen) mit:

run with: php win32_service.php install
//or
run with: php win32_service.php uninstall
//or
run with: php win32_service.php status
//or
run with: php win32_service.php stop

Dann sollte unter Systemsteuerung -> Dienste der Dienst FooCommand erstellt worden sein, der beim nächsten Windows Start automatisch gestartet wird.

Windows Dienst mit PHP Skript erstellen

Das langlaufende PHP Skript

Das Skript, dass über den Dienst ausgeführt werden soll befindet sich in der Datei: win32_run.php

<?php
set_time_limit(0);
ob_implicit_flush();
$serviceName = 'FooCommand';

$result = win32_start_service_ctrl_dispatcher($serviceName);
if (!$result) {
    die("I'm probably not running under the service control manager");
}
debug_zval_dump($result);
win32_set_service_status(WIN32_SERVICE_START_PENDING);

// Some lengthy process to get this service up and running.

win32_set_service_status(WIN32_SERVICE_RUNNING);

while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
    exec(sprintf('php %s/script.php', __DIR__));
}

In der script.php kann jetzt der auszuführende endlos Code eingefügt werden:

<?php
echo "hello service";

Konfiguration des Dienstes

Der Dienst kann im Fehlerfall genau konfiguriert werden:

Dienst Konfiguration im Fehlerfall

Debugging des Dienstes

Wenn der Dienst nicht auf Anhieb läuft, kann man eine Fehlermeldung in Systemsteuerung -> Ereignisanzeige mehr Aufschluss geben:

Windows Dienst Ereignisanzeige

]]>
http://sebastianviereck.de/php-skript-als-windows-dienst-ausfuehren/feed/ 0
Windows 10 geplante Aufgabe für PHP Skript anlegen analog Crontab http://sebastianviereck.de/windows-10-geplante-aufgabe-fuer-php-skript-anlegen-analog-crontab/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=windows-10-geplante-aufgabe-fuer-php-skript-anlegen-analog-crontab http://sebastianviereck.de/windows-10-geplante-aufgabe-fuer-php-skript-anlegen-analog-crontab/#comments Sun, 07 Apr 2019 11:15:38 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3949-de Weiterlesen ]]> Für wiederkehrende PHP Jobs kann man den Betriebsystem Scheduler verwenden, unter Linux ist das cron und unter Windows Aufgaben.

Um ein PHP Skript zu starten C:\foo\bar.php mittels der Aufgabenplanung jede Minute kann man unter Windows 10 und darunter wie folgt neue Aufgaben anlegen.

Unter Systemsteuerung -> Aufgabenplanung lassen sich neue Aufgaben verwalten:

Systemsteuerung -> Aufgabenplanung

Aufgabe erstellen – wenn das Skript im Hintergrund ausgeführt werden soll, dann sollte man die Option “Unabhängig von der Bneutzeranmeldung ausführen” ankreuzen

 

Trigger minütlich erstellen, aktiviert unbedingt ankreuzen

auch im Akkubetrieb ausführen

php Skript als Aktion definieren, php muss dafür im PATH eingetragen werden, ansonsten muss der absolute Pfad zur PHP Installation eingetragen werden. In “Starten in” kann ein Verzeichnis angeben werden, in dem der Befehl ausgeführt werden kann.

nach 5 Minuten den Prozess killen

]]>
http://sebastianviereck.de/windows-10-geplante-aufgabe-fuer-php-skript-anlegen-analog-crontab/feed/ 0
Webanwendung zur Vermittlung von IT-Kräften http://sebastianviereck.de/webanwendung-zur-vermittlung-von-it-kraeften/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=webanwendung-zur-vermittlung-von-it-kraeften http://sebastianviereck.de/webanwendung-zur-vermittlung-von-it-kraeften/#comments Sun, 07 Apr 2019 08:59:46 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3946-de Meine Bachelorarbeit zum Download:

Konzept und Entwicklung einer
Webanwendung zur Vermittlung von IT-Kräften

Daraus ist das Startup nerdle.de geworden, welches nach 2 Jahren aufgrund mangelnder Finanzierung eingestellt werden musste, aber mir sehr viel Spaß gemacht hat.

Download .pdf

Download .doc

]]>
http://sebastianviereck.de/webanwendung-zur-vermittlung-von-it-kraeften/feed/ 0
Behavioral Finance und Moving Averages http://sebastianviereck.de/behavioral-finance-und-moving-averages/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=behavioral-finance-und-moving-averages http://sebastianviereck.de/behavioral-finance-und-moving-averages/#comments Sun, 07 Apr 2019 08:52:39 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3941-de Meine Diplomarbeit zum Download

Behavioral Finance und Moving Averages – Anwendbarkeit/Simulation von Aktienmärkten
anhand des 200-Tage-Durchschnitts

Download .pdf

Download .doc

Download Excel Makro

]]>
http://sebastianviereck.de/behavioral-finance-und-moving-averages/feed/ 0
PHP cURL verifizieren eines selbst-signierten FTPS Zertifikat http://sebastianviereck.de/php-curl-verifizieren-eines-selbst-signierten-ftps-zertifikat/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-curl-verifizieren-eines-selbst-signierten-ftps-zertifikat http://sebastianviereck.de/php-curl-verifizieren-eines-selbst-signierten-ftps-zertifikat/#comments Thu, 04 Apr 2019 11:45:57 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3936-de Weiterlesen ]]> Leider kann man mit der PHP FTP Erweiterung keine SSL Zertifikate von FTPS Servern zu verifizieren, um Man-in-the-Middle Angriffe zu verhindern.

Es ist aber möglich über php-cURL das selbst signierte Zertifikat zu verifizieren:

public function checkFTPSCertificate(): bool
{
    $ftp_certificate = 'path/to/cert.crt'

    $ftp_server = 'ftp://foo.de/';
    $ftp_user = 'user';
    $ftp_password = 'password';

    $ch = curl_init();

    // curl_setopt($ch, CURLOPT_VERBOSE, '1');
    curl_setopt($ch, CURLOPT_URL, $ftp_server);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, $ftp_user . ':' . $ftp_password);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);


    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1'); // Überprüfung des Serverzertifikats
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
    curl_setopt($ch, CURLOPT_CAINFO , $ftp_certificate);
    curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
    curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);

    $result = curl_exec($ch);
    $error_no = curl_errno($ch);
    $error_msg = curl_error($ch);
    curl_close ($ch);
    return $error_no == 0 && empty($error_msg);
}
]]>
http://sebastianviereck.de/php-curl-verifizieren-eines-selbst-signierten-ftps-zertifikat/feed/ 0
Festplatte von EC2 t2 Instanz vergrößern http://sebastianviereck.de/festplatte-von-ec2-t2-instanz-vergroessern/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=festplatte-von-ec2-t2-instanz-vergroessern http://sebastianviereck.de/festplatte-von-ec2-t2-instanz-vergroessern/#comments Fri, 29 Mar 2019 14:33:26 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3933-de Weiterlesen ]]> Um die Festplatte einer EC2 Instanz zu vergrößern muss man als erstes das Volume vergrößern über die Console und dann auf der Instanz folgende Befehle ausführen im Normalfall (AWS Dokumentation):

lsblk
sudo growpart /dev/xvda 1
sudo yum install xfsprogs
sudo xfs_growfs -d /
df -h
]]>
http://sebastianviereck.de/festplatte-von-ec2-t2-instanz-vergroessern/feed/ 0
Linux grep mit Filepattern und Ausgabe von mehreren Zeilen bei Erfolg http://sebastianviereck.de/linux-grep-mit-filepattern-und-ausgabe-von-mehreren-zeilen-bei-erfolg/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux-grep-mit-filepattern-und-ausgabe-von-mehreren-zeilen-bei-erfolg http://sebastianviereck.de/linux-grep-mit-filepattern-und-ausgabe-von-mehreren-zeilen-bei-erfolg/#comments Tue, 12 Mar 2019 14:30:22 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3928-de grep -A4 --include \*pattern\*.xml searchText * ]]> http://sebastianviereck.de/linux-grep-mit-filepattern-und-ausgabe-von-mehreren-zeilen-bei-erfolg/feed/ 0 Linux unzip/entpacken aller Dateien in einen Unterordner http://sebastianviereck.de/linux-unzipentpacken-aller-dateien-einen-unterordner/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux-unzipentpacken-aller-dateien-einen-unterordner http://sebastianviereck.de/linux-unzipentpacken-aller-dateien-einen-unterordner/#comments Tue, 12 Mar 2019 14:29:20 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3926-de unzip \*.zip -d unzipDir ]]> http://sebastianviereck.de/linux-unzipentpacken-aller-dateien-einen-unterordner/feed/ 0 proftp log user traffic mit mod_sql http://sebastianviereck.de/proftp-log-user-traffic-mit-mod_sql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=proftp-log-user-traffic-mit-mod_sql http://sebastianviereck.de/proftp-log-user-traffic-mit-mod_sql/#comments Thu, 21 Feb 2019 08:56:23 +0000 Sebastian Viereck http://sebastianviereck.de/?p=3922-de Weiterlesen ]]> Um den User Traffic in proftp mitzuloggen in einer MySQL Datenbank, muss man nur in der User Tabelle eine Spalte “traffic” hinzufügen vom Typ BIGINT, Default 0:

ALTER TABLE `ftpuser` ADD COLUMN `traffic` BIGINT NOT NULL DEFAULT '0';

Dann kan man einen SQLNamedQuery verwenden in der sql.conf, um die Menge des Traffics mitzuschneiden:

SQLLog RETR,STOR,APPE extendedlog
SQLNamedQuery extendedlog UPDATE "traffic= (traffic + %b) WHERE userid='%u'" ftpuser

Achtung, die Verwendung führt zu erhöhtem Traffic auf der Datenbank.

]]>
http://sebastianviereck.de/proftp-log-user-traffic-mit-mod_sql/feed/ 0