Labels

Cari di blog ini

dosen mahasiswa Mikir my two cents pendapat

Four Types of Lecturer

Silakan Ngomen
Talking about college student, we are also talking about lecturer. After 6+ years of my college experience (ahem, and I'm still a college student*), I saw an interesting pattern about lecturers (I may applied to teaches in general too, I guess). The pattern is about how the lecturer interacted with the students, within and outside the formal class. If you have been a (college) student, you must have met a boring killer lecturer. You once said, "Man, I hate math class with Prof. A. You know I always fall asleep on his class." or "God, how can I be calm on studying while Prof. B yells every five minutes.". Sometimes we critisise the way they lecture us. And on the other time we blame them for our failure. And sometimes, we hate certain subject not because we don't like it, but because the lecturer. It's because “his way of teaching was wrong". Right?

Unfortunately, if we keep thinking that way, we would never learn neither be successful. As we grow up, we realise that cursing the lecturer won't make us any better. No matter how angry we are to them, no matter how hate we are to them, we can’t change that with cursing. If you are a college student, remember that you can't be cry baby like a highschoolers. You have to survive and you have responsibility upon yourself.

From that starting point, I think we should change our perspective about our lecturer. You know, when we're highschoolers, we were thinking about teacher as "a parents as school who have a deep knowledge about everything and we can't learn and pass the test without them", now we should start to see lecturer as a friend on learning, a friend we respect. I always think them as a respected friends even though they are far older than me. That way, I found learning is easier more enjoyable.

But in fact, we can't befriend every lecturer. This is the point of this post (sorry for the long epilogue). There are lecturers who are so close to his students and the other make distant from their students. There are lecturers who are so so so kind-hearted and even easy to give a grade, but the other are killer ones. Something interesting I found is that not every killer lecturers in class are bad. Here I made a clear explanation about it (according to my investigation and "research", by the way). I'm pretty sure you'll agree. And also I added a mighty awesome quadrants to ease things.


Type 1 : No Fun at Class and Outside
It seems that the lecturers always have a busy life. Maybe he has so many activities that he have no time to interact with his students outside the class. Even more, it seems class is not in flow. Other reason is.. maybe it's just who he is (a social awkward?).

Type 2 : No Fun at Class, But Fun Outside
Admit it, you have met one. He is so killer in class, making it so intense. Or he is too boring and you often fall asleep in his classes. But once you met him outside, you can easily hold a fun conversation, good discussion, and even exchange latest PC games. :D

Type 3 : Fun at Class, But No Fun Outside
This type is a little bit confusing. His teaching method and style is perfect. He is funny and we expect to engage more with him outside, but when we approach him.. Surprise! He’s so much different. He is cold and seemed to limit his interactions with student. Everything is just awkward. Personally, I chose to avoid meeting this lecturer and take another road. Hahaha..

Type 4 : Fun Both at Class and Outside
Whoaaa.. this type is awesome. Having discussion with him is always enjoyable. He takes teaching and lecturing his student in to the next level, because education need to happen not only inside the class. He’s aware about his profession (and maybe because it’s his trait, easy going). It doesn’t mean that other type is not professional or dedicated. We just can say that this type is such an ideal lecturer ;)

In conclusion, I must said that it’s not important which type of lecturer we are facing, the future is in our hands. Just because the lecturer is not an easy going on (a.k.a. type 1 or 3), it doesn’t mean you have a reason to give up on learning. Remember that he has a potential to be always like that, and if we didn’t change ourselves, we are doomed! However, as a student we still have to respect them. If you feel the lecturer is mean or anything, just remember that every human has a mistake, why not a lecturer? That's my two cents. :)

So, if you are about to be a teacher or lecturer, which type will you fall on?? :D

Maybe you can post your story too? Hendri, Zia, Raksa

* Yeeees I'm still a college student after 6+ years. I accept it as my fate hahaha.. Fortunately, it's not a dead-6-year because I got many opportunities to learn something outside college within that time range. It's not a good example of course. But since it happens to me, I positively face it and be grateful of it. Because each person has their own life and problematic. I will graduate soon, so, Life, I'm ready. Bismillah :D

This post is my entry for 'My College Diary' contest held by travel blog My Yatra Diary in collaboration with Collegedunia.com
Daily kuliah Menulis Mikir Pendidikan Refleksi

4 Tipe Dosen

2 comments
Sudah 6 tahun hidup di kampus. Kalo ditambah cuti berarti udah 7 tahun. Fiuhh.. Ada banyak pengalaman yang bisa saya nikmati, yang kalo kata dosen saya, ada pengalaman dan manfaat yang lebih gede lagi kalo udah lulus. Fiuhh.. Anyway, saya menikmatinya. Saya melihat ini sebagai bagian dari jalan hidup saya, dengan sekelumit problematika dan pengalaman yang belum tentu dialami juga oleh orang lain. Kita bisa saja bilang, orang lain yang sudah lulus duluan tentunya punya pengalaman yang mungkin lebih wow. Ya, who knows kan? So, kalo orang lain bisa bersyukur dengan hidupnya, kenapa saya tidak? :)

Bicara mahasiswa, berarti erat kaitannya dengan dosen, orang yang mengajar mahasiswa. Setelah sekian lama kuliah, saya melihat ada beberapa pola menarik dari dosen secara khusus, atau pengajar pada umumnya. Pola yang saya maksud adalah tentang bagaimana dosen berinteraksi dengan mahasiswa, di dalam dan di luar kelas. Kalo Kamu pernah jadi mahasiswa, atau minimalnya siswa, Kamu pasti akan selalu bertemu dengan yang namanya dosen. Pasti lah. Inget ga dulu waktu SMP atau SMA, Kamu atau temen Kamu pernah bilang hal semacam ini: "Ah gue ga mudeng belajar matematika sama si Pak Anu, bawaannya ngantuk", atau "Yaelah, gimana bisa tenang belajar, si Ibu Anu itu dikit-dikit bentak, yang ada malah tegang". Kita terkadang atau seringkali mengomentari sikap dan cara guru kita mengajar, dan adakalanya juga menyalahkan guru kita atas kegagalan kita dalam belajar. Kita mungkin pernah berpikir, kita jadi tidak suka suatu mata pelajaran gara-gara gurunya begini begitu. Betul apa benar?

Sayangnya kalo kita terus-terusan kayak gitu, artinya menyalahkan guru atas kegagalan belajar kita, selamanya kita tidak akan pernah sukses. Saya yakin seyakin-yakinnya. Tapi saya juga yakin, semakin dewasa kita, kita akan sadar bahwa bagaimanapun kita menyalahkan dan mengutuk seorang guru, itu tidak akan pernah membuat kita lebih sukses. Guru akan tetap dengan kehidupannya, dan kita pun akan tetap dengan kegagalan hahaha.

Kalo udah jadi mahasiswa, kita udah ga bisa lagi ngerengek nyalahin guru kayak waktu dulu sekolah. Ga peduli kayak gimana dosen Kamu mengajar, Kamu mesti bisa survive dan tuntas belajarnya. Kalo kita kerjaanya cuma nyalahin dosen, sekencang apapun Kita berteriak mengutuk dosen yang ngajarnya ga becus, ingatlah dosen itu akan tetap dengan kehidupannya, dan Kita sampai kapanpun ga akan pernah lulus. Kita ga akan bisa mengubah orang lain. Kita hanya punya kendali pada diri kita sendiri. Kalo kasarnya sih, 'yang mau lulus itu siapa, elu apa dosen?'

Bertolak dari hal itu, mestinya kita mulai beralih sudut pandang kita terhadap pengajar. Kalo dulu waktu sekolah, kita mungkin memandang guru sebagai orang tua yang ada di sekolah yang punya banyak ilmu yang tanpanya kita ga akan bisa belajar dan lulus sekolah. Kalo di perkuliahan, saya lebih suka memandang dosen sebagai teman dalam belajar, teman yang harus kita hormati dan serap ilmunya. Setua apapun dosen, saya lebih suka menempatkan mereka sebagai teman, mungkin teman yang lebih tua. Tentu saja saya tetap memandang mereka juga sebagai guru yang harus dihormati dan didoakan oleh sebab ilmu yang mereka ajarkan. Dengan cara memandang seperti itu, saya bisa belajar lebih nyaman dan menyenangkan.

Namun, nyatanya saya sadari tidak semua dosen bisa dijadiin teman. Ada dosen yang gaul sama mahasiswa, ada juga yang menutup diri dan menjaga jarak. Ada yang baik banget sampe-sampe gampang banget ngasih nilai, ada juga yang killer. Tapi yang lebih menarik lagi dari itu, yang saya garis bawahi di awal tulisan. Ternyata tidak semua dosen yang menyenangkan itu selamanya menyenangkan, dan ga semua dosen yang killer itu selamanya killer. Kalo saya buat batasan yang jelas, saya yakin Kamu juga pasti bisa mengamati hal tersebut. Batasan yang saya maksud adalah bagaimana cara mereka berinteraksi dengan mahasiswa, di luar dan di dalam kelas. Biar gampang, saya gambarkan ke dalam bentuk tabel kebenaran, dengan parameter A = asyik di dalam kelas dan B = asyik di luar kelas.

|-------------|
|   A  |   B  |
|-------------|
|   0  |   0  | tipe 1
|   0  |   1  | tipe 2
|   1  |   0  | tipe 3
|   1  |   1  | tipe 4
|-------------|

Ngerti ga? Kalo Kamu pernah belajar logika matematika atau logika informatika mestinya bisa ngerti. Atau gimana kalo saya gambarin dalam bentuk kuadran, seperti di bawah ini:

|-----------------------------------------------|
|                 |  ga asyik di  |   asyik di  |
|                 |  luar kelas   |  luar kelas |
|-----------------------------------------------|
|                 |               |             |
|   ga asyik di   |       1       |      2      |
|  dalam kelas    |               |             |
|                 |               |             |
|-----------------------------------------------|
|                 |               |             |
|    asyik di     |       3       |      4      |
|   dalam kelas   |               |             |
|                 |               |             |
|-----------------------------------------------|

Tipe 1 : Ga Asyik di Dalam Maupun di Luar Kelas

Kayaknya dosen begini sibuk sama urusannya sendiri. Mungkin dia punya banyak kesulitan dalam hidupnya yang membuatnya jangankan berinteraksi dengan mahasiswa di luar kelas, untuk fokus dan totalitas mengajar di dalam kelas pun udah kewalahan. Kalo tidak begitu, mungkin memang bawaan sifatnya seperti itu.

Tipe 2 : Ga asyik di Dalam Kelas tapi Asyik di Luar Kelas

Pasti pernah nemuin kan dosen kayak gini. Dia killer pas ngajar, atau mungkin bikin ngantuk karena ngajarnya pake metode khutbah jumat, atau alasan lain yang bikin kita ga asyik belajar di kelas, tapi kalo di luar kelas enak diajak ngobrol dan diskusi, bahkan ketawa-ketawa dan share game PC terbaru? :D

Tipe 3 : Asyik di Dalam Kelas, Tapi ga Asyik di Luar Kelas

Pernah ga nemuin dosen yang ngajarnya keren, suasana kelas terbangun, mahasiswa semarak menyambut celotehan dosen yang lucu dan cerdas, tapi kalo ketemu di luar kelas sikapnya dingin, kayak yang tidak mau berinteraksi dengan mahasiswa atau berinteraksi seadanya? Saya pribadi kalo ketemu dosen kayak gini saya lebih memilih menghindar dan ambil jalan memutar hahaha~

Tipe 4 : Asyik di Dalam dan di Luar Kelas

Whoaaa.. ini dosen keren abis. Dia mendedikasikan hidupnya muntuk mengajar dan mendidik mahasiswanya, karena sejatinya pendidikan tidak cukup hanya terjadi di dalam kelas saja. Dia dosen yang sadar betul akan profesinya. Dan mungkin juga karena memang bawaan sifatnya seperti itu. Bukan berarti dosen yang engga masuk kuadran 4 ini ga profesional atau ga berdedikasi. Cuma yang pasti tipe 4 inilah yang menjadi dambaan para mahasiswa ahay..

Sekali lagi saya katakan, terlepas oleh dosen bertipe berapapun kita diajar, kesuksesan perkuliahan ada di tangan kita sendiri sebagai mahasiswa. Jangan gara-gara dosennya ga asyik lantas kita jadi reaktif dan enggan kuliah. Kalo sampe kayak gitu, ingatlah, dosen itu akan tetap dengan kehidupannya, dan kita akan tetap dalam kerugian. Bagaimanapun dosen kita, kita sebagai pembelajar tetap punya kewajiban untuk menghormati ilmu dan ulama yang dalam hal ini dosen, kalo pengen belajarnya sukses dan barokah. Urusan sifat dosen yang buruk, bukankah setiap manusia tidak luput dari kesalahan?

Sebenernya pengen bahas juga bagaimana sifat mahasiswa dari kacamata dosen. Jangan salah, kalo kita sebagai mahasiswa kerap kali merasa terzhalimi oleh dosen, dosen juga katanya tidak jarang terzhalimi oleh mahasiswa, sering di-PHP-in lah, mahasiswa nyontek lah, dan sebagainya. Sayangnya saya tidak dalam kapasitas sebagai dosen atau pengajar. Mungkin suatu saat kalo ada kesempatan.

So, kalo Kamu jadi dosen atau guru nanti, mau jadi tipe berapa?? :D
Bisnis Development Impression mumble

Startup is not about popularity, it is about a business.

Silakan Ngomen
Daily Refleksi Tafakur

Putar, dan Rasakan

Silakan Ngomen
Judulnya engga banget hahaha.. Asbabun nuzulnya ialah, ketika barusan, yaitu malam hari sekitar jam sepuluh, saya merendam handuk kecil yang saya pakai ngelap ingus waktu flu minggu lalu. Itu handuk saya cuci buat nantinya saya pake ngompres istri saya yang lagi demam. Saya cuci dulu supaya ketika dipakai ngompres, tidak ada ingus kering yang jadi basah dan licin kembali lalu menempel di jidat istri saya. Meskipun dia tidak akan tau, tapi tidak tega rasanya kalo harus liat ada ingus nempel di jidatnya.

Bersambung ke asbabun nuzul judul. Saat hendak nyuci handuk kecil itu, warnanya oranye. Ketika mulai dicuci pun tetap oranye. Karena khawatir ingusnya tidak luntur, maka saya ingin tambahkan detergen. Detergennya ada di dalam toples plastik. Saya buka tutup toples itu. Lumayan susah. Saya coba lebih kuat lagi. Masih susah. Kok rasanya makin keras saya putar, makin susah dibuka yah. Saya lalu cuci dulu tangan saya. Maksudnya biar engga licin karena ada butiran detergen yang udah nempel di tangan saya.

Percobaan kedua saya buka lagi tutup toples itu dan, wow, mudah sekali. Saya lihat ke ember air, dan bertanya-tanya, apakah barusan saya baru saja mencuci tangan dengan air ajaib. Saya tutup lagi toples itu. Saya buka dengan keras dan sulit sekali terbuka. Saya kendorkan tenaga, dan, Wow.. mudah sekali terbukanya. Saya yakin, Kamu pun pasti pernah mengalaminya.

Seketika itu saya langsung teringat adegan film, entah film apa, yang mana adegannya ada orang tua yang kesulitan melepaskan tutup toples. Lalu di tengah keseriusannya membuka tutup toples itu, datang anak kecil meminta toples itu dan ia pun membukanya, dengan mudah. Orang tua itu terheran-heran sambil mengerungkan dahinya. Rasanya sulit dipercaya. Apakah itu cerita si Superman saat masih kecil? Entahlah, tapi mungkin itu adalah wow seperti wow yang saya lontarkan di awal tadi. Mungkin terlihat lucu, tapi itu sangat mungkin. You know lah, leher toples kejepit, gaya gesekan membesar, dan sebagainya dan sebagainya.

Hikmah yang bisa saya tangkap di malam yang panas ini, salah satunya adalah, seringkali kita bersikeras mencapai sesuatu tapi pada akhirnya kita kelelahan dan kecewa. Tapi ada kalanya kita memasrahkan sesuatu dan tiba-tiba sesuatu itu malah datang menghampiri. Yaa, dan sebagainya lah. Kalo Kamu, kira-kira hikmah apa yang kepikiran??
Daily Mikir Refleksi Tafakur

Bukan "Karena Cinta"-nya, tapi "Karena Allah"-nya

Silakan Ngomen
“Tidaklah seseorang dari kalian sempurna imannya, sampai ia mencintai untuk saudaranya sesuatu yang ia cintai untuk dirinya.” [HR Bukhari]
Sudahkah kita bersahabat dan bersaudara karena Allah? Lalu sudahkah kita mencintai seseorang, siapapun itu, karena Allah? Pernahkah kau mengatakan, atau terbesit dalam hati untuk mengatakan, kepada seseorang dari lawan jenismu, "aku mencintaimu karena Allah"? Kalo pernah, cobalah cek, mampukah kau merelakan orang yang kau cintai itu untuk saudaramu "karena Allah"? Wow, mungkin itu sesuatu yang berat, atau sangat berat. Tapi, sesungguhnya yang utama itu bukan 'cinta'-nya, tapi 'karena Allah'-nya.

Mari kita simak sepenggal kisah indah, antara Salman al-Farisi dan Abu Darda`, dua orang shahabat Nabi SAW. Salman berasal dari Persia, ikut rombongan hijrah Nabi ke Madinah. Setelah tiba di Madinah, Nabi SAW. kemudian mempersaudarakan para shahabat yang ikut hijrah, kita sebut Muhajirin, dengan shahabat dari Madinah yang menerima kedatangan para Muhajirin, yang kita sebut dengan shahabat Anshar. Salahsatu yang dipersaudarakan adalah Salman dan Abu Darda`.

Suatu waktu, Salman menyukai seorang wanita shalihah dari kaum Anshar. Sudah bulat tekadnya untuk meminangnya. Namun walau bagaimanapun Madinah masih terasa asing olehnya. Madinah bukan tempat ia dilahirkan dan tumbuh dewasa. Madinah punya bahasa dan adat kebiasaan yang belum terlalu dikenalnya. Harus ada orang yang akrab dengan adat Madinah untuk membantunya sebagai juru bicara saat khitbah. Maka disampaikanlah niatan hatinya kepada saudaranya, Abu Darda.

”Subhanallaah. . wal hamdulillaah. .”, Abu Darda’ senang mendengarnya. Keduanya tersenyum bahagia dan berpelukan. Mereka menyiapkan segala sesuatunya untuk mengkhitbah wanita shalihah yang menjadi tujuan hati Salman. Setelah persiapan dirasa cukup, mereka pun pergi ke rumah wanita itu.

”Saya adalah Abu Darda’, dan ini adalah saudara saya Salman seorang Persia. Allah telah memuliakannya dengan Islam dan dia juga telah memuliakan Islam dengan amal dan jihadnya. Dia memiliki kedudukan yang utama di sisi Rasulullah Shallallaahu ’Alaihi wa Sallam, sampai-sampai beliau menyebutnya sebagai ahli bait-nya. Saya datang untuk mewakili saudara saya ini melamar putri Anda untuk dipersuntingnya.”, fasih Abu Darda’ berbicara dalam logat Bani Najjar yang paling murni.

”Adalah kehormatan bagi kami”, ucap tuan rumah, ”menerima Anda berdua, shahabat Rasulullah yang mulia. Dan adalah kehormatan bagi keluarga ini bermenantukan seorang shahabat Rasulullah yang utama. Akan tetapi hak jawab ini sepenuhnya saya serahkan pada puteri kami.”

Abu Darda dan Salman menunggu dengan berdebar-debar. Hingga sang ibu muncul kembali setelah berbincang-bincang dengan puterinya.

”Maafkan kami atas keterusterangan ini”, kata suara lembut itu. Ternyata sang ibu yang bicara mewakili puterinya. ”Tetapi karena Anda berdua yang datang, maka dengan mengharap ridha Allah saya menjawab bahwa puteri kami menolak pinangan Salman. Namun jika Abu Darda’ kemudian juga memiliki urusan yang sama, maka puteri kami telah menyiapkan jawaban mengiyakan.”

Keterusterangan yang disampaikan sang ibu di luar dugaan kedua shahabat itu. Tapi apa reaksi Salman?

”Allahu Akbar!”, seru Salman, ”Semua mahar dan nafkah yang kupersiapkan ini akan aku serahkan pada Abu Darda’, dan aku akan menjadi saksi pernikahan kalian!”

Wow. Coba Kamu bayangkan, bagaimana kalo kita ada pada posisi Abu Darda`. Kalo saya pasti kikuk dan ga enak lah sama saudara saya sendiri. Ini benar-benar diluar dugaan. Yang dalam dugaan kan paling cuma dua jawabannya, menerima atau menolak. Tapi ini ada opsi lain. Menolak dan akan menerima kalo Abu Darda` yang melamarnya. Kalo di versi sinetron mungkin akan sangat lebay pisan.

Hey, coba bayangkan juga kalo kita ada di posisi Salman. Ditembak sama jawaban begitu oleh ibu sang wanita, kita harus mampu memberi respon yang tepat, atau lebih tepatnya, mengkondisikan hati untuk merespon jawaban tersebut. Saya bisa saja menjawab "ya sudah sama Kamu saja Bro", tapi apakah hati saya juga mampu mengatakan hal yang sama?

Hmmm.. Salman, sekalipun bukan saudara kandung, melainkan dipersaudarakan oleh Nabi, persaudaraan yang jauh lebih erat dari persaudaraan apapun, dengan senang hati merelakan apa yang dicintainya untuk saudaranya. Di satu sisi memang punya hak apa Salman melarang Abu Darda` untuk lantas meminang wanita tersebut. Tapi di luar hal tersebut, Salman punya kerelaan hati, yang saya yakin tidak akan pernah dimiliki oleh Salman kalo dia tidak mencintai karena Allah.

Bila Kamu dihadapkan oleh situasi yang serupa, apakah Kamu akan mempertahankan egomu untuk mencintai sang wanita meskipun cinta itu tidak akan pernah terbalas, yang mungkin akan berujung pada keretakan persaudaraanmu? Bisa saja kan endingnya, saudaramu mengalah dan kalian pulang dengan tangan hampa. Kamu tau saudaramu juga pasti ga enak hati dong, apalagi liat respon kamu kayak gitu. Tapi, terlepas dari saudaramu itu suka atau tidak sama wanita tadi, terlepas dari saudaramu akan melamar atau tidak wanita tadi, mampukah Kamu merelakan rasa cintamu untuk kemudian diberikan kepada saudaramu? That's the question. :)

Tambahan. Sekedar motivasi. Allah memberi jaminan perlindungan kepada 7 golongan orang di akhirat nanti. Salahsatunya adalah dua orang yang mencintai karena Allah, bertemu karena Allah dan berpisah karena Allah. Kalo Kamu mencintai seseorang, pastikan cintamu karena Allah. Bagaimana caranya mencintai karena Allah? Yaa, saya kira jawaban yang baru saja saya temukan, yang paling tepat hingga saat ini buat saya adalah, "bukan 'karena cinta'-nya, tapi 'karena Allah'-nya. Mampukah faktor 'karena Allah' itu tetap ada ketika cinta dan orang yang dicintai kandas?"


---
rujukan: http://blog.al-habib.info/id/2012/03/kisah-cinta-dan-kebesaran-hati-salman-al-farisi.html
Codeigniter Development Repositori

CMS tanpa Database Server

Silakan Ngomen
Seminggu terakhir di akhir bulan Ramadhan, saya bersama Oriza salahsatu kru Nyankod, awalnya berencana membuat koleksi data statis yang nantinya bisa diakses dari internet. Koleksi data yang dimaksud itu seperti daftar provinsi Indonesia, daftar mata uang dunia, tarif jasa ekspedisi dan lain sebagainya. Kadangkala kita perlu data semacam itu di dalam aplikasi kita. Tapi setiap kali perlu ternyata mesti nyari lagi datanya. Nah pengennya, ketika perlu, tinggal cari aja di aplikasi, kalo ada tinggal tarik aja pake API gitu.

Ternyata, dari ide itu malah menjalar ke ide lain. Ketika mulai ngembangin, pake framework CodeIgniter, awalnya saya pasang static CMS berbasis file Fizl buat dokumentasi. Dari situ ternyata saya malah fokus mikirin penulisan dokumentasinya. Saya rombak sana sini itu sistem Fizl. Dan hampir 80% rewrite (karena memang sedikit file sistem Fizlnya). Akhirnya saya pisahkan itu sistem CMS dan menambahkan fitur blog di dalamnya.

Saya suka sistem ini karena dengan ini saya bisa bikin web dan mempublikasikan konten dengan cepat dan mudah, tanpa perlu buka browser. Tinggal bikin file, tulis konten, upload. Beres, konten pun sudah langsung tampil di webnya. Ga perlu instalasi database karena ga pake database server seperti MySQL dan PostgreSQL.

Saya memutuskan untuk membuat CMS ini sebagai produk yang berdiri sendiri, di bawah nama Nyankod. Saya kemudian bertanya di forum internal Nyankod untuk memberi nama CMS ini. Diputuskanlah satu nama yang akan kami publikasikan nanti ketika sudah siap rilis. Kami akan rilis nanti kalo dokumentasinya sudah rapih dan enak dibaca. CMS ini akan kami rilis di bawah salah satu lisensi open source dan dihost di github supaya temen-temen developer lain yang tertarik bisa ikut mengembangkan.

Tunggu saja yah tanggal rilisnya. Pantengin terus @NyankodTWEET dan fanpage Nyankod. :D
Bisnis Diary Rezeki Kewirausahaan Mikir

Sudut Pandang Baru dari
"Laba = Penjualan - Pembelian"

Silakan Ngomen
Dalam dunia usaha kita sudah terbiasa dengan rumus seperti pada judul di atas. Memang benar dan sederhana, dan dapat dipahami oleh orang bukan pedagang sekalipun. Laba adalah harga jual setelah dikurangi biaya produksi atau modal. Dalam kalimat lain dapat dikatakan, jika penjualan lebih besar dari pembelian, maka ia dikatakan laba atau untung, dan bila penjualan lebih kecil daripada pembelian, maka ia dikatakan rugi.

Sekarang mari kita lihat penerapan lain dari rumus ini, dikaitkan dengan konsep pasar.

Pasar
=
Permintaan / Konsumsi
-
Penawaran / Produksi
+∞
=
-
0
-∞
=
0
-

Pasar dikatakan ada atau tersedia ketika ada kebutuhan yang dipenuhi, ada permintaan yang terpenuhi oleh penawaran. Contoh sederhananya kita lihat secara real di pasar. Orang bertemu di pasar karena ada yang butuh sesuatu dan ada yang menyediakan barang yang dibutuhkan. Dari sini kita bisa lihat bahwa faktor permintaan menjadi pencetus munculnya pasar.

Baris selanjutnya adalah patokan penting yang tidak boleh diabaikan dalam berwirausaha. Ketika ada permintaan, meskipun kita tidak punya produk yang dibutuhkan, ini bisa jadi peluang pasar yang besar, atau saya beri tanda simbol +∞. Tapi bila kita punya faktor produksi, atau punya produk, yang mana tidak ada permintaan untuk produk tersebut, atau tidak ada orang yang butuh dengan produk kita, maka itu akan jadi kerugian yang tidak terbatas pula. Dari sinilah kita mesti berpegang pada kebutuhan pasar sebelum membuat produk.
chat Daily geje

Jarum Kecos

Silakan Ngomen

Suatu malam Kayah sedang ngegodain si Kamah. Lalu si Kamah yang lagi sibuk bikin baju buat boneka menyeringai.

  • Kamah: Kamu ga tau aku lagi pegang apa?! #nada_tinggi
  • Kayah: Tau kok, itu jarum, dan kain, dan benang
  • Kamah: Kamu tau apa yang bisa kulakukan dengan ini?? *sambil menyodorkan jarum
  • Kayah: hmm.. menjahit?
  • Kamah: Kamu tau apa yang bisa aku lakukan dengan jarum ini kalo aku lagi kesel??
  • Kayah: hmm.. menjahit lebih banyak?
  • Kamah: –_–#
Daily Menulis Review Software

Nyoba Posting dari Windows Live Writer

2 comments

windows-live-writer-1

 

Kereen! Baru ngetik judul aja, itu font judulnya udah sama dengan yang dipake di web.

 

Awalnya sih pengen bisa nulis blog tanpa mesti buka browser. Tinggal ketik, langsung terpasang. Saya ga perlu cek lagi itu di web. Atau bolehlah cek, tapi ga mesti ketik di browser. Alasannya, kadangkala ini koneksi terputus dan ketikan ga bisa disimpan. Terpaksa mesti dikopi dulu ke Notepad atau Gedit, baru kemudian disave untuk nanti bisa diposting kalo udah dapet koneksi lagi. Tapi meskipun ga ribet2 banget dengan cara begitu, rasanya kalo bisa ketik dan simpan di lokal hingga nanti dapet koneksi untuk dipublis kayaknya lebih nyaman. Dan pencarian ini membuahkan hasil. Dikasih tau sama Mamang Aufa katanya ada, yang ada kata live dan writer-nya , dan ketemulah sama beberapa kandidat client side blogging, salahsatunya ini yang dimaksud, Windows Live Writer (WLW).

 

WLW ini adalah salahsatu aplikasi gratis, bagian dari bundle Microsoft Essentials. Aplikasi gratis lainnya adalah Photo Gallery, Movie Maker, Windows Live Mail, dan OneDrive. Aplikasi lainnya mudah-mudahan ada waktu nanti buat review singkat.

 

Udah nyoba beberapa fitur. Bikin tautan gampang banget, jadi lebih cepet dengan sedikit klik, apalagi link yang udah dikopi ke clipboard otomatis terpasang di kolom URL. Pasang gambar juga gampang. Tinggal browse dan pilih gambar yang mau diunggah. Hanya saja pengaturan ukuran gambar, meskipun udah bisa custom dengan node di samping dan sudut gambar yang bisa didrag untuk mengatur ukuran, masih lebih simpel cara blogger yang memberikan opsi ukuran seperti Small, Medium, Large, X-Large dan Original Size. Selain itu masih banyak lagi fitur yang sudah lebih dari cukup untuk keperluan blogging. Bahkan WLW ini menyediakan tab untuk menampilkan preview dan kode HTMLnya. Dan yang ane suka banget, WLW ini ga gegabah menterjemahkan style dari teks yang kita kopi dari suatu website yang mana sudah dikenai style. WLW mem-paste sebagai teks yang bersih dari style sehingga tidak mengganggu style bawaan blog kita. :D

 

Tampilan jendela WLW ini pun udah menyesuaikan dengan jamannya Windows, terutama dengan style Ribbon. Ditambah lagi, ada pengecekan spelling check dan thesaurus seperti yang ada di Microsoft Office. Dan satu lagi yang bikin elegan, adalah layout menulis yang nampaknya mengikuti layout tampilan blog kita. Karena layout blog saya ada ruang sidebar di kiri dan di kanan, jadi ruang menulis saya di WLW ini jadi ada space kosong di kiri dan kanannya. Elegaaan… @o@

 

Terakhir, WLW ini bisa dipakai untuk blogging di lebih dari satu akun, dengan banyak platform blog yang disupport seperti Blogger (yang sedang saya pakai), Wordpress, LiveJournal, TypePad, Telligent Community, PBlogs.gr, JournalHome, the MetaWeblog API, the Movable Type API, Blogengine, Squarespace dan lain-lain.

 

Overall, recommended buat para blogger yang hanya ingin fokus nulis konten, dan terutama sama yang punya keterbatasan koneksi, kayak saya hehehe..

 

Update setelah publish : Tampilan setelah publish sempurna, tanpa ada yang kelewat dan style yang berlebih. :)

 

Update yang kelupaan : Saat setup pertama kali, karena saya pake blogger, yang mana autentikasinya dari Google, itu gagal mulu. Ternyata google memberitahukan melalui email bahwasanya ada percobaan sign in yang kemudian sengaja diblok oleh Google dengan alasan keamanan. Itu bisa disetting dengan mengaktifkan less secure apps di Google settings. Nanti kalo ketemu yang begitu juga dikasih tau kok sama Google, tinggal ikutin aja langkah-langkahnya. :) Buat settingan di Wordpress saya belum coba. So kalo ada yang udah nyoba, share juga ya :)

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.
Daily Impression Refleksi Tafakur videos

Jangan Pernah Bilang "Huh!", Walau Bagaimanapun

Silakan Ngomen
Pernahkah kau sebagai anak merasa kesal atau sebel karena dimintai tolong sama mamahmu buat beli ini itu ke warung? Atau pernahkah kau sebagai cucu merasa kesal karena kelakuan nenekmu yang cerewet? Saya pernah mengalami keduanya.

Tidak ada alasan untuk membenci ibu dan ayah kita, nenek dan kakek kita, walau bagaimanapun. Tidak akan pernah ada alasan yang cukup melegitimasi kita untuk mendengus, apalagi membentak mereka, walau bagaimanapun. Sebodoh apapun mereka, seburuk dan sejahat apapun mereka. Bahkan ketika orang tua kita menyuruh kita untuk berbuat durhaka kepada Allah, kita tetap wajib memperlakukan mereka dengan baik/ma'ruf.

Silakan saksikan video ini, semoga menginspirasi.


Daily Tafakur

Cuma Kurang Satu Menit Saja

Silakan Ngomen

Pulang dari kampus, setelah main-main bentar sama Wil lalu ngelonin dia (mamahnya sih yang ngelonin), akhirnya Wil pun tertidur, bersama saya yang kecapean. Si Kamah ngingetin saya supaya posting dulu karena hari ini belum posting. Tapi saya sudah terlanjur ngantuk dan berharap di detik-detik terakhir pergantian hari, saya bangun dan terjaga buat posting.

Benarlah, saya bangun tengah malam, dibangunin sama si Kamah. "A, udah jam 11:57, cepetan posting". Aku yang masih lulungu seketika loncat dari kasur dan membuka laptop. Syukurlah laptop sudah dinyalain sama si Kamah. Tapi masalahnya, modemnya belum nyolok. Rencananya saat itu yang penting bikin judul dulu kemudian posting. Kontennya nyusul kemudian.

Modem sudah dicolokin. Singggg... sunyi. Nunggu suara "Dongdeng.. Dengdong.." (suara notifikasi kalo ada perangkat yang terkoneksi dengan komputer. Saya pake Ubuntu). Satu menit sudah berlalu. Sambil nunggu koneksi masuk, saya buka browser. Singgg.... sunyi. Saya ketikkan blogger.com. Ga konek. Saya refresh berkali-kali. Berkali-kali. Masuklah ke blogger. Saya tekan tombol Buat Entri. Loading. Loading. Muncul halaman form entri. Udah 23:59. Saya ketikkan judul, lalu klik tombol Publikasikan. Loading. Loading. Halaman browser akhirnya kembali ke daftar post, yang tandanya sudah berhasil publis. Saat itu pukul 00:00, berarti sudah pindah hari.

Saya buka homepage, dan benarlah posting yang baru saja saya post itu ternyata terpasang di hari kamis. Cuma kurang satu menit saja padahal. Saya berpikir dan terheran-heran jadinya, kenapa 00:00 itu masuk ke hari yang baru, bukan menit terakhir hari yang sebelumnya -____-

Rasanya ingin geser menit, satu meniiit saja. Tapi tak ayal, itu jam settingan server si google, bukan jam di komputer saya, meskipun bisa saya manipulasi tanggalnya, tapi hati berkata "jangan.."

Satu menit begitu berharga. Bahkan mungkin itu dalam hitungan detik. Kita tidak bisa kembali mundur walau cuma satu detik. Baru kali ini saya merasakan ketegangan dikejar-kejar detik. Saya jadi inget satu kisah:
Dan belanjakanlah sebagian dari apa yang telah Kami berikan kepadamu sebelum datang kematian kepada salah seorang di antara kamu; lalu ia berkata:` Ya Tuhanku, mengapa Engkau tidak menangguhkan (kematian) ku sampai waktu yang dekat, yang menyebabkan aku dapat bersedekah dan aku termasuk orang-orang yang saleh? Dan Allah sekali-kali tidak akan menangguhkan (kematian) seseorang apabila datang waktu kematiannya. Dan Allah Maha Mengenal apa yang kamu kerjakan.
Itu adalah gambaran seseorang setelah ia mati lalu dihidupkan kembali, sehingga ia dengan segala penyesalannya berharap untuk dihidupkan kembali dari kematian lalu menambal amal kebaikan yang kurang sehingga amalnya bisa menyelamatkannya, meskipun cuma satu menit saja. Sayangnya, Allah sekali-kali tidak akan pernah menangguhkan kematian seseorang apabila datang waktu kematiannya.

Kejadiannya persis seperti saya yang dikejar-kejar deadline 23:59. Sekali-kali waktu itu tidak dapat dimundurkan. Sekali-kali tidak dapat aku kembali ke menit-menit sebelumnya supaya postingnya lebih leluasa. Saat itu saya hanya tinggal menunggu waktu hingga ia tiba di angka 00:00 maka habislah waktu posting saya hari itu dan sekali-kali waktu tidak akan dapat ditangguhkan.

Semoga saya, dan keluarga saya, dan sahabat saya, tidak termasuk orang-orang yang melalaikan waktu meski hanya satu detik, untuk tertinggal amalan, sehingga menjadi kelompok orang yang merugi di akhirat seperti gambaran pada ayat di atas, al-Munafiqun: 10-11.

Sasya pun tidur lagi, sembari menghitung berapa banyak uang yang tersisa untuk bisa mentraktir teman-teman #ODOBP. Oh, ternyata masih banyak.
Daily Nonton Tafakur

Ceritanya Mau Ngejelasin Racun Curare

2 comments
Akhir-akhir ini rasanya malam jadi susah tidur dan pagi jadi sering ngantuk. Mungkin karena beberapa minggu lalu ngerjain proyek sampe nginep-nginep di lab sambil begadang sampe subuh lalu tidur setelah solat shubuh, sehingga sepertinya jadwal tubuhku berubah. Seperti malam ini. Habis nonton bareng sama si Ayay. Ayay itu panggilan saya buat istri saya, dan itu khusus buat saya saja yang boleh pake. Kalo kamu mau manggil istri saya dengan sebutan selain nama, silakan pake nama Kibu. Iya, kami nonton film serial Arrow. Jangan tanya dari mana saya dapat, karena saya ga ngebajak. Cuma dikasih teman saja, itupun dia yang nawarin buat dikopiin ke harddisk saya.

Saya nonton ampe episode ke-3. Saat itu beres, si Kibu sudah ketiduran. Di episode ketiga itu saya dapet istilah curare. Saya serta merta mengingat-ingat kembali darimana saya dapet istilah itu sebelumnya. Ternyata saya ingat. Istilah itu juga digunakan di dalam film serial Sherlock BBC. Kalo episode keberapanya saya lupa dan males nginget-ngingetnya. Curare itu nama salahsatu jenis racun. Karena penasaran jadi saya googling deh. Nemu beberapa referensi dari blog-blog berbahasa Indonesia. Lumayan ada gambaran, tapi sepertinya ga selengkap dari apa yang saya temukan di Wikipedia. Yang bahasa Indonesianya ga ada. Pengen kontribusi, tapi lagi malas dan malas pake mantera "Allohumma, Paksakeun". Tautannya disini http://en.wikipedia.org/wiki/Curare. Kamu juga pasti bisa nemu kalo mau googling. Tapi kan ada malesnya kalo engga bener-bener niat pengen tau. Jadi saya jelasin sekilas disini, sebagai ganjaran dari kamu yang sudah bersusah payah buka blog saya. Penjelasan berikut saya rangkum dari tautan yang diatas itu.

Curare, adalah istilah umum yang digunakan untuk berbagai ekstrak tanaman alkaloid yang biasa digunakan sebagai racun panah, yang berasal dari Amerika tengah dan Selatan. Racun ini melemahkan otot-otot rangka dan pada dosis tertentu menyebabkan kematian oleh sesak napas karena kelumpuhan diafragma. Racun ini digunakan oleh orang-orang pribumi Amerika Selatan untuk berburu dan berperang.

Waduh panjang dan belibet gening penjelasannya. Yaudah kalo ada waktu dan niat, nanti saya sambung lagi. Udah malem, mesti tidur biar besok ga ngantuk di motor hehe..
Codeigniter Daily Development pictures Repositori

Nyoba CodeIgniter 3.0-dev

Silakan Ngomen
Tampilan baru (mungkin sementara) user guide CodeIgniter 3.0-dev

Setelah versi 2.2.0 rilis tanggal 5 Juni kemarin, saya jadi penasaran pengen nengok repositorinya di github (https://github.com/EllisLab/CodeIgniter). Ternyata untuk versi 3.0 cuma tersisa satu issue lagi, yakni librari Session yang baru. Sudah jadi, tinggal dites untuk recording session ke database pada database selain mysql. Kalo itu udah beres, maka tinggal dirilis deh versi 3 inih. Melihat ini saya jadi cukup yakin sekarang buat pake CodeIgniter versi 3 ini untuk diimplementasikan lebih awal di sistem inti Devository yang sedang kami (tim pengembang Nyankod) selesaikan.

Bicara CI 3, ada banyak sekali peningkatan dan penambahan fitur, plus beberapa perbaikan dari sisi keamanan. Berikut daftar perubahan dari versi 2.2.0 ke versi 3. Memang cukup panjang, tapi saya pribadi seru bacanya. :D

Lihat Changelog
  • License
    • CodeIgniter has been relicensed with the Open Software License (3.0), eliminating its old proprietary licensing.
      • All system files are licensed with OSL 3.0.
      • Config, error, and sample files shipped in the application folder are
        licensed with the Academic Free License (3.0) to allow you to retain
        all licensing authority over your own application code.
  • General Changes
    • PHP 5.1.6 is no longer supported. CodeIgniter now requires PHP 5.2.4.
    • Changed filenaming convention (class file names now must be Ucfirst and everything else in lowercase).
    • Changed the default database driver to ‘mysqli’ (the old ‘mysql’ driver is DEPRECATED).
    • $_SERVER['CI_ENV'] can now be set to control the ENVIRONMENT constant.
    • Added an optional backtrace to php-error template.
    • Added Android to the list of user agents.
    • Added Windows 7, Windows 8, Windows 8.1, Android, Blackberry, iOS and PlayStation 3 to the list of user platforms.
    • Added Fennec (Firefox for mobile) to the list of mobile user agents.
    • Ability to log certain error types, not all under a threshold.
    • Added support for pem, p10, p12, p7a, p7c, p7m, p7r, p7s, crt, crl, der, kdb, rsa, cer, sst, csr Certs to mimes.php.
    • Added support for pgp, gpg, zsh and cdr files to mimes.php.
    • Added support for 3gp, 3g2, mp4, wmv, f4v, vlc Video files to mimes.php.
    • Added support for m4a, aac, m4u, xspf, au, ac3, flac, ogg, wma Audio files to mimes.php.
    • Added support for kmz and kml (Google Earth) files to mimes.php.
    • Added support for ics Calendar files to mimes.php.
    • Added support for rar, jar and 7zip archives to mimes.php.
    • Updated support for xml (‘application/xml’) and xsl (‘application/xml’, ‘text/xsl’) files in mimes.php.
    • Updated support for doc files in mimes.php.
    • Updated support for docx files in mimes.php.
    • Updated support for php files in mimes.php.
    • Updated support for zip files in mimes.php.
    • Updated support for csv files in mimes.php.
    • Added Romanian, Greek, Vietnamese and Cyrilic characters in application/config/foreign_characters.php.
    • Changed logger to only chmod when file is first created.
    • Removed previously deprecated SHA1 Library.
    • Removed previously deprecated use of $autoload['core'] in application/config/autoload.php.
      Only entries in $autoload['libraries'] are auto-loaded now.
    • Removed previously deprecated EXT constant.
    • Updated all classes to be written in PHP 5 style, with visibility declarations and no var usage for properties.
    • Moved error templates to application/views/errors/.
    • Added support non-HTML error templates for CLI applications.
    • Made error templates path configurable using $config['error_views_path'].
    • Moved the Log class to application/core/
    • Global config files are loaded first, then environment ones. Environment config keys overwrite base ones, allowing to only set the keys we want changed per environment.
    • Changed detection of $view_folder so that if it’s not found in the current path, it will now also be searched for under the application folder.
    • Path constants BASEPATH, APPPATH and VIEWPATH are now (internally) defined as absolute paths.
    • Updated email validation methods to use filter_var() instead of PCRE.
    • Changed environment defaults to report all errors in development and only fatal ones in testing, production but only display them in development.
    • Updated ip_address database field lengths from 16 to 45 for supporting IPv6 address on Trackback Library and Captcha Helper.
    • Removed cheatsheets and quick_reference PDFs from the documentation.
    • Added availability checks where usage of dangerous functions like eval() and exec() is required.
    • Added support for changing the file extension of log files using $config['log_file_extension'].
    • Added support for turning newline standardization on/off via $config['standardize_newlines'] and set it to FALSE by default.
  • Helpers
    • Date Helper changes include:
      • Added an optional third parameter to timespan() that constrains the number of time units displayed.
      • Added an optional parameter to timezone_menu() that allows more attributes to be added to the generated select tag.
      • Added function date_range() that generates a list of dates between a specified period.
      • Deprecated standard_date(), which now just uses the native date() with DateTime constants.
      • Changed now() to work with all timezone strings supported by PHP.
      • Changed days_in_month() to use the native cal_days_in_month() PHP function, if available.
    • URL Helper changes include:
      • Deprecated separator options dash and underscore for function url_title() (they are only aliases for ‘-‘ and ‘_’ respectively).
      • url_title() will now trim extra dashes from beginning and end.
      • anchor_popup() will now fill the href attribute with the URL and its JS code will return FALSE instead.
      • Added JS window name support to the anchor_popup() function.
      • Added support (auto-detection) for HTTP/1.1 response codes 303, 307 in redirect().
      • Changed redirect() to choose the refresh method only on IIS servers, instead of all servers on Windows (when auto is used).
      • Changed anchor(), anchor_popup(), and redirect() to support protocol-relative URLs (e.g. //ellislab.com/codeigniter).
    • HTML Helper changes include:
      • Added more doctypes.
      • Changed application and environment config files to be loaded in a cascade-like manner.
      • Changed doctype() to cache and only load once the doctypes array.
      • Deprecated functions nbs() and br(), which are just aliases for the native str_repeat() with &nbsp; and <br /> respectively.
    • Inflector Helper changes include:
    • Download Helper changes include:
      • Added an optional third parameter to force_download() that enables/disables sending the actual file MIME type in the Content-Type header (disabled by default).
      • Added a work-around in force_download() for a bug Android <= 2.1, where the filename extension needs to be in uppercase.
      • Added support for reading from an existing file path by passing NULL as the second parameter to force_download() (useful for large files and/or safely transmitting binary data).
    • Form Helper changes include:
      • form_dropdown() will now also take an array for unity with other form helpers.
      • form_prep()‘s second argument now only accepts a boolean value, which determines whether the value is escaped for a <textarea> or a regular <input> element.
    • Security Helper changes include:
    • Smiley Helper changes include:
      • Removed previously deprecated function js_insert_smiley().
      • Changed application and environment config files to be loaded in a cascade-like manner.
      • The smileys array is now cached and loaded only once.
    • File Helper changes include:
      • set_realpath() can now also handle file paths as opposed to just directories.
      • Added an optional paramater to delete_files() to enable it to skip deleting files such as .htaccess and index.html.
      • Deprecated function read_file() - it’s just an alias for PHP’s native file_get_contents().
    • String Helper changes include:
      • Deprecated function repeater() - it’s just an alias for PHP’s native str_repeat().
      • Deprecated function trim_slashes() - it’s just an alias for PHP’s native trim() (with a slash as its second argument).
      • Deprecated randomization type options unique and encrypt for funcion random_string() (they are only aliases for md5 and sha1 respectively).
    • CAPTCHA Helper changes include:
      • Added word_length and pool options to allow customization of the generated word.
      • Added colors configuration to allow customization for the background, border, text and grid colors.
      • Added filename to the returned array elements.
    • Text Helper changes include:
    • Directory Helper directory_map() will now append DIRECTORY_SEPARATOR to directory names in the returned array.
    • Array Helper element() and elements() now return NULL instead of FALSE when the required elements don’t exist.
    • Language Helper lang() now accepts an optional list of additional HTML attributes.
    • Deprecated the Email Helper as its valid_email(), send_email() functions are now only aliases for PHP native functions filter_var() and mail() respectively.
  • Database
    • DEPRECATED the ‘mysql’, ‘sqlite’, ‘mssql’ and ‘pdo/dblib’ (also known as ‘pdo/mssql’ or ‘pdo/sybase’) drivers.
    • Added dsn configuration setting for drivers that support DSN strings (PDO, PostgreSQL, Oracle, ODBC, CUBRID).
    • Added schema configuration setting (defaults to public) for drivers that might need it (currently used by PostgreSQL and ODBC).
    • Added subdrivers support (currently only used by PDO).
    • Added an optional database name parameter to db_select().
    • Removed protect_identifiers() and renamed internal method _protect_identifiers() to it instead - it was just an alias.
    • Renamed internal method _escape_identifiers() to escape_identifiers().
    • Updated escape_identifiers() to accept an array of fields as well as strings.
    • MySQL and MySQLi drivers now require at least MySQL version 5.1.
    • Added a $persistent parameter to db_connect() and changed db_pconnect() to be an alias for db_connect(TRUE).
    • db_set_charset() now only requires one parameter (collation was only needed due to legacy support for MySQL versions prior to 5.1).
    • db_select() will now always (if required by the driver) be called by db_connect() instead of only when initializing.
    • Replaced the _error_message() and _error_number() methods with error(), which returns an array containing the last database error code and message.
    • Improved version() implementation so that drivers that have a native function to get the version number don’t have to be defined in the core DB_driver class.
    • Added capability for packages to hold config/database.php config files.
    • Added MySQL client compression support.
    • Added encrypted connections support (for mysql, sqlsrv and PDO with sqlsrv).
    • Removed Loader Class from Database error tracing to better find the likely culprit.
    • Added support for SQLite3 database driver.
    • Added Interbase/Firebird database support via the ibase driver.
    • Added ODBC support for create_database(), drop_database() and drop_table() in Database Forge.
    • Added save_queries configuration setting to application/config/database.php (defaults to TRUE).
    • Query Builder changes include:
      • Renamed the Active Record class to Query Builder to remove confusion with the Active Record design pattern.
      • Added the ability to insert objects with insert_batch().
      • Added new methods that return the SQL string of queries without executing them: get_compiled_select(), get_compiled_insert(), get_compiled_update(), get_compiled_delete().
      • Added an optional parameter that allows to disable escaping (useful for custom fields) for methods join(), order_by(), where_in(), or_where_in(), where_not_in(), or_where_not_in(), insert(), insert_batch().
      • Added support for join() with multiple conditions.
      • Added support for USING in join().
      • Added support for EXISTS in where().
      • Added seed values support for random ordering with order_by(seed, 'RANDOM').
      • Changed limit() to ignore NULL values instead of always casting to integer.
      • Changed offset() to ignore empty values instead of always casting to integer.
      • Methods insert_batch() and update_batch() now return an integer representing the number of rows affected by them.
    • Database Results changes include:
      • Added a constructor to the DB_result class and moved all driver-specific properties and logic out of the base DB_driver class to allow better abstraction.
      • Added method unbuffered_row() for fetching a row without prefetching the whole result (consume less memory).
      • Renamed former method _data_seek() to data_seek() and made it public.
    • Improved support for the MySQLi driver, including:
      • OOP style of the PHP extension is now used, instead of the procedural aliases.
      • Server version checking is now done via mysqli::$server_info instead of running an SQL query.
      • Added persistent connections support for PHP >= 5.3.
      • Added support for backup() in Database Utilities.
      • Changed methods trans_begin(), trans_commit() and trans_rollback() to use the PHP API instead of sending queries.
    • Improved support of the PDO driver, including:
      • Added support for create_database(), drop_database() and drop_table() in Database Forge.
      • Added support for list_fields() in Database Results.
      • Subdrivers are now isolated from each other instead of being in one large class.
    • Improved support of the PostgreSQL driver, including:
      • pg_version() is now used to get the database version number, when possible.
      • Added db_set_charset() support.
      • Added support for optimize_table() in Database Utilities (rebuilds table indexes).
      • Added boolean data type support in escape().
      • Added update_batch() support.
      • Removed limit() and order_by() support for UPDATE and DELETE queries as PostgreSQL does not support those features.
      • Added a work-around for dead persistent connections to be re-created after a database restart.
      • Changed db_connect() to include the (new) schema value into Postgre’s search_path session variable.
      • pg_escape_literal() is now used for escaping strings, if available.
    • Improved support of the CUBRID driver, including:
      • Added DSN string support.
      • Added persistent connections support.
      • Improved list_databases() in Database Utility (until now only the currently used database was returned).
    • Improved support of the MSSQL and SQLSRV drivers, including:
      • Added random ordering support.
      • Added support for optimize_table() in Database Utility.
      • Added escaping with QUOTE_IDENTIFIER setting detection.
      • Added port handling support for UNIX-based systems (MSSQL driver).
      • Added OFFSET support for SQL Server 2005 and above.
      • Added db_set_charset() support (MSSQL driver).
      • Added a scrollable property to enable configuration of the cursor to use (SQLSRV driver).
      • Added support and auto-detection for the SQLSRV_CURSOR_CLIENT_BUFFERED scrollable cursor flag (SQLSRV driver).
      • Changed default behavior to not use SQLSRV_CURSOR_STATIC due to performance issues (SQLSRV driver).
    • Improved support of the Oracle (OCI8) driver, including:
      • Added DSN string support (Easy Connect and TNS).
      • Added support for drop_table() in Database Forge.
      • Added support for list_databases() in Database Utilities.
      • Generally improved for speed and cleaned up all of its components.
      • num_rows() is now only called explicitly by the developer and no longer re-executes statements.
    • Improved support of the SQLite driver, including:
    • Database Forge changes include:
      • Added an optional second parameter to drop_table() that allows adding the IF EXISTS condition, which is no longer the default.
      • Added support for passing a custom database object to the loader.
      • Added support for passing custom table attributes (such as ENGINE for MySQL) to create_table().
      • Added support for usage of the FIRST clause in add_column() for MySQL and CUBRID.
      • Deprecated add_column()‘s third method. AFTER clause should now be added to the field definition array instead.
      • Overall improved support for all of the drivers.
    • Database Utility changes include:
      • Added support for passing a custom database object to the loader.
      • Modified the class to no longer extend Database Forge, which has been a deprecated behavior for awhile.
      • Overall improved support for all of the drivers.
      • Added foreign_key_checks option to MySQL/MySQLi backup, allowing statement to disable/re-enable foreign key checks to be inserted into the backup output.
  • Libraries
    • Added a new Encryption Library to replace the old, largely insecure Encrypt Library.
    • Encrypt Library changes include:
      • Deprecated the library in favor of the new Encryption Library.
      • Added support for hashing algorithms other than SHA1 and MD5.
      • Removed previously deprecated sha1() method.
    • Session Library changes include:
      • Library changed to Driver with classic ‘cookie’ driver as the default.
      • Added a ‘native’ PHP Session driver to work with $_SESSION.
      • Added a new tempdata feature that allows setting userdata items with expiration time (tempdata(), set_tempdata(), unset_tempdata()).
      • Added default $config['sess_driver'] and $config['sess_valid_drivers'] items to application/config.php file.
      • Changed ‘cookie’ driver to respect php.ini’s session.gc_probability and session.gc_divisor settings.
      • Changed ‘cookie’ driver to use HMAC authentication instead of a simple md5 checksum.
      • Changed ‘cookie’ driver to select only one row when using database sessions.
      • Changed ‘cookie’ driver to write to only write to the database at end of page execution.
      • Changed method keep_flashdata() to also accept an array of keys.
      • Changed methods userdata(), flashdata() to return an array of all userdata/flashdata when no parameter is passed.
      • Deprecated method all_userdata() - it is now just an alias for userdata() with no parameters.
      • Added method has_userdata() that verifies the existence of a userdata item.
      • Added debug level log messages for key events in the session validation process.
    • File Uploading Library changes include:
      • Added method chaining support.
      • Added support for using array notation in file field names.
      • Added max_filename_increment and file_ext_tolower configuration settings.
      • Added min_width and min_height configuration settings for images.
      • Added mod_mime_fix configuration setting to disable suffixing multiple file extensions with an underscore.
      • Added the possibility pass allowed_types as an array.
      • Added an $index parameter to the method data().
      • Added a $reset parameter to method initialize().
      • Removed method clean_file_name() and its usage in favor of Security Library‘s sanitize_filename().
      • Removed method mimes_types().
    • Calendar Library changes include:
      • Added method chaining support.
      • Added configuration to generate days of other months instead of blank cells.
      • Added auto-configuration for next_prev_url if it is empty and show_prev_next is set to TRUE.
      • Added support for templating via an array in addition to the encoded string.
      • Changed method get_total_days() to be an alias for Date Helper days_in_month().
    • Cart Library changes include:
      • Added method remove() to remove a cart item, updating with quantity of 0 seemed like a hack but has remained to retain compatibility.
      • Added method get_item() to enable retrieving data for a single cart item.
      • Added unicode support for product names.
      • Added support for disabling product name strictness via the $product_name_safe property.
      • Changed insert() method to auto-increment quantity for an item when inserted twice instead of resetting it.
      • Changed update() method to support updating all properties attached to an item and not to require ‘qty’.
    • Image Manipulation Library changes include:
      • The initialize() method now only sets existing class properties.
      • Added support for 3-length hex color values for wm_font_color and wm_shadow_color properties, as well as validation for them.
      • Class properties wm_font_color, wm_shadow_color and wm_use_drop_shadow are now protected, to avoid breaking the text_watermark() method if they are set manually after initialization.
      • If property maintain_ratio is set to TRUE, image_reproportion() now doesn’t need both width and height to be specified.
      • Property maintain_ratio is now taken into account when resizing images using ImageMagick library.
      • Added support for maintaining transparency for PNG images in method text_watermark().
    • Form Validation Library changes include:
      • Added method error_array() to return all error messages as an array.
      • Added method set_data() to set an alternative data array to be validated instead of the default $_POST.
      • Added method reset_validation() which resets internal validation variables in case of multiple validation routines.
      • Added support for setting error delimiters in the config file via $config['error_prefix'] and $config['error_suffix'].
      • Internal method _execute() now considers input data to be invalid if a specified rule is not found.
      • Removed method is_numeric() as it exists as a native PHP function and _execute() will find and use that (the is_numeric rule itself is deprecated since 1.6.1).
      • Native PHP functions used as rules can now accept an additional parameter, other than the data itself.
      • Updated method set_rules() to accept an array of rules as well as a string.
      • Fields that have empty rules set no longer run through validation (and therefore are not considered erroneous).
      • Added rule differs to check if the value of a field differs from the value of another field.
      • Added rule valid_url.
      • Added support for named parameters in error messages.
      • Language line keys must now be prefixed with form_validation_.
      • Added rule alpha_numeric_spaces.
      • Added support for custom error messages per field rule.
      • Added support for callable rules when they are passed as an array.
    • Caching Library changes include:
      • Added Wincache driver.
      • Added Redis driver.
      • Added a key_prefix option for cache IDs.
      • Updated driver is_supported() methods to log at the “debug” level.
      • Added option to store raw values instead of CI-formatted ones (APC, Memcache).
      • Added atomic increment/decrement feature via increment(), decrement().
    • E-mail Library changes include:
      • Added a custom filename parameter to attach() as $this->email->attach($filename, $disposition, $newname).
      • Added possibility to send attachment as buffer string in attach() as $this->email->attach($buffer, $disposition, $newname, $mime).
      • Added possibility to attach remote files by passing a URL.
      • Added method attachment_cid() to enable embedding inline attachments into HTML.
      • Added dsn (delivery status notification) option.
      • Renamed method _set_header() to set_header() and made it public to enable adding custom headers.
      • Successfully sent emails will automatically clear the parameters.
      • Added a return_path parameter to the from() method.
      • Removed the second parameter (character limit) from internal method _prep_quoted_printable() as it is never used.
      • Internal method _prep_quoted_printable() will now utilize the native quoted_printable_encode(), imap_8bit() functions (if available) when CRLF is set to “rn”.
      • Default charset now relies on the global $config['charset'] setting.
      • Removed unused protected method _get_ip() (Input Library‘s ip_address() should be used anyway).
      • Internal method _prep_q_encoding() now utilizes PHP’s mbstring and iconv extensions (when available) and no longer has a second ($from) argument.
      • Added an optional parameter to print_debugger() to allow specifying which parts of the message should be printed (‘headers’, ‘subject’, ‘body’).
      • Added SMTP keepalive option to avoid opening the connection for each send() call. Accessible as $smtp_keepalive.
      • Public method set_header() now filters the input by removing all “\r” and “\n” characters.
    • Pagination Library changes include:
      • Deprecated usage of the “anchor_class” setting (use the new “attributes” setting instead).
      • Added method chaining support to initialize() method.
      • Added support for the anchor “rel” attribute.
      • Added support for setting custom attributes.
      • Added support for language translations of the first_link, next_link, prev_link and last_link values.
      • Added $config['reuse_query_string'] to allow automatic repopulation of query string arguments, combined with normal URI segments.
      • Removed the default &nbsp; from a number of the configuration variables.
    • Profiler Library changes include:
      • Database object names are now being displayed.
      • The sum of all queries running times in seconds is now being displayed.
      • Added support for displaying the HTTP DNT (“Do Not Track”) header.
      • Added support for displaying $_FILES.
    • Migration Library changes include:
      • Added support for timestamp-based migrations (enabled by default).
      • Added $config['migration_type'] to allow switching between sequential and timestamp migrations.
    • XML-RPC Library changes include:
      • Added the ability to use a proxy.
      • Added Basic HTTP authentication support.
    • User Agent Library changes include:
      • Added check to detect if robots are pretending to be mobile clients (helps with e.g. Google indexing mobile website versions).
      • Added method parse() to allow parsing a custom user-agent string, different from the current visitor’s.
    • HTML Table Library changes include:
      • Added method chaining support.
      • Added support for setting table class defaults in a config file.
    • Zip Library method read_file() can now also alter the original file path/name while adding files to an archive.
    • Trackback Library method receive() will now utilize iconv() if it is available but mb_convert_encoding() is not.
  • Core
    • Routing changes include:
      • Added support for multiple levels of controller directories.
      • Added support for per-directory default_controller and 404_override classes.
      • Added possibility to route requests using HTTP verbs.
      • Added possibility to route requests using callbacks.
      • Added a new reserved route (translate_uri_dashes) to allow usage of dashes in the controller and method URI segments.
      • Deprecated methods fetch_directory(), fetch_class() and fetch_method() in favor of their respective public properties.
      • Removed method _set_overrides() and moved its logic to the class constructor.
    • URI Library changes include:
      • Added conditional PCRE UTF-8 support to the “invalid URI characters” check and removed the preg_quote() call from it to allow more flexibility.
      • Renamed method _filter_uri() to filter_uri().
      • Changed private methods to protected so that MY_URI can override them.
      • Renamed internal method _parse_cli_args() to _parse_argv().
      • Renamed internal method _detect_uri() to _parse_request_uri().
      • Changed _parse_request_uri() to accept absolute URIs for compatibility with HTTP/1.1 as per RFC2616 <http://www.ietf.org/rfc/rfc2616.txt>.
      • Added protected method _parse_query_string() to URI paths in the the QUERY_STRING value, like _parse_request_uri() does.
      • Changed URI string detection logic to try the PATH_INFO variable first when auto-detecting.
      • Removed methods _remove_url_suffix(), _explode_segments() and moved their logic into _set_uri_string().
      • Removed method _fetch_uri_string() and moved its logic into the class constructor.
      • Removed method _reindex_segments().
    • Loader Library changes include:
      • Added method chaining support.
      • Added method get_vars() to the Loader to retrieve all variables loaded with $this->load->vars().
      • _ci_autoloader() is now a protected method.
      • Added autoloading of drivers with $autoload['drivers'].
      • $config['rewrite_short_tags'] now has no effect when using PHP 5.4 as <?= will always be available.
      • Changed method config() to return whatever CI_Config::load() returns instead of always being void.
      • Added support for library and model aliasing on autoload.
      • Changed method is_loaded() to ask for the (case sensitive) library name instead of its instance name.
      • Removed $_base_classes property and unified all class data in $_ci_classes instead.
      • Added method clear_vars() to allow clearing the cached variables for views.
    • Input Library changes include:
      • Added method() to retrieve $_SERVER['REQUEST_METHOD'].
      • Added support for arrays and network addresses (e.g. 192.168.1.1/24) for use with the proxy_ips setting.
      • Added method input_stream() to aid in using php://input stream data such as one passed via PUT, DELETE and PATCH requests.
      • Changed method valid_ip() to use PHP’s native filter_var() function.
      • Changed internal method _sanitize_globals() to skip enforcing reversal of register_globals in PHP 5.4+, where this functionality no longer exists.
      • Changed methods get(), post(), get_post(), cookie(), server(), user_agent() to return NULL instead of FALSE when no value is found.
      • Changed default value of the $xss_clean parameter to NULL for all methods that utilize it, the default value is now determined by the $config['global_xss_filtering'] setting.
      • Added method post_get() and changed get_post() to search in GET data first. Both methods’ names now properly match their GET/POST data search priorities.
      • Changed method _fetch_from_array() to parse array notation in field name.
      • Added an option for _clean_input_keys() to return FALSE instead of terminating the whole script.
      • Deprecated the is_cli_request() method, it is now an alias for the new is_cli() common function.
      • Added an $xss_clean parameter to method user_agent() and removed the $user_agent property.
    • Common functions changes include:
      • Added function get_mimes() to return the application/config/mimes.php array.
      • Added support for HTTP code 303 (“See Other”) in set_status_header().
      • Removed redundant conditional to determine HTTP server protocol in set_status_header().
      • Changed _exception_handler() to respect php.ini display_errors setting.
      • Added function is_https() to check if a secure connection is used.
      • Added function is_cli() to replace the CI_Input::is_cli_request() method.
      • Added function function_usable() to work around a bug in Suhosin <http://www.hardened-php.net/suhosin/>.
      • Removed the third ($php_error) argument from function log_message().
      • Changed internal function load_class() to accept a constructor parameter instead of (previously unused) class name prefix.
      • Removed default parameter value of is_php().
    • Output Library changes include:
      • Added a second argument to method set_content_type() that allows setting the document charset as well.
      • Added methods get_content_type() and get_header().
      • Added method delete_cache().
      • Changed caching behavior to compress the output before storing it, if $config['compress_output'] is enabled.
    • Config Library changes include:
      • Changed site_url() method to accept an array as well.
      • Removed internal method _assign_to_config() and moved its implementation to CodeIgniter.php instead.
      • item() now returns NULL instead of FALSE when the required config item doesn’t exist.
      • Added an optional second parameter to both base_url() and site_url() that allows enforcing of a protocol different than the one in the base_url configuration setting.
    • Security Library changes include:
      • Added method strip_image_tags().
      • Added $config['csrf_regeneration'], which makes token regeneration optional.
      • Added $config['csrf_exclude_uris'], which allows you list URIs which will not have the CSRF validation methods run.
      • Modified method sanitize_filename() to read a public $filename_bad_chars property for getting the invalid characters list.
    • Language Library changes include:
      • Changed method load() to filter the language name with ctype_alpha().
      • Added an optional second parameter to method line() to disable error logging for line keys that were not found.
      • Language files are now loaded in a cascading style with the one in system/ always loaded and overriden afterwards, if another one is found.
    • Hooks Library changes include:
      • Added support for closure hooks (or anything that is_callable() returns TRUE for).
      • Renamed method _call_hook() to call_hook().
      • Class instances are now stored in order to maintain their state.
    • UTF-8 Library changes include:
      • UTF8_ENABLED now requires only one of Multibyte String or iconv to be available instead of both.
      • Changed method clean_string() to utilize mb_convert_encoding() if it is available.
      • Renamed method _is_ascii() to is_ascii() and made it public.
    • Added compatibility layers <general/compatibility_functions> for:
    • Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions).
    • Log Library will now try to create the log_path directory if it doesn’t exist.
    • Added support for HTTP-Only cookies with new config option cookie_httponly (default FALSE).
    • $config['time_reference'] now supports all timezone strings supported by PHP.
    • Fatal PHP errors are now also passed to _exception_handler(), so they can be logged.

Bug fixes for 3.0

  • Fixed a bug where unlink() raised an error if cache file did not exist when you try to delete it.
  • Fixed a bug (#181) - a typo in the form validation language file.
  • Fixed a bug (#159, #163) - Query Builder nested transactions didn’t work properly due to $_trans_depth not being incremented.
  • Fixed a bug (#737, #75) - Pagination anchor class was not set properly when using initialize method.
  • Fixed a bug (#419) - URL Helper auto_link() didn’t recognize URLs that come after a word boundary.
  • Fixed a bug (#724) - Form Validation Library rule is_unique didn’t check if a database connection exists.
  • Fixed a bug (#647) - Zip Library internal method _get_mod_time() didn’t suppress possible “stat failed” errors generated by filemtime().
  • Fixed a bug (#157, #174) - Image Manipulation Library method clear() didn’t completely clear properties.
  • Fixed a bug where Database Forge method create_table() with PostgreSQL database could lead to fetching the whole table.
  • Fixed a bug (#795) - Form Helper form_open() didn’t add the default form method and accept-charset when an empty array is passed to it.
  • Fixed a bug (#797) - Date Helper timespan() was using incorrect seconds for year and month.
  • Fixed a bug in Cart Library method contents() where if called without a TRUE (or equal) parameter, it would fail due to a typo.
  • Fixed a bug (#406) - SQLSRV DB driver not returning resource on db_pconnect().
  • Fixed a bug in Image Manipulation Library method gd_loaded() where it was possible for the script execution to end or a PHP E_WARNING message to be emitted.
  • Fixed a bug in the Pagination library where when use_page_numbers=TRUE previous link and page 1 link did not have the same url.
  • Fixed a bug (#561) - errors in XML-RPC Library were not properly escaped.
  • Fixed a bug (#904) - Loader Library method initialize() caused a PHP Fatal error to be triggered if error level E_STRICT is used.
  • Fixed a hosting edge case where an empty $_SERVER['HTTPS'] variable would evaluate to ‘on’.
  • Fixed a bug (#154) - Session Library method sess_update() caused the session to be destroyed on pages where multiple AJAX requests were executed at once.
  • Fixed a possible bug in Input Libary method is_ajax_request() where some clients might not send the X-Requested-With HTTP header value exactly as ‘XmlHttpRequest’.
  • Fixed a bug (#1039) - Database Utilities internal method _backup() method failed for the ‘mysql’ driver due to a table name not being escaped.
  • Fixed a bug (#1070) - CI_DB_driver::initialize() didn’t set a character set if a database is not selected.
  • Fixed a bug (#177) - Form Validation Library method set_value() didn’t set the default value if POST data is NULL.
  • Fixed a bug (#68, #414) - :Oracle’s escape_str() didn’t properly escape LIKE wild characters.
  • Fixed a bug (#81) - ODBC’s list_fields() and field_data() methods skipped the first column due to odbc_field_*() functions’ index starting at 1 instead of 0.
  • Fixed a bug (#129) - ODBC’s num_rows() method returned -1 in some cases, due to not all subdrivers supporting the odbc_num_rows() function.
  • Fixed a bug (#153) - E_NOTICE being generated by getimagesize() in the File Uploading Library.
  • Fixed a bug (#611) - SQLSRV’s error handling methods used to issue warnings when there’s no actual error.
  • Fixed a bug (#1036) - is_write_type() method in the Database Library didn’t return TRUE for RENAME queries.
  • Fixed a bug in PDO’s _version() method where it used to return the client version as opposed to the server one.
  • Fixed a bug in PDO’s insert_id() method where it could’ve failed if it’s used with Postgre versions prior to 8.1.
  • Fixed a bug in CUBRID’s affected_rows() method where a connection resource was passed to cubrid_affected_rows() instead of a result.
  • Fixed a bug (#638) - db_set_charset() ignored its arguments and always used the configured charset instead.
  • Fixed a bug (#413) - Oracle’s error handling methods used to only return connection-related errors.
  • Fixed a bug (#1101) - Database Result method field_data() for ‘mysql’, ‘mysqli’ drivers was implemented as if it was handling a DESCRIBE result instead of the actual result set.
  • Fixed a bug in Oracle’s Database Forge method _create_table() where it failed with AUTO_INCREMENT as it’s not supported.
  • Fixed a bug (#1080) - when using the SMTP protocol, Email Library method send() was returning TRUE even if the connection/authentication against the server failed.
  • Fixed a bug (#306) - ODBC’s insert_id() method was calling non-existent function odbc_insert_id(), which resulted in a fatal error.
  • Fixed a bug in Oracle’s Database Result implementation where the cursor ID passed to it was always NULL.
  • Fixed a bug (#64) - Regular expression in DB_query_builder.php failed to handle queries containing SQL bracket delimiters in the JOIN condition.
  • Fixed a bug in the Session Library where a PHP E_NOTICE error was triggered by _unserialize() due to results from databases such as MSSQL and Oracle being space-padded on the right.
  • Fixed a bug (#501) - Form Validation Library method set_rules() depended on count($_POST) instead of actually checking if the request method ‘POST’ before aborting.
  • Fixed a bug (#136) - PostgreSQL and MySQL’s escape_str() method didn’t properly escape LIKE wild characters.
  • Fixed a bug in Loader Library method library() where some PHP versions wouldn’t execute the class constructor.
  • Fixed a bug (#88) - An unexisting property was used for configuration of the Memcache cache driver.
  • Fixed a bug (#14) - Database Forge method create_database() didn’t utilize the configured database character set.
  • Fixed a bug (#23, #1238) - Database Caching method delete_all() used to delete .htaccess and index.html files, which is a potential security risk.
  • Fixed a bug in Trackback Library method validate_url() where it didn’t actually do anything, due to input not being passed by reference.
  • Fixed a bug (#11, #183, #863) - Form Validation Library method _execute() silently continued to the next rule, if a rule method/function is not found.
  • Fixed a bug (#122) - routed URI string was being reported incorrectly in sub-directories.
  • Fixed a bug (#1241) - Zip Library method read_dir() wasn’t compatible with Windows.
  • Fixed a bug (#306) - ODBC driver didn’t have an _insert_batch() method, which resulted in fatal error being triggered when insert_batch() is used with it.
  • Fixed a bug in MSSQL and SQLSrv’s _truncate() where the TABLE keyword was missing.
  • Fixed a bug in PDO’s trans_commit() method where it failed due to an erroneous property name.
  • Fixed a bug (#798) - Query Builder method update() used to ignore LIKE conditions that were set with like().
  • Fixed a bug in Oracle’s and MSSQL’s delete() methods where an erroneous SQL statement was generated when used with limit().
  • Fixed a bug in SQLSRV’s delete() method where like() and limit() conditions were ignored.
  • Fixed a bug (#1265) - Database connections were always closed, regardless of the ‘pconnect’ option value.
  • Fixed a bug (#128) - Language Library did not correctly keep track of loaded language files.
  • Fixed a bug (#1349) - File Uploading Library method get_extension() returned the original filename when it didn’t have an actual extension.
  • Fixed a bug (#1273) - Query Builder method set_update_batch() generated an E_NOTICE message.
  • Fixed a bug (#44, #110) - File Uploading Library method clean_file_name() didn’t clear ‘!’ and ‘#’ characters.
  • Fixed a bug (#121) - Database Results method row() returned an array when there’s no actual result to be returned.
  • Fixed a bug (#319) - SQLSRV’s affected_rows() method failed due to a scrollable cursor being created for write-type queries.
  • Fixed a bug (#356) - Database driver ‘postgre’ didn’t have an _update_batch() method, which resulted in fatal error being triggered when update_batch() is used with it.
  • Fixed a bug (#784, #862) - Database Forge method create_table() failed on SQLSRV/MSSQL when used with ‘IF NOT EXISTS’.
  • Fixed a bug (#1419) - Driver Library had a static variable that was causing an error.
  • Fixed a bug (#1411) - the Email Library used its own short list of MIMEs instead the one from config/mimes.php.
  • Fixed a bug where php.ini setting magic_quotes_runtime wasn’t turned off for PHP 5.3 (where it is indeed deprecated, but not non-existent).
  • Fixed a bug (#666) - Output Library method set_content_type() didn’t set the document charset.
  • Fixed a bug (#784, #861) - Database Forge method create_table() used to accept constraints for MSSQL/SQLSRV integer-type columns.
  • Fixed a bug (#706) - SQLSRV/MSSSQL Database drivers didn’t escape field names.
  • Fixed a bug (#1452) - Query Builder method protect_identifiers() didn’t properly detect identifiers with spaces in their names.
  • Fixed a bug where Query Builder method protect_identifiers() ignored its extra arguments when the value passed to it is an array.
  • Fixed a bug where Query Builder internal method _has_operator() didn’t detect BETWEEN.
  • Fixed a bug where Query Builder method join() failed with identifiers containing dashes.
  • Fixed a bug (#1264) - Database Forge and Database Utilities didn’t update/reset the databases and tables list cache when a table or a database is created, dropped or renamed.
  • Fixed a bug (#7) - Query Builder method join() only escaped one set of conditions.
  • Fixed a bug (#1321) - CI_Exceptions couldn’t find the errors/ directory in some cases.
  • Fixed a bug (#1202) - Encrypt Library encode_from_legacy() didn’t set back the encrypt mode on failure.
  • Fixed a bug (#145) - Database Class method compile_binds() failed when the bind marker was present in a literal string within the query.
  • Fixed a bug in Query Builder method protect_identifiers() where if passed along with the field names, operators got escaped as well.
  • Fixed a bug (#10) - URI Library internal method _detect_uri() failed with paths containing a colon.
  • Fixed a bug (#1387) - Query Builder method from() didn’t escape table aliases.
  • Fixed a bug (#520) - Date Helper function :func:nice_date() failed when the optional second parameter is not passed.
  • Fixed a bug (#167) - $config['permitted_uri_chars'] didn’t affect URL-encoded characters.
  • Fixed a bug (#318) - Profiling Library setting query_toggle_count was not settable as described in the manual.
  • Fixed a bug (#938) - Config Library method site_url() added a question mark to the URL string when query strings are enabled even if it already existed.
  • Fixed a bug (#999) - Config Library method site_url() always appended $config['url_suffix'] to the end of the URL string, regardless of whether a query string exists in it.
  • Fixed a bug where URL Helper function anchor_popup() ignored the attributes argument if it is not an array.
  • Fixed a bug (#1328) - Form Validation Library didn’t properly check the type of the form fields before processing them.
  • Fixed a bug (#79) - Form Validation Library didn’t properly validate array fields that use associative keys or have custom indexes.
  • Fixed a bug (#427) - Form Validation Library method strip_image_tags() was an alias to a non-existent method.
  • Fixed a bug (#1545) - Query Builder method limit() wasn’t executed properly under Oracle.
  • Fixed a bug (#1551) - Date Helper function standard_date() didn’t properly format W3C and ATOM standard dates.
  • Fixed a bug where Query Builder method join() escaped literal values as if they were fields.
  • Fixed a bug (#135) - PHP Error logging was impossible without the errors being displayed.
  • Fixed a bug (#1613) - Form Helper functions form_multiselect(), form_dropdown() didn’t properly handle empty array option groups.
  • Fixed a bug (#1605) - Pagination Library produced incorrect previous and next link values.
  • Fixed a bug in SQLSRV’s affected_rows() method where an erroneous function name was used.
  • Fixed a bug (#1000) - Change syntax of $view_file to $_ci_view_file to prevent being overwritten by application.
  • Fixed a bug (#1757) - Directory Helper function directory_map() was skipping files and directories named ‘0’.
  • Fixed a bug (#1789) - Database Library method escape_str() escaped quote characters in LIKE conditions twice under MySQL.
  • Fixed a bug (#395) - Unit Testing Library method result() didn’t properly check array result columns when called from report().
  • Fixed a bug (#1692) - Database Class method display_error() didn’t properly trace the possible error source on Windows systems.
  • Fixed a bug (#1745) - Database Class method is_write_type() didn’t return TRUE for LOAD queries.
  • Fixed a bug (#1765) - Database Class didn’t properly detect connection errors for the ‘mysqli’ driver.
  • Fixed a bug (#1257) - Query Builder used to (unnecessarily) group FROM clause contents, which breaks certain queries and is invalid for some databases.
  • Fixed a bug (#1709) - Email headers were broken when using long email subjects and rn as CRLF.
  • Fixed a bug where MB_ENABLED constant was only declared if UTF8_ENABLED was set to TRUE.
  • Fixed a bug where the Session Library accepted cookies with last_activity values being in the future.
  • Fixed a bug (#1897) - Email Library triggered PHP E_WARNING errors when mail protocol used and to() is never called.
  • Fixed a bug (#1409) - Email Library didn’t properly handle multibyte characters when applying Q-encoding to headers.
  • Fixed a bug where Email Library ignored its wordwrap setting while handling alternative messages.
  • Fixed a bug (#1476, #1909) - Pagination Library didn’t take into account actual routing when determining the current page.
  • Fixed a bug (#1766) - Query Builder didn’t always take into account the dbprefix setting.
  • Fixed a bug (#779) - URI Class didn’t always trim slashes from the uri_string as shown in the documentation.
  • Fixed a bug (#134) - Database Caching method delete_cache() didn’t work in some cases due to cachedir not being initialized properly.
  • Fixed a bug (#191) - Loader Library ignored attempts for (re)loading databases to get_instance()->db even when the old database connection is dead.
  • Fixed a bug (#1255) - User Agent Library method is_referral() only checked if $_SERVER['HTTP_REFERER'] exists.
  • Fixed a bug (#1146) - Download Helper function force_download() incorrectly sent Cache-Control directives pre-check and post-check to Internet Explorer.
  • Fixed a bug (#1811) - URI Library didn’t properly cache segments for uri_to_assoc() and ruri_to_assoc().
  • Fixed a bug (#1506) - Form Helpers set empty name attributes.
  • Fixed a bug (#59) - Query Builder method count_all_results() ignored the DISTINCT clause.
  • Fixed a bug (#1624) - Form Validation Library rule matches didn’t property handle array field names.
  • Fixed a bug (#1630) - Form Helper function set_value() didn’t escape HTML entities.
  • Fixed a bug (#142) - Form Helper function form_dropdown() didn’t escape HTML entities in option values.
  • Fixed a bug (#50) - Session Library unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
  • Fixed a bug (#658) - Routing wildcard :any didn’t work as advertised and matched multiple URI segments instead of all characters within a single segment.
  • Fixed a bug (#1938) - Email Library removed multiple spaces inside a pre-formatted plain text message.
  • Fixed a bug (#388, #705) - URI Library didn’t apply URL-decoding to URI segments that it got from REQUEST_URI and/or QUERY_STRING.
  • Fixed a bug (#122) - URI Library method ruri_string() didn’t include a directory if one is used.
  • Fixed a bug - Routing Library didn’t properly handle default_controller in a subdirectory when a method is also specified.
  • Fixed a bug (#953) - post_controller_constructor hook wasn’t called with a 404_override.
  • Fixed a bug (#1220) - Profiler Library didn’t display information for database objects that are instantiated inside models.
  • Fixed a bug (#1978) - Directory Helper function directory_map()‘s return array didn’t make a distinction between directories and file indexes when a directory with a numeric name is present.
  • Fixed a bug (#777) - Loader Library didn’t look for helper extensions in added package paths.
  • Fixed a bug (#18) - APC Cache driver didn’t (un)serialize data, resulting in failure to store objects.
  • Fixed a bug (#188) - Unit Testing Library filled up logs with error messages for non-existing language keys.
  • Fixed a bug (#113) - Form Validation Library didn’t properly handle empty fields that were specified as an array.
  • Fixed a bug (#2061) - Routing Class didn’t properly sanitize directory, controller and function triggers with enable_query_strings set to TRUE.
  • Fixed a bug - SQLSRV didn’t support escape_like_str() or escaping an array of values.
  • Fixed a bug - Database Results method list_fields() didn’t reset its field pointer for the ‘mysql’, ‘mysqli’ and ‘mssql’ drivers.
  • Fixed a bug (#73) - Security Library method sanitize_filename() could be tricked by an XSS attack.
  • Fixed a bug (#2211) - Migration Library extensions couldn’t execute CI_Migration::__construct().
  • Fixed a bug (#2255) - Email Library didn’t apply smtp_timeout to socket reads and writes.
  • Fixed a bug (#2239) - Email Library improperly handled the Subject when used with bcc_batch_mode resulting in E_WARNING messages and an empty Subject.
  • Fixed a bug (#2234) - Query Builder didn’t reset JOIN cache for write-type queries.
  • Fixed a bug (#2298) - Database Results method next_row() kept returning the last row, allowing for infinite loops.
  • Fixed a bug (#2236, #2639) - Form Helper functions set_value(), set_select(), set_radio(), set_checkbox() didn’t parse array notation for keys if the rule was not present in the Form Validation Library.
  • Fixed a bug (#2353) - Query Builder erroneously prefixed literal strings with dbprefix.
  • Fixed a bug (#78) - Cart Library didn’t allow non-English letters in product names.
  • Fixed a bug (#77) - Database Class didn’t properly handle the transaction “test mode” flag.
  • Fixed a bug (#2380) - URI Routing method fetch_method() returned ‘index’ if the requested method name matches its controller name.
  • Fixed a bug (#2388) - Email Library used to ignore attachment errors, resulting in broken emails being sent.
  • Fixed a bug (#2498) - Form Validation Library rule valid_base64 only checked characters instead of actual validity.
  • Fixed a bug (#2425) - OCI8 database driver method stored_procedure() didn’t log an error unless db_debug was set to TRUE.
  • Fixed a bug (#2490) - Database Class method query() returning boolean instead of a result object for PostgreSQL-specific INSERT INTO ... RETURNING statements.
  • Fixed a bug (#249) - Cache Library didn’t properly handle Memcache(d) configurations with missing options.
  • Fixed a bug (#180) - config_item() didn’t take into account run-time configuration changes.
  • Fixed a bug (#2551) - Loader Library method library() didn’t properly check if a class that is being loaded already exists.
  • Fixed a bug (#2560) - Form Helper function form_open() set the ‘method=”post”’ attribute only if the passed attributes equaled an empty string.
  • Fixed a bug (#2585) - Query Builder methods min(), max(), avg(), sum() didn’t escape field names.
  • Fixed a bug (#2590) - Common function log_message() didn’t actually cache the CI_Log class instance.
  • Fixed a bug (#2609) - Common function get_config() optional argument was only effective on first function call. Also, it can now add items, in addition to updating existing items.
  • Fixed a bug in the ‘postgre’ database driver where the connection ID wasn’t passed to pg_escape_string().
  • Fixed a bug (#33) - Script execution was terminated when an invalid cookie key was encountered.
  • Fixed a bug (#2681) - Security Library method entity_decode() used the PREG_REPLACE_EVAL flag, which is deprecated since PHP 5.5.
  • Fixed a bug (#2691) - nested database transactions could end in a deadlock when an error is encountered with db_debug set to TRUE.
  • Fixed a bug (#2515) - _exception_handler() used to send the 200 “OK” HTTP status code and didn’t stop script exection even on fatal errors.
  • Fixed a bug - Redis Caching driver didn’t handle connection failures properly.
  • Fixed a bug (#2756) - Database Class executed the MySQL-specific SET SESSION sql_mode query for all drivers when the ‘stricton’ option is set.
  • Fixed a bug (#2579) - Query Builder “no escape” functionality didn’t work properly with query cache.
  • Fixed a bug (#2237) - Parser Library failed if the same tag pair is used more than once within a template.
  • Fixed a bug (#2268) - Security Library didn’t properly match JavaScript events.
  • Fixed a bug (#2143) - Form Validation Library didn’t check for rule groups named in a controller/method manner when trying to load from a config file.
  • Fixed a bug (#2762) - Hooks Class didn’t properly check if the called class/function exists.
  • Fixed a bug (#148) - Input Library internal method _clean_input_data() assumed that it data is URL-encoded, stripping certain character sequences from it.
  • Fixed a bug (#346) - with $config['global_xss_filtering'] turned on, the $_GET, $_POST, $_COOKIE and $_SERVER superglobals were overwritten during initialization time, resulting in XSS filtering being either performed twice or there was no possible way to get the original data, even though options for this do exist.
  • Fixed an edge case (#555) - User Agent Library reported an incorrect version Opera 10+ due to a non-standard user-agent string.
  • Fixed a bug (#133) - Text Helper ascii_to_entities() stripped the last character if it happens to be in the extended ASCII group.
  • Fixed a bug (#2822) - fwrite() was used incorrectly throughout the whole framework, allowing incomplete writes when writing to a network stream and possibly a few other edge cases.
  • Fixed a bug where User Agent Library methods accept_charset() and accept_lang() didn’t properly parse HTTP headers that contain spaces.
  • Fixed a bug where default_controller was called instad of triggering a 404 error if the current route is in a controller directory.
  • Fixed a bug (#2737) - XML-RPC Library used objects as array keys, which triggered E_NOTICE messages.
  • Fixed a bug (#2729) - Security Library internal method _validate_entities() used overly-intrusive preg_replace() patterns that produced false-positives.
  • Fixed a bug (#2771) - Security Library method xss_clean() didn’t take into account HTML5 entities.
  • Fixed a bug in the Session Library ‘cookie’ driver where authentication was not performed for encrypted cookies.
  • Fixed a bug (#2856) - ODBC method affected_rows() passed an incorrect value to odbc_num_rows().
  • Fixed a bug (#43) Image Manipulation Library method text_watermark() didn’t properly determine watermark placement.
  • Fixed a bug where HTML Table Library ignored its auto_heading setting if headings were not already set.
  • Fixed a bug (#2364) - Pagination Library appended the query string (if used) multiple times when there are successive calls to create_links() with no initialize() in between them.
  • Partially fixed a bug (#261) - UTF-8 class method clean_string() generating log messages and/or not producing the desired result due to an upstream bug in iconv.
  • Fixed a bug where CI_Xmlrpcs::parseRequest() could fail if $HTTP_RAW_POST_DATA is not populated.
  • Fixed a bug in Zip Library internal method _get_mod_time() where it was not parsing result returned by filemtime().

Versi asli changelog dapat dibaca di user_guide untuk versi 3. Untuk bisa membuka user_guide untuk versi 3 ini, kamu dapat mendownload versi 3-dev dari reponya. Nanti ada folder user_guide_src yang dibuat menggunakan Sphinx documentation. Kalo ada waktu ntar saya bikin postingan tentang cara menginstall Sphinx supaya bisa membaca user_guide CI yang baru.

Selamat datang kembali, CodeIgniter! :D