Showing posts with label andywiranata. Show all posts
Showing posts with label andywiranata. Show all posts

Sunday, December 18, 2016

Object Destructuring Javascript

Sampai jumpa kembali, kali ini saya akan membahas Object destructuring di javascript. Yah, Dengan mengetahui ini akan membantu kamu melakukan coding menjadi lebih simple, clean, pretty dan readable hehehe. Menurut saya bagian paling sulit dalam javascript adalah membuat kodingmu mudah di baca orang karena javascript sangat flexible dalam penulisan variabel, function dan loose data type.

Langsung saja kita mulai:

Misal kita mempunyai object yang memiliki lebih dari 10 atribut seperti ini:
var state = {
     name:"Andy wiranta wijaya",
     address:"Jl. xxx", 
     phoneNumber:"+627272727227",
     sex:"pria",
     ....
Nah, saya hanya butuh  2 atribut name dan address yang akan saya tampung di suatu variabel.
//Cara konvensional 
var name = state.name;
var address = state.address;
//Object destructuring
const { name, address } = state;
Simple, clean,  pretty dan readable. Coba kalian bayangkan jika kalian passing lebih dari 10 atribut. Contoh ke dua:
var state = {
 name : "budi",
 address:"Jl kebon timur no 7-8",
 sex : "pria",
 hobby:"main bola"
}
printMyNameAndAddress(state)
function printMyNameAndAddress({name, address}){
 console.log(`my name is ${name} and address ${address}`);
}
Hasilnya:


Mari kita implementasikan di react component, sebelum (destructuring):
render() {
  return (
    <ProductPrice
      hidePriceFulfillmentDisplay=
       {this.props.hidePriceFulfillmentDisplay}
      primaryOffer={this.props.primaryOffer}
      productType={this.props.productType}
      productPageUrl={this.props.productPageUrl}
      inventory={this.props.inventory}
      submapType={this.props.submapType}
      ppu={this.props.ppu}
      isLoggedIn={this.props.isLoggedIn}
      gridView={this.props.isGridView}
    />
  );
}
Bisa dilihat sendiri banyak penggunaan this.props :o, mari kita perbaikin dengan seperti ini:
render() {
  const {
    hidePriceFulfillmentDisplay,
    primaryOffer,
    productType,
    productPageUrl,
    inventory,
    submapType,
    ppu,
    isLoggedIn,
    gridView
  } = this.props;
return (
    <ProductPrice
      hidePriceFulfillmentDisplay={hidePriceFulfillmentDisplay}
      primaryOffer={primaryOffer}
      productType={productType}
      productPageUrl={productPageUrl}
      inventory={inventory}
      submapType={submapType}
      ppu={ppu}
      isLoggedIn={isLoggedIn}
      gridView={isGridView}
    />
  );
}

Kesimpulan:

Remember, beautiful code does a lot without saying much.

Sumber:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring
Inspirasi quote:
https://medium.com/walmartlabs/make-your-react-components-pretty-a1ae4ec0f56e#.qlgf8l272

Airbnb Superset - data exploration

Pada kali ini saya akan menulis tentang airbnb superset.  Superset berfungsi menampilkan data dalam bentuk graphic (visual). Salah satu pertimbangan saya menggunakan superset adalah open source dan memiliki fitur - fitur sebagai berikut:
  • Security seperti user management, view menu dan lain - lain
  • Bisa multiple database 
  • SQL Lab 
  • Slice data
  • Dashboard 

Berikut sedikit demo:

How to install:

Superset menggunakan python 2.7 dan 3.4
#install os dependecies
sudo apt-get install build-essential libssl-dev libffi-dev python-dev python-pip libsasl2-dev libldap2-dev

# Install superset
pip install superset

# Create an admin user
fabmanager create-admin --app superset

# Initialize the database
superset db upgrade

# Load some data to play with
superset load_examples

# Create default roles and permissions
superset init

# Start the web server on port 8088
superset runserver -p 8088

# To start a development web server, use the -d switch
# superset runserver -d


Untuk mengubah configuration database, buka file:
<YOUR_DIR>/python3.4/site-packages/superset/config.py
Kita ubah configuration database:
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(DATA_DIR, 'superset.db')
# SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'

Sekian blog dari saya semoga bermanfaat, silahkan berkunjung ke github superset :)

Sunday, September 18, 2016

Mengapa React ?

Baru beberapa bulan ini saya belajar React so saya bukan expert :D. Dan pada blog ini saya akan membahas kenapa sih harus pake React & hal apa saja yang perlu Anda ketahui jika Anda ingin menggunakan React.

Apa itu React ?
  • Sederhana, React itu Library untuk bikin User Interface. React ga punya Model dan Controller hanya View
  • Component Based
Kenapa pake React ?
  • Karena Virtual DOM. Jadi sebelum render ke actual DOM, react melakukan proses rendering di Virtual DOM dan hanya mengubah/update  component yang mengalami perubahan sehingga lebih effisien dan meningkatkan performance. Karena pada saat me-render DOM dibutuhkan kalkulasi CSS & bind action dan ini memakan waktu. Tapi ini akan bekerja dengan baik apabila kita meng-implementasikan dengan benar (baca: https://facebook.github.io/react/docs/thinking-in-react.html)
  • Isomorphic, yaa react bisa jalan di server & client side denga code yang sama. Jadi aplikasi bisa jalan secara server side rendering.
  • Lean Once, Write Anywhere: React Native
Hal - hal apa yang seharusnya anda ketahui sebelum belajar React ?
  • ECMAScript 6, javascript rasa java :D. Berikut contoh jika menggunakan ES6.


  • Babel adalah ECMAScript 6 ke ECMAScript 5 compiler. Memungkinkan fitur -  fitur ES6 dalam development lalu di-compule ke ES5 untuk penggunan production. 
  • Flux atau Redux Architecture, yaa React hanya UI library jadi kalian membutuh arsitektur untuk komunikasi setiap component.
  • Gulp sebagai javascript task runner.
    • Bundling and minifying libraries and stylesheets.
    • Refreshing your browser when you save a file.
    • Quickly running unit tests
    • Running code analysis
    • Less/Sass to CSS compilation
    • Copying modified files to an output directory
  • Selain Gulp kalian bisa menggunakan Webpack untuk fungsionaliti yang lebih advanced.

Kesimpulan:
  • React itu Javascript centric, cocok bagi yang mau belajar javascript :D
  • Karena dia component based & menaruh html ke dalam javascript menjadi tantangan sendiri untuk mendesign aplikasi kita :D
  • Reactive Programming :)
Jika kalian ingin belajar react kalian bisa cari starter kit di http://andrewhfarmer.com/starter-project/ atau react-es6-skeleton-reflux


Sumber:


Firebase Auth bersama React - Reflux

Halo, pada kali saya akan membahas tenang firebase authentication untuk website dan kita akan integrasikan ke ReactJS dengan Reflux sebagai Functional Programming Architecture adaptasi dari Flux.

Authentication adalah bagian penting dari setiap aplikasi SaaS, dan melakukan otentikasi pada Single App Page menambahkan beberapa kompleksitas tersendiri. Di sini saya akan membahas bagaiman aplikasi bisa terintegrasi dengan firebase Authentication, berikut gambaran umum alur authentication-nya:


ReactComponents
  • Setiap component akan listen AuthStore jika membutuhkan akses API yang membutuhkan otorisasi. Ini diperlukan karena fireabase Auth berjalan secara Async untuk menghindari getToken() === null.
AuthActions
  • AuthActions list of Actions cara kerjanya sesuai standard Reflux-Actions

AuthStores
  • AuthStore berfungsi untuk berkomunikasi ke Firebase SDK. 

Kesimpulan
  1. Dengan pendekatan ini aplikasi kita jadi mudah di maintain dan lebih agile jika ada perubahan UI. Dan tidak perlu implementasi Firebase.Auth disetiap React komponen. Ingat React itu Library for Building User Interface bukan untuk maintain state auth :D (baca: https://en.wikipedia.org/wiki/Single_responsibility_principle)  
  2. Mostly Firebase SDK berjalan secara async ini menjadi sulit di maintain dan diprediksi dengan React Lifecycle. Jadi dibutuhkan data flow seperti ini :D
  3. Apakah Reflux Architecture terbaik untuk React & Firebase ? Menurut saya tidak, saya tetap mengalami kesulitan dalam maintain state aplikasi. please use Redux for better apps & performance.





Wednesday, June 15, 2016

Event bus menggunakan RxJava

Pada blog sebelumnya saya telah membahas tuntas tentang Event Bus dan imeplementasi menggunakan otto. Dan sayang sekali Otto sudah deprecated dan tim otto merekomendasikan menggunakan RxJava dan RxAndroid yang mempunyai kemampuan lebih baik untuk mengontrol thread.

Tambah di Gradle:

compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'

Buat class RxBusEventHelper
import rx.Observable;
import rx.subjects.PublishSubject;
public class RxBusEventHelper {
    private PublishSubject<Object> subject = PublishSubject.create();
    public RxBusEventHelper(){
    }
    /**
     * Pass any event down to event listeners.
     */
    public void send(Object object) {
        subject.onNext(object);
    }
    /**
     * Subscribe to this Observable. On event, do something
     * e.g. replace a fragment
     */
    public Observable<Object> getEvents() {
        return subject;
    }
}

Contoh publish event:
mRxBusEventHelper.send(new YourEventName());

Contoh subscribe event
Action1<object> subscribeEvent = new Action1<object>() {
    @Override
    public void call(Object o) {
        if(o instanceof YourEventName)
            doSomething();
    }
}


Sekian blog dari saya semoga bermanfaat.

Android MVP Pattern

Pada blog kali ini saya akan membahas  tentang MVP (Model View Pattern) di Android. MVP merupakan salah satu pattern yg cukup popular.

Pada saat mengembangkan aplikasi Android saya mempunya masalah bahwa Android Activity dieratkan dengan interface (callback) dan mekanisme akses data sehingga menjadi tight coupling dan menjadi sulit di maintain. MVP membuat View menjadi independent dari data layer.

Sebelum memulai lebih baik membaca artikel tentang Event bus Android dan Reactive Programming. Reactive Programming (RxJava) menjadi inti disini karean kita berkomunkasi melalui konsep ini. RxJava sendiri adalah bagian dari library yang dikembangkan oleh ReactiveX, dimana kegunaan library ini bertujuan untuk melakukan proses asynchronous pada sebuah program dengan konsep observables sequence.




Penjelasan MVP:
  • Presenter
    • Presenter bertanggung jawab untuk berkomunikasi dengan view dan model. Presenter menerima data dari model dan memanggil method di view. Presenter subscribe ke Observables yang ada di Data Manager dan berkomunikasi. Serta presenter harus bisa melakukan schedulars dan subscriptions.
  • View
    • Menghandle behavior dan manipulasi UI (Activity atau Fragment). Dan menerima callback dari presenter untuk melakukan action tertentu. 
  • Model
    • Model adalah sebagai data layer untuk berkomunikasi ke local storage atau server. Data Manager merupakan inti dari arsitektur ini. Menggunakan rxjava operator untuk berkomunikasi ke Helper Class dan Presenter layar.

Why is this approach better ?

  • RxJava Observables and operators menghapus kebutuhan untuk memiliki nested callback.

  • Data Manager meringankan beban activity dan fragment. Dimana data manager melakukan http request ke server atau mengambil data ke local storage.
  • Activity dan fragment menjadi ringan karena hanya bertugas untuk update UI dan handle user event.
  • Setiap layer memeliki tugasnya masing - masing sehingga membuat arsitektur menjadi test-friendly.
Untuk implementasi-nya silahkan tunggu di blog saya berikutnya.

Sumber:
http://antonioleiva.com/mvp-android/
https://labs.ribot.co.uk/android-application-architecture-8b6e34acda65#.jtccesiud


Tuesday, March 15, 2016

Implementasi Event Bus menggunakan Otto

Pada blog sebelum-nya saya telah menjelaskan apa keuntungan menggunakan Event Bus. Pada blog kali ini saya akan mencoba menjelaskan impelentasinya menggunakan library Otto.

1. Pertama
compile 'com.squareup:otto:1.3.8'

2. Kedua create instance Bus di Application class
import android.app.Application;
import android.util.Log;
import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;

/**
 * Created by nostra on 3/15/16.
 */
public class OurApp extends Application{
    private static Bus mEventBus;
    public static Bus getEventBus() {
        return mEventBus;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mEventBus = new Bus(ThreadEnforcer.ANY);
     

    }
}

3. Create pojo class untuk mendefinisikan Event. Pada kasus ini saya membuat event ketika user yg login sudah invalid.
/**
 * Created by nostra on 3/15/16.
 */
public class UnauthorizedEvent {
    public int status;

    public UnauthorizedEvent(int status) {
        this.status = status;
    }
}

4. Publisher melakukan post event, berikut potongan logic-nya:
if(status==401){
    OurApp.getEventBus().post(new UnauthorizedEvent(status));
    return;
}

5. Pada Activity Anda tambahkan register bus, seperti gambar dibawah:
    @Override
    protected void onStart() {
        super.onStart();
        OurApp.getEventBus().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        OurApp.getEventBus().unregister(this);
    }

6. Langkah terakhir Activity melakukan subscribe, berikut contohnya:
    @Subscribe
    public void unauthorizedEvent(UnauthorizedEvent event){
        if(event.status==401){
            Intent i = new Intent(this, Login.class);
            startActivity(i);
            finish();
        }
        Log.i(TAG, "Event status :" + event.status);

    }

Yay, Mudah bukan. Untuk next level penggunaan Event bus kalian bisa baca artikel dibawah:
https://labs.ribot.co.uk/android-application-architecture-8b6e34acda65#.mimpcgc5v

Sekian dan terima kasih

Event bus Android

Pada kali ini saya akan membahas tentang Event Bus di Android. Konsep Event Bus sekarang ini sangat populer  mungkin aplikasi Android yg kalian install menggunakan konsep ini.

Sebelum kita mulai, mari kita lihat bagaimana component android (activity, fragment, service etc) saling berkomunikasi. Berikut gambarnya:



Padahal gambar diatas bisa dilihat beberapa komponen Android saling berkomunikasi. Coba kalian bayangkan apabila aplikasi kalian lebih besar dari contoh diatas. Wow pasti akan sulit dimaintain dan tidak agile, berikut beberapa kekurangan dari gambar diatas:
  • Tight coupling antara component
  • Mengubah UI menjadi mimpi buruk!!!
  • Boiler plate koding:
    • Butuh mendefinisikan Interface
    • Callback callback dan callback untuk setiap async task dan komunikasi antar component!
    • Listener management
  • Menambahkan 1-5 line code untuk mencegah aplikasi crash jika state component sedang tidak aktif ketika melakukan callback, misal : ingin menampilkan pesan sukses dilayar (TextView) ketika AysncTask sudah selesai di eksekusi tetapi pada saat itu state Fragment tidak di attached ke dalam Activity jika hal ini tidak di handle dengan baik maka aplikasi akan menjadi crash. Bisa dibayangkan jika kalian mempunya 3 AsynTask dalam 1 komponen. 
Event Bus akan menyelamatkan Anda dari permasalahan diatas:


Pada data diatas terlihat setiap komunikasi ter-centralize dan setiap komponen di atas tidak saling berkomunikasi secara langsung. Ada 4 langkah untuk melakukan Event Bus:
  1. Definisikan Event
  2. Register Subscriber
  3. Post Event (Publisher)
  4. Receive Event
Berikut gambar detil dari 4 langkah diatas:
Post Event bisa dilakukan dari mana saja (activity, service dll) dan Event akan diterima kepada komponen yang men-subscribe event tersebut. Hmm cukup mudah bukan.

Untuk menggunakan konsep ini cukup mudah banyak contoh sample project github di internet yang bisa kalian pelajari. Berikut library open source yg cukup populer seperti :
  1. https://github.com/greenrobot/EventBus
  2. http://square.github.io/otto/
  3. https://github.com/google/guava/wiki/EventBusExplained
Selamat Mencoba!

Sumber

Friday, September 18, 2015

Android - Adaptive Color

Dengan rilisnya Android Lollipop, beberapa support libraries pun telah release. Salah satu library-nya adalah Palette API. Palette membantu kita untuk mempermudah mengekstrak warna yang menonjol dari gambar bitmap.

Google telah mempermudah kita untuk melakukan adaptive theming di Android berdasarkan warna dalam gambar dan sangat mudah untuk di implementasikan. Yang kita butuhkan adalah gambar bitmap dan Palette API. Dengan ini Android aplikasi kita bisa memiliki banyak warna sesuai dengan pedoman Material Design. Contoh seperti gambar dibawah:



Tambahkan dependecy di gradle anda:
compile 'com.android.support:palette-v7:21.0.0'
Untuk men-generate warna menggunakan Palette hanya berlaku untuk Bitmap. Dan dapat di generate secara synchronous dan asynchronous.
 // Synchronous
 Palette p = Palette.from(bitmap).generate();
 // Asynchronous
 Palette.from(bitmap).generate(new PaletteAsyncListener() {
     public void onGenerated(Palette p) {
         // Use generated instance
     }
 });
 


Secara default Palette object(Swatch) akan mencari 16 warna dari sebuah gambar dan ada 6 method untuk mendapatkan warna, yaitu:
Dan setiap Swatch memiliki method:
Catatan:
The different text colors roughly match up to the material design standard styles of the same name. The title text color will be more translucent as the text is larger and thus requires less color contrast. The body text color will be more opaque as text is smaller and thus requires more contrast from color. (source https://chris.banes.me/2014/10/20/palette-v21)

Oke, saya akan memberikan contoh penggunaannya:

1. Buat Activity dan desain layout seperti dibawah dan siapkan dua bawah gambar untuk kita dapatkan nilai warnanya.
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_marginBottom="10dp"
            android:orientation="vertical"
            android:background="@android:color/black"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="@dimen/abc_action_bar_default_height_material"
                android:title="@string/app_name"
                />
    
            <ImageView
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/gambar1"
                android:scaleType="fitXY"
                />
    
        </LinearLayout>
    
        <LinearLayout
            android:orientation="vertical"
            android:background="@android:color/black"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            >
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar2"
                android:layout_width="match_parent"
                android:layout_height="@dimen/abc_action_bar_default_height_material"
                android:title="@string/app_name"
                />
    
            <ImageView
                android:id="@+id/image2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/gambar2"
                android:scaleType="fitXY"
                />
    
        </LinearLayout>
    </LinearLayout>
    
    

2. Buka kelas Activity. Disini class saya bernama PaletteActivity


3. Hasilnya seperti ini:

Menarik bukan ? mau sesuatu yang lebih keren ? nantikan blog saya berikutnya. Sekian dan terima kasih.


Sumber:
https://chris.banes.me/2014/10/20/palette-v21/
http://blog.brightinventions.pl/playing-with-material-design-toolbar-palette/
http://code.tutsplus.com/tutorials/coloring-android-apps-with-palette--cms-24096

Android - Materialize your app

Android 5.0 Lollilop telah rilis dengan konsep desain baru yang bernama Material Design. Material design memberikan panduan bagaimana mengembangkan UI untuk visual, motion, action di dalam aplikasi. Jika kita ingin mengadopsi konsep ini, pertama - tama kalian harus membaca detail spesifikasinya yang bisa dilihat disini. Dan tantangannya adalah bagaimana kita mengadopsi Material Design dengan masalah utamanya adalah backward-compatibility.

Solusinya adalah menggunakan Android Design Support Library. Walaupun tidak semua spesifikasinya tersedia tetapi library ini menyediakan komponen - komponen utama Material Design untuk Android 2.1 ke atas.  Berikut daftar komponennya:

1. NavigationView
NavigationView membantu kita untuk menampilkan side navigation, widget ini memiliki 2 atribut penting, yaitu: app:headerlayout (menampilkan layout header) dan app:menu (menampilkan list menu). Berikut contoh penggunaannya:
Dan berikut cara menampilkan menu.

2. Floating Action Button
Floating Action Button berbentuk lingkaran dan menjadi primary action di tampilan layar. Berikut spesifikasinya:




Implementasinya seperti gambar dibawah.

3. Snackbar
Snackbar digunakan untuk quick feedback dan tampil dibawah layar.
Snackbar
Berikut contoh implementasinya.

3. Tabs
Tidak jauh berbeda dengan Tab menggunakan ViewPager. Tetapi dengan menggunakan Tabs komponen ini dan dikombinasikan ViewPager kalian bisa integrasi dengan komponen Collapsing Toolbar.
Tabs
Berikut contoh implementasi dengan integrasi ViewPager.


4. Floating Label dan EditText
Hint text di EditText akan hilang ketika pengguna mengetik karakter pertama. Sekarang kalian bisa membungkus TextInputLayout maka hint text tidak akan hilang melainkan menjadi Floating Label.
Berikut contoh penggunaanya.

Apakah hanya 4 komponen diatas bagaimana melakukan transisi seperti Meaningful Transition. Ya Android Design Support Library juga memberikan solusinya dengan menggunakan CoordinatorLayout, AppBarLayout dan CollapsingToolbarLayout. Berikut contoh penggunaannya:

UI yang dihasilkan kalian bisa lihat disini. Sebenarnya masih ada beberapa library yang lain seperti CardView, AppCompat v21, RecyclerView dan Palette. Yang akan saya bahas di blog berikutnya hehehe.


Download Android Design Support Library:
 compile 'com.android.support:design:22.2.0'

Sumber:
http://android-developers.blogspot.co.id/2015/05/android-design-support-library.html
https://www.google.com/design/spec/material-design/introduction.html
https://developer.android.com/design/material/index.html

Monday, June 22, 2015

Customize listview android

Pada blog kali ini saya akan membahas bagaimana customize listview di android.  List view adalah widget untuk menampilkan data dalam bentuk list yang dapat di-scroll.
  1. Langkah pertama buat new Android project.
  2. Pada activity.xml tambahkan komponen listview
  3. Create file list_item_adapter.xml
  4. Create class SampleAdapter
  5. Sisipkan code seperti gambar dibawah pada MainActivity.java 
  6. Langkah terakhir, jalankan di emulator:
Sekian blog singkat saya, semoga bermanfaat :)

Source code:
https://github.com/andywiranata/SampleCustomListview


Phonegap tutorial


Saya akan membahas pembuatan aplikasi mobile menggunakan hybrid teknologi yaitu Cordova. Cordova adalah tools untuk pengembangan aplikasi mobile menggunakan teknologi Web (HTML, CSS & JavaScript) dan cross platform development (ios, android dll) . Cordova juga menyediakan API untuk mengakases native device seperti camera / accelerometer. 

Berikut langkah - langkah untuk instalasi cordova dan sample app:
  1. Pastikan anda sudah menginstall nodejs, silahkan download di https://nodejs.org/
  2. Buka cmd dan jalankan instruksi ini :
    sudo npm install -g cordova
  3. Langkah berikutnya mari kita buat sample project :
    cordova create sampleApp com.nostratech.sample HelloWorld
    Setelah menjalankan instruksi diatas akan struktur folder seperti berikut:
    sampleApp/
        config.xml
        hooks
        platforms
        plugins
        www
            
  4. Tambahkan platform (ios, amazon-fireos, android dll), pada kali ini saya hanya menambahkan platform android:
    cordova platform add android

  5. Langkah terakhir mari kita build & jalankan di emulator android
    cordova build cordova emulate build
Sample App

Nah untuk melakukan development kalian bisa menaruh file js, html , css dan img di folder www.

Sekian blog dari saya :)

Sunday, March 15, 2015

Hibernate - Optimisasi query

Pada blog kali ini saya akan memberikan tips untuk meningkatkan performance Hibernate aplikasi.

Skenario :
Kita mempunyai tabel dengan Department(Master) dan Employee(Detail).
Pada aplikasi akan menampilkan semua data pada Master dan Detail. Jika aplikasi berjalan sangat lamban mungkin hal ini terjadi dikarenakan Hibernate mengeksekusi query yang tidak diharapkan. Hal ini terjadi dikarenakan relasi one to many atau one to one antar master dan detail. Pertama - tama kita lakukan konfigurasi hibernate.cfg.xml dengan menambahkan :

<property name="hibernate.show_sql" value="true" />

Jika di set true SQL statements akan ditampilkan di console.

Entity class Department :
 

package com.byteslounge.spring.tx.model;
import java.util.Set;
/**
 * Created by nostra on 1/14/15.
 */
import javax.persistence.*;

@Entity
public class Department
{
    @Id
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    @OneToMany(mappedBy = "eid",fetch = FetchType.EAGER)
    private Set<Employee> employeeCollection;
    private String name;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName( )
    {
        return name;
    }

    public void setName( String deptName )
    {
        this.name = deptName;
    }

    public Set getEmployeeCollection() {
        return employeeCollection;
    }

    public void setEmployeeCollection(Set employeeCollection) {
        this.employeeCollection = employeeCollection;
    }
}
Entity Class Employee:
 
package com.byteslounge.spring.tx.model;

import javax.persistence.*;

/**
 * Created by nostra on 1/14/15.
 */
@Entity
public class Employee
{
    @Id
    @GeneratedValue( strategy= GenerationType.AUTO )
    private int eid;
    private String ename;
    private double salary;
    private String deg;
    @ManyToOne
    private Department department;

    public Employee(int eid,
                    String ename, double salary, String deg)
    {
        super( );
        this.eid = eid;
        this.ename = ename;
        this.salary = salary;
        this.deg = deg;
    }

    public Employee( )
    {
        super();
    }

    public int getEid( )
    {
        return eid;
    }
    public void setEid(int eid)
    {
        this.eid = eid;
    }

    public String getEname( )
    {
        return ename;
    }
    public void setEname(String ename)
    {
        this.ename = ename;
    }

    public double getSalary( )
    {
        return salary;
    }
    public void setSalary(double salary)
    {
        this.salary = salary;
    }

    public String getDeg( )
    {
        return deg;
    }
    public void setDeg(String deg)
    {
        this.deg = deg;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}
Java Code :
 
      List <department> listDeprt= sess.createQuery("from department").list();
             for(Department dept : listDeprt){
            for(Employee emp : dept.getEmployeeCollection()){
                //do Something
            }
        }

Hibernate akan mengeksekusi 1+ N (jumlah row di Department) select statement. 1 Untuk mendapatkan data Department dan N untuk Employee. Jika ada 20 data pada tabel Master maka hibernate akan mengeksekusi 1+20 select statement.

Dan untuk solusi ini adalah:

Pertama dengan menggunakan @BatchSize
@OneToMany(mappedBy = "eid",fetch = FetchType.EAGER)
@BatchSize(size = 10) 
private Set<Employee> employeeCollection;
Jika terdapat 20 data pada tabel master maka select statement yang dihasilkan adalah 3 statement, Keterangan:

  • Select statement untuk mendapatkan semua data Department(Master).
  • Select statement untuk 10 data pertama.
  • Select statement untuk 10 data selanjutnya.

Kedua dengan menggunakan @Fetch(FetchMode.JOIN)
  @OneToMany(mappedBy = "eid")
  @Fetch(FetchMode.JOIN)
  private Set employeeCollection;
Maka hibernate akan mengeksekusi satu query (join column) .


Sekian blog dari saya, semoga bermanfaat :)

Primefaces mendapatkan ID component

Pada blog hari ini saya akan menulis tentang Primefaces. Pada saat kita menggunakan komponen data seperti datagrid, datatabel, datalist dll dan sayangnya pada komponen data primefaces selalu men-generate id otomatis ke setiap komponen didalamnya. Padahal untuk kasus tertentu kita membutuhkan id tsb untuk diolah sesuai dengan kebutuhan kita. 

Nah dalam blog kali ini saya akan memberi tips untuk menyelesaikan masalah tersebut :D.

Berikut saya memiliki contoh menampilkan data menggunakan datatable component :




Pada gambar diatas saya menggunakan komponen outputtext untuk menampilkan data manufacturer ID dan mendefinisikan id komponen tersebut. Mari kita lihat dibrowser apakah id-nya sesuai dengan keinginan kita .

Dan primefaces men-generate id menjadi j_idt5:t1:0:_id . Untuk menyelesaikan kasus ini saya membungkus component primefaces dengan native html yaitu <div> serta sedikit menggunakan javascript. Berikut solusinya : 


JavaScript Code :


Ide dasar pada gambar diatas adalah setiap user klik tombol button akan memanggil method javascript yang berfungsi mencari id yang ada didalam <div>. Jika id ditemukan akan memanggil remote command component untuk mempassing value ke bean. Mari kita coba :


Pada gambar diatas ketika saya klik button onClick maka kita akan mendapatkan id j_idt5:t1:0:_id. :)


Sekian blog dari saya semoga bermanfaat :D







Tuesday, December 16, 2014

Tutorial Django Administration Site

Django adalah web framework yang berbasis python dan menggunakan arsitektur MTV (Model View Template). Model adalah layer yang digunakan untuk berinteraksi dengan database, Template adalah layer presentasi untuk HTML, XML dan lainnya, sedangkan View adalah layer yang menjelaskan bagaimana data ditampilkan, data didapat dari model dan dikirimkan ke dalam template. 
Django Framework memeliki kelebihan-kelebihan sebagai berikut:
  1. Objet-Relational Mapper
  2. Automatic Admin Interface
  3. Template System
  4. Cache System
  5. Internatiolization
Pada blog kali ini saya akan menggunakan 2 kelebihan dari Django yaitu Automatic Admin Interface dan Object-Relational Mapper. 

Sebelum kita mulai pastikan anda sudah install Django 1.6.5 di komputer anda :D. Installation guide bisa klik disini. Serta database yang digunakan secara default menggunakan SQLite.
  1. Langkah pertama buka command line, cd ke diretkori dimana anda akan menyimpan django code.
    • Jalankan command django-admin.py startproject demoBlog
    • startproject akan membuat file dan folder seperti dibawah:
      demoBlog/
          manage.py
          demoBlog/
              __init__.py
              settings.py
              urls.py
              wsgi.py
  2. Jalankan command ./manage.py runserver dan buka url http://localhost:8000/.
  3. Pada langkah sebelumnya kita berhasil membuat project django, Sekarang kita akan membuat app. App adalah web aplikasi yang melakukan tugas spesifik (contohnya : Contact System). Sedangkan project kumpulan dari konfigurasi dan app
    • Jalankan command python manage.py startapp employee
    • startapp akan membuat file dan folder seperti dibawah:
      employee/
          __init__.py
          admin.py
          models.py
          tests.py
          views.py
  4. Buka file employee/model.py dan isi seperti dibawah:
  5. Register app employee yang sudah dibuat. Buka file demoBlog/setting.py
     
  6. Jalankan command  python manage.py sql  employee. SQL berdasarkan atribut dari class Contact pada file model.py.

  7. Jalankan command  python manage.py syncdb . Dan anda diharuskan mengisi username dan password yang digunakan untuk login ke Administration Site sebagai administrator.
  8. Buka employee/admin.py dan isi seperti dibawah:
  9. Buka http://localhost:8000/admin/ dan login.
  10. Klik Contact.
  11. Untuk memperindah halaman Contact, buka kembali admin.py dan isi seperti dibawah:
  12. Tampilan halaman Contact akan berubah seperti gambar dibawah:



Sekian blog dari saya semoga bermanfaat :).

Referensi:
http://www.djangobook.com/en/2.0/index.html
https://docs.djangoproject.com/en/1.6/