Sunday, March 19, 2017

Running program sebagai windows service - NSSM

Pada kesempatan ini saya akan menulis tentang nssm dan bagaimana ini berguna bagi developer yang ingin menjalankan program buatan sendiri di windows sebagai service. Awalnya saya ingin menjalankan program java di windows, namun cara yang digunakan masih dengan menjalankan diatas terminal. Menurut saya membuat program saya sebagai service di windows akan sangat mudah untuk di manage, seperti start/stop/restart dan startup saat boot. Setelah mencari beberapa cara dan tool, akhirnya saya menemukan software nssm ini dan menurut saya sangat mudah digunakan.

Baiklah, apa itu nssm?
NSSM adalah singkatan dari Non-Sucking Service Manager yang berfungsi untuk service helper yang tidak ribet dimana berfungsi menjalankan program sebagai service.

Kenapa kita menggunakan nssm dibanding service helper lain?
- Software ini gratis :)
- Butuh service helper yang tidak ribet penggunaannya.

Pada skenario ini saya menjalankan program java yang open port 8080 dengan fungsi ping.
Baiklah kita langsung ke praktiknya:
Folder program saya berada pada "C:\Users\Administrator\Desktop\app\demo.jar"

Pertama-tama download dulu softwarenya disini, lalu extract di folder C:/nssm-2.**
Berikutnya pastikan file program anda
Masuk ke folder nssm-2.**/win32 (jika mesin 32bit) atau nssm-2.**/win32 (mesin 64bit). Lalu buka terminal dan jalankan perintah dibawah ini:

C:\nssm-2.24\win64>nssm.exe install nssm-demo -jar "C:\Users\Administrator\Desktop\app\demo.jar"

Pada command diatas maka kata "install" adalah argument untuk menginstall service.
Kata "nssm-demo" adalah nama service yang akan tampil di jendela services windows.

Berikutnya kita akan mengecek service dengan nama "nssm-demo" di jendela services. Buka jendela jendela control panel, lalu search keyword "services" dan jendela services akan terbuka.
Carilah service dengan nama "nssm-demo" dan akan tampil seperti tampilan dibawah:

Pada service nssm-demo untuk dapat melakukan start/stop/restart dapat dilakukan dengan klik kanan->pilih aksi start/stop/restart.

Pada skenario ini saya start service nssm-demo lalu buka browser dan buka url
http://localhost:8080/ping dan menampilkan response 200 (ok).



Untuk setting startup service saat boot dengan klik kanan pada service -> pilih properties -> pada startup type pilih Automatic

Panduan terakhir yaitu menghapus service nssm-demo pada windows service yaitu dengan buka terminal pada direktori nssm, lalu ikuti perintah dibawah ini.


Sumber:
https://nssm.cc/commands

Saturday, March 18, 2017

How to invoke soap service using java

Sebetulnya soap service sudah mulai ditinggalkan, karena dinilai cukup berat dan lebih lambat jika dibandingkan dengan Restfull service. Sudah banyak aplikasi-aplikasi baru yang dikembangkan dengan teknologi Restfull service dengan alasan perlu perombakan dari sisi aplikasi mereka yang mungkin akan mengeluarkan budget yang tidak sedikit tentunya.

Lalu kenapa saya ingin membahas tentang soap bukan rest? Ternyata untuk sekala enterprise, saat ini teknologi soap service masih banyak digunakan, kebanyakan penyedia aplikasi juga belum berani untuk me-migrasi atau upgrade aplikasi mereka secara teknologi yang dikarenakan keterbatasan budget dan kekhawatiran akan munculnya masalah-masalah baru.

Ada banyak cara tentunya untuk invoke soap service dengan java, bisa dengan menulis ulang setiap baris xml seperti yang terdapat di blog ini https://technology.amis.nl/2011/06/29/how-to-call-a-call-a-webservice-directly-from-java-without-webservice-library/

Tapi ternyata dengan menuliskan setiap baris xml di code java, memakan waktu yg cukup lama, belum lagi misalnya service yang akan kita invoke cukup complex. Ternyata ada cara lain yang cukup mudah yaitu dengan meng-import wsdl ke dalam java, sehingga nanti kita tinggal melakukan set dan get pada parameter yang dibutuhkan.

Untuk use case invoke soap service ini saya menggunakan contoh webeservice online yang dapat diakses di url berikut http://www.thomas-bayer.com/axis2/services/BLZService

Nah sebelum kita mulai untuk coding invoke soap service dengan java, pastikan tools yang kalian gunakan support untuk melakukan generate webservice client. Saya sendiri menggunakan Eclipse Java EE IDE for Web Developers Version: Neon.1 Release (4.6.1)

Berikut langkah demi langkah implementasinya
  1. Akses http://www.thomas-bayer.com/axis2/services/BLZService dari browser kemudian save kedalam format wsdl.
  2. Simpan wsdl tersebut kedalam folder project java
  3. Klik kanan pada wsdl kemudian pilih web service  --> generate client
  4. Set ke dalam Develop Client mode, kemudian Finish
  5. Jika berhasil maka akan terbentuk 1 package dan beberapa class java yang digenerate otomatis
  6. Buat 1 class java untuk invoke class java hasil generate sebelumnya.
Jika sudah pada tahap tersebut cukup copy and paste code dibawah ini, kemudian execute sehingga kita akan mendapatkan response dari webservice tersebut.


package test;

import com.thomas_bayer.blz.BLZService;
import com.thomas_bayer.blz.BLZServiceLocator;
import com.thomas_bayer.blz.BLZServicePortType;
import com.thomas_bayer.blz.BLZServicePortTypeProxy;
import com.thomas_bayer.blz.BLZServiceSOAP11BindingStub;
import com.thomas_bayer.blz.DetailsType;

public class BLZServiceService {
 public String getBank(String bankCode) throws Exception {
  
 try {
  BLZService service = new BLZServiceLocator();
  BLZServicePortType port = service.getBLZServiceSOAP11port_http();
  
  BLZServiceSOAP11BindingStub stub = (BLZServiceSOAP11BindingStub) port;
  stub._setProperty(stub.ENDPOINT_ADDRESS_PROPERTY, 
    "http://www.thomas-bayer.com/axis2/services/BLZService");
  
  DetailsType response = new DetailsType();
  response.setBezeichnung(bankCode);
  
  response = port.getBank(bankCode);
  System.out.println(response.getBezeichnung());
  System.out.println(response.getBic());
  System.out.println(response.getClass());
  System.out.println(response.getOrt());
  System.out.println(response.getPlz());
  
  
 } catch (Exception e) {
  // TODO: handle exception
 }
  
 return "OK";
 }
 public static void main(String[] args) throws Exception {
  String bankCode = "54030011";
  BLZServiceService a = new BLZServiceService();
  a.getBank(bankCode);
 
 }
}


Berikut hasil dari hasil execute code tersebut


Sekian guys, semoga dapat diimplementasikan di service-service lain, mungkin tidak akan selalu sama dengan contoh ini, tapi semoga bisa menjadi referensi.

Salam Coding :D

Mengenal Teknologi Containerization dengan Docker

Pada tulisan ini, Nostra akan sharing tentang salah satu teknologi yang sedang hype, yaitu Containerization. Tulisan ini bukan cuma untuk kalian para DevOps saja, tetapi juga berguna untuk para Application Developer. Mengapa demikian? simak tulisan ini sampai akhir.

Kalau kita bicara tentang Containerization, tentu kita perlu tau terlebih dahulu apa itu Containerization dan apa pilihan selain hal tersebut? Berangkat dari pertanyaan itu, kami akan membahas sekilas tentang Software Architecture. Setiap pengembangan aplikasi ataupun sistem pasti melewati tahap design, dimana pada fase tersebut akan dilakukan berbagai rancangan-rancangan mengenai apa yang akan dibuat. Rancangan pada fase tersebut tidak terbatas pada rancangan UI/UX saja, tetapi juga rancangan arsitektur dari sistem/aplikasi tersebut. Salah satu software architecture adalah microservices, well pembahasan tentang software architecture mungkin akan kami sajikan pada lain kesempatan.

Apa sih microservices itu?
Secara sederhana arsitektur microservices adalah sebuah rancangan dimana aplikasi tersusun atas banyak fungsi-fungsi (services) yang dapat berdiri sendiri.


Pemisahan fungsi tersebut akan membuat sistem/aplikasi menjadi loose coupled dan highly scalable. Mengapa menjadi highly scalable? Hal tersebut dikarenakan dengan arsitektur microservices kita dapat melalukin scaling sesuai kebutuhan dari masing-masing fungsi/service, sehingga ketika terdapat beberapa service yang butuh scaling maka kita cukup melakukan scaling pada fungsi tersebut saja. Keuntungan lain dari arsitektur seperti ini adalah kita dapat melakukan release aplikasi dengan siklus yang lebih cepat, seperti melakukan release setiap satu service selesai dikembangkan.

Lalu bagaimana antar-services tersebut dapat berkomunikasi? Well secara sistem mereka akan saling berkomunikasi dengan menggunakan interfaces yang telah disediakan pada setiap services, dimana komunikasi tersebut dilakukan menggunakan protokol yang ringan sehingga dapat berlangsung secara cepat, seperti menggunakan JSON/REST maupun ProtoBuff/gRPC.

Setelah membahas sekilas tentang microservices, mari kita masuk ke dalam pembahasan mengenai containerization itu sendiri. Well dalam mengelola aplikasi tentunya kita membutuhkan server, dimana umumnya pada server tersebut kita akan membangun Virtual Machines (VM) yang menjadi pijakan aplikasi kita untuk dapat berjalan. Beberapa tahun terakhir muncul sebuah pendekatan baru yang menjadi pesaing environment VMs tersebut, yaitu teknologi Containerization. Sebenarnya teknologi ini sudah lama ada, namun baru menjadi hype ketika Docker memperkenalkan produk mereka kepada dunia.

Apa sih Containerization itu?
Containerization itu sendiri adalah pendekatan dimana kita menjalankan multiple instances (containers) pada satu Operating System (OS) yang sama, dimana containers tersebut akan memiliki shared kernel.
Serupa dengan VM, dimana pada satu Host OS kita dapat menjalankan berbagai aplikasi lain yang terisolasi dari Host kita. Perbedaan utama antara virtualization dan containerization adalah pada virtualization kita menyalakan OS di dalam OS, sehingga secara resource dan performance akan lebih berat dibandingkan dengan containerization yang melakukan isolasi dari masing-masing aplikasi ke dalam virtual environment dengan shared kernel milik host. Tetapi bukan berarti virtualization adalah teknologi yang buruk, sebenarnya kedua teknologi tersebut memiliki tujuan yang sedikit berbeda. Kalau kita ingin memiliki environment yang sangat terisolasi satu sama lain, maka sebaiknya kita menggunakan VM. Apabila kita tidak perlu isolasi 100% maka containerization bisa menjadi pertimbangan.

Well sekilas sudah kita berbicara tentang arsitektur dan containerization, mari kita mulai membahas Docker. Docker adalah sebuah platform containerization yang sangat populer dan semakin populer. Docker memberikan kemudahan untuk menggunakan ataupun membangun 'isolated' environment untuk aplikasi. Penggunaan containerization dapat membantu kita dalam memahami konsep microservices, dimana satu container hanya untuk satu fungsi saja.



Bagaimana penggunaan Docker itu sendiri?
Docker dapat kita jalankan melalui terminal dengan command yang cukup sederhana, seperti pada gambar berikut.

Menyalakan dan mematikan sebuah container dapat dilakukan dengan command 'start' dan 'stop' melalui command line, demikian juga untuk melihat informasi container apa saja yang sedang berjalan dengan command 'docker ps'. 

Untuk memulai menggunakan Docker pun sesederhana melakukan download dan install docker, kemudian Docker dapat digunakan melalui command line. Serupa dengan virtualization yang membuat VM melalui image dari OS, containerization pada docker pun membutuhkan image untuk dapat menyalakan sebuah containers. Sebagai contoh, untuk dapat menjalankan 'docker start mysql' kita perlu memiliki image dari container tersebut terlebih dahulu, bisa melalui Docker Hub ataupun membuatnya sendiri dengan menggunakan Dockerfile. Setelah memiliki image terkait, kita bisa menjalankannya dengan menggunakan perintah 'docker run', dimana pada momen tersebut kita dapat melakukan berbagai konfigurasi seperti port forwarding, pemberian nama untuk container yang dibuat, bahkan melakukan pengaturan environment variable dari container tersebut.


Demikian hal-hal paling minimum yang perlu diketahui untuk memulai petualangan ke negeri Docker. Masih banyak command pada Docker yang dapat dieksplorasi, seperti 'docker save' dan 'docker load' yang sangat berguna dalam development. Fungsi dua command tersebut sangat sederhana, namun sangat membantu developer dalam satu tim untuk memiliki konfugurasi yang sama. Contoh sederhananya adalah ketika kita mengembangkan aplikasi, kita bisa menggunakan docker container untuk MySQL dan melakukan berbagai konfigurasi terkait database (mungkin mengatur user, privillege, dll). Karena kita menjalankan MySQL Containers, maka dengan menjalankan command 'docker save' kita bisa membagikan image tersebut pada rekan satu tim, sehingga mereka cukup menggunakan 'docker load' dan akan memiliki image dari MySQL containers yang telah dikonfigurasi, sehingga satu tim memiliki environment MySQL yang sama.

Sekian dulu untuk malam ini, semoga bermanfaat.
Selamat melakukan eksplorasi ke negeri Docker!

P.S.
Keuntungan lain dari penggunaan Docker adalah kita dapat menjalankan aplikasi yang mungkin tidak tersedia untuk OS tertentu, seperti tidak tersedianya Oracle Database untuk macOS. Berkat adanya images dari Oracle Database yang berjalan di atas Linux, maka pengguna macOS bisa tersenyum karena hal tersebut berarti macOS dapat menjalankan Oracle Database.






Referensi:
o https://jaxenter.com/containerization-vs-virtualization-docker-introduction-120562.html
o https://www.quora.com/What-is-the-difference-between-Docker-and-Vagrant-When-should-you-use-each-one
o http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-for-creating-an-isolated-environment
o http://www.zdnet.com/article/what-is-docker-and-why-is-it-so-darn-popular/
o https://docs.docker.com
o https://docs.docker.com/engine/reference/run/
o https://docs.docker.com/engine/reference/builder/
o https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

Friday, March 17, 2017

NgMap-Angular Google Maps Directive Part 2

Pada part 1 kita masih menggunakan basic nya ngmap. Bagaimana kalau kita akan menambahkan fungsi add marker ketika klik di map? Bagaimana juga jika ingin menampilkan streetview pada saat berbarengan dengan add marker untuk melihat situasi sekitar marker? Yup kita akan membahas itu pada kesempatan ini. Jika pada part 1 kita hanya bermain dengan html, maka pada part 2 kita akan bermain pada controller juga.

Pertama tama kita ubah dulu konsep hardcode yang ada pada part 1 menjadi sebuah variable yang bisa control dari controller.

 <ng-map zoom="17" scrollwheel="true"   
              zoom-to-include-markers="false" center="{{lat}},{{long}}"  
              on-click="addMarker()" default-style="true">  
         <marker   
          position="[{{lat}},{{long}}]">  
         </marker>  
         <street-view-panorama container="streetview"  
          click-to-go="false"  
          disable-default-u-i="false"  
          disable-double-click-zoom="false"  
          position="[{{lat}},{{long}}]"  
          pov="{heading: {{heading}}, pitch: {{pitch}}}"  
          scrollwheel="false"  
          enable-close-button="true"  
          visible="true">  
         </street-view-panorama>  
        </ng-map>  
        <div id="streetview"></div>  
 <style>  
  map, #streetview {display:inline-block !important;width:45%;height: 400px}  
 </style>  
Jika pada part 1 kita langsung isi center pada ng-map dan position pada street-view-panorama, sekarang kita ubah menjadi lat untuk lattitude dan long untuk longitude. Serta pada ng-map kita tambahkan function on-click untuk merubah posisi marker. Oke, untuk part html sudah cukup, sekarang kita akan bermain di Controllernya.


 angular.module('testingggApp').  
 controller('MainCtrl', [  
   '$scope', 'NgMap',  
   mainCtrl  
 ]);  
 function mainCtrl($scope, NgMap) {  
   $scope.heading = 90;  
   $scope.pitch = 0;  
   $scope.lat = -6.175392999999987;  
   $scope.long = 106.82702100000006;  
   $scope.addMarker = function(event) {  
     var ll = event.latLng;  
     $scope.lat = ll.lat();  
     $scope.long = ll.lng();  
   };  
 };  
Pada awal controller, variable lat & long terlebih dahulu kita define variable nya. Sebagai contoh kita tetap menggunakan monas sebagai base lat & long nya. Untuk merubah posisi marker kita sudah menambahkan method addMarker. Cara kerjanya adalah ketika kita klik di random posisi maps, maka kita akan memanggil method addMarker yang ketika kita klik akan mengisi parameter event untuk mengambil lat dan long. Kemudian jika sudah dapat posisi lat long yang baru, maka kita akan assign value itu ke variable lat & long yang sudah ada. Resultnya akan seperti ini.


Oke sekarang posisi marker sudah berpindah, namun bagaimana untuk membuat streetview mengikuti posisi marker ?
Untuk merubah posisi streetview, kita harus mengambil instance map terlebih dahulu, kemudian cukup mengikuti aturan Google Maps API untuk mengeset streetview panorama nya. Jadi dengan menggunakan ngmap kita tidak perlu repot repot menghafal syntax orang yang membuat, kita cukup menggunakan panduan global yang sudah disediakan Google.
Untuk mengambil instance map kita bisa pergunakan line berikut.
  NgMap.getMap().then(function(map) {  
       $scope.map = map;  
     });  
Setelah dapat, kita bisa pergunakan variable map untuk mengeset streetview.

 NgMap.getMap().then(function(map) {  
       $scope.map = map;  
       var fenway = {  
         lat: ll.lat(),  
         lng: ll.lng()  
       };  
       var panorama = new google.maps.StreetViewPanorama(  
         document.getElementById('streetview'), {  
           position: fenway,  
           pov: {  
             heading: 34,  
             pitch: 10  
           }  
         });  
       map.setStreetView(panorama);  
     });  
Hasilnya akan menjadi seperti ini.
 angular.module('testingggApp').  
 controller('MainCtrl', [  
   '$scope', 'NgMap',  
   mainCtrl  
 ]);  
 function mainCtrl($scope, NgMap) {  
   $scope.heading = 90;  
   $scope.pitch = 0;  
   $scope.lat = -6.175392999999987;  
   $scope.long = 106.82702100000006;  
   $scope.addMarker = function(event) {  
     var ll = event.latLng;  
     $scope.lat = ll.lat();  
     $scope.long = ll.lng();  
     NgMap.getMap().then(function(map) {  
       $scope.map = map;  
       var fenway = {  
         lat: ll.lat(),  
         lng: ll.lng()  
       };  
       var panorama = new google.maps.StreetViewPanorama(  
         document.getElementById('streetview'), {  
           position: fenway,  
           pov: {  
             heading: 34,  
             pitch: 10  
           }  
         });  
       map.setStreetView(panorama);  
     });  
   };  
 };  

Mudah bukan?
Semangat & Keep Coding guys !
See ya


https://github.com/allenhwkim/angularjs-google-maps
https://ngmap.github.io/

NgMap-Angular Google Maps Directive Part 1

Pada kesempatan ini saya ingin membahas tentang Google Maps Directive. Di salah satu project yang saya tangani, membutuhkan maps sebagai komponen utama. Namun ketika ingin mengimplemen maps secara standart itu membutuhkan banyak coding dan menurut saya tidak efisien jika kita menggunakan angular namun cara penyelesaiian nya menggunakan javascript. Akhirnya saya menemukan module ngMap. 

Module ini merupakan Google Maps Directive yang sudah membundle semua Google Maps v3 api didalamnya dan module ini juga tidak mengharuskan kita coding javascript hanya untuk menampilkan maps. Bukan berarti kita benar-benar tidak coding yah, namun porsi coding nya menjadi sangat minim dan hanya disaat kondisi tertentu saja. Pada kesempatan ini pula saya ingin menjelaskan cara pasang & penggunaan tanpa melakukan coding javascript. Langsung saja kita coba pasang ngMap.

Pertama-tama jika kalian bower users, jalankan command 
 bower install ngmap  
  1. Include ng-map.min.js<script src="/bower_components/ngmap/build/scripts/ng-map.min.js"></script>
  2. Include Google maps:
    <script src="http://maps.google.com/maps/api/js"></script>
  3. Tambahkan ngMap pada angular module
    var myApp = angular.module('myApp', ['ngMap']);
Jika sudah, kalian cukup tambahkan sample html berikut di dalam html mu untuk me-load map yang centernya berada di Monas, Jakarta.
 <map center="[-6.175392999999987, 106.82702100000006]" zoom="18" />  

Bagaimana jika ingin tampilan map nya menggunakan Satelite View? Cukup tambahkan parameter map-type-id="MapTypeId.SATELLITE" di dalam html diatas sehingga menjadi 
 <map center="[-6.175392999999987, 106.82702100000006]" zoom="18"   
 map-type-id="MapTypeId.SATELLITE" >  

Bagaimana jika ingin menambahkan marker?
 <map center="[-6.175392999999987, 106.82702100000006]" zoom="18"   
 map-type-id="MapTypeId.SATELLITE" >  
 <marker position="[-6.175392999999987, 106.82702100000006]" />  

Kalau Streetview?
 <map id="sv" street-view="StreetViewPanorama(document.querySelector('map#sv'),   
 {position:new google.maps.LatLng(-6.175392999999987, 106.82702100000006)})" />  

Terlihat mudah bukan? Bagaimana jika ingin menampilkan maps beserta streetview bersamaan?
 <ng-map zoom="18" center="[-6.175392999999987, 106.82702100000006]"  
   default-style="false"  
   map-type-id="MapTypeId.SATELLITE" tilt="45">  
   <street-view-panorama container="streetview">  
   </street-view-panorama>  
  </ng-map>  
  <div id="streetview"></div>   
 <style>  
  map, #streetview {display:inline-block !important;width:45%;height: 400px}  
 </style>  


Sekian dulu untuk kesempatan ini, next kita akan membahas modifikasi menggunakan ngMap pada kesempatan berikutnya.

https://github.com/allenhwkim/angularjs-google-maps
https://ngmap.github.io/