Server rumah dengan IP publik

Sebagian orang ingin menghosting sendiri berbagai hal di rumah (atau kantor kecil), baik itu web, email, maupun layanan lain. Biasanya koneksi ISP tidak akan memberikan IP publik yang statik tanpa membayar ekstra (biasanya mahal), jadi biasanya banyak trik digunakan supaya server rumah bisa diakses dari luar.

Sebagai catatan sebelum menggunakan trik yang ada di sini: pertimbangkan memakai VPS atau dedicated server. Membuat server di rumah punya banyak kelemahan jika ANda tidak mengerti apa yang Anda lakukan:

  • Koneksi internet dan pasokan listirk di rumah biasanya kurang reliable dibanding data center
  • Jika salah konfigurasi, hacker bisa lebih mudah masuk ke jaringan rumah
  • Mengkonfigurasi semuanya sendiri cukup melelahkan/membuang banyak waktu

Dynamic DNS

Beberapa layanan tertentu seperti web cukup memakai dynamic DNS dan tidak perlu server eksternal tambahan. Artinya sebuah nama domain selalu diupdate IP-nya dengan IP terbaru saat ini. Untuk mengupdate ini bisa digunakan berbagai layanan Dynamic DNS dan server di rumah perlu diinstall software untuk mengupdate pemetaan nama ke IP.

Gambarannya kira-kira seperti ini:

Masalah dengan pendekatan ini adalah: akan ada jeda ketika ada update nama ke IP. Jeda ini karena DNS server akan mengcache informasi IP. TTL terkecil yang bisa diset biasanya 30 detik dan berbagai layanan DNS biasanya mengeset waktu minimumnya 1 menit. Jadi ketika ada pergantian IP, sekitar 1 menit kemudian kita baru bisa mengakses nama tersebut dengan IP baru.

Masalah lainnya adalah: layanan tertentu tidak akan berjalan dengan baik menggunakan pendekatan ini:

  • ISP kadang memblok port tertentu (saat ini ISP saya di sini memblok incoming connection ke port 80 dan 443), tidak bisa menjalankan web server di rumah dengan port standar
  • Andaikan tidak diblok, beberapa layanan seperti email tidak suka dengan IP dinamik (kadang IP masuk ke daftar spam list)

SSH Forwarding

Solusi ini dan berikutnya akan butuh sebuah server VPS. Kalau butuh VPS, kenapa tidak dihosting di VPS saja sekalian? ada beberapa alasan mengapa kita ingin hosting di rumah dengan menggunakan IP VPS:

  • Mungkin VPS-nya kurang powerful (VPS termurah hanya sekitar 5 USD, tapi disk dan RAM-nya kurang besar)
  • Kita ingin data tetap ada di rumah/kantor karena berbagai alasan. Alasannya bisa mengenai privasi, mengenai kemudahan update data/program, dsb.

Jika keperluannya hanya sederhana, SSH Forwarding bisa dilakukan. Saya pernah menjelaskan teknik ini di artikel saya yang lain mengenai SSH. Ini merupakan cara sederhana karena:

  • Tidak perlu setup sesuatu yang kompleks di server (cukup akses SSH yang biasanya memang sudah aktif), hanya perlu mensetup konfigurasi agar Remote Port Forwarding diijinkan
  • Tidak perlu setup sesuatu di client, cukup perlu SSH Client saja.

Satu VPS juga bisa dikoneksikan dengan beberapa server rumah. Mungkin server yang satu untuk web server, dan server yang lain untuk keperluan backup atau email. Atau bisa juga beberapa domain ditangani oleh satu VPS dan diforwarde (dengan apache/nginx atau yang lain) sesuai dengan domainnya.

Intinya adalah: dari server di rumah, kita melakukan SSH ke VPS. Koneksi ke port tertentu ke VPS akan diforward ke server di rumah. Kelemahan SSH forwarding adalah: dari sisi server di rumah semua incoming IP dianggap dari localhost.

Contohnya: pengunjung web dari Belanda, akan melakukan koneksi VPS server tersebut (misalnya di Singapura) lalu koneksinya di forward ke server rumah (misalnya di Indonesia). Di web server di Indonesia, terlihat koneksinya dilakukan dari IP localhost. Jaid bukan dari Belanda ataupun dari Singapura.

Masalah lain SSH adalah: koneksinya bisa putus. Di Linux program autossh bisa dipakai untuk menjaga agar koneksi tetap hidup. Di Windows kita bisa memakai SSH Client dari BitVise yang bisa melakukan auto reconnect.

VPN + DNAT

Ada banyak solusi VPN yang bisa dipakai. Salah satunya yang pernah saya bahas adalah dengan tinc. Bahkan VPN dengan SSH juga bisa dilakukan (dengan menggunakan tunnel device). Dengan VPN, sebuah VPS akan memiliki 2 network interface, satu yang menghadap publik, dan satu yang menghadap ke client VPN (dalam hal ini server di rumah).

Dengan menggunakan DNAT kita bisa mengarahkan agar paket yang diterima di server akan diforward ke client VPN. Perhatikan bahwa ada banyak cara melakukan forwarding ini. tergantung setting firewall dan cara forwardingnya, maka ada dua kemungkinan:

  • Source IP koneksi bisa berasal dari IP VPN server publik (biasanya bukan ini yang diharapkan)
  • Source IP koneksi bisa dari client yang melakukan koneksi ke VPS

Saat ini ada banyak jenis firewall, tergantung OS yang dipakai (iptables, nftables, ipfw, dsb), jadi saya tidak akan membahas detail settingnya, tapi hanya beberapa hal saja yang penting diperhatikan ketika mensetup ini:

  • Pastikan IP forwarding diaktifkan di VPS
  • Pastikan bahwa firewall rule paket dari IP publik berhasil diterima dan diteruskan ke VPN (bisa dicek dengan menggunakan tcpdump -i INTERFACEVPN)
  • Di sisi server rumah: pastikan koneksi yang datang memiliki source address yang benar
  • Ketika server rumah membalas paket yang datang, pastikan koneksi harus lewat VPN lagi (jangan salah membalas langsung lewat IP rumah)

Penutup

Artikel ini tidak membahas detail tiap perintah dan setting yang diperlukan untuk mengimplementasikan masing-masing solusi. Silakan dicari lagi detailnya dengan berbagai kata kunci yang dipelajari di sini (misalnya: Dynamic DNS, Remote Port Forwarding, DNAT dsb). Artikel ini sekedar memberikan pemahaman saja, bukan tutorial.

Salah satu pertanyaan yang paling tidak saya sukai adalah mengenai jaringan komputer. Untuk bisa menjawab suatu pertanyaan, biasanya saya perlu bertanya banyak hal mengenai konfigurasi jaringan saat ini, software yang dipakai dsb. Menanyakan hal semacam ini butuh waktu yang biasanya sangat lama. Setelah itu ada masalah: versi kernel, versi software dsb. Belum lagi jika ada masalah ISP memblokir sesuatu. Semuanya ini bisa dicari sendiri di Internet.

Semoga informasi ini berguna, dan sekali lagi mohon jangan bertanya detail cara melakukan setup semuanya. Silakan digoogling sendiri detailnya.

VPN dengan Tinc

Saat ini ada banyak sekali solusi VPN yang tersedia dengan segala kelebihan dan keterbatasannya. Beberapa contoh solusi yang populer dan gratis adalah OpenVPN, strongSwan, WireGuard, berbagai implementasi PPTP, tinc, dan VPN via SSH. Posting ini akan membahas mengenai tinc yang memiliki fitur mesh networking.

Beberapa perbedaan dari berbagai solusi VPN ini adalah:

  • Support platformnya. Contoh: saat ini wireguard tidak memiliki client di Windows, jadi kalau Anda memakai Windows, ini jelas tidak akan dipertimbangkan.
  • Kemudahan instalasinya (contoh: VPN melalui SSH cukup rumit setupnya, terutama di Windows)
  • Kecepatannya (ini biasanya hanya jika Anda memakai link dengan kecepatan tinggi) dan CPU usagenya (jika memiliki komputer dengan spesifikasi rendah)
  • Keamanannya, walau secara praktis serangan terhadap berbagai protokol VPN ini jarang/sulit dilakukan kecuali pada protokol kuno seperti PPTP.

Selain berbagai perbedaan teknis, pertimbangan lain memilih VPN adalah: apakah protokol VPN tertentu atau port tertentu diblok oleh ISP. Contohnya di ISP saya saat ini VPN dengan PPTP diblok, jadi harus menggunakan yang lain.

Karena ada begitu banyak software VPN, maka saya tidak akan membandingkan semuanya dan hanya akan membahas tinc saja di posting ini. Pengetahuan di atas sekedar untuk memberitahu bahwa tinc mungkin bukan solusi terbaik di berbagai skenario.

Seperti saya singgung di atas Kelebihan tinc adalah kemampuannya membuat mesh network. Mungkin ada yang bertanya-tanya: maksudnya mesh networking seperti apa sih? Maksudnya adalah sebuah node bisa terkoneksi ke node lain tanpa melalui hierarki tertentu dan sifatnya dinamik.

Semua VPN bisa kita gunakan untuk membuat konfigurasi seperti ini: ada server dan banyak client.

Dengan tinc kita bisa membuat konfigurasi seperti gambar berikut.

Garis yang saya gambarkan ini sekedar menunjukkan bahwa ada setting agar suatu node melakukan koneksi ke node tertentu. Dalam praktiknya: setelah kita mengkonfigurasi ini, kita bisa melakukan koneksi dari satu node ke node manapun.

Contoh konfigurasi di atas kira-kira seperti ini:

  • Ada 2 VPS (Node 1 dan Node 4) dengan IP Publik
  • Node 2 dan 3 diset bisa melakukan koneksi ke node 1 (IP node i ini publik jadi mudah setting ini)
  • Node 5 dan 6 diset bisa melakukan koneksi ke node 4
  • Node 7 (mungkin ini sebuah virtual machine di Node 6) diset untuk melakukan koneksi melalui Node 6

Tentunya konfigurasi jaringannya bisa seperti apa saja: intinya sebuah node bisa dikoneksikan ke satu atau lebih node lain (contohnya bisa saja dibuat setting bahwa Node 2 bisa terkoneksi langsung ke Node 3).

Setelah setting ini selesai, koneksi dari node manapun ke manapun bisa dilakukan seolah-olah semuanya ada di jaringan yang sama. Jadi node 7 ke node 2 bisa langsung dilakukan.

Bagaimana jika kita ingin menambah node baru? misalnya ingin menambah VM di node 6, sehingga ada Node 8 yang terkoneksi ke node 5, apakah kita perlu susah payah mengubah semua konfigurasi? Jawabannya: tidak, kita cukup menambahkan di node 6 bahwa ada node bernama Node 8 dengan public key tertentu, dan di Node 8 perlu diberi public key Node 6 supaya bisa tahu bahwa Node 6 ini adalah node yang valid.

Kehebatan tinc adalah jika kita menambahkan Node 8 yang terkoneksi ke Node 6, maka Node 7 dan 8 bisa berkomunikasi langsung di jaringan lokal, tidak melalui VPS. Bahkan bisa juga kita mengkonfigurasi agar Node 2 dan 3 juga melakukan koneksi ke dua VPN bukan cuma 1 (ke Node 1 dan Node 4). Jika Node 1 down, otomatis route lain akan diambil (lewat Node 4).

Atau jika masih sulit dibayangkan. Anggap saja semua node tersebut seolah terhubung ke sebuah switch virtual (atau hub, tergantung modenya di konfigurasi tinc). Karena terhubung ke switch maka semua seolah berada di jaringan yang sama.

Konfigurasi di Linux

Untuk menkonfigurasi sebuah node, yang perlu dilakukan:

  • membuat sebuah direktori dengan nama jaringan yang kita inginkan
  • membuat file tinc.conf di direktori itu
  • membuat private dan public key untuk host kita
  • mengcopy public key host lain yang ingin kita hubungi
  • mengkonfigurasi interface jaringan

Bagian terakhir (konfigurasi interface jaringan) ini yang berbeda di tiap OS. Kita bisa memakai skrip atau mensetup manual.

Tentunya sebelum mulai, kita perlu menginstall tinc. Gunakan software package manager yang sesuai untuk OS masing-masing atau gunakan installer untuk Windows. Di ubuntu/debian:

apt-get install tinc

Saya contohkan jaringan kecil pertama, dengan node1 ada di eksternal (punya IP publik), sedangkan yang lain IP-nya private. Saya beri nama jaringan ini: jaringanku. Bayangkan saja nama jaringan ini seperti nama sebuah switch dalam ilustrasi sebelumnya.

Untuk contoh ini host eksternal saya beri nama “serverku” dan host internal “komputerku“. Sekarang kita konfigurasi serverku:

Buat direktori baru:

sudo mkdir -p /etc/tinc/jaringanku/hosts

Buat file tinc.conf (pathnya: /etc/tinc/jaringaku/tinc.conf). Isinya:

Name = serverku
AddressFamily = ipv4
Interface = tun0

Buat file /etc/tinc/jaringanku/hosts/serverku dengan isi:

Address = alamat_ip_publik_serverku
Subnet = 10.0.0.1/32

Artinya IP server ini dalam jaringaku adalah 10.0.0.1, tentunya ini bisa diganti dengan IP private manapun. Saya sendiri sudah memakai IP 192.168 di jaringan rumah saya, jadi saya memakai 10.x.x.x untuk tinc.

Lalu buat private/public key untuk server ini, tekan saja enter untuk berbagai pertanyaan defaultnya

 tincd -n jaringanku -K4096

Sekarang kita butuh skrip untuk mengeset IP ketika jaringan up dan menghapus IP ketika jaringan down.

Buat: /etc/tinc/jaringanku/tinc-up dengan isi:

#!/bin/sh
ifconfig $INTERFACE 10.0.0.1 netmask 255.255.255.0

Catatan: sebenarnya cara yang lebih modern adalah menggunakan perintah “ip addr add”. Tapi cara ini masih kurang cross platform (tidak jalan di BSD dsb). Jadi saya masih lebih suka memakai ifconfig.

Dan /etc/tinc/jaringanku/tinc-up

#!/bin/sh
ifconfig $INTERFACE down

Jangan lupa diset modenya agar bisa dieksekusi:

sudo chmod +x /etc/tinc/jaringanku/tinc-*

Sekarang untuk komputerku (yang ipnya private) langkahnya sangat mirip. Hanya saja di sini ada konfigurasi agar koneksi dilakukan dari host ini ke server publik (tidak bisa sebaliknya karena server publik tidak bisa melakukan koneksi ke jaringan internal).

sudo mkdir -p /etc/tinc/jaringanku/hosts

Isi tinc.conf disesuaikan: namanya dan ada ConnectTo

Name = komputerku
AddressFamily = ipv4
Interface = tun0
ConnectTo = serverku

Sekarang buat file /etc/tinc/jaringanku/hosts/komputerku dengan isi:

Subnet = 10.0.0.2/32

Cukup itu saja, kita akan memberi alamat 10.0.0.2 ke komputerku. Buat juga key untuk node ini

 tincd -n jaringanku -K4096

Isi /etc/tinc/jaringanku/tinc-down sama dengan serverku, tapi isi tinc-up sedikit berbeda (IP-nya disesuaikan)

#!/bin/sh
ifconfig $INTERFACE 10.0.0.2 netmask 255.255.255.0

Nah sekarang langkah penting: setiap kali 2 node terhubung langsung, kedua node tersebut perlu tahu key satu sama lain. Jadi intinya:

  • Copy isi /etc/tinc/jaringaku/hosts/serverku di server ke
    /etc/tinc/jaringaku/hosts/serverku di komputerku
  • Copy isi /etc/tinc/jaringaku/hosts/komputerku ke
    /etc/tinc/jaringaku/hosts/komputerku di server

Jadi misalnya kita mau menambah laptop (misalnya namanya: laptopku yang akan dipakai jalan-jalan dengan IP yang berbeda-beda), settingnya sama dengan komputerku. Kita cukup perlu copy key laptopku ke serverku dan isi key serverku ke laptop dan dari laptop kita bisa konek ke komputerku.

Dalam kasus itu kita tidak perlu mengcopy key komputerku ke laptop, walau boleh saja kalau mau. Misalnya supaya gampang, semua isi file hosts dicopy ke sebuah hosting atau dropbox dan tiap kali setup komputer baru, semua file-file di copy ke /etc/tinc/jaringaku/hosts/. Isinya hanya public key yang tidak rahasia, yang rahasia adalah private keynya.

Nah sekarang saatnya testing. Di server dan komputer jalankan:

 tincd -D -d4 -n jaringanku

Jika semua beres, dari server kita bisa ping ke 10.0.0.2 (ke komputer) dan dari komputer kita bisa ping ke 10.0.0.1 (ke server). Jika semua lancar, kita bisa men-kill tincd dan membuatnya permanen. Supaya permanen, di sistem yang memakai systemd kita bisa menggunakan ini:

systemctl enable [email protected]
systemctl start [email protected]

Setting di Windows

Sebenarnya konfigurasinya sama saja dengan Linux. Yang berbeda adalah instalasinya dan lokasi direktorinya. Supaya tidak terlalu panjang artikelnya, silakan lihatpetunjuk instalasi di : https://www.tinc-vpn.org/examples/windows-install/

Lokasi direktori konfigurasi ada di: C:\Program Files (x86)\tinc (pada Windows 64 bit) atau C:\Program Files\tinc (Windows 32 bit). Buat direktori: “jaringanku” di dalam direktori tersebut (butuh hak admin, seperti halnya di Linux butuh root).

Untuk konfigurasi IP: kita tidak memakai skrip up dan down, IP di setting manual melalui GUI. Cara testingnya sama:

 tincd -D -d4 -n jaringanku

Dan jika sudah OK, untuk membuat permanen (diinstall sebagai service).

 tincd -n jaringanku

Jika ingin merestart, mendisable, atau menghapus service ini, maka bisa dilakukan melalui GUI Services di Windows. Atau jika menguasai PowerShell ini juga bisa dilakukan via PowerShell

Berikutnya

Setting tinc yang saya jelaskan hanya supaya kedua host terkoneksi dengan ip internal. Setelah itu kita bisa mensetup banyak hal lain, tapi tidak akan dibahas di sini. Contohnya yang bisa disetting:

  • Jika kita ingin membagi koneksi internet server ke client (supaya client bisa browsing web dengan IP server seperti koneksi VPN pada umumnya) kita bisa memakai IP masquarading atau menginstall proxy server di server.
  • Jika kita ingin server di rumah kita diakses dari luar, kita bisa memakai DNAT (atau SSH remote port forwarding).

Sebagai penutup: mengetahui berbagai teknologi VPN bisa sangat berguna dan bisa dipakai untuk menyelesaikan masalah sesuai kebutuhan kita.

SSD 1 TB

Ini sekedar catatan kapan saya mulai memakai SSD 1 TB dan bagaimana prosesnya memindahkan Windows ke SSD baru. Bulan April 2017 saya membeli SSD 480 GB merk Sandisk untuk desktop utama saya dengan harga 5390 baht dari JIB, dan kemarin saya mengganti SSD ini dengan yang kapasitasnya 1 TB merk Crucial dengan harga 4690 baht (plus 42 baht ongkos kirim) dari invadeIT.

SSD 480 GB-nya masih akan saya pakai di komputer lain karena sebenarnya masih bagus, hanya saja kapasitasnya sudah kurang untuk berbagai pekerjaan yang perlu saya lakukan. Setiap kali SSD mendekati penuh, saya jadi “sibuk” yang tidak berguna. Setiap beberapa minggu saya perlu memindahkan data ke yang sudah jarang dipakai harddisk dan memindahkan data yang saat ini sedang dipakai ke SSD .

Dalam 2 tahun ini harga SSD kira-kira sudah turun 1/2 nya. Sebagai perbandingan, dulu waktu saya mulai memakai SSD 7 tahun yang lalu harganya masih 3400 baht untuk 60 GB. SSD yang saya beli 7 tahun yang lalu saat ini masih berfungsi normal, tapi saya sudah tidak berani menaruh data penting di situ.

Dulu terakhir saya memindahkan data ke SSD sekalian menginstall ulang Windows sekaligus membuang berbagai program yang sudah tidak saya pakai. Kali ini saya sangat malas sekali menginstall ulang semua jadi saya memakai software Easus Todo Backup Free.

Di Linux saya mengerti 100% bagaimana melakukan transfer sistem ke disk baru tanpa menimbulkan masalah, tapi di Windows saya selalu khawatir jika ada aplikasi yang tiba-tiba tidak jalan. Contohnya yang pasti tidak jalan adalah aplikasi yang memakai serial number disk untuk lisensi, dan ketika diganti disknya: lisensinya tidak valid. Selain itu kadang ada program-program tertentu yang juga “ngambek” jika disknya berganti kapasitas. Ini baru kali pertama saya memakai Easus dan ternyata cukup lancar walau prosesnya tidak 100% seperti yang diharapkan.

Proses copy system memakan waktu hampir 2 jam, dan setelah itu Windows bisa booting normal (saya cabut SSD lama supaya yakin). Saya khawatir dengan hasil copynya karena proses copy dilakukan ketika Windows masih berjalan, jadi bisa saja ada file yang hilang jika filenya dibuat setelah selesai dicopy ke disk baru (contoh: saya melakukan screencap proses backupnya, tapi karena itu disimpan di drive yang dicopy, hasilnya jadi hilang).

Supaya yakin, saya melakukan scan disk pada SSD setelah booting, dan hasilnya: windows sempat restart berkali-kali dan ada pesan bahwa Windows telah beberapa kali gagal booting normal, apakah ingin masuk ke safe mode?. Saya menjawab agar meneruskan booting normal, dan puji Tuhan Windowsnya bisa boot normal.

Saya masih belum yakin dengan instalasi Windowsnya jadi saya menjalankan :

sfc /scannow

Sebagai administrator. Hasilnya: ada beberapa file corrupt yang berhasil dipulihkan. Karena belum 100% yakin, saya juga menjalankan:

DISM /Online /Cleanup-Image /ScanHealth

Dan ternyata tidak ada masalah. Sendainya ada masalah saya akan menjalankan: DISM /Online /RestoreHealth. Setelah itu saya melakuan restart, check semua disk sekali lagi, dan semua beres. Demikian catatan kali ini, semoga berguna juga untuk orang lain yang ingin memindahkan Windows ke SSD baru.

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.

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.

Membaca Buku Digital

Posting ini sekedar mengupdate bagaimana sekarang saya membaca buku elektronik. Tahun 2012 saya sudah mulai memakai Kindle dengan eink, dan mulai membeli konten dari Amazon. Sekarang sudah 7 tahun sejak Kindle pertama yang saya beli.

Kindle pertama sudah rusak (terinjak waktu menggendong Jonathan), lalu sudah beli lagi Kindle keyboard 3G dan Kindle paperwhite. Sekarang keduanya masih ada dan kadang masih dipakai untuk membaca jika ada cerita fiksi yang sedang saya sukai.

Kindle e-ink masih enak untuk membaca buku fiksi/non teknis yang tidak perlu dibaca acak. Untuk buku teknis yang harus bolak balik mengecek ke halaman lain, Kindle terasa sangat lambat dan layarnya kurang besar. Saya lebih suka membaca dengan kindle yang klasik, lebih terasa seperti kertas. Sayangnya yang klasik ini tidak bisa dibaca dalam gelap.

Selain masalah sifatnya yang seperti kertas, batere kindle cukup tahan lama. Asalkan kita tidak menyalakan fitur wirelessnya, baterenya masih cukup untuk beberapa minggu dengan pemakaian ringan (atau beberapa hari jika cukup berat). Dulu saya pikir kindle ini bakal jadi pegangan ketika liburan supaya tidak terlalu memikirkan batere, kenyataannya tetap saja saya lebih sering memegang HP.

Handphone memang lebih praktis karena selalu dibawa ke mana saja, sedangkan repot sekali membawa Kindle ke mana-mana jika tidak berniat secara khusus membaca sesuatu. Biasanya saya mulai dulu membeli dan membaca sebuah buku di HP, dan jika terasa menarik, saya download juga kontennya di kindle lalu saya teruskan baca di Kindle karena layar HP (yang sudah 6 inch) masih terasa terlalu kecil untuk membaca teks panjang.

Beberapa minggu terakhir ini saya memakai iPad untuk membaca dan sejauh ini cukup suka. iPad sangat cocok untuk membaca buku teknis, PDF readernya sangat cepat dan layarnya cukup besar untuk menampilkan semua informasi. Batere iPad juga cukup tahan lama dibandingkan HP.

Untuk konten, saya tetap membeli dari Amazon karena masih yang paling murah. Pernah saya menghabiskan pulsa Telkomsel hasil pentesting untuk membeli beberapa buku bahasa Indonesia dan pernah juga saya mendapatkan satu kupon dari Google Play Books dan membeli satu buku, tapi selain itu belum pernah membeli buku lain.

Sekarang saya juga sedang trial Scribd yang memiliki cukup banyak buku fiksi yang menarik (misalnya dari Stephen King, Agatha Christie dan Terry Pratchett) , tapi sayangnya belum punya cukup banyak waktu untuk membaca. Biasanya jika saya sudah mulai membaca cerita yang menarik jadi penasaran dan terus membaca, jadi kalau belum punya waktu sangat banyak, saya urungkan dulu membaca buku non teknis.

Konten teknis sekarang saya dapatkan dari Safari Books Online. Ini sangat praktis dan bisa diakses dari HP, web, dan juga dari iPad. Sesekali saya membeli juga buku dari humble bundle jika ada yang menarik (dan tidak ada di Safari Books). iPad juga memiliki fitur print to PDF, jadi berbagai blog teknis kadang saya save menjadi PDF untuk dibaca menggunakan software iBooks.

Seminggu terakhir ini saya juga mencoba menggunakan Apple Pencil untuk memberikan anotasi dan juga untuk mencatat. Sejauh ini Apple Pencil memang sangat nyaman dipakai, tapi saya belum optimal untuk tujuan utamanya: untuk membaca dan mencoret-coret berbagai paper.

Saya belum terbayang bagaimana saya akan membaca buku di masa depan. Mungkin di masa depan jika teknologi layar lipat sudah semakin murah dan bagus, sehingga tidak perlu lagi membawa-bawa tablet.

Tools untuk persoalan matematika

Sebenarnya tidak terlalu banyak persoalan matematika yang saya hadapi tiap hari, tapi jika ketemu biasanya saya akan menggunakan berbagai tool yang saya tahu. Untuk penjumlahan, perkalian biasa saya biasanya memakai Python karena sudah bisa langsung menangani big number.

Untuk persoalan tertentu, Wolfram Alpha di Raspberry Pi (versi gratis) atau Mathematica (desktop, saya tidak punya ini) bisa sangat membantu. Contohnya ketika ada yang mengirimkan teka-teki ini, saya memakai wolfram.

Terjemahan soalnya ke Wolfram sangat langsung

Beberapa kali saya juga menyelesaikan soal CTF dengan Wolfram, misalnya ini (persamaan linear), ini (persamaan modular) dan ini (visualisasi point 3d).

Ketika membaca buku murderous math, Jonathan sangat tertarik dengan bilangan prima. Beberapa kali dia bertanya apakah N bilangan prima? dia bahkan membuat daftar dengan metode Sieve of Erathosthenes, tapi karena tulisannya tidak rapi, kadang salah markingnya. Di command line Linux dari paket coreutils ada tool bernama factor. Ini bisa dipakai untuk memfaktorkan bilangan kecil

Magic Square, fungsi menghasilkan Magic Square ini tidak ada secara default di Wolfram, tapi saya tahu ini ada di Octave/Matlab.

Ada berbagai metode untuk menghaslikan magic square ini secara manual (misalnya staircase method). Berbagai contoh online juga ada, tapi jika ingin sekedar menunjukkan ke Jonathan Magic Square yang ditambah dengan konstanta N, memakai octave ini lebih gampang.

Dulu waktu SMU saya memakai software MathCad untuk komputasi simbolik matematika. Saya bisa menuliskan ekspresi matematika, dan melakukan diferensiasi/integrasi secara simbolik. Ini dulu sangat berguna untuk mengecek apakah “rumus cepat” dari bimbingan belajar memang benar dan apakah berlaku untuk semua kasus. Sekarang ada Wolfram Alpha yang bisa memberikan jawaban serupa (dan versi berbayar yang menyediakan langkah-langkahnya).

Seperti yang saya sebutkan di atas, persoalan matematika yang saya hadapi tidak banyak, jadi tool-tool yang saya pakai juga tidak banyak. Saya sekedar tahu permukaan berbagai tool tersebut, cukup untuk berbagai persoalan yang saya hadapi sehari-hari. Saya juga cukup senang tool-tool ini bisa dipakai untuk mengajari homeschool Jonathan.