Monday 20 November 2017

Email template optimization tools

  Here is the list of email templates optimization tools. Remember to exclude media query if you have for responsive design. They will not work properly if inline. Some time might face a problem that your responsive design is not working on some of the email clients. The reason might be of character limit. The stylesheet is then checked against a 8,192 character limit. If your stylesheet, after processing, exceeds the limit, the whole stylesheet gets removed from your email.    

Push notification IOS

Push notification IOS  
<?php

// authentication
$host = "localhost";
$user = "user";
$pass = "pass";
$dbname = "DB";

// create connection with database
$con = mysql_connect($host, $user, $pass);

// check whether database connection is successful
if (!$con) {
// if connection not successful then stop the script and show the error
    die('Could not connect to database: ' . mysql_error());
} else {
// if database connection successful then select the database
    mysql_select_db($dbname, $con);
}

// get the id, token from database
$query = "SELECT `notifications`.`id` as pid, `notifications`.`by_userid`, `notifications`.`userid`, `notifications`.`messege`, `notifications`.`is_read`,  `users`.`id`, `users`.`name`, `users`.`email`, `users`.`dob`, `users`.`gender`,  `users`.`profile_pic`, `users`.`device_id` FROM `table`.`notifications` AS `notifications`  INNER JOIN `table2`.`users` AS `users` ON (`notifications`.`userid` = `users`.`id`) WHERE `notifications`.`is_read` = '0' ";
$result = mysql_query($query);
$data = mysql_fetch_array($result);
$count = count($data);

//Setup notification message
$body = array();
$body['aps'] = array('alert' => $data['messege']);
$body['aps']['notifurl'] = 'yourwebsite.com/push_new.php';
$body['aps']['badge'] = $count;
$body['aps']['messege'] = $data['messege'];
$body['aps']['id'] = $data['pid'];
$id = $data['pid'];

//Setup stream (connect to Apple Push Server)
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'passphrase', '123456');
stream_context_set_option($ctx, 'ssl', 'local_cert', 'certificate.pem'); // add your .pem file
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
stream_set_blocking($fp, 0);
// This allows fread() to return right away when there are no errors. But it can also miss errors during
//  last  seconds of sending, as there is a delay before error is returned. Workaround is to pause briefly
// AFTER sending last notification, and then do one more fread() to see if anything else is there.

if (!$fp) {
//ERROR
    echo "Failed to connect (stream_socket_client): $err $errstrn";
} else {

// Keep push alive (waiting for delivery) for 90 days
    $apple_expiry = time() + (90 * 24 * 60 * 60);

// Loop thru tokens from database
    while ($row = mysql_fetch_array($result)) {
        $apple_identifier = $row["id"];
        $deviceToken = $row['device_id'];
        $payload = json_encode($body);

// Enhanced Notification
        $msg = pack("C", 1) . pack("N", $apple_identifier) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload;

// SEND PUSH
        fwrite($fp, $msg);

// We can check if an error has been returned while we are sending, but we also need to
// check once more after we are done sending in case there was a delay with error response.
        checkAppleErrorResponse($fp);
    }

// Workaround to check if there were any errors during the last seconds of sending.
// Pause for half a second.
// Note I tested this with up to a 5 minute pause, and the error message was still available to be retrieved
    usleep(500000);

    checkAppleErrorResponse($fp);

    echo 'Completed';
    $query = "UPDATE `notifications` SET `is_read` = 1 WHERE id = $id ";
    $results = mysql_query($query);
    mysql_close($con);
    fclose($fp);
}

// FUNCTION to check if there is an error response from Apple
// Returns TRUE if there was and FALSE if there was not
function checkAppleErrorResponse($fp) {

//byte1=always 8, byte2=StatusCode, bytes3,4,5,6=identifier(rowID).
// Should return nothing if OK.
//NOTE: Make sure you set stream_set_blocking($fp, 0) or else fread will pause your script and wait
// forever when there is no response to be sent.

    $apple_error_response = fread($fp, 6);

    if ($apple_error_response) {

// unpack the error response (first byte 'command" should always be 8)
        $error_response = unpack('Ccommand/Cstatus_code/Nidentifier', $apple_error_response);

        if ($error_response['status_code'] == '0') {
            $error_response['status_code'] = '0-No errors encountered';
        } else if ($error_response['status_code'] == '1') {
            $error_response['status_code'] = '1-Processing error';
        } else if ($error_response['status_code'] == '2') {
            $error_response['status_code'] = '2-Missing device token';
        } else if ($error_response['status_code'] == '3') {
            $error_response['status_code'] = '3-Missing topic';
        } else if ($error_response['status_code'] == '4') {
            $error_response['status_code'] = '4-Missing payload';
        } else if ($error_response['status_code'] == '5') {
            $error_response['status_code'] = '5-Invalid token size';
        } else if ($error_response['status_code'] == '6') {
            $error_response['status_code'] = '6-Invalid topic size';
        } else if ($error_response['status_code'] == '7') {
            $error_response['status_code'] = '7-Invalid payload size';
        } else if ($error_response['status_code'] == '8') {
            $error_response['status_code'] = '8-Invalid token';
        } else if ($error_response['status_code'] == '255') {
            $error_response['status_code'] = '255-None (unknown)';
        } else {
            $error_response['status_code'] = $error_response['status_code'] . '-Not listed';
        }

        echo '<br><b>+ + + + + + ERROR</b> Response Command:<b>' . $error_response['command'] . '</b>&nbsp;&nbsp;&nbsp;Identifier:<b>' . $error_response['identifier'] . '</b>&nbsp;&nbsp;&nbsp;Status:<b>' . $error_response['status_code'] . '</b><br>';

        echo 'Identifier is the rowID (index) in the database that caused the problem, and Apple will disconnect you from server. To continue sending Push Notifications, just start at the next rowID after this Identifier.<br>';

        return true;
    }

    return false;
}
?>
 

Push notification Android Php

Hey, Today we learn how to send push notification for android in php. First create a class with following code  
<?php

class Pusher{
    const GOOGLE_GCM_URL = 'https://android.googleapis.com/gcm/send';
    private $apiKey;
    private $proxy;
    private $output;
    public function __construct($apiKey, $proxy = null)
    {
        $this->apiKey = 'your_key';
        $this->proxy  = $proxy;
    }
    /**
     * @param string|array $regIds
     * @param string $data
     * @throws Exception
     */
    public function notify($regIds, $data)
    {
//        pr($data);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, self::GOOGLE_GCM_URL);
        if (!is_null($this->proxy)) {
            curl_setopt($ch, CURLOPT_PROXY, $this->proxy);
        }
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeaders());
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getPostFields($regIds, $data));
        $result = curl_exec($ch);
        if ($result === false) {
            throw new Exception(curl_error($ch));
        }
        curl_close($ch);
//        pr($result); die;
        $this->output = $result;
        return $result;
    }
    /**
     * @return array
     */
    public function getOutputAsArray()
    {
        return json_decode($this->output, true);
    }
    /**
     * @return object
     */
    public function getOutputAsObject()
    {
        return json_decode($this->output);
    }

    private function getHeaders(){
        return [
            'Authorization: key=' . $this->apiKey,
            'Content-Type: application/json'
        ];
    }

    private function getPostFields($regIds, $data){
        $fields = [
            'registration_ids' => is_string($regIds) ? [$regIds] : $regIds,
            'data'             => is_string($data) ? ['message' => $data] : $data,
        ];
        return json_encode($fields, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);
    }
}
now call your notify function by creating a object of pusher class.  
 $notification = array("title" => $title,
            "message" => $message,
            "data" => $data,
        );

 $pusher = new Pusher($apiKey);
            $pusher->notify($reg_ids, $notification); // reg_ids are the device ids on which you want to send push
If you are using cakephp or any other php framework then add pusher class in you plugin folder(appPluginPusherPusher.php) and load it where you want to use.

codility brackets opening and closing solution

codility you are given a string s consisting of n brackets opening problem solution.  
function isBalanced($str){
    $count = 0;
    $ocount = 0;
    $ccount = 0;
    $length = strlen($str);
    for($i = 0; $i < $length; $i++){
        if($str[$i] == '(')
            $ocount += 1;
        else if($str[$i] == ')')
            $ccount += 1;
       if($ccount == $ocount){
          $count = $ocount;
       }else{
            $count = $ccount;
       }
    }
    return $count;
}
echo isBalanced("))");
 

How to download multiple files at once - in single command

Suppose you have approx 1000 image files for download, then here is a command to download all them.
  1. Create a text file named it urls.txt
  2. enter all urls each url in a new line
  3. type WGET -i urls.txt in your terminal
WGET -i urls.txt
 

CakePHP in a subdirectory using nginx

CakePHP in a subdirectory using nginx

I was facing many issues in setup cakephp3 in subfolder on nginx server. I was doing changes in new server config while we have to do that in existing server config(well that work for me :) ) So I just add following in default config file. Which can be found /etc/nginx/sites-available  
location /youproj{
alias /usr/share/nginx/html/public_html/youproj/webroot;
if (-f $request_filename) {
break;
}

# prevent recursion
if ($request_uri ~ /webroot/index.php) {
break;
}

rewrite ^/youproj$ /youproj/ permanent;
rewrite ^/youproj/webroot/(.*) /youproj/webroot/index.php?url=$1 last;
rewrite ^/youproj/(.*)$ /youproj/webroot/$1 last;
}
  And enable base_url in app.php in config folder of cakephp
'App' => [
'namespace' => 'App',
'encoding' => env('APP_ENCODING', 'UTF-8'),
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
'base' => false,
'dir' => 'src',
'webroot' => 'webroot',
'wwwRoot' => WWW_ROOT,
'baseUrl' => env('SCRIPT_NAME'),
'base' => '/mamonde',
'fullBaseUrl' => false,
'imageBaseUrl' => 'img/',
'cssBaseUrl' => 'css/',
'jsBaseUrl' => 'js/',
'paths' => [
'plugins' => [ROOT . DS . 'plugins' . DS],
'templates' => [APP . 'Template' . DS],
'locales' => [APP . 'Locale' . DS],
],
],