Saturday, December 17, 2016

Log / Track / Lookup every request & response in Laravel

Download example code from here

First create a php file under "App\Http\Middleware" named "LogAfterRequest.php" with following contents:


<?php
namespace App\Http\Middleware;

use Closure;

class LogAfterRequest
{

    public function handle($request, Closure $next)
    {
        $this->logRequest($request);
        return $next($request);
    }

    public function terminate($request, $response)
    {
        $this->logResponse($request, $response);
    }

    private function logResponse($request, $response)
    {
        $response = (array)$response;
        $txt = $this->objectToString($response);
        file_put_contents("logs/res_" . time() . "_" . rand(1, 100) . "_" . $this->makeLogFilename($request) . ".txt", $txt);
    }

    private function logRequest($request)
    {
        //$this->cleanLogDirectory();
        $log = json_encode((array)$request->server);
        $log = json_decode("{\"" . substr($log, 15))->parameters;
        $txt = "";
        foreach ($log as $k => $v) {
            $txt .= $k . "===" . str_replace("\n", "", $v) . "\r\n";
        }
        file_put_contents("logs/req_" . time() . "_" . rand(1, 100) . "_" . $this->makeLogFilename($request) . ".txt", $txt);
    }

    private function objectToString($obj, $prefix = "")
    {
        $txt = "";
        foreach ($obj as $k => $v) {
            $t = gettype($v);
            switch ($t) {
                case "object":
                case "array":
                    $k = $k . "\r\n";
                    $v = "\r\n" . $this->objectToString($v, $prefix . "\t");
                    break;
                default:
                    $v = str_replace("\n", "", $v);
            }
            $k = preg_replace("/[^a-zA-Z0-9]+/", "", $k);
            $txt .= $prefix . $k . "===" . $v . "\r\n";
        }
        return $txt;
    }

    private function cleanLogDirectory()
    {
        $files = scandir("logs");
        foreach ($files as $file) {
            if ($file != "." && $file != ".." && !is_dir($file) && file_exists($file)) {
                unlink($file);
            }
        }
    }

    private function makeLogFilename($request)
    {
        $log = json_encode((array)$request->server);
        $log = json_decode("{\"" . substr($log, 15))->parameters;
        $name = str_replace("/", "_", $log->REQUEST_URI);
        return preg_replace("/[^a-zA-Z0-9]+/", "_", $name);
    }
}

?>

and add the following line "\App\Http\Middleware\LogAfterRequest::class" to Karnel.php as follows: 


<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\LogAfterRequest::class
    ];

    protected $middlewareGroups = [
        'user' => [
            \App\Http\Middleware\LogAfterRequest::class,
            \App\Http\Middleware\LogAfterRequest2::class
        ]
    ];
}

?>

Adding Desktop Notifications to Your Web Applications

Download example from here


<button onclick="notifyMe()">Notify me!</button>

<script type="text/javascript">
    // request permission on page load
    document.addEventListener('DOMContentLoaded', function () {
        if (!Notification) {
            alert('Desktop notifications not available in your browser.');
            return;
        }
        if (Notification.permission !== "granted") {
            Notification.requestPermission();
        }
    });

    function notifyMe() {
        if (Notification.permission !== "granted") {
            Notification.requestPermission();
        }
        else {
            setTimeout(function() {
                var notification = new Notification('Notification Title', {
                    icon: 'images.jpg',
                    body: "Hey there! You've been notified!, Hey there! You've been notified!, Hey there! You've been notified!",
                });

                notification.onclick = function () {
                    alert("Notification event clicked");
                };
            }, 1000);
        }
    }
</script>

Rendering text to html with Angular JS

Download example code from here


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Rendering text to html with Angular JS</title>
    <script src="angular.js"></script>
    <script src="angular-sanitize.js"></script>
</head>
<body>

<div data-ng-app="myApp" data-ng-controller="MyController">
    <div ng-bind-html="myHTML()"></div>
</div>

<script type="text/javascript">
    var app = angular.module("myApp", ["ngSanitize"]);

    app.controller("MyController", function ($scope, $sce) {
        $scope.snippet = "<div>This is a DIV element; alert('SURE???')</div>";
        $scope.myHTML = function () {
            return $sce.trustAsHtml($scope.snippet);
        }
    });
</script>

</body>
</html>

Tuesday, December 13, 2016

Add remove required validation in angular dynamically in angular js

<!doctype html>
<html>
<head>
    <title>Add remove required validation in angular dynamically in angular js</title>
    <script src="http://code.angularjs.org/1.2.12/angular.js"></script>
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
</head>
<body>

<div data-ng-app="myApp" data-ng-controller="MyController">
    <form name="myForm" method="get" validate-form novalidate>
        <div class="container">
            Type:
            <select ng-model="type" my-validation>
                <option value="required">Required</option>
                <option value="not_required">Not Required</option>
            </select>
        </div>
        <div class="container">
            Name:
            <input type="text" name="name" ng-model="name" ng-required="isFieldRequired()" my-validation/>
            <span ng-show="myForm.name.$invalid" style="color:red;font-size:30px;">*</span>
        </div>
        <div><input type="submit" value="Submit"/></div>
    </form>
</div>

<script type="text/javascript">
    var app = angular.module("myApp", []);

    app.controller("MyController", function($scope) {
        $scope.type = "required";
        $scope.isFieldRequired = function() {
            return $scope.type == "required";
        }
    });

    app.directive('validateForm', function () {
        return {
            restrict: 'A',
            link: function ($scope, form) {
                form.on('submit', function () {
                    $(form).find(".container").css("border", "");
                    if($scope.myForm.$invalid) {
                        var error = $scope.myForm.$error;
                         for (var key in $scope.myForm.$error) {
                             for (var index = 0; index < $scope.myForm.$error[key].length; index++) {
                                 var err = $scope.myForm.$error[key][index];
                                 console.log("Field=" + err.$name + ', Error=' + key);
                             }
                         }


                        var firstInvalid = $(form[0].querySelector('.ng-invalid'));

                        if (firstInvalid.length > 0) {
                            firstInvalid.closest(".container").addClass("error_element").css("border", "2px solid red");
                            firstInvalid.focus();
                            return;
                        }
                    }
                    console.log("Form Validated");
                });
            }
        };
    });

    app.directive("myValidation", function() {
        return {
            restrict: "A",
            require: "ngModel",
            link: function(scope, elem, attrs, ctrl) {
                console.log(attrs)
            }
        }
    })
</script>

</body>
</html>

Angularjs Focus Specific Error Input On Form Submit

<!doctype html>
<html>
<head>
    <title>Angularjs Focus Specific Error Input On Form Submit</title>
    <script src="http://code.angularjs.org/1.2.12/angular.js"></script>
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
</head>
<body>

<div data-ng-app="myApp" data-ng-controller="MyController">
    <form name="myForm" method="get" validate-form novalidate>
        <div class="container">
            Name: <input type="text" name="name" ng-model="name" ng-required="true" ng-maxlength="10" ng-minlength="5" my-validation/>
        </div>
        <div class="container">
            Email: <input type="email" name="email" ng-model="email" ng-required="true" my-validation/>
        </div>
        <div class="container">
            Type:
            <input type="radio" name="type" ng-model="type" value="A" ng-required="true" my-validation/> A
            <input type="radio" name="type" ng-model="type" value="B" ng-required="true" my-validation/> B
            <input type="radio" name="type" ng-model="type" value="C" ng-required="true" my-validation/> C
        </div>
        <div><input type="submit" value="Submit"/></div>
    </form>
</div>

<script type="text/javascript">
    var app = angular.module("myApp", []);

    app.controller("MyController", function($scope) {
        $scope.name = "";
        $scope.email = "";
    });

    app.directive('validateForm', function () {
        return {
            restrict: 'A',
            link: function ($scope, form) {
                form.on('submit', function () {
                    $(form).find(".container").css("border", "");
                    if($scope.myForm.$invalid) {
                        var error = $scope.myForm.$error;
                         for (var key in $scope.myForm.$error) {
                             for (var index = 0; index < $scope.myForm.$error[key].length; index++) {
                                 var err = $scope.myForm.$error[key][index];
                                 console.log("Field=" + err.$name + ', Error=' + key);
                             }
                         }


                        var firstInvalid = $(form[0].querySelector('.ng-invalid'));

                        if (firstInvalid.length > 0) {
                            firstInvalid.closest(".container").addClass("error_element").css("border", "2px solid red");
                            firstInvalid.focus();
                            return;
                        }
                    }
                    alert("Form Validated");
                });
            }
        };
    });

    app.directive("myValidation", function() {
        return {
            restrict: "A",
            require: "ngModel",
            link: function(scope, elem, attrs, ctrl) {
                console.log(attrs)
            }
        }
    })
</script>

</body>
</html>


Saturday, December 10, 2016

Simple Chat Application Using PHP & WebSocket

First you need to run server script "server.php". You can do using command prompt. Open cmd and navigate to project folder and type "php -q server.php" or browse from browser, server started. Now browse "index.php" from browser and start chatting.
One thing need to do before start server, have to check if socket is enabled in your server. Navigate to your PHP installation folder and find and edit "php.ini" file. Find the text php_sockets.dll and uncomment the line. And restart your apache server.

Below is full server.php script

<?php
$host = 'localhost'; //host
$port = '9000'; //port
$null = NULL; //null var

//Create TCP/IP stream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//reusable port
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

//bind socket to specified host
socket_bind($socket, 0, $port);

//listen to port
socket_listen($socket);

//create & add listening socket to the list
$clients = array($socket);

echo "Server Started...\n";
set_time_limit(60 * 2);
//start endless loop, so that our script doesn't stop
while (true) {
    //manage multiple connections
    $changed = $clients;
    //returns the socket resources in $changed array
    socket_select($changed, $null, $null, 0, 10);

    //check for new socket
    if (in_array($socket, $changed)) {
        echo "Client Connected...\n";
        $socket_new = socket_accept($socket); //accept new socket
        $clients[] = $socket_new; //add socket to client array

        $header = socket_read($socket_new, 1024); //read data sent by the socket
        perform_handshaking($header, $socket_new, $host, $port); //perform web-socket handshake

        socket_getpeername($socket_new, $ip); //get ip address of connected socket
        $response = mask(json_encode(array('type' => 'system', 'message' => $ip . ' connected'))); //prepare json data
        send_message($response); //notify all users about new connection

        //make room for new socket
        $found_socket = array_search($socket, $changed);
        unset($changed[$found_socket]);
    }

    //loop through all connected sockets
    foreach ($changed as $changed_socket) {
        //check for any incoming data
        try {
            while (socket_recv($changed_socket, $buf, 1024, 0) >= 1) {
                try {
                    $received_text = unmask($buf); //unmask data
                    if($received_text != $null) {
                        $tst_msg = json_decode($received_text); //json decode
                        $user_name = $tst_msg->name; //sender name
                        $user_message = $tst_msg->message; //message text
                        $user_color = $tst_msg->color; //color

                        //prepare data to be sent to client
                        $response_text = mask(json_encode(
                            array('type' => 'user_message', 'name' => $user_name, 'message' => $user_message, 'color' => $user_color)
                        ));
                        send_message($response_text); //send data
                    }
                }
                catch(Exception $ex) {
                    echo "Exception_2=" . $ex->getMessage() . "\n";
                }
                break 2; //exist this loop
            }
        }
        catch(Exception $ex) {
            echo "Exception=" . $ex->getMessage() . "\n";
        }

        $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
        if ($buf === false) { // check disconnected client
            // remove client for $clients array
            $found_socket = array_search($changed_socket, $clients);
            socket_getpeername($changed_socket, $ip);
            unset($clients[$found_socket]);

            //notify all users about disconnected connection
            $response = mask(json_encode(array('type' => 'system', 'message' => $ip . ' disconnected')));
            send_message($response);
        }
    }
}
// close the listening socket
socket_close($socket);

function send_message($msg) {
    global $clients;
    foreach ($clients as $changed_socket) {
        @socket_write($changed_socket, $msg, strlen($msg));
    }
    return true;
}


//Unmask incoming framed message
function unmask($text) {
    $length = ord($text[1]) & 127;
    $end_check = ord($text[0]) & 0x0F;
    if ($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    }
    elseif ($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    }
    else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }
    if($end_check == 8) {
        echo "Client Disconnected...\n";
        return null;
    }
    return $text;
}

//Encode message for transfer to client.
function mask($text) {
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if ($length <= 125) {
        $header = pack('CC', $b1, $length);
    }
    elseif ($length > 125 && $length < 65536) {
        $header = pack('CCn', $b1, 126, $length);
    }
    elseif ($length >= 65536) {
        $header = pack('CCNN', $b1, 127, $length);
    }
    return $header . $text;
}

//handshake new client.
function perform_handshaking($receved_header, $client_conn, $host, $port) {
    $headers = array();
    $lines = preg_split("/\r\n/", $receved_header);
    foreach ($lines as $line) {
        $line = chop($line);
        if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //hand shaking header
    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
        "Upgrade: websocket\r\n" .
        "Connection: Upgrade\r\n" .
        "WebSocket-Origin: $host\r\n" .
        "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_conn, $upgrade, strlen($upgrade));
}
?>

Download full example from here


PHP Sort Multidimensional array with key value


<?php
$needSort = array(
    array("name" => "Bob", "age" => 8, "colour" => "red"),
    array("name" => "Greg", "age" => 12, "colour" => "blue"),
    array("name" => "Andy", "age" => 5, "colour" => "purple")
);
echo "<h3>Original Array</h3><pre>";
print_r($needSort);
echo "</pre>";

$orderBy = "name";
$sortArray = array();
$sortArray[$orderBy] = array();

foreach ($needSort as $obj) {
    $sortArray[$orderBy][] = $obj[$orderBy]; //Sort by name
}

array_multisort($sortArray[$orderBy], SORT_ASC, $needSort);

echo "<h3>Sorted Array</h3><pre>";
print_r($needSort);
echo "</pre>";
?>

Output



Original Array

Array
(
    [0] => Array
        (
            [name] => Bob
            [age] => 8
            [colour] => red
        )

    [1] => Array
        (
            [name] => Greg
            [age] => 12
            [colour] => blue
        )

    [2] => Array
        (
            [name] => Andy
            [age] => 5
            [colour] => purple
        )

)


Sorted Array

Array
(
    [0] => Array
        (
            [name] => Andy
            [age] => 5
            [colour] => purple
        )

    [1] => Array
        (
            [name] => Bob
            [age] => 8
            [colour] => red
        )

    [2] => Array
        (
            [name] => Greg
            [age] => 12
            [colour] => blue
        )

)