Mengenal dan memakai instruksi SIMD

Instruksi SIMD (Single Instruction Multiple Data) adalah jenis instruksi pada prosesor modern yang bisa melakukan operasi terhadap banyak data sekaligus (biasanya bentuknya adalah array/vector). Instruksi assembly dalam sebuah ISA biasanya hanya melakukan hal dasar berikut:

  • Menyalin data dari memori/register ke memori/register
  • Melakukan operasi terhadap satu atau lebih register dan menyimpan hasilnya di memori atau register (contoh: penjumlahan, perkalian, operasi bit, dsb). Beberapa operasi akan mempengaruhi flag pada CPU.
  • Memindahkan alur eksekusi ke alamat tertentu dalam kondisi tertentu (biasanya berdasarkan flag)
  • Melakukan manipulasi hardware spesifik (misalnya mengakses I/O, enable interrupt, enable paging, dsb)

Instruksi SIMD bisa melakukan load/save register dari/ke memori, melakukan manipulasi pada register, tapi satu instruksi bisa memproses banyak data sekaligus. Jika dilakukan dengan benar, ini bisa mempercepat program cukup signifikan. Instruksi SIMD tidak bisa melakukan branching ke banyak alamat sekaligus.

Sejarah SIMD ini cukup panjang: singkatnya tahun 1970an sudah dipikirkan ide ini dan sudah diimplementasikan di berbagai komputer besar, tapi baru masuk ke CPU untuk consumer di akhir abad lalu. Data yang diproses semuanya perlu berurutan (seperti array) dan biasanya disebut sebagai vector (tidak berhubungan dengan istilah vektor di matematika).

Lanjutkan membaca Mengenal dan memakai instruksi SIMD

Mengenal algoritma kompresi Zstandard

Zstandard, atau lebih dikenal dengan nama implementasinya: zstd, adalah algoritma kompresi lossless yang sangat cepat dan fleksibel. Algoritma kompresi ini sudah disupport di banyak software, sampai sudah masuk di kernel Linux. Salah satu keunikan kompresi dengan zstandard adalah adanya fitur custom dictionary dan waktu kompresi dan dekompresi yang cepat. Kita bisa membuat custom dictionary untuk aplikasi kita sendiri. Bagian dictionary ini yang akan saya bahas lebih dalam pemanfaatnya di tulisan ini.

Lengkapnya bisa dilihat di: https://facebook.github.io/zstd/
Lanjutkan membaca Mengenal algoritma kompresi Zstandard

Membuat Telegram Bot memakai API ChatGPT di AWS Lambda

Saat ini OpenAI sudah meluncurkan API ChatGPT resmi. Di tulisan ini saya akan memandu bagaimana membuat ChatBot telegram dengan API ChatGPT, dan bagaimana menghosting ini di AWS Lambda. Dengan AWS Lamba, kita bisa menghosting bot telegram secara gratis (sampai setidaknya ratusan ribu pesan per bulan).

Untuk apa menghosting bot sendiri? bukankah sudah ada banyak yang menyediakan gratis di telegram dan WhatsApp? Apakah Anda pernah bertanya: siapa pemilik botnya? apa kebijakan privasi datanya? apakah chat Anda akan direkam selamanya? Sementara versi ChatGPT gratis sekarang sering down ketika dibutuhkan (atau error di tengah percakapan).

Saat ini OpenAI sudah menyatakan bahwa API ChatGPT tidak akan menggunakan data yang kita kirimkan untuk melatih sistem mereka, dan data akan dihapus dalam sebulan. Saya percaya OpenAI bukan karena mereka pasti bisa dipercaya, tapi karena jika mereka tidak patuh, bisa kena denda yang sangat besar. Dengan mengakses API ChatGPT langsung, saya yakin yang memegang data hanya saya dan OpenAI, bukan pihak lain.

Selain itu kita bisa meng-customize bot kita dengan kepribadian sesuai yang kita mau. Bahkan kita bisa membuat banyak bot dengan kepribadian masing-masing. Kita juga bisa menghubungkan output ChatGPT dengan program kita untuk melakukan aksi tertentu.

Contoh bot telegram

Sebelum API resmi diluncurkan, sudah ada yang berusaha membuat API ChatGPT dengan emulasi browser, tapi cara ini kurang stabil dan ChatGPT gratisan sering tidak tersedia (tidak reliable) dan kadang library perlu diupdate tiap kali ada perubahan di sisi OpenAI. Dengan API resmi, kita bisa mendapatkan jawaban dengan cepat dan API-nya tidak akan tiba-tiba berubah tanpa peringatan.

ChatGPT through the lens of The Dunning-Kruger effect

Harga API ChatGPT sangat murah, hanya 0.002 USD per 1000 token. Apa itu token? token adalah pembagian kata yang dilakukan untuk pemrosesan bahasa alami, untuk memahami token, mudahnya bisa langsung mencoba di URL ini. Untuk pemakaian pribadi, ratusan sampai ribuan pertanyaan bisa ditanyakan dengan biaya total puluhan ribu rupiah saja.

Memahami token dengan Tokenizer OpenAI
Lanjutkan membaca Membuat Telegram Bot memakai API ChatGPT di AWS Lambda

Kesan pertama memakai Rust

Bahasa Rust digadangkan sebagai bahasa untuk pemrograman sistem dengan performansi yang tinggi dan memiliki jaminan memory safety. Performansi yang tinggi ini didapatkan dengan menggunakan abstraksi yang tidak menambah overhead pada runtime (zero cost abstraction, bandingkan misalnya dengan PHP yang overheadnya sangat tinggi). Memory safety artinya bebas dari berbagai bug yang berhubungan dengan managemen memori (contoh bug memori yang umum: menimpa memori yang masih dipakai, tidak menginisialisasi memori, memakai pointer null, melakukan double free, dsb).

Logo Rust

Bahasa Rust mulai diumumkan ke publik pada 2010, dan baru masuk versi 1.0 pada 2015. Setelah itu masih ada banyak perubahan pada bahasa ini, saat artikel ini ditulis Rust versi stabil adalah 1.56. Dibandingkan banyak bahasa lain, Rust ini masih cukup muda, dan banyak hal masih belum stabil.

Saat ini saya belum memiliki proyek besar yang memakai Rust, tapi selama 25 hari terakhir saya menyelesaikan Advent Of Code (AoC) 2021 menggunakan Rust. Soal AoC ini sangat bervariasi, jadi bisa digunakan untuk menguji banyak fitur bahasa Rust. Kadang soalnya sangat sederhana, jadi bisa diselesaikan dengan cepat dan saya punya waktu mencoba-coba berbagai pendekatan untuk mencoba-coba fitur Rust tertentu.

Lanjutkan membaca Kesan pertama memakai Rust

Logging

Di tulisan ini saya ingin membahas mengenai kenapa kita butuh logging dalam aplikasi, dan bagaimana praktik terbaik untuk melakukan logging.

Kenapa butuh logging

Kita memerlukan log supaya tahu apa kesalahan yang mungkin terjadi ketika program berjalan. Meskipun program dirancang sempurna, tetap ada banyak hal kemungkinan error yang bisa terjadi ketika aplikasi berjalan. Error ini bisa karena banyak hal, tapi bisa dibagi menjadi dua yang utama:

  • karena masalah pada runtime environment (lingkungan eksekusi program), misalnya: disk space habis, jaringan putus, disk error, dsb
  • karena logika program yang salah, atau ada library yang memiliki bug tertentu

Sering kali kita tidak bisa mengakses sistem di mana software kita berjalan, jadi tidak bisa langsung menginspeksi masalahnya apa. Contoh kasusnya:

  • Pada aplikasi desktop/game yang berjalan di komputer client
  • Pada aplikasi server yang berjalan di sistem production

Log level

Mencatat semua aktivitas program di log akan membuang banyak CPU dan disk space. Jadi kita perlu memberi tag level ketika melakukan logging.

Sistem log yang baik dapat diset agar hanya log pada level tertentu yang disimpan atau ditampilkan. Tergantung kebutuhan, level log bisa diset saat aplikasi berjalan (runtime) jika ada masalah.

Lanjutkan membaca Logging

Assembler di browser berbasis Keystone dengan WebAssembly

Sebenarnya saat ini saya sedang sibuk dengan banyak hal, tapi karena sedang berduka, saya ingin melakukan sesuatu untuk mengalihkan pikiran. Bapak saya suka membongkar mobil untuk mengalihkan pikiran, sedangkan saya lebih suka memprogram sesuatu yang tidak berhubungan dengan pekerjaan. Hasilnya: hari ini saya mengkompilasi framework Keystone dengan target WebAssembly (Wasm) lalu memberi interface HTML dengan Preact (alternatif React yang ukurannya jauh lebih kecil).

Assembler ini bisa diakses online di https://asm.x32.dev dan sourcenya saya berikan di https://github.com/yohanes/online-assembler . Aplikasinya bisa diakses dengan semua browser modern (Safari, Chrome, Firefix, Edge), termasuk juga mobile browser (sudah ditest di iOS 13 dan Android 10).

WebAssembly (Wasam)

Supaya tidak bingung dengan penjelasan assembler dan webassembly, akan saya jelaskan apa itu WebAssembly (biasa disingkat dengan Wasm). WebAssembly adalah format instruksi biner untuk virtual machine (bisa dibayangkan seperti bytecode Java) . Saat ini target utamanya adalah web browser (saat ini sudah disupport di Firefox, Google Chrome, Safari dan Edge). Di masa depan web assembly ini dihrapkan akan bisa dipakai juga di aplikasi desktop maupun server.

Lanjutkan membaca Assembler di browser berbasis Keystone dengan WebAssembly

Mengenal Bahasa Pemrograman Lua

Di kesempatan kali ini saya akan memperkenalkan bahasa Lua. Bahasa ini sebenarnya sudah ada cukup lama (sejak 1993), tapi kurang terkenal secara umum. Lua lebih sering dijadikan bahasa scripting untuk aplikasi dan sering kali nama Lua tidak disebut sama sekali. Lua artinya “Bulan” (moon) dalam bahasa portugis. Lua diciptakan oleh Roberto Ierusalimschy, Luiz Henrique de Figueiredo, dan Waldemar Celes, anggota dari Computer Graphics Technology Group (Tecgraf) di Pontifical Catholic University of Rio de Janeiro, di Brazil.

Lua bisa dipakai untuk membuat program/aplikasi seperti bahasa lain, tapi kelebihan bahasa ini  adalah dari awal dirancang untuk diembed dalam sebuah aplikasi lain (terutama dalam bahasa sejenis C). Di-embed ini artinya bisa  bisa dipakai untuk sistem plugin atau bisa dipakai untuk mengontrol bagian business/game/app logic sementara bagian yang butuh performance tinggi memakai C atau bahasa lain. Lua juga bisa jadi file konfigurasi yang sangat fleksibel.

Lanjutkan membaca Mengenal Bahasa Pemrograman Lua

Dari keyboard ditekan sampai muncul karakter di layar (bagian 3)

Di bagian sebelumnya sudah dibahas mengenai bagaimana layout text harus dilakukan. Setelah semuanya selesai, maka teks bisa ditampilkan ke layar. Di level aplikasi biasanya kita hanya perlu memanggil semua fungsi dasar untuk menampilkan teks. Di sisi library dan sistem operasi, masih ada langkah ekstra yang harus dilakukan. Teks perlu digambar ke sebuah buffer dan buffer perlu ditampilkan di sebuah permukaan gambar. Driver grafik akan menampilkan buffer tersebut ke layar.

Untuk aplikasi desktop, proses menampilkan teks ini di sisi programmer semudah memanggil fungsi print (mode teks) atau mengeset property tertenty. Jika kita memprogram microcontroller atau embedded system, akan lebih terasa proses berat yang harus dilakukan ketika menampilkan sesuatu. Contoh paling sederhana adalah 7 segment display.

Programmer perlu menyala matikan tiap garis dalam 7 segment display untuk menampilkan angka tertentu.

Display saat ini biasanya menggunakan akses per piksel. Mungkin yang paling sederhana adalah 8×8 dot matrix. Di sini kita perlu mengontrol tiap titik untuk menampilkan huruf/angka/bentuk yang kita mau.

Lanjutkan membaca Dari keyboard ditekan sampai muncul karakter di layar (bagian 3)

Dari keyboard ditekan sampai muncul karakter di layar (bagian 2)

Meneruskan dari tulisan sebelumnya, sekarang kita ke bagian aplikasi. Pertama aplikasi perlu menerima “event” dari Desktop/Window environment. Event ini bermacam-macam, misalnya permintaan untuk meminimize Window, event gerakan mouse, dan event tombol keyboard ditekan.

Setelah tombol ditekan, maka aplikasi akan melakukan update pada struktur datanya. Sebagai pengingat, contoh aplikasi yang saya berikan ada Word Processor. Ini bergantung dari mode saat ini (apakah mode insert atau overwrite, apakah dokumen sifatnya read only dsb). Struktur data yang digunakan pun bisa sangat beragam, tergantung dari fitur yang dimiliki aplikasi.

Lanjutkan membaca Dari keyboard ditekan sampai muncul karakter di layar (bagian 2)

Dari keyboard ditekan sampai muncul karakter di layar (bagian 1)

Seri tulisan ini akan mencoba menjelaskan apa yang terjadi dari sejak kita menekan tombol di keyboard sampai muncul huruf di layar. Untuk mempersingkat, saya akan mengambil beberapa asumsi:

  • Keyboard ditekan di sebuah aplikasi yang terbuka (jadi sudah selesai booting)
  • Sistem operasi yang dipakai modern (bukan DOS, tapi Windows/Linux/OS X)
  • Aplikasi yang akan saya contohkan adalah sebuah word processor (supaya sederhana, rencananya saya akan menulis dari mengetik di address bar sampai muncul web page)

Keyboard

Ketika tombol di tekan di keyboard, sebuah saklar akan aktif. Ada banyak jenis saklar ini (bisa dibaca di wikipedia) tapi intinya sebuah sirkuit akan tertutup ketika tombol ditekan. Karena jumlah tombol ada banyak, maka digunakan sirkuit matriks pada keyboard untuk mengurangi jumlah koneksi.

Keyboard tidak tahu apa yang tertulis di atas sebuah tombol. Tombol pertama di keyboard QWERTY adalah huruf ‘Q’, tapi di keyboard AZERTY menjadi ‘A’.  Keyboard hanya akan mengirimkan kode sebuah tombol, nanti urusan setting di sistem operasi yang akan menginterpretasikan tombol itu menjadi suatu huruf tertentu.

Sebuah keyboard memiliki prosessor, sebuah chip khusus atau microcontroller yang akan melakukan scanning pada matrix keyboard. Di keyboard lama (PS/2), jika ada tombol ditekan maka akan mengirimkan sebuah interrupt ke PC. Di keyboard USB, PC akan melakukan polling (biasanya 150Hz), artinya dalam 1 detik komputer akan bertanya 150 kali pada keyboard: apakah ada tombol yang sedang ditekan?

Jika ingin mengenal bagian ini lebih dalam, kita bisa membeli Arduino, dan keypad matrix sederhana seperti dalam gambar berikut ini.

Lanjutkan membaca Dari keyboard ditekan sampai muncul karakter di layar (bagian 1)