Sunday, September 18, 2011

Money, not the most important

Dan akhir nya saya pun menyadari, bahwa uang bukan lah suatu hal yang selama ini saya kejar. Tapi jalan menuju kesuksesan, dan grip yang kuat terhadap kehidupan lah yang menjadi target.

Grip yang kuat tersebut didapat hanya jika kita bisa mengendalikan semua sisi dalam kehidupan. Tentu saja termasuk sumber pendapatan. Selain itu kita juga bisa mengendalikan sumber pengeluaran. Dan kemampuan dalam berpikir secara rasional dan terarah merupakan essensi dalam kekuatan grip tersebut.

Sungguh saya sangat tidak ingin menjadi seperti darsem (yang setelah lepas dari hukuman maut, malah menjadi orang kaya mendadak), ataupun seperti DPR yang kaya, tapi tidak tau dapet nya dari mana. Karena saya pikir, pengalaman dalam mengarungi jalan panjang tersebut lah yang sangat berharga. Hal tersebut dapat di turunkan pada keturunan kita kelak sehingga paling tidak keturunan kita nanti tidak perlu mempelajari kembali dari awal, dan menginjak kerikil yang sama yang harus di injak oleh pendahulunya. Kemungkinan untuk melaju lebih cepat pun menjadi lebih besar. Seperti kata pepatah yang mengibaratkan hidup itu lebih seperti lari estafet jarak panjang, ketimbang lari sprint jarak dekat.

Dengan kombinasi dari kedua hal tersebut, dan dengan pembelajaran terus menerus, saya yakin sekali dikemudian hari, uang (money) tidak akan menjadi suatu hal yang mengatur hidup lagi. Karena semua aspek dalam menemukan dan mengatur dirinya sudah dikuasai.

Curhat ah..

Gimana yah, susah juga ngomong nya. tapi dipaksain aja nulis, biar ada referensi untuk kedepan.

Memang untuk memulai usaha itu susah bgt. Betul sekali kata orang - orang, kalo mau usaha mending jng tengok kanan kiri. Yang penting tancap. Karena kelamaan berencana, semakin bnyk juga kendala. Tapi tanpa planing matang, ya usaha yang jadi ga matang.

Cerita tentang usaha kita sama orang lain terkadang akan memberikan sensasi negatif kepada orang tersebut. Entah kenapa, apa mungkin karena setiap kemungkinan yang di berikan terhadap mereka sudah bisa ditackle? Atau memang karakter orang tersebut yang seperti itu. Tapi masalah nya terkadang kita butuh orang lain untuk paling ga membantu memberikan informasi, tapi syarat nya kita harus memberi tahu bagaimana rencana kita.

Jika orang memiliki rencana, dengarkan dulu lah rencana orang tersebut. Ga semua orang kok rencana nya ga bagus. Beberapa orang bahkan memiliki rencana yang sangat mendetail. Pengalaman penting tapi di era internet seperti skrng, pengalaman yang didapat bertahun tahun dapat dipelajari hanya dalam beberapa menit cuman dengan membaca apa yang mereka tulis.

Terkadang lebih seneng ngobrol sama orang yang "bodoh", dari pada orang yang pinter. Paling ga orang bodoh akan  mendengarkan apa yang kita ceritakan sampe selesai terlebih dahulu (karena mereka bodoh dan ingin tau), dari pada orang pintar yang udah kyk dukun, tau sebelum dikasi tau (apa sok tau?).

And last, your knowledge mean nothing if you don't share it. Really.


Saturday, September 10, 2011

ACL on CI with Addendum

Seperti janji pada post sebelum nya, saya akan mengintegrasikan CI dan Addendum untuk membentuk suatu system Access Control List untuk sebuah applikasi website.

Ok sebelum lanjut ke code, sebelum nya ada baik nya untuk menjelaskan apa sih ACL yang saya maksudkan. Terdapat suatu penalaran berbeda dari suatu yang saya sebut sebuah ACL dan sistem yang biasa saya temukan dalam implementasi ACL ini. Seperti contoh nya pada ACL pada Zend Framework yang hanya melindungi sebuah resource, ataupun Spring Security yang hampir serupa dengan Zend yaitu dengan melindungi resource dengan annotation @Secured atau didefiniskan pada security XML file nya.

Saya lebih melihat ACL adalah suatu sistem yang mana tidak hanya melindungi resource, tapi juga melindungi action yang terdapat pada setiap controller yang akan di ekspose kepada user.

Contoh nyata pada web adalah sebagai berikut ; Misalkan suatu web applikasi memiliki beberapa level admin. Super admin, user admin, dan site admin dan pada suatu page (yang saya anggap sebagai resource), terdapat beberapa action yang dapat di lakukan oleh admin tersebut. Pada page ini, super admin memiliki semua akses, sedang kan user admin dapat mengedit dan melakukan delete pada page ini, dan site admin hanya bisa melakukan view pada page ini.

Dengan system ACL yang dikembangkan pada Zend maupun Spring, hanya mendeklarasikan apakah user memiliki akses atau tidak pada sebuah resource, tapi tidak terdapat pengaturan lebih lanjut apa saja action yang dapat dilakukan oleh user.

Oleh karena itu saya mencoba untuk mengembangkan sebuah sistem ACL pada Code Igniter (CI) yang dapat berfungsi seperti apa yang saya sebutkan diatas. Dengan sistem ACL ini admin dapat menentukan action yang dapat dilakukan setiap user pada sebuah resouce. (resource yang saya maksudkan disini adalah controller).

Code dapat di download pada : http://code.google.com/p/example-code/downloads/detail?name=crm.zip&can=2&q=
Kemudian contoh database di http://code.google.com/p/example-code/downloads/detail?name=db.sql&can=2&q=

Contoh aplikasi ini menggunakan Codeigniter sebagai framework. Kemudian Mysql sebagai database. Dan memerlukan PHP 5 untuk menjalankan web nya. Saya tidak menggunakan framework untuk Javascript. Dan web apps ini hanya saya coba jalankan pada versi firefox terbaru (firefox 6).

Web aplikasi ini tidak hanya akan mendefinisikan ACL pada annotasi nya, tapi juga akan membentuk Tree yang akan berkorelasi dengan ACL tersebut.

Terdapat 4 buah Annotasi pada contoh tsb. Yaitu :
  1. RestrictUserLogin : untuk membatasi controller dari akses user yang belum login (level : Class & function)
  2. ActionList : List action yang tersedia pada controller (level : Class & function)
  3. TreeNav : jika di deklarasikan, maka fungsi tersebut akan dilist  pada tree navigation, dan jika user memilki akses pada Tree tersebut, maka fungsi ini akan tampil setelah user login.
  4. NodeDesc : Mendeklarasikan mana dari node. akan digunakan oleh TreeNav
Mari kita membreak down.

Dimulai dari hooks. Seperti yang sudah diketahui, dalam lifecycle Codeigniter, Hooks pada Codeigniter dapat dieksekusi pada beberapa event tertentu. contoh nya sebelum controller di eksekusi. Nah tempat ini sangat cocok untuk mendefinisikan authorization pada website. Oleh karena itu saya menambahkan authorization yang akan dieksekusi sebelum request sampai pada controller.

Di fungsi authorize dari class Authorization ini, proses authorisasi dilakukan. Apakah user memiliki hak untuk melihat / mengeksekusi resource pada controller. Fugsi tersebut memanggil fungsi fungsi yang terdapat pada class acl yang di inisialisasi melalu autoload pada CI.

Pada saat penginisialisasian class ACL, class & function tujuan (routing) akan di parse oleh addendum, mencari annotation dengan nama RestrictUserLogin dan Actionlist. Dari meta data class & fungsi tersebut, kita dapat menentukan apakah user memiliki authorisasi terhadap resource yang dituju setelah di cocokkan dengan data yang diretrieve dari database.

Dan setelah user login, user akan mendapatkan tree dari setiap action dari role mereka. Tree navigation berfungsi untuk melakukan scan pada folder controller lalu melakukan parsing pada setiap class & dan function yang terdapat pada class tsb. Kemudian dari class tersebut didapatkan Tree (parent, child) yang akan dipopulate dan di bentuk oleh class tree navigation ini.

Untuk lebih lengkap nya, silahkan di coba saja program nya :p
Login dengan ID : admin, kemudian password admin juga.

Thursday, September 8, 2011

PHP Annotation

Annotation memberikan meta data dari code yang dibuat oleh programmer sehingga code dapat lebih rapi dan mudah untuk di manage. Selain itu Annotation memberikan jalan pintas untuk boiler plate code. Tapi sayang PHP sendiri tidak memiliki native support terhadap Annotation.

Tapi beruntung sekali terdapat sebuah library yang memberikan support untuk php yang meng extend class reflection dari php. Library dapat di download di http://code.google.com/p/addendum/.

Library Addendum tersebut memberikan support kepada php yang mana menambahkan fungsi dari comment menjadi menjadi fungsi annotation. Sehingga class / method / property dapat memiki annotation layak nya bahasa pemrograman lain.

Cara penggunaan library ini juga sangat mudah , library tinggal di include ke source code, gunakan comment sebagai annotation, dan kita siap memecah - mecah class dan mengambil meta data yang terdapat pada annotation.

Misalkan kita memiliki class AdminResource seperti berikut :

/**
 * @Secure("admin")
 */
class AdminResource{}

kemudian kita ekstrak meta data dari class tersebut dengan :

require_once(dirname(__FILE__).'/annotations.php');
require_once(dirname(__FILE__).'/AdminResource.php');

// buat descripsi anotasi dengan nama Secure
class Secure extends Annotation {}

// instantiate class AdminResource
$resources = new AdminResource();

// instantiate class ReflectionAnnotatedClass 
$annotatedReflection = new ReflectionAnnotatedClass($resources);

// ReflectionAnnotatedClass merupakan turunan dari ReflectionClass, 
// sehingga memiliki akses ke semua method dari ReflectionClass
echo $annotatedReflection->getName() . 
		" is accessible for  : " . 
		$annotatedReflection->getAnnotation('Secure')->value; 
Keluaran dari code tersebut adalah :
AdminResource is accessible for : Admin
Nah, annotasi tersebut juga dapat di deklarasikan pada method ataupun property dari class. Dengan penggunaan library ini, tentu sangat memudahkan programmer PHP untuk menciptakan sebuah program yang lebih rapi dan lebih mudah dibaca.

Dengan annotasi ini, PHP juga dapat di transformasi sehingga memiliki kemampuan serupa dengan Spring framework pada java. Termasuk juga dependency injection dapat juga di clone pada php. Di tulisan saya selanjut nya, akan saya gabungkan Codeigniter dan Annotation tersebut sehingga dapat melindungi resource dalam implementasinya bersama dengan ACL.

Have fun !

Don't Forget, Google Crawler

Hampir 3 hari mencari kenapa kok website menjadi sangat sangat lambat. Padahal sebelum nya tidak sebegini lambat. Dari tiga hari lalu mencari penyebab lambat nya website yang menjadi jadi. Sampai beberapa kali server harus direstart karena kepenuhan thread server yang terpakai sudah penuh.

Setelah dicari kemana - mana, improve website speed sana sini, akhir nya ketemu juga tersangka nya adalah ip ini : 66.249.69.44, 66.249.69.110, 66.249.68.246, 66.249.69.240. Nah setelah di whois, ternyata IP tersebut adalah IP dari Google bot alias google crawler ! HAHAHA. Jadi selama ini server berat karena Google yang melakukan invasi secara brutal kedalam server. Dan lebih bodoh nya lagi, tidak pernah teringat kalau google akan melakukan crawling ke website.

Dengan data yang cukup besar, dan link yang bejibun. Pantas saja website menjadi lambat. Mana lagi beberapa link menyebabkan database melakukan query yang sangat panjang.

Jadi ada satu lagi konsiderasi untuk menempatkan link. Lebih baik jng memberikan link yang dapat di crawl oleh google atau search engine manapun yang akan menyebabkan proses yang panjang pada server. Atau kalau pun harus memberikan link untuk suatu proses yang lama, lebih baik link nya di arahkan dengan menggunakan javascript atau dengan form. Dan tentu saja jng lupa untuk mendeklarasikan robots.txt pada webserver.

Pengalaman yang sangat menarik.