Galaxy S7 Nougat O2 LTE-Edge Verbindungsprobleme lösen

Seit dem Update von Android Marshmallow (6) auf Nougat (7) gibt es beim Galaxy S7 ein Problem mit dem Netzwechsel zwischen Edge, UMTS und LTE (sofern ihr bei O2/ePlus seid). Besser gesagt: die Verbindung wechselt ständig nur zwischen Edge (2G / Symbol E) und LTE (4G) hin und her, jedoch nicht mehr in UMTS (3G) oder HSDPA (H/H+).

Eine funktionierende Übergangslösung besteht aktuell darin, die Modem Datei (Kürzel: CP_) von Marshmallow zu flashen während alle anderen Partitionen auf Nougat verbleiben.
Die letzte Modemdatei von Marshmallow ist von mitte Dezember 2016 und ist z. B. hier zu finden: https://www.androidfilehost.com/?fid=529152257862689490

Die von mir verwendete Datei aus dem oberen Downloadlink (funktioniert bei mir!) CP_G930FXXU1BPKG_CL9519568_QB11605712. Wichtig ist hier die Kennung G930F welche besagt, dass es ein Galaxy S7 (und kein Edge) ist. Die Kennung BPKG ist quasi als Version zu verstehen und kennzeichnet hier die letzte Marshmallow Version (von mitte Dezember 2016). Alle anderen Kennungen bezeichnen entweder eine höhere Version (also Nougat inkl. dem Problem) oder eine ältere Marshmallow Datei.
Ihr solltet auch darauf achten, ob ihr ein freies oder ein gebrandetes Gerät besitzt.

Diese wird dann einfach mittels Odin auf das Handy geflasht. Ist das Handy neugestartet wechselt es wieder binnen weniger Sekunden zwischen Edge, UMTS oder LTE.
Anleitungen zum Flashen gibt es im Netz ausreichen.

Wichtige Hinweise!
!! Ich übernehme hier keinerlei Garantie, dass alles Reibungslos von statten geht !!
!! Es besteht die Gefahr, sich das Smartphone zu bricken !!
!! Anfänger sollten unbedingt nach einer vollständigen Anleitung suchen (Anleitung Flashen mit Odin und alle Hinweise beachten !!

Weitere Infos: bei Android Hilfe
Oder den Original Beitrag im O2 Forum hier: O2 Forum

FIX: libpcre3 => munmap_chunk(): invalid pointer Apache SEGFAULT

Plötzliche Fehlermeldungen im Apache Error Log wie diese stehen im Zusammenhang mit der libpcre3 Library (Perl 5 Compatible Regular Expression Library) in Version 8.35.x (2:8.35-3.3) welche aktuell bei der installation von PHP7.0 und apache2 auf einem aktuellen Debian 8 Jessie ausgeliefert wird.

*** Error in `/usr/sbin/apache2': munmap_chunk(): invalid pointer: 0x00007f150d0e12e0 ***
[core:notice] [pid 9977] AH00052: child pid 12134 exit signal Aborted (6)

Dieser Fehler tritt insbesondere bei der intensiven Nutzung Regulärer Ausdrücke auf. So wie aktuell beispielsweise bei TYPO3Fluid (verwendet in TYPO3 v8, Neos und dem Flow Framework).
Eine mögliche Lösung ist das downloaden des deb Paketes für die Version 8.39 (2:8.39-1~dotdeb+8.1) von dotdeb (http://ftp.hosteurope.de/mirror/packages.dotdeb.org/pool/all/p/pcre3/libpcre3_8.39-1~dotdeb%2b8.1_amd64.deb) und einer manuellen Installation der Library via dpkg -i {filename.deb}

Weiterführende Links:

https://github.com/oerdnj/deb.sury.org/issues/353

http://stackoverflow.com/questions/35889130/apache-crashes-with-munmap-chunk-invalid-pointer-after-update-to-php7-on-jess

HowTo: scp chroot mit openssh

1) Einen neuen User anlegen (Beispiel: uploader)

2) Home Verzeichnis in der /etc/passwd auf / setzen

3) Am Ende der /etc/ssh/sshd_config folgendes einfügen:

UsePAM no
Subsystem sftp internal-sftp -f AUTH -l VERBOSE
Match user uploader
  ChrootDirectory /var/www/uploads
  ForceCommand internal-sftp -u 0002
  AllowTcpForwarding no

4) chown root:root /var/www/uploads && chmod 755 /var/www/uploads

5) mkdir /var/www/uploads/writeable

6) chown uploader: /var/www/uploads/writeable && chmod 755 /var/www/uploads/writeable

RSA Encryption between JavaScript and PHP (bidirectional)

Auf der Suche nach einer Möglichkeit, Daten zwischen JavaScript und PHP mittels RSA (PublicKey und PrivateKey) zu verschlüsseln und entschlüsseln trifft man auf viele Libraries, Demos, Beispiele und GitHub Repos.
Egal welche ich getestet habe, es war keine zufrieden stellende Lösung dabei.
Entweder funktionieren diese schlichtweg nicht (mehr) oder es ist eine unidirektionale Lösung, jedoch keine bidirektionale.

JsPhpRSa

Continue reading “RSA Encryption between JavaScript and PHP (bidirectional)” »

Visual Studio Code / Hide .map & .js when developing in TypeScript

Nutzt man den Editor Visual Studio Code um beispielsweise Angular2 Anwendungen zu entwickeln, könnten die generierten .js bzw. .js.map Dateien pro .ts Datei die Übersicht im Projekt nehmen.
Dank der genialen Möglichkeit in den Settings des Editors (JSON) auch Bedingungen anzugeben, ist beispielsweise folgende Einstellung in den UserSettings möglich:

    "files.exclude": {
        "**/*.map": true,
        "**/*.js": {"when": "$(basename).ts"}
    }

Damit werden die .js Dateien nur ausgeblendet, wenn es eine gleichnamige .ts Datei gibt. Sonst wäre diese Einstellung wohl zu weitreichend.

SSH Two-factor mit Publickey und ohne Passwort (google-authenticator)

Im Internet finden sich viele Anleitungen um den SSH Zugang mittels einer Two-factor Komponente (z.B. dem google-authenticator) zu sichern.
Bei fast allen Anleitungen wird jedoch von der Kombination aus Passwort und Two-factor Code ausgegangen. Wird dabei der Publickey des Clients auf dem Server unter den authorized_keys abgelegt, wird die Two-factor Authentifizierung komplett umgegangen, da PubkeyAuthentication alles andere aufhebt.

In dieser Anleitung wird beschrieben, wie der SSH Dienst konfiguriert werden muss, damit eine Kombination aus Publickey und Two-factor Token ausgewertet wird.

Continue reading “SSH Two-factor mit Publickey und ohne Passwort (google-authenticator)” »

KMS-Host-based Activation Troubleshooting

Bei der Verwendung eines KMS Host kann es unter Umständen zu seltsamen Phänomenen kommen. Evtl. hat der Sysadmin den KMS Server umgezogen oder den DNS Server migriert oder vielleicht sogar den notwendigen DNS SRV Record vergessen. Um all diesen Ursachen auf “die schliche” zu kommen, können folgende Befehle verwendet werden:

Ein häufig auftretender Fehler wird mit dem Error-Code “0xC004F035″ quittiert. Dieser Error Code bedeutet soviel wie “Der KMS Host kann nicht kontaktiert werden”
Continue reading “KMS-Host-based Activation Troubleshooting” »

Quick Setup: PHP7 + Nginx + PHP-FPM

Der Release von PHP 7.0 rückt immer näher! Mittlerweile sind wir beim fünften Release Candidate angekommen, den wir in diesem Quick Setup zusammen mit Nginx, Fast_cgi und PHP-FPM installieren werden. Zusätzlich sind in der späteren Nginx Site Config noch ein paar TYPO3 Flow 3.x spezifische Redirect Rules definiert, damit das TYPO3 Flow Framework funktioniert… Diese zusätzlichen Zeilen sind markiert und können getrost weggelassen werden falls nicht mit TYPO3 Flow gearbeitet wird.

In diesem Quick Setup Tutorial:
– Nginx 1.9.5 Mainline
– PHP7.0 RC5 von dotdeb
– PHP7-FPM sowie Fast_CGI
– Debian 8 Jessie OS

Continue reading “Quick Setup: PHP7 + Nginx + PHP-FPM” »

TYPO3 Flow CronJob Scheduler

Fast jede Web Anwendung benötigt früher oder später einen oder mehrere CronJobs. Während sich eine geringe Anzahl an CronJobs noch verhältnismäßig gut verwalten lässt, wird es umso komplexerer desto mehr CronJobs eingesetzt werden müssen. Kommt hinzu, dass diese mit verschiedenen Timings ausgeführt werden müssen, hilft oft nur noch ein Scheduler.

CronJobs innerhalb eines Frameworks wie TYPO3 Flow scheinen im ersten Moment nicht ganz einfach, denn wie soll dieser gezielt ausgeführt (inkl. dem gesamten Initialisierungsprozess des Frameworks) werden, ohne dabei einen HTTP Request zu simulieren, welcher ggfs. sogar eine Authentifizierung erfordert?

Dank der CommandControllers des TYPO3 Flow Frameworks können wir die Aufgaben eines CronJobs in einen Service auslagern und von einem CommandController (ReadTheDocs: Custom Commands) auf der Shell ausführen lassen.

Hierzu würde man den CronJob (bspw. durch Eintragung in die crontab) einfach den entsprechenden Command ausführen lassen:

* * * * * /var/www/flow myCommandController:myCommand

Der Scheduler

Kommen wir zurück zum Thema komplexere CronJobs mit unterschiedlichen Timings… Dies würde mit Hilfe der Crontab zu einer komplizierten Angelegenheit führen, welche sich darüber hinaus nicht schön warten lassen würde. (Je nach Hoster hätten wir auch gar keinen Zugriff auf diese Datei sondern müssten uns mit einem mehr oder weniger komfortablen WebInterface zufrieden geben).

Für unseren Scheduler innerhalb von TYPO3 Flow verwenden wir das Scheduler Package von TreeAgency (GitHub ttreeagency/Scheduler) welches die Aufgabe eines CronJob Schedulers herrvoragend übernimmt.

Nach der Installation des Packages werden die einzelnen CronJobs in einzelne Klassen aufgeteilt, welche alle das Interface \Ttree\Scheduler\Task\TaskInterface implementieren und mit einer eigens aus dem Package stammenden Annotation @Scheduler\Schedule(expression=”* * * * *”) getimed werden.

Anschließend sollte nur noch ein jede Minute laufender CronJob auf den entsprechenden Scheduler CommandController des Packages gesetzt werden.
Alle weiteren Wartungen/Timings an den CronJobs können nun bequem bei der Implementierung der Klassen vorgenommen werden.

* * * * * /var/www/flow task:run

Für weitere Informationen und Anleitung befolgt bitte das Readme des Entwicklers auf GitHub (ttreeagency/Scheduler)

TYPO3 Flow Render View Template from Database

In einem kürzlichen Anwendungsfall benötigte ich in einem Projekt die Möglichkeit, das View Template dynamisch aus der Datenbank anstatt aus dem Resource/Private/Template Verzeichnis aus einer HTML View zu laden. Dies könnte zum Beispiel dann sinnvoll sein, wenn ein Backend/Admin Benutzer (wie in meinem Fall) in der Lage sein soll den View Code zu editieren.

Ein klassischer Anwendungsfall könnte das Editieren eines kleinen Partials bzw. dem Inhalt eines HTML Newsletter sein.
Leider bietet TYPO3 Flow von Hause aus keine Möglichkeit, den View Code dynamisch zu injecten anstatt aus einer HTML Datei zu laden.

Eine Möglichkeit soll dieser Artikel mit Hilfe einer eigenen View Klasse aufzeigen:

Die View Klasse

Wir erstellen in unserem Package eine eigene View Klasse. Dazu ist es wichtig, dass die Datei innerhalb einer Ordnerstruktur Classes/Vendor/Package/View/MyController/MyActionName.php angelegt wird.
Zur Erklärung: Die View Klasse muss den Namen der Controller Action tragen, in welcher sie automatisch verwendet werden soll. Damit das Funktioniert muss die View Klasse zusätzlich in einem Ordner mit dem Namen des entsprechenden Controllers abgelegt werden. Daraus ergibt sich die Verzeichnisstruktur View/MyController/MyActionName.php

Da wir innerhalb des View Template Codes in der Lage sein wollen Fluid Code zu rendern, müssen wir unsere eigene View Klasse von \TYPO3\Fluid\View\TemplateView ableiten.
Im Großen und Ganzen besteht der gesamte Code unserer eigenen View Klasse aus den wichtigsten Methoden der abgeleiteten Basis Klasse mit ein paar wenigen aber tiefgreifenden Eingriffen in den Code

class MyActionName extends \TYPO3\Fluid\View\TemplateView {

    /**
     * @var string
     */
    protected $xmlTemplateCode = "";

    /**
     * @param $xmlTemplateCode
     */
    public function setXmlTemplateCode($xmlTemplateCode) {
        $this->xmlTemplateCode = $xmlTemplateCode;
    }

    /**
     * Resolve the template path and filename for the given action. If $actionName
     * is NULL, looks into the current request.
     *
     * @param string $actionName Name of the action. If NULL, will be taken from request.
     * @throws Exception\InvalidTemplateResourceException
     * @throws \TYPO3\Fluid\View\Exception\InvalidTemplateResourceException
     * @return string Full path to template
     */
    protected function getTemplateSource($actionName = NULL) {
        // This is the modified Part
        if ($this->xmlTemplateCode != "") {
            return $this->xmlTemplateCode;
        }

        // This can be deleted
        $templatePathAndFilename = $this->getTemplatePathAndFilename($actionName);
        $templateSource = Files::getFileContents($templatePathAndFilename, FILE_TEXT);
        if ($templateSource === FALSE) {
            throw new Exception\InvalidTemplateResourceException('"' . $templatePathAndFilename . '" is not a valid template resource URI.', 1257246929);
        }

        return $templateSource;
    }


    /**
     * Original Render Code with a little adjustment!!!!!
     * isCompilable is always set to FALSE
     * This enables to load a different Fluid Template on each request without cache
     *
     *
     * Loads the template source and render the template.
     * If "layoutName" is set in a PostParseFacet callback, it will render the file with the given layout.
     *
     * @param string $actionName If set, the view of the specified action will be rendered instead. Default is the action specified in the Request object
     * @return string Rendered Template
     * @api
     */
    public function render($actionName = NULL) {
        $this->baseRenderingContext->setControllerContext($this->controllerContext);
        $this->templateParser->setConfiguration($this->buildParserConfiguration());

        $templateIdentifier = $this->getTemplateIdentifier($actionName);
        if ($this->templateCompiler->has($templateIdentifier)) {
            $parsedTemplate = $this->templateCompiler->get($templateIdentifier);
        } else {
            $parsedTemplate = $this->templateParser->parse($this->getTemplateSource($actionName));

            // Set isCompilable to FALSE
            $parsedTemplate->setCompilable(false);

            if ($parsedTemplate->isCompilable()) {
                $this->templateCompiler->store($templateIdentifier, $parsedTemplate);
            }
        }

        if ($parsedTemplate->hasLayout()) {
            $layoutName = $parsedTemplate->getLayoutName($this->baseRenderingContext);
            $layoutIdentifier = $this->getLayoutIdentifier($layoutName);
            if ($this->templateCompiler->has($layoutIdentifier)) {
                $parsedLayout = $this->templateCompiler->get($layoutIdentifier);
            } else {
                $parsedLayout = $this->templateParser->parse($this->getLayoutSource($layoutName));
                if ($parsedLayout->isCompilable()) {
                    $this->templateCompiler->store($layoutIdentifier, $parsedLayout);
                }
            }
            $this->startRendering(self::RENDERING_LAYOUT, $parsedTemplate, $this->baseRenderingContext);
            $output = $parsedLayout->render($this->baseRenderingContext);
            $this->stopRendering();
        } else {
            $this->startRendering(self::RENDERING_TEMPLATE, $parsedTemplate, $this->baseRenderingContext);
            $output = $parsedTemplate->render($this->baseRenderingContext);
            $this->stopRendering();
        }

        return $output;
    }
}

Anwendung / Im Controller

Um nun innerhalb unseres Controllers bzw. genauer gesagt unserer myActionName Action den View Template Code dynamisch zu laden ist lediglich eine Zeile Code notwendig:

/**
 * MyActionName Action
 */
public function myActionName() {

    $myTemplateCode = "
….
"; // Load this from Database or WebService

    $this->view->setXmlTemplateCode($myTemplateCode); // This allows to set a XMLTemplate which is stored in Database
}

In meinem Beispiel arbeite ich mit XML Template Code welcher aus einer Datenbank injected wird, daher der Name der Methode setXmlTemplateCode.

Durch das Fortsetzen der Benutzung dieser Seite, stimmst du der Benutzung von Cookies zu. Weitere Informationen

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter.

Schließen