Sabtu, 19 Desember 2020

COMPOSER dan INSTALL YII2

 Download dimari COMPOSER

Atau sudah memiliki compser sebulumnya dan ingin update Composer yang lama tsb, gunakan perintah pada CLI:
composer self-update



Install YII Menggunakan composer:

php.exe -r "readfile('https://getcomposer.org/installer');" |php.exe

jika gagal berarti salah posisi path atau versi xamppya kurang,,,

jika install xampp berada di C:\xampp

maka terlebih dahuli masuk ke path tersebut:

cd C:\xampp\php

baru ketikkan perintah 
php.exe -r "readfile('https://getcomposer.org/installer');" |php.exe



tetapi jika versi xamppnya kurang berarti harus install versi baru

Download XAMPP Terbaru: link


SBB harus Ada koneksi internet:

php.exe composer.phar self-update

php.exe composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta3"

atau
php.exe composer.phar global require "fxp/composer-asset-plugin:^1.2.0"

atau
php.exe composer.phar global require "fxp/composer-asset-plugin:1.3.1"

atau 

php.exe composer.phar composer global require "fxp/composer-asset-plugin:dev-master"

atau tambahkan 
--ignore-platform-reqs

sehingga menjadi: c:\xampp748\php>php.exe composer.phar global require "fxp/composer-asset-plugin:1.3.1" --ignore-platform-reqs

ATAU

composer global require "fxp/composer-asset-plugin:^1.2.0"

Terkadang ada pesan kita diminta UPDATE composer ke versi terbaru....ya suadh ...Uninstall composer yang lama...lalu download yang baru dan install Lagi....

+++++++++++++++++

php.exe composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic ../htdocs/yii2_lat1

ATAU BASIC

composer create-project --prefer-dist yiisoft/yii2-app-basic basic ../htdocs/yii2_lat1

ATAU ADVANCE
composer create-project --prefer-dist yiisoft/yii2-app-advanced advanced ../htdocs/yii2_lat1

Sembari prosses kita terkadang perlu mendapatkan token installer di:
https://github.com/settings/applications

sehingga dapat token sbb: (Terkadang token ii diminta saat instal atau proses di atas...atau terkadang tidak diminta....)

5ed5a2127944627d22d838bd1fdab869aaf3e4ed9ae 






hasilnya: akan terdownload sejumlah file di folder :C:\XAMPP748\yii2_lat1

yang jika kita jalankan di browser hasilnya sbb:

Lalu masuk ke folder wb:

Sukses Install YII2

Anda ada kesalahan / tidak muncul CONGRATULATIONS>.maka cari file web.php (biasanya di folder web atau folder config) dan silakan isi pada cookieValidationKey

Isi dengan kodeAnda (bebas) misal: cookieValidationKey

untuk Setting database, ada di file config/db.php

OK ...

Atau bisa juga INstall YII2 dengan cara download File YII2 lalu extract dan copas ke C:\XAMPP\HTDOCS kita....MUDAH BUANGET yang ini..

saat di extract, nama foldernya mnjadi basic/advance lalu silakan diganti namanya....misal yii2_d1
dan jalankan: localhost/yii2_d1/web
jika ada pesan error, silakan edit web.php dan isikan value cookieValidationKey

Untuk update YII

php composer.phar update yiisoft/yii2 yiisoft/yii2-composer bower-asset/jquery.inputmask



REFF BOOK








Rabu, 08 Mei 2019

PHP code Convert Doc to Byte

<?php

$tanggal=WKT(date("Y-m-d"));
$jam=WKT(date("H:i:s"));
$pro="simpan";

$dokumen0="avatar.jpg";
$private_key="Aktif";
//$PATH="ypathcss";
?>
<link type="text/css" href="<?php echo "$PATH/base/";?>ui.all.css" rel="stylesheet" /> 
<script type="text/javascript" src="<?php echo "$PATH/";?>jquery-1.3.2.js"></script>
<script type="text/javascript" src="<?php echo "$PATH/";?>ui/ui.core.js"></script>
<script type="text/javascript" src="<?php echo "$PATH/";?>ui/ui.datepicker.js"></script>
<script type="text/javascript" src="<?php echo "$PATH/";?>ui/i18n/ui.datepicker-id.js"></script>
   
  <script type="text/javascript">
      $(document).ready(function(){
        $("#tanggal").datepicker({
dateFormat  : "dd MM yy",       
          changeMonth : true,
          changeYear  : true
        });
      });
    </script>   

<script type="text/javascript">
function PRINT(){
win=window.open('penawaran/print.php','win','width=1000, height=400, menubar=0, scrollbars=1, resizable=0, location=0, toolbar=0, private_key=0'); }
</script>
<script language="JavaScript">
function buka(url) {window.open(url, 'window_baru', 'width=800,height=600,left=320,top=100,resizable=1,scrollbars=1');}
</script>

<style>
#table {
    font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
    border-collapse: collapse;
    width: 100%;
}

#table td, #table th {
    border: 1px solid #ddd;
    padding: 8px;
}

#table tr:nth-child(even){background-color: #f2f2f2;}

#table tr:hover {background-color: #ddd;}

#table th {
    padding-top: 12px;
    padding-bottom: 12px;
    text-align: left;
    background-color: #E9967A;
    color: white;
}
</style>

<?php
$kode_vendor=$_SESSION["cid"];
$sql="select * from `$tbvendor` where `kode_vendor`='$kode_vendor'";
$d=getField($conn,$sql);
$kode_vendor=$d["kode_vendor"];
$kode_vendor0=$d["kode_vendor"];
$nama_vendor=$d["nama_vendor"];
$email=$d["email"];
$telepon=$d["telepon"];
$username=$d["username"];
$password=$d["password"];
$status=$d["status"];

$public_key=$d["public_key"];
$private_key2=substr($d["public_key"],0,10);


$kode_penawaran=$_GET["kode"];
$sql="select * from `$tbpenawaran` where `kode_penawaran`='$kode_penawaran'";
$d=getField($conn,$sql);
$kode_penawaran=$d["kode_penawaran"];
$kode_user=getUser($conn,$d["kode_user"]);
$kode_tender=getTender($conn,$d["kode_tender"]);
$kode_tender2=$d["kode_tender"];

$tanggal=$d["tanggal"];
$jam=$d["jam"];
$deskripsi=$d["deskripsi"];
$private_key=$d["private_key"];
$public_key=$d["public_key"];


$dokumen=$d["dokumen"];
$dokumen0=$d["dokumen"];

?>

<link rel="stylesheet" href="js/jquery-ui.css">
  <link rel="stylesheet" href="resources/demos/style.css">
<script src="js/jquery-1.12.4.js"></script>
  <script src="js/jquery-ui.js"></script>
  <script>
  $( function() {
    $( "#accordion" ).accordion({
      collapsible: true
    });
  } );
  </script>
<div id="accordion">
  <h3>Halaman Dekrip Penawaran User</h3>
  <div>
<div style="text-align:left;">

<form action="" method="post" enctype="multipart/form-data">

<div class="panel panel-default templatemo-content-widget white-bg no-padding templatemo-overflow-hidden">
                <i class="fa fa-times"></i>
                <div class="panel-heading templatemo-position-relative"><h2 class="text-uppercase">Show Penawaran</h2></div>
                <div class="table-responsive">
<table id="table" class="table table-striped table-bordered">

<tr>
<th width="209"><label for="kode_penawaran">Kode Penawaran</label>
<th width="27">:
<th width="842" colspan="2"><b><?php echo $kode_penawaran;?></b></tr>


<tr>
<td height="24"><label for="kode_user">User</label>
<td><div align="center">:</div>
<td>
  <?php echo $kode_user;?></tr>



<tr>
<td height="24"><label for="kode_user">Tender</label>
<td><div align="center">:</div>
<td>
  <?php echo $kode_tender." ($kode_tender2)";?></tr>
<tr>
<td height="24"><label for="deskripsi">Deskripsi</label>
<td>:<td><?php echo $deskripsi;?>
</td>
</tr>


<tr>
  <td height="24">Dokumen
    <td>:<td colspan="2"><a href="downloadget2.php?file=<?php echo $dokumen;?>">Download Dokumen</a></td>
</tr>


<tr>
<td height="24"><label for="kode_user">Waktu</label>
<td><div align="center">:</div>
<td>
  <?php echo WKT($tanggal)." $jam WIB";?></tr>



<tr>
  <td height="24">Private Key
    <td>:<td colspan="2">
    <input name="private_key2" type="text" id="private_key2" value="<?php echo $private_key2;?>" size="55" readonly="readonly" />
    </td>
</tr>

<tr>
  <td height="24">Dokumen
    <td>:<td colspan="2"><label for="dokumen"></label>
        <input name="dokumen" type="file" id="dokumen" size="20" />
   </tr>


<tr>
<td>
<td valign="top">
<td colspan="2">
 <div class="form-group text-left">
<input name="Dekrip" type="submit" id="Dekrip" value="Dekrip" class="templatemo-blue-button" />
        <input name="kode_penawaran" type="hidden" id="kode_penawaran" value="<?php echo $kode_penawaran;?>" />
         <input name="public_key" type="hidden" id="public_key" value="<?php echo $public_key;?>" />
                <input name="Batal" type="submit" id="Batal" value="Batal"class="templatemo-white-button" />
        </div>

</td></tr>
</table>
</form>
</div>
</div>

</div>
</div>
       
</div>
<?php
//<input name="dokumen" type="hidden" id="dokumen" value="<?php echo $dokumen;
     
if(isset($_POST["Dekrip"])){
$pro=strip_tags($_POST["pro"]);
$kode_penawaran=strip_tags($_POST["kode_penawaran"]);
$public_key=strip_tags($_POST["public_key"]);
//$dokumen=($_POST["dokumen"]);

$tanggal=date("Y-m-d");
$jam=date("H:i:s");

$time_start = microtime_float();

ini_set('memory_limit', '-1');
ini_set('max_execution_time', '-1');

//$ciphertext = file_get_contents("upload/".$dokumen);
//move_uploaded_file($_FILES["dokumen"]["tmp_name"],"upload/temp");
//$ciphertext = file_get_contents("upload/temp");

move_uploaded_file($_FILES["dokumen"]["tmp_name"],"upload/temp");
$ciphertext = file_get_contents("upload/temp");


//echo"ciphertext: $ciphertext";

include 'Crypt/DSA.php';
$dsa = new Crypt_DSA();
$dsa->loadKey($public_key);
$dekrip= $dsa->decrypt($ciphertext);

$namafile = str_replace("Enkrip","Dekrip", $dokumen);
$fp = fopen("upload/".$namafile,"w");
fwrite($fp,$dekrip);
fclose($fp);

$time_end = microtime_float();
$time = $time_end - $time_start;


echo "<br>File Hasil Dekripsi :"; echo $namafile;
echo "<br>Lokasi Hasil Dekripsi :"; echo realpath("upload/". $namafile);
echo "<br>Waktu Proses Dekripsi : $time seconds\n";
echo "<br>File Hasil Dekripsi DSA EL GAMAL :"; echo  "Dekrip_".$namafile;
echo "<br>Lokasi Hasil Dekripsi DSA EL GAMAL :"; echo realpath("upload/Dekrip_".$namafile);
echo "<br>Waktu Proses Dekripsi DSA EL GAMAL : $time seconds\n";
echo"<br><hr>";

}
?>

COMPOSER WINDOWS



Sebelumnya pastikan NPM  aktif dengan cara via CMD ketik: npm -version
C:\Users\USER>npm -version
6.9.0
jika gagal..silakan install dan ikuti langkah sbb.di link ini.


selanjutnya.....
DOWNLOAD COMPOSER WINDOWS HERE
setelah install path langsung tersetting composer dan tes versi dgn cara di atas



C:\Users\USER>composer -V
Composer version 1.8.5 2019-04-09 17:46:47
WHY
Library X membutuhkan library Y agar bisa digunakan, kemudian library Y membutuhkan library Q,R,S.

“Bagaimana kalau ada banyak sekali library yang digunakan?”

Pastinya akan repot mencari sendiri depedency library-nya.

Karena itu…, kita membutuhkan composer.

Composer adalah program untuk manajemen proyek PHP. Composer bisa kita suruh untuk:

Menginstal library yang dibutuhkan ke project
Menjalankan sebuah scipt
Melakukan testing




Composer akan mendeteksi lokasi php.exe yang terinstal.
Jika kita menggunakan XAMPP, biasanya lokasinya berada di C:\xampp\php\php.exe.


SET INIT
Buat direktori baru di htdocs atau /var/www/html, lalu masuk ke direktori tersebut.

mkdir /var/www/html/LP2MCOMPOSER
cd /var/www/html/LP2MCOMPOSER
Kemudian ketik perintah composer init untuk melakukan inisialisasi composer:

composer init


Perintah di atas akan menghasilkan file composer.json:

+++++
c:\xampp\htdocs\LP2MCOMPOSER>composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [user/lp2mcomposer]: lp2m
 The package name lp2m is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [user/lp2mcomposer]: lp2maray
 The package name lp2maray is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [user/lp2mcomposer]: lp2maray_jkt
 The package name lp2maray_jkt is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [user/lp2mcomposer]: lp2maray_jkt_ina
 The package name lp2maray_jkt_ina is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [user/lp2mcomposer]: lp2maray_jkt_ina_world
 The package name lp2maray_jkt_ina_world is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [user/lp2mcomposer]:
Description []: lp2m composer
Author [, n to skip]: riadi marta dinata
 Invalid author string.  Must be in the format: John Smith <john@example.com>
Author [, n to skip]: riadi marta dinata <adiarray@gmail.com>
Minimum Stability []: 100
 Invalid minimum stability "100". Must be empty or one of: stable, RC, beta, alpha, dev
Minimum Stability []: RC
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: v1

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? yes
Search for a package: yes

Found 15 packages matching yes

   [0] internations/exception-bundle
   [1] nulpunkt/yesql-php
   [2] yeszao/fastphp
   [3] yeswedev/nova-translatable
   [4] livelyworks/laravel-yes-authority
   [5] ywh/doctrine-encryption-extension
   [6] ywh/doctrine-encryption-bundle
   [7] yeswedev/laravel-cms-nova
   [8] yeswedev/laravel-cms
   [9] yeskn-studio/vmoex-framework
  [10] sgalinski/content-replacer
  [11] mindplay/escape
  [12] sylingd/yesf-framework
  [13] popsugar/php-yesmail-api
  [14] amilna/yii2-yes

Enter package # to add, or the complete package name if it is not listed: 0
Enter the version constraint to require (or leave blank to use the latest version): v1
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package:

{
    "name": "user/lp2mcomposer",
    "description": "lp2m composer",
    "type": "project",
    "require": {
        "internations/exception-bundle": "v1"
    },
    "license": "v1",
    "authors": [
        {
            "name": "riadi marta dinata",
            "email": "adiarray@gmail.com"
        }
    ],
    "minimum-stability": "RC"
}

Do you confirm generation [yes]? yes
Would you like to install dependencies now [yes]? yes
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - The requested package internations/exception-bundle v1 exists as internations/exception-bundle[2.3.0, 2.4.1, 2.4.2, 2.4.3, 2.4.4, 2.4.5, 3.0.0, 4.0.0, 5.0.0, 5.0.1, 5.0.2, 5.1.0, dev-feature/psr-2-newlines, dev-master] but these are rejected by your constraint.


+++++++++++++++++++++

Hasilnya composer.init
{
    "name": "user/lp2mcomposer",
    "description": "lp2m composer",
    "type": "project",
    "require": {
        "internations/exception-bundle": "v1"
    },
    "license": "v1",
    "authors": [
        {
            "name": "riadi marta dinata",
            "email": "adiarray@gmail.com"
        }
    ],
    "minimum-stability": "RC"
}

++++++++++++++++++++++++
Informasi yang tertera pada file composer.json merupakan informasi yang baru saja kita masukkan.

Perhatikan pada atribut "require", isinya masih kosong, karena tadi kita menjawab no pada define depedency.

Selanjutnya cobalah instal library Carbon, library ini menyediakan fungsi-fungsi untuk pemrosesan waktu (Date Time).

Ketik pada terminal:

composer require nesbot/carbon -vvv

Kita memberikan argumen `-vvv` agar bisa melihat proses-nya


Jika gagal membentuk folder vendor maka hapus require {}

   "require": {
        "internations/exception-bundle": "v1"
    },

menjadi
   "require": {},




isi file composer.init berubah menjadi:
{
    "name": "user/lp2mcomposer",
    "description": "lp2m composer",
    "type": "project",
    "require": {
        "nesbot/carbon": "^1.37"
    },
    "license": "v1",
    "authors": [
        {
            "name": "riadi marta dinata",
            "email": "adiarray@gmail.com"
        }
    ],
    "minimum-stability": "RC"
}







Menggunakan Library
Selanjutnya, kita akan mencoba menggunakan library yang baru saja kita tambahkan.

Buatlah file PHP baru di direktori proyek beranam tes_carbon.php dengan isi sebagai berikut.

Buat file tes_carbon.php
<?php

require 'vendor/autoload.php';
use Carbon\Carbon;
$sekarang = Carbon::now();

echo "Sekarang: $sekarang <br>";
echo "Umur saya: " . Carbon::createFromDate(2000, 1, 1)->age . "<br>";
echo "Besok: " . $sekarang->addDay() ."<br>";

?>





Misalkan kita membutuhkan lebih banyak library untuk diinstal.

Kita hanya perlu menambahkan nama-nama pustakanya ke dalam atribut "require".

  "require": {
        "nesbot/carbon": "^1.37",
"setasign/fpdf":"1.8.1"
    },




Formatnya, "vendor/library": "versi".

“Lalu, bagaimana cara kita mengetahui nama-nama vendor dan library?”

Kita dapat menggunakan perintah:

composer search fpdf
Perintah tersebut untuk mencari nama vendor penyedia library fpdf…


atau pakai browser
…atau kita juga bisa mencarinya di website packagist.org.



Setelah semua library yang kita butuhkan ditulis dalam file composer.json, selanjutnya kita bisa menginstal semuanya dengan perintah:

composer update

Menghapus Library
Gunakan perintah berikut untuk menghapus Library dari Proyek:

composer remove <vendor>/<library>
Contoh:

composer remove vlucas/phpdotenv
Maka library phpdotenv akan dihapus dari proyek kita.

composer remove setasign/fpdf
Maka library fpdf akan dihapus dari proyek kita.

Selain menggunakan perintah di atas, kita juga bisa menghapus manual dari file composer.json.







SET PROJECT PHP USE COMPOSER

+Buat folder di htdocs
+pada CMD masuk ke dalamnya ketik : composer init

Jika ada pertanyaan yang muncul, tekan enter dan jawab no, karena nanti kita bisa edit.dan akan membentuk composer.json


{
    "name": "user/lp2mcomposer",
    "description": "lp2m composer",
    "type": "project",
    "require": {
        "nesbot/carbon": "^1.37",
"setasign/fpdf":"1.8.1"
    },
    "license": "v1",
    "authors": [
        {
            "name": "riadi marta dinata",
            "email": "adiarray@gmail.com"
        }
    ],
    "minimum-stability": "RC"
}


Sebenarnya kita bisa menjalankan server dengan perintah ini:

php -S localhost:8080
Tapi karena kita ingin menggunakan composer untuk melakukannya, maka kita harus menambahkan perintah tersebut ke dalam composer.json.


Sehingga menjadi :

{
    "name": "user/lp2mcomposer",
    "description": "lp2m composer",
    "type": "project",
    "require": {
        "nesbot/carbon": "^1.37",
"setasign/fpdf":"1.8.1"
    },
"scripts": {"server": "php -S localhost:8080"}
}



LALU
composer server
Buka terminal, lalu ketik perintah tersebut. Maka server PHP akan berjalan di port 8080.

Jika gagal mengaktifkan server 8080 hapus data di bawah script
{
    "name": "user/lp2mcomposer",
    "description": "lp2m composer",
    "type": "project",
    "require": {
        "nesbot/carbon": "^1.37",
"setasign/fpdf":"1.8.1"
    },
"scripts": {"server": "php -S localhost:8080"}
}
Lalu buat file index.php
<?php

echo "HAi Riadi Marta Dinata";

?>

juga buat about.php
<?php

echo "About Composer by Riadi Marta Dinata";

?>

Jalankan














Selasa, 07 Mei 2019

NODE JS for Windows (x64)

DOWNLOAD HERE


Node.js adalah perangkat lunak yang didesain untuk mengembangkan aplikasi berbasis web dan ditulis dalam sintaks bahasa pemrograman JavaScript.

Bila selama ini kita mengenal JavaScript sebagai bahasa pemrograman yang berjalan di sisi client / browser saja, maka Node.js ada untuk melengkapi peran JavaScript sehingga bisa juga berlaku sebagai bahasa pemrograman yang berjalan di sisi server,

Untuk mengeksekusi Javascript sebagai bahasa server diperlukan engine yang cepat dan mempunyai performansi yang bagus. Engine Javascript dari Google bernamaV8-lah yang dipakai oleh Node.js yang juga merupakan engine yang dipakai oleh browser Google Chrome.

Bagaimana Node.js Bekerja?
Berbeda dengan bahasa pemrograman sisi server pada umumnya yang bersifat blocking, Node.js bersifat non-blocking, sebagaimana halnya JavaScript bekerja. Node.js berjalan dengan basis event (event-driven). Maksud dari Blocking secara sederhana adalah, bahwa suatu kode program akan dijalankan hingga selesai, baru kemudian beralih ke kode program selanjutnya.

Misalkan kita memiliki program dengan algoritma berikut:

Terima rekues untuk halaman blog
ambil data blog dari database
tulis html berisi data blog
kirim respon ke klien

REFF: https://www.codepolitan.com/mengenal-nodejs-5880234fe9ae3

Bila kita menggunakan bahasa pemrograman blocking yang bersifat multi-thread, pada poin kedua saat program mengambil data dari database selama jangka waktu tertentu pada satu thread, maka thread lain yang disiapkan untuk menjalankan poin ketiga (yakni menulis data dari database ke dalam bentuk HTML) tidak akan dijalankan hingga thread untuk poin kedua mengembalikan data. Ini sebenarnya bukan masalah karena CPU menjalankan proses dengan sangat cepat. Hanya saja, Node.js dengan single-threaded-nya melakukan dengan cara yang berbeda.

Node.js, mengalokasikan thread untuk setiap poin, dia hanya akan membuat thread hanya apabila ada event yang membutuhkan hal tersebut. Contohnya untuk kasus di atas, ketika program mengambil data dari database, program hanya akan membuat thread atau dengan kata lain mulai memproses poin ketiga hanya apabila data dari database sudah diterima, menggunakan callback.

Selain itu, bila ada proses lain yang tidak tergantung pada data tadi, maka proses tersebut akan dijalankan tanpa harus menunggu pengambilan data selesai.

Setelah install UJI NODEJS:

ketik kode sbb: server.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node.Js\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

lalu buka CMD dan arahkan ke path : node server.js


OK NODE JS sudah running

Buka Browser dan ketikkan: http://127.0.0.1:1337/
C:\xampp\htdocs\NOJS\latihan\nodejs>md latNPM

C:\xampp\htdocs\NOJS\latihan\nodejs>cd latNPM

C:\xampp\htdocs\NOJS\latihan\nodejs\latNPM>
npm install md5-json --save

npm WARN deprecated minimatch@0.3.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN saveError ENOENT: no such file or directory, open 'C:\xampp\htdocs\NOJS\latihan\nodejs\latNPM\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open 'C:\xampp\htdocs\NOJS\latihan\nodejs\latNPM\package.json'
npm WARN latNPM No description
npm WARN latNPM No repository field.
npm WARN latNPM No README data
npm WARN latNPM No license field.

+ md5-json@0.2.0
added 9 packages from 6 contributors and audited 9 packages in 3.464s
found 1 high severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details

C:\xampp\htdocs\NOJS\latihan\nodejs\latNPM>cd..

C:\xampp\htdocs\NOJS\latihan\nodejs>md latNPMG

C:\xampp\htdocs\NOJS\latihan\nodejs>cd latNPMG

C:\xampp\htdocs\NOJS\latihan\nodejs\latNPMG>
npm install --g npm md5-json --save
npm WARN deprecated minimatch@0.3.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
C:\Users\USER\AppData\Roaming\npm\npm -> C:\Users\USER\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js
C:\Users\USER\AppData\Roaming\npm\npx -> C:\Users\USER\AppData\Roaming\npm\node_modules\npm\bin\npx-cli.js
+ npm@6.9.0
+ md5-json@0.2.0
added 435 packages from 804 contributors in 25.275s


NPM =install JS secara modular ....keluar dari ALL paket di nodejs

npm install md5-json --save

option --g = agar modul yg diinstall tsb bisa dipakai di banyak aplikasi (GLOBAL)
npm install --g npm mdt-json --save

++++
SOCKET IO

NB Posisi pathLathan bebas ...tiadk harus di htdocs.

Buat folder latsoketIO:
masuk ke dlamnya dan ketik: npm install socket.io

C:\xampp\htdocs\NOJS\latihan\nodejs>mkdir latsoketIO

C:\xampp\htdocs\NOJS\latihan\nodejs>cd latsoketIO

C:\xampp\htdocs\NOJS\latihan\nodejs\latsoketIO>npm install socket.io
npm WARN saveError ENOENT: no such file or directory, open 'C:\xampp\htdocs\NOJS\latihan\nodejs\latsoketIO\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open 'C:\xampp\htdocs\NOJS\latihan\nodejs\latsoketIO\package.json'
npm WARN latsoketIO No description
npm WARN latsoketIO No repository field.
npm WARN latsoketIO No README data
npm WARN latsoketIO No license field.

+ socket.io@2.2.0
added 45 packages from 33 contributors and audited 77 packages in 3.472s
found 0 vulnerabilities


lalu di folder latsoketIO buat kode untuk standby di port tertentu

app.js
/*
* load module http, untuk membuat server
* load module socket.io
* load module fs untuk membaca file
*/

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
/*
* setting aplikasi di port 8888
*/

app.listen(8888);
/*
* buat fungsi hendler , fungsi ini digunakan untuk konfigurasi server
*/
function handler (req, res) {
/*
* baca file index.html
*/
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
  /*
  * tangani jika serever erorr
  */
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}
//server myserver
//emit =ke
io.on('connection', function (socket) {
  socket.emit('myclient', { pesan: 'Hai saya adalah server myserver...........APP.JS' });
  socket.on('myserver', function (data) {
    console.log(data);
  });
});

dan file index.html sebagai file yang dijalankan oleh client

<!-- disini kita menggunakan socket.io untuk client di CDN -->
<script src="https://cdn.socket.io/socket.io-1.0.6.js"></script>
<script>
/*
* buka koneksi ke server, karena kita membuat server di port 8888
* maka alamat servernya pun harus sesuai
*/
  var socket = io('http://localhost:8888');
  /*
  * baca channel myclient dari client lalu kirimkan data ke myserver
  */
  socket.on('myclient', function (data) {
    console.log(data);
    socket.emit('myserver', { pesan: 'Hai saya pesan dari myclient untuk myserver' });
  });
</script>



cara uji:
jalankan app.js
C:\xampp\htdocs\NOJS\latihan\nodejs\latsoketIO>node app.js

dan pada browser jalankan: http://localhost:8888/

++++++++++++++++++++++++++APLIKASI CHAT SOCKET

index.php

<html>
<head>
<style>
body{width:600px;font-family:calibri;}
.error {color:#FF0000;}
.chat-connection-ack{color: #26af26;}
.chat-message {border-bottom-left-radius: 4px;border-bottom-right-radius: 4px;
}
#btnSend {background: #26af26;border: #26af26 1px solid; border-radius: 4px;color: #FFF;display: block;margin: 15px 0px;padding: 10px 50px;cursor: pointer;
}
#chat-box {background: #fff8f8;border: 1px solid #ffdddd;border-radius: 4px;border-bottom-left-radius:0px;border-bottom-right-radius: 0px;min-height: 300px;padding: 10px;overflow: auto;
}
.chat-box-html{color: #09F;margin: 10px 0px;font-size:0.8em;}
.chat-box-message{color: #09F;padding: 5px 10px; background-color: #fff;border: 1px solid #ffdddd;border-radius:4px;display:inline-block;}
.chat-input{border: 1px solid #ffdddd;border-top: 0px;width: 100%;box-sizing: border-box;padding: 10px 8px;color: #191919;
}
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script> 
function showMessage(messageHTML) {
$('#chat-box').append(messageHTML);
}

$(document).ready(function(){
var websocket = new WebSocket("ws://localhost:8091/NOJS/chatio/php-socket.php");
websocket.onopen = function(event) {
showMessage("<div class='chat-connection-ack'>Connection is established!</div>");

// http://localhost/NOJS/chatio/index.php?param1=jokowi&param2=prabowo&id=6
$.urlParam('param1'); // jokowi
$.urlParam('id');        // 6
$.urlParam('param2');   // prabowo
event.preventDefault();
var messageJSON = {
chat_user: $.urlParam('param1'),
chat_message: $.urlParam('param2')
};
websocket.send(JSON.stringify(messageJSON));

}
websocket.onmessage = function(event) {
var Data = JSON.parse(event.data);
showMessage("<div class='"+Data.message_type+"'>"+Data.message+"</div>");
$('#chat-message').val('');
};

websocket.onerror = function(event){
showMessage("<div class='error'>Problem due to some Error</div>");
};
websocket.onclose = function(event){
showMessage("<div class='chat-connection-ack'>Connection Closed</div>");
};

$('#frmChat').on("submit",function(event){
event.preventDefault();
$('#chat-user').attr("type","hidden");
var messageJSON = {
chat_user: $('#chat-user').val(),
chat_message: $('#chat-message').val()
};
websocket.send(JSON.stringify(messageJSON));
});





$.urlParam = function(name){
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
return results[1] || 0;
}


});






</script>
</head>
<body>
<form name="frmChat" id="frmChat" method="get">
<div id="chat-box"></div>
<input type="text" name="chat-user" id="chat-user" placeholder="Name" class="chat-input" required />
<input type="text" name="chat-message" id="chat-message" placeholder="Message"  class="chat-input chat-message" required />
<input type="submit" id="btnSend" name="send-chat-message" value="Send" >
</form>
</body>
</html>

<?php
if(isset($_GET["param1"])){
echo $_GET["param1"];
echo "#".$_GET["param2"];

}

?>



php-socket.php

<?php
define('HOST_NAME',"localhost");
define('PORT',"8091");
$null = NULL;

require_once("class.chathandler.php");
$chatHandler = new ChatHandler();

$socketResource = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socketResource, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socketResource, 0, PORT);
socket_listen($socketResource);

$clientSocketArray = array($socketResource);
while (true) {
$newSocketArray = $clientSocketArray;
socket_select($newSocketArray, $null, $null, 0, 10);

if (in_array($socketResource, $newSocketArray)) {
$newSocket = socket_accept($socketResource);
$clientSocketArray[] = $newSocket;

$header = socket_read($newSocket, 1024);
$chatHandler->doHandshake($header, $newSocket, HOST_NAME, PORT);

socket_getpeername($newSocket, $client_ip_address);
$connectionACK = $chatHandler->newConnectionACK($client_ip_address);

$chatHandler->send($connectionACK);

$newSocketIndex = array_search($socketResource, $newSocketArray);
unset($newSocketArray[$newSocketIndex]);
}

foreach ($newSocketArray as $newSocketArrayResource) {
while(socket_recv($newSocketArrayResource, $socketData, 1024, 0) >= 1){
$socketMessage = $chatHandler->unseal($socketData);
$messageObj = json_decode($socketMessage);

$chat_box_message = $chatHandler->createChatBoxMessage($messageObj->chat_user, $messageObj->chat_message);
$chatHandler->send($chat_box_message);
break 2;
}

$socketData = @socket_read($newSocketArrayResource, 1024, PHP_NORMAL_READ);
if ($socketData === false) {
socket_getpeername($newSocketArrayResource, $client_ip_address);
$connectionACK = $chatHandler->connectionDisconnectACK($client_ip_address);
$chatHandler->send($connectionACK);
$newSocketIndex = array_search($newSocketArrayResource, $clientSocketArray);
unset($clientSocketArray[$newSocketIndex]);
}
}
}
socket_close($socketResource);



class.php
<?php
class ChatHandler {
function send($message) {
global $clientSocketArray;
$messageLength = strlen($message);
foreach($clientSocketArray as $clientSocket)
{
@socket_write($clientSocket,$message,$messageLength);
}
return true;
}

function unseal($socketData) {
$length = ord($socketData[1]) & 127;
if($length == 126) {
$masks = substr($socketData, 4, 4);
$data = substr($socketData, 8);
}
elseif($length == 127) {
$masks = substr($socketData, 10, 4);
$data = substr($socketData, 14);
}
else {
$masks = substr($socketData, 2, 4);
$data = substr($socketData, 6);
}
$socketData = "";
for ($i = 0; $i < strlen($data); ++$i) {
$socketData .= $data[$i] ^ $masks[$i%4];
}
return $socketData;
}

function seal($socketData) {
$b1 = 0x80 | (0x1 & 0x0f);
$length = strlen($socketData);

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.$socketData;
}

function doHandshake($received_header,$client_socket_resource, $host_name, $port) {
$headers = array();
$lines = preg_split("/\r\n/", $received_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')));
$buffer  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"WebSocket-Origin: $host_name\r\n" .
"WebSocket-Location: ws://$host_name:$port/demo/shout.php\r\n".
"Sec-WebSocket-Accept:$secAccept\r\n\r\n";
socket_write($client_socket_resource,$buffer,strlen($buffer));
}

function newConnectionACK($client_ip_address) {
$message = 'New client ' . $client_ip_address.' joined';
$messageArray = array('message'=>$message,'message_type'=>'chat-connection-ack');
$ACK = $this->seal(json_encode($messageArray));
return $ACK;
}

function connectionDisconnectACK($client_ip_address) {
$message = 'Client ' . $client_ip_address.' activity';
$messageArray = array('message'=>$message,'message_type'=>'chat-connection-ack');
$ACK = $this->seal(json_encode($messageArray));
return $ACK;
}

function createChatBoxMessage($chat_user,$chat_box_message) {
$message = $chat_user . ": <div class='chat-box-message'>" . $chat_box_message . "</div>";
$messageArray = array('message'=>$message,'message_type'=>'chat-box-html');
$chatMessage = $this->seal(json_encode($messageArray));
return $chatMessage;
}
}
?>


+jalankan dahulu :http://localhost/NOJS/chatio/php-socket.php
+setalah ituj jalankan chatnya:http://localhost/NOJS/chatio/index.php
+jika ingin kirim data dari alat atau arduino:
http://localhost/NOJS/chatio/index.php?param1=jokowi&param2=prabowo&id=6


OK





Sabtu, 16 September 2017

Studi Kasus SMS API


1.dapatkan keanggotaan di nexmo.com atau https://dashboard.nexmo.com/sign-up
2.login dan dapatkan tampilan sbb:


3.download package JSON di https://github.com/nexmo/node-sms-proxy
4.copas dan extract misalkan di D:\


5.buka cmd atau comamnd line dan arahkan ke folder diatas : D:\Studi\node-sms-proxy-master2
lalu ketik:
npm install

6.Buka example.env dan masukkan API key dan SECRET Key nya

NEXMO_API_KEY=087XXXX
NEXMO_API_SECRET=b6f85fe0b36XXXXX
NEXMO_DEBUG=true
PROVISIONED_NUMBERS=[{"country":"2_CHAR_CODE","msisdn":"NUMBER"}]
SMS_WEBHOOK_URL=

7.Buat File Hidden .env


caranya copas example.env lalu klik kanan dan rename :ALT+0160
Gunakan aplikasi Numlocker untuk mengubah ASCII ke Numlock
sehingga M=0. J=1,K=2,L=3,dst


ATAU langsung COPY example.env .env



Terahir:
npm start


PADA LINUX:
git clone https://github.com/nexmo/node-sms-proxy.git
cd node-sms-proxy
npm install
mv example.env .env
npm start
++++++++++++++++++++++++
TES RUN: http://localhost:5000/
HELP: https://developer.nexmo.com/api/sms 
Untuk yang paket Free no penerima harus kita daftarkan sebelumnya di:
https://dashboard.nexmo.com/test-numbers


Untuk menguji Pengiriman sms berhasil gunakan Pola sbb:
curl -X "POST" "https://rest.nexmo.com/sms/json" \
  -d "from=Nexmo" \
  -d "text=A text message sent using the Nexmo SMS API" \
  -d "to=TO_NUMBER" \
  -d "api_key=API_KEY" \
  -d "api_secret=API_SECRET"
Kita bisa juga menggunakan versi bahasa lainnya: cek di https://developer.nexmo.com/messaging/sms/overview
atau secara coding:
<h1>lp2maray.com</h1>
Nexmo- Test SMS API
  <hr>
  
  <form action="https://rest.nexmo.com/sms/json" method="post" >
  from: <input type="text" name="from" value="Nexmo"><br>
  text: <input type="text" name="text" value="Halo P Kabar ...frm ADIARRAY"><br>
  to: <input type="text" name="to" value="+6282111095838"><br>
  api_key: <input type="text" name="api_key" value="0876XXXX"><br>
  api_secret: <input type="text" name="api_secret" value="b6f85fe0b364XXXX"><br>
  
  <input type="Submit" value="SEND SMS API" name="SEND">
  
  
  </form>
  
NANTI jika ada balasan :
{
    "message-count": "1",
    "messages": [{
        "to": "6282111095838",
        "message-id": "0F0000006E69DF42",
        "status": "0",
        "remaining-balance": "1.97400000",
        "message-price": "0.02600000",
        "network": "51010"
    }]
}
berarti pesan sudah terkirimm....
OK Selamat Mencobaaaaaaaaaaaaa......