Serasa hidup seratus tahun

Saya dulu lahir dan menghabiskan masa kecil di tempat yang boleh dibilang agak primitif. Tempatnya tidak ada listrik (memakai lampu dian), tidak ada toilet (buang air di kali), memakai kayu untuk memasak (tidak memakai minyak tanah atau gas), dinding rumahnya dari anyaman bambu.

Dulu saya kadang berpikir: sayang sekali dulu saya nggak punya kesempatan belajar komputer dari kecil (seperti anak-anak di Amerika pada masa itu misalnya). Tapi setelah bertemu banyak orang, terutama orang tua, saya jadi bisa nyambung ketika bercerita dengan mereka (“dulu waktu saya masih kecil, belum pake listrik, bisa kamu bayangkan nggak?”). Saya jadi merasa pernah hidup di awal abad 20 (atau bahkan seperti akhir abad 19 di Eropa).

Komputer pertama saya bukan IBM PC tapi Apple II/e yang dibeli bapak saya karena dapat dengan harga sangat murah (bapak nggak ngerti berbagai jenis komputer). Sekarang waktu saya melihat berbagai video Youtube mengenai komputer lama, saya merasa bisa mengerti yang mereka bicarakan. Saya jadi sempat merasa hidup remaja di tahun 1980an.

Sekarang saya jadi lebih bisa menikmati cerita sejarah, tapi biasanya sampai sekitar 1900an atau kahir 1800an saja, karena sebelum itu tidak banyak yang bisa dilakukan oleh orang biasa (bukan dari keluarga ningrat atau kaya). Sebelum itu banyak penemuan dasar seperti toilet juga belum umum. Baru pertengahan abad 19 toilet dengan flush banyak dipakai. Kertas tisu toilet baru diterima di Eropa tahun 1930an setelah teknologinya cukup matang.

Saya tidak tahu berapa lama lagi akan hidup, tapi dengan pernah mengalami masa kecil di kampung, pernah memiliki komputer lama, dan dengan membaca banyak sejarah, saya merasa telah hidup lama sekali. Meski begitu tentunya saya berharap ingin punya umur panjang untuk melihat berbagai hal di masa depan.

15 Tahun ngeblog bareng

Hari ini tepat 15 tahun kami ngeblog bareng. Cerita mengenai awal ngeblog bareng ini sudah dituliskan waktu saya posting mengenai 10 tahun ngeblog bareng (kami ngeblog setelah beberapa bulan pacaran). Kenapa kami masih ngeblog di sini sementara orang lain memakai sosmed (berganti-ganti sosmed) dan kenapa ngeblognya campur-campur antara cerita teknis, cerita kehidupan dan hal random lainnya sudah pernah juga dituliskan di posting 14 tahun blogging bareng.

Sekitar setahun terakhir ini kami tambah rajin ngeblog. Risna mulai memaksakan diri lebih banyak ngeblog dengan mengikuti writing challenge dan saya berusaha menambahkan banyak konten baik teknis maupun non teknis.

Jumlah posting blog sampai saat ini

Menulis teknis yang akurat dan enak dibaca itu sulit dan butuh waktu jadi itu sebabnya cerita teknisnya tidak selalu ada. Saya tahu banyak yang suka membaca blog ini dan minta topik tertentu tapi tidak bisa saya tuliskan dengan singkat karena prerequisite ilmunya banyak.

Saya berikan contoh topik yang sering diminta orang: bypassing SSL Pinning. Secara praktis ada beberapa tool yang memungkinkan kita membypass SSL pinning dan tekniknya jalan pada 90% aplikasi yang ada. Masalahnya adalah pada 10% aplikasi lain yang tidak bisa dibypass itu bagaimana? biasanya orang bertanya karena aplikasi yang ingin dicoba tidak bisa dibypass SSL pinningnya dengan berbagai tool yang sudah ada.

Topik bypassing SSL pinning ini meliputi banyak hal: mengenai bagaimana kerjanya SSL? apa itu SSL certificate? apa isinya? Apa itu public key? lalu biasanya public key ini harus dihash, apa itu hashing? setelah dihash informasinya biasanya disimpan dalam encoding base64.

Tanpa dasar semacam itu sulit sekali membuat artikel singkat bypass SSL Pinning yang bisa membypass berbagai aplikasi. Saya sudah mulai membahas banyak topik dasar di blog ini walau tidak disharing ke sosmed, sekarang semuanya dimasukkan kategori: basic security.

Tapi hidup ini nggak cuma soal teknis, jadi saya akan menulis lebih banyak hal lagi yang belum saya tuliskan. Ada banyak minat sesaat saya yang sering tidak saya tulis padahal bisa jadi kenangan. Saya dulu sempat suka dangdut (misalnya ada posting Jadilah Bintang), suka Anime dan Manga (dulu saya sempat melukis Sailor Moon dengan cat minyak di pelajaran seni rupa, dan salah satu keisengan adalah membuat program kuis Sailor Moon), pernah suka campur sari (belum pernah saya tulis), dan masih banyak lagi.

Sekarang ini juga saya jadi sering membaca berbagai topik random karena berbagai pertanyaan dari Jonathan yang sering ke mana-mana (misalnya: “If nothing made out of matter can not exceed the speed of light, can we use anti-matter instead?“, “How many rovers are there on Mars?”). Kadang bingung bagaimana menuliskan topik random seperti ini. Kadang ketertarikan Jonathan juga tidak bertahan terlalu lama karena memang kadang hal-hal yang dia pikirkan masih jauh dari kemampuannya saat ini.

Berbagai keisengan Jonathan ini rencananya juga akan saya tuliskan. Kadang ini masih berhubungan dengan teknis juga. Misalnya sekarang Jonathan sedang berusaha membuat kalkulator di minecraft. Dia sudah melihat beberapa video untuk berbagai pendekatannya (misalnya ada pendekatan sangat sederhana dengan semacam lookup table, dan pendekatan dengan konversi ke biner dulu).

Saya senang sampai sekarang masih bisa ngeblog bareng Risna. Semoga kami bisa tetap ngeblog bareng terus menuliskan kisah hidup kami sampai tua nanti.

Download video Youtube

Dulu waktu kami sampai di Chiang Mai, kecepatan internet kami hanya 1 MBPs dan waktu itu kebetulan karena faktor tertentu Youtube sedang diblokir di Thailand. Setelah ada Youtube kami bisa streaming dengan lancar dan waktu itu belum pernah butuh download video dari Youtube.

Tapi kemudian ternyata ada banyak alasan kenapa kami jadi butuh download video Youtube. Di jaman kami memakai tablet Blackberry Playbook, Youtube hanya bisa dimainkan jika terhubung ke Internet via WIFI jadi mau tidak mau harus mendownload video agar bisa dibuka offline ketika sedang jalan di luar.

Dulu ada beberapa video yang disukai Jonathan dan videonya tiba-tiba diremove dari Youtube. Pelajaran berikutnya: jika memang ada video yang dirasa “penting”, maka sebaiknya perlu didownload. Ini juga berguna jika internet mati sementara (walau cukup jarang).

Sekarang Youtube mobile sudah memiliki fitur untuk mendownload video tertentu (tidak semua video bisa didownload). Fitur ini cukup berguna, terutama jika ingin bepergian tanpa akses Internet sementara (misalnya dalam penerbangan), tapi secara umum kurang berguna untuk sehari-hari.

Mendownload video dari Youtube juga berguna karena video bisa dimainkan bebas iklan setelah download. Di browser jika kita memakai uBlock Origin kita bisa memblok iklan dari Youtube, tapi di Android/iOS kita tidak bisa memakai ini. Sebenarnya ada berbagai cara untuk melihat video youtube tanpa iklan, tapi ini main kucing-kucingan dengan Google dan sekarang lebih sering gagal. Jadi download video adalah cara paling efektif menonton bebas iklan untuk video panjang.

Dulu saya sempat memakai berbagai website dan extension untuk membantu mendownload video youtube, tapi semuanya tidak tahan lama. Video downloader yang saya pakai selama beberapa tahun terakhir ini adalah: youtube-dl. Ini berbasis command line, walau ada juga yang membuatkan interfacenya. Selain bisa dipkai mendownload video Youtube, youtube-dl juga bisa digunakan mendownload video dari berbagai situs video lainnya.

Perlu diperhatikan bahwa mendownload video ini tidak sepenuhnya legal, jadi sebaiknya jangan diupload lagi ke situs lain. Hasil download video tidak saya bagikan ke orang lain dan hanya untuk keperluan sendiri.

Dongeng

Sejak beberapa tahun terakhir ini Jonathan minta diberi cerita sebelum tidur. Awalnya saya memberi cerita-cerita yang memang saya hapal (misalnya kisah kura-kura dan kelinci yang berlomba lari), lalu kadang saya membaca sesuatu dari buku. Tapi sejak Jonathan bisa lancar membaca bukunya sendiri, ceritanya sekarang berubah: tentang topik apa saja.

Dongeng di malam hari ini jadi kesempatan bagi Jonathan untuk mendapatkan perhatian penuh dari saya karena adiknya tidur bersama mamanya. Tapi beberapa hari terakhir ini Joshua sepertinya mulai penasaran juga dan ikut masuk kamar kakaknya untuk ikut mendengarkan cerita.

Kadang saya cerita tentang masa lalu saya di kampung. Hidup tanpa listrik, tanpa telepon, menggunakan kayu bakar, rumah dengan dinding bambu. Buang air di kali depan rumah. Segala pengalaman saya setelah itu juga saya ceritakan, termasuk juga sampai bisa masuk ITB. Untuk berbagai kenakalan, misalnya menghack kampus dan hampir DO, saya ceritakan juga tapi dengan penjelasan bahwa itu tidak baik, dan setelah peristiwa itu saya tidak melakukan hal semacam itu lagi.

Berbagai fakta tidak penting yang pernah saya ketahui juga ternyata menarik bagi Jonathan. Setelah membaca buku Murderous Math, Jonathan ingin tahu trik matematika apa yang saya tahu, dan saya ingat tentang perpangkatan 2 untuk bilangan yang berakhiran 5 (5 pangkat 2, 25 pangkat 2, dst). Caranya: ambil bilangan sebelum angka 5 (anggap ini X), kalikan dengan (X+1) dan tambahkan akhiran 25. Contohnya 35×35, 3 x 4 = 12, jadi hasilnya: 1225.

Di lain kesempatan saya membahas tentang sejarah komputer. Pembahasannya bisa ke mana-mana, dari mulai sejarah transistor sampai bahasa pemrograman. Waktu saya cerita tentang KIM-1, Jonathan tertarik sekali dan ingin mencobanya di emulator. Keesokan harinya saya menemukan website emulator KIM-1, dan dia memasukkan satu digit demi satu digit program (dari Internet) untuk menampilkan jam.

Kadang saya bercerita panjang lebar demi mengajari Jonathan untuk memahami sebuah lelucon. Contohnya dalam pelajaran sainsnya dia belajar tentang bebatuan dan ada dibahas sedikit tentang penggunaan dinamit untuk tambang. Saya kemudian menjelaskan tentang bahan peledak C-4, hanya supaya dia mengerti joke: If A is for Apple and B is for Banana then what is C for? Plastic Explosives. Untungnya Jonathan cukup cerdas jadi dia bisa langsung paham dan tertawa dengan joke-joke semacam itu.

Masalah cerita sebelum tidur ini mengingatkan saya dulu waktu kecil diberi banyak dongeng oleh nenek. Dulu saya hanya mendengarkan saja, berbeda dengan Jonathan yang banyak bertanya. Sekarang ini berbagai pertanyaannya belum ada yang aneh, saya belum tahu nanti di masa depan akan seperti apa pertanyaan-pertanyaan yang diajukannya.

Talk Nerdy to Me: The World in Facts, STATS, and Geeky Graphics

Jonathan agak mirip dengan saya waktu masih seusianya: suka belajar dan menghapalkan banyak fakta baru. Jadi ketika saya melihat ada buku Talk Nerdy to Me di Big Bad Wolf book sale, saya langsung terpikir untuk membelinya.

Sudah beberapa kali dia membaca secara random halaman-halaman di buku ini. Buku ini sekedar berisi fakta/infografis berbagai hal. Contohnya: mengenai gunung berapi, tenaga nuklir, ruang angkasa, bahkan soal agama-agama di dunia.

Buku ini menurut saya agak terlalu “random”, dan mungkin tidak semua anak akan suka buku ini. Bagusnya buku semacam ini adalah: bisa melengkapi pengetahuan umum seorang anak dan bisa jadi awal untuk eksplorasi lebih banyak lagi. Ini mungkin bisa dibandingkan buku jaman dulu buku pintar rangkuman pengetahuan umum. Tapi buku ini jauh lebih menarik infografisnya.

Memiliki anak yang senang menghapalkan fakta-fakta semacam ini kadang menyenangkan dan kadang agak “menyebalkan” karena ingin selalu bercerita fakta baru. Bagusnya dengan ini Jonathan jadi tahu lebih banyak tentang dunia dan bisa menjadi suplemen untuk pelajaran homeschoolnya.

Buku ini juga membuat Jonathan tertarik pada acara pengetahuan yang agak random di Netflix: Brainchild. Mungkin akan saya bahas acara ini di posting lain.

Bisa bahasa pemrograman apa?

Sering ada yang bertanya ke saya: pak, bisa bahasa pemrograman apa aja sih? Biasanya hanya saya jawab: banyak (karena memang banyak). Tapi di posting ini saya ingin cerita lebih lengkap tentang bahasa-bahasa yang pernah saya pakai. Karena sudah lebih dari 25 tahun sejak saya belajar bahasa pemrograman pertama sudah banyak yang saya coba.

Sumber: TIOBE Index

Saya pertama kali belajar sendiri bahasa BASIC di IBM PC dan juga di Apple II/e ketika masih SMP. Karena belajar sendiri jadinya kurang terstruktur, tapi BASIC sangat berkesan buat saya. Saya sekarang tetap ingat bagaimana memprogram dalam BASIC (dan sempat mengajari juga dasar-dasarnya ke Jonathan). Saya bahkan sempat membeli AppGameKit, sebuah tool untuk membuat game dengan bahasa BASIC modern

Program iseng dalam BASIC/App Game Kit yang hampir seribu baris

Ketika SMU, saya belajar Pascal juga ototidak (contoh berbagai program hasil otodidak bisa dilihat di posting ini). Waktu kuliah di ITB, bahasa Pascal juga diajarkan jadi saya lebih paham lagi, termasuk juga untuk membuat berbagai struktur data. Saya sempat belajar Visual Basic, dan sempat membuat beberapa aplikasi tapi ketika kenal Delphi, ini jadi bahasa favorit saya karena bahasanya memang sangat dekat dengan Pascal tapi visual.

Bahasa yang masih saya pakai sehari-hari sampai saat ini adalah C dan juga C++. Beberapa contoh aplikasi yang saya buat: Alkitab untuk OS Symbian dan Blackberry 10. Beberapa karya saya dalam C bisa dilihat di Github. Saya merasa cukup paham C, karena bisa membayangkan translasinya ke assembly. Walaupun sudah memakai C++, saya sering merasa ada hal-hal mengejutkan yang saya temui.

Pengetahuan saya mengenai bahasa R sangat terbatas. Saya mengenal bahasa ini hanya karena pernah membimbing anak buah di kantor untuk integrasi C++ dengan R. Jadi saya sekedar bisa membaca dan membuat skrip kecil sekedar testing integrasi, tapi tidak pernah menulis skrip besar dalam R.

Di kampus dulu kami juga diajari Lisp, ini masih saya pakai untuk konfigurasi editor Emacs. Di kampus juga diperkenalkan bahasa Prolog dan Fortran, tapi keduanyatidak pernah saya pakai lagi sejak lulus. Walau tidak memprogram dalam Fortran, ada beberapa library Fortran yang dipakai di kode C++, jadi secara tidak langsung pengetahuan Fortran masih berguna.

Bahasa pemrograman untuk web yang pertama kali saya pelajari adalah Perl. Tentunya Perl ini tidak hanya untuk memprogram web, tapi bisa dipakai untuk membuat berbagai aplikasi command line. Saya pernah menulis seri artikel belajar Perl dulu di majalah Master Web.

Sekarang saya tidak pernah lagi memprogram dalam Perl dan lebih sering memakai Python untuk berbagai skrip yang saya tulis. Berbagai aplikasi web kecil untuk keperluan internal kantor juga saya buat dalam Python. Ketika belajar Machine Learning, ada lebih banyak library dalam Python.

Dalam pelajaran Machine Learning dari Coursera, MATLAB juga dipakai (tepatnya saya memakai Octave, software open source yang cukup kompatibel dengan MATLAB). Dari dulu saya sering membantu berbagai program kecil MATLAB teman-teman di ITB, tapi tidak pernah benar-benar mendalami bahasanya.

Di kampus dulu saya sempat bekerja di ITB untuk mengolah data ITB. Untuk konektivitas hardware (Scanner dan Printer) bahasa yang dipakai adalah Java. Java merupakan bahasa dinamik yang saya pahami sampai internalnya (level byte codenya). Saya juga cukup hapal semua API dasarnya (maklum dulu belum ada Stack Overflow jadi baca dokumentasi JDK hampir tiap hari sampai hapal). Sampai sekarang saya masih cukup fasih memakai Java karena masih sering berhadapan dengan ini. Di jaman Blackberry saya juga membuat berbagai aplikasi dalam Java.

Meskipun sudah belajar dasar-dasar Kotlin, tapi saya belum merasa mahir memakai ini. Di kepala saya, saya bisa membayangkan tiap kode Java akan seperti apa bytecodenya, tapi untuk Kotlin saya tidak selalu bisa memetakan hal tersebut. Padahal Kotlin ini seharusnya kompatibel dengan Java, tapi karena belum paham internalnya, saya merasa kurang nyaman.

Groovy adalah bahasa lain yang masih berhubungan dengan Java. Saya hanya mengenal ini karena ini dipakai oleh Gradle. Sejauh ini saya merasa kurang nyaman dengan Syntax ekstranya dan lebih memilih Java saja jika memang menargetkan JVM.

Di tahun 2000an PHP mulai sangat populer dan beberapa aplikasi mulai dibuatkan versi webnya. Ketika saya bekerja di kampus, PHP juga dipakai untuk menampilkan berbagai data ke publik. Saya mulai memakai PHP sejak versi 3. Pengetahuan PHP ini juga sangat berguna untuk pentesting.

Saya belajar Javascript sejak jaman awal memakai web dulu. Dulu saya hanya membuat skrip-skrip kecil untuk menambah interaktivitas web. Saya sempat meninggalkan bahasa ini, tapi sejak ES6 mulai mengikuti lagi. Saya sempat mendalami JS ketika membuatkan sebuah aplikasi berbasis AngularJS untuk organisasi teman yang butuh aplikasi mendadak. Sampai saat ini saya tidak pernah membuat aplikasi serius di sisi server dengan nodejs (menurut saya PHP atau Python lebih praktis untuk kebanyakan aplikasi sisi server). Saat ini yang Javascript saya pakai untuk membuat browser extension untuk dipakai sendiri.

Saya kenal bahasa Ruby dan bisa memakainya. Saya bahkan pernah menyelesaikan CTF yang memakai bytecode Ruby. Tapi saya tidak pernah mahir dalam Ruby karena sejujurnya: saya tidak pernah menemukan kasus di mana saya memilih Ruby. Untuk website saya lebih suka memakai Python (Django atau Flask tergantung sebesar apa webnya), sedangkan untuk berbagai scripting ada lebih banyak library Python yang tersedia. Secara umum Python juga lebih cepat.

Saya belajar bahasa Lua ketika memprogram dengan game framework Marmalade. Dulu saya bisa dapat gratis gamepad dari Blackberry jika mengirimkan game dengan framework tersebut. Ketika memakai ESP8266 saya juga kadang memilih Lua untuk berbagai aplikasi sederhana.

Selagi membuat game untuk Jonathan dulu saya sangat tertarik dengan bahasa Haxe. Saya suka dengan bahasa ini karena cukup dekat dengan ActionScript 3 (saya hanya tahu AS3 ini, tapi tidak bisa Action Script 2). Haxe bisa dikompilasi menjadi kode C++, ActionScript 3, Javascript dsb.

Saat ini saya memahami beberapa bahasa assembly untuk beberapa platform: x86 (16 bit sampai 64 bit), ARM (thumb, ARM32, dan ARM64), MIPS (MIPS32), AVR, dan 6502. Saya kenal berbagai bahasa ini dalam rentang waktu lama. Contohnya: saya belajar assembly x86 16 bit di jaman DOS. Saya belajar ARM sejak memakai Symbian (dan tahun lalu menang CTF dengan hadiah ke Hongkong karena skill ini). Saya belajar AVR sejak belajar Arduino (terpakai untuk RHME sampai dapat training ke Belanda), belajar MIPS ketika memakai router dengan prosessor MIPS dan belajar 6502 karena tertarik dengan game lama.

Saya sempat tertarik juga memprogram dalam bahasa Forth (pernah saya tuliskan di sini), tapi tidak ketemu akan diaplikasikan di mana. Sekarang berbagai board murah (misalnya ESP8266 dan ESP32) bisa diprogram dengan C/C++ dan hasilnya sudah sangat cepat sedangkan jika butuh eksplorasi Javascript, Micropython dan Lua juga tersedia.

Untuk shell scripting, saya hanya fasih menggunakan bash. Shell lain juga bisa tapi saya sering kali harus membaca dulu manual pagenya. Biasanya saya mengkombinasikan bash shell ini dengan GNU Awk. Di Windows saya bisa memakai batch file (batch versi Windows saat ini hanya berbeda sedikit dari jaman DOS dulu). Saya mengerti Powershell dan ketika mengikuti Flare on ada beberapa persoalan membongkar skrip Powershell, tapi saya kurang mahir memakai ini.

Meskipun sudah banyak membaca mengenai Go, tapi saya belum pernah membuat program serius. Jika sekedar ingin membuat skrip kecil, Python masih lebih enak (contoh: membaca file per baris di Go lebih ribet daripada di Python), sedangkan jika butuh performance lebih tinggi: C++ masih lebih bagus dan sekarang dengan C++11 ke atas, syntax C++jadi semakin mudah dibaca. Go sepertinya lebih cocok jika butuh sesuatu yang konkuren, tapi tergantung jenis konkurensi yang diinginkan, ini pun bisa dilakukan dengan mudah di C++ (threading sudah jadi standar di C++11).

Dalam Index TIOBE, SQL termasuk dalam bahasa pemrograman. Saya paham SQL standar, dan saya juga tahu dialek Mysql, SQLite dan PostgresSQL. Untuk DBMS lain seperti MS SQL dan Oracle, saya belum pernah menulis sendiri Stored Procedure (walau sering membaca topik ini karena masalah SQL Injection).

Dalam dunia .NET saya hanya paham C#. Saya juga bisa membaca Visual Basic .NET karena sangat dekat syntaxnya dengan C# tapi saya akan kesulitan jika harus menulis kode baru dengan Visual Basic .NET. Pengetahuan saya mengenai C# dan teknologi .NET secara umum tidak sedalam pengetahuan saya mengenai Java.

Meskipun belum pernah membuat aplikasi besar, saya cukup mengenal Objective C. Ini saya pelajari dulu waktu beli iBook pertama yang masih memakai Power PC. Saya sempat belajar Swift versi pertama, tapi kemudian Apple beberapa kali mengubah bahasanya, dan sampai sekarang saya belum berusaha mengikuti lagi.

Sekarang bahasa yang berusaha saya dalami adalah Rust. Dulu saya mengikuti bahasa ini, tapi kemudian ada beberapa perubahan dan kemudian saya menunggu lagi sampai bahasanya stabil. Sekarang ini sepertinya sudah cukup stabil, walau masih ada beberapa fitur yang masih akan diperkenalkan untuk mempermudah pemakaian bahasa ini.

Rust ini didengungkan sebagai bahasa yang type safe, dan ini mengingatkan saya pada Ada yang dulu diajarkan di kuliah. Saya melupakan bahasa Ada ini cukup lama sampai Bos menyebutkan bahwa ada rekannya di Jerman yang mulai memakai lagi Ada, setelah itu saya sempat melihat-lihat lagi. Andaikan ada cukup banyak library untuk Ada, sepertinya saya ingin lagi mencoba membuat program dalam Ada.

Untuk mengajari Jonathan saya jadi belajar Scratch (bahasa visual untuk anak anak). Selain itu saya jadi belajar bahasa pemrograman Logo karena Jonathan membaca seri buku Secret Coders.

Meskipun saya sudah belajar banyak bahasa dan memakai di aplikasi nyata, ada banyak bahasa lain yang saya mulai tapi tidak saya teruskan.

  • Bahasa D: keuntungannya dibandingkan C tidak terlalu banyak, IDE yang support bahasa ini juga sedikit
  • Erlang dan Elixir: sebenarnya ini menarik dan sempat tertarik karena dipakai oleh ejabberd dan RabbitMQ, tapi saya tidak menemukan kasus (untuk saya pribadi) di mana bahasa ini cocok
  • Haskell: ini menarik, tapi menurut saya kurang praktis
  • COBOL: sempat baca-baca dan coba-coba karena kenal dengan developer di bank yang sedang belajar ini. Tujuannya teman saya itu mau menggantikan seniornya, sedangkan saya hanya iseng jadi tidak diteruskan
  • Dart: tadinya tertarik, tapi pemakaiannya terbatas. Sekarang dengan adanya flutter saya jadi ingin coba lagi
  • Scala: bahasanya ribet banget

Lalu ada bahasa-bahasa yang belum pernah saya sentuh sama sekali misalnya: SAS, LabView, Ladder Logic, dsb. Ini biasanya memang hanya untuk dipakai di tempat tertentu saja dan kebetulan saya belum pernah butuh itu.

Penutup

Perlu ditekankan bahwa sejak belajar bahasa pertama (BASIC) hingga saat ini sudah lebih dari 25 tahun. Sepertinya saat ini saya tahu kurang dari 25 bahasa, dan hanya benar-benar menguasai sekitar 10 saja (dalam arti cukup percaya diri untuk membuat produk dalam bahasa tersebut).

Rata-rata saya butuh waktu beberapa tahun memakai satu bahasa sampai merasa nyaman dengan bahasa itu. Jadi jangan merasa harus belajar banyak bahasa sekaligus dalam waktu singkat. Saya dulu mempelajari tiap bahasa ini biasanya diawali oleh suatu alasan:

  • Minat sendiri: waktu belajar BASIC dan Pascal
  • Memang wajib di kuliah: Prolog, Fortran, Lisp
  • Diperlukan dalam pekerjaan: waktu belajar PHP dan Java
  • Coba-coba tren: Ruby (karena Ruby On Rails)

Biasanya jika ada tujuan khusus membuat sesuatu maka saya lebih cepat bisa menguasai bahasa itu. Jika tidak ada tujuan khusus, maka saya sekedar tahu, lalu lupa lagi.

Jika sudah memiliki dasar yang kuat di satu bahasa, beberapa bahasa lain akan mudah dipelajari. Contoh: secara konsep C# dan Visual Basic .NET tidak jauh berbeda hanya Syntaxnya yang beda. Jika sudah memiliki dasar Java, beberapa bahasa lain turunannya seperti Kotlin dan Groovy mudah dipelajari. Bahasa dengan paradigma fungsional memang sangat bebeda dengan bahasa prosedural, tapi jika sudah menguasai salah satunya, mempelajari yang lain juga tidak sulit.

Saya menuliskan ini jadi bernostalgia dengan masa-masa belajar tiap bahasa di atas. Untuk para pemula: santai saja, belajarlah setahap demi setahap dan buatlah sesuatu ketika belajar bahasa baru.

Mencari bug

Ada yang bertanya ke saya: bagaimana sih caranya mencari bug di aplikasi? Karena jawabannya tidak bisa ditulis singkat di chat, di tulisan kali ini saya akan berusaha menjawab pertanyaan itu.

Apa itu bug?

Kalau Anda disuruh mencari sebuah benda tapi tidak tahu benda itu seperti apa bentuknya maka Anda tidak akan bisa menemukannya (Contoh: tolong ambil logic analyzer di laci saya). Sama halnya dengan bug: pertama pahami dulu berbagai jenis bug yang ada, baru Anda bisa menemukannya.

Contoh-contoh bug web misalnya: SQL Injection, IDOR, XSS, dan command injection. Contoh bug aplikasi misalnya: buffer overflow. Selain tahu apa itu sebuah bug, kita juga perlu tahu bagaimana cara mengeksploitasinya.

Black box testing

Ini testing yang paling umum. Kita coba-coba berbagai input dengan harapan keluar suatu pesan error yang bisa menunjukkan kesalahan di sebuah program. Contoh kecil: jika ada input petik tunggal (‘) dan programnya menampilkan SQL error, maka kemungkinan ada bug SQL injection.

Tentunya coba-coba ini harus yang masuk akal. Ini biasanya tergantung pada: aplikasinya seperti apa, servernya memakai OS apa. Contoh: berusaha melakukan command injection dengan berbagai command Windows di server Linux maka tidak akan berhasil. Berusaha melakukan angular template injection di aplikasi yang tidak memakai Javascript juga tidak akan berhasil.

Intinya: meskipun ini adalah black box testing, yang sepertinya sekeda menebak-nebak, ada hal-hal masuk akal yang bisa kita coba. Jika kita ingin membeli suatu barang, kita bisa mencoba mengganti nilai pembelian, berusaha membypass proses pembayaran, dsb.

White box testing

Jika kita memiliki akses ke source code, maka kita bisa mencari bug dengan membaca source code aplikasinya. Source ini bisa didapat dari beberapa cara:

  • Aplikasinya memang open source (contoh: berbagai aplikasi web seperti WordPress ada source codenya)
  • Dari hasil dekompilasi (contohnya: berbagai game bisa didekompilasi)
  • Dari bug lain (contoh: jika menemukan bug web untuk membaca sebuah file, maka bisa kita manfaatkan untuk membaca source code aplikasi)

Nah di sini kemampuan membaca source code diperlukan. Dengan adanya source code, kita bisa melihat alur program dan menentukan apakah sebuah input dicek atau tidak, dan apakah inputnya bisa dipakai untuk membypass sesuatu atau mengeksekusi apa yang seharusnya tidak boleh dieksekusi.

Memahami Tool

Untuk melakukan testing, kita perlu paham berbagai tool yang sesuai. Contohnya untuk testing aplikasi web, kita sebaiknya memakai intercepting proxy (seperti Burp atau Zaproxy). Dengan memakai tool tersebut, kita bisa mengganti request dari browser atau dari aplikasi baik desktop maupun mobile yang akan berkomunikasi dengan server di internet.

Untuk testing aplikasi mobile, keahlian mengekstrak package, melakuan dekompilasi diperlukan. Berbagai tools yang spesifik juga bisa dipakai (misalnya XPosed Framework di Android, atau Frida di berbagai OS lain).

Fuzzing

Untuk bug jenis tertentu, kita bisa memakai tools untuk melakukan fuzzing. Intinya adalah mencoba-coba berbagai input secara otomatis. Ini bisa diaplikasikan ke aplikasi web, atau bahkan aplikasi desktop (contohnya ada yang namanya AFL). Penggunaan fuzzer ini relatif mudah, tapi hasilnya tetap harus dipahami oleh orang yang memiliki skill.

Otomasi

Sebagian bug bisa ditemukan dengan menggunakan tool otomatis. Saya tidak akan membahas ini secara dalam. Intinya ada beberapa scanner aplikasi web yang bisa menemukan berbagai bug yang umum. Ada juga source code analyzer yang bisa menemukan berbagai masalah di source code.

Penutup

Mencari bug kadang mudah kadang sulit, tergantung program yang kita cari bugnya. Sebagian orang yang meretas web tidak mencari bug khusus, tapi biasanya yang terjadi seperti ini:

  • ada yang menemukan bug di aplikasi tertentu (contoh: Drupal)
  • ada yang membuat exploit untuk bug tersebut
  • script kiddies menggunakan Google untuk mencari website yang memakai Drupal (dengan dorking, misalnya mencari “Powered By …”
  • script kiddies mencoba exploit drupal pada website yang ditemukan

Selamat mencari bug.