Labels

Cari di blog ini

acapella alfataa Daily kreatif nasyid

al-Fataa Nasyid - (Latihan) Remaja Peduli

Silakan Ngomen


Kemarin, yaitu hari minggu, ada undangan buat tampil nasyid di Salman ITB. Undangan itu untuk tim nasyid alFataa. Wow, kira-kira sudah 7 tahun kami tidak berkumpul dan bernyanyi bersama lagi. Al-Fataa adalah tim nasyid yang saya ikuti bersama teman-teman waktu di pesantren dulu. Total personil ada 9 orang, diantaranya ada Febtri Zaina Rachman, Rizqi Fauzi, Firman Fauzi, Ihsan Fauzi, Kiki Hilman, Abdul Aziz, Mas Agung, Amir Musyaddad dan Saya. Banyak yah. Kami adalah tim nasyid dengan genre acapella. Sayangnya hari minggu ini kami tidak bisa kumpul semua karena ada yang sudah kerja dan berkeluarga dan tinggal di luar kota. Jadinya hari minggu ini cuma berlima aja yang bisa ikut, ditambah 2 personil Naga Voice dari Salman yaitu Tezar dan Rifki.

Itu yang saya embed adalah rekaman latihan kami. Lumayan lah, untuk latihan sehari mah. hehe..

vocal: Tezar Aditya Auza
bariton: Rizqi Fauzi Anggadinata, Rifki Amami, Toni Haryanto
tenor: Febtri Zaina Rachman, Abdul Aziz Maulana
bass: Firman Fauzi
Construct2 Daily Development game kreatif Projects

Game: Mana yang Sama?

2 comments


Seharian ini dari siang sampe tengah malem, beresin game yang direquest sama si Kamah. Gamenya tentang mencocokkan gambar. Jadi ada beberapa gambar yang masing-masing ada pasangannya. Nanti gambar itu didrag ke pasangannya. Game sederhana dan ga aneh. Tapi saya jadi merasa tertantang buat bikin itu pake Construct 2. Ya saya pake Construct 2 karena cuma itu tools yang saya bisa buat bikin game. Itung2 refreshing di tengah kesibukan kuliah SP dan kerjaan.

Game ini buat si Wildan. Akhir-akhir ini dia lagi senang menemukan gambar atau objek yang sama, entah itu gambar di poster, karpet, logo di koran dengan di tv, ataupun yang kelewatin di pinggir jalan pas lagi naek motor atau angkot. Jadi mudah-mudahan dia suka sama game ini. Pengennya sih pas gambar yang cocok dipertemukan, akan muncul suara orang yang menyebutkan nama gambar itu. Mungkin kedepannya bisa dikembangin. Itu nanti bagian si Kamah.

Sudah jam satu lewat. Si Kamah dan si Wil udah pada tidur. Saya akhiri development gamenya, lalu saya export ke dalam format HTML5. Buat yang mau coba, bisa diakses disini http://toniharyanto.net/projects/manayangsama. Ukurannya hampir 2MB jadi bakal lumayan nunggu loadnya kalo koneksimu lemot. Scriptnya ga banyak, tapi buat merancangnya bener-bener menguras energi, terutama di bagian manipulasi array. Gitulah. Saya mau tidur dulu. Tiga jam lagi mesti sahur. Eh atau, sahurnya sekarang aja gitu yah??

Credit:
Game dibuat menggunakan Construct 2. Asset icon diunduh dari findicons.com yang berlisensi free for non commercial dan unknown. Background diunduh dari foxarc.com/blog/article/40.htm. Sound dari soundbible.com
Development Git PHP

Problem Library PHP untuk Git

Silakan Ngomen
Udah sejak beberapa bulan lalu ngulik git supaya bisa dioperasikan dengan PHP. Permasalahan utama adalah ketika melakukan perintah transaksi. Kalo perintah fetch data seperti git status, dan git add, sudah tidak ada masalah. Giliran commit kagak bisa. Sejak itu saya tinggalkan ulikan ini.

Kemarin coba-coba nyari lagi library PHP untuk pengoperasian git. Ketemu deh sama repositori ini http://kbjr.github.io/Git.php. Permasalahan serupa terjadi. Ketika menjalankan perintah status dan add tidak ada kendala, message dari gitnya muncul dan dirender di browser. Giliran manggil perintah commit, tidak ada pesan dari git. Saya cek via terminal pun reponya gagal commit. Nyari-nyari sana-sini di google, ketemu beberapa permasalahan serupa, tapi solusinya tidak menyelesaikan permasalahan yang saya hadapi. Anehnya di repositori Git.php itu tidak dijelaskan setting ini itu yang mempengaruhi keberhasilan proses. Tidak juga ditemukan satupun issue yang membahas hal serupa.

Saya kira permasalahan ada di user permission. Saya sudah coba berbagai hal terkait chmod dan chown. Sampai akhirnya tiba-tiba saya teringat perintah git config. Saya tidak tau bagaimana proses saya ingat itu, makanya saya bilang tiba-tiba. Saya coba perintah git config user.name "yllumi" dan git config user.email "toha.samba@gmail.kom" dan perintah commit dari PHP berhasiiiiil! :D

Lalu saya coba bikin lagi repo di tempat yang lain. Saya kasih set config user.name dan user.emailnya seperti di atas. Aneh, gagal lagi. Lalu saya coba set chmod dulu ke 777 kemudian set config user.name dan email lagi dan demikian berhasil. Saya mulai paham tentang penggunaan hak akses. Pada repo di lokal mungkin tidak bermasalah bila hak akses diset 777, artinya siapapun bisa mengakses dan mengedit repository. Saya coba set chmod ke 755, lalu saya coba commit, dan gagal. Hmm.. saya kita itu karena saya tidak mengeset permission untuk write pada group www-data sebagai grup yang digunakan oleh git untuk mengakses repo. maka saya chown www-data ke repo tersebut, kemudian saya coba commit dan sukses! Berarti kesimpulannya, ada dua pengaturan yang harus dilakukan, pertama pemberian hak akses, dan pengesetan config user pada repository.

Percobaan terakhir saya lakukan. Mulai dari pembuatan repo baru, membuat file di dalam repo, hingga commit repo, semuanya dilakukan oleh PHP. Percobaan pertama dilakukan tanpa mengeset config user. Hasilnya gagal. Percobaan kedua dilakukan dengan mengeset config user. Hasilnya sukses. Dari sini bisa disimpulkan bahwa kunci dari kesuksesan commit adalah set git config. :)

Udah itu aja. Sukses!
Codeigniter Development PHP

Class Exception pada CodeIgniter dan Dilema Errors Template

Silakan Ngomen
Beberapa bulan terakhir ini saya dan beberapa teman kru Nyankod sedang mengembangkan produk baru Nyankod yaitu Devository, situs tanya jawab seputar pemrograman. Kami mengembangkannya di atas framework CodeIgniter, lebih khususnya di atas CMS yang kami kembangkan sendiri bernama Jooglo. Di dalamnya kami buat beberapa pondasi supaya pengembangan bersifat modular dan reuse. Kedepannya, setelah devository beres, kami akan mengembangkan Jooglo ini sebagai CMS baru berbasis CodeIgniter.

Hari ini saya sedang menggarap modul tanya jawab, ketika tiba-tiba muncul error pada class exception. Seperti kita tau, class exception ini kan mengatur tampilan error, mulai dari error general seperti 404 sampe error php. Jadi ada error pada class pengatur error hahaha.. lucu ga? Engga? Ok. Kita lanjut.

Saya sudah mengintegrasikan CodeIgniter versi 3.0-dev ke dalam inti Jooglo setelah sebelumnya menggunakan versi 2.1.4. Banyak peningkatan kemanan dan fitur, salahsatunya adalah error templating. Kalo di versi 2 itu template error disimpan di dalam folder application/errors/, sekarang sudah disimpan di dalam folder application/views/errors/. Ada 5 buah file template, diantaranya error_404.php, error_db.php, error_general.php dan error_php.php.  Keuntungannya adalah, kita dapat memanfaatkan $this->load->view() pada template error ini. Kalo dulu kan terpisah dari lingkungan kerja view, sehingga templatingnya berdiri sendiri mulai dari tag <html> sampe ditutup. Kemajuan ini sangat membantu pekerjaan kita sebagai programmer CodeIgniter.

Nah, sekarang, di Jooglo, kami memanfaatkan librari Template yang sudah kami modifikasi sehingga librari ini mendukung modularisasi tema. Maksudnya, kalo secara default kita menyimpan semua file view di dalam folder application/views/, nah dengan modifikasi kami, file view bisa disimpan di dalam folder tema. Dengan demikian kita tinggal memilih tema mana yang akan digunakan dan sistem pun akan menggunakan file view yang ada pada folder tema yang dipilih.

Nah permasalahannya adalah, keinginan saya, dimana file template error, yang sekarang sudah ada di dalam folder views/ itu, juga bisa di-override dari views/ di dalam folder tema. Gimana caranya? Yaa, karena template errors itu sudah berfungsi di dalam application/views/, mestinya ketika saya sudah bisa membuat sistem override view ke dalam tema, berarti template errors itu berfungsi juga dong. Yah, harapannya kan begitu.

Ternyata, template error itu berbeda cara pemanggilannya dengan template view yang lain. Kalo file view yang biasa kita tinggal panggil saja $this->load->view() dari dalam controller atau file view lain. Kalo template errors itu yang pake ternyata adalah file class di dalam folder system/core/ yang bernama Exception.php. File inilah yang mengatur bagaimana sebuah error ditampilkan. Method di dalam class inilah yang menggunakan template errors.

Override Class Exception

Kondisi tersebut membuat saya mesti meng-override class Exception. Caranya adalah dengan membuat class MY_Exception yang extends dari class CI_Exception, dan menyimpannya di dalam folder application/core/ dengan nama file MY_Exception.php. Ini adalah salahsatu method yang mesti di-override.

Kondisi mula sebelum override di dalam class CI_Exception

function show_php_error($severity, $message, $filepath, $line)
{
    $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
    $filepath = str_replace('\\', '/', $filepath);

    // For safety reasons we do not show the full file path
    if (FALSE !== strpos($filepath, '/'))
    {
        $x = explode('/', $filepath);
        $filepath = $x[count($x)-2].'/'.end($x);
    }

    if (ob_get_level() > $this->ob_level + 1)
    {
        ob_end_flush();
    }

    ob_start();
    include(VIEWPATH.'errors/error_php.php');
    $buffer = ob_get_contents();
    ob_end_clean();
    echo $buffer;
}

Kemudian saya modif jadi begini supaya template errors dapat dibaca dari dalam views yang ada di dalam tema yang sedang aktif.

function show_php_error($severity, $message, $filepath, $line)
{
    $CI =& get_instance();

    $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
    $filepath = str_replace('\\', '/', $filepath);

    // For safety reasons we do not show the full file path
    if (FALSE !== strpos($filepath, '/'))
    {
        $x = explode('/', $filepath);
        $filepath = $x[count($x)-2].'/'.end($x);
    }

    if (ob_get_level() > $this->ob_level + 1)
    {
        ob_end_flush();
    }

    $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR.'error_php.php';

    if(file_exists($CI->template->theme_path().'/views/errors/error_php.php'))
    $templates_path = $CI->template->theme_path().'/views/errors/error_php.php';
   
    ob_start();
    include($templates_path);
    $buffer = ob_get_contents();
    ob_end_clean();
    echo $buffer;
}

Saya menggunakan $CI =& get_instance(); yang berarti sistem memuat objek controller sehingga dari objek itu saya bisa panggil library atau objek lain yang sudah diload oleh controller. Tapi ternyata fungsi theme_path() yang saya panggil dari library template tidak dikenali. Aneh kan, biasanya dengan cara yang sama kita bisa panggil library apapun di dalam library atau helper atau file core lain. Tapi di class Exception ini tidak berfungsi sebagaimana mestinya.

Setelah googling, ketemulah inti masalahnya. Ternyata, class Exception ini diload oleh sistem sebelum sistem meload class Controller, jadi wajarlah bila objek Controller tidak dikenali oleh Exception. Sampe kapanpun $CI =& get_instance(); ga akan pernah berjalan di dalam Exception.

Solusi Errors Template

Yang terbayang sama saya ada dua solusi. Pertama adalah dengan membuat fungsi error di dalam controller sehingga setiap error yang muncul itu pada dasarnya memanggil fungsi error di dalam controller atau dengan kata lain, template errors ini tidak digunakan oleh class Exception, melainkan oleh fungsi error yang kita buat di controller tadi. Konsekuensinya adalah, kita harus mengalihkan pemanggilan setiap error ke controller. Seperti kita tau, fungsi show_error(), show_404() dan fungsi error lain itu terdapat di dalam file system/core/Common.php dan semua fungsi di dalamnya digunakan hampir di semua tempat di dalam file core lain. Kalo kamu buka file system/core/Codeigniter.php, disitu kita lihat file Common.php dimuat paling awal, karena dia digunakan oleh hampir semua class lainnya. Dengan kata lain, fungsi di dalam Common.php ini tidak bisa memanggil fungsi yang ada pada controller karena controllernya kan belum diload saat Common.php ini diload. Paling banter adalah kita hanya bisa melakukan ini pada fungsi show_404(), dengan cara mengeset variabel $route['404_override'] = ''; pada file config routes.php dengan URI yang menampilkan error 404.

Tapi da saya mah pengennya semua template errors bisa dioverride, ga hanya yang error_404 aja. Akhirnya saya pake cara kedua, dengan mengambil data nama tema yang digunakan dari database. Lengkapnya seperti ini:

function show_php_error($severity, $message, $filepath, $line)
{
    // ambil data dari database
    require_once BASEPATH.'database/DB'.EXT;
    $theme = DB()
            ->select('value')
            ->where('name', 'template')
            ->get('jooglo_options')
            ->row();

    $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
    $filepath = str_replace('\\', '/', $filepath);

    // For safety reasons we do not show the full file path
    if (FALSE !== strpos($filepath, '/'))
    {
        $x = explode('/', $filepath);
        $filepath = $x[count($x)-2].'/'.end($x);
    }

    if (ob_get_level() > $this->ob_level + 1)
    {
        ob_end_flush();
    }

    $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR.'error_php.php';

    if(file_exists(APPPATH.'themes/'.$theme->value.'/views/errors/error_php.php'))
    $templates_path = APPPATH.'themes/'.$theme->value.'/views/errors/error_php.php';
   
    ob_start();
    include($templates_path);
    $buffer = ob_get_contents();
    ob_end_clean();
    echo $buffer;
}

Disini saya mengambil terlebih dahulu nama tema yang sedang aktif dari dalam database, dan menggunakannya untuk merujuk folder tema mana yang akan digunakan. Saya melakukannya pada fungsi yang lain yang ada di dalam class MY_Exception. Dengan begini semua template errors bisa dioverride dari dalam tema. Yes! Alhamdulillah..
Impression kreatif lagu Nonton videos

OK Go: Writing's on the Wall

Silakan Ngomen
Akhirnya, rilis video klip terbaru dari OK Go muncul. Seperti biasa, dengan segala keunikan idenya, OK Go kini menghadirkan video klip yang 'mempermainkan' sudut pandang kamera (Eyes Boggling) sehingga menampilkan kesan tertentu. Ya gitulah kira-kira. Mending liat aja langsung video klipnya. Saya yakin kamu juga akan bilang "WOW!"

Bisnis Daily Tips

Memastikan Postingan Asli atau Palsu di Olx.co.id

Silakan Ngomen
Seharian ini cari-cari laptop bekas di Kaskus, Olx dan Berniaga. Ternyata dalam satu hari, terutama di Olx, itu postingan terkait laptop berkas bisa sampe ratusan, sepertinya. Soalnya, postingan produk bertambah setiap jamnya. Dalam satu jam, produk yang diposting terkait laptop itu bisa nyampe 50-60 posting. Saya yakin pastinya ada aja yang posting produk yang tipu-tipu alias tidak ada barangnya.

Setelah saya pelajari, ternyata ada beberapa gejala yang mengindikasikan suatu posting produk (terutama di Olx) yang kemungkinan besar tidak ada produknya alias tipu-tipu. Beberapa ciri yang bisa kita amati diantaranya:

Foto produk menggunakan foto yang sudah dipakai oleh orang lain. Untuk mengecek ini kita bisa memanfaatkan layanan google images (http://images.google.com). Tinggal donlot foto yang mau dicek lalu drag ke kotak pencarian di google image. Bila muncul dua atau lebih hasil postingan dengan foto yang sama, kita bisa pastikan hanya satu yang asli, sisanya palsu.

Coba perhatikan profil si penjual. Biasanya untuk setiap posting produk dipasang juga lokasi si penjualnya. Hal ini dikarenakan cara paling aman adalah dengan Cash on Delivery atau ketemuan langsung. Supaya bisa ketemuan langsung maka biasanya orang akan cari lokasi penjual terdekat. Maka lokasi menjadi hal yang penting. Saya menemukan beberapa profil penjual di Olx yang memposting beberapa produk yang sama atau mirip, tapi lokasinya berbeda-beda. Kasus seperti ini hampir bisa dipastikan si penjual tidak akan bisa ketemuan dengan kita dan memperlihatkan produknya, sehingga kalaupun terjadi transaksi, dia akan menawarkan dengan cara pengiriman barang, dan ini sangat dikhawatirkan terjadi penipuan. Profile penjual seperti ini saya sarankan ditinggalkan saja :)

Coba kenali harga. Saya menemukan penjual yang memenuhi poin 1 (posting dengan foto milik orang lain) dan 2 (posting dengan lokasi yang berbeda-beda), ternyata dia memasang harga jauh di bawah standar. Misalnya laptop dengan prosesor Core i3 dijual 1,1 juta. Ini tidak masuk akal. Kalopun memang benar ada, untuk kasus orang ini, dia posting dengan foto milik orang lain. Kita bisa asumsikan dia punya maksud lain selain berjualan dengan cara yang benar. So, lihatlah harga secara objektif. Jangan tergiur dengan harga murah untuk spek yang tinggi.

Demikian beberapa analisis saya terkait postingan asli atau palsu di Olx dan Berniaga. Saya sarankan untuk selalu pilih produk yang bisa ketemuan langsung sehingga kita bisa mengecek barangnya langsung. :)
Daily Jaman SMP Refleksi

Saya dan Nasyid (1)

Silakan Ngomen
Tadi sore sehabis nganter Istri ke tempat workshop crafty, kami mampir dulu ke Borma Padalarang. Bukan untuk menyapa si pemilik Borma karena saya tidak tau siapa dia, tapi mau membeli sesuatu. Sesuatu itu adalah parutan buat wortel supaya si wortel terpotong panjang-panjang gitulah.

Di Borma ketemu sama temen SMP yaitu dia si Yanda. Dia sama calonnya mau belanja sesuatu yang lupa saya tanyakan. Dia cerita kalo sekarang dia kerja di Dinas Pendidikan Bandung Barat. Minggu-minggu kemaren dia ada kegiatan di SMP dan ketemu beberapa guru yang ternyata masih ingat padanya. Salahsatunya adalah Bu Dewi.

Nah itu latar belakang dari apa yang akan saya ceritakan sekarang. Mengingat Bu Dewi saya jadi inget dulu pernah minjemin saya kaset nasyid Shaffix. Kalo tidak salah album pertama. Beliau menawari saya pinjaman karena beliau tau saya juga suka dengerin nasyid. Saya kenal nasyid pertama kali pada saat SD, yang mana ketika itu salahsatu abang saya dari uwa saya memberikan kaset nasyid Raihan album pertama miliknya kepada saya. Dari situ saya setel terus sampe hapal meskipun tidak dihapal, dan akhirnya suka.

Kembali ke Shaffix. Waktu itu saya pertama denger belum terlalu akrab sama lagunya. Jadi saya cuma putar sekali saja. Belum suka waktu itu. Ga kerasa sudah satu minggu saya pinjam dan saya baru setel itu kaset sekali atau dua kali. Ketika suatu saat bertemu sama Bu Dewi, saya ditanya lagu yang mana yang paling saya suka. Saya jawab satu lagu yang belakangan saya tau judulnya 'Dalam Doa'. Saya jawab itu bukan karena itu yang saya paling suka, tapi karena itu yang saya paling ingat. Tapi pada akhirnya saya suka juga semua lagu Shaffix. Saya jadi suka karena saya sering setel itu sehingga akrab di telinga.

Kesini-kesini saya paham bahwa orang menyukai suatu musik bukan karena faktor lagunya yang enak didengar saja, tapi juga karena sering didengarkan. Awalnya mungkin ada dorongan untuk menyetel berulang, apakah karena disuruh teman, guru, atau orang lainnya, atau karena penasaran, gengsi, biar dianggap gaul, respek, ataupun alasan lainnya. Tapi saya berani bilang awalnya pasti orang belum suka. Dia akhirnya suka dengan sepenuh hatinya karena ia sering mendengar, sampai akrab di telinganya, dan diterima oleh bawah sadarnya sebagai lagu yang enak didengar. Meskipun bagi orang selain dirinya lagu itu dianggap tidak enak atau bahkan mengganggu pendengaran.

Dari kesimpulan itulah saya belajar menghargai orang lain dan selera musik masing-masing mereka.