Monday, March 20, 2017

Virtual Box - Start Modes, Snapshot dan Cloning

Haloo, ini merupakan postingan pertama saya untuk blog.nostratech.com and it’s a pleasure. Kali ini saya akan sharing mengenai beberapa tips untuk software virtualisasi Virtual Box. Apa yang akan saya sharing adalah start modes, snapshot dan cloning yang ada pada software ini.

Start Modes

Ada apa dengan start modes? Karena ketika mengakses UI VM melalui terminal dengan command ‘virtualbox’, UI akan tampil di host, namun ketika UI di close, setiap machine pada Virtual Box akan stop/abort. Terdapat 3 start modes yang disediakan pada VBox yaitu :

Normal Start (Starts a VM showing a GUI window. This is the default.)
Headless Start (Starts a VM without a window for remote display only.)
Detachable/Separate Start (Technically it is a headless VM with user interface in a separate process, but it still lack on functionality)
 
Nah, maka dari itu untuk start machine melalui terminal tanpa UI, kita bisa menggunakan Command :

VBoxManage startvm fmw-wcc1 --type headless


fmw-wcc1 = machine name
headless = start mode

Snapshot

Snapshot Ini merupakan fungsi yang digunakan untuk membuat ‘bookmark’ state (filesystem,config) dari suatu virtual machine yang nantinya dapat di roll-back (di restore kembali sesuai state yang tersimpan). Fungsi ini juga dapat digunakan untuk mengelompokkan state dari VM, misalnya , oracle-linux-7@fresh-install : Menandakan bahwa snapshot memiliki state saat selesai install VM dan belum ditambahi package lainnya. Command :

VBoxManage snapshot oracle-linux-7 take oracle-linux-7@fresh-install     (take snapshot)

VBoxManage snapshot  oracle-linux-7 restore oracle-linux-7@fresh-install    (restore)

VBoxManage snapshot  oracle-linux-7 delete oracle-linux-7@fresh-install    (delete) 

Cloning

Cloning digunakan untuk membuat VM baru tanpa melakukan setup dari awal dengan spesifikasi yang sama dan nantinya dapat dicustomize juga. Metode Cloning memudahkan menghemat waktu admin dikarenakan hanya butuh waktu yang singkat dan command yang simple.

VBoxManage clonevdi /path/to/existing.vdi new-machine.vdi

Dan selanjutnya dapat menginisialisasi UUID untuk VM yang telah di clone dengan command :

VBoxManage internalcommands sethduuid new-machine.vdi


Referensi :

Sunday, March 19, 2017

Mengenal Ansible Sebagai Configuration Management

Pada kesempatan ini saya akan berbagi tentang ansible sebagai configuration management.

Apa itu ansible?
- Implementasi software dari configuration management
- Adalah automation engine yang dijalankan untuk memudahkan untuk mengelola server yang berjumlah banyak.
Berdasarkan pernyataan diatas maka dapat dipahami bahwa ansible diperlukan untuk mengelola target server yang berjumlah banyak. Sebagai contoh jika kita ingin copy file dari laptop ke server yang berjumlah 2 atau 3 mungkin kita dapan menggunakan scp, tapi bayangkan jika kita perlu melakukan copy file ke 15 atau 100 server? Wow pasti sesuatu :)

Ada tiga cara untuk menjalankan ansible, yaitu:
- Ad-Hoc (free)
  Cara menjalankan ansible berupa command-line instruksi via terminal

- Playbooks (free)
  Cara menjalankan ansible yang terdiri dari plays, dan plays terdiri dari task, dimana task akan memanggil modul-modul ansible. Sebagai catatan task dijalankan secara berurutan

- Automation Framework Tower (Berbayar)
  Enterprise framework untuk mengontrol, keamanan dan mengelola automasi ansible menggunakan UI dan restful API.

Untuk menjalankan ansible maka dibutuhkan python pada ansible server dan target server, dan berkomunikasi menggunakan OpenSSH.

Baiklah, langsung saja.

=> Tahap Instalasi
Pada kasus ini saya menggunakan OS X dimana install via python package manager (pip).
$ sudo easy_install ansible
$ sudo pip install ansible

=> Setting inventory
Pada kasus ini saya memiliki 2 node dengan address berikut:
- 192.168.56.108 (node1)
- 192.168.56.109 (node2)
*note: asumsi hosts sudah memiliki private key agar tidak perlu password saat ssh ke target server.

Pada working directory buat file hosts dengan isi target server. Seperti pada contoh berikut
[dev]
192.168.56.108 ansible_ssh_user=root
192.168.56.109 ansible_ssh_user=root

Kata yang berada dalam tanda kurung "[dev]" adalah group name dari target server. Anda dapat menggantinya dengan apa saja.

Pertama-tama kita akan menjalankan ansible dengan metode ad-hoc.
- Test koneksi ke seluruh server development

ansible dev -m ping


Dengan begitu kita tidak perlu mengetes koneksi kesemua server development, ini adalah contoh sederhana. Berikutnya adalah contoh copy file dari ansible host ke seluruh target.

ansible dev -m copy -a "src=/Users/pasaribu/testFile.xml dest=/tmp/testFile.xml"

Dengan begitu seluruh server yang tergabung dalam group name dev sudah memiliki file testFile.xml

Pada artikel berikutnya saya akan menjelaskan bagaimana menggunkanan ansible dengan cara ansible playbook.

AngularJS is dying?



Sudah 6 tahun jalan sejak angularJS pertama kali lahir di dunia ini dan (baru) 3 tahun sejak saya pertama kali mengenalnya. Pada dasarnya untuk saya yang awalnya bukan seorang Front End Developer dan tidak fasih dengan Javascript, Angular merupakan salah satu framework yang membuat saya jatuh cinta. Berbagai fitur yang dimilikinya luar biasa memudahkan Saya walaupun untuk beberapa orang merasa bahwa penulisan angular yang bebas membuat jadi lebih sulit.

Setelah melewati beberapa tahun dengan angular tentunya fitur 2-way-data-binding Angular yang luar biasa mempertemukan saya dengan berbagai kemudahan dan kesulitan. Ketidak telitian dalam pengunaan $scope membuat boros resource karena banyaknya object yang di watch merupakan masalah yang cukup pelik. Adanya beberapa tag yang ternyata menghalangi angular melakukan 2-way-data-binding dan masih banyak lagi. Tetapi hal tersebut tidak membuat saya lepas dari angular. Walau banyak rekan kerja yang sudah menyarankan move on ke beberapa framework lain, seperti ReactJS misalnya. Bukannya cinta buta ya, tetapi bisa di lihat lagi ke atas, Yap saya tidak fasih dengan Javascript. Tentunya membuat saya kesulitan mencari framework pengganti Angular.

HIngga pada akhirnya Angular 2 rilis, beberapa perbaikan dari sisi struktur yang tadinya di bebaskan menjadi lebih terstruktur. 2-way-data-binding di bagi-bagi menjadi lebih detail sesuai kebutuhan, sehingga dapat mengurangi resource dengan penggunaan yang lebih teliti. Dan masih banyak perbaikan lainnya. Dengan penuh harap, mengharap angular2 dapat memberikan framework yang lebih powerfull dan mudah digunakan.

Tetapi sepertinya tidak demikian, Setelah 2 tahun masa development Angular 2 dengan cara penulisan yang luar biasa berbeda dari Angular 1, membuat developer tercengang dengan perombakan yang terjadi. Thats a rewrite!! Tidak hanya itu complexitas code yang ada membuatnya semakin rumit dibanding Angular1 dan typeScript yang diusung sebagai bahasa utamanya (Dart tidak memenuhi keinginan mereka sepertinya dengan keterbatasan- keterbatasan yang ada). Ditambah dengan size starting package yang sudah cukup besar membuat saya semakin meragukan Angular2 serta informasi bahwa developer utamanya saat ini sedang membuat framework baru. Hal tersebut terjawab tak lama kemudian ketika diputuskan adanya Angular 4 hanya jarak beberapa saat dari waktu release angular2. Yap Google sepertinya merasakan keraguan yang sama.

Lalu bagaimana kelanjutan Angular? Itu pertanyaan terbesar saya. Ketika saya menghampiri website angular tidak terlihat penampakan Angular2 seperti yang terlihat tahun lalu. Hanya sebuah tulisan kecil yang mengarahkan ke angular.io untuk membaca lebih lanjut. Sedangkan button new angular mengarah ke angular-material beta version(base on angular2).

Sad story for a young "big" framework. :)
Mari kita lihat saja apakah Angular4 akan dapat memperbaiki keadaan yang ada atau Angular akan benar- benar hilang dari framework web yang ada.

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


Jasper Report - Table from List Java


Pada kesempatan yang lalu saya pernah membahas mengenai penggunaan jasper pada java yang dapat dibaca di sini. Disana saya sudah menjelaskan mengenai bagian- bagian yang terdapat pada jasper. Serta bagaimana penggunaanya pada java

Pada kesempatan beberapa waktu saya berkesempatan bermain kembali dengan jasper dan masih menggunakan java untuk penggunaannya. Pada kesempatan kali ini saya akan memberikan contoh penggunaan jasper menggunakan table dengan javabean datasource.

Table tentunya merupakan bagian yang sering ada pada report. Jasper tentunya juga support dengan fitur ini. Penggunaan table pada jasper sebenarnya sangat mudah apabila menggunakan datasource karena sudah ada wizard untuk hal tersebut. Maka dari itu saya tidak akan membahas penggunaan table pada jasper menggunakan datasource melainkan menggunakan java.

Apabila sebelumnya dengan mengirim list sebagai JRDataSource dan langsung dapat digunakan pada detail band. Untuk menggunakan list pada table data dalam bentuk JRDataSource perlu dikirim sebagai bagian dari param.

Mari kita siapkan template reportnya.
    • Buat parameter pada report dengan nama ObjectDataSource dan Class : net.sf.jasperreports.engine.data.JRBeanCollectionDataSource





    • Membuat sebuah datasource yang akan digunakan pada table ( bisa langsung ketika config tablenya juga )

    •  Ambil table dari pallet dan menjalankan wizardnya seperti berikut




    • Membuat field pada datasource yang digunakan untuk table tersebut sesuai dengan object java kita.



    • Tata dalam table.



    • Setelah selesai saya membersihkan band yang ada pada report dan hanya menyisakan band title dan detail saja. Berikut struktut akhir dari template yang digunakan


    Berikut adalah cara pemanggilan reportnya untuk pembuatan report dalam format pdf dari java.

    
    
        List<SimpleReportVO> detail = new ArrayList<>();    
        SimpleReportVO data1 = new SimpleReportVO();    
        data1.setName("Roti Tawar");    
        data1.setPrice(1000);
    
        detail.add(data1);
    String dest = "D://report/report.pdf"; String template = "D://report-template.jasper"; try{ JRDataSource ds = new JRBeanCollectionDataSource(detail); HashMap params = new HashMap();
            params.put("ObjectDataSource", ds);        
            JasperPrint jp  = JasperFillManager.fillReport(template ,
                    params, new JREmptyDataSource());
            JasperExportManager.exportReportToPdfFile(jp, dest);
        }catch (Exception e){
            logger.info(e.getMessage());    
        }

    Object Java : 
    import lombok.Data;
    
    
    @Data
    public class SimpleReportVO {
        private String name;
        private int price;}

    Hasil darinya seperti berikut :



    Demikian cara penggunaan table pada jasper report dari list java. Semoga berguna..
    Sampai bertemu di kesempatan berikutnya.
    Happy Coding :)