Saturday, June 29, 2024

Belajar Entropy dan Aplikasinya pada Teori Informasi

Entropy yang dibahas ini bukan entropi pada termodinamika, melainkan pada teori informasi, meski secara konsep sama. Yakni, entropi adalah derajat ketidakturan, atau ketidakpastian.

Seperti biasa, proses belajar saya dokumentasikan dengan bantuan asciinema. Perangkat yang saya gunakan adalah scipy.stat.entropy, bisa juga dikodekan manual dengan Numpy. Materi pembelajaran saya kembangan dari manual Scipy.

Berikut dokumentasi pembelajaran saya untuk Entropy.


Keterangan:
Makna koin bias pada pembelajaran di atas adalah bahwa peluang gambar dan angka menjadi tidak 50:50, tetapi 90:10. Bisa jadi karena secara fisik berat sebelah ataupun sebab lain yang menjadikan peluang munculnya gambar jauh lebih besar dari peluang munculnya angka.

Saturday, June 22, 2024

Memahami Bash Return Value

Bash, salah satu Unix Shell yang paling banyak digunakan, merupakan salah satu (bahasa) pemrograman yang saya pakai selain Python. Fungsi Bash layaknya lem perekat, melekatkan program yang satu dengan yang lain, Python dengan C, Python dengan C++, dan yang paling sering, Python dengan Sistem Unix (Linux Kernel, OS, dl). Simpelnya, saya menulis program utama dengan Python dan memanggilnya dengan Bash. 

Ada salah satu konsep yang selama ini belum sepenuhnya saya pahami: return value. Kalau dalam Python return value sangat jelas, nilai yang dikembalikan dari fungsi tersebut. Dalam bash, maka nilai return value hanya ada dua: sukses atau gagal. Nilai return value tersebut bisa banyak, dari 0 sampai 255. Nilai 0 untuk sukses (perintah yang dieksekusi), nilai selainnya untuk gagal.

Kode bash di bawah ini mendemonstrasikan return value dalam bash. Tugasnya adalah mendeteksi nilai yang diberikan, saya masukkan dari 5 sampai 15. Jika nilainya lebih dari 10 maka sukses, jika kurang atau sama dengan 10 maka gagal ("failure").

#!/bin/bash
# bash_return_value_demo.sh

# set counter
failure_count=0
success_count=0

# Zero (0) return value as sign of success
success_function() {
    if [ $1 -gt 10 ]; then # greater than
        echo "Success!"
        success_count=$((success_count+1))
        return 0
    fi
}

# Non-zero (1-255) return value as sign of failure
failure_function() {
    if [ $1 -le 10 ]; then # less equal
        echo "Failure!"
        failure_count=$((failure_count+1))
        return 1
    fi
}

# loop from 5 to 15
for x in {5..15}; do
    # print the value of x
    echo "Value of x: $x"
    success_function $x 	# input x to success_function
    failure_function $x 	# input x to failure_function

    # Print the last return values via $?
    echo "Return value: $?"

done
# count the number of successful and failed commands
echo "Number of successful commands: $success_count"
echo "Number of failed commands: $failure_count"
Kode di atas sebenarnya self explanatory, bisa jelas sendiri per baris plus komentar di atas/sampingnya. Sederhananya, kita set counter di baris 7-8. Kemudian kita buat fungsi sukses dan gagal di baris 8 dan 17. Argument untuk fungsi di Bash di masukkan dalam fungsi yakni lewat $1 (untuk argumen pertama, $2 untuk argumen kedua dst). Kemudian buat loop untuk X mulai dari 5 sampai 15 (5..15), batas atas, 15, diproses juga, tidak seperti dalam bahasa Python. Di akhir skrip kita tampilkan jumlah perintah yang sukses dan gagal. Outputnya 5 untuk gagal, 6 untuk sukses, sesuai logika kode tersebut. Jika program di atas dijalankan (setelah disimpan dalam fail bash_return_value_demo.sh), maka hasilnya adalah sebagai berikut, sesuai dengan penjelasan di atas.
./bash_return_value_demo.sh
Value of x: 5
Failure!
Return value: 1
-----------------
Value of x: 6
Failure!
Return value: 1
-----------------
Value of x: 7
Failure!
Return value: 1
-----------------
Value of x: 8
Failure!
Return value: 1
-----------------
Value of x: 9
Failure!
Return value: 1
-----------------
Value of x: 10
Failure!
Return value: 1
-----------------
Value of x: 11
Success!
Return value: 0
-----------------
Value of x: 12
Success!
Return value: 0
-----------------
Value of x: 13
Success!
Return value: 0
-----------------
Value of x: 14
Success!
Return value: 0
-----------------
Value of x: 15
Success!
Return value: 0
-----------------
Number of successful commands: 5
Number of failed commands: 6

Thursday, June 20, 2024

Perangkat AI yang saya gunakan untuk riset (pengodean)

Beberapa perangkat berikut saya gunakan secara masif satu tahun terakhir ini untuk riset, yakni untuk pengodean (coding). Urutan perangkat AI di bawah ini saya susun berdasarkan prioritas, mana yang paling penting saya urutkan paling atas.


1. Cody.dev

Saya menggunakan cody.dev versi berbayar (USD 9/bulan). Perangkat ini sangat efektif untuk mencari bug, code completion, dan chat tentang kode-kode kita. Fitur utamanya, Cody bisa membaca codebase kita (sampai 15 file) dan menggunakan LLM, paling ampuh Claude 3 Opus, untuk menjelaskan, menyarankan, dan mengedit code secara otomatis. Selain versi VS Code-nya, saya juga menggunakan versi web-chat van search-nya di sourcegraph.com.


2. Github copilot

Perangkat ini adalah perangkat AI pertama yang saya gunakan dan sangat fungsional (meski kalah dari Cody). Saya menggunakan code completion dan chatnya (kadang-kadang). Perangkat ini secara intensif saya gunakan sebelum menggunakan Cody dengan bantuan email kampus untuk registrasi.


3. Cursor.sh

Cursor adalah fork dari vscode yang dikhususkan untuk AI. Fitur utamanya adalah copilot++ yang lebih handal dari Github Copilot dan juga bisa membaca codebase seperti Cody namun lebih pintar (lebih solutif dibanding Cody). Kelemahannya adalah biaya yang lebih mahal dan kuota terbatas LLM Claude 3 Opus (10 limit perhari untuk versi berbayarnya, 20 USD/bulan). Saya menggunakan versi gratisnya. Tips: untuk membuat alias "code" ke "cursor" untuk terminal Cursor, ikuti arahan di issue ini.


4. Deepseek Coder

DeepSeek Coder adalah LLM khusus untuk pengodean gratis dan opensource. Saya menggunakan versi webnya. DeepSeek Coder, jika tanpa codebase (hanya satu kasus saja), akan menghasilkan hasil terbaik sepengalaman saya (mengalahkan Claude Opus).


5. Ollama

Ollama adalah platform untuk menggunakan LLM secara offline. Perangkat ini sangat bermanfaat ketika tidak bisa koneksi internet. Kelemahannya, butuh spek komputer yang tinggi (RAM ideal minimal 16GB dan CPU/GPU modern).


Kehadiran LLM (large language model) spt GPT-4 membuat riset menjadi berbeda. Sebelum adanya LLM (large-language model, seperti ChatGPT, Claude Opus, dll), saya membagi waktu kerja saya menjadi 2, riset dan menulis (proses/hasil riset). Masing-masing porsinya 50:50. Setelah adanya LLM, porsinya berubah, menjadi sekitar 65:35. Lebih banyak risetnya ketimbang menulisnya. Kenapa? Karena masalah yang dulu banyak ditemui ketika riset bisa diselesaikan dengan bantuan  LLM (kebanyakan masalah algoritma, koding, percepatan waktu komputasi). Hasilnya, riset saya lebih produktif tapi tulisannya saya (pertahun) lebih sedikit. Semoga tahun depan bisa lebih banyak porsi untuk menulis kembali.

Wednesday, June 05, 2024

Rekomendasi direktori untuk penyimpanan data

Ketika bekerja dalam tim, atau dengan tim, tempat penyimpanan data menjadi masalah. Si A menyimpan data di "download", si B di "my document", dan si C di "Files". Untuk menyamakan tempat penyimpanan data di komputer, saya merekomendasikan hal berikut.

Komputer dengan satu harddisk (SSD/HDD)

Untuk komputer dengan satu hardisk, tempat penyimpanan data terbaik adalah di "home", atau "/home/$USER/data", dimana $USER adalah nama user, misal "bagus" (sehingga menjadi "/home/bagus/data"). Di Linux, kita hanya butuh mengetik "cd" untuk "pulang ke rumah". Untuk memanggil path "data", siapapun usernya, dalam python, kita bisa menggunakan Path dari pathlib berikut.

from pathlib import Path
data = Path.home() / "data"

Oya, di era sekarang ini, kita tidak perlu membuat partisi tersendiri untuk data. Beda dengan zaman saya kuliah dulu yang perlu mempartisi satu HDD menjadi beberapa drive agar ketika drive satu rusak, drive lainnya masih bisa digunakan.

Komputer dengan multi harddisk

Untuk komputer dengan multi harddisk, tempat penyimpanan data yang saya rekomendasikan adalah di root, yakni "/data". Siapapun usernya, pathnya pasti akan sama dalam hal ini.

Pro-kontra:

Kenapa satu harddisk di "home" dan multi-hardisk di "/data"? Sebetulnya "/data" lebih universal karena tidak bergantung "User", namun karena lokasinya di "/" (root), menurut saya hal ini rentan masalah. Misalnya jika sistem korup atau clash, biasanya data di bawah root akan terkena juga. Alasan kedua karena sekuriti/akses terhadap root. Home bisanya lebih terisolasi.

Related Posts Plugin for WordPress, Blogger...