Contradiction of Investing!

saya pernah membaca buku Rich Dad Poor Dad karangan Robert T. Kiyosaki, mungkin tidak semua serinya, namun saya membaca pada salah satu bab di Rich Dad Poor Dad : Retire Young Retire Rich, dia pernah berkata:

“investasi yang baik adalah ketika kita menggunakan uang yang ‘bukan’ milik kita untuk melakukan investasi!”

for the example, Robert T. Kiyosaki menggunakan contoh bagaimana dia meminjam uang dari Bank untuk melakukan investasi pada usaha property dan membuat beberapa kebijakan sederhana untuk semakin merendahkan pajaknya.

pendapatan pasive yang didapatkan dari property tersebut (sewa), bisa dikatakan sebagai pendapatan yang dikategorikan sebagai pendapatan dengan pajak yang rendah. sehingga, dengan pajak yang sudah rendah, Robert T. Kiyosaki cukup membayar pajak yang lebih rendah lagi. terlihat simple, namun resikonya terlihat sepadan dengan apa yang sudah didapatkannya.

selain itu disebutkan juga pada buku tersebut,

“yang membuat orang rata-rata hanya sekedar berinvestasi, karena mereka mengumpulkan uang terlebih dahulu dan menggunakan uang itu untuk investasi!”

saya jadi bertanya-tanya sendiri, apakah cara saya melakukan investasi dengan cara menabung terlebih dahulu adalah cara rata-rata?

saya rasa demikian, karena pada dasarnya banyak orang yang berpikir bahwa mereka harus menabung terlebih dahulu sebelum berinvestasi. sehingga bisa dikatakan, bahwa investasi menggunakan uang sendiri (hasil tabungan) adalah hal yang rata-rata dan dipikirkan, serta dilaksanakan oleh orang banyak.

kontradiksinya adalah ketika saya membaca buku Charles D. Lewis berjudul The Element of Investing, yang pada bab awal saja sudah menuliskan dengan sangat besar-besar.

“SAVING”

satu ahli mengatakan bahwa investasi itu kadang jauh sekali dari saving, namun yang satu lagi mengatakan bahwa “saving” adalah part of investment. secara eksplisit Robert T. Kiyosaki tidak mengatakan kalau “saving” untuk investasi adalah hal yang buruk, namun menurut dia ada cara yang lebih baik.

begitu juga Charles D. Lewis, tidak serta mengatakan bahwa wajib hukumnya kita harus memiliki saving dan berinvestasi dari uang saving milik kita. walaupun menurut Charles D. Lewis, investasi dari hasil saving kita adalah hal yang paling optimal.

mungkin pada dasarnya kedua ahli tersebut memiliki dasar dan pola pikir yang sedikit berbeda. jika Robert T. Kiyosaki memiliki dasar pemikiran “beyond” any other people, maka Charles D. Lewis lebih kepada for any people mind. tapi saya setuju dengan salah satu kata Charles D. Lewis pada buku tersebut.

“Investing is reduce your expenses well bellow your income!”

dan sebenarnya ini adalah esensinya, selama kita bisa mengurangi expenses kita dari income kita, maka pada dasarnya kita sudah belajar untuk berinvestasi.

dan ketika melongok ke cash flow dan projected expenses yang saya buat 2 bulan belakangan ini saya berkata dalam bentuk esensi investasi.

“Im not investing yet!”

tanggung jawab optimalisasi!

saya membaca kembali beberapa artikel compiler, hal ini karena setelah saya setengah matang membuat project “grabber” yang berguna untuk mencari link-link foto pada internet (which is bisa dilakukan oleh banyak aplikasi, so don’t argue me kenapa saya membuat aplikasi yang sudah banyak dipasaran! karena project simple seperti itu tidak lebih kepada “curiosity” semata, tidak kurang tidak lebih).

akhirnya saya mencoba kembali melirik sebuah C# dan merancang kembali IPL yang dulu pernah saya buat ketika saya masih cupu…hingga sekarang saat saya masih tetap ucup.

saya membaca masalah code generator yang dilakukan oleh compiler, dalam tujuan untuk melakukan optimalisasi code. contoh mudahnya, misalnya saja ada code seperti berikut ini:

for($i = 0; $i < 10; $i++)
{
   $x = $y + $z;
   $a = $b + $c - $x * $x;
}

maka pada code di atas sebenarnya bisa dilakukan optimalisasi untuk mempercepat process aplikasi dengan cara melakukan pemrosesan secara lebih simplified. dimana kurang lebih jika digambarkan dalam bentuk source code juga, maka optimalisasi untuk simplifikasi code di atas kurang lebih akan terlihat seperti berikut:

$x = $y + $z;
$x = $x * $x;
$a = $b + $c - $x;
for($i = 0; $i < 10; $i++)
{
   // practically do nothing
}

bisa dilihat bahwa persamaan di atas bisa dipermudah, bahkan jika disimplifikasi lebih lanjut maka si iterasi yang secara tidak langsung practically do nothing bisa di hapuskan, sehingga menjadi!

$x = $y + $z;
$x = $x * $x;
$a = $b + $c - $x;

lebih simple, lebih cepat, lebih hemat! mungkin tujuan dari optimalisasi tidak langsung ketiga hal tersebut, namun secara tidak langsung ada 1 dari 3 point yang ingin dicapai ketika kita berbicara masalah optimalisasi.

yang jadi pertanyaan lanjutannya adalah…

“sebenarnya siapa yang bertanggung jawab masalah optimalisasi??”

kalau saya yang menjawab, maka saya akan berkata bahwa best practices untuk optimalisasi code adalah pada diri sendiri programmer itu sendiri. karena pada dasarnya yang mengetahui secara jelas flow dari aplikasi tersebut adalah programmer itu sendiri. sehingga untuk mempermudah “isi kepala” dari sang programmer, maka itu urusan programmer itu sendiri, tidak kurang tidak lebih.

namun pengembangan compiler yang mengharuskan sebuah aplikasi bisa berkerja dengan cepat banyak juga pada akhirnya menerapkan optimalisasi pada code dengan tujuan untuk mempercepat aplikasi ketika sang compiler bertemu dengan programmer yang isi kepalanya “ruwet” bin “mumet”, contohnya ya saya ini. namun jika ditilik sesuai dengan statement saya barusan, maka sebenarnya optimalisasi code ini adalah bumerang untuk si compiler.

salah satunya adalah masalah debugging!

dengan contoh di atas…umpamakan, jika urusan semantic adalah pengecekan pertama, setelah itu baru dilakukan optimalisasi code, namun ternyata ada “error” pada code yang di-optimalisasi-oleh-compiler, maka sang programmer akan kebingungan, karena letak line ketika code error pada source-yang-sebenarnya dan source-yang-dioptimalisasi akan berbeda…dan tentu saja ini akan membuat si programmer frustasi.

namun tentu saja, “there’s always a solution for every problem”, maka sebenarnya masalah “hard to debug” di atas memiliki solvability yang cukup sederhana, yaitu:

“ketika aplikasi di optimalisasi, maka compiler harus memberikan indexing dibagian mana code tersebut dioptimalisasi, melakukan backup terhadap real code, dan ketika terjadi error, bandingkan semantic dan index dari optimalisasi code dan real code…setelah ketemu yang match, point the real line! sound easy kan?”

sayangnya penerapannya cukup susah…dan bukannya optimal kita malah membuang-buang memory untuk menyimpan indexing dari real code, dan juga melakukan hot-backup terhadap real source…double shit, for something quite simple, yang harusnya bisa dilakukan dan dipikirkan oleh seorang programmer.

tapi, to be honest…saya sendiri jarang berpikir…

“apakah code yang saya hasilkan optimal?”

contoh mudahnya saya pernah dimarahi oleh salah seorang pembimbing di BPT dikarenakan saya mengerjakan sebuah soal komputer dengan “cara-saya”, dan tidak memperhatikan kaidah optimalisasi, yang tentu saja saat itu urusannya dengan tree, modular programming, dll.

jadi sebenarnya jika kita (atau saya) sebagai programmer enggan melakukan optimalisasi, dan saya tidak begitu suka ketika compiler melakukan optimalisasi (utamanya yang berlebihan), maka sebenarnya pertanyaannya adalah…

“siapa yang harus melakukan optimalisasi…??”

taste of COBOL!

so…bukan karena saya eager dan extra tidak sabar, namun saya lebih curious kenapa COBOL bisa menjadi sebuah momok. dan terutama tentu saja pertanyaan.

“kenapa semua mainframe masih menggunakan COBOL?”

there are lot of language yang bisa di deploy kesana toh? kenapa harus memilih COBOL? so I decided to try it, sebelum saya benar-benar merasakan the real sensation nanti di BNI.

halangan yang pertama datang dari Compiler COBOL sendiri, which is ketika saya googling banyak sekali di provided oleh Fujitsu dan sekarang sudah berganti menjadi Alchemy software, dan salah satu yang terkenal adalah Net COBOL…which is integrated COBOL dengan .NET technology! wew…such an interesting idea, namun sayang…saya bingung ketika menginstall-nya.

entah karena tingkat kedodolan tahap tinggi dari saya yang tidak mengerti COBOL, atau memang COBOL such a difficult things!

jadi akhirnya pilihan saya jatuh kepada yang pertama yaitu Open Cobol! dan untuk menginstallnya mau tidak mau saya harus menginstall CygWin untuk melakukan emulasi shell Linux pada Windows. and after several tries, akhirnya si COBOL bisa sukses di install! yay!

lalu saya pun mencari-cari referensi dan buku yang bisa saya jadikan pegangan, misalnya 24 Hours Learn COBOL dari SAMS Publishing, which is you could get about 2 bucks! dalam keadaan yang cukup bagus pada bursa buku bekas di Amazon! nice deal right?

namun saya lebih memilih Internet Resource saat ini, jadi saya pun mencari-cari site yang bisa membantu saya, dan saya mendapatkan tutorial COBOL dari situs University of Limerick. quite good actually, dan setidaknya ini bisa memberikan anda pemahaman dasar terhadap COBOL.

dan berbekal hal-hal itu, akhirnya saya coba untuk memulai membuat sebuah aplikasi sederhana menggunakan COBOL, dan pilihan saya jatuh kepada Kalkulator.

okay…pertama-tama yang harus di ketahui mengenai COBOL adalah, COBOL di bagi menjadi 4 bagian penting, yaitu:

  1. Identification
  2. Environment
  3. Data
  4. Procedure

setiap bagian (divisi) memiliki sub-divisi masing-masing, misalnya pada bagian Identification maka akan ada sub divisi yaitu : Program-Id, dan Author. bingung? oke…I’ll give some example, then:

IDENTIFICATION DIVISION.
 PROGRAM-ID.    test1.
 AUTHOR.            I Gede Adi Martha AP.

selain itu ada banyak attributes lain yang bisa di tambah di dalamnya.

setelah itu ada Environment (which is umumnya digunakan untuk menjelaskan source target dari aplikasi ini ketika selesai di compile, dll. dan biasanya saya biarkan bagian ini kosong melompong!)

lalu ada Data, yang digunakan untuk sumber data. baik yang berasal dari File (file section), ataupun Variable (working storage section) didalam memory.

lalu ada Procedure yang merupakan main logic dari setiap aplikasi COBOL. the best things is, there’s no “main” function yang pasti di jalankan setiap program dijalankan. karena semua user-defined function yang di taruh tepat di bawah procedure section, secara default menjadi fungsi yang paling pertama di jalankan.

oke…enough for the theory. jadi saya pun coding dan ternyata saya mendapatkan ERROR!! bukan permulaan yang baik memang, ketika kita baru pertama kali memegang bahasa pemrograman yang baru. namun error yang satu ini benar-benar membuat saya curious dan bingung, karena code yang saya buat tidak memiliki kesalahan secara tidak langsung. namun ketika saya baca-baca kembali, ternyata oh ternyata.

“count of space…adalah matter di dalam COBOL!!!”

yap…jangan heran, karena ketika saya mulai coding saya menggunakan tab untuk membuatnya terlihat rapi. namun ternyata yang digunakan adalah SPASI, dan yang terpenting adalah…setiap divisi harus di mulai dari kolom nomr 7! jangan coba-coba untuk mulai dari kolom 8, apalagi kolom 6! it must be 7!

hal ini membuat saya berpikir…

“COBOL isn’t tough…it just WEIRD!”

yap…akhirnya dengan sedikit adjustment pada kepala saya, dan style of code saya. akhirnya saya bisa menyelesaikan aplikasi kalkulator dan setelah some trial and error, finally it finish. walaupun tidak bagus, tidak sempurna…but I’m quite proud of it! :D

so here’s the screen shoot.

Cobol - Compiling and Running

Cobol - Running The Application

Cobol - Running The Application - 2

and beside the WEIRD things…COBOL tetap sebuah BAHASA, dan yang paling penting adalah mengerti how to talk with that language, karena bukan bahasa-nya yang terpenting namun esensi yang ingin disampaikan oleh bahasa itu. dan dalam bahasa COBOL, esensinya adalah:

“I’m a weird language!”

oh iya…for some reason of narcistic. maka saya sediakan source nya…even it might be won’t help you at all, atau mungkin can give you a slightest idea about how to learn COBOL.

       IDENTIFICATION DIVISION.
        PROGRAM-ID.	test1.
        AUTHOR.			I Gede Adi Martha AP.

       environment division.

       data division.
        working-storage section.
        01 num1		pic 9(9).
        01 num2	  pic 9(9).
        01 result pic 9(10).
        01 opt		pic x.
           88 optnow1 values "X".
           88 optnow2 values "x".
        01 d	    pic x.

       Screen Section.
       01 clrscr.
       	  05 blank screen.

       01 ScrName.
          05 Column 10
             Line   3
             Value "Cobol Calculator v.1.0".
          05 column 10
          	 line plus 1
          	 value "----------------------".
          05 column 10
             line plus 1
          	 value "Pilih opsi:".
          05 column 10
             line plus 1
             value "+ -> tambah".
          05 column 10
          	 line plus 1
          	 value "- -> minus".
          05 column 10
             line plus 1
             value "X -> exit".
          05 column 10
          	 line plus 1
          	 value "Insert Your Choice : ".
          05 column plus 2
             pic x
             using opt.

       01 InputChar1.
       	  05 column 10
       	     line 3
       	     value "Masukan Nomor 1 : ".
       	  05 column plus 2
       	     pic 9(9)
       	     using num1.

       01 InputChar2.
       	  05 column 10
       	     line 5
       	     value "Masukan Nomor 2 : ".
       	  05 column plus 2
       	     pic 9(9)
       	     using num2.

       01 DisplayResult.
       	  05 column 10
       	     line 8.

       procedure division.
        mainline.
         perform until optnow1 or optnow2
           display clrscr

        	 display ScrName
        	 accept ScrName
        	 if(opt = "+" or opt = "-") then
        	   display clrscr

        	   display InputChar1
        	   accept InputChar1

        	   display InputChar2
        	   accept InputChar2

        	   if(opt = "+") then
        	    compute result = num1 + num2
        	   else
        	    compute result = num1 - num2
        	   end-if

       	     display DisplayResult
       	     display "Hasil dari " num1 " " opt " " num2 " = " result

       	     accept D
        	 end-if
         end-perform
         stop run.

		   End Program test1.

that’s all folks! :)

IDENTIFICATION DIVISION.
PROGRAM-ID.    test1.
AUTHOR.            I Gede Adi Martha AP.

environment division.

data division.
working-storage section.
01 num1        pic 9(9).
01 num2      pic 9(9).
01 result pic 9(10).
01 opt        pic x.
88 optnow1 values “X”.
88 optnow2 values “x”.
01 d        pic x.

Screen Section.
01 clrscr.
05 blank screen.

01 ScrName.
05 Column 10
Line   3
Value “Cobol Calculator v.1.0″.
05 column 10
line plus 1
value “———————-”.
05 column 10
line plus 1
value “Pilih opsi:”.
05 column 10
line plus 1
value “+ -> tambah”.
05 column 10
line plus 1
value “- -> minus”.
05 column 10
line plus 1
value “X -> exit”.
05 column 10
line plus 1
value “Insert Your Choice : “.
05 column plus 2
pic x
using opt.

01 InputChar1.
05 column 10
line 3
value “Masukan Nomor 1 : “.
05 column plus 2
pic 9(9)
using num1.

01 InputChar2.
05 column 10
line 5
value “Masukan Nomor 2 : “.
05 column plus 2
pic 9(9)
using num2.

01 DisplayResult.
05 column 10
line 8.

procedure division.
mainline.
perform until optnow1 or optnow2
display clrscr

display ScrName
accept ScrName
if(opt = “+” or opt = “-”) then
display clrscr

display InputChar1
accept InputChar1

display InputChar2
accept InputChar2

if(opt = “+”) then
compute result = num1 + num2
else
compute result = num1 – num2
end-if

display DisplayResult
display “Hasil dari ” num1 ” ” opt ” ” num2 ” = ” result

accept D
end-if
end-perform
stop run.

End Program test1.

evolving system!

saya tidak berhasil mengerjakan sesuatu yang saya anggap cukup “worth” untuk di banggakan, namun rupanya ada 1 hal yang membuat hal itu tidak pernah terjadi.

  1. saya tidak pernah mencoba melakukannya
  2. saya tidak pernah melakukan implementasi menggunakannya

salah satu yang saya sesali dari dulu adalah, “my PHP framework”.

saya sempat di tanya oleh Koh Ali,

“define the benefit of your PHP Framework!”

dan dalam kepala saya, cuma beberapa pertanyaan dan pernyataan yang berputar-putar, salah satunya adalah.

SIMPLE!

saya membangun framework dari nol, build from zero memberikan keleluasaan bagi saya untuk mengembangkan framework saya sesuai keinginan saya. semantic yang saya gunakan, sehingga saya benar-benar merasakan bahwa.

“code is fun!”

namun saya masih “sangsi” apakah framework yang saya pakai bisa di pakai secara “real life”, bisa di implementasikan untuk system yang berjalan. saya bahkan tidak berani menggunakan metode seperti itu untuk skripsi saya, saya takut jikalau ternyata ada flaw dalam framework saya.

namun ketika saya menerima proyek dari Ray, saya berencana “membuat” framework, jadi saya membuat framework pada “working web”…bukan sekedar menggunakan simple template yang sederhana, dll. saya membuat framework yang akan digunakan pada web yang berjalan (www.akasa.co.id). saya menggunakannya untuk 4 anak situsnya.

dan dalam pikiran saya, ada beberapa betting yang terjadi, antara lain:

  1. if it goes wrong, maka saya akan kembali pada hakikat “old-fashion” PHP.
  2. if it goes right, maka saya akan menggunakannya pada proyek yang lain!

dan ternyata pengembangan web nya berjalan cukup baik, saya yang membuat frameworknya tidak sadar dengan beberapa fungsi yang ternyata bisa di optimalkan.

saya juga baru mengerti konsep “evolving system”, bahwa pada dasarnya kita mengerjakan sebuah system pada sanitize environment, maka kita bisa melihat bagaimana system tersebut berkembang dari hal yang kecil, menjadi sesuatu yang lebih kompleks. begitu juga framework saya (code::wrox), semua nya dimulai dari hal kecil, lalu berlanjut kepada hal yang lebih advanced, lalu akhirnya sampai kepada optimalisation of code, dimana saya mulai mengerti cara kerja, how to handle it, dll.

misalnya konsep MVC yang saya buat pada awalnya, dimana akhirnya diberikan pencerahan oleh koh Ali, mungkin nanti saya akan pecah lagi Model menjadi 2 paket yaitu Package dan Sanitize dimana akan mempermudah saya dalam melakukan validation dan DDL serta DML pada database.

rencananya nanti framework ini akan saya kembangkan lagi untuk membuat situs pribadi saya, saya juga berusaha untuk menambah “capacity” dan kemampuan dari library! misalnya setelah saya berhasil dengan konsep MVC, which is sedang terkenal sekali saat ini.

saya ingin membangun framework ke sedikit old-fashioned mode, yaitu Component Based (ASP.Net).

saya rasa penggabungan Component Based, dan MVC konsep adalah campuran yang sempurna, dan yang pasti saya akan menggunakan konsep 2 type of model (Package and Sanitize), serta penggunaan Active Records + Simple Query builder yang dulu pernah saya buat (walaupun tidak terlihat manfaatnya, might be karena saya tidak menggunakannya).

dan of course…kembali, dan sekali lagi saya akan mengerjakannya di Bali…

which is yang membuat saya gagal mengembangkan code::wrox dari v.0.1 ke 0.2…hanya karena ketika di Bali, saya lebih banyak memegang gitar dan pesiapan pentas, daripada coding di depan komputer, lol.

semoga saja, besok di waktu yang sempit (might be, I’ll blew up my holiday plan later on…which is sucks!), saya akan mengerjakan situs saya, dan saya ketika saya pulang saya juga punya 1 PR dari ibu saya.

“kamu mau bikin bisnis apa?!”

somehow, gw pingin bilang…pingin bikin bisnis makanan yang bernuansa lounge + wifi access, tapi ketika melihat suasana dan potensi market di kota saya, saya lalu mundur dan mulai mengkompress ide itu, dan mengembangkannya untuk hal lain…might be I can get another idea that ‘fun’!

moral of the post? jangan takut pada system yang premature, somehow you can get a benefit, whats’ ever the result. entah itu pengalaman untuk tidak mengulangi penggunaan konsep yang sama ketika membangun system kembali. atau malah bisa mengembangkan system tersebut menjadi system yang solid, dan tidak premature!

jangan berhenti, terus berusaha, dan percaya…that you can do it! and right now I believe, I’ll create the best framework, for my self!

Why math so beautiful?!

hari ini saya mencoba mencari tahu tentang “point of origin” algorithm. dimana kita memberikan sebuah set of equation, yang tersebar secara acak untuk menentukan posisi asli dari equation tersebut.

seperti yang sering digunakan pada NUMB3RS, bisa di andaikan seperti ini…

“jika anda melihat sebuah sprinkle, maka anda bisa melihat dimana posisi air akan jatuh, walaupun akan sangat sulit memperkirakan dimana setiap butiran jatuh pada precise position. namun jika keadaan dibalik, kita hanya melihat air yang berhamburan, lengkap dengan variable yang mempengaruhi  nya, apakah kita bisa mengetahui dimana posisi sprinkle sebenarnya?!”

terlihat sederhana, namun pada pointnya, hal ini sangat sulit…

saya hanya menemukan persamaan dan algorithm untuk menentukan titik potong dari sebuah matrix dalam system linear equation, bernama Eight Point Algorithm.

dan hal itu tidak membuat saya puas…karena matrix yang digunakan memiliki keseimbangan detail yang sama, berbeda dengan variable yang terpisah dan berbeda-beda pada masing-masing butiran air pada sprinkle. saya tahu, ada pemecahannya diluar sana, namun saya sedang malas berpikir…oke, so saya mencari-cari article lain tentang hal yang menarik, dan saya menemukan “boundary SET!”

dalam System Linear of Equations. untuk yang tidak mengerti SLE, maka kurang lebih adalah sebuah persamaan yang memiliki nilai variable yang sama, misalnya: x, y, dan z.

pada dasarnya ketika kita membuat sebuah equation, kita bisa membuat sebuah boundary yang bisa membuat equation itu berhenti. contoh mudah, jika kita memasukan nilai c (complex number) = 1 pada sebuah equation, namun ternyata hasilnya

0,1,2,5,26,…

maka pada dasarnya equation itu tidak akan berhenti dan infinity. namun beda halnya jika kita menggunakan c = i. secara tidak langsung equation itu akan memiliki hasil

0, i, (-1 + i), -i, (-1 + i), -i…

yang berarti c memiliki bounded value.

dan hal ini ditemukan oleh seseorang bernama Benoit Mandelbrot, dan menciptakan sebuah set beranama Mandelbrot Set.

pada dasarnya Mandelbrot set adalah sebuah set dari C pada orbit 0 yang bergerak pada iterasi di Complex Quadratic Polynomial (Polynomial 2nd degree with complex number), dimana c memiliki bound.

dan ketika set ini di representativekan kepada layar dan pixel (digambar), maka akan muncul sebuah pattern atau pola yang unik. dimana pola tersebut memiliki bentuk “fractal”, atau bagian besarnya terdiri dari bagian-bagian kecil yang memiliki (at least) pola, bentuk, dan ukuran yang sama dengan bentuk besarnya.

untuk mudah membayangkan fractal maka kita bisa menggunakan Sierpinski triangle, yang jika di animasikan kurang lebih memiliki bentuk seperti berikut ini:

Sierpinski Triangle

Sierpinski Triangle

oke kembali ke Mandelbrot set, maka dengan menggunakan prinsip fractal, kita bisa pastikan ketika kita melakukan zoom pada set ini pada pixel yang besar, kita bisa emandapatkan berbagai macam bentuk yang merupakan (at least) copy of the parent shape.

dan kurang lebih animasi dari Mandelbrot set terlihat seperti berikut:

Mandelbrot Set

Mandelbrot Set

untuk menggambarkan dari Mandelbrot set kita bisa menggunakan beberapa algorithm. salah satu yang mudah digunakan adalah Escape Time Algorithm. dimana kita akan melakukan lompatan pada warna ketika terjadi perubahan, sehingga hasil yang dihasilkan akan terlihat seperti blok warna yang terpisah.

dengan menggunakan real time (normal) iteration, maka blok warna akan berubah menjadi sebuah gradient, dan tidak terlihat lompatan warna secara siginifikan.

Escape Time Algorithm

Escape Time Algorithm

Normalized Iteration

Normalized Iteration

selain menggunakan 2 algoritma dengan kita juga bisa menggunakan beberapa algoritma lain, misalnya menggunakan Buddhabrot. :)

selain Mandelbrot set, terdapat juga Julia set yang menawarkan hal yang sama…

sama-sama menarik, sama-sama menyenangkan, dan sama-sama cantik…

see…how beautiful the math!!

[project] code::wrox – the controller!

hari ini saya masih melek sampai jam 4…tanpa saya sadari saya mengerjakan banyak sekali project non-profitable dari saya yang bernama “code::wrox” ini.

hari ini saya membuat sebuah template parser, yang sedari kemarin belum saya wujudkan, bahkan saya sudah berhasil melalukan renderin component untuk  template tersebut. saya sadar, ada baiknya saya tetap mengedepankan keinginan user, dalam urusan penanganan kesalahan, dll. saya cukup membuat fungsi form yang sederhana, dan urusan verifikasi data, saya serahkan kepada masing-masing orang yang menggunakan code::wrox. dan ada baiknya, saya akan mencoba dulu pengalaman saya menggunakan code::wrox dalam membangun situs KMH.

dengan pengalaman itu, maka saya bisa mengambil titik apa yang masih perlu di kembangkan, dan apa yang tidak perlu! :)

namun bukan template parser yang cukup menguras otak saya, namun lebih ke pada Controller yang bertugas sebagai extends class yang bertugas untuk menyajikan antar muka kepada user.

controller sendiri memiliki sebuah fitur yang saya sebut…

“auto extends variable”

terjemahan sederhananya seperti ini…

jika kita memiliki sebuah class database, maka kita tidak perlu melakukan definisi terhadap database itu kembali. namun kita cukup menggunakan nama class itu untuk menggunakan database tersebut. oke contoh gampang!

ada sebuah class bernama cwxDatabase (ignore the cwx, karena prefix ini akan di hapus!)

pada controller untuk menggunakan class cwxDatabase, kita bisa saja menulis

$x = new cwxDatabase();
$x->connect();

dalam artian, kita membuat sebuah class database yang baru dan disimpan pada variable $x. namun dengan fitus “auto extends variable”, maka secara otomatis di buat sebuah variable bernama $database (menyesuaikan nama class). dan untuk menggunakannya pun anda cukup menulis:

$this->database->connect();

hemat code, dan mempermudah user!

menurut saya, cara ini akan enrich the user, lagipula saya lebih suka cara seperti ini, daripada saya melakukan pembuatan variable asal-asalan dan berlebihan. dan cara yang saya contek dari Code Igniter ini benar-benar membuat saya cukup berpikir malam ini…

entah karena saya memang sedang bingung, karena banyak hal yang belum terselesaikan, atau saya bingung karena saya tidak bisa tidur…atau saya bingung karena memang saya tidak tahun, atau mungkin saya bingung karena saya mulai merasakan kalau saya kehilangan dia…

oke, saya jadi ingat maliq…mari bernyanyi…

“diaaaaaa…seperti apa yang selalu ku nantikan aku inginkan
diaaaaa… melihatku apa adanya seakan kusempurna”

mungkin lagu itu harus di balik, dari “dia” menjadi “aku”, atau “saya!”…hehehehe….

see ya at another post! :) … wismilak! ;)

[project] code::wrox – released – prealpha

akhirnya setelah melakukan coding beberapa hari, mencoba menghalau beberapa mata kuliah, dan sibuk mengerjakan code::wrox. bahkan lupa kalau sebenarnya dalam masa ujian, akhirnya kemarin code::wrox resmi bisa digunakan… :D … yay!

walaupun masih dalam tahap dasar, dan konsep yang masih “raw” di beberapa tempat, tapi setidaknya saya sudah berhasil mewujudkan beberapa titik dasar dari initial release code::wrox, yaitu :

  1. database
    as I told, bagian ini yang menguras banyak hal dan keringat. saya sendiri bahkan sampai melakukan code hingga 700 baris hanya untuk sebuah “active records”. namun tentu saja hal ini sangat menyenangkan apalagi melihat berhasilnya active records, dan sampai saat ini belum di temukan bug yang berarti.
  2. security
    bagian ini sebenarnya tambahan, tetapi ternyata sukses dan berhasil cukup baik. kegunaanya hanya untuk melakukan proteksi pada suatu page dengan sebuah static password. namun nantinya user bisa saja menambahkan password tersendiri untuk halaman.
    hal ini tentu saja setelah saya selesai membuat MODULE news.
  3. manager
    ini komponen yang paling penting menurut saya. dia mengatur keluar masuknya variable di dalam framework. dia yang mengatur GET, POST, dan SESSION dalam sebuah variable static yang mudah di gunakan. :D
  4. controller
    model dasar dari template. masih terlihat sederhana, dan belum kompleks-kompleks amat. tetapi tentu saja setidaknya saat ini si controller sudah bisa memberikan “UI” kepada user dari class yang dimilikinya. OOP Concept everywhere…hehehehe…
  5. loader
    yang ini salah satu core dari code::wrox, dan tentu saja komponen ini sudah selesai pada beberapa bagian. misalnya dalam hal load model, ataupun load library. hanya saja masih ada beberapa titik yang harus di benahi.

dan setelah 5 komponen utama itu selesai, maka saya berani membuat sebuah web kecil, tanpa perlu berpikir dengan menggunakan code::wrox, and IT’S EASY! really!

mungkin karena saya yang menciptakan code::wrox, maka akan terlihat mudah bagi saya untuk membuat code::wrox, namun entah bagi orang lain…semoga saja, pengalaman menyenangkan saya dengan code::wrox bisa berpengaruh kepada orang lain…

nanti! ketika code::wrox benar-benar lahir! wismilak… :D

NB : untuk melihat initial release (pre-alpha) dari code::wrox, visit the link here

[project] code::wrox – Active Records!

setelah meneliti CI, saya melihat model yang benar-benar menarik dan mudah untuk diimplementasikan, dan tentu saja mempermudah user untuk enrich their methode ketika mencoba untuk membuat aplikasi web nya. oleh karena itu saya mencoba mengambil beberapa hal yang di miliki CI, dan saya baru sadar, kalao dokumentasi dari CI adalah dokumentasi framework terbaik, tentu saja Prado adalah sebuah kebingungan, Yii masih penuh kesesatan, namun CI memberikan pengalaman yang cukup menyenangkan terhadap Framework!

dan akhirnya saya mengambil salah satu konsep CI yaitu Active Records. sebenarnya AR juga ada pada Frame Work yang lain, dengan konsep yang sama tentu saja. dan kali ini saya menggunakan prinsip CI dalam pembuatan active records.

dalam prakteknya Active Records bisa digunakan untuk melakukan Select, Insert, Update, ataupun Delete. jadi sebenarnya AR ini adalah kemudahan dari Statement dan Statement Manipulate dalam 1 class. interfaces dan methode yang sederhana juga digunakan dalam AR, dimana hanya sedikit sekali SQL hard code yang digunakan.

berikut adalah contoh dari Active Records di code::wrox

$x = new cwxDatabase('localhost','root','');
$x->connect('db_epic');

$stmt = $x->prepareActiveRecords();
$stmt->select('username,password,lastlogin');
$stmt->select_sum('banyak','total');
$stmt->distinct();
$stmt->from('user','test','hasil');
$stmt->join('pasukan_detail','user.userid = pasukan_detail.userid');
$stmt->join('pasukan','pasukan_detail.pasukanid = pasukan.pasukanid');
$stmt->where('username','=','billy');
$stmt->where_or('username','=','yperkasa');
$stmt->group_by('username, password, lastlogin');
$stmt->having('SUM(banyak)','>','10');
$stmt->order_by('username','DESC');
$stmt->get();
$hasil = $stmt->result('object');

nantinya hasil dapat di ambil dalam 2 bentuk, yaitu “object” ataupun “array”. ketika kita memanggil fungsi “get” untuk melakukan compile terhadap query. maka seluruh variable query kita dihapus. dan setelah kita mengambil hasilnya dengan fungsi “result”, maka object result akan dihapus dari class.

mungkin saya terlalu banyak berpikir dalam memory management, dan saya setidaknya ingin sekali menerapkan “cache” pada AR. namun sepertinya saya masih belum begitu mengerti konsep cache…kecuali ada penjelasan yang mumpuni untuk mengatasi kekurangan dalam otak saya… :D

dalam penggunaannya sendiri “$hasil” nanti dapat di tulis seperti berikut:

while($row = mysql_fetch_assoc($hasil)) {
          print_r($row);
}

atau yang lain…

akhirnya saya tidak bergerak ke class security, namun masih berkutat pada library DB Core…mungkin masih banyak potensi DB yang belum saya ambil! tapi saya rasa, setelah saya menyelesaikan AR ini (tinggal Insert, Update, dan Delete), maka saya akan lanjut ke library yang lain! :)

[project] code::wrox – authentication

malam ini saya berusaha menyelesaikan 1 class dari code::wrox, mengingat besok adalah waktunya belajar untuk mempersiapkan diri tanggal 3 ujian Data Warehouse. so, saya mencoba mengerjakana class authentication untuk code::wrox malam ini, and luckily I did it! :)

sebenarnya library “auth” ini ada 2, ada class authentication, dan class security. dimana class security merupakan turunan dari class authentication. di-class security, kita bisa melakukan pengesetan level, mengeset page protected, atau private view, dll.

namun sayangnya, sepertinya untuk class security, saya tidak bisa kerjakan hari ini.

untuk authentication sendiri, menggunakan class database, dan class statement dari library dbcore dalam implementasinya.

untuk penggunaannya sendiri cukup sederhana…

$x = new cwxAuthentication();
$res = $x->getUserLogged();
if($user != '' && $password != '' && $res == false) {
$res = $x->authentication('user','username',$user,'password',md5($password));
}

hanya terdapat fungsi authentication dimana dengan argumen authentication(‘tablename’,'userfield’,'username’,'passwordfield’,'password’);

nantinya fungsi ini akan menghasilkan nilai TRUE dan FALSE, serta menyimpan data kita di SESSION. saya ingin sekali membuat sebuah class SessionManager, sehingga ketika saya ingin rubah modenya untuk cookie, atau session, saya cukup melakukan edit pada class tersebut, namun untuk sementara saya rasa, saya akan berjalan pada penggunaan session dari PHP.

oke…Authentication done…next is class Security! :D

[project] code::wrox – database class upgrade!

sambil mencoba mencari-cari referensi tentang pembuatan framework pada PHP yang berujung pada sebuah buku dari PACKT yang berjudul PHP 5 CMS Framework Development. saya dihinggapi sebuah kekecewaan, karena rupanya buku itu jauh dari bayangan saya…saya lebih menyukai pegangan seperti Advanced PHP5 dari SAMS, daripada buku ini untuk menahkodai saya dalam pembuatan Framework.

kenapa saya tidak suka?? mungkin tidak usah dibahas… ;)

namun dari hal itu, saya mencoba memikirkan tentang beberapa hal yang harusnya saya pikirkan ketika saya membuat sebuah class Statement, yang merupakan bagian dari DBCore di Code::Wrox, yaitu :

“cara insert, update, dan delete!”

sebuah pertanyaan sederhana…karena rupanya konsep Statement yang saya gunakan tadi begitu “user friendly” untuk urusan “select” pada database. namun rupanya masih memberatkan user, karena rupanya mereka perlu melakukan hardcode terhadap query yang ingin di insert. misalnya saja, saya ingin memasukan data :

user -> adi martha
password -> 12345

pada database db_test pada table user.

maka yang harus saya lakukan pada DB Core adalah (asumsi saya sudah melakukan load class terhadap db core)

$x = new cwxDatabase('localhost','root','');
$x->connect('db_test');
$stmt = $x->prepare("INSERT INTO user(user, password) VALUES('adi martha','12345')");
$stmt->execute();

masih terbilang sederhana memang…namun tetap saja menurut saya kurang “user friendly”. jadi saya memutuskan mengambil konsep PRADO (sekali lagi), dalam menghandle Insert, Update, dan Delete.

masalah muncul, karena ternyata class Statement bisa terdiri dari multi table, dan tentu saja menyulitkan saya untuk membuat sebuah upgrade kecil agar bisa melakukan insert, update, atau delete. karena pada dasarnya PRADO hanya melakukan load pada 1 table, yang di atur pada sebuah controller yang kita buat. pada bagian ini saya kurang menyukai “keluwesan” dari sebuah PRADO.

lalu akhirnya saya memutuskan untuk membuat sebuah class baru sebagai bagian dari DBCore, yaitu class StatementManipulate.

untuk itu di class Database saya menambah sebuah fungsi yaitu prepareManipulate.

seberapa mudah menggunakan class StatementManipulate?! let see. anggap saja kita sudah melakukan load terhadap class dbcore.

$x = new cwxDatabase('localhost','root','');
$x->connect('db_test');
$stmt = $x->prepareManipulate('user'); // memanipulasi tabel user
$stmt->setFields('user','adi martha');
$stmt->setFields('password','12345');
$stmt->insert(); // masukan data

lihat…bahkan tidak ada “hard code” SQL disana…begitu mudahnya, karena selain mengambil konsep prado, saya juga menggunakan konsep dan kebiasaan saya pada VB ketika memikirkan dan membuat class ini.

selain fungsi insert, dan setFields, terdapat juga fungsi setClause($key, $value), update(), dan delete(). jika kita menggunakan fungsi insert maka yang dilihat hanya fungsi setFields. jika kita menggunakan fungsi update maka yang dilihat adalah fungsi setFields dan setClause, sedangkan jika kita menggunakan fungsi delete maka yang dilihat hanya setClause.

any how…akhirnya class DBCore selesai dengan tuntas…dan sekarang saya sedang memikirkan class apa selanjutnya yang akan saya kerjakan. mungkin saya akan mengerjakan class Authentication. atau mungkin class-class lainnya, yang lebih mudah…apa?! saya sendiri tidak tahu… :D