CategoriesInternetProgramming

Capture API Endpoint yang jalan di Aplikasi Smart Phone menggunakan Postman

API Endpoint hampir pasti digunakan di Aplikasi Android maupun IOS, tentunya misal pembaca adalah program akan penasaran apakah API yang dibuat kita aman dan apakah mungkin ter ekspose. Jawabannya iya sangat mungkin untuk di capture. Kali ini kita akan membahas tuntas salah satu cara untuk Capture atau sniffing API yang jalan di Aplikasi Smart Phone menggunakan Postman. Cara ini bisa dilakukan untuk Optimasi API yang kita Buat untuk menghindari data leaks. Di akhir akan saya jelaskan bagaimana cara untuk menghindari data leaks.

Berikut pengetahuan Dasar sebelum kita Bermain main lebih dalam:

1.  API Endpoint.

API(Application Programming Interface) merupakan sekumpulan (method, fungsi atau URL endpoint) yang digunakan untuk mengembangkan aplikasi lebih dari satu platform yang berbeda. Lalu apa kegunaan API ini? dengan menggunakan API maka kita dapat mengunakan sumber daya dari aplikasi lain tanpa perlu mengetahui bagaimana aplikasi itu dibuat. 

2. Postman.

POSTMAN adalah sebuah aplikasi (berupa plugin) untuk browser chrome, fungsinya adalah sebagai REST Client atau istilahnya adalah aplikasi yang digunakan untuk melakukan uji coba REST API yang telah kita buat. silakan download di link berikut: https://www.postman.com/downloads/

3. Proxy.

Proxy server (peladen proxy) adalah sebuah komputer server atau program komputer yang dapat bertindak sebagai komputer lainnya untuk melakukan request terhadap content dari Internet atau intranet. disini yang akan kita gunaan sebagai proxy server adalah PC.

 

Ayo kita Praktikan untuk lebih mudahnya:

Keterangan :  Pastikan menyiapkan PC dan Smart Phone.  PC dan Smart Phone harus dalam satu Jaringan. PC sebagai alat Capture sedangkan Smart Phone yang di Capture.

  1. Setting Postman klik tombol Capture Request and Cookies.
    Menu untuk Capture Request and Cookies
    Setting seperti Gambar berikut:
    Setting Capture requests an cookies Postman
  2.  Cek terlebih dahulu IP Address PC kita berapa, IP ini yang akan digunakan sebagai Hostname di proxy Smart Phone saya yaitu : 192.168.53.234
    IP Address PC
  3.   Setting Proxy di Smart Phone dengan menggunakan Hostname / IP PC kita dan masukan Port yang sudah kita setting di Postman(saya menggunakan Smart Phone Vivo Y31).
    Setting Proxy di Smart Phone
  4. Setting selesai. Sekarang waktunya Capture API, saya ingin Capture API dari Aplikasi KAI Access, buka aplikasi KAI access.
    Aplikasi KAI Access
  5.            Setelah dibuka dan melakukan beberapa proses di Aplikasi KAI Access, maka semua request akan ter Capture di Postman lengkap dengan URL, Header, Request dan response.

    Hasil Capture API saya taruh di History.
    Salah satu API Endpoint yang saya dapat dari Capturing.

Kesimpulan:

Ini adalah salah satu cara yang saya  gunakan untuk mencari celah / bug dari suatu aplikasi karena kebanyakan aplikasi API tidak ter bundle atau tidak double encrypt dan tidak ada ssl security sehingga sangat mudah data leaks atau rusak, tentu environment dasar dari sisi backend diperlukan untuk memperkuat suatu system. Salah satu cara preventif dasar adalah pastikan URL End Point API menggunakan ssl security dan pastikan data public dan private dibedakan dengan auth.

Semoga Bermanfaat

Wasallamualaikum.

CategoriesProgramming

Native REST API Sederhana menggunakan PHP untuk Email Real Checker

Email Real Checker adalah salah satu cara untuk menghindari apakah Email pengguna Real atau tidak sebelum kita kirim menggunakan Commercial Email provider. Salah satu masalah yang muncul apabila email yang kita kirim baik secara Transactional atau Campaign adalah Tidak ter Delivered dan Bouncing, sehingga kita sebagai pengguna akan terkena dampaknya yaitu suspend.  Kali ini kita akan membahas dan praktikkan Native REST API Email Checker menggunakan PHP. 

Berikut  Pengetahuan dasar sebelum kita coding:

1.       MX Record

           MX Record merupakan salah satu tipe record untuk menyatakan kemana dan bagaimana e-mail harus diarahkan. Untuk diarahkan tentu apabila suatu DNS atau hostname ter recrd maka akan vali dan sebaliknya. Apa Bisa Pointing MX Record menggunakan IP Address? Pointing mx record harus menggunakan hostname dan tidak bisa menggunakan ip address, tapi bagaimana caranya jika mx ingin dipointing ke ip tertentu? Caranya tentu saja harus membuat hostname dengan cara membuat record dns misalnya record mail dengan type A dan di pointing ke ip tersebut. Selanjutnya hostname yang telah didapatkan di test apakah sudah resolve ke ip yang tepat dan kemudian di setting pada mx recordnya.

           2. REST API

           REST (REpresentational State Transfer) merupakan standar arsitektur komunikasi berbasis web yang sering diterapkan dalam pengembangan layanan berbasis web. Umumnya menggunakan HTTP (Hypertext Transfer Protocol) sebagai protocol untuk komunikasi data. Pada arsitektur REST, REST server menyediakan resources (sumber daya/data) dan REST client mengakses dan menampilkan resource tersebut untuk penggunaan selanjutnya. Setiap resource diidentifikasi oleh URIs (Universal Resource Identifiers) atau global ID. Resource tersebut direpresentasikan dalam bentuk format teks, JSON atau XML.

 

Mari kita praktikan:

1. Buat Script dengan nama getStatusEmail.php dan simpan di directory XAMPP atau apache yg anda gunakan dan Run Apachenya. di script ada commant silahkan Anda pelajari script saya ini. :v

<?php
//Get Request untuk dari JSON rubah dahulu, disini tidak perlu api Key Dll karena takde auth
$request = (arrayjson_decode(file_get_contents(‘php://input’), TRUE);
//Function untuk Check email Domain apakah sudah terdaftar atau disebut dengan Mx Record.
function mxrecordValidate($email, $domain){
    $arr = dns_get_record($domain, DNS_MX);
    if(isset($arr[0]) && $arr[0][‘host’] == $domain && !empty($arr[0][‘target’])){
        return $arr[0][“target”];
    }
}
// Check GET Request sudah benar atau belum
if(isset($request[“resource”])){
    //Kita pecah dalam bentuk Array
    foreach($request[“resource”] as $k=>$item){
        //identifikasi Email
        $email =$request[“resource”][$k][“email”];
        //pecah domain dan email name
        $domain = substr(strrchr($email“@”),1);
        //proses apakah email Valid atau Invalid dengan menjalankan fungsi mxrecordValidate.
        if(mxrecordValidate($email$domain)){
            //check dns Record
            $data = dns_get_record($domain, DNS_MX);
            //masukan hasil ke Response
            foreach($data as $key1){
                $response[“resource”][$k][“host”]=$key1[‘host’] ;
                $response[“resource”][$k][“class”]=$key1[‘class’] ;
                $response[“resource”][$k][“ttl”]=$key1[‘ttl’] ;
                $response[“resource”][$k][“type”]=$key1[‘type’] ;
                $response[“resource”][$k][“pri”]=$key1[‘pri’] ;
                $response[“resource”][$k][“target”]=$key1[‘target’] ;
                $response[“resource”][$k][“target”]=gethostbyname($key1[‘target’]) ;
            }
            //Status untuk Valid
            $response[“resource”][$k][“email”] = $request[“resource”][$k][“email”];
            $response[“resource”][$k][“status”] = ‘Valid Email’;
        } else {
            //Status untuk Invalid
            $response[“resource”][$k][“email”] = $request[“resource”][$k][“email”];
            $response[“resource”][$k][“status”] = ‘Invalid Email’;
        }
    }
else {
    //Berikan Error untuk orang yang input sembarangan, dengan status 500 Internal Server 
Error.
    header(‘HTTP/1.1 500 Internal Server Error’);
    //Response untuk Error.
    $response[“message”] = “Error fix your Brain.”;
}

 

header(‘Content-Type: application/json’);
$json_string = json_encode($response, JSON_PRETTY_PRINT);
die($json_string);
?>

2.   Testing Setelah itu silakan menggunakan POSTMAN atau sebagai REST Client Lain yang familiar bagi Anda.

  • Pilih Method POST, input path http://localhost/Email%20Checker/getStatusEmail.php . Pakai header Content-Type => application/json.

  • Masukan Body Request atau email yang akan kita cek, jangan lupa pakai Body Request JSON.
  • Berikut Respon atau hasil dari Email Checker.

Untuk Code silakan clone Git Repository: https://gitlab.com/Sendok/php-native-rest-api-email-checker.git

NOTE: untuk Real Email Checker ini kemungkinan berhasil tidaklah Persen. Dikarenakan ini hanya akan check email Checker, untuk kemungkinan 100 Persennya masih dalam riset (selama ini masih harus PING domain dan harus ada allow dari host, apabila tidak ada allow maka akan failed berarti masih belum 100%).  Mungkin untuk Next Artikel bisa coba untuk PING Email menggunakan PHP.

Wasalamualaikum..

CategoriesProgramming

Coding IOS Lebih Cepat Dari Biasanya!

Selamat datang teman – teman, artikel ini merupakan materi sharing dari event KMM Webinar yang dilaksanakan pada tanggal 25 April 2020. Selamat membaca 🙂

Jadi, sesuai dengan judul cara coding iOS agar lebih cepat dari biasanya adalah pastinya dengan sudah menyiapkan kode-kode yang mungkin akan dipakai. Dalam software development kita mengenal Library atau Dependency atau Third Party.

Berikut beberapa library yang bisa membantu kita mempercepat proses develoment iOS:

1. Alamofire

Alamofire ini menyiapkan banyak function yang bisa digunakan untuk mempercepat proses development teman – teman. Diantaranya seperti pada dokumentasi diatas, function yang ditawarkan meliputi:

  • URL / JSON Parameter Encoding
  •  Upload File / Data / Stream / MultipartFormData
  •  Download File using Request or Resume Data

Untuk Alamofire yang berfungsi sebagai HTTP Request, secara native Swift sudah memiliki fitur untuk HTTP Request, yaitu URLSession

2. SwiftyJSON

SwiftyJSON digunakan untuk handle JSON result dari method request. Swifty JSON dapat di implement pada variasi library ios seperti Cocoapods, Carthage, dan Swift Package Manager. Seperti pada dokumentasi, function yang bisa digunakan pada SwiftyJSON meliputi Merge JSON, Looping, dan Literal Convertibles.

Untuk SwiftyJSON yang berfungsi sebagai JSON Handling, secara native Swift sudah memiliki fitur serupa yaitu JSONSerialization, yang dapat digunakan sebagai media convert untuk JSON model tujuan.

3. SDWebImage

SDWebImage merupakan library yang dapat digunakan untuk request image secara asyncronous. Penggunaan SDWebImage lebih sering diterapkan pada request image pada link image dari hasil request. Seperti pada Carrousel, Katalog, atau List.

4. MBProgressHUD

MBProgressHUD banyak dipakai untuk menggantikan activity indicator yang sudah ada natively pada Swift. Hal itu dikarenakan MBProgressHUD memiliki banyak varian progress yang interaktif dan deskriptif, akan tetapi masih sesuai dengan Human Interface Guidelines (HIG) Apple.

5. SnapKit

SnapKit merupakan cara ringkas untuk membuat programmatically autolayout pada iOS. Keunggulan yang sangat terlihat adalah keringkasan pada baris kode yang dibutuhkan untuk membuat layout pada satu objek.

Pada Webinar lalu, juga dilakukan live coding untuk pembuatan reusable function untuk generic network request, silakan di cek pada git yang ada dibawah ini

Link Demo Project : https://github.com/NandaMocha/LibraryDemo

Tentunya masih banyak library lain yang dapat digunakan untuk mempercepat iOS Development. Seperti FBLoginSDK, Firebase, dan GoogleLoginSDK.

So, because of that, saya invite teman – teman juga untuk berbagi library yang sering dipakai dengan comment pada artikel ini nama library yang dipakai, link dokumentasi, dan tujuan implementasinya. Hopefully, artikel ini akan bermanfaat bagi developer iOS lain.

Terimakasih all 🙂

CategoriesProgramming

Menggunakan OData dengan ASP .Net Core API

OData Atau Open Data Protocol merupakan salah satu best practice untuk membangun atau menggunakan sebuah web api, OData sendiri dapat digunakan secara optional untuk membantu memanipulasi atau mengimplementasikan data secara khusus, kita dapat menggunakan query dalam protokol OData melalui endpointnya,  Odata dalam Asp .Net Sendiri dapat diakses secara optional misalkan data yang ada di web api endpoint default kita tidak akan diubah seluruhnya ke OData, sehingga data tersebut masih dapat diakses secara default. berikut merupakan langkah untuk konfigurasinya

Konfigurasi OData di ASP .Net Core 3.1

Pertama, Tambahkan “Microsoft.AspNetCore.OData” reference di NuGet Packages ke project kita

Buka file Startup.cs pada project kita,

Tambahkan “services.AddOData();” di dalam Method ConfigureServices untuk mengenalkan aplikasi kita tentang OData

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddControllers();
     services.AddOData();
 }

jangan lupa untuk menambahkan reference pada file startup.cs juga

using Microsoft.AspNet.OData.Extensions;

Kemudian kita perlu menambahkan dependency Injection pada method Configure di file yang sama pada UseMvcnya, dan juga tambahkan funsi query -query yang akan kita gunakan untuk memanipulasi data kita nantinya.

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseMvc(routeBuilder =>
            {
                routeBuilder.EnableDependencyInjection();
                routeBuilder.Expand().Select().Filter().Count().OrderBy();
            });
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

Hal yg perlu dilakukan selanjutnya adalah membuat route untuk mengakses ke format ODatanya sendiri sehingga data dalam endpoint kita masih bisa di akses dalam format default.

Buat method baru pada file startup.cs untuk menentukan Entity data model untuk ODatanya

IEdmModel GetEdmModel()
 {
     var odataBuilder = new ODataConventionModelBuilder();
     odataBuilder.EntitySet<BDFEntitlement>("IniPegawai");

return odataBuilder.GetEdmModel();
}

Tambahkan reference pada file startup.cs

using Microsoft.OData.Edm;
using Microsoft.AspNet.OData.Builder;

nb: dalam code diatas “BDFEntitlement” adalah model yang akan menjadi format result dari data kita, “IniPegawai” adalah web api controller kita. jadi kita dapat menambahkan Entityset seperlu kita.

Kemudian Kembali ke Method Configure untuk comment fungsi UseEndpointsnya karena kita akan menggunakan route dari ODatanya.

sama seperti alasan diatas, pada UseMvc kita perlu menambahkan

routeBuilder.MapODataServiceRoute("odata", "odata", GetEdmModel());

Kemudian karena kita menggunakan mvc di sini perlu untuk mendisable EndpointRoutingnya di method ConfigureServices pada service “AddController”, Rubah seperti dibawah ini.

services.AddControllers(mvcOptions => mvcOptions.EnableEndpointRouting = false);

Dengan ini konfigurasi di file startup.cs sudah selesai, dan dapat dilanjutkan ke webapi controllernya

langkah terakhir, hanya perlu menambahkan configurasi di setiap atas method controller yang akan kita gunakan dengan bersama OData seperti

// GET: api/IniPegawai
  [HttpGet]
  [EnableQuery()]
  public IEnumerable Get()
  {
      return _context.BDFEntitlement.AsNoTracking().ToList();
  }

Tambah reference pada controller Anda

using Microsoft.AspNet.OData;


Implementasi sederhana menggunakan OData

1. tanpa OData dengan endpoint

https://localhost:44383/api/inipegawai

2. Dengan OData dan mencoba querying pada endpoint nya

https://localhost:44383/odata/inipegawai?$Select=ProgramName,Remark,id&$filter=ProgramName eq 'Program Algostudio A'


Konklusi :

OData bisa berguna untuk membantu kita memanipulasi data sesuai yang kita butuhkan tanpa harus membuat endpoint lain, selain itu banyak query-query OData yang berguna misalkan expand yang memiliki fungsi untuk dapat menggabungkan lebih dari 1 data di endpoint berbeda dan banyak lainnya. mudahnya memanipulasi di data dari resultnya ini yang menurut Saya menjadikan Entity Framework yang menggunakan OData lebih fleksibel dari Entity Framework yang tidak menggunakan OData, untuk pembahasan lebih perbandingannya mungkin akan ada di artikel selanjutnya.

Terima kasih & Semoga artikel ini bermanfaat.

CategoriesProgramming

Instalasi Jupyter Notebook Di Linux Tanpa User Root

Jika Anda sering menggunakan Google Colab, maka pasti sudah terbiasa menggunakan Jupyter Notebook. Jupyter Notebook adalah aplikasi web open source yang memungkinkan kita untuk membuat dan berbagi dokumen yang berisi kode program, text, visualisasi, dan komponen dokumen lainnya. Yang paling menarik adalah, kita bisa menuliskan kode program dan menjalankannya dalam dokumen yang sama.

Dalam tulisan ini, saya akan menunjukkan cara instalasi Jupyter Notebook dengan menggunakan Anaconda tanpa user root. Tujuannya nanti adalah kita bisa menggunakan Jupyter Notebook yang dapat digunakan untuk menjalankan program Python.

Instalasi Anaconda tanpa user root

Langkah pertama andalah melakukan instalasi Anaconda. Anda dapat melakukannya tanpa user root seperti yang sudah saya jelaskan pada artikel sebelumnya.

Membuat conda environments baru

Jalankan perintah berikut untuk membuat conda environments baru dengan nama jupyter.

$ conda create --name jupyter

Anda aka diminta melakukan konfirmasi proses instalasi.

Proceed ([y]/n)?

Tekan y lalu tekan ENTER untuk melakukan konfirmasi.

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate jupyter
#
# To deactivate an active environment, use
#
#     $ conda deactivate

conda environments baru dengan nama jupyter telah berhasil dibuat. Jalankan perintah berikut untuk mengaktifkannya.

$ conda activate jupyter

Prompt dari command line anda akan berubah. Kurang lebih seperti ini

(jupyter) saya@algostudio:~$

Instalasi Jupyter Notebook

Jalankan perintah berikut ini di dalam conda environments yang telah dibuat sebelumnya.

$ conda install -c conda-forge jupyterlab

Anda aka diminta melakukan konfirmasi proses instalasi.

Proceed ([y]/n)?

Tekan y lalu tekan ENTER untuk melakukan konfirmasi.

Menjalankan Jupyter Notebook

Bila komputer Anda menggunakan GUI

Jalankan Jupyter Notebook dengan perintah

$ jupyter notebook

Tab baru akan terbuka di browser anda dengan alamat http://localhost:8888/tree dan root directory yang terbuka akan sama dengan directory tempat Anda menjalankan perintah jupyter notebook. Berikut contoh tampilan Jupyter Notebook pada browser.

Gambar 1. Contoh tampilan Jupyter Notebook

Selesai, Jupyter Notebook sudah dapat digunakan di komputer Anda. Bila ingin mematikan Jupyter Notebook, kembalilah ke command line tempat anda menjalankan perintah jupyter notebook lalu tekan Ctrl+C. Sebuah pesan konfirmasi akan muncul.

The Jupyter Notebook is running at:
http://localhost:8888/?token=a09e55951acd598fa3428da676d1fbe5678a1712506ca673
 or http://127.0.0.1:8888/?token=a09e55951acd598fa3428da676d1fbe5678a1712506ca673
Shutdown this notebook server (y/[n])?

Tekan y lalu tekan ENTER untuk melakukan konfirmasi.

Bila komputer Anda menggunakan CLI

Bila komputer anda hanya menggunakan CLI, maka Jupyter Notebook harus dibuka menggunakan komputer lain yang memiliki browser berbasis GUI. Berikut adalah langkah-langkah untuk dapat mengakses Jupyter Notebook melalui browser komputer lain

Konfigurasi Jupyter Notebook

Jalankan perintah berikut untuk melakukan generate file konfigurasi

$ jupyter notebook --generate-config

Di layar akan muncul lokasi file konfigurasi yang telah dibuat.

Writing default config to: /home/saya/.jupyter/jupyter_notebook_config.py

Bukalah file tersebut dengan text editor, lalu modifikasi baris

#c.NotebookApp.ip = 'localhost'

menjadi

c.NotebookApp.ip = '*'

lalu simpan perubahan tersebut.

Menjalankan Jupyter Notebook tanpa browser

Jalankan Jupyter Notebook dengan perintah

$ jupyter notebook --no-browser

Anda harus mengakses URL dan token yang muncul di layar CLI anda setelah menjalankan perintah perintah jupyter notebook. Contoh pesan yang muncul di layar adalah

To access the notebook, open this file in a browser:
  file:///home/dataq/.local/share/jupyter/runtime/nbserver-12801-open.html
Or copy and paste one of these URLs:
  http://thinkpad:8888/?token=c7bda8412d7e21ad9c7510a563616efb9ffcf8333da79f2c
or http://127.0.0.1:8888/?token=c7bda8412d7e21ad9c7510a563616efb9ffcf8333da79f2c

Bila IP komputer Anda dalah 192.168.56.101, maka anda dapat mengakses alamat http://192.168.56.101:8888/?token=c7bda8412d7e21ad9c7510a563616efb9ffcf8333da79f2c dari komputer lain.

Bila Anda tidak dapat membuka alamat tersebut, maka kemungkinan akses anda ditolak oleh firewall. Mintalah kepada system administrator untuk membuka port 8888 tersebut.

Menambahkan Package Baru

Ada beberapa cara menambahkan package ke dalam Jupyter Notebook Anda. Cara yang saya pilih adalah dengan menggunakan perintah conda install.

Berikut ada contoh langkah menambah package tensorflow ke dalam Jupyter Notebook yang berada di conda environments jupyter yang kita buat sebelumnya.

Bila Jupyter Notebook masih berjalan, tutup dengan menekan Crtl+C. Kemudian install tensorflow dengan perintah

$ conda install -c conda-forge tensorflow

Daftar conda package yang akan ditambahkan akan ditampilkan.

...

tensorflow         pkgs/main/linux-64::tensorflow-2.1.0-mkl_py37h80a91df_0

...

Proceed ([y]/n)?

Ketik y dan ENTER untuk melanjutkan proses instalasi. Setelah selesai, jalankan lagi Jupyter Notebook dengan perintah

$ jupyter notebook

Atau

# jupyter notebook --no-browser

Selamat mencoba mengunakan Jupyter Notebook di komputer Anda.

CategoriesProgramming

Realtime Chat dengan Html, Javascript dan Socket.io

Realtime Chat atau Realtime Data sering disebut dalam dunia programing adalah suatu hal akan sering digunakan dan sangat diperlukan. Dalam kesempatan ini kita akan membahas dan langsung mem praktik kan Realtime Data dengan Chat App.

Senjata yang akan kita gunakan adalah:

1. HTML

     Sebuah bahasa markah yang digunakan untuk membuat sebuah halaman web. Platform umum yang sering digunakan sehingga akan mudah untuk di praktik kan.

2. Javascript

     Javascript adalah bahasa pemrograman tingkat tinggi dan dinamis. JavaScript biasanya digunakan untuk olah data secara Client ke server namun juga bisa sebagai server ke client. Disini Javascript akan berfungsi GET POST data dari client atau HTML.

3. Socket.io

Apa itu Socket.Io?
Socket.io ada suatu library dari Node.JS yang berfungsi untuk menjembatani realtime data, Namun jangan salah socket.io tidak hanya bisa digunakan di Node.js. Socket.io bisa digunakan di multiplatform dan yang Paling penting Gratis tanpa Batasan jumlah / Unlimited.

Silahkan Berkenalan dengan Socket.io Disini : https://socket.io/

Ayo kita praktikan secara langsung:

1. Buat file index.html.

2. Initialisasi dahulu package.json di terminal.

   $npm init

3. Install socket.io dalam depedencies

$ npm i socket.io

4. install nodemon dalam dependencies, nodemon berfungsi untuk menjalankan Server socket.io.

$npm i --save-dev nodemon

5. Set devStart di package.json untuk menjalankan server nodemon.

"devStart": "nodemon server.js"
{
  “name”“socket.io”,
  “version”“1.0.0”,
  “description”“”,
  “main”“index.js”,
  “scripts”: {
    “devStart”“nodemon server.js”
  },
  “author”“Dhendik”,
  “license”“ISC”,
  “dependencies”: {
    “socket.io”“^2.3.0”
  },
  “devDependencies”: {
    “nodemon”“^2.0.3”
  }
}

 

6. Coding script di Index.html.

<!DOCTYPE html>
<html lang=“en”>
<head>
  <meta charset=“UTF-8”>
  <meta name=“viewport” content=“width=device-width, initial-scale=1.0”>
  <meta http-equiv=“X-UA-Compatible” content=“ie=edge”>
  <title>Realtime Chat</title>
  <script defer src=“http://localhost:3000/socket.io/socket.io.js”></script>
  <script defer src=“client.js”></script>
  <style>
    body {
      padding0;
      margin0;
      displayflex;
      justify-contentcenter;
    }
    #message-container {
      width80%;
      max-width1200px;
    }
    #message-container div {
      background-color#CCC;
      padding5px;
    }
    #message-container div:nth-child(2n) {
      background-color#FFF;
    }
    #send-container {
      positionfixed;
      padding-bottom30px;
      bottom0;
      background-colorwhite;
      max-width1200px;
      width80%;
      displayflex;
    }
    #message-input {
      flex-grow1;
    }
  </style>
</head>
<body>
  <div id=“message-container”></div>
  <form id=“send-container”>
    <input type=“text” id=“message-input”>
    <button type=“submit” id=“send-button”>Send</button>
  </form>
</body>
</html>

 

7. Buat Server dahulu server.js untuk initialisasi socket.io.

const io = require(‘socket.io’)(3000)
const users = {}
// Register User yang baru Masuk ke server dan melakukan Join
io.on(‘connection’socket => {
  socket.on(‘new-user’name => {
    users[socket.id] = name
    socket.broadcast.emit(‘user-connected’name)
  })
  socket.on(‘send-chat-message’message => {
    socket.broadcast.emit(‘chat-message’,
message: messagename: users[socket.id] })
  })
  socket.on(‘disconnect’, () => {
    socket.broadcast.emit(‘user-disconnected’users[socket.id])
    delete users[socket.id]
  })
})
 

 

8. Buat client dahulu client.js disini menggunakan Javascript untuk GET POST data di HTML.

const socket = io(‘http://localhost:3000’)
const messageContainer = document.getElementById(‘message-container’)
const messageForm = document.getElementById(‘send-container’)
const messageInput = document.getElementById(‘message-input’)
//Client script untuk register User Baru
const name = prompt(‘What is your name?’)
appendMessage(‘You joined’)
socket.emit(‘new-user’name)
//Chat message client / User
socket.on(‘chat-message’data => {
  appendMessage(`${data.name}${data.message}`)
})
//Chat message pertanda user baru join
socket.on(‘user-connected’name => {
  appendMessage(`${name} connected`)
})
//Chat Message pertanda User disconnected
socket.on(‘user-disconnected’name => {
  appendMessage(`${name} disconnected`)
})
//Event post untuk Submit Message
messageForm.addEventListener(‘submit’e => {
  e.preventDefault()
  const message = messageInput.value
  appendMessage(`You: ${message}`)
  socket.emit(‘send-chat-message’message)
  messageInput.value = 
})
//Event get misal ada message Baru dari User Lain 
function appendMessage(message) {
  const messageElement = document.createElement(‘div’)
  messageElement.innerText = message
  messageContainer.append(messageElement)
}

 

9. Jalankan Server socket.io

$npm run devStart

10. Berikut Hasilnya.  Gambar dibawah menunjukan simulasi chat dari 2 User yang berbeda dan bisa Realtime.

Gmbar ini menunjukan simulasi chat dari 2 User yang berbeda

Jika ingin mencoba sendiri Anda bisa Clone Git dan ikuti arahannya: https://gitlab.com/Sendok/realtimechat.git

Sekian artikel yg bisa dibuat semoga bermanfaat.

Wassalamualaikum.

CategoriesProgramming

Instalasi Anaconda Di Linux Tanpa User Root

Anaconda telah menjadi platform Python standar dalam bidang Data Science. Anaconda menyediakan berbagai packages yang berkaitan dengan Data Science seperti numpy, ternsorflow, matplotlib, dll. Saya pribadi lebih menyukai menggunakan Anaconda daripada package manager Python lainnya ketika membuat program yang berkaitan dengan Data Science.

Dalam tulisan ini saya akan memandu Anda dalam melakukan instalasi Anaconda dalam sistem Operasi Linux tanpa memerlukan hak akses user root. Dalam tulisan ini saya akan menggunakan Ubuntu Linux 18.04, namun secara umum cara instalasi ini akan sama di distribusi Linux lainnya.

Tulisan ini saya buat berdasarkan panduan di dokumentasi Anaconda dengan beberapa penyesuaian.

Unduh instalasi Anaconda

Langkah pertama adalah mengunduh instalasi Anaconda Python 3.7 versi 64 Bit (x86) pada alamat berikut https://www.anaconda.com/distribution/#linux, lalu simpan di directory home anda, misal /home/saya/anaconda.

Anda bisa mengunduhnya menggunakan perintah wget, misalnya

$ mkdir /home/saya/anaconda
$ cd /home/saya/anaconda
$ wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh

Pada contoh diatas, versi Anaconda yang saya unduh adalah 2020.02

Proses instalasi Anaconda

Jalankan perintah file instalasi tersebut. Berikut adalah contoh peirntah yang dapat anda gunakan untuk menjalankan file instalasi Anaconda versi 2020.02.

$ bash /home/saya/anaconda/Anaconda3-2020.02-Linux-x86_64.sh

Berikut ini adalah contoh tampilan awal proses instalasi. Anda akan diminta membaca license.

Welcome to Anaconda3 2020.02

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>

Tekan ENTER

===================================
End User License Agreement - Anaconda Individual Edition
===================================

Copyright 2015-2020, Anaconda, Inc.

All rights reserved under the 3-clause BSD License:

This End User License Agreement (the "Agreement") is a legal agreement between y
ou and Anaconda, Inc. ("Anaconda") and governs your use of Anaconda Individual E
dition (which was formerly known as Anaconda Distribution).

Subject to the terms of this Agreement, Anaconda hereby grants you a non-exclusi
ve, non-transferable license to:

  * Install and use the Anaconda Individual Edition (which was formerly known as
 Anaconda Distribution),
  * Modify and create derivative works of sample source code delivered in Anacon
da Individual Edition; and
  * Redistribute code files in source (if provided to you by Anaconda as source)
 and binary forms, with or without modification subject to the requirements set 
forth below.

--More--

Tekan Q.

Do you accept the license terms? [yes|no]
[no] >>>

Ketik yes lalu tekan ENTER.

Anaconda3 will now be installed into this location:
/home/saya/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/saya/anaconda3] >>>

Proses instalasi akan dilakukan ke dalam directory /home/saya/anaconda3. Tekan ENTER bila menyetujui lokasi instalasi.

. . .
Preparing transaction: done
Executing transaction: done
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> 

Ketik yes lalu ENTER untuk menjalankan proses conda init secara otomatis.

no change     /home/saya/anaconda3/condabin/conda
no change     /home/saya/anaconda3/bin/conda
no change     /home/saya/anaconda3/bin/conda-env
no change     /home/saya/anaconda3/bin/activate
no change     /home/saya/anaconda3/bin/deactivate
no change     /home/saya/anaconda3/etc/profile.d/conda.sh
no change     /home/saya/anaconda3/etc/fish/conf.d/conda.fish
no change     /home/saya/anaconda3/shell/condabin/Conda.psm1
no change     /home/saya/anaconda3/shell/condabin/conda-hook.ps1
no change     /home/saya/anaconda3/lib/python3.7/site-packages/xontrib/conda.xsh
no change     /home/saya/anaconda3/etc/profile.d/conda.csh
modified      /home/saya/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

If you'd prefer that conda's base environment not be activated on startup, 
   set the auto_activate_base parameter to false: 

conda config --set auto_activate_base false

Thank you for installing Anaconda3!

=================================================================

Anaconda and JetBrains are working together to bring you Anaconda-powered
environments tightly integrated in the PyCharm IDE.

PyCharm for Anaconda is available at:
https://www.anaconda.com/pycharm

Proses instalasi selesai. Silahkan tutup dan buka kembali shell atau terminal yang Anda gunakan untuk melihat hasil instalasi. Berikut adalah contoh tampilan shell saya ketika saya buka kembali

(base) saya@algostudio:~$ 

(base) menandakan bahwa saat ini anda sedang menggunakan conda environments bernama base.

Membuat conda environments baru

Saya sangat menyarankan untuk membuat conda environments baru untuk program Data Science yang anda gunakan. Tujuannya adalah agar memudahkan dalam mengelola package yang kita gunakan dalam program tersebut. Karena terkadang kita memerlukan versi package yang spesifik untuk tiap program.

Berikut adalah contoh perintah untuk membuat conda environments baru bernama datascience.

$ conda create --name datascience

Berikut tampilan awal proses pembuatan conda environments.

Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/saya/anaconda3/envs/datascience

Proceed ([y]/n)?

Tekan y untuk menyetujui pembuatan conda environment baru.

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate datascience
#
# To deactivate an active environment, use
#
#     $ conda deactivate

conda environments baru bernama datascience telah selesai dibuat. Jalankan perintah berikut ini untuk mengaktifkan conda environments tersebut.

$ conda activate datascience

Kini tampilan shell anda akan berubah sperti ini.

(datascience) saya@algostudio:~$

Silahkan membaca dokumentasi Anaconda ini untuk penjelasan lebih lanjut.

Instalasi conda package

Anda bisa mencari conda package yang anda perlukan di https://anaconda.org/anaconda/repo. Misalnya, tensorflow dapat anda temukan di https://anaconda.org/conda-forge/tensorflow.

Untuk melakukan instalasi tensorflow Anda cukup mengaktifkan conda environments tempat tensorflow tersebut akan Anda install, misalnya

$ conda activate datascience

Kemudian jalankan perintah

$ conda install -c conda-forge tensorflow

Daftar conda package yang akan ditambahkan akan ditampilkan.

...

tensorflow         pkgs/main/linux-64::tensorflow-2.1.0-mkl_py37h80a91df_0

...

Proceed ([y]/n)?

Ketik y dan ENTER untuk melanjutkan proses instalasi. Setelah selesai, tensorflow telah siap digunakan.

Menghapus conda environments

Untuk menghapus conda environments yang sudah tidak digunakan, misalnya datascience yang kita buat sebelumnya, kembalilah ke conda environments base (atau conda environments lain selain yang anda hapus) dengan perintah:

$ conda activate base

Lalu hapus conda environments dengan perintah:

$ conda remove --name datascience --all

Anda akan diminta melakukan konfirmasi penghapusanconda environments.

Proceed ([y]/n)?

Ketik y dan ENTER untuk melanjutkan proses penghapusan.

Preparing transaction: done
Verifying transaction: done
Executing transaction: done

Proses penghapusan conda environment selesai.

Silahkan membaca dokumentasi Anaconda ini untuk penjelasan lebih lanjut.


CategoriesProgramming

Menambah IdentityUser Property di Identity ASP.Net Core

Identity pada ASP.Net Core ada untuk memudahkan kita menambahkan user dan mengatur user management pada website. Bahkan Identity sudah bisa menghandle  TwoFactorAuthentication, ExternalLogins dll. Secara default, identity akan membuat user dengan bentuk model seperti berikut.

Bisa kita lihat IdentityUser hanya terdiri dari beberapa property dan tidak bisa kita ubah. Lalu bagaimana jika kita butuh untuk menambah property?

Misalnya kita akan menambah property “Address” pada user, berikut langkahnya

Buat Model Baru

Mari kita buat Model baru yang extend pada IdentityUser

using Microsoft.AspNetCore.Identity;
namespace CustomIdentityUser.Models
{
    public class ApplicationUser: IdentityUser
    {
        public string Address { get; set; }
    }
}

Update Database Context

Ubah extend DatabaseContext menjadi “IdentityDbContext<ApplicationUser>”. Sehingga menjadi seperti ini

namespace CustomIdentityUser.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions options)
            : base(options)
        {
        }
    }
}

Update Startup

Ubah configurasi Identity dari IdentityUser

services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores();

Menjadi ApplicationUser

services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores();

Update Views/Shared/_LoginPartial.cshtml

Ubah kode berikut

@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

Menjadi

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

Add Default Identity Pages

  1. Klik kanan pada project
  2. Pilih Add > New Scaffolded Item
  3. Pilih Identity dan tekan Add
  4. Kamu bisa pilih override all files, atau hanya pilih beberapa yang kamu butuhkan. Misal saat ini kita pilih Account/Register
  5. Pilih database context yang sudah tersedia

Langkah ini akan membuat page register secara otomatis.

Register.cshtml.cs

Tambahkan property Address pada InputModel

public string Address { get; set; }

Tambahkan Address pada ApplicationUser di OnPostAsync

var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email, Address = Input.Address };

Register.cshtml

Tambahkan input untuk address pada form

<div class="form-group">
    <label asp-for="Input.Address"></label>
    <input asp-for="Input.Address" class="form-control" />
    <span asp-validation-for="Input.Address" class="text-danger"></span>
</div>

Add Migration dan Update Database

Tambahkan migrasi dengan command berikut pada Package Manager Console

add-migration AddCustomUser

Lalu update database dengan command

update-database

Jalankan website dan coba lakukan register

Dan saat kita buka di database, bisa dilihat sudah muncul Addres pada table AspNetUsers