Showing posts with label derry aditiya. Show all posts
Showing posts with label derry aditiya. Show all posts

Saturday, December 16, 2017

Resolve Conflict di IntelliJ IDEA dengan mudah

Terdapat fitur untuk me-resolve conflict dengan mudah di IntelliJ IDE yang selama ini tidak kita ketahui. Sebagai seorang programmer yang bekerja bersama team, pasti masalah conflict code ini sering kali dijumpai. Dan kita sebagai pengguna IDE IntelliJ tidak mengetahui bahwa selama ini ada fitur yg sudah di sediakan oleh IntelliJ.

Study Case

Terdapat conflict yang bisa dilihat pada saat melakukan pull di sourcetree:

Yang mengalami conflict adalah class GreetingController. Bisa dilihat bentuk code menjadi mengandung "<<<<<<< HEAD" dan sulit untuk di lihat code mana yang hasil orang lain dan mana yang hasil kerja kita.

How To

Pertama-tama install plugin Git Integration pada IntelliJ

Selanjutnya setting pada menu VCS untuk mengaktifkan fitur Git Integration pada project yang sedang dibuka. Masuk ke Enable Version Control Integration...  lalu pilih Git dan klik OK.


Apabila setting diatas sudah benar, maka akan muncul opsi Git jika kita klik kanan di class. Didalam opsi Git kita pilih Resolve Conflicts...

Akan muncul window seperti berikut, dan kita pilih Merge...

Selanjutnya akan muncul window dengan tiga buah kolom code:
- bagian kiri merupakan hasil kerja kita
- bagian tengah merupakan hasil merge yang akan di submit ke git
- bagian kanan merupakan code yang berasal dari server git terakhir
Nah kita sudah bisa melihat dengan jelas blok code yang menjadi conflict karena orang lain menambahkan method di baris yang sama.

Kita tinggal klik tanda "<<" dari bagian kanan untuk memasukan hasil kerjaan orang lain ke bagian tengah/result.

Dan juga tinggal klik tanda ">>" dari bagian kiri untuk memasukan code hasil kerjaan kita, lalu klik Apply

Akhirnya kita bisa melakukan commit hasil merge dan melakukan push ke server git.

Cukup sekian tips kali ini, semoga membantu dalam keseharian koding.
Thanks...



*Artikel ini di dedikasikan untuk salah satu programmer nostra yang penasaran dengan fitur Resolve Conflict IntelliJ ini


Google Cloud Vision API


Google Cloud Vision API merupakan sebuah service dari Google Cloud Platform (GCP) yang bisa memberikan analisis terhadap suatu gambar. API ini dirilis pada 18 Mei 2017 dengan teknologi Machine Learning dan Big Data yang menjadi engine dibelakangnya.  API ini tersedia gratis untuk 1000 hit/bulan, jika melebihi itu akan terkena biaya yang sudah di tentukan oleh google (link).

Fiture yang diberikan oleh API ini adalah sebagai berikut:
Label Detection
Mendeteksi konten apa saja yang terkandung dalam suatu gambar, misal nya seperti terdapat mobil, motor, hewan, dll.

Face Detection
Mendeteksi muka yang terdapat dalam gambar. Diberikan juga analisis mengenai expresi dan mood wajah tersebut.

Explicit Content Detection
Mendeteksi apakah terdapat konten dewasa didalam suatu gambar

Logo Detection
Mendeteksi logo yang terdapat pada gambar, dan mengenalinya secara langsung sepertu logo Toyota, Honda, BMW, HP, dll.

Landmark Detection
Mendeteksi sebuah bangunan landmark yang terdapat di dalam sebuah foto, seperti Monas, Eiffel, dll.

Optical Character Recognition (OCR)
Mendeteksi text yang ada dalam sebuah gambar. Jadi bisa kita gunakan untuk membaca data dari foto scan KTP, SIM, dll.

Image Attributes
Memberikan info mengenai warna dominan dari suatu gambar, crop hint, dll.

Web Detection
Memberikan info mengenai website yang memiliki atau menggunakan gambar yang sama dengan gambar ini.

Cara Kerja

Aplikasi kita akan mengupload atau mengirimkan gambar ke API ini, dan akan mendapatkan response yang dalam bentuk JSON nya seperti berikut:


How To

1. Yang diperlukan sebelum bisa menggunakan API ini adalah memiliki account GCP.

2. Selanjutnya adalah membuat sebuah project di GCP, dan me-enable API ini untuk project tersebut.








3. Aplikasi kita perlu GOOGLE_APPLICATION_CREDENTIALS Key untuk bisa menggunakan API ini. Jadi kita perlu menggenerate nya terlebih dahulu.



Pilih type JSON, dan saat kita klik Create maka browser akan mendownload sebuah file.


4. Setelah mendapatkan key, kita set environment variable.
Untuk MacOS dengan menggunakan:
 export GOOGLE_APPLICATION_CREDENTIALS=/PATH/TO/KEY/FILE

Untuk Windows bisa dengan mensetup Environment Variable, dengan Variable "GOOGLE_APPLICATION_CREDENTIALS" dan Value "C:\\PATH\TO\KEY\FILE"


Demo

Pada demo kali ini kita akan menggunakan java, kita bisa menggunakan Maven atau Gradle untuk menghandle dependensi library nya.
Maven:
 <dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-vision</artifactId>
 <version>1.14.0</version>
</dependency>
Gradle:
 compile 'com.google.cloud:google-cloud-vision:1.14.0'
SBT:
 libraryDependencies += "com.google.cloud" % "google-cloud-vision" % "1.14.0"


Berikut adalah sample source code dari sebuah method yang menggunakan Cloud Vision API yang sudah saya modifikasi untuk menggunakan fiture Label, OCR, dan Face.
Untuk contoh asli nya bisa di dapat dari dokumentasi google (https://cloud.google.com/vision/docs/reference/libraries)
 
public JSONObject test(DataVO dataVO) throws Exception {

    JSONObject jsonObject = new JSONObject();

    // Inisiasi
    try (ImageAnnotatorClient vision = ImageAnnotatorClient.create()) {

        // Memproses image file ke memory
        Path path = Paths.get(dataVO.getFilePath());
        byte[] data = Files.readAllBytes(path);
        ByteString imgBytes = ByteString.copyFrom(data);

        // List feature yang diinginkan
        Feature feat = Feature.newBuilder()
                .setType(Type.LABEL_DETECTION)
                .build();
        Feature feat2 = Feature.newBuilder()
                .setType(Type.FACE_DETECTION)
                .build();
        Feature feat3 = Feature.newBuilder()
                .setType(Type.TEXT_DETECTION)
                .build();
        List<Feature> featureList = new ArrayList<>();
        featureList.add(feat);
        featureList.add(feat2);
        featureList.add(feat3);

        // membuat request yang terdiri dari image dan list feature yang diinginkan
        Image img = Image.newBuilder().setContent(imgBytes).build();
        AnnotateImageRequest request = AnnotateImageRequest.newBuilder()
                .addAllFeatures(featureList)
                .setImage(img)
                .build();


        // Builds the image annotation request
        List<AnnotateImageRequest> requests = new ArrayList<>();
        requests.add(request);


        // Memproses image file
        BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();


        // Mengolah respon dari Vision API
        for (AnnotateImageResponse res : responses) {

            List<String> labelList = new ArrayList<>();
            for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
                Map<Descriptors.FieldDescriptor, Object> labelMap = annotation.getAllFields();
                Iterator it = labelMap.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry pair = (Map.Entry)it.next();
                    if (pair.getKey().toString().equals("google.cloud.vision.v1.EntityAnnotation.description")){
                        labelList.add(pair.getValue().toString());
                    }
                }
            }

            jsonObject.put("Label", labelList);

            TextAnnotation text = res.getFullTextAnnotation();
            jsonObject.put("FullTextAnnotation", text.getText());

            jsonObject.put("FaceAnnotationsCount", res.getFaceAnnotationsCount());
        }
    }

    return jsonObject;
}

image yang akan di gunakan untuk test kali ini adalah gambar berikut:

dan hasil yang kita dapatkan adalah:
 
{
    "FaceAnnotationsCount": 0,
    "Label": [
        "text",
        "cartoon",
        "font",
        "line",
        "human behavior",
        "product",
        "product design",
        "area",
        "communication",
        "conversation"
    ],
    "FullTextAnnotation": "WE ARE\nLOOKING FOR\nBack-End DeviOS Dev\nOracle SOA & Webcenter Dev\nSend your CV to\njobs@nostratech.com\n"
}

Bisa dilihat bahwa text yang terdapat di gambar terdetect dengan baik meskipun ada character \n sebagai penjelasan bahwa di aberganti baris.

Sekian demo Google Cloud Vision API dari saya, silahkan berkreasi dengan fitur-fitur yang di sediakan oleh API ini.



Sunday, September 17, 2017

JMeter dengan Data Dinamis

Pada saat menggunakan JMeter atau melakukan concurrent test ada kebutuhan untuk mensimulasikan data yang berbeda-beda antara pada HTTP Request. JMeter bisa memfasilitasi kebutuhan ini dengan menggunakan CSV Data Set Config. Sesuai dengan namanya configurasi ini hanya bisa membaca file yang berjenis CSV saja.

Kita akan melanjutkan Test Plan dari postingan sebelum nya (Concurrent Test menggunakan JMeter).

CSV Data Set Config

Tambahkan CSV Data Set pada Sampler HTTP Request



Terdapat field-field yang perlu di setting untuk menggunakan sebuah CSV Data Set, diantaranya adalah:
  • Filename adalah path file csv yang akan digunakan.
  • Delimiter (use '\t' for tab) adalah settingan untuk simbol pemisah kolom data. Untuk csv biasanya kita menggunakan koma ',' sebagai pemisah kolom data.
  • Allow quoted data? Kita set False karena pada file csv kita bagian data tidak di quote. 
  • Recycle on EOF Kita set False agar proses berhenti jika row data pada file csv sudah habis, dan tidak melakukan looping ke bagian data pertama lagi. 
  • Stop thread on EOF Kita set True agar apabila jumlah data pada csv lebih banyak dari pada concurrent user yang kita setting pada Thread Group proses JMeter akan berhenti karena sudah mencapai jumlah concurrent user yang sudah kita setting di Thread Group. 
  • Sharing mode set All Thread jika menginginkan csv bisa di baca oleh Thread Group lain. Set Current Thread Group jika menginginkan csv hanya bisa di baca oleh Sampler lain yang berada pada Thread Group yg sama. Set Current Thread jika menginginkan csv hanya bisa di baca oleh Sampler dimana CSV Data Set Config ini berada saja. Direkomendasikan untuk menggunakan Current Thread Group.
Untuk bisa menggunakan data dari file csv yang sudah dipilih perlu dilakukan perubahan pada Body Data di Sampler HTTP Request. Berikut adalah isi file csv yang digunakan:



Pada file csv terdapat 2 header kolom yaitu username dan password. Cara pemasangan data csv ke dalam Body Data adalah seperti berikut ${username} dan ${password}.


Test

Selanjutnya kita bisa menjalankan tes dengan klik button Start pada bagian toolbar. Hasil nya bisa dilihat pada View Result Tree.



Karena kita setting concurrent user pada Thread Group adalah 5 maka pada View Result Tree hanya muncul 5 HTTP Request meskipun kita menyediakan 10 data pada file csv.
Kita cek bagian Request dari masing-masing HTTP Request dan akan terlihat bahwa masing-masing request menggunakan username yang berbeda-beda.

Skenario testing concurrent menggunakan data dinamis atau file csv ini lebih menggambarkan kondisi nyata karena benar-benar mensimulasikan banyak user yang berbeda id atau username mengakses REST API secara bersamaan.

Concurrent Test menggunakan JMeter

Pada kali ini kita akan membahas cara menggunakan JMeter untuk melakukan simulasi concurrent user mengakses sebuah REST API. Pengenalan JMeter sudah di bahas pada postingan berikut: Menggunakan JMeter untuk test service REST.

Thread Group

Pertama kita tambahkan Thread Group terlebih dahulu. Thread Group ini yang nanti bisa kita setting untuk keperluan concurrent test. Apabila sudah di tambahkan ke dalam Test Plan kita bisa melihat terdapat Thread Properties yang berisi Number of Thread (User) dan Ramp-Up Period (in seconds).


Number of Thread (User) merupakan jumlah user yang akan kita simulasikan. Jadi jika kita mau mensimulasikan 100 user maka field ini di isi 100. Pada skenario kali ini akan kita simulasikan 5 user concurrent.

Ramp-Up Period (in seconds) merupakan scope atau range waktu untuk concurent user memulai eksekusi thread group. Jadi misal kita memiliki 5 concurent user dan mengisi Ramp-up dengan 1, maka artinya adalah waktu 1 second akan di bagi 5, jadi setiap concurrent user akan memiliki jeda 0.2 second.
user 1 start pada detik 0
user 2 start pada detik 0.2
user 3 start pada detik 0.4
dan seterusnya...


Bila menginginkan simulasi concurrent user berjalan secara serentak pada detik 0, maka tinggal isi bagian Ramp-Up dengan 0. Ramp-Up 0 second ini akan berefek menambah beban pada PC/Laptop yang merunning JMeter karena akan menggenerate banyak HTTP Request pada waktu yg sama.

Sampler HTTP Request

Selanjutnya kita masukan sebuah Sampler HTTP Request pada Thread Group yg ada.


Pada Sampler HTTP Request ada beberapa yang perlu dilengkapi isinya, diantaranya adalah Server Name or IP, Port Number, Implementation, Protocol, Method, Path, dan Body Data. Request Body untuk API Login kali ini adalah username dan password seperti berikut:


HTTP Header Manager

Jangan lupa tambahkan HTTP Header Manager pada Sampler HTTP Request agar kita bisa menambahkan properties pada header HTTP request. 


Pada skenario kali ini yang di perlukan hanya Content-Type application/json saja.


Listener

Bagian akhir adalah menambahkan Listener View Result pada Thread Group agar kita bisa melihat hasil proses. Listener yang paling biasanya dipakai adalah View Result Tree.


Kita bisa menjalankan concurrent test dengan klik button Start pada bagian toolbar. Hasil nya bisa dilihat pada View Result Tree.


Terdapat 5 buah HTTP Request, kita bisa melihat detail Request dan Response dari masing-masing HTTP Response. Simbol pada HTTP Request berwarna hijau merupakan tanda jika respon yang di dapat adalah bukan HTTP Response error. Apabila response yang di terima adalah 401, 503, dll maka simbol pada HTTP Request akan berwarna merah.

Dengan di lakukan nya Concurrent Test ini kita bisa mengetahui apakah sistem/aplikasi yang kita develop bisa menghandle jumlah concurrent user seberapa banyak dalam satu detik.

Sunday, June 18, 2017

Inline PDF Viewer dengan PDFObject

PDFObject merupakan sebuah utility javascript untuk melakukan embedding file PDF ke dalam sebuah halaman HTML. Untuk informasi dan dokumentasi lebih detail bisa dilihat pada https://pdfobject.com

Inline PDF Viewer sangat membantu untuk memenuhi kebutuhan User Experience (UX) dimana user akan melakukan input pada sebuah form yang datanya dari hasil membaca sebuah document PDF yang berasal dari web tersebut juga.

Kebutuhan UX seperti ini sebenarnya bisa di penuhi dengan beberapa cara:
  1. User mendownload file PDF. Membuka halaman form yang akan diisi pada browser. User akan melakukan Alt+Tab untuk berpindah-pindah antara browser dan aplikasi pembuka/viewer PDF (Adobe Reader, Foxit Reader, dll).
  2. File PDF dibuka pada Tab di browser. User membuka halaman form yang akan diisi pada Tab lain di browser. User akan melakukan berpindah-pindah antara Tab file PDF dan Tab form pada browser.
  3. Adanya fitur preview file PDF pada halaman form yang akan diisi. Jadi user bisa sambil melihat file PDF untuk langsung mencari data yang perlu untuk diisi ke form.

Untuk opsi no 1 dan 2, sudah bisa dilakukan tanpa menambahkan fitur apapun dalam web. Karena function basic dari web sudah bisa memenuhi kebutuhan flow ini. Tetapi user perlu bolak-balik antara 2 aplikasi berbeda (browser - pdf viewer) atau 2 tab yang berbeda pada browser.
Tetapi untuk no 3, kita perlu menambahkan fitur preview file PDF agar file PDF bisa langsung di preview di halaman yang sama dengan form yang akan diisi.

Berikut adalah sample UI nya:

Untuk sample kali ini struktur folder nya cukup simple, seperti berikut. Folder js saya isi dengan javascript dari github PDFObject.

Isi code dari index.html:
 
<h1>PDF Object Demo</h1>

<table>
 <tr>
   <td><label>Nama</label></td>
   <td>
     <input type="text" placeholder="nama">
   </td>
 </tr>
 <tr>
   <td><label>Alamat</label></td>
   <td>
     <input type="text" placeholder="alamat">
   </td>
 </tr>
 <tr>
   <td><label>Usia</label></td>
   <td>
     <input type="number" placeholder="usia">
   </td>
 </tr>
</table>

<div id="example1"></div>

<script src="/js/pdfobject.js"></script>
<script>PDFObject.embed("sample-3pp.pdf", "#example1");</script>



Cara penggunaan PDFObject ini sangat mudah. Apabila kita sudah memasukannya ke dalam project, maka kita tinggal menggunakan nya dengan code ini:
 
<div id="example1"></div>

<script src="/js/pdfobject.js"></script>
<script>PDFObject.embed("sample-3pp.pdf", "#example1");</script>


Terlihat pada code bahwa source file PDF nya adalah sample-3pp.pdf, bagian ini bisa kita pindah ke file controller jika kita menggunakan AngularJS pada project sehingga source file PDF nya bisa dinamis.

Pada sample ini saya menggunakan cara pintas dalam mengimport PDFObject kedalam project secara manual. PDFObject sendiri sudah tersedia pada Bower dan NPM, sehingga dependency management nya terjamin.

PDFObject ini sayang nya sudah tidak compatible dengan Firefox semenjak Firefox versi 52, hal ini di jelaskan oleh PDFObject pada website nya. Dijelaskan juga cara workaround agar PDF inline tetap berjalan di browser Firefox versi 52 ke atas. Workaround ini akan saya bahas pada postingan selanjutnya. :)


Android Fingerprint API

Saat ini sudah banyak smartphone android yang di lengkapi dengan fitur fingerprint scanner. Google sendiri menyediakan API untuk mengakses perangkat fingerprint scanner sejak android 6.0 (Marshmallo) yang di release sejak tahun 2015.

Fingerprint ini merupakan suatu data unik untuk setiap orang di dunia, tetapi kenapa tidak ada yang menggunakannya sebagai suatu metode login pada social media atau e-mail.

How it work

Kita akan bahas mengenai cara kerja dari perangkat fingerprint scanner terlebih dahulu. Seorang lead engineer google pernah membuat sebuah Q&A di Reddit[1] dan memberikan penjelasan,
"Fingerprint features are securely encrypted on the device, and processed in the secure TrustZone protected area of memory. The Android 6.0 fingerprint APIs do not provide any access to the fingerprint material to apps. Fingerprint features never leave the device and are not shared with Google (so for example if you setup a new phone, you need to re-enroll your fingers)."
Dan pihak google berstatement dalam Marshmallow Compatibility Definition Document (CDD)[1], bahwa OEM harus mengimplementasi sebuah hardware-backed keystore, dan melakukan proses validasi fingerprint dalam Trusted Execution Environment (TEE).

Dari beberapa penjelasan tersebut bisa kita simpulkan beberapa point penting, yaitu:
1. API Fingerprint tidak bisa memberikan kita data dari fingerprint yang di scan.
2. Data fingerprint tidak pernah meninggalkan perangkat smartphone.
3. Data fingerprint dan proses pencocokan/validasi dilakukan pada bagian khusus seperti Trusted Execution Environment (TEE).

Dari poin-poin di atas itu memberikan pemahaman bahwa API Fingerprint Android hanya bisa kita gunakan untuk melakukan validasi apakah pengguna nya adalah pemilik smartphone tersebut.

Source Code

Untuk bisa mengakses Fingerprint Authentication kita menggunakan class FingerprintManager. FingerprintManager memerlukan akses ke perangkat fingerprint scanner smartphone, jadi kita perlu manmbahkan permission-nya pada AndroidManifest.xml.

 
<uses-permission android:name="android.permission.USE_FINGERPRINT" />


FingerprintManager memiliki AuthenticationCallback yang bisa kita extend, dan memiliki beberapa method abstract seperti onAuthenticationError, onAuthenticationSucceeded, onAuthenticationFailed dan sebagainya yang bisa di override sesuai action yang diinginkan.


Fingerprint scanner akan mengirimkan data yg baru diinput/scan ke bagian TEE yang selanjutnya akan melakukan proses matching/validasi dengan data fingerprint yang sudah di daftarkan ke perangkat smartphone.
Result yg didapatkan dari hasil matching akan diolah oleh FingerprintManager dan akan mentrigger method abstract onAuthenticationError, onAuthenticationFailed, atau onAuthenticationSucceeded.

Source code lengkap bisa diakses disini (FingerprintDialog).



reference
[1] https://itsecuritything.com/google-nexus-6p-security-teardown/
[2] https://developer.android.com/about/versions/marshmallow/android-6.0.html#fingerprint-authentication

Sunday, March 19, 2017

Java HotSwap via Spring Loaded

Pada postingan sebelum nya saya sempat membahas JRebel, yaitu sebuah tools/plugin untuk hot swap pada aplikasi java. Dan kali ini saya akan membahas tentang Spring Loaded, yang bisa dibilang sejenis dengan JRebel karena berfungsi untuk melakukan hot swap.

Spring-loaded adalah sebuah JVM agent untuk reload perubahan pada class sementara JVM running. Spring-loaded memungkinkan kita untuk melakukan hot swap sehingga membantu kita dalam meningkatkan produktivitas dengan mengurangi waktu redeploy.

Experiment

Environment yang saya gunakan untuk percobaan ini adalah:
  • IntelliJ IDEA sebagai IDE 
  • Springboot REST getting started sebagai sample project
  • Maven untuk compile dan running
Langkah pertama adalah kita perlu menambahkan plugin pada pom.xml

Karena akan dirunning via IntelliJ IDEA maka perlu ditambah running configuration dengan menggunakan menu Run > Edit Configurations

Akan muncul window Run/Debug Configuration, dan kita bisa menambahkan konfigurasi running dengan klik icon + pada kiri atas window dan pilih Maven

Maka akan muncul tampilan seperti berikut:


Kita rename nama konfigurasi dengan nama spring-loaded. Isi bagian Command Line dengan spring-boot:run lalu klik OK

Running project dengan klik icon Run pada bagian kanan atas IntelliJ IDEA.

Setelah aplikasi running, kita coba akses REST nya via browser dengan url http://localhost:8080/greeting

Saat nya kita gunakan fitur dari spring-loaded ini, yaitu dengan melakukan perubahan pada code.
Kita rubah class GreetingController.java menjadi seperti berikut:


Selanjutnya kita akan mereload perubahan ini ke aplikasi yang sedang berjalan tanpa harus melakukan restart aplikasi. Caranya dengan meng-compile ulang code sehingga menggenerate file-file .class sesuai dengan code terbaru, yaitu dengan menggunakan menu Build > Make Project

Setelah proses Make Project selesai kita bisa mengecek REST yang tadi via browser. Respon REST yang didapat akan berbeda dengan yang awal, karena kita sudah melakukan perubahan pada code nya.

Proses Make Project memakan waktu yang lebih singkat dibandingkan dengan restart aplikasi. Hal ini karena proses Make Project hanya melakukan compile class java menjadi file .class saja, sedangkan proses start aplikasi nya tidak dilakukan.

Limitation

Setelah saya coba dengan beberapa skenario perubahan code, ternyata spring-loaded memiliki beberapa batasan sehingga perlu dilakukan restart aplikasi. Berikut beberapa batasan yang sudah saya temukan pada percobaan dengan environment di atas:
  • Tidak bisa mengganti value pada @RequestMapping("/greeting"), jadi apa bila kita merubah path atau endpoint /greeting menjadi /hello maka tidak akan bisa ter-reload.
  • Tidak bisa menganti nama method pada rest controller, kita bisa melakukan penambahan method secara langsung pada class controller tetapi untuk method yang sudah terpasang annotation @RequestMapping tidak bisa kita edit.
  • Saat menambahkan class domain baru, harus benar saat pertama kali hot swap, karena perubahan selanjutnya pada class domain tidak akan ter-reload saat hot swap.
Baru sekian skenario yang saya coba, mungkin masih ada beberapa batasan lain dari spring-loaded ini. Dan mungkin juga ada beberapa settingan konfigurasi untuk bisa mengoptimalkan spring-loaded sehingga meminimalisir batasan-batasan tersebut.

Kesimpulan

Bila dibandingkan dengan JRebel, spring-loaded belum bisa menyamai level JRebel. Tetapi mengingat bahwa Jrebel itu berbayar/berlisensi dan hanya memberikan masa trial selama 14 hari saja, spring-loaded yang bersifat free dan juga opensource rasanya lebih bisa diterima meskipun dengan keterbatasannya.

Meskipun pada beberapa case kita perlu restart aplikasi, menggunakan tools hotswap pasti akan lebih mengurangi waktu development dibandingkan dengan cycle normal development (compile & restart).

Jadi kenapa tidak kita gunakan spring-loaded ini selama masa development agar tingkat produktivitas sedikit meningkat.


Referensi:
https://github.com/spring-projects/spring-loaded
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html


Sunday, December 18, 2016

JRebel pada IntelliJ IDEA

Secara singkat JRebel itu adalah tools untuk java yang bisa mengurangi redeploy time. JRebel ini bisa auto reload class, xml configuration, dan lainnya. JRebel merupakan salah satu produk yang di buat oleh zeroturnaround.

Sayangnya tools ini bersifat berbayar, dan bila ingin sekedar mencobanya disediakan trial selama 14 hari oleh mereka.


Pada aplikasi java biasanya proses compile dan startup aplikasi memakan waktu yang lumayan. Dengan adanya JRebel ini maka proses compile dan startup menjadi berkurang karena pada dasarnya JRebel akan melakukan auto reload class atau xml configuration yang mengalami perubahan saja. Proses auto reload ini dilakukan saat aplikasi sedang running jadi tidak perlu melakukan stop-start atau restart aplikasi.

Kita bisa pasang JRebel sebagai plugin pada IntelliJ IDEA, detail instalasi dan aktivasi nya bisa dilihat pada dokumentasi dari zeroturnaround ( link ).
Pada kesempatan ini saya akan menggunakan Springboot Getting Started Project ( link ) sebagai sample untuk demo.

Prepare Project

Dalam project gs-rest-service terdapat 3 class java yaitu:
  • Application
  • Greeting
  • GreetingController

JRebel Modul

Jika JRebel berhasil di pasang dan aktivasi pada IntelliJ IDEA, kita bisa mengakses JRebel Panel via menu: View > Tool Windows > JRebel


dan berikut tampilan JRebel Panel nya :


Bisa kita lihat ada 2 checkbox, yang pertama adalah untuk modul running via JRebel, sedangkan yang kedua adalah modul debug mode via JRebel.
Kali ini kita centang/pilih yang pertama saja, yaitu running via JRebel. 


Akan muncul pesan JRebel enabled seperti diatas, dan ada file rebel.xml yang digenerate pada project dalam package resources.


File rebel.xml ini berisi seperti berikut:

Configure Running Application

Karena aplikasi akan dirunning via IntelliJ IDEA maka perlu di configur terlebih dahulu.
  • Akses menu Run > Edit Configurations, maka akan muncul window Run/Debug Configuration.
  • Tambahkan konfigurasi baru (Add New Configuration), lalu pilih maven. 
  • Isi bagian Command Line dengan: spring-boot:run 
  • Klik OK


Running via JRebel

Setelah setup dan configurasi beres, saatnya kita running aplikasi via JRebel dengan menggunakan toolbar pada bagian kanan atas IntelliJ IDEA

Akan muncul terminal IntelliJ IDEA dan terlihat proses startup springboot.
Pada class GreetingController berisi code berikut:

Jadi apabila kita akses pada browser dengan url http://localhost:8080/hello akan muncul string Hello...

lalu tanpa kita stop aplikasi, kita rubah code pada GreetingController menjadi seperti berikut:

Jangan lupa untuk melakukan Make Project, bisa di akses via menu: Build > Make Project.

Dan kita akses ulang pada browser dengan url http://localhost:8080/hello yang akan muncul adalah string Hello Nostra Guys...

Jadi dengan menggunakan JRebel ini kita bisa men-skip kegiatan stop-start aplikasi bila terjadi perubahan pada kodingan nya.