Azwar

Berbagi cerita dan informasi

Category Archives: PHP

HMVC Design Patern tidak dapat menggantikan Source Code Management

Pada artikel ini saya ingin membahas mengenai Design Patern pada Software Development yang saat ini sedang naik daun, nama Design Patern itu adalah HMVC.

HMVC 结构图

HMVC adalah versi pengembangan dari Design Patern MVC (Model-View-Control). HMVC sendiri adalah singkatan dari Hierarchical Model View Control. Atau bisa kita bilang sebagai versi MVC yang diimplementasikan secara hirarkis. Hirarkis di sini maksudnya adalah hirarki folder (struktur folder) yang mana menjadi modul.

Kuncinya adalah, satu modul memiliki satu MVC, atau bisa dikatan lebih gampangnya adalah, satu modul memiliki masing2 file model, file view dan file controll. Meskipun masing-masing file tersebut tidak selamanya diperlukan, ada kalanya cuma perlu file view dan controll saja.

Contoh: Saya memiliki folder modules folder ini nantinya akan saya gunakan sebagai tempat menaruh modul-modul saya. Oke, sekarang anggaplah saya ingin membuat modul produk, maka saya buat folder produk di dalam folder modules maka struktur foldernya menjadi modules/produk, di dalam folder produk ini akan kita buat folder untuk masing-masing file MVC, dengan kata lain kita akan membuat folder bernama model, view control .

Jika digambarkan, maka struktur hirarki nya akan menjadi sebagai berikut:

-modules/
….|
…+—-produk/
…….|
……+—-model/
……+—-view/
……+—-control/

File-file model akan diletakkan dalam folder model, begitu juga file view dan file control (controller) akan diletakkan ditempatnya masing-masing sesuai nama foldernya.

Keuntungan dari design pater ini, terutama bagi aplikasi web adalah, modularitas file pada aplikasi yang dikelompokkan berdasarkan fungsinya. Contohnya, file-file yang berhubungan dengan produk ditempatkan pada modul produk (file view nya produk, file controllernya produk, dan file modelnya produk).

Maksud dari pengelompokkan folder berdasarkan fungsinya tersebut adalah agar ketika ada tambahan fungsi baru pada program, misal tadi ada fungsi produk kemudian teman kita sudah membuat fungsi user maka kita tinggal mengkopikan modul user yang telah dikerjakan oleh teman kita tersebut pada folder modules/ dengan demikian maka didalam folder modules/ sekarang ada dua folder, yaitu produk dan user. Singkatnya seperti itu.

Sampai tahap ini terlihat simpel dan mudah ketika kita melakukan kerja dalam team. Nyatanya cerita pewayangan, eh salah, cerita software development model HMVC ini belum berhenti sampai disini.

Ketika ada suatu update-an file yang sifatnya tidak spesifik pada modul, maksud saya adalah perubhan diluar folder modul, maka pada saat itu bentrok update-an akan bermunculan. Misalkan saya mengedit file style.css pada folder CSS/, maka ketika ada orang lain yang juga mengupdate file style.css tersebut dan ditimpakan pada folder CSS makan akan menimpa kepunyaan saya tadi. Dengan demikian model kolaborasi ini tidak efektif jika tidak ada komunikasi yang intens, sayangnya, kebanyakan programmer pada umumnya enggan berkomunikasi tentang update-an yang seperti ini. Kebanyakan hanya main replace-replace aja tanpa peduli versi baru file tsb. Akibatnya, ini akan menjadi bencana yang tak akan pernah reda.

Masalah lain yg timbul. Masalah lainnya adalah, jika dalam folder modul kita mengupdate file yang sama. Misalkan si A da si B bertugas mengerjakan module produk pada PC nya masing-masing. Ketika salah satu akan melakukan update source code, maka masing-masing akan saling menimpa file yang telah dibuat. Lagi-lagi tanpa komunikasi dari keduanya maka semua ini hanya akan menjadi spageti monster, alias kodingan yang acak-aduk amburadul. Dan lagi-lagi, kebanyakan enggan untuk berkomunikasi.

HMVC adalah Design Patern, bukan Source Code Management, jadi jangan disamakan fungsinya. Jangan disamakan fungsi Gelas dan Pisau, jenisnya saja beda, yg satu alat untuk minum yang satu alat untuk mengiris. Apalagi kategorinya, gelas teh dan pisau lipat, apa pun kategorinya, keduanya tidak bisa disandingkan untuk dijadikan pengganti. Begitu juga dengan HMVC dengan misalkan GIT atau Mercurial atau sejensnya.

HMVC design patern, tidak bisa menggantikan GIT, Mercurial, SVN dll yang jenisnya adalah Source Code Management.

Saya pernah terpaksa menggunakan HMVC sebagai pengganti Source Code Management, karena ikut aturan main team.

Berdasarkan pengalaman saya HMVC tidak bisa efektif untuk dijadikan pengganti Source Code Management, karena HMVC tidak diciptakan untuk itu dan HMVC pun bukan “itu” (Source code Management).

HMVC = Design Patern
Git, Mercurial, SVN, Bazzar dll = Source Code Versioning
Github, Gitlab, Bitbucket = Source Code Repository untuk Source Code Versioning

Design Patern tidak bisa dibandingkan dg Source Code Versioning
(Design patern itu banyak jenisnya, pada umumnya orang cuma kenal MVC dan HMVC)

Semoga artikel ini berguna. Terimakasih.

Baca artikelnya dulu dari awal paragraf hingga akhir paragraf, baru boleh komentar ya…

BUGS – CodeIgniter File Upload untuk Image

Saat ini saya sedang membuat aplikasi mnggunakan PHP dan CodeIgniter sebaga framework pilihan saya.

Langsung saja, saya menemui keanehan saat upload gambar. Bukan, bukan karena prosess uploadnya gagal atau error. Tapi karena ada atribut yang kosong berkenaan dengan informasi file gambar yg saya upload.

Jadi begini, ketika saya upload file, saya ingin memastikan apakah file ini asli gambar atau bukan, tidak hanya mengecek ekstensi file nya saja, tapi meta data yg ada dalam file tsb. Karena bisa saja orang iseng, file inigambar.txt di-rename menjadi inigambar.png, kemudian diupload. Jika hanya ekstensinya saja yg dicek, maka upload file tsb akan lolos, tapi jika meta datanya juga dicek, maka file tersebut tidak akan lolos. Ok, proses ini berhasil, artinya jika bukan gambar asli, aplikasi saya berhasil menolak.

Masalahnya, ketika saya mengambl properti panjang dan lebar dari gambar tersebut, kok tidak bias, alias kosong blong.

$data_upload = $this->upload->data();
echo $data_upload['image_width']; //hasilnya kosong

akhirnya saya coba print seluruh data array yg ada di variabel $data_upload

print_r($data_upload, false);

hasil keluaran di browser:

Array ( [file_name] => 100_1795.JPG [file_type] => image/jpeg [file_path] => /opt/lampp/htdocs/mynada/media/artist/alb/ [full_path] => /opt/lampp/htdocs/mynada/media/artist/alb/100_1795.JPG [raw_name] => 100_1795 [orig_name] => [client_name] => 100_1795.JPG [file_ext] => .JPG [file_size] => 265.44 [is_image] => 1 [image_width] => [image_height] => [image_type] => [image_size_str] => )

Ternyata memang benar, item [image_width], [image_height], [image_type], [image_size_str] tidak berisikan value.

Saya menganggapnya ini sebagai bugs. Jika anda memiliki anlisa yg lain, tolong beritahu saya… 🙂

Tutorial CodeIgniter – Query untuk searching data

Ada sedikit masalah pada CodeIgniter versi 1.7.3 berkenaan dengan Active Record.

Masalah yang saya maksudkan adalah, ketika saya menggunakan fungsi like() pada active record. Fungsi tersebut hanya mau menghasilkan pencarian dengan 1 kata saja. Contoh saya mencari kata ‘aku’ pada kalimat ‘Siapa aku ini’. Dengan pencarian 1 kata tersebut, CodeIgniter (CI) versi 1.7.3 mau menghasilkan query. Namun ketika saya mencari lebih dari 1 kata, misalkan ‘aku ini’ maka resultset nya 0 alias tidak ketemu.

Hmmm…. saya berburu info di internet, tapi tak saya temukan info berguna, mungkin juga saya-nya yang kurang teliti dalam berburu info. Hehe… Yasudah tidak apa-apa, perjuangan tetap berlanjut.

Kemudian, akhirnya saya pake cara jantan, alias cara manual. Biasa lahh… The Power of Simplicity. 😀 Nah itu, kalo sesuatu tidak bisa dihandle oleh hal yang sedikit kompleks, maka cara simpel bisa menjadi obat. Karena simpel itu lah kita bisa memvariasikannya supaya jadi lebih fleksibel. Ups malah ngobrol. Ayo kita selesaikan tutorialnya.

Ya, akhirnya saya menggunkana cara manual. Dengan menggunakan fungsi query($string_query). Yah.. tak masalah, sama-sama query bukan?

Jika menggunakan Active record bentuknya seperti ini:


        	$this->db->like($word, $type);
        	$this->db->or_like($word, $type, 'before');
        	$this->db->or_like($word, $type, 'after');
        	$query = $this->db->get('article'); 

dan dengan menggunakn query manual menjadi seperti ini:

			$query = $this->db->query("
				SELECT *
				FROM `article`
				WHERE `$type` LIKE '%$word%' OR `$type` LIKE '%$word' OR `$type` LIKE '$word%'
			"); 

namun query ini sangat rentan terhadap injeksi,
jadi kita ubah dengan query berparameter, dalam java namanya prepared statement.
Jadinya seperti ini:

        	$sql = "
				SELECT *
				FROM `article`
				WHERE `$type` LIKE '%$word%' OR `$type` LIKE '%$word' OR `$type` LIKE '$word%'
			"; 
        	$query = $this->db->query($sql, array($type, $word, $type, $word, $type, $word,)); 

Perhatikan, parameternya harus urut (urutannya sesuai) dengan yang ada di syntax query.

Semoga bisa menjadi tambahan referensi.
Terimakasih.

Amankan Lampp dan juga MySQL anda

Jangan sepelekan keamanan development environment anda, karena segala sesuatu bisa terjadi diluar kehendak anda. Tak ada salahnya kita bersikap hati-hati mengenai masalah keamanan. Salah satunya adalah keamanan Lampp.

Secara default, user root yang ada pada lampp terkonfigurasi dengan password kosong atau dengan kata lain, tanpa password. Password default adalah password yang tidak aman, tentu saja, yang namanya default pasti semua orang yang sama-sama memakai aplikasi tersebut pasti tahu/ingat passwordnya. Misalkan ada orang bilang begini: “Oh server ini menggunakan Lampp/Xampp apa passwordnya masih default yah? Kalau default pasti passwordnya kosong.” Bisa anda bayangkan jika orang tersebut berniat tidak baik dan menyusup masuk ke development environment anda.

Ok, langkahnya simpel saja, basicnya adalah parameter security yang diberikan pada server lampp. Kali ini saya menggunakan GNU/Linux Blankon (turunan dari Ubuntu) dalam melakukan setting security pada lampp.

Pertama kita harus masuk sebagai root atau sudo.
Jika anda menggunakan Ubuntu juga maka ketikkan sudo:
sudo -i
jika anda menggunakan Linux lain turunan RedHat/berbasisi RPM, cukup gunakan perintah su
Setelah masuk sebagai root, maka langsung saja berikan parameter security pada Lampp
/opt/lampp/lampp security
maka akan keluar tampilan kurang lebih seperti ini:

Anda akan diarahkan menuju prompt penggantian password Lampp, PhpMyAdmin, MySQL dan ProFTPD.

Setelah anda selesai mengkonfigurasi password security di atas, sekarang anda restart lampp anda:
/opt/lampp/lampp restart
kemudian jalankan localhost anda pada browser, maka akan muncul dialog box login.


Masukkan lampp sebagai user dan passwordnya adalah password yg telah anda berikan pada langkah sebelumnya.

kemudian anda coba klik menu PhpMyAdmin, maka akan muncul form login seperti gambar dibawah ini. Masukkan root sebagai user dan passwordnya adalah password yang telah anda set di langkah atas.