Saturday, October 5, 2013

Action dan Filter Hook pada Wordpress


Wordpress adalah CMS yang paling powerful saat ini menurut saya, tapi masih sedikit developer yang saya kenal yang fokus pada CMS ini. Sudah hampir setahun ini saya mempelajari wordpress. Banyak yang sudah saya pelajari dan saya rasa masih banyak lagi yang harus dipelajari dari CMS ini. Setiap kali membaca codex, selalu ada cara yang berbeda yang biasa dilakukan. Hal yang paling sulit menurut saya adalah ketika pertama kali mempelajari lingkungan kerja yang tidak "umum" pada CMS ini. Artikel yang Anda baca ini merupakan artikel kedua saya tentang Wordpress yang saya sharing pada BisaKomputer.com. Saya pernah menulis bagaimana translasi bahasa pada Wordpress yang dapat Anda lihat di sini. Beberapa artikel lain tentang Wordpress juga akan saya share untuk para pembaca BisaKomputer kedepannya.
Artikel ini merupakan dasar dan sekaligus bagian paling penting jika hendak bekerja dengan plugin dan theme Wordpress. Bagian penting yang saya maksud adalah action dan filter Aordpress. Action dan filter ini merupakan sebuah cara yang disediakan oleh Wordpress bertujuan untuk "hook into" ke sistem core Wordpress. Kedua hal ini jika dalam codex, masuk dalam bahasan Plugin API.
Wordpress mengenalkan action dan filter, bertujuan mengikutsertakan kode yang kita buat untuk dieksekusi pada titik-titik yang telah ditentukan. Kedua cara ini hampir sama untuk dipahami, oleh sebab itu banyak developer yang baru belajar Wordpress sukar untuk dapat membedakannya. Pengalaman saya, dengan memahami kedua hal ini, semua tutorial dan dokumentasi yang diberikan oleh para top-developer akan dengan mudah kita ikuti. Berikut ini saya berikan beberapa penjelasan tentang perbedaan kedua jenis hook ini dalam Wordpress.

Actions Hook

wordpress-hook
Bagian ini sebenarnya memang sangat mudah untuk dipahami, tapi juga sangat sulit untuk dijelaskan. Berikut adalah beberapa definisi bagus tentang action hook:
Action hooks are essentially placeholders. Wherever an action hook is placed, it will execute any code that has been "hooked" to it.
WordPress action hooks are a means of providing a way for other developers to insert their own code in specific locations within your code, in order to change or expand the functionality of your code.
Definisi pertama dijelaskan bahwa action hook adalah sebuah poin atau tanda yang kita letakkan pada sembarang proses dan nantinya akan mengeksekusi semua kode komputer yang kita kaitkan padanya. Pada definisi yang kedua dijelaskan bahwa dengan cara action hook inilah Wordpress mengikutsertakan developer-developer-nya untuk ikut menyisipkan kode-kode buatan mereka untuk diikutkan pada banyak "placeholder" yang telah disediakan oleh core Wordpress.
Action hook function reference
- has_action()
- add_action()
- do_action()
- do_action_ref_array()
- did_action()
- remove_action()
- remove_all_actions()
Ada 7 function reference action hook yang saya dapat dalam dokumentasi plugin API. Tapi yang akan sering kita temukan pada plugin atau theme sekarang adalah function do_action() dan add_action(). Fungsi do_action akan mengeksekusi semua hook action yang telah kita tambahkan dengan fungsi add_action. Kedua fungsi saling melengkapi, yang satu mengeksekusi proses yang diikutsertakan dan yang lain menambahkan proses untuk diikutsertakan. Contohnya kita meletakkan sebuah poin action dengan tag 'before_checkout_product'. Misalkan kita menginginkan agar sebelum proses checkout produk dieksekusi, mungkin ada developer lain yang ingin mengikutsertakan proses lain (hook) disini. Maka skenario kode yang akan kita buat akan tampak seperti ini:
$cart=["product_id1"=>1,"product_id2"=>2];

$customer=["name"=>"Mustofa","email"=>"...", ...];

do_action("before_checkout_product",$cart,$customer);

checkout();
Untuk lebih memahami do_action diatas saya sarankanu untuk membaca dokumentasinya di sini. Pada parameter pertama adalah nama tag action yang ingin Anda eksekusi, sedangkan parameter selanjutnya, kedua, ketiga dan seterusnya adalah arguments yang bisa Anda lewatkan pada fungsi hook yang developer lain dapat mengakses. Cukup simple bukan, dengan cara seperti inilah Wordpress bekerja. Ada banyak poin-poin action hook yang dibuat oleh core Wordpress, Anda dapat menemukan semuanya pada codex atau pada website Adam R Brown di sini.
Sekarang untuk mengkaitkan kode yang kita buat pada action hook 'before_checkout_product', kita dapat melakukannya dengan menggunakan fungsi add_action().
add_action('before_checkout_product',function($cart,$customer){

notify_admin($cart,$customer['email']);

},10,2);
Kita dapat meletakkan action hook diatas pada sembarang tempat pada function.php atau pada plugin wordpress kita. Kalau Anda membaca dokumentasi tentang fungsi ini, maka Anda akan mendapati bahwa ada 4 arguments yang diterima fungsi ini yaitu tag, fungsi callback, prioritas, dan jumlah arguments yang diterima fungsi callback.
add_action( $tag, $function_to_add, $priority, $accepted_args );
Argument prioritas(ketiga) secara default bernilai 10, ini artinya hook yang kita buat akan dieksekusi setelah fungsi hook bernilai 1,2,3,...,9 selesai dieksekusi. Sedangkan argument keempat secara default bernilai 1, ini artinya ada 1 arguments yang harus diikutkan oleh fungsi callback.  Pada tag 'before_checkout_product' ada 2 variabel yang diikutkan($cart dan $customer), maka pada argument keempat ini, harus kita isi dengan nilai 2.

Filter Hook

Filter hook ini sama mudahnya dipahami. Alasan kita memakai filter hook adalah memodifikasi sebuah nilai, memfilter sebuah nilai atau juga mereplace sebuah nilai dengan nilai baru. Sama seperti action hook, disini juga ada fungsi yang memfilter sebuah nilai dengan fungsi-fungsi filter hook yang dikaitkan (apply_filter) dan juga ada fungsi wordpress untuk menambahkan filter hook untuk dikaitkan (add_filter). Contohnya seperti kita memiliki sebuah fungsi dengan nama email_notify yang tampak seperti ini:
...
$message='Dear Mustofa, Bisakomputer telah memperbarui tampilan website menjadi responsive website. Sekarang Anda dapat membuka bisakomputer.com dengan memakai beberapa device mobile yang Anda gunakan.';

$message=apply_filter('email_notify_message',$message);

wp_mail( $to, $subject, $message, $headers, $attachments );
Dari kode diatas, kita menginginkan nilai sebuah variabel $message dapat difilter oleh developer lain. Difilter disini, bisa bermaksud mengganti nilai message, menambahkan sesuatu ke message dan lain-lain. Kemudian kita mendefinisikan apply_filter dengan tag 'email_notify_message' untuk memfilter, memodifikasi, atau mereplace nilai $message dengan filter hook yang dikaitkan pada 'email_notify_message'. Core Wordpress banyak menyediakan filter-filter tag yang dapat mengubah nilai varibel pada pemrosesannya. Kita dapat menemukannnya pada dokumentasi codex atau link berikut di sini.
Sama seperti action yang memanfaatkan fungsi add_action, kita dapat memanfaatkan add_filter untuk menambahkan filter fungsi buatan kita dengan cara seperti ini:
add_filter('email_notify_message',function($message){

// Mengganti nilai message
$new_message ='Hello Mustofa, bla..bla..bla';

// Menambahkan nilai message
$new_message = $message.' Salam bisakomputer.com';

return $new_message;

});
Yang perlu kita perhatikan disini adalah fungsi filter hook mengembalikan sebuah nilai. Pada add_filter juga terdapat 4 arguments yang bisa dimasukkan yaitu tag filter, fungsi callback, prioritas dan terakhir jumlah arguments yang diikutkan.
add_filter( $tag, $function_to_add, $priority, $accepted_args );
Filter hook ini banyak dipakai oleh developer theme Wordpress agar theme buatannya dapat dibuat child theme. Berikut adalah fungsi-fungsi referensi Wordpress untuk keperluan filter hook ini.
Filter hook function reference
- has_filter()
- add_filter()
- apply_filters()
- current_filter()
- merge_filters()
- remove_filter()
- remove_all_filters()

Penutup

Baik action dan filter penting harus kita pahami untuk menjadi developer Wordpress. Perbedaan fungsi hook action dan filter adalah fungsi hook tidak perlu mengembalikan nilai sedangkan fungsi hook filter mengembalikan nilai. Dengan memahami kedua hal ini, menurut saya, kita akan cepat menguasai Wordpress dan kemudian membuat plugin dan theme sendiri. Oke, demikian artikel ini. Ada banyak hal yang ingin saya share tentang Wordpress di BisaKomputer ini dan kalau memang ini bermanfaat bagi teman-teman, saya harap Anda dapat meninggalkan sebuah komentar disini :)

* Artikel ini pernah diposting bisakomputer.com tertanggal September 12, 2012 

Android Dev. For Dummy II: Activity

Kenapa activity ini dinamakan activity?. Dan apakah yang dimaksud activity ini sama dengan kata aktivitas pada bahasa kita?. Apa yang kita pahami dari sebuah kata aktivitas, definisi yang sama juga istilah activity pada pemrograman android. Aktivitas adalah kerja, atau salah satu kegiatan kerja yang dilaksanakan dalam tiap bagian dalam perusahaan. Ini merupakan definisi umum yang saya ambil dari situs artikata.com.



Sedangkan definisi activity pada dokumentasinya adalah "An activity is a single, focused thing that the user can do". Fokus pada apa yang dilakukan user/kerja user. Apa dikatakan sama tapi dengan bahasa yang berbeda, menurutku sih :P_. Banyak dari temen2 developer yang baru belajar, masih mengalami kesulitan memahami ini. Yah itu mungkin karena mereka langsung menulis kode-kode contoh program tanpa membaca dokumentasi untuk memahami apa yang sebenarnya mereka tulis. Disini mungkin akan saya tulis beberapa penjabaran (bukan contoh atau tutorial) mengenai sebuah activity pada pemrograman android.

Ketika kita melakukan sebuah aktivitas, maka minimal akan ada hal berikut ini:
1. Kapan atau ketika ada aksi apa, aktivitas mulai dilakukan (action).
2. Bagaimana cara kita memanggil aktifitas (intent).
3. Bagaimana aktivitas dilakukan (lifecycle activity).

Activity pada android dibentuk dengan menjawab minim ketiga pertanyaan diatas. Itu artinya kita harus mendefinisikan ketiga atribut ini ketika membuat sebuah activity. Apa yang saya tulis disini akan saya batasi untuk ketiga hal ini saja. Sebenarnya ada beberapa bahasan lagi tentang activity, tapi dilain kesempatan saja mungkin akan saya tulis :))_.

1. Action

Action pada activity lebih menjawab pertanyaan, aksi apa sebuah activity dilakukan. Yah kalo kita bermaksud melakukan sebuah aktifitas, pastinya ada sesuatu hal sehingga kita melakukan itu bukan!!. Nah action disini sama seperti itu :D_. Sebuah activity dipanggil bisa darimana saja bukan!! karena hal inilah tujuan digunakan action. Kita mendefinisikan action-action apa saja yang dapat di handle oleh activity yang kita buat.

Untuk mendefinisikan action, kita melakukannya dibagian intent, melalui method setAction dan getAction. Kita bebas memberikan nilai apa saja, tapi tentu saja ada beberapa dan mungkin banyak (saya belum tahu keseluruhan) dari action-action dari seluruh activity (yang sudah ada pada) sistem android. Contoh action-action android yang biasa kita pake:


Contoh kalo kita mau menelepon seseorang maka yang akan kita buat adalah,

public static final String ACTION_CALL = "android.intent.action.CALL";
Intent phoneIntent = new Intent();
phoneIntent.setAction(ACTION_CALL);


contoh lain lagi kalau kita mau memanggil semua activity yang meng-"handle" kirim message email,

public static final String ACTION_SEND = "android.intent.action.SEND";
Intent emailIntent = new Intent();
emailIntent.setAction(ACTION_SEND);
emailIntent.putExtra("android.intent.extra.EMAIL", new String[] { emailAddress });

Ada yang beda disini, action ACTION_SEND bukanlah action spesifik untuk memanggil activity kirim email. Dia sebenarnya general action untuk activity-activity untuk mengirim pesan keluar tidak hanya email, maka dari itu kita memberikan informasi yang memberikan detail mengenai intent yang kita buat, dengan kita memberikan sebuah extras.

Membuat sebuah action mudah dilakukan, cek link berikut ini untuk dokumentasi pemberian nama dari action yang kita buat.

For actions you define, it's best to use the package name as a prefix to ensure uniqueness. For example, a TRANSMOGRIFY action might be specified as follows:
<action android:name="com.example.project.TRANSMOGRIFY" />

2. Intent

Di artikel sebelumnya saya sudah nulis beberapa hal mengenai intent. Saya menulis beberapa hal yang harus kita pahami dari intent android. Yang mau saya tambahkan disini mengenai intent-filter. Biasa kita temukan di file manifest, bukan!!. #eh iyah tapi sebelumnya ada beberapa atribut selain action pada intent. Atribut intent itu seperti data, extras, category dan flag. Data disini merupakan data yang kita berikan pada intent, contohnya kalau intent ACTION_EDIT maka kita memberikan data dokumen apa yang akan kita edit, atau intent ACTION_CALL maka data yang harus kita berikan tentunya nomer telpon. Extras merupakan key-value sebagai additional information intent, sedangkan category berisi informasi mengenai komponen (activity) seperti apa yang akan meng-handle intent ini. Ada beberapa category disini, diantaranya adalah,



sumber: http://developer.android.com/guide/components/intents-filters.html

intent-filter. apa tujuan kita mendefinisikan intent-filter pada activity?? Kita mendefinisikan intent-filter disini untuk memberitahu sistem android bahwa action-action apa saja yang dapat di-handle oleh activity ini. Tujuannya sih juga agar aplikasi lain dapat memanfaatkan activity yang kita bikin. Yah dengan membuat intent dan spesifik action yang kita bikin, aplikasi lain dapat menggunakannya. Ehhmmm bukan itu aja sih tujuannya. Banyak action pada sistem android, dan itu terbagi menjadi beberapa category seperti yang saya tulis diatas. satu action yang harus ada pada aplikasi adalah ACTION_MAIN dengan category-nya LAUNCHER. Action ini adalah saat pengguna android, menekan icon aplikasi pada halaman menu. Action ini harus ada karena memang semua aplikasi yang kita bikin, pastinya akan ada pada halaman menu, right!!!.

<activity android:name="com.uin.messager.ui.ContactList">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
     <intent-filter>
      <action android:name="android.intent.action.CREATE_SHORTCUT" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
...
</activity>

3. Lifecycle activity

Semua yang hidup pasti punya lifecycle!!! ya iyalah namanya aja life+cycle :D_. Activity disini juga punya lifecycle. kalo yang ini tidak ada cara lain, kita harus membaca "buku manual" untuk memahaminya. Sama seperti kita, manusia, kita diberi "buku manual" yang senantiasa kita baca untuk hidup karena memang itu dari pencipta kita.
Yang harus kita ketahui disini adalah kapan sistem android mengeksekusi activity dan apa yang dilakukan kemudian. lanjut lagi kapan sistem menghentikan aplikasi dan apa yang kemudian dilakukan activity. contoh lainnya, apa yang kemudian dilakukan activity ketika sistem android mengalami low memory. Pertanyaan disini lebih kepada apa yang dapat dilakukan activity ketika ada event pada sistem android. Yah semuanya itu dapat kita aksees dengan adanya lifecycle activity. Berikut lifecycle diagram untuk activity,



oke, manual dokumentasinya disini, silahkan membaca yak :))_.


public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }

    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }

    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }

    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}


Activity pasti memiliki ketiga hal yang sudah saya tulis diatas. tapi ada satu lagi yang penting dari sebuah activity ini, yaitu View. View ini tidak dapat berdiri sendiri, dia masih memerlukan komponen (activity). Yah ini sama seperti wujud kongkretnya dari activity. Ada banyak macam class View yang dapat kita gunakan, dan insyaallah akan saya tulis di artikel berikutnya.

To be continued...

Monday, September 23, 2013

Android Dev. For Dummy I: Intent


Satu hal yang saya syukuri adalah saya "pembelajar" yang baik, yahh walaupun saya tidak dapat melakukan segala sesuatunya dengan baik tapi saya sangat baik ketika mempelajari sesuatu, terutama dalam bidang pekerjaan saya, computer programming. Hmmm bentar2, saya kok ingat pepatah "kurang tepat disebut sebagai pembelajar yang baik, karena hanya ada pembelajar yang sungguh-sungguh". Enngggg... yah udah lah saya dak mau mendebat pepatah ini, tapi memang saya termasuk orang yang sangat sungguh-sunggu belajar untuk dapat pemahaman. So what?? yaa ini hanya sekedar pembuka saja, kurang #greget kalo to the point, dan mungkin saja ada someone yang peduli tentang saya heuheuheu. 

Sebenarnya saya ingin nulis tentang pemahaman (hasil semedi) saya tentang android programming selama ini. Saya sebut "pemahaman", bukan "pengetahuan" karena memang untuk mendapat hasil yang baik kita harus "paham", bukan hanya sekedar "tahu" #supeerrr.  

Semua hal, apapun itu akan kelihatan rumit ketika baru pertama kali mempelajarinya, right?? istilah baru, teknologi baru, konsep pemrograman baru dan baru-baru lainnya. Tapi ada beberapa saran bagi para pembelajar nih, beberapa saran ini juga saya lakukan untuk belajar pemrograman komputer. Yang pertama, susun beberapa prioritas utama yang "harusnya" dipelajari pertama kali. belajar terus sampai paham dari tiga saja prioritas pertama tadi. Kedua, Carik dan pahami kenapa "sesuatu" itu dinamakan atau diistilahkan "A" atau "B", coz si pembuat "sesuatu" itu pastinya juga mikir gimana caranya ngasih tahu orang dengan hanya pakek "nama". Dan yang ketiga, buat penjelasan yang sangat2 sederhana dari kata2 yang sederhana dan dengan bahasa sendiri. yah ini untuk nyimpulkan aja apa kita benar2 paham atau tidak. kalo kita tidak dapat mengartikan secara sederhana, itu artinya kita menganut paham vickisme, dan itu dak baek untuk jiwa dan raga heuheuheu. Kok banyak banget yah pembukanya, padahal pengen nulis tentang android #hadee. Okelah kita masuk ke intinya kalo gitu.      

Tiga pokok bahasan jadi prioritas pertama untuk mempelajari pemrograman android, yaitu intent, activity dan view - ini menurutku sih, so kalo emang ada yang beda, yaah dak usahlah ngajak berantem :)_. Pun dengan memahami ketiga bahasan ini, kita masih belom bisa membuat aplikasi dengan hasil yang bagus, tapi aplikasi android apapun rasanya, apapun bentuknya pasti tidak akan melupakan ketiga bahasan ini. So, mari kita mulai:

Apa itu intent?

Pernah denger kata "the power of intention" atau mungkin sebuah quote "A good traveler has no fixed plans, and is not intent on arriving". Apa arti intent itu disini, dan apa yang dimaksud intent pada pemrograman android platform. Hal pertama yang biasa saya lakukan adalah mencari tahu istilah dari sisi bahasa/arti katanya.

Saya lebih suka mengartikan intent dalam pemrograman android ini sebagai "maksud" | "purpose". Maksud saya seperti "ini", saya ingin seperti "itu", yah hanya sebatas "maksud" dan "ingin". Contohnya seperti ini: "Saya memiliki vCard contact, dan saya ingin melihatnya", contoh lain "Saya ingin membuka dan melihat alamat URL ini", contoh lain lagi "Saya ingin melihat gambar ini, pada aplikasi Image Viewer ini". Sampai disini Intent ini tidak ada gunanya, dia "useless", yaaah sama seperti kita jika hanya ingin ini ingin itu banyak sekali, yaah pasti sulit untuk "move on"-nya heuheuheu. Makanya kemudian ada yang namanya "activity", untuk mewujudkan apa kita punya intent :)_. Nah kan dari sini udah kelihatan hubungannya.

Saya coba googling untuk mengetahui beberapa definisi intent dari beberapa temen2 developer dan saya pikir beberapa kurang tepat untuk menjelaskan apa itu intent. Contoh definisinya seperti ini : 

Kalau pendapat saya, intent itu adalah sebuah object yang merupkan Kunci  untuk berkomunikasi dengan activity lainnya.

Dan ada juga definisi menurut paham #vickisme

Intent adalah pesan asynchronous yang memungkinkan aplikasi untuk memberikan request secara fungsionalitas dari komponen yang berbeda di sitem android, misalnya Service, broadcast receiver atau Activity.

Dalam prakteknya sih, intent bisa digunakan melempar data dari satu activity ke activity lainnya. Sebenarnya sih intent bukan untuk "komunikasi", dia hanya sebatas menyatakan "maksud". Sama seperti #KatakanCinta -lah, kira-kira begitu :)).

Intent terbagi menjadi dua, implisit dan eksplisit. Dalam arti bahasa saja (tidak pake lihat dokumentasi), kita sudah mengetahui apa itu "maksud" yang implisit dan apa "maksud" eksplisit. Contohnya gini. intent pertama, "Saya ingin mengirimkan sebuah pesan ke si Eneng". Intent kedua "Saya ingin mengirimkan pesan lewat BBM ke si Eneng". Nah coba lihat kedua intent itu, apa perbedaannya?_. Perbedaannya ada pada "activity" apa pesan itu harus dilewatkan. Yang pertama tidak menyebutkan "activity" apa, sedangkan yang kedua menyebutkan "activity" apa yang dia maksud. Nah kelihatan kan apa yang harus saya buat dengan intent. Yang pertama disebut implisit intent dan kedua disebut eksplisit intent. Berikut penjelasan teknis yang saya copas saja dari dokumentasinya, pasang kacamata pengaman yah, coz kata2nya akan sedikit banyak menyilaukan :))

There are two primary forms of intents you will use: 
Explicit Intents have specified a component (via setComponent(ComponentName) or setClass(Context, Class)), which provides the exact class to be run. Often these will not include any other information, simply being a way for an application to launch various internal activities it has as the user interacts with the application. 
Implicit Intents have not specified a component; instead, they must include enough information for the system to determine which of the available components is best to run for that intent.

Berikut contoh kodingan implisit intent dan eksplisit intent.

// Implisit intent
String url = "http://www.goocode.blogspot.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));

// Eksplisit intent
Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo"); 

Yah kira-kira sama saja apa yang saya tulis dengan bahasa teknis dokumentasi kayak yang diatas :)_. Untuk pembahasan lebih lanjut mengenai intent ini, saya tambahi nanti dibagian Activity. Tapi udahan dulu yah hehehe. Udah telat nih, janjian mau ngopi dan nonton bareng #IndonesiaPastiMenanggg...

#to be continued...

Sunday, September 22, 2013

MongoDB Part 3: Autosharding


Pada bagian tiga ini, saya akan coba menjelaskan tentang teknik sharding di MongoDB. Tapi sebelum itu, jika Anda belum tahu mengenai database ini, Anda dapat membaca dulu bagian I dan bagian II di Bisakomputer.

Sharding ini mengacu pada pembagian data ke beberapa komputer dengan porsi yang berbeda. Istilah lainnya mengenai sharding sama dengan partioning. Setiap penyimpanan data baik itu relational database maupun database NoSQL, akan selalu menyediakan fitur partioning data, ini beralasan karena dengan teknik ini dapat meningkatkan performanceavailability dan manageability data store.

Seperti yang saya katakan diawal artikel (bagian I), arsitektur MongoDB telah dirancang untuk kemudahan penerapan teknik ini. Sharding mongodb lebih dikenal dengan autosharding, ini karena beberapa urusan administrative telah otomatis dilakukan oleh mongodb, seperti menangani pembagian data ke beberapa cluster dan mengotomatisasi rebalancing data.

Arsitektur

Konsep dasar dari sharding adalah memisahkan collection ke dalam bagian-bagian kecil yang disebut chunksChunks ini kemudian didistribusikan ke server cluster yang disebut sebagai shard. Dengan begini masing-masing shard bertanggung jawab terhadap subset data yang disimpan. Setiap shard dapat direpresentasikan sebagai mesin dengan koneksi ke satu atau lebih service mongo (mongod). Dari sini tentunya kita berpikir bahwa akan ada lebih dari satu service mongod yang dibuat, sehingga pertanyaannya adalah client harus terkoneksi ke mana untuk mengambil dan store data?.

Dalam mengembangkan sebuah aplikasi, kita dapat men-setup aplikasi untuk langsung koneksi ke service MongoDB. Namun, dengan melakukan sharding, koneksi tidak secara langsung kepada tiap service. Menghubungkan aplikasi dengan shards cluster, bisa dilakukan dengan proses routing yang dinamakan dengan mongos (Gambar 2).

Gambar 1
men-setup aplikasi untuk langsung koneksi ke service MongoDB
Gambar 2
Menghubungkan aplikasi dengan shards cluster

mongos process dapat juga dikatakan sebagai abstraksi koneksi ke shards cluster. Client terkoneksi ke mongos yang kemudian diteruskan ke shards. Developer tidak perlu memikirkan perbedaan proses mongos dan mongod, karena dalam level development aplication mereka memiliki bentuk yang sama, sehingga tidak perlu mengganti kode aplikasi ketika memutuskan untuk scale up database.

Ada beberapa manfaat yang bisa diambil dengan melakukan teknik ini, diantaranya adalah:
  • Dengan teknik ini, Anda dapat merencanakan ukuran media penyimpanan data pada tiap shard yang Anda miliki.
  • Menulis data akan lebih cepat daripada hanya pada satu mongod.
  • Proporsi data yang bisa disimpan dimemori bisa lebih banyak, ini tentunya akan menambah performa pemrosesan data.

Setting Up Sharding

Ada tiga hal yang harus kita ketahui untuk menerapkan sharding database ini:
1. Shard
Seperti yang sudah saya sebutkan diatas, tiap server yang menyimpan bagian-bagian collection(chunks) disebut sebagai shard. Tiap shard bisa memiliki satu mongod atau mungkin bisa lebih dari itu. Walaupun bisa lebih dari satu mongod, tetap saja yang dijadikan master hanya satu, mongod-mongod yang lain hanya digunakan sebagai slave jika sewaktu-waktu terjadi trouble pada master-nya (replica set).
2. Mongos
mongos berfungsi sebagai proses route request dan kemudian mengumpulkan responses untuk client. Bagian ini tidak dapat menyimpan data, sehingga konfigurasi nantinya disimpan pada config server.
3. Config server
Pada config server ini, mongos akan berpedoman. mongos akan membaca ini tiap kali ada read dan write operation database.

Komponen
Komponen

Menjalankan mongos process

Pertama yang kita butuhkan adalah membuat config server. Ini perlu Anda buat terlebih dahulu karena mongos akan membaca konfigurasi yang Anda tulis disana. Untuk membuatnya sama seperti kita membuat proses mongod biasa:
$ mkdir -p ~/dbs/config$ ./mongod --dbpath ~/dbs/config --port 20000
Config server ini tidak banyak membutuhkan space data, estimasinya hanya butuh 1KB untuk tiap 200MB data. Setelah config server ini dibuat, kemudian Anda dapat membuat proses mongos dengan memakai konfigurasi ini.
$ ./mongos --port 30000 --configdb localhost:20000
Proses mongos dan config server-nya berjalan pada mesin yang sama. Mongos berjalan pada port 30000, sedangkan config server berada pada port 20000. Anda pun dapat membuat beberapa config server dan kemudian menjalankan proses mongos dengan multi config server tersebut. Untuk tahap production, disarankan menjalankan mongos ini dengan beberapa config server, karena jika salah satu down maka client masih bisa membaca dan menulis data.

Menambahkan shard ke mongos process

Pada praktek sesungguhnya tentunya kita sudah memiliki mesin-mesin lain yang siap kita jadikan shard cluster. Tapi pada praktek yang ditunjukkan ini, semuanya masih berjalan pada satu mesin lokal. Disini misal saya memiliki sebuah proses mongod yang juga saya jalankan pada komputer lokal.
$ mkdir -p ~/dbs/shard1 
$ ./mongod --dbpath ~/dbs/shard1 --port 10000
Proses mongod yang saya buat berjalan pada port 10000 dan semua berkas datanya diletakkan pada direktori ~/dbs/shard1, sehingga untuk menjadikannya salah satu dari shards cluster mongos adalah sebagai berikut:
Pertama pergi ke shell javascript mongos, pada contoh mongos berada pada port 30000.
$ ./mongo localhost:30000/admin 
MongoDB shell version: 1.6.0 
url: localhost:30000/admin 
connecting to localhost:30000/admin 
type "help" for help>
Kemudian jalankan perintah untuk memasukkan proses mongod pada port 10000 sebagai shards cluster.
> db.runCommand({addshard : "localhost:10000", allowLocal : true}) 
{"added" : "localhost:10000","ok" : true}
"allowLocal" berarti shard yang saya tambahkan boleh pada mesin yang sama dengan mongos process. Key ini sangat membantu ketika masih tahap development. Tapi ketika sudah sampai tahap production, Anda seharusnya sudah memiliki proses mongod yang berjalan pada mesin lain. Dengan command "addshard" seperti pada contoh diatas, Anda dapat menambahkan semua proses mongod yang Anda punya pada proses mongos.

Sharding Data

MongoDB tidak secara otomatis memecah data dan mendistribusikannya. Anda masih dapat menentukan data pada collection mana yang dapat dipecah dan di store ke cluster. Untuk menentukan itu bisa menjalankan perintah "enablesharding" pada database yang Anda punya dan perintah "shardcollection" pada collectionnya. Semisal saya menginginkan data yang ada di collection "book" dengan database "office" bisa dipartisi sesuai dengan "_id" nya
> db.runCommand({"enablesharding" : "office"}) 
> db.runCommand({"shardcollection" : "office.book", "key" : {"_id" : 1}})
Dengan perintah diatas, collection "book" akan dipartisi berdasar "_id" nya. Ketika saya menambahkan data pada collection tersebut maka secara otomatis partisi data akan dilakukan oleh MongoDB.

Demikian artikel ini berakhir, masih banyak tips-tips bagus mengenai sharding mongodb. Informasi lebih lengkap mengenai sharding Mongodb dapat anda baca pada link berikut ini.

Artikel ini pernah dimuat di BisaKomputer.com tertanggal 22 Juli 2012

MongoDB Part 2: Operasi Dasar Manipulasi Data


Tulisan ini merupakan kelanjutan dari MongoDB part 1: Pengenalan Document-Oriented MongoDB. Pada part 2 ini saya akan memberikan beberapa perintah-perintah dasar yang dapat Anda lakukan untuk manipulasi document pada mongoDB. Tapi sebelum itu, saya tulis juga tutorial singkat instalasi MongoDB pada platform Windows dan Linux.

Installing MongoDB

MongoDB tersedia untuk platform Windows, Linux, Mac OS X, dan Solaris. Anda dapat menemukan dan men-download mongoDB pada alamat resmi mongoDB. Instalasinya cukup mudah untuk diikuti, berikut adalah cara menginstall database ini pada Windows dan Linux

Windows Install
Download windows zip pada halaman download mongodb disini. Ada dua pilihan untuk windows, 32-bit dan 64-bit version. Pilih salah satu sesuai dengan komputer kerja Anda. Download dan kemudian ekstrak pada direktori komputer.
Sampai disini Anda sudah dapat menjalankan mongo server dengan mengetikkan perintah berikut pada command line :
> bin\mongod.exe
Secara default semua berkas file database Anda akan tersimpan pada sebuah folder C:\data\db. Namun, jika Anda telah menyiapkan folder lain, anda dapat mendefinisikannya dengan memberikan parameter –-dbpath.
> bin\mongod.exe --dbpath C:\Documents and Settings\Username\My Documents\db
Untuk menjalankannya sebagai sebuah service, Anda dapat memberikan parameter -install. Selanjutnya Anda dapat menjalankan atau menghentikan mongoDB pada control panel Windows Anda.
 > bin\mongod.exe --install
Linux Install
Untuk versi Linux dan Mac OS dapat juga anda temukan pada halaman download MongoDB. Download dan kemudian decompress .tar.gz yang Anda dapatkan.
$ tar zxf mongodb-linux-i686-1.6.0.tar.gz
Sama seperti Windows install, Anda harus menyiapkan sebuah folder untuk menyimpan berkas file database. Buat folder baru dan setting permissionnya agar folder writable oleh MongoDB.
$ mkdir -p ~/db
$ chown -R $USER:$USER ~/db
Setelah menyiapkan folder database Anda dapat menjalankan MongoDB dengan --dbpath folder database Anda.
$ cd mongodb-linux-i686-1.6.0
$ bin/mongod --dbpath ~/db

Shell client mongoDB

MongoDB dilengkapi dengan Javascript shell client untuk para administrator dalam memanipulasi data. Shell client ini dapat dijalankan dengan perintah berikut:
$ bin/mongo
Perintah diatas menghubungkan Anda dengan service mongod yang jalan pada komputer yang sama, tetapi jika service berada pada server lain, Anda dapat menambahkan alamat server dan port nya seperti ini:
$ bin/mongo db.mimicreative.net:20000
Yang menarik dari shell ini adalah fitur connect yang dapat menghubungkan anda ke beberapa server cluster yang Anda punya. Caranya pun sangat mudah, Anda hanya memanggil method connect() dan kemudian menyimpannya pada sebuah variabel.
> mongos = connect("localhost:27017") connecting to: localhost:27017 localhost:27017
> shard0 = connect("db0.mimicreative.net:30000") connecting to: db0.mimicreative.net:30000 db0.mimicreative.net:30000
> shard1 = connect("db1.mimicreative.net:30001") connecting to: db1.mimicreative.net:30001 db1.mimicreative.net:30001
Contoh diatas, menghubungkan anda ke tiga server cluster. Ketiga server cluster itu kemudian diwakili oleh tiga variabel mongos, shard0 dan shard1. Untuk ulasan lebih lengkap mengenai ini, akan saya tulis pada bagian ketiga dari artikel ini.

Creating Document

Membuat document pada mongoDB dapat dilakukan dengan memanggil method insert yang ada pada masing-masing collection.
> db.post.insert({});
Pada perintah ini, objectid (_id) akan secara otomatis di-generate dan ditambahkan pada document.

Removing Document

Menghapus document pada sebuah collection dapat dilakukan dengan memanggil method remove().
> db.post.remove();
Perintah ini akan menghapus semua document yang ada pada collection post. Perintah remove ini menghapus semua document tapi tidak dengan collection dan semua index yang telah ada. Anda juga dapat menambahkan beberapa kriteria sebagai parameter pada method ini, sehingga hanya kriteria yang sesuai yang akan dihapus.
> db.post.remove({"title":"MongoDB"});

Updating Document

Untuk mengedit sebuah document, dapat memanfaatkan method update() yang juga ada pada collection. Method ini menerima dua parameter, pertama query atau kriteria document dan kedua document yang sudah anda edit. Contoh kasus ketika Anda ingin menambahkan "slug", mengubah last_modifikasi dan menghapus field parent_post yang ada pada document post.
{
"_id": ObjectId("4b2b9f67a1f631733d917a7a"),
"title": "Mongodb part II", "parent_post" : ObjectId("4b2b9f67a1f631733d913a1a"), "last_modifikasi": "Sat Jul 14 2012 11:30:02 GMT+0700 (WIT)";"content": "Lorem ipsum dolor sit amet", "pageviews":1 }
Maka perintah yang dapat anda ikuti untuk melakukan itu semua adalah seperti ini:
> thepost=db.posts.findOne({"title":"Mongodb part II"}); > thepost.slug = "mongodb-part-II"; > delete thepost.parent_post; > thepost.last_modifikasi = new Date();> db.posts.update({"title":thepost.title},thepost);
Update Modifiers
Modifiers ini berupa beberapa specials key yang akan sangat membantu Anda dalam hal updating document. Banyak specials key yang dapat anda gunakan disini, tapi saya akan contohkan beberapa saja seperti $inc, $set dan $push.
Modifiers $inc bisa anda gunakan untuk increment data number, contohnya ketika Anda ingin increment post view pada document.
> db.posts.update({"title" : "Mongodb part II"}, {"$inc" : {"pageviews" : 1}});
Perintah update diatas akan membuat pageviews yang sebelumnya bernilai 1 menjadi 2. Modifiers yang kedua adalah $set, sesuai namanya modifiers ini digunakan untuk mengganti value pada key, tapi jika key tidak ada maka secara otomatis akan ditambahkan. Contoh ketika anda ingin memberikan atau mengganti key "author" pada document post.
> db.post.update({"title":"Mongodb part II"},{"$set" : {"author" : "mustofa"}});
Modifiers $set ini juga dapat mengakses key pada embedded document, semisal Anda hanya ingin mengubah key "name" pada document ini
{
"_id": ObjectId("4b2b9f67a1f631733d917a7a"),
"title": "Mongodb part II", "author":{ "website:"http://blog.uin-malang.ac.id/mustofa" "name":"john doe", "email":"goo.muse@gmail.com", } "content": "Lorem ipsum dolor sit amet", }
maka perintah yang harus Anda lakukan adalah
> db.posts.update({"author.name" : "john doe"}, {"$set" : {"author.name" : "mustofa"}})
Modifiers terakhir adalah $push. Modifiers ini menambahkan element pada value yang bertipe array. Jika key tidak ada, secara otomatis membuat key dan element yang baru di push menjadi element pertama. Contohnya seperti anda menambahkan "comment" pada document post.
{
"_id": ObjectId("4b2b9f67a1f631733d917a7a"),
"_id": ObjectId("4b2b9f67a1f631733d917a7a"), "title": "Mongodb part II", "comments"[ { "content":"...." "name":"john doe", "email":"doe.john@gmail.com", }, ... ] }
maka ketika Anda ingin menambahkan komentar baru, Anda dapat melakukannya seperti ini :
> db.blog.posts.update({"title" : "Mongodb part II"}, {$push : {"comments" :{"name" : "josh", "email" : "josh@gmail.com", "content" : "nice post."}}});
Cukup tiga modifier itu saja yang dapat saya berikan, dan tentunya banyak modifier yang harus anda pelajari untuk updating data document. Silahkan buka link ini untuk mempelajari semua modifier yang dapat digunakan updating data.

Read Document

Untuk membaca document MongoDB, Anda dapat mengandalkan dua method ini, find() dan findOne()Method find() mengembalikan array document sedangkan findOne() hanya mengembalikan document tunggal pada sebuah collection.
> db.posts.find();
Memanggil find() tanpa ada query yang dimasukkan, seperti pada perintah diatas, akan mengembalikan semua document yang ada pada collection tersebut. Melakukan query pada find() cukup simple untuk dilakukan. Misalnya Anda menginginkan semua document yang memiliki sebuah "title" dan ditulis oleh seorang "author", maka Anda dapat melakukannya seperti berikut:
> db.posts.find({"title":"Mongodb part II","author.name":"mustofa"});
Method find() dan findOne() sebenarnya memiliki dua parameter, yang pertama adalah query seperti contoh diatas, dan yang kedua adalah option output keys document. Jika anda tidak mendefinisikan parameter kedua ini, maka secara default semua key yang ada pada document output akan dimunculkan. Hal ini tentunya tidak bagus jika Anda hanya membutuhkan beberapa key dari document tapi yang muncul semua. Dengan mendefinisikannya, Anda dapat mengatur key apa saja yang akan di ikut sertakan dalam document output.
> db.posts.find({},{"title":1,"author":1});
Contoh perintah diatas melakukan query dan hanya key "title" dan "author" saja yang akan diambil sebagai keluaran pada document.
Banyak operator yang dapat Anda gunakan untuk melakukan query document. Operator apa saja yang dapat dipakai untuk melakukan query, dapat Anda baca pada disini. Tapi disini tiga operator saja yang akan saya sebutkan.

Operator pertama adalah $in. Query dengan operator ini, akan mengembalikan semua document yang cocok dengan elemen-elemen yang diberikan padanya. Contoh pemanfaatannya semisal anda ingin mengambil semua document dari author john doe, josh, dan jeni, maka perintah yang dapat dilakukan adalah seperti ini:
> db.posts.find({"author.name":{$in:["john doe","josh","jeni"]}});
Operator yang kedua adalah $or. Operator ini memiliki fungsi yang sama dengan $in, bedanya $in melakukan fungsi OR hanya pada satu key dan $or melakukannya pada lebih dari satu key. Contohnya, mengambil semua document yang "created" dan "last_modified" pada hari ini, maka dapat dilakukan dengan:
> db.posts.find({$or:[{"created": new Date()},{"last_modified": new Date()}]});
Terakhir yaitu operator $not. Operator ini kebalikan dari $in, dimana akan mengembalikan document yang tidak termasuk pada elemen-elemen yang ada padanya. Contohnya anda ingin mengambil semua document kecuali document dengan author josh dan john doe, maka perintah yang dapat anda lakukan adalah:
> db.posts.find("author.name":{$not:["john doe","josh"]});

Kesimpulan

Sebenarnya masih banyak bahasan pada topik ini. Semua itu harus dipelajari jika anda memilih menggunakan database jenis ini. Anda dapat menemukan semuanya pada dokumentasi yang sudah disediakan oleh mongodb pada link ini.

Pada part 3 yaitu part terakhir dari tulisan ini, saya akan mengulas sharding process dalam rangka mempartisi data ke beberapa mesin di MongoDB.

Artikel ini pernah dimuat pada BisaKomputer.com tertanggal 16 Julai 2012