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.

Referensi :
- http://docs.ansible.com/


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 :)


    Tips dan Trick Accordion di AngularJs

    Beberapa waktu lalu, penulis mengalami kesulitan bagaimana menampilkan semua field yang di butuhkan dalam 1 halaman form? Bukankah akan menjadi amat sangat panjang ke bawah, sebagai user pun juga akan malas untuk kembali men - scroll ke atas untuk mengkroscek kembali dan memastikan bahwa tidak ada filed yang masih kosong. Setelah mencoba berbagai cara maka penulis menentukan pilihan pada accordion.


    Mengapa accordion??
    Semua field dapat masuk dalam 1 halaman form tanpa harus pindah halaman. Terlihat simpel namun rapi dan penggunaan nya pun sederhana, karena sudah ada directive nya pada AngularJs hanya tinggal memanggil saja directive tersebut. Eiiitss, ada yang menjadi perhatian lagi nih...
    Kita mulai dulu aja dari bagaimana memanggil directive accordion tersebut.



    Pemakaian Accordion sama seperti memakai div. Secara keseluruhan accordion di bungkus dengan class uib-accordion , kemudian untuk tiap tab nya menggunakan class uib-accordion-group . Setelah semua field terisi dan di submit ternyata value pada field yang ada di dalam accordion undefined. Mengapa bisa begitu?



    Jadi untuk mendapatkan value tersebut, value dari field yang di dalam accordion HARUS berupa array. Ng-model yang di kirim ke controller berupa array, yang nanti nya akan di kirimkan ke backend sebagai array pula. Sederhana bukan ... Selamat mencoba dan sampai ketemu di tips dan trick berikutnya :D


    Currency Conversion With Gson

    Pada kesempatan kali ini saya akan mencoba menuliskan cara mendapatkan kurs nilai tukar mata uang dengan menggunakan java dan gson sebagai library nya. 

    Apa itu gson? gson adalah library yang diciptakan oleh si mbah google yang berfungsi untuk mengubah objek java menjadi sebuah objek json. 

    Use case yang saya ambil adalah bagaimana mendapatkan informasi nilai tukar mata uang atau currency conversion dengan menggunakan API Provider http://api.fixer.io/

    Karena kita menggunakan gson sebagai library tambahan, maka pastikan kalian sudah memiliki library tersebut, jika tidak kalian dapat men-download gson pada link berikut https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.0

    Untuk melakukan konversi nilai tukar mata uang kita harus mendapatkan nilai rate-nya terlebih dahulu kemudian di-kalikan dengan nilai ammount, kita tidak perlu report memikirkan darimana datangnya hasil nilai rate, karena kita cukup menggunakan API Provider http://api.fixer.io/ yang sudah disediakan oleh google.

    Berikut adalah contoh java untuk currency conversion

    CurrencyConversionResponse.java

    package gsontest;
    
    import java.util.Map;
    import java.util.TreeMap;
    
    
    public class CurrencyConversionResponse {
    
     private String base;
     private String date;
    
     private Map rates = new TreeMap();
    
     public Map getRates() {
      return rates;
     }
    
     public void setRates(Map rates) {
      this.rates = rates;
     }
    
     public String getBase() {
      return base;
     }
    
     public void setBase(String base) {
      this.base = base;
     }
    
     public String getDate() {
      return date;
     }
    
     public void setDate(String date) {
      this.date = date;
     }
    
    }
    
    
    


    CurrencyConvertor.java

    package gsontest;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Scanner;
    
    import com.google.gson.Gson;
    
    public class CurrencyConvertor {
    
     private static final String API_PROVDIER = "http://api.fixer.io/";
    
     public static double convert(String fromCurrencyCode, String toCurrencyCode) {
    
     if ((fromCurrencyCode != null && !fromCurrencyCode.isEmpty())
       && (toCurrencyCode != null && !toCurrencyCode.isEmpty())) {
    
      CurrencyConversionResponse response = 
       getResponse(API_PROVDIER + "/latest?base=" + fromCurrencyCode);
    
      if (response != null) {
    
       String rate = response.getRates().get(toCurrencyCode);
    
       double conversionRate = 
         Double.valueOf((rate != null) ? rate : "0.0");
    
       return conversionRate;
      }
    
     }
    
      return 0.0;
     }
    
     private static CurrencyConversionResponse getResponse(String strUrl) {
    
      CurrencyConversionResponse response = null;
    
      Gson gson = new Gson();
      StringBuffer sb = new StringBuffer();
    
      if (strUrl == null || strUrl.isEmpty()) {
    
       System.out.println("Application Error");
       return null;
      }
    
      URL url;
      try {
       url = new URL(strUrl);
    
       HttpURLConnection connection = 
         (HttpURLConnection) url.openConnection();
    
       InputStream stream = connection.getInputStream();
    
       int data = stream.read();
    
       while (data != -1) {
    
        sb.append((char) data);
    
        data = stream.read();
       }
    
       stream.close();
    
       response = gson.fromJson(sb.toString(), 
         CurrencyConversionResponse.class);
    
      } catch (MalformedURLException e) {
    
       System.out.println(e.getMessage());
       e.printStackTrace();
    
      } catch (IOException e) {
    
       System.out.println(e.getMessage());
       e.printStackTrace();
      }
    
      return response;
     }
    
     public static void main(String[] args) throws IOException {
    
      Scanner scanner = new Scanner(System.in);
    
      System.out.println("Enter the currency code ?");
      String fromCurrencyCode = scanner.next();
    
      System.out.println("Enter the Amount value:");
      double amount = scanner.nextDouble();
    
      System.out.println("Enter the Currency Code that you want to covert : ");
      String toCurrencyCode = scanner.next();
    
      fromCurrencyCode = fromCurrencyCode.toUpperCase();
      toCurrencyCode = toCurrencyCode.toUpperCase();
      
      double coversionRate = convert(fromCurrencyCode, toCurrencyCode);
    
      System.out.println(amount + " " + fromCurrencyCode + 
        " is equivalent to " + (coversionRate * amount) + " "
        + toCurrencyCode + " today.");
    
      scanner.close();
     }
    
    }
    
    
    


    Berikut hasil dari hasil currency conversion dari USD ke IDR


    Kalian juga dapat melakukan currency conversion dengan soap service pada wsdl berikut http://www.webservicex.net/CurrencyConvertor.asmx

    Berikut hasil currency conversion jika service tersebut kita coba jalankan dengan menggunakan soap-UI


    Demikian blog saya kali ini, untuk referensi terkait blog ini dapat juga dilihat pada link berikut, see ya..


    Membuat Mobile Apps dengan React Native

    Introduction:
    React Native adalah framework yang dikembangkan oleh Facebook untuk mengembangkan mobile apps (Android dan iOS) dengan menggunakan JavaScript. Library JavaScript yang digunakan dalam React Native based on React.js

    Beberapa kelebihan dari React Native adalah aplikasi yang dibuat sama dengan native apps dalam penggunaannya. Kita hanya perlu mempelajari satu bahasa pemrograman, yaitu JavaScript untuk membuat aplikasi Android dan iOS. Selain itu, kita tidak perlu menghabiskan waktu banyak untuk melakukan compile ulang ketika pengembangan aplikasi. Dalam Android Studio dinamakan "instant run", namun hanya untuk pengembangan Android versi lolipop keatas.

    Kekurangannya React Native masih relatif baru (rilis tahun 2015) sehingga masih sedikit tutorial React Native. Beberapa API native dari Android dan iOS belum semuanya supported, namun perkembangan React Native sangat cepat jadi mungkin kedepannya semua API akan supported.

    Getting Started:

    1. Windows
    Untuk platform Windows, React Native hanya dapat mengembangkan aplikasi Android saja. Berikut adalah hal-hal yang diperlukan untuk melakukan instalasi:
    • Java, Android Studio, Genymotion (atau emulator Android lainnya)
    • Install chocholatey
    • buka cmd, lalu jalankan
    choco install nodejs.install
    choco install python2npm install -g react-native-cli 
    • setelah itu untuk membuat project jalankan:
    react-native init NamaProject 
    • Untuk menjalankan aplikasinya, jalankan:

      cd NamaProject
      react-native run-android
    2. MacOS
    Berikut adalah hal-hal yang diperlukan untuk melakukan instalasi dalam platform MacOS:
    • iOS: XCode
    • Android: Java, Android Studio, Genymotion (atau emulator Android lainnya)
    • Install Homebrew
    • buka cmd, lalu jalankan
    brew install node
    brew install watchman
    npm install -g react-native-cli
    •  Setelah itu untuk membuat project jalankan:
    react-native init NamaProject
    • Untuk menjalankan aplikasinya, jalankan:
    cd NamaProject
    react-native run-android (untuk Android)
    react-native run-ios (untuk iOS) 
    Selanjutnya akan muncul aplikasi tersebut dalam emulator seperti ini,



    Untuk membuat apps dengan React Native juga bisa mengunakan Visual Studio Code , cukup install extention "React Native Tools" nantinya akan ada pilihan untuk menjalankan code untuk Android atau iOS. Berikut adalah contoh isi dari direktori project React Native.





    Kita hanya perlu edit file "index.ios.js" untuk membuat aplikasi iOS dan "index.android.js" untuk membuat aplikasi Android. Setelah edit code dalam file tersebut, jalankan command+R (MacOS) atau ctrl+R (Windows) untuk reload aplikasi pada emulator dengan instant.

    Selamat mencoba dan Happy Coding :)

    Referensi:

    Spring Batch - Reading From FlatFile

    Sebelumnya sudah pernah saya jelaskan secara singkat mengenai spring batch. Dan pada kesempatan kali ini saya aja memberikan contoh bagaimana cara mengambil data melalui flatfile secara batch.
    Sebenarnya tidak ada yang beda dengan proses yang sudah saya jelaskan sebelumnya.
    Dalam spring batch ada 3 proses besar, yaitu :

    1. Read
    2. Process
    3. Write
    Dan ke 3 proses itu akan dipanggil dalam Step dan dijalankan oleh Job (dimana kita dapat mengatur waktu kapan proses batch ini akan dijalankan).

    Yang digunakan untuk membaca data dari flatfile dapat menggunakan FlatFileItemReader.
    Sebagai contoh :

    File yang digunakan adalah seperti dibawah ini :
    Untuk contoh file csv di atas, pada saat reader anda dapat memanggil dengan cara seperti dibawah ini.

    Sekian untuk saat ini yang dapat saya sampaikan. Semoga membantu.

    Mengenal Zeplin. Tools asik untuk kolaborasi antara designer dengan developer

    Sebagai front-end developer terkadang saya sulit sekali untuk mengimplementasikan desain aplikasi yang di provide oleh desainer karena terbatasnya informasi terkait assets yang di attach pada desain aplikasi tersebut.

    Oleh karena itu pada kesempatan kali ini saya ingin memperkenalkan sebuah tools bernama Zeplin yang berfungsi sebagai tempat berkolaborasi mengenai desain aplikasi yang dibuat agar gap antara designer dan developer (khususnya front-end) tidaklah terlalu jauh.

    Zeplin merupakan tools kolaborasi yang interaktif untuk developer dan designer dalam mengembangkan user interface aplikasi baik web ataupun mobile (android/ios). Bisa dilihat dokumentasi Zeplin disini .

    Halaman Home Zeplin:


    Zeplin free hanya untuk penggunaan 1 project. Untuk 3 project dikenai biaya 17 Dollar/bulan dan untuk 12 project dikenai biaya 26 Dollar/bulan. Zeplin dapat mengimport assets desain berbasis Photoshop atau Sketch (hanya tersedia di Mac), namun pada tutorial kali ini saya menggunakan Sketch. Let's Start :D

    Sebelumnya saya telah memiliki 2 Account yang telah terdaftar pada Zeplin sebagai Designer dan Developer. Role Designer dapat melakukan upload file design aplikasi dan detail informasi assets tersebut dapat dilihat dalam bentuk desain assets aplikasi yang dibuat, contohnya CSS untuk website.

    Setelah mendaftar, Zeplin meminta untuk menginstall Aplikasi Zeplin ke PC. Lakukan install dan login menggunakan PC kemudian buat project baru dan pilih platform project apa yang akan dibuat. Pada yang saya contohkan saya memilih aplikasi Web.


    Berikut dibawah ini gambar detail project dan member pada project yang dibuat:


    User 'panjialam' saya Rolenya pada saat login project sebagai Designer. Kemudian selanjutnya saya akan mengundang user lain (Developer) untuk join ke dalam project. Pilih invite kemudian ketik username dan pilih "invite" username yang tampil tersebut.

    Nah saat ini saya telah menginvite alampanji yang berperan Developer. Developer nantinya dapat melihat hasil generate Desain dalam format script CSS/LESS/SASS dengan kata lain developer tidak perlu bekerja 2kali dengan memikirkan styling aplikasinya, Menarik bukan?

    Memulai mendesain pada Sketch...

    Seperti yang sudah saya bilang tadi Zeplin mendukung desain yang dapat di import pada Project dalam format photoshop dan sketch namun pada tutorial saya kali ini saya mencoba menggunakan sketch sebagai source desain yang diimport ke Zeplin. Sketch merupakan tools design UI yang hanya tersedia pada Mac. Sketch merupakan software berbayar dan kita dapat menggunakannya Free Trial selama 30 hari saja.

    Oke untuk create design pada Sketch pilih File > New From Template dan Pilih Web Design seperti gambar berikut:


    Kemudian buat desain web seperti contoh gambar berikut:


    Kemudian selection desain tersebut dan pilih Plugins > Zeplin kemudian pilih Export Selected Artboard seperti gambar dibawah ini:

    Pada langkah ini, Sketch akan mengexport desain yang sudah di selection kedalam file project Zeplin yang telah kita buat sebelumnya, jika success akan seperti gambar seperti ini:


    Nah setelah sukses, kembali lagi pada file project Zeplin dan file desain Sketch tadi akan ada di project seperti gambar berikut:

    Seperti yang sudah saya bilang tadi, sebagai Developer kita dapat melihat hasil generate styling dalam format CSS/LESS/SASS/Stylus dll. Pilih komponen dan stylingnya dapat dilihat seperti ini:


    Dan styling CSS komponennya bisa kita copy dengan mengklik 'copy' seperti gambar berikut:
    Sekian tutorial yang saya sampaikan, semoga dapat mempermudah pekerjaan Designer dan Developer yang HQQ (re: Hakiki). Terimakasih sampai bertemu pada blog selanjutnya :D








    Grunt Vs Gulp

    Grunt dan Gulp seperti yang kita tau adalah sama - sama  automation tools berbasis command line interface yang di bangun menggunakan Node.js. Automation tools ini berfungsi untuk menjalankan beberapa tugas yang sifatnya berulang seperti minification, kompilasi, unit test dan lain sebagainya. Beberapa template AngularJs yang di temui, ada yang menggunakan Grunt sebagai kompilasi nya dan ada juga yang menggunakan Gulp, lalu apa yang membedakan??

    Grunt :

    • Saat ini memiliki lebih dari 4000 plugin
    • Grunt dapat meminifies Javascript, file CSS, pengujian file, kompilasi file CSS prepocessor (SASS, LESS), dll
    • Grunt mengurangi kemungkinan mendapatkan kesalahan saat melakukan tugas yang berulang
    Gulp :
    • Konfigurasi dari Gulp lebih simpel daripada task runner lainnya
    • Gulpjs telah built-in untuk setiap plugin yang dibutuhkan berbeda dengan grunt
    • Otomatis refresh halaman setelah mengedit file sumber
    Dari konfigurasi, file Gruntfile.js dan Gulpfile.js juga sangat berbeda. File Gulpfile.js sangat simpel dan mudah untuk di pahami karena tidak terlalu banyak, sedangkan Gruntfile.js terlalu ribet dan panjang juga sangat detail.
    gulpfile.js
     
    gruntfile.js
    Konfigurasi Gulp lebih mudah dibaca, banyak pula yang merasa bahwa kode Grunt lebih mudah untuk menulis, tergantung dari mana yang lebih memenuhi kebutuhan si developer. 
    Dari segi kecepatan, Gulp lebih cepat di banding Grunt. Sebuah tes kecepatan yang dilakukan oleh tmwtech menunjukkan perbandingan antara Gulp dan Grunt dalam hal jumlah waktu yang dibutuhkan untuk melakukan kompilasi Sass. Hasil penelitian menunjukkan bahwa Gulp secara signifikan lebih cepat dengan hanya mengambil 1,27 detik vs Grunt ini 2,348 detik.


    Alasan untuk keunggulan kecepatan Gulp saat ini adalah ke fakta bahwa Gulp menggunakan streams dan menangani tugas-tugas dalam memori, yang berarti hanya satu file ditulis. Selanjutnya, Gulp dapat memproses beberapa tugas pada waktu yang sama, tetapi Grunt biasanya hanya akan menangani satu tugas pada satu waktu.
    Di bawah ini terdapat gambar bagaimana perbedaan Grunt dan Gulp bila di persentasi kan dengan angka.


    Grunt lebih banyak di download, tetapi Gulp lebih banyak di gunakan oleh developer. Melihat hasil presentase dan keterangan di atas, Grunt memiliki beberapa keunggulan karena memang Grunt lebih dulu lahir daripada Gulp. Tetapi Gulp juga lebih sederhana untuk di pelajari dan implementasi, jadi tidak ada salah nya bila di gunakan, tapi ingat ini tergantung kebutuhan project juga, tidak perlu memaksakan menggunakan Gulp atau pun Grunt.  Semoga informasi ini dapat menjadikan bahan refernsi, dan selamat mencoba :D


    Spring Batch - Reading From Database

    Pada coretan saya kali ini akan menjelaskan bagaimana cara melakukan proses batch dengan mengambil data dari database. Namun, sebelumnya akan saya jelaskan secara singkat mengenai Spring Batch ini.

    Spring Batch merupakan suatu framework batch yang komprehensif ringan yang dirancang untuk aplikasi dalam jumlah yang besar untuk daily operation dari sistem enterprise.


    Fitur :




  1. Transaction management
  2. Chunk based processing
  3. Declarative I/O
  4. Start/Stop/Restart
  5. Retry/Skip


  6. Untuk mengambil data dari tabel database, buat class yang berisi attribut yang sesuai dengan field pada tabel yang diinginkan. Sebagai contoh, buat User.class
    Buat configuration class, dengan menambahkan JdbcCursorItemReader Bean.
    Buat class untuk ProfileUserItemProcessor dengan implement ItemProcessor.
    Buat configuration class, tambahkan bean untuk memanggil ProfileUserItemProcessor yang sudah dibuat sebelumnya.
    Tambah RepositoryItemWriter bean untuk menyimpan ke tabel internal yang digunakan.
    Buat Step bean, dimana proses ini kita dapat membuat lebih dari 1 step sesuai kebutuhan.

    Proses terakhir adalah buat bean untuk job, dimana job ini akan memanggil step di atas.

    Apabila terdapat step lebih satu, dapat dipanggil dengan cara seperti dibawah ini
    
    
    
    
    Demikian coretan saya untuk saat ini. Semoga membantu.