Author Archives: admin

Mengajarkan pemrograman pada anak-anak

Anak saya yang sekarang ini usianya 4 tahun sudah mulai saya ajari memprogram dengan tutorial dari code.org. Mulanya anak saya iseng meminjam laptop saya, dan dia bermain-main, katanya dia sedang “mrogram”, jadi ternyata dia mau “play pretend” jadi programmer. Karena code.org menyediakan pelajaran untuk usia 4+, saya perkenalkan dia pada situs tersebut, dan dia sangat menyukainya.

IMG_0635

Mungkin sebagian dari Anda bertanya-tanya: ngapain sih anak-anak diajari programming? Apa gunanya? kenapa nggak diajarin nanti aja? Nanti jadi orang yang lebih dekat dengan mesin daripada manusia lain?

Sejak 2 tahun yang lalu, saya sudah membeli dan membaca buku Seymour Papert, yang berjudul, Mindstorms: Children, Computers, And Powerful Ideas.  Sebenarnya saya ingin menuliskan review yang panjang mengenai bukunya, tapi sudah ada orang lain yang menuliskannya dengan cukup detail. Jadi akan saya ceritakan secara singkat saja.

Buku ini ditulis tahun 1980 dan direvisi tahun 1993. Buku ini ditulis oleh pionir AI, yang pernah bekerja sama bertahun-tahun dengan Jean Piaget, seorang psikolog dan filosofer yang terkenal karena studi epistemologi pada anak-anak (epistemologi = teori  mengenai pengetahuan). Jadi buku ini dituliskan oleh orang yang benar-benar mengerti ilmu perkembangan anak, dan yang benar-benar mengerti mesin.

Belajar memprogram adalah belajar membuat instruksi yang logis dan  terperinci, jadi ini melatih logika anak. Ketika belajar membuat program, kita akan membuat kesalahan, di sini kita akan belajar debugging.  Ketika belajar memprogram, seseorang tidak belajar mengenai “benar”, dan “salah”, tapi “apakah ini bisa diperbaiki?”, dan “bagaimana cara memperbaikinya?”.

Ilmu pemrograman sangat dekat dengan ilmu matematika, tapi dari sisi praktis. Bahasa pemrograman Logo yang dirancang oleh Seymour Papert merupakan salah satu contoh pendekatan pengajaran matematika melalui program.

Ilmu yang dipelajari dalam pemrograman bisa diaplikasikan dalam hidup sehari-hari . Di buku Mindstorm, contoh yang diberikan adalah juggling. Keahlian yang sepertinya sulit ini ternyata bisa dipelajari langkah-langkahnya secara detail, dan jika kita membuat kesalahan, bisa didebug. Tentunya ini tidak cuma berlaku untuk juggling, segala macam aktivitas dan proses bisa dipecah menjadi langkah-langkah sederhana, dan bisa didebug.

Mengenai ketakutan bahwa anak-anak akan lebih dekat pada mesin: menurut saya ketakutan ini tidak terlalu beralasan.  Sejauh ini saya melihat bahwa orang-orang komputer di berbagai komunitas yang saya temui (komunitas network, programming, dan security), semuanya  memiliki banyak teman. Saat ini, anak sayapun lebih suka bermain dengan orang daripada dengan mesin.

Menurut saya, orang-orang yang kurang bisa bersosialisasi adalah karena orang itu introvert, jadi tidak peduli bidangnya komputer atau bukan. Orang introvert mungkin lebih banyak yang tertarik pada dunia komputer karena lebih nyaman bagi mereka berada di depan komputer. Jadi bukan komputer yang membuat orang menjadi introvert, tapi orang introvert yang lebih tertarik pada dunia komputer.

Tentunya mengajarkan pemrograman pada anak adalah keputusan orang tua, dan juga tergantung pada kemampuan dan kesukaan anak. Sebagai orang tua yang mengerti komputer (dan berusaha banyak membaca mengenai perkembangan anak), saya merasa bahwa pelajaran pemrograman ini berharga, dan anak saya merasa ini adalah hal yang menyenangkan.

Saya bukan orang tua yang ingin memaksa anaknya mengikuti jejak saya. Saya akan sangat senang jika anak saya mengambil bidang lain (misalnya kedokteran), tapi bisa menggabungkannya dengan ilmu pemrograman. Tapi jika dia mengambil jalan lain yang tidak ada hubungannya dengan pemrograman pun, saya tidak keberatan.

Perlu dicatat, bahwa logika dan pemrograman hanya salah satu dari banyak hal yang saya ajarkan pada anak saya. Saya tutup dengan quote dari Seymour Papert:

“I FEEL VERY DEEPLY COMMITTED TO THE IDEA that, although rationality isn’t everything, and passion and interests and faith of various sorts count as much–nevertheless, rationality is a force for the good, and the more people that are capable of rational, critical thinking–the better the world will be; the more that have access to knowledge about the rest of the world–the better the world will be.”

–Seymour Papert, Mathematician, Computer Scientist, Educator – 2007 Interview – One Laptop Per Child

Untuk mereka yang putus asa mau jadi programmer

Sudah beberapa kali saya temukan di berbagai forum dan mailing list, orang-orang yang bertanya: kenapa program saya ini tidak jalan, dan kemudian mereka mempaste source code mereka. Biasanya saya akan menemukan kesalahan-kesalahan super fatal, mulai dari:

  1. Salah syntax
  2. Salah besar-kecil huruf di bahasa yang case sensitive (misalnya C)
  3. Salah logika

Saya bisa memahami bahwa orang-orang ini mungkin:

  1. Salah memilih jurusan Informatika/Ilmu komputer, atau
  2. Terpaksa mengambil kuliah pemrograman karena ini mata kuliah wajib meski jurusannya tidak langsung berhubungan dengan pemrograman

Untuk orang-orang dalam kategori pertama: sudah saatnya Anda memperbaiki cara belajar Anda, atau segeralah pindah jurusan. Jika Anda kesulitan mencari kerja karena Anda tidak bisa memprogram, itu murni kesalahan Anda.

20160409_113910 (1)

Untuk orang-orang dalam kategori kedua, saya akan berusaha memberikan panduan amat sangat dasar mengenai cara belajar memprogram, supaya setidaknya Anda bisa lulus kuliahnya. Orang-orang yang punya bakat memprogram tidak perlu belajar dengan cara ini.

Pertama: cobalah mengetik ulang banyak program, mengcompile dan menjalankannya.  Kalau perlu, cobalah mengetik satu bagian demi satu bagian, lalu compile. Nanti Anda akan dapat feeling mengenai: nama-nama fungsi, pentingnya besar kecil huruf, dan hal-hal kecil lainnya.

Ketika program sudah jalan, cobalah “merusak” programnya. Perhatikan apa pesan errornya ketika salah nama variabel, ketika kurang tanda kurung, dsb, jadi ketika ada error serupa, Anda tahu sebabnya apa.

Ketika membuat program baru, jangan langsung mengetikkan semua program sampai selesai, lalu baru dicompile. Misalnya untuk membuat stack dalam C, cobalah buat dulu bagian typedef, bagian inisialisasi stack, dan bagian main. Coba compile, ketika sudah benar, coba tambahkan “push” lalu compile, coba tambahkan “print” untuk mencetak isi stack, compile, test apakah sudah jalan atau belum. Coba tambahkan “pop”, compile dan lihat hasilnya sudah benar belum, dst.

Intinya adalah: memprogram perlu dilakukan selangkah demi selangkah. Jika Anda berusaha mengetik semuanya, baru dicompile, maka Anda akan bingung sendiri.

Selanjutnya cobalah mencari video tentang cara memakai debugger. Ini akan sangat membantu Anda mengetahui jalannya sebuah program, Anda akan tahu bagaimana nilai variabel berubah, dan Anda akan tahu di mana program Anda crash (biasanya jika Anda membuat program dalam bahasa C, akan crash). Dengan menggunakan tools yang modern seperti XCode atau Visual Studio, Anda bisa mulai menggunakan debugger dengan sangat mudah (dengan satu klik atau dua saja).

Jika Anda mau melakukan hal-hal tersebut, semoga Anda bisa lolos mata kuliah pemrograman dan mungkin bisa menemukan jalan Anda sebagai programmer.

 

Catatan: Lihat juga link “Kurikulum Pemrograman” dan “Cara Belajar Algoritma

 

 

Single Board Computer dan Single Board Microcontroller

 Belajar embedded system merupakan cara yang baik untuk lebih mengenal arsitektur komputer. Di PC/Tablet/Smartphone, ada begitu banyak “layer” yang mempersulit pemahaman kita tentang hardware, tapi di embedded system, kita bisa langsung berinteraksi dengan hardware, bahkan tanpa menggunakan sistem operasi sama sekali.

Saat ini ada dua jalur populer untuk belajar embedded system: menggunakan single board computer (misalnya: Raspberry Pi, BeagleBoard, BeagleBone Black, Cubie Board, RadXa, dsb), atau menggunakan single board microcontroller (misalnya: berbagai versi Arduino, Parallax Propeller, LaunchPad MSP430, dsb).  Singkatan SBC untuk single board computer sudah lazim digunakan, tapi single board microcontroller  biasanya tidak disingkat, tapi supaya artikel ini ringkas, akan saya singkat saja sebagai SBM.

Perlu diperhatikan bahwa saya menekankan pada kata populer, Anda tidak harus menggunakan SBM atau SBC untuk belajar embedded system, tapi keduanya akan membuat proses belajar menjadi lebih mudah.

Banyak pemula merasa bingung memilih dan membedakan fungsi keduanya. Jika Anda melihat berbagai proyek elektronik di Internet, sepertinya fungsi dan kemampuan keduanya hampir sama.   Untuk lebih jelasnya, saya akan membahas keduanya. Continue reading

Safari Books Online + Review Buku

Saya sekedar mau sharing layanan Safari Books Online (ini saya nggak dibayar, nggak dapet referal atau apapun). Layanan ini semacam perpustakaan di mana kita bisa meminjam buku selama menjadi member.

Paket termurahnya 9.99 USD/bulan, kita mendapatkan 5 slot buku yang bisa kita baca penuh. Setelah memasukkan sebuah buku ke dalam sebuah slot, bukunya hanya bisa dikeluarkan 30 hari kemudian. Kita bisa membaca bukunya offline menggunakan aplikasi yang mereka sediakan (untuk iOS/Android/BlackBerry). Mereka juga menyediakan trial 15 hari (tapi kita harus memberikan nomor kartu kredit).

Bagi sebagian orang, layanan ini tidak cocok, karena mereka ingin terus memiliki satu buku untuk dibaca ulang, tapi bagi saya yang jarang membaca ulang sebuah buku (kalau ada bagian penting, bisa saya copy paste), layanan ini sangat cocok.

Kenapa saya mau sharing hal tersebut? Harga sebuah buku asli sangat mahal, bahkan versi ebooknya sekalipun. Contohnya buku SDN: Software Defined Network harganya 47.99 (menurut kurs saat ini: lebih dari 500 ribu rupiah). Buku tersebut bisa dibaca sebagai satu slot dalam pakt 9.99 USD per bulan. Saya ingin hidup legal, tapi juga belum mampu membeli segala sesuatu yang saya inginkan.

Saya sedikit menyesal, kenapa tidak menemukan layanan ini dari dulu. Saya pernah mencicipi akses ke layanan ini ketika jadi member ACM, tapi jumlah buku yang ada sangat sedikit (beberapa ratus buku saja), dan waktu itu belum bisa offline. Beberapa buku yang sudah saya baca (sudah saya beli) ternyata ada di sini. Jadi sekalian di posting ini saya ceritakan beberapa buku yang menarik (yang saya miliki dan sudah saya baca) yang bisa ditemukan di Safari Books Online:

Tangled WebThe Tangled Web oleh Michal Zalewski. Buku yang sangat bagus yang membahas semua aspek security Web, dari mulai protokol HTTP sampai semua aspek browser. Bacaan wajib untuk orang yang berkecimpung di dunia web. Buku ini bukan untuk orang yang benar-benar pemula, dibutuhkan pengetahuan dasar mengenai protokol HTTP, tentang HTML, dan juga tentang JavaScript.

9781597492997_s-stealing-network
Stealing the Network: The Complete Series Collector’s Edition
Sebenarnya ini tadinya 3 buku novel yang dijadikan satu. Saya baru selesai membaca bagian pertama dan setengah bagian kedua. Buku ini bagus karena menjelaskan masalah security dalam bentuk cerita yang menarik. Di bagian pertama (buku pertama), ceritanya terpisah (seperti kumpulan cerpen), di buku selanjutnya, ceritanya memiliki hubungan.

9780735634688_s-code
CODE
Buku ini membahas hal yang amat dasar sekali, bagaimana informasi diproses dari mulai manipulasi bit. Buku ini berbeda dari semua buku pengenalan komputer yang lain, caranya bercerita sangat menarik, penjelasannya sangat sederhana. Buku ini sangat cocok untuk pemula.

Sebenarnya saya tidak menemukan hal yang baru di sini (karena saya sudah mengerti semuanya), tapi saya membacanya sampai habis karena saya mengagumi caranya bercerita. Suatu hari saya ingin bisa menjelaskan ke anak saya seperti ini.

9781118107874_s-app-empire
App Empire: Make Money, Have a Life, and Let Technology Work for You
Buku ini menjelaskan mengenai bagaimana mendapatkan uang yang banyak dari aplikasi mobile. Banyak triknya yang tidak berlaku lagi (dan menurut saya mengesalkan bagi pengguna aplikasi), tapi buku ini memberikan pencerahan pada saya mengenai berbagai trend di dunia mobile. Buku ini banyak menjual mimpi, tapi mungkin bisa memotivasi Anda untuk mempertimbangkan dunia mobile.


Don’t Make Me Think!: A Common Sense Approach to Web Usability, Second Edition
Selain mengenai teknik pemrograman, saya juga suka membaca buku mengenai usability. Buku ini cukup ringkas dan menjelaskan dengan baik berbagai aspek usabilitas dalam web, walaupun masih kurang membahas teknologi terbaru (buku ini tahun 2005). Sebagian besar hal yang dijelaskan sangat obvious, tapi Anda akan menyadari betapa banyaknya website yang tidak memperhatikan usabilitas.

9781430219484_s-coders-at-workCoders at Work: Reflections on the Craft of Programming. Buku ini isinya kumpulan cerita dan pandangan hidup banyak programmer. Di sini kita bisa melihat bahwa para programmer hebat memiliki pandangan hidup yang berbeda dalam memandang masalah pemrograman. Tidak ada kebenaran absolut dalam hal pemrograman, tidak ada gaya yang paling benar. Anda bisa melihat review yang lebih lengkap yang sudah pernah saya tuliskan sebelumnya di situs ini.

Meski koleksi bukunya sangat banyak, ada juga buku-buku yang tidak ada di sana. Kali lain akan saya tuliskan buku-buku menarik yang tidak saya temui di sana.

Jangan Fanatik Teknologi Tertentu

Setiap waktu, selalu ada orang yang fanatik menggunakan teknologi tertentu untuk menyelesaikan semua masalah. Karena ini blog “Cinta Programming”, pembahasannya tentunya adalah teknologi pemrograman. Lebih spesifiknya lagi: bahasa tertentu. Sekarang ini aplikasi web sedang sangat populer, dan orang-orang pun ingin memanfaatkan 100% teknologi HTML dan JavaScript untuk melakukan semua hal. Bahkan bukan cuma aplikasi web, tapi aplikasi desktop dan mobile.

Screenshot_2016-06-07-19-19-09

Saya hanya ingin menunjukkan bahwa kadang tidak semuanya bisa dilakukan oleh satu teknologi seratus persen. Seperti Anda lihat di posting-posting sebelumnya, saya sudah membuat beberapa aplikasi dengan HTML5 (dan bahkan sudah ada yang saya jual), tapi meski demikian saya masih sering “gemes” dengan orang yang terpaku pada HTML dan JS dan menganggap itu teknologi terbaik untuk semua hal (termasuk juga aplikasi mobile).

Teknologi sering harus dicampur-campur untuk membuat aplikasi terbaik. Twitter dua tahun yang lalu (2010) yakin bahwa rendering di sisi client dengan JavaScript adalah cara terbaik. Baru-baru ini disadari bahwa HTML5 masih terlalu lambat dan Twitter kembali melakukan rendering di sisi server. Twitter tentunya tidak membuang 100% Javascript, tapi sebagian besar pemrosesan dipindahkan ke server.

Di sisi mobile, Facebook membuat aplikasi untuk iOS (iPhone/iPad) menggunakan HTML5 sejak bertahun-tahun yang lalu. Semua orang komplain: aplikasinya terlalu lambat. Akhirnya Facebook menulis ulang aplikasinya dalam native code (dalam kasus ini native adalah Objective C) supaya dua kali lebih cepat. Tapi Facebook juga tidak membuang HTML5 seluruhnya, sebagian aplikasinya masih memakai HTML5.

Pelajaran yang bisa dipetik dari dua hal tersebut adalah: belajarlah banyak teknologi, supaya bisa tahu teknologi yang terbaik, dan jika memang ada yang lebih baik: jangan takut berpindah dari satu teknologi ke teknologi yang lain. Sekali lagi: jangan terpaku pada satu teknologi saja:

if all you have is a hammer, everything looks like a nail

Sencha Touch di PlayBook

Ini catatan teknis mempackage aplikasi Sencha Touch menjadi file .bar PlayBook. Pertama download dulu Sencha Touch 2, dan Juga SDK Toolsnya.

Saya memakai Mac, tapi tutorial ini berlaku juga untuk OS Windows. Perhatikan bahwa Anda perlu punya web server terinstall. Di Mac, Apache sudah ada default. Di Windows, silakan install IIS atau Apache (misalnya dari Wamp).

Extract file sencha-touch-2.0.1.1-commercial.zip. Saya mengekstraknya di dalam ~/Sites/ , lalu saya rename jadi “sencha” saja, jadi file-file sencha-touch-all.js, sencha-touch.js dsb ada di ~/Sites/sencha/.

Berikutnya kita buat aplikasi hello world. Sekarang dari dalam ~/Sites/sencha kita bisa menjalankan perintah “sencha generate app” untuk membuat aplikasi:

$ cd ~/Sites/sencha/
$ sencha generate app --name=HelloWorld -p ~/Sites/helloworld

Aplikasinya bisa dites dengan mengakses di http://localhost/~yohanes/helloworld (atau tergantung setting web server Anda bagaimana).

Saya tidak akan mengubah file-filenya, jadi saya langsung package saja. Pertama buat dulu file config.xml. Saya memakai file template yang sudah biasa saya pakai. Sebenarnya baris-baris feature itu tidak diperlukan untuk ini, tapi karena saya sering lupa menambahkan baris tersebut ketika memakai API Blackberry, saya selalu menggunakan template ini.

Catatan: saya tidak menggunakan ikon untuk aplikasi ini (blank). Silakan ditambahkan sendiri jika dibutuhkan.

<?xml version="1.0" encoding="UTF-8"?>

<widget xmlns="http://www.w3.org/ns/widgets"
   xmlns:rim="http://www.blackberry.com/ns/widgets"
   version="1.0.0.0" id="helloworld" xml:lang="en">

   <name>Sencha Hello</name>
   <description>Sencha Hello.</description>
   <author rim:copyright="2012" email="[email protected]">Yohanes Nugroho</author>

   <rim:orientation mode="landscape" />

   <content src="index.html"/>
   <rim:category name="Games"/>

   <feature id="blackberry.app" required="true" version="1.0.0.0"/>
   <feature id="blackberry.app.event" required="true" version="1.0.0.0"/>
   <feature id="blackberry.system" required="true" version="1.0.0.0"/>
   <feature id="blackberry.system.event" required="true" version="1.0.0.0"/>
   <feature id="blackberry.ui.dialog" required="true" version="1.0.0.0"/>
   <feature id="blackberry.utils" required="true" version="1.0.0.0"/>
   <feature id="blackberry.invoke" required="true" version="1.0.0.0"/>
   <access subdomains="true" uri="*">
   </access>
</widget>

Sekarang kita bisa men-zip aplikasinya. Masalah utama adalah: tools webworks tidak suka dengan file yang memiliki nama dengan tilde (~) dan dengan at(@) (misalnya [email protected], ini untuk retina display). Ada beberapa file seperti ini, untungnya ini tidak diperlukan, jadi kita bisa kecualikan dari file zip

zip -r senchahello.zip config.xml app.js app.json index.html resources/ sdk/ app/ -x *2x* -x *~*

Kuncinya ada pada “-x *2x* -x *~*” untuk meng-exclude file yang tidak valid menurut webworks.

Berikutnya kita bisa mempaketkan file zip tersebut menjadi file bar. Untuk mempersingkat command line, saya menginstall SDK di home directory saya di direktori webworks-tablet.

~/webworks-tablet/bbwp/bbwp senchahello.zip -g password -v buildId 1

Catatan: jika versi tidak diubah, buildId perlu dinaikkan setiap kali build.

Sekarang file .bar akan tercipta dalam direktori ~/Sites/helloworld/bin siap untuk diinstall ke PlayBook.

Catatan Teknis – Baby Coloring Book

Setiap kali saya membuat aplikasi dengan teknologi yang baru, biasanya saya mendapati banyak tantangan teknis. Dalam konteks ini “baru” bisa berarti teknologinya benar-benar baru, atau saya yang baru saja mengenal teknologi tersebut. Kali ini saya ingin membahas mengenai aplikasi saya di appworld, Baby Coloring Book.

Ide dari aplikasi ini sangat sederhana: buku mewarnai untuk bayi (terutama di bawah 3 tahun), hanya perlu menyentuh saja untuk mewarnai, tidak perlu menggosok-gosok seperti memakai krayon. Jika saya menggunakan teknologi lain untuk membuat ini (misalnya flash atau C++), saya akan menggunakan pendekatan sederhana: buat gambar tidak berwarna, gunakan flood fill untuk mengisi area. Tapi saya menggunakan HTML5 untuk membuat aplikasi ini. Alasan utamanya adalah untuk belajar mengenal lebih jauh HTML5. Saya tidak menggunakan library selain selain JQuery.

Contoh Gambar

Di Stack Overflow sudah ada yang menjawab bagaimana mengimplementasikan flood fill dengan JavaScript menggunakan Canvas:

How can I perform flood fill with HTML Canvas?

Jadi saya coba itu di PC menggunakan browser Google Chrome. Manipulasi piksel di Google Chrome sangat cepat, tapi saya melihat ada sedikit delay. Saya langsung curiga: jangan-jangan jika saya coba di PlayBook akan sangat lambat. Ternyata benar: sangat lambat.

Ada beberapa pendekatan yang terpikir oleh saya supaya aplikasi ini bisa dibuat dengan HTML5 tapi tetap cepat, tapi saya memiliki beberapa requirement:

  1. Saya tidak ingin “membatik” mendefinisikan setiap area gambar yang bisa diwarnai. Jika saya punya gambar, saya ingin langsung bisa memakai gambar itu tanpa edit manual. Dengan pendekatan flood fill, algoritma tersebut bisa otomatis mewarnai sebuah area yang dibatasi pixel tertentu (seperti mewarnai dengan “ember” di Ms Paint).
  2. Saya ingin bisa membuat gambar yang warnanya seperti diwarnai dengan krayon, jadi tidak polos.

Continue reading

Pentingnya memahami Ilmu Informatika secara menyeluruh

Hari ini saya menemukan link ke sebuah pertanyaan menarik di Stack Overflow. Sebuah pertanyaan sederhana: mengapa menjumlahkan elemen yang nilainya kurang dari nilai tertentu dalam array yang terurut, lebih cepat dari melakukan operasi yang sama pada array yang tidak terurut. Lebih jelasnya silakan baca pertanyaan dan jawabannya di sini:

Why is processing a sorted array faster than an unsorted array?

Ada beberapa hal menarik dari jawaban pertanyaan tersebut.

Pertama: meskipun Anda memprogram high level sekalipun (menggunakan Java/Ruby/Python, atau bahasa lain yang menggunakan JIT), Anda akan tetap dibatasi oleh hardware. Anda tetap perlu mengerti hardware untuk membuat aplikasi yang performasinya tinggi.

Kedua: perhatikan bahwa dengan mengetahui sebab dari masalah, kita bisa mempercepat program, tanpa menggunakan sorting. Cukup dengan menggunakan manipulasi bit yang menghilangkan branching. Kita ingin menghilangkan sorting, karena sorting sendiri butuh waktu.

Ketiga: dalam kasus tertentu, compiler bisa mengoptimasi jika diberi flag yang tepat. Tapi kita tidak bisa menggantungkan diri pada compiler saja. Compiler yang berbeda menghasilkan kode yang berbeda, dan hasilnya bisa sangat jauh berbeda. Misalnya disebutkan bahwa compiler Visual C++ 2010 tidak bisa mengoptimasi kodenya, sedangkan compiler Intel bisa melakukannya dengan sangat baik.

Keempat: Perhatikan juga bahwa optimasi compiler dibatasi oleh hardware. Hardware tertentu (misalnya Intel sejak Pentium Pro) mendukung instruksi conditional move (di assembly Intel, instruksi ini disebut dengan CMOV) yang tadinya perlu manipulasi bit manual (AND, OR, dsb). Anda tidak bisa menggunakan optimasi ini di semua hardware, apalagi jika Anda menargetkan CPU model lama (banyak digunakan di embedded device).

Mungkin sebagian dari Anda mengira pertanyaan tersebut agak mengada-ada: untuk apa mencari jumlah bilangan yang kurang dari N dan dilakukan berulang-ulang, kalau sekali saja kan hanya butuh beberapa milidetik. Dan berbeda beberapa milidetik saja kan harusnya tidak berpengaruh bagi user.

Saya terpikir beberapa aplikasi dalam dunia nyata yang mungkin membutuhkan penjumlahan secara cepat tapi berulang-ulang. Saya berikan contoh kecil: Misalnya Anda punya aplikasi interactive data viewer, dengan slider yang bisa diubah nilainya dengan mouse (sangat cepat)

  1. Anda punya array yang berisi daftar jumlah gaji semua orang pegawai di sebuah kota (arraynya tidak terurut)
  2. Kita ingin menampilkan secara interaktif: jika saya set slider ke nilai 1 juta, maka saya akan melihat bahwa total gaji semua orang yang dibawah satu juta adalah X
  3. saya bisa mengubah nilai di slider, dan menghitung ulang total semua orang yang gajinya di bawah 2 juta. Saya bisa menaik turunkan slider dengan sangat cepat, ratusan kali per detik nilai slider bisa berubah.

Perhatikan bahwa meskipun contoh ini hanya menyatakan kurang dari X, tapi sebenarnya berlaku juga untuk operasi lebih dari X, atau X dalam range tertentu.

Dalam contoh ini: perbedaan interaksi antara beberapa milidetik dan beberapa puluh milidetik bisa sangat terasa. Jadi mengerti untuk mengurutkan data (atau menggunakan trik manipulasi bit) sebelum menjumlahkan bisa membuat interaksi semakin smooth. Menggunakan database untuk tujuan animasi yang sangat smooth seperti itu tidak akan berhasil (latensinya sangat tinggi), apalagi misalnya devicenya kemampuannya processing/komputasinya rendah (misalnya tablet atau smartphone).

Sebenarnya saya bisa menunjukkan contoh yang lebih kompleks lagi (misalnya dalam hal komputasi piksel grafik), tapi nanti pembahasannya akan ngelantur ke mana-mana. Hal yang ingin saya tekankan adalah: ada banyak persoalan serupa dalam dunia nyata semacam ini. Ini adalah penyederhanaan, supaya inti masalah bisa dilihat lebih jelas.

Seringkali jika ada yang menunjukkan bahwa optimasi seperti ini diperlukan, jawaban programmer yang malas adalah: beli saja hardware yang lebih cepat, masalahnya kan beres. Perlu dicatat juga: bahwa membeli hardware yang lebih cepat tidak selalu menjadi solusi.

Misalnya Anda menjual aplikasi Anda di Apple appstore, Anda harus mendukung hardware terlambat sampai tercepat. Jika Anda bandingkan iPad generasi pertama dan kedua, maka perbedaan hardwarenya sangat jauh: memori menjadi 2x lipat, prosessor menjadi jauh lebih cepat (dari single menjadi dual core). Anda bisa mengabaikan 14.8 juta pengguna iPad 1, tapi penjualan aplikasi Anda bisa menurun jauh.

Mungkin Anda terpikir untuk melakukan komputasi di server saja. Tapi berapa delay karena latensi jaringan? apakah kecepatannya cukup acceptable untuk membuat interaksi yang smooth?

Jika saya rangkum, semua hal tersebut menunjukkan: betapa perlunya kita belajar ilmu informatika atau computer science secara baik dan menyeluruh. Misalnya dalam contoh yang sangat kecil ini:

  1. Dalam arsitektur komputer, kita belajar mengenai batasan hardware, bagaimana arsitektur CPU superscalar bekerja.
  2. Dalam pelajaran algoritma, kita belajar mengenai kompleksitas algoritma. Bagaimana memilih algoritma yang baik.
  3. Dalam pelajaran compiler, kita bisa tahu optimasi apa yang bisa (dan tidak bisa) dilakukan oleh compiler
  4. Dalam pelajaran networking, kita bisa tahu mengenai latensi jaringan (jika ingin memindahkan komputasi ke server)

Jadi menurut saya, orang-orang yang ingin membatasi pelajaran komputer hanya dengan materi yang praktis saja, tidak akan berhasil.

HTML5 Saat Ini

Akhir-akhir ini di waktu luang, saya sedang senang ngoprek HTML5. Kesimpulan sementara saat ini: HTML5 belum bisa memenuhi semua yang dijanjikannya terutama dalam hal portabilitas dan kecepatan. Sekarang ini lebih sering teknologi lain (misalnya Flash atau kode native) lebih cocok.

Tulisan ini berdasarkan pengalaman saya dan berlaku saat ini. Saya sendiri sudah mulai mengembangkan aplikasi dengan HTML5, bahkan sudah dijual di AppWorld (http://appworld.blackberry.com/webstore/vendor/9151/?lang=en, yang dibuat dengan HTML5 adalah MultiCounter, Four Colors, dan Baby Coloring Book), dan saya berharap dalam beberapa tahun ke depan HTML5 akan semakin baik.

HTML5 didengungkan sebagai sesuatu yang mudah, cepat dan portabel. Dalam kenyataannya, jika aplikasi kita sederhana (hanya memakai sebagian kecil fitur HTML5), maka hal itu benar, tapi jika aplikasi kita sudah mulai kompleks, maka hal-hal tersebut tidak lagi benar.

Continue reading

Manipulasi bit bagian 4: ekstraksi bit

Ekstraksi bit adalah proses pengambilan satu atau lebih bit dari sebuah bilangan. Saya contohkan dulu dalam sistem desimal sebelum masuk ke sistem biner.

Waktu kuliah, NIM saya adalah 13598054. Angka ini sebagai desimal bisa dibaca menjadi tiga belas juta lima ratus sembilan puluh delapan ribu lima puluh empat. Tapi. NIM itu bukan untuk dibaca sebagai bilangan, NIM itu dibentuk dari kode: 1 adalah jenjang (1=s1, 2=s2, 3=s3) kode 35 adalah jurusan (informatika), 98 adalah tahun masuk dan 054 adalah nomor urut saya. Dengan mengekstraksi digit desimal maka kita bisa mendapatkan makna baru dari sebuah bilangan.

Bagaimana cara mengekstraksi bagian jurusan (35) dari angka tersebut? Dengan manipulasi string, kita bisa melakukannya dengan substr/substring/fungsi sejenis. Tapi konversi ke string tidak efisien. Operasi aritmatika bisa digunakan untuk ekstraksi 2 digit jurusan.

Pertama kita bisa menggeser semua digit tahun masuk dan nomor urut (5 angka), dengan shift right 5 digit alias membagi dengan 100000 dibulatkan ke bawah. Hasilnya adlah 135. Setelah itu kita bisa menggunakan modulus 100 untuk mendapatkan angka 35.

Dalam biner, hal yang sama bisa kita lakukan. Misalnya kita ingin menyimpan tanggal (1-31) bulan (1-12) dan tahun (00-99) dalam satu angka biner. Cara penyimpanan seperti ini memungkinkan kita mengurutkan tanggal dengan mudah dan cepat.

Kita bisa menyimpan tahun dalam 7 bit (0-127) bulan dalam 4 bit (0-15) dan tanggal dalam 5 bit (0-31). Total kita butuh 16 bit.

Misalnya kita akan menyimpan tahun 12 (0001010) bulan 5 (0101) tanggal 17 (10001):

0001010 0101 10001

Atau:

0001010010110001

Jika dipandang sebagai 1 bilangan 16 bit: 5272.

Angka tersebut kelihatan jauh sekali dari angka awal kita (17-5-12).

Untuk mengekstraksi bulan. Kita perlu mengubah 5272 menjadi biner:

0001010010110001

Kita geser ke kanan sebanyak 5 untuk menghilangkan tanggal:

0000000010100101

Sekarang kita bisa menggunakan operator and untuk mengambil 4 digit terakhir:

0000000010100101

And

0000000000001111

Hasilnya

0000000000000101

Jika kita hilangkan digit 0 di depan:

101 = 5 desimal (bulan 5).

Secara umum untuk mengekstraksi bit, kita perlu menggeser ke kanan untuk menghilangkan bit yang tidak kita inginkan, lalu di-andkan dengan deretan bit 1 sebanyak bit yang ingin kita ekstrak (dalam kasus ini: 4 bit).

Posting ini ditulis dengan wordpress for blackberry sambil tiduran di waktu libur.