Baru mengaplikasikan teknik yang menurut gw pribadi cukup unik, yaitu optimasi eksekusi kode branch/conditional pada aplikasi yang punya main loop.
Misalkan gw punya aplikasi dengan potongan kode demikian:
Katakan method someMethod() dipanggil di dalam main loop. Method diatas tampak simpel, namun dari hal yang simpel tersebut mengandung potensial problem, khususnya ketika programmer melakukan salah ketik (katakanlah ia menulisnya "Login", bukan "login"). Sebenarnya dengan ketelitian yang tinggi, salah ketik bisa dihindari, namun manusia tetap manusia, sehingga kasus seperti ini, sebaiknya diserahkan ke komputer, seperti pada gambar berikut:
Pada gambar diatas, string di parse dengan parseEnum(String pInput) menjadi Enum Action. Dengan penggunaan enum, jadi dapat menggunakan switch, dan kesalahan typo akan mengakibatkan compile error. Compile error ini yang dimaksud menyerahkan ketelitian ke komputer.
Btw, anggap aja isinya parseEnum(String pInput) sudah benar ya, meski diatas hanya mengembalikan Unknown terus, hehe.
Pada realnya, someMethod1() isinya bisa sangat panjang, dan semakin panjang method, akan semakin sulit untuk dibaca oleh orang lain. Oleh karena itu, dapat dioptimasi lagi menjadi berikut:
Pada gambar diatas, diciptakan kelas abstract ActionWorker, yang nantinya akan memiliki kelas turunan yang bersesuaian dengan action yang ada. Pada optimasi ini, bahkan branching sudah tidak ada lagi di badan someMethod2(), sudah terenkapsulasi pada ActionWorker.ActionWorkerFactory(Action pInputEnum). someMethod2() menjadi sangat pendek jika dibandingkan dengan someMethod1().
Namun meski terenkapsulasi, branching SWITCH yang ada tetap terpanggil setiap kali loop. Apabila 1 detik terdapat 100 loop, akan terpanggil 100 kali. Optimasi selanjutnya adalah untuk mengurangi pemanggilan loop menjadi hanya 1 kali. Ya, terdapat cara untuk mengurangi menjadi hanya 1 kali, meski sebenarnya perlu dipanggil setiap loop.
Contohnya dapat dilihat pada gambar berikut:
Pada gambar diatas disertakan lagi enum Action, karena telah diubah sedikit, yaitu dengan menambahkan member mIntValue, konstruktor yang menerima parameter integer, dan method getIntValue()
selain itu, ditambahkan member ActionWorker[] mWorkers yang diinisiasi pada method init(). Method init() itu perlu di-invoke sekali sebelum main loop. Hasilnya, jadilah someMethod3()
sekilas someMethod3() mirip dengan someMethod2(). Bedanya terletak pada pen-assign-an tAppropriateWorker. Method someMethod3() hanya melakukan pengaksesan element pada suatu array, sedangkan method someMethod2() melakukan branching. Dengan begini, tidak ada lagi pemanggilan SWITCH pada main loop, yang digantikan dengan mengakses element array.
Sempet lakuin percobaan kecil-kecilan. Di java, branch dengan 1 kondisi lebih cepat daripada pengaksesan element array. Tapi mulai dari 2 kondisi dan seterusnya, pengaksesan element array lebih cepat. Selain itu, pengaksesan element array memiliki waktu konstan berapapun jumlah array yang ada, antara berisi 1 element dengan 1000 element, apabila diberikan index-nya, waktu aksesnya akan tetap.
Kalo ada yang kurang dimengerti, atau ada kesalahan, please kindly inform me by email, and thanks before. Semoga bermanfaat
Showing posts with label HowTo. Show all posts
Showing posts with label HowTo. Show all posts
Sunday, June 5, 2011
Friday, June 3, 2011
Tunneling dengan SSH
Pengen nambah postingan tentang Linux, HowTo dan Tools, hehe. Umum aja sih, mungkin sebagian besar orang sudah tau, mungkin juga belum. Yaitu tentang tunneling dengan SSH.
Prerequisite: tau apa, kenapa, gimana SSH. Kalo ga tau, googling banyak pasti. Kalo males googling, email aja ke gw.
Tunneling sendiri sebenarnya sangat dalam pengertiannya dan maksudnya, tapi kalo dari pengalaman pribadi, tunneling paling sering digunakan untuk forwarding.
Misalkan ada suatu jaringan LAN yang menghubungkan banyak Linux komputer sekaligus, dan satu komputer di LAN tersebut memiliki IP public internet. Katakan IP lokalnya 192.168.10.10. Pada jaringan tersebut, terdapat 1 komputer lain (tidak punya IP public) yang didalamnya terinstall MySQL. Katakan IP-nya 192.168.10.15
Kita ga bisa nih, akses si 10.15, karena ga punya IP public, sedangkan 10.10 bisa kita akses. Hal ini dapat disiasati dengan tunneling ke 10.15 melalui 10.10.
Caranya gimana? cukup dengan SSH ke 10.10, tapi dengan command tambahan, sehingga jadinya seperti berikut:
ssh root@256.13.14.267 -L10000:192.168.19.15:3306
mari kita liat command tambahan "-L10000:192.168.19.15:3306". Sebenarnya command disamping memiliki format demikian:
-L::
Jadi dengan perintah diatas, seseorang dapat mengakses MySQL di 19.15 dengan cara konek ke localhost post 10000!! Dengan perintah diatas, setiap kita mengakses port 10000 di local, seolah olah kita menjadi 10.10 yang mengakses komputer IP 19.15 port 3306. In my opinion, tunneling is quite cool actually, hehe
Enaknya lagi, tunneling juga bisa dilakukan programmatically, but that is for another story.
Semoga bermanfaat
Prerequisite: tau apa, kenapa, gimana SSH. Kalo ga tau, googling banyak pasti. Kalo males googling, email aja ke gw.
Tunneling sendiri sebenarnya sangat dalam pengertiannya dan maksudnya, tapi kalo dari pengalaman pribadi, tunneling paling sering digunakan untuk forwarding.
Misalkan ada suatu jaringan LAN yang menghubungkan banyak Linux komputer sekaligus, dan satu komputer di LAN tersebut memiliki IP public internet. Katakan IP lokalnya 192.168.10.10. Pada jaringan tersebut, terdapat 1 komputer lain (tidak punya IP public) yang didalamnya terinstall MySQL. Katakan IP-nya 192.168.10.15
Kita ga bisa nih, akses si 10.15, karena ga punya IP public, sedangkan 10.10 bisa kita akses. Hal ini dapat disiasati dengan tunneling ke 10.15 melalui 10.10.
Caranya gimana? cukup dengan SSH ke 10.10, tapi dengan command tambahan, sehingga jadinya seperti berikut:
ssh root@256.13.14.267 -L10000:192.168.19.15:3306
mari kita liat command tambahan "-L10000:192.168.19.15:3306". Sebenarnya command disamping memiliki format demikian:
-L
Jadi dengan perintah diatas, seseorang dapat mengakses MySQL di 19.15 dengan cara konek ke localhost post 10000!! Dengan perintah diatas, setiap kita mengakses port 10000 di local, seolah olah kita menjadi 10.10 yang mengakses komputer IP 19.15 port 3306. In my opinion, tunneling is quite cool actually, hehe
Enaknya lagi, tunneling juga bisa dilakukan programmatically, but that is for another story.
Semoga bermanfaat
Sunday, November 21, 2010
Mengefisienkan Screen-estate Ubuntu
Kerjaan Saya sekarang berkaitan dengan Java SE. Setelah mencoba develop di Windows 7 dan Ubuntu 10.04 Lucid Lynx, kerasa (perasaan aja) kayaknya compile dan running di Ubuntu lebih cepat. Oleh karena itu Saya memutuskan untuk kerja dengan Ubuntu.
Namun ada 1 hal yang mengganggu Saya di Ubuntu, yaitu screen-estatenya yang tidak efisien. Font di Ubuntu terlalu besar, dan GUI-GUI-nya rata-rata menghabiskan space yang cukup besar. Karena Saya termasuk orang yang rese, hehe, Saya tidak bisa membiarkan hal ini.
Saya menghabiskan weekend untuk kostumisasi desktop agar effisien, Alhamdulillah hasilnya memuaskan, setidaknya bagi Saya. Sebenarnya hanya 2 langkah utama yang saya ambil, yaitu:
- membuat ubuntu terlihat seperti OS mac
- menginstall dan mengecilkan font-font
Membuat Ubuntu terlihat seperti OS mac
Banyak sekali sebenarnya tutorial untuk ini, googling saja dengan query : "make ubuntu look like mac", banyak hasil-hasil bermunculan yang 'works'. Setelah mencobanya, terdapat beberapa 2 hal penting yang Saya rasakan paling banyak manfaatnya, yaitu:
- Global menu. Global menu seperti di OS mac sangat membantu mengefisienkan window-window di ubuntu
- Application Dock. Tujuan utama Application Dock ini (Saya menggunakan Cairo Dock) adalah untuk menggantikan fungsi bar dibawah Ubuntu
pastikan kedua hal tersebut terinstall.
Menginstall dan mengecilkan Font
install font-font yang disukai, Saya sendiri akhirnya menggunakan Bitstream Vera. Mengecilkannya dengan System > preferences > appearance > Font. Yang defautnya 'Sans' Saya ganti dengan Bitstream Vera Sans Roman, sedangkan yang fixed width saya gantikan dengan Bitstream Vera Sans Mono Roman. Seluruhnya dengan size 8. Kemudian di Font > details, Saya ganti dot per inchnya dengan 90.
Setelah dua hal diatas dilakukan, maka Desktop Ubuntu akan terlihat sangat efisien. Dengan begini, development dengan Ubuntu akan terasa lebih nyaman.
Friday, November 19, 2010
Pengalaman Menggunakan Git
Sudah hampir setahun PT. Sangkuriang menggunakan git, dan akhirnya sudah mulai berpindah dari workflow svn-centric menjadi workflow yang distributed, lebih tepatnya Workflow dengan Gatekeeper.
Workflow Gatekeeper sebenarnya sederhana. Programmer cukup 'mengambil' kode dari Repository pusat. Setiap perubahan yang dilakukannya di-commit ke komputernya saja. Kemudian secara berkala, ada seorang Gatekeeper yang mengambil kode-kode dari komputer programmer tersebut dan melakukan kegiatan quality assurance (functionality, code review, unit test, integration test, an so on). Apabila kode memenuhi kualitas, Gatekeeper akan nge-push kode ke Repository pusat. Terakhir Gatekeeper akan meng-inform programmer-programmer untuk meng-update kodenya.
Saya benar-benar puas dengan workflow ini. Kode repository pusat adalah kode yang 'stable', perubahan-perubahan kode dapat terlacak dengan mudah, dan kualitas kode terjaga dengan baik.
Meski terdapat beberapa drawback seperti kode repository tidak akan terupdate jika gatekeeper tidak hadir(sakit, atau cuti), namun masih tertutup dengan benefit yang diberikannya. Meskipun pada awalnya, migrasi dari SVN ke git memberikan banyak kesulitan karena git cukup kompleks untuk dipelajari, pada akhirnya membuahkan hasil yang memuaskan.
PS: Ada yang kesulitan menggunakan git? ada yang ingin konsultasi migrasi SVN ke git? tulis di comment aja ya, hehe
Workflow Gatekeeper sebenarnya sederhana. Programmer cukup 'mengambil' kode dari Repository pusat. Setiap perubahan yang dilakukannya di-commit ke komputernya saja. Kemudian secara berkala, ada seorang Gatekeeper yang mengambil kode-kode dari komputer programmer tersebut dan melakukan kegiatan quality assurance (functionality, code review, unit test, integration test, an so on). Apabila kode memenuhi kualitas, Gatekeeper akan nge-push kode ke Repository pusat. Terakhir Gatekeeper akan meng-inform programmer-programmer untuk meng-update kodenya.
Saya benar-benar puas dengan workflow ini. Kode repository pusat adalah kode yang 'stable', perubahan-perubahan kode dapat terlacak dengan mudah, dan kualitas kode terjaga dengan baik.
Meski terdapat beberapa drawback seperti kode repository tidak akan terupdate jika gatekeeper tidak hadir(sakit, atau cuti), namun masih tertutup dengan benefit yang diberikannya. Meskipun pada awalnya, migrasi dari SVN ke git memberikan banyak kesulitan karena git cukup kompleks untuk dipelajari, pada akhirnya membuahkan hasil yang memuaskan.
PS: Ada yang kesulitan menggunakan git? ada yang ingin konsultasi migrasi SVN ke git? tulis di comment aja ya, hehe
Subscribe to:
Posts (Atom)



