Menulis program Alkitab, dulu dan sekarang

Di posting ini saya ingin sedikit bernostalgia membuat program Alkitab di device Nokia 3650 yang sangat terbatas, sampai device terbaru Blackberry 10 yang sangat mudah. Isinya kebanyakan teknis pemrograman mengenai betapa sulitnya dulu membuat program Alkitab, dan betapa mudahnya sekarang membuat program Alkitab.

Warning: posting ini panjang sekali. Dan jika Anda bukan programmer, mungkin bisa dibaca singkat saja ke bagian akhir (penutup).

SymbianBible

Program Symbianbible saya rilis kali pertama bulan Maret tahun 2004. Waktu itu saya memprogram Symbianbible di laptop Risna (waktu itu masih pacar, manggilnya masih “mbak Risna”). Laptopnya adalah IBM ThinkPad 240X, Pentium III 500 Mhz, Layar 10 inch, dengan RAM 192 Mb (RAM maksimum untuk seri itu). HP pertama yang menjadi target adalah Nokia 3650.

2862195989_4992a33139_b

Waktu itu development untuk HP Nokia belum senyaman sekarang. Compilernya sangat lambat, butuh beberapa menit untuk mengcompile program sangat sederhana. Emulatornya juga butuh waktu beberapa menit untuk startup. Contoh program yang ada masih sangat minim (Nokia 3650 ini adalah HP Symbian series 60 kedua yang dirilis oleh Nokia, beda beberapa bulan dari Nokia 7650). Bekerja di komputer dengan layar 10 inch juga butuh kesabaran.

Sebuah file Alkitab dalam teks latin (menggunakan alphabet A-Z) yang tidak dikompresi, rata-rata ukurannya 10-15 MB. HP Nokia 3650 hanya memiliki RAM 4 MB, dan hanya 3.4MB tersedia bagi user (sisanya dipakai oleh OS). Jadi memprogram Alkitab untuk HP tersebut ada tantangannya: bagaimana memanfaatkan memori sebaik mungkin.

Saya pernah memakai Palm OS, dan disitu ada program yang bernama palmbibleplus. Program pembaca Alkitab untuk Palm OS tersebut memakai format PDB yang cukup efisien. Dalam format PDB, file Alkitab yang biasanya berukuran 10-15 Mb dapat dikompres menjadi sekitar 1.5 MB saja.

Palmbibleplus dapat bekerja dengan RAM Palm OS yang hanya beberapa puluh sampai beberapa ratus kilobyte. Tapi Palm OS memiliki sistem memori yang berbeda: semua storage dapat diakses (addressable) seolah-olah sebagai memori. Jadi tidak ada kode untuk membaca “file” karena semua dianggap seperti RAM, bedanya ada yang volatile (RAM) dan non-volatile (solid state storage).

Jika saya mengcopy algoritma yang dipakai palmbible apa adanya, maka saya perlu meload seluruh file PDB (1.5 MB, atau hampir setengan free RAM, dengan asumsi tidak ada apalikasi lain yang sedang berjalan) ke memori, dan baru bisa mulai menampilkan sesuatu. Tentunya cara tersebut tidak efisien, jadi saya perlu membuat layer untuk membaca file PDB seperlunya, mengcache data tertentu (indeks untuk dekompresi), dan segera membebaskan lagi memori yang tidak dibutuhkan. Hasilnya cukup memuaskan, program bisa berjalan dengan memakai memori beberapa ratus kilobyte saja. Bisa dijalankan bersama dengan media player atau aplikasi lain (misalnya aplikasi email atau SMS). Program juga berjalan instan.

Versi PalmOS juga sangat sederhana, karena dalam satu waktu hanya boleh ada satu aplikasi yang berjalan, sedangkan Symbian pada Nokia 3650 sudah mendukung full multitasking. Fitur ini dimanfaatkan banyak orang (misalnya untuk mendengarkan lagu sambil membaca Alkitab), jadi saya tidak bisa seenaknya memakai seluruh memori untuk program saya sendiri.

Meski saat itu saya cukup mengenal bahasa C++, tapi Symbian memiliki dialeknya sendiri. Tidak ada exception handling, adanya adalah makro TRAP, two phase construction, plus cleanup stack. Meski mendukung threading, tapi sangat tidak disarankan (memakai banyak memori, dan sinkronisasinya rumit), dan perlu memakai Active Object.

Debugging sangat sulit dilakukan dengan emulator (sangat lambat), dan kadang-kadang sesuatu bisa berjalan dengan baik di emulator, tapi tidak di device aslinya. Ingin mendebug di device yang sebenarnya dengan debugger? Tidak bisa, kecuali Anda punya uang beberapa ribu dollar untuk lisensi software dan hardware debuggernya.

Bagian penggambaran ke layar juga menjadi masalah. Meski Symbian memiliki framework untuk text engine, tapi frameworknya tidak terdokumentasi dengan baik (saya baru tahu setahun kemudian, setelah membeli buku tentang pemrograman Symbian OS yang ribuan halaman tebalnya). Saya menggunakan banyak trial and error untuk memahami sistem penggambaran grafik di Symbian. Setiap baris ayat digambar secara manual dengan DrawText secukupnya (cukup untuk memenuhi layar), dan ketika scrolling dilakukan, maka dekompresi tiap ayat juga dilakukan seperlunya saja.

Banyak hal yang saya hardcode, karena contoh devicenya baru satu (3650) yang keypadnya melingkar. Kadang ketika ada device baru, saya baru menyadari hal-hal yang kurang generik, misalnya ketika Siemens SX1 keluar dengan keypad di samping. Saya mulai menambahi opsi user interface agar lebih generik (misalnya: setiap key di keypad bisa diassign ke satu fungsi tertentu).

Beberapa tahun kemudian, programming di Symbian sudah mulai agak mudah: RAM yang tersedia makin banyak, tools yang tersedia makin mudah digunakan, dokumentasi semakin banyak (ada wiki dan berbagai blog). Berbagai tools yang tadinya butuh ribuan dollar, akhirnya digratiskan.

Saya sangat perlahan dalam menambahkan fitur untuk Symbianbible, karena tiap kali memprogram saya harus dalam mode sangat sabar. Banyak sekali fitur yang ingin saya tambahkan, tapi karena butuh waktu terlalu lama, akhirnya saya batalkan.

Engine pembaca PDB yang saya porting dari C untuk PalmOS ke Symbian C++ akhirnya saya beri interface POSIX dan saya test di Linux dengan valgrind untuk melihat apakah ada memory leak, dan ternyata tidak ada. Ternyata menagemen memori di Symbian yang amat mengesalkan itu memang cukup bagus untuk mencegah memory leak. Kelak hal ini memudahkan saya dalam porting ke Blackberry 10.

Selama beberapa tahun, saya cukup memelihara Symbianbible. Saya mendukung semua versi Symbian yang pernah keluar sejak 3650: Series 80 (Nokia Communicator), Symbian UIQ (sampai versi terakhir, UIQ3). Bahkan Nokia 7710, satu-satunya device dalam Series 90. Saya juga mendukung semua versi Series 60 sampai seri terakhir (Symbian Belle). Saya juga membuat versi yang bisa dibaca dengan text to speech supaya bisa digunakan oleh orang buta (satu-satunya program Alkitab yang bisa dibaca dengan text reader di Symbian). Saya bahkan pernah membuat versi rendering sendiri (dengan harfbuzz dan freetype) untuk bahasa Malayalam.

Karena Nokia sudah mengumumkan bahwa Symbian tidak akan diteruskan lagi, saya pun sekarang sudah berhenti mengembangkan Symbianbible (situsnya masih ada, dan softwarenya tetap bisa didownload). Nokia memutuskan untuk berpindah ke Windows Phone OS. Karena sampai saat ini saya belum menggunakan Windows Phone OS, maka saya tidak mengembangkan Symbianbible untuk windows mobile.

Bibleplus for Blackberry (BBOS)

Tadinya saya sangat tidak tertarik pada platform Blackberry. Saya ingin mencoba Blackberry, tapi tidak merasa perlu. Saya meminta dibelikan Blackberry second ke adik saya, ketika dia datang ke sini, tapi akhirnya tidak saya pakai. Risna kemudian mencoba memakai, dan cukup senang bisa mengetik dengan enak untuk chatting dengan teman-teman di Indonesia.

Ketika saya pulang ke Indonesia untuk menghadiri pernikahan adik saya, saya butuh bisa berkomunikasi dengan Risna (yang saat itu sedang hamil), cara termudah dan paling reliable saat itu adalah: menggunakan Blackberry. Akhirnya saya membeli lagi satu Blackberry untuk digunakan di Indonesia. Ceritanya pernah dituliskan di sini.

Sepulang dari Indonesia, saya mulai banyak memakai Blackberry, dan menyadari bahwa program Alkitab yang ada di Blackberry saat itu semuanya masih kurang bagus. YouVersion saat itu belum bisa memakai bible offline, dan Gobible ukurannya sangat besar dan file biblenya terintegrasi dengan programnya, tidak bisa disimpan di SD Card (memakai memori internal Blackberry yang banyak).

Akhirnya sayapun mulai mengembangkan aplikasi Alkitab untuk Blackberry, motivasinya adalah untuk menyambut anak pertama kami.

Untuk mendevelop di Blackberry juga butuh kesabaran. Salah satunya adalah karena emulatornya yang sangat lambat. Kebetulan waktu itu saya juga masih eksklusif menggunakan Linux 100%, jadi perlu kesabaran ekstra untuk setup emulator dengan Wine. Ketika menginstall di device juga butuh kesabaran ekstra: setiap kali menimpa program dengan versi terbaru, saya perlu merestart devicenya. Restart blackberry bisa butuh lebih dari 5 menit (dan bayangkan: jika salah sedikit saja, maka butuh beberapa menit lagi untuk mulai lagi. Untuk masalah komputer: kali ini komputer saya sudah jauh lebih cepat, CPU Core 2 Duo 2.6 ghz (E6750) dengan memori 4GB dengan LCD 19 inch.

Dari sisi programming: bahasa Java lebih mudah dari C++. Saya harus mundur sedikit, karena versi bahasa Java yang didukung di Blackberry adalah versi 1.3. Artinya: lupakan generics, lupakan syntax loop for yang baru, lupakan automatic boxing/unboxing, dsb. Kembali ke jaman primitif waktu saya masih kuliah dulu.

Hal berikutnya adalah: API. Di Blackberry OS sebelum 4.7 tidak ada API untuk random access file. Artinya: tiap kali ingin pergi ke kitab Wahyu, saya perlu membaca dulu semua kitab lain, alias membaca seluruh file ke memori. Tentunya membaca seluruh file juga bukan ide yang bagus, karena RAM Blackberry juga terbatas (RAM-nya hanya 16 MB untuk Blackberry 8800).

Untuk mengatasi itu, saya perlu membuat layer khusus, yang akan membaca file dengan Random Access untuk OS Blackberry yang baru, dan sekuensial untuk Blackberry yang lama.

Memprogram bagian algoritma untuk Blackbery butuh waktu relatif singkat, karena saya bisa membuat dulu semua algoritma di PC, dijalankan dengan profiler (untuk menemukan titik lambat). Saya juga mengoptimasi beberapa hal, misalnya pencarian teks dilakukan dengan perbandingkan integer di level data yang masih dikompresi (perbandingan string di Java merupakan operasi yang mahal), engine pembaca PDB saya tulis ulang dari versi C++.

Bagian user interface butuh waktu agak lama. Program ini adalah program pertama saya untuk Blackberry, jadi belum kenal benar dengan berbagai komponen yang ada. Untuk penggambaran di layar, saya tidak lagi menggambar teks sebaris demi sebaris. Saya menggunakan komponen rich text bawaan Blackberry. Setelah mempelajari berbagai versi bahasa Alkitab, komponen bawaan tersebut mampu menangani teks yang cukup besar.

Saya juga membuat fitur yang dulu saya inginkan di Symbianbible, tapi sulit diimplementasikan: catatan ayat. Memo juga bisa dikirimkan ke program memo built in Blackberry. Support terhadap touch device menyusul setelah saya membeli lagi Blackberry yang memiliki layar sentuh.

Saat ini Symbianbible sudah mendukung semua OS Blackberry dari mulai OS 4.5 sampai yang terbaru 7.1. Semua jenis device yang keyboard maupun touch sudah didukung. Sepertinya tidak akan ada lagi update untuk versi BBOS, karena RIM akan beralih ke Blackberry 10.

 

Bibleplus for Blackberry 10 (QNX)

Sekitar dua bulan yang lalu, saya sudah memperoleh device beta Blackberry 10 yang memakai sistem operasi QNX (dinamai Dev Alpha B). Blackberry 10 ini adalah sistem operasi baru dari RIM yang jauh berbeda dari Blackberry sebelumnya (aplikasi Blackberry sebelumnya tidak jalan di BB10).

Ketika saya di Jerman, di hari terakhir, setelah teleponan dengan Jonathan (Jam 2 Pagi di sana, jam 8 Pagi di sini), saya tidak bisa tidur lagi. Jadi saya mulai mengerjakan Bibleplus untuk Blackberry 10. Dalam beberapa jam, kode C++ sudah berhasil saya port ke Blackberry 10 dan saya sudah bisa menampilkan isi kitab Kejadian pasal pertama. Ini dikerjakan di laptop Risna, dengan CPU Core i5 dan RAM 8 GB dan layar 14 inch.

User interface bisa saya buat dalam waktu sekejap menggunakan QML Cascade (ini sedikit berbeda dari QML standar QtQuick). Untuk menampilkan ayatnya, saya menggunakan komponen WebView (HTML rendering menggunakan Webkit).

Setelah sampai di Chiang Mai, saya mulai sibuk dengan urusan pekerjaan. Tapi saya masih mengerjakan Bibleplus di waktu luang. Kali ini pembuatan Bibleplus untuk BB10 terasa sangat ringan:

  1. Memori BB10 sangat besar (1 GB), jadi saya tidak perlu memanage memori mati-matian. Untuk bagian data, saya sudah memakai engine yang efisien. Untuk bagian GUI, saya bisa “berfoya-foya” memakai WebKit untuk rendering (WebKit ini dalam keadaan “kosong” sudah memakan lebih dari 4 MB, lebih dari seluruh memori Nokia 3650 dulu). Bahkan sebagian kode memakai JavaScript dalam HTML-nya (misalnya kode untuk menentukan di ayat mana posisi scroll saat ini).
  2. Toolsnya mudah. Sebagian GUI bisa dilihat langsung renderingnya dengan QML Preview. Bahkan saya bisa membuat custom component dengan cepat untuk navigasi Chapter dan Verse.
  3. On device debugging sangat mudah, setupnya juga sangat cepat.
  4. Bahasa yang digunakan adalah C++ standar. Saya bisa memakai library apa saja.

Portingnya belum selesai, masih ada beberapa fitur yang ingin saya implementasikan dengan cara baru (misalnya saya ingin bisa menampilkan hasil search dengan lebih baik). Saya masih punya waktu sebelum BB10 resmi diluncurkan akhir bulan ini. Sekarang saya bisa bekerja cukup nyaman dengan komputer yang lebih cepat lagi, AMD Phenom II X4 955 (3 Ghz) dengan RAM 16 GB dan layar LCD 23 inch dan menggunakan SSD.

Platform Lain

Sebenarnya kadang saya masih “gemes” dengan berbagai Alkitab di platform lain. Dengan CPU yang begitu cepat dan memori yang begitu besar, program Alkitab di berbagai platform butuh waktu sangat lama untuk startup, dan butuh waktu sangat lama untuk berpindah dari satu ayat melompat ke ayat lain. Juga butuh waktu lebih lama lagi untuk berpindah dari satu versi bahasa Alkitab ke versi yang lain.

Kadang program Alkitabnya terlalu banyak fungsinya, sehingga sulit dipakai jika sekedar ingin membuka Alkitab dan pergi ke ayat tertentu. Kadang programnya butuh login. Ada juga program yang terlalu minim fungsi, misalnya hanya bisa satu versi bahasa Alkitab, sedangkan saya butuh minimal dua versi. Ketika mendengar kotbah berbahasa Inggris di sini, saya kadang ingin membandingkan isinya dengan versi bahasa Indonesia, terutama jika ada pembahasan mengenai pemilihan kata tertentu.

Jadi mungkin di masa depan, saya akan membuat Alkitab juga untuk platform lain. Tapi itu tidak menjadi prioritas, saya memprioritaskan platform-platform yang saya pakai secara ekstensif, dan belum ada aplikasi Alkitab gratis yang bagus untuk platform tersebut.

Penutup

Membuat aplikasi Alkitab bagi saya adalah pengalaman berharga. Banyak sekali hal yang saya dapat:

  1. Saya belajar tentang pemrograman, berbagai teknologi untuk membuat program. Belajar mengenai efisiensi.
  2. Saya belajar membuat user interface di berbagai platform
  3. Saya belajar mengenai Alkitab. Bahkan hal-hal yang tidak akan saya pelajari jika saya tidak membuat program Alkitab. Misalnya, saya mungkin tidak akan belajar mengenai Deuterokanonika (mengenai urutan, penempatan) jika saya tidak ditanya oleh orang Katolik mengenai file PDB Alkitab Katolik. Saya juga belajar berbagai trivia, misalnya kitab mana yang paling banyak pasalnya, pasal mana yang baling banyak ayatnya, ayat mana yang paling panjang kalimatnya. Semua itu untuk testing user interface.
  4. Saya jadi kenal dengan banyak orang. Ada yang meminjami device (bahkan ada yang memberikan juga), ada yang memberi donasi (saya gunakan untuk membeli device, SD Card, dsb), memberi support (misalnya ada sekelompok orang yang mendoakan proses kelahiran Risna dari menara doa di India). Aplikasi ini juga jadi bahan obrolan ketika bertemu para misionaris di dunia nyata.

Secara umum saya merasa senang, karena talenta saya dapat saya gunakan untuk melayani Tuhan.

Saya senang Risna mendukung saya dari program Symbianbible dulu sampai program Bibleplus terbaru yang sekarang, dan saya berharap masih bisa terus berkarya menggunakan talenta saya dalam pelayanan digital.

2 thoughts on “Menulis program Alkitab, dulu dan sekarang”

  1. Bug gojek yg membawa saya kesini 😀 dan kepoin berbagai macam postingan di blog mas yohanes 😀

    Dan ternyata mas ini salah satu developer yg membuat aplikasi alkitab di android yg selama ini saya pakai 😀

    Salut mas, Tuhan memberkati 🙂

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.