Category: Tutorial

  • Belajar Database dari Nol #1: Kenalan & Install MySQL 8.4

    Belajar Database dari Nol #1: Kenalan & Install MySQL 8.4

    Cara install MySQL 8.4 sebenarnya sederhana: di Windows pakai installer MSI resmi, di Ubuntu pakai repositori APT dari MySQL, di macOS pakai Homebrew. Setelah terpasang, kamu login lewat terminal dengan mysql -u root -p lalu cek versinya dengan SELECT VERSION();. Artikel ini memandu ketiganya langkah demi langkah, plus solusi untuk error yang paling sering muncul di instalasi pertama.

    Ini bagian pertama dari seri Belajar Database dari Nol, seri tutorial 26 bagian yang membawa kamu dari nol sampai bisa mendesain dan mengelola database sendiri. Kita pakai MySQL 8.4 karena statusnya LTS (Long Term Support), didukung sampai tahun 2032, dan paling banyak dipakai di industri. Sebelum praktik, kita luruskan dulu satu hal: apa sebenarnya database itu.

    Apa Itu Database dan Kenapa Aplikasi Membutuhkannya

    Database adalah kumpulan data yang disimpan secara terstruktur supaya mudah dicari, diubah, dan dijaga konsistensinya. Aplikasi yang mengelola database itu disebut DBMS, singkatan dari Database Management System. MySQL adalah salah satu DBMS. Jadi kalau ada yang bilang “databasenya MySQL”, maksudnya data mereka dikelola oleh software MySQL.

    Pertanyaan yang wajar dari pemula: kenapa tidak pakai Excel atau file teks saja? Untuk data pribadi yang diakses satu orang, Excel memang cukup. Masalah muncul saat data dipakai aplikasi:

    • Akses bersamaan. Ratusan pengguna bisa menulis data di detik yang sama. File Excel akan korup atau saling menimpa. DBMS mengatur antrean ini secara otomatis.
    • Kecepatan pencarian. Mencari satu baris di antara jutaan baris di file teks berarti membaca seluruh file. DBMS punya index sehingga pencarian tetap cepat walau datanya jutaan baris.
    • Konsistensi. Saat transfer saldo gagal di tengah jalan, DBMS bisa membatalkan seluruh operasi supaya uang tidak hilang sebagian. File biasa tidak punya mekanisme ini.
    • Aturan data. DBMS bisa memaksa kolom email selalu terisi atau stok tidak boleh minus. Di Excel, aturan seperti ini gampang dilanggar.

    Di Arrazy, hampir semua sistem aplikasi yang kami bangun untuk klien memakai database relasional seperti MySQL atau PostgreSQL di belakangnya, dari sistem inventaris gudang sampai backend API. Skill database adalah fondasi yang akan terus kamu pakai selama berkarier di dunia software.

    Persiapan Sebelum Install MySQL 8.4

    Yang kamu butuhkan hanya komputer dengan salah satu sistem operasi berikut, koneksi internet, dan ruang disk sekitar 2 GB:

    Sistem Operasi Metode Install Sumber
    Windows 10/11 Installer MSI dev.mysql.com/downloads
    Ubuntu 22.04/24.04 Repositori APT MySQL dev.mysql.com/downloads/repo/apt
    macOS (Apple Silicon/Intel) Homebrew brew.sh

    Satu catatan penting: selama proses install kamu akan diminta membuat password untuk user root. Catat password ini baik-baik. Sebagian besar masalah login di kemudian hari berawal dari password root yang lupa.

    Cara Install MySQL 8.4 di Windows

    Mulai versi 8.1, MySQL di Windows tidak lagi memakai aplikasi “MySQL Installer” yang lama. Sekarang instalasinya lewat paket MSI langsung, lalu konfigurasi lewat MySQL Configurator.

    1. Buka https://dev.mysql.com/downloads/mysql/, pilih versi 8.4.x LTS, lalu unduh Windows (x86, 64-bit), MSI Installer yang ukurannya besar (bukan yang web installer). Kamu boleh klik “No thanks, just start my download” tanpa login Oracle.
    2. Jalankan file mysql-8.4.x-winx64.msi, pilih tipe instalasi Typical, lalu selesaikan wizard-nya.
    3. Di akhir instalasi, centang opsi untuk menjalankan MySQL Configurator. Di sinilah kamu mengatur MySQL sebagai Windows Service, membiarkan port default 3306, dan membuat password root.
    4. Selesaikan Configurator sampai semua langkah bertanda hijau.

    Supaya perintah mysql bisa dipanggil dari terminal mana saja, tambahkan folder C:\Program Files\MySQL\MySQL Server 8.4\bin ke environment variable Path. Caranya: cari “Edit the system environment variables” di Start Menu, klik Environment Variables, pilih Path, klik Edit, lalu New dan tempel path tadi. Buka Command Prompt baru dan cek:

    mysql --version

    Output yang diharapkan kurang lebih seperti ini (versi minor bisa berbeda):

    mysql  Ver 8.4.5 for Win64 on x86_64 (MySQL Community Server - GPL)

    Cara Install MySQL 8.4 di Ubuntu dan Linux Lain

    Repositori bawaan Ubuntu 22.04 dan 24.04 masih menyediakan MySQL 8.0. Untuk mendapatkan 8.4 LTS, tambahkan dulu repositori APT resmi dari MySQL. Cek versi paket mysql-apt-config terbaru di https://dev.mysql.com/downloads/repo/apt/, lalu jalankan:

    wget https://dev.mysql.com/get/mysql-apt-config_0.8.34-1_all.deb
    sudo dpkg -i mysql-apt-config_0.8.34-1_all.deb

    Akan muncul layar konfigurasi berwarna ungu. Pilih MySQL Server & Cluster, ganti ke mysql-8.4-lts, lalu pilih Ok. Setelah itu install servernya:

    sudo apt update
    sudo apt install mysql-server

    Saat instalasi kamu akan diminta membuat password root. Isi dan catat. Kalau kolomnya kamu kosongkan, MySQL akan memakai mode autentikasi auth_socket, artinya login root hanya bisa lewat sudo mysql. Setelah selesai, pastikan service-nya jalan:

    sudo systemctl status mysql

    Cari baris ini di output:

    Active: active (running)

    Kalau statusnya inactive, nyalakan dengan sudo systemctl start mysql dan aktifkan autostart dengan sudo systemctl enable mysql. Langkah opsional tapi disarankan, jalankan sudo mysql_secure_installation untuk menghapus user anonim dan database test bawaan.

    Cara Install MySQL 8.4 di macOS

    Cara paling praktis di macOS adalah lewat Homebrew. Kalau belum punya Homebrew, install dulu dari https://brew.sh. Lalu jalankan:

    brew install mysql@8.4
    brew services start mysql@8.4

    Formula mysql@8.4 bersifat keg-only, artinya tidak otomatis masuk ke PATH. Tambahkan manual (contoh untuk Mac Apple Silicon dengan zsh):

    echo 'export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"' >> ~/.zshrc
    source ~/.zshrc

    Untuk Mac Intel, ganti /opt/homebrew dengan /usr/local. Instalasi lewat Homebrew membuat user root tanpa password. Rapikan dengan menjalankan mysql_secure_installation dan set password root di sana. Alternatif lain kalau tidak mau pakai Homebrew: unduh installer DMG dari https://dev.mysql.com/downloads/mysql/ dan ikuti wizard-nya, mirip proses di Windows.

    Login Pertama Lewat Terminal dan Verifikasi Instalasi

    Apa pun sistem operasinya, momen kebenarannya sama. Buka terminal (Command Prompt atau PowerShell di Windows) dan jalankan:

    mysql -u root -p

    Arti perintahnya: masuk ke MySQL sebagai user root (-u root) dan minta prompt password (-p). Ketik password yang kamu buat saat instalasi. Password tidak akan terlihat saat diketik, itu normal. Kalau berhasil, kamu akan disambut prompt MySQL:

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 8.4.5 MySQL Community Server - GPL
    
    mysql>

    Sekarang jalankan query pertamamu. Jangan lupa titik koma di akhir:

    SELECT VERSION();

    Outputnya:

    +-----------+
    | VERSION() |
    +-----------+
    | 8.4.5     |
    +-----------+
    1 row in set (0.00 sec)

    Kalau angka yang muncul diawali 8.4, instalasimu sukses. Ketik exit untuk keluar dari prompt MySQL. Selamat, kamu resmi punya server database sendiri.

    Error Umum Saat Install MySQL dan Solusinya

    Tiga error di bawah ini adalah yang paling sering kami temui saat mendampingi pemula maupun saat menyiapkan server klien. Cek satu per satu sebelum panik.

    ERROR 1045: Access denied for user ‘root’@’localhost’

    Penyebab paling umum: password salah, atau di Ubuntu kamu mengosongkan password saat install sehingga root memakai auth_socket. Coba dulu login lewat sudo:

    sudo mysql

    Kalau berhasil masuk, set password root dari dalam prompt MySQL supaya selanjutnya bisa login normal:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'PasswordBaruKamu123';
    FLUSH PRIVILEGES;

    Ganti PasswordBaruKamu123 dengan password pilihanmu. Kalau password benar-benar lupa dan sudo mysql juga ditolak, jalan keluarnya adalah menjalankan server dengan opsi --skip-grant-tables lalu reset password, prosedurnya ada di dokumentasi resmi bagian “How to Reset the Root Password”.

    ERROR 2002: Can’t connect to local MySQL server (service tidak jalan)

    Error ini artinya client tidak menemukan server yang hidup. Di Linux dan macOS cek dengan sudo systemctl status mysql atau brew services list, lalu nyalakan dengan sudo systemctl start mysql atau brew services start mysql@8.4. Di Windows, tekan Win + R, ketik services.msc, cari service bernama MySQL84, klik kanan lalu Start. Kalau service menolak jalan, baca log error di /var/log/mysql/error.log (Ubuntu) atau folder data MySQL di Windows, biasanya penyebab pastinya tertulis di baris terakhir.

    Port 3306 sudah dipakai program lain

    MySQL default berjalan di port 3306. Kalau di komputermu pernah terpasang XAMPP, Laragon, MariaDB, atau MySQL versi lain, port ini bisa bentrok dan service baru gagal start. Cek siapa yang memakai port itu:

    # Linux / macOS
    sudo lsof -i :3306
    
    # Windows (PowerShell)
    netstat -ano | findstr :3306

    Solusinya pilih salah satu: matikan program lama yang menempati port itu (misalnya stop MySQL bawaan XAMPP), uninstall MySQL/MariaDB lama yang sudah tidak dipakai, atau ubah port MySQL 8.4 lewat file konfigurasi (my.ini di Windows, /etc/mysql/mysql.conf.d/mysqld.cnf di Ubuntu) dengan mengganti nilai port=3306 lalu restart service. Untuk mengikuti seri ini, cara paling bersih adalah satu MySQL saja di port default.

    Menyiapkan MySQL Client dan GUI Opsional

    Sepanjang seri ini kita akan bekerja terutama lewat mysql client di terminal, program yang barusan kamu pakai untuk login. Alasannya sederhana: semua perintah SQL yang kamu ketik manual akan menempel lebih lama di ingatan, dan di server production nanti sering kali terminal adalah satu-satunya akses yang tersedia.

    Meski begitu, GUI boleh dipakai sebagai pendamping. Beberapa pilihan yang umum:

    • MySQL Workbench, GUI resmi dari MySQL, gratis, tersedia untuk Windows, Linux, dan macOS. Unduh di https://dev.mysql.com/downloads/workbench/. Saat membuat koneksi baru, isi host 127.0.0.1, port 3306, user root, dan password yang tadi kamu buat.
    • DBeaver Community, gratis dan mendukung banyak DBMS sekaligus, berguna nanti saat kita menyentuh PostgreSQL di bagian 24.
    • phpMyAdmin, berbasis web, sering ditemui di shared hosting.

    Saran kami untuk pemula: install MySQL Workbench sebagai alat bantu melihat isi tabel, tapi tetap kerjakan latihan di terminal. Kombinasi ini yang paling cepat membangun pemahaman.

    Rangkuman dan Bagian Berikutnya

    Hari ini kamu sudah paham beda database, DBMS, dan alasan aplikasi tidak cukup pakai Excel. Kamu juga sudah praktik cara install MySQL 8.4 LTS di sistem operasimu, login pertama dengan mysql -u root -p, memverifikasi instalasi lewat SELECT VERSION();, dan tahu cara keluar dari tiga error paling umum.

    Di bagian berikutnya, “Belajar Database dari Nol #2: Konsep Database Relasional”, kita bahas cara MySQL menyusun data dalam tabel, baris, kolom, dan primary key, fondasi berpikir sebelum menulis SQL lebih jauh. Artikelnya terbit menyusul dan bisa kamu pantau di halaman hub seri Belajar Database. Sampai jumpa di bagian dua.

    Referensi

  • Belajar Golang dari Nol #4: Struct dan Method, Cara Go Menyusun Data

    Belajar Golang dari Nol #4: Struct dan Method, Cara Go Menyusun Data

    Di Belajar Golang dari Nol #3 kita sudah belajar membungkus logika ke dalam function, mengembalikan lebih dari satu nilai, dan menangani error pertama kita. Sekarang saatnya naik satu tingkat. Kalau function adalah cara Go menyusun logika, maka struct adalah cara Go menyusun data. Di bagian ini kita akan kenalan dengan struct, method, dan pola constructor yang dipakai hampir di semua project Go sungguhan.

    Kenapa Kita Butuh Struct

    Bayangkan kamu bikin program kasir sederhana. Satu produk punya nama, harga, dan stok. Kalau cuma pakai variabel biasa, kodenya jadi seperti ini.

    var namaProduk string = "Kopi Arabika"
    var hargaProduk int = 25000
    var stokProduk int = 10

    Untuk satu produk masih aman. Tapi begitu ada produk kedua, kamu harus bikin namaProduk2, hargaProduk2, stokProduk2. Produk ketiga, tambah lagi. Datanya tercerai berai, padahal ketiganya jelas satu paket. Nama, harga, dan stok itu milik produk yang sama.

    Struct menyelesaikan masalah ini. Anggap saja struct itu seperti formulir. Formulir pendaftaran punya kolom nama, alamat, dan nomor telepon. Kolomnya sudah ditentukan dari awal. Setiap orang yang mendaftar mengisi formulir yang sama, tapi isinya beda. Struct persis begitu. Kamu mendefinisikan kolomnya sekali, lalu bisa membuat banyak isian dari cetakan yang sama.

    Deklarasi Struct dan Cara Membuat Instance

    Mendefinisikan struct di Go pakai kata kunci type dan struct. Kolomnya disebut field. Setiap field punya nama dan tipe data.

    package main
    
    import "fmt"
    
    type Produk struct {
    	Nama  string
    	Harga int
    	Stok  int
    }
    
    func main() {
    	kopi := Produk{
    		Nama:  "Kopi Arabika",
    		Harga: 25000,
    		Stok:  10,
    	}
    
    	fmt.Println(kopi.Nama)
    	fmt.Println(kopi.Harga)
    
    	kopi.Stok = 15
    	fmt.Println(kopi.Stok)
    }

    Beberapa hal yang perlu kamu perhatikan dari kode di atas.

    • type Produk struct hanya mendefinisikan cetakannya. Belum ada data apa pun di sini.
    • kopi := Produk{...} membuat isian nyata dari cetakan itu. Ini yang disebut instance.
    • Saat mengisi, kita menulis nama field-nya secara eksplisit, seperti Nama: "Kopi Arabika". Ini cara yang paling aman dan paling mudah dibaca. Biasakan pakai gaya ini.
    • Membaca dan mengubah field pakai tanda titik. kopi.Nama untuk membaca, kopi.Stok = 15 untuk mengubah.

    Satu catatan yang nyambung ke materi bagian 2 soal zero value. Kalau kamu menulis var kosong Produk tanpa mengisi apa pun, setiap field otomatis berisi zero value tipenya, jadi Nama berisi string kosong dan Harga serta Stok berisi nol.

    Struct di Dalam Struct

    Field sebuah struct tidak harus tipe dasar. Dia boleh berupa struct lain. Ini berguna waktu datamu memang bertingkat. Contohnya data pelanggan yang punya alamat.

    type Alamat struct {
    	Jalan string
    	Kota  string
    }
    
    type Pelanggan struct {
    	Nama   string
    	Alamat Alamat
    }
    
    func main() {
    	budi := Pelanggan{
    		Nama: "Budi",
    		Alamat: Alamat{
    			Jalan: "Jl. Merdeka No. 10",
    			Kota:  "Purwokerto",
    		},
    	}
    
    	fmt.Println(budi.Alamat.Kota)
    }

    Cara aksesnya tinggal dirantai pakai titik. budi.Alamat.Kota artinya ambil field Alamat milik budi, lalu ambil field Kota di dalamnya. Sederhana, tapi pola ini yang nanti kamu pakai untuk memodelkan data dunia nyata seperti pesanan yang punya pelanggan, pelanggan yang punya alamat.

    Method: Function yang Menempel di Struct

    Sejauh ini struct kita cuma tempat menyimpan data. Padahal data biasanya punya perilaku. Produk bisa dihitung harga diskonnya. Di bagian 3 kamu sudah bisa menulis function seperti ini.

    func HitungDiskon(p Produk, persen int) int {
    	potongan := p.Harga * persen / 100
    	return p.Harga - potongan
    }

    Kode itu jalan. Tapi Go punya cara yang lebih rapi, namanya method. Method adalah function biasa yang diberi satu tambahan di depan namanya, disebut receiver. Receiver menentukan struct mana yang memiliki method itu.

    func (p Produk) HitungDiskon(persen int) int {
    	potongan := p.Harga * persen / 100
    	return p.Harga - potongan
    }

    Perhatikan bagian (p Produk) sebelum nama function. Itulah receiver. Artinya, method HitungDiskon milik struct Produk, dan di dalam method kita bisa mengakses datanya lewat p.

    Cara memanggilnya juga berubah. Dari HitungDiskon(kopi, 10) menjadi kopi.HitungDiskon(10). Bedanya terasa waktu kode mulai besar. Dengan method, kamu bertanya ke datanya langsung. Ketik kopi. di editor, dan semua kemampuan produk muncul sebagai saran. Data dan perilakunya jadi satu paket, tidak berserakan sebagai function lepas.

    Pointer Receiver vs Value Receiver

    Sekarang bagian yang paling sering bikin pemula bingung. Tenang, kita bahas pelan pakai contoh. Coba tebak output kode ini.

    func (p Produk) TambahStokSalah(jumlah int) {
    	p.Stok = p.Stok + jumlah
    }
    
    func (p *Produk) TambahStokBenar(jumlah int) {
    	p.Stok = p.Stok + jumlah
    }
    
    func main() {
    	kopi := Produk{Nama: "Kopi Arabika", Harga: 25000, Stok: 10}
    
    	kopi.TambahStokSalah(5)
    	fmt.Println(kopi.Stok)
    
    	kopi.TambahStokBenar(5)
    	fmt.Println(kopi.Stok)
    }

    Outputnya:

    10
    15

    Panggilan pertama tidak mengubah apa pun. Kenapa bisa begitu. Receiver (p Produk) disebut value receiver. Saat method dipanggil, Go membuat salinan dari kopi, lalu method bekerja pada salinan itu. Stok salinannya memang bertambah, tapi begitu method selesai, salinan itu dibuang. kopi yang asli tidak tersentuh.

    Receiver (p *Produk) dengan tanda bintang disebut pointer receiver. Method tidak menerima salinan, tapi semacam alamat yang menunjuk ke kopi yang asli. Jadi perubahan stoknya benar-benar nempel.

    Kamu belum perlu paham teori pointer secara mendalam sekarang. Pointer akan kita bahas khusus di bagian mendatang. Untuk saat ini, pegang satu aturan praktis ini saja.

    • Method mau mengubah data di struct: pakai pointer receiver, (p *Produk).
    • Method cuma membaca data, seperti menghitung atau menampilkan: value receiver, (p Produk), sudah cukup.

    Kalau masih ragu, banyak programmer Go memilih pointer receiver untuk semua method di satu struct supaya konsisten. Itu juga pilihan yang wajar.

    Constructor Pattern ala Go

    Ada satu masalah kecil yang belum kita selesaikan. Tidak ada yang melarang orang membuat produk dengan data ngawur, misalnya Produk{Nama: "", Harga: -5000}. Go tidak punya constructor bawaan seperti bahasa lain. Sebagai gantinya, komunitas Go punya kebiasaan: buat function biasa dengan awalan New yang tugasnya membuat struct sekaligus memvalidasi isinya.

    Di sinilah materi error dari bagian 3 kepakai lagi. Constructor mengembalikan dua nilai, struct dan error.

    func NewProduk(nama string, harga int, stok int) (Produk, error) {
    	if nama == "" {
    		return Produk{}, errors.New("nama produk tidak boleh kosong")
    	}
    	if harga <= 0 {
    		return Produk{}, errors.New("harga harus lebih dari nol")
    	}
    	return Produk{Nama: nama, Harga: harga, Stok: stok}, nil
    }

    Kalau data valid, kita kembalikan struct yang sudah terisi dan error nil. Kalau tidak valid, kita kembalikan struct kosong plus error yang menjelaskan masalahnya. Pemanggilnya wajib mengecek error dulu sebelum memakai struct-nya, persis pola if err != nil yang sudah kamu latih di bagian 3. Dengan pola ini, semua produk yang lolos dari NewProduk dijamin datanya masuk akal.

    Latihan: Sistem Stok Mini

    Sekarang kita gabungkan semuanya. Struct, method dengan pointer receiver, constructor dengan validasi, dan error. Kita bikin sistem stok mini untuk satu produk. Ketik ulang program ini, jangan copas, supaya tanganmu ikut hafal.

    package main
    
    import (
    	"errors"
    	"fmt"
    )
    
    type Produk struct {
    	Nama  string
    	Harga int
    	Stok  int
    }
    
    func NewProduk(nama string, harga int, stok int) (Produk, error) {
    	if nama == "" {
    		return Produk{}, errors.New("nama produk tidak boleh kosong")
    	}
    	if harga <= 0 {
    		return Produk{}, errors.New("harga harus lebih dari nol")
    	}
    	if stok < 0 {
    		return Produk{}, errors.New("stok awal tidak boleh negatif")
    	}
    	return Produk{Nama: nama, Harga: harga, Stok: stok}, nil
    }
    
    func (p *Produk) TambahStok(jumlah int) error {
    	if jumlah <= 0 {
    		return errors.New("jumlah tambahan harus lebih dari nol")
    	}
    	p.Stok = p.Stok + jumlah
    	return nil
    }
    
    func (p *Produk) KurangiStok(jumlah int) error {
    	if jumlah <= 0 {
    		return errors.New("jumlah pengurangan harus lebih dari nol")
    	}
    	if jumlah > p.Stok {
    		return fmt.Errorf("stok tidak cukup: sisa %d, diminta %d", p.Stok, jumlah)
    	}
    	p.Stok = p.Stok - jumlah
    	return nil
    }
    
    func (p Produk) Info() string {
    	return fmt.Sprintf("%s | harga %d | stok %d", p.Nama, p.Harga, p.Stok)
    }
    
    func main() {
    	kopi, err := NewProduk("Kopi Arabika", 25000, 10)
    	if err != nil {
    		fmt.Println("gagal membuat produk:", err)
    		return
    	}
    	fmt.Println(kopi.Info())
    
    	err = kopi.TambahStok(5)
    	if err != nil {
    		fmt.Println("gagal tambah stok:", err)
    	}
    	fmt.Println(kopi.Info())
    
    	err = kopi.KurangiStok(8)
    	if err != nil {
    		fmt.Println("gagal kurangi stok:", err)
    	}
    	fmt.Println(kopi.Info())
    
    	err = kopi.KurangiStok(100)
    	if err != nil {
    		fmt.Println("gagal kurangi stok:", err)
    	}
    	fmt.Println(kopi.Info())
    
    	_, err = NewProduk("", 25000, 10)
    	if err != nil {
    		fmt.Println("gagal membuat produk:", err)
    	}
    }

    Jalankan dengan go run main.go. Outputnya seperti ini.

    Kopi Arabika | harga 25000 | stok 10
    Kopi Arabika | harga 25000 | stok 15
    Kopi Arabika | harga 25000 | stok 7
    gagal kurangi stok: stok tidak cukup: sisa 7, diminta 100
    Kopi Arabika | harga 25000 | stok 7
    gagal membuat produk: nama produk tidak boleh kosong

    Baca outputnya baris per baris dan cocokkan dengan kodenya.

    • Stok awal 10, tambah 5 jadi 15, kurangi 8 jadi 7. Method TambahStok dan KurangiStok pakai pointer receiver, jadi perubahannya nempel.
    • Waktu kita minta 100 padahal sisa 7, method menolak dan mengembalikan error. Perhatikan baris setelahnya: stok tetap 7, tidak berubah jadi minus.
    • Percobaan membuat produk tanpa nama juga ditolak oleh NewProduk. Data yang tidak valid tidak pernah sempat jadi struct yang dipakai program.

    Sebagai latihan tambahan, coba tambahkan method HitungDiskon dari bab sebelumnya ke program ini. Lalu coba tambahkan field Kategori ke struct Produk dan lihat bagian mana saja yang perlu kamu sesuaikan.

    Rangkuman dan Bagian Selanjutnya

    Hari ini kamu sudah pegang fondasi penting Go.

    • Struct mengelompokkan data yang berhubungan ke satu tempat, seperti formulir dengan kolom yang sudah ditentukan.
    • Field diakses dan diubah pakai tanda titik, dan struct bisa berisi struct lain.
    • Method adalah function dengan receiver, sehingga data dan perilakunya jadi satu paket.
    • Mau mengubah data, pakai pointer receiver. Cuma membaca, value receiver cukup.
    • Constructor NewProduk memastikan struct selalu lahir dengan data yang valid.

    Pola yang barusan kamu tulis ini bukan sekadar latihan. Struct dengan method dan validasi seperti ini juga fondasi yang kami pakai saat membangun sistem aplikasi berbasis Go untuk klien.

    Di bagian 5 kita akan bahas Slice dan Map: Kumpulan Data di Go. Di sana sistem stok mini ini akan naik kelas, dari satu produk menjadi daftar banyak produk. Sampai ketemu di bagian berikutnya.

  • Apa Itu Docker dan Cara Install Docker di Ubuntu & Windows

    Apa Itu Docker dan Cara Install Docker di Ubuntu & Windows

    Docker adalah platform untuk mengemas aplikasi beserta semua dependensinya ke dalam satu paket yang disebut container. Container ini bisa jalan di mana saja dengan perilaku yang sama persis: di laptop kamu, di laptop teman satu tim, sampai di server produksi. Artikel ini adalah bagian pertama dari seri Belajar Docker dari Nol. Kita mulai dari dua hal paling dasar: paham kenapa Docker ada, lalu praktik cara install Docker di Ubuntu dan Windows sampai benar-benar bisa dipakai.

    Ringkasnya begini. Di Ubuntu, Docker Engine versi 27.x diinstall lewat repositori resmi apt dari download.docker.com. Di Windows, kamu install Docker Desktop yang berjalan di atas WSL2. Setelah terpasang, verifikasi dengan docker run hello-world. Detail tiap langkah kita bahas di bawah, termasuk error yang paling sering bikin pemula nyangkut.

    Masalah Klasik “Di Laptop Saya Jalan Kok”

    Hampir semua developer pernah mengalami ini. Aplikasi jalan mulus di laptop, begitu dideploy ke server langsung error. Penyebabnya macam-macam. Versi PHP di server beda dengan di laptop. Ekstensi yang dibutuhkan belum terpasang. Versi Node atau Go tidak sama. Library sistem yang di laptop ada, di server tidak ada.

    Cara deploy manual di VPS memperbesar peluang masalah ini. Alurnya biasanya begini: sewa VPS, SSH masuk, install runtime satu per satu, install database, atur konfigurasi, baru upload kode. Setiap langkah dikerjakan tangan, dan setiap server bisa berakhir dengan kondisi yang sedikit berbeda. Server seperti ini sering disebut snowflake server, tidak ada dua yang benar-benar identik. Saat aplikasi harus pindah server atau tim bertambah orang, proses setup harus diulang dari nol dan hasilnya belum tentu sama.

    Container lahir untuk memotong masalah itu. Aplikasi, runtime, library, dan konfigurasi dikemas jadi satu unit bernama image. Dari image itu kamu menjalankan container, dan container tersebut membawa lingkungannya sendiri ke mana pun dia jalan. Kalau container jalan di laptop, dia akan jalan dengan cara yang sama di server. Beda dengan virtual machine, container tidak membawa sistem operasi utuh. Container berbagi kernel dengan host, jadi ukurannya jauh lebih kecil dan startup-nya hitungan detik, bukan menit.

    Di tim Arrazy, hampir semua proyek klien berjalan di atas Docker, dari backend Go, aplikasi Laravel, sampai database di server klien. Alasannya sederhana: environment developer dan server produksi jadi seragam, dan onboarding anggota tim baru cukup dengan satu perintah, bukan setengah hari install dependensi. Pola yang sama juga kami pakai saat membangun sistem aplikasi untuk klien yang servernya kami kelola.

    Prasyarat: Nyaman di Terminal Dulu

    Seri ini banyak bermain di terminal. Kamu tidak perlu jago, tapi minimal paham perintah dasar seperti cd, ls, sudo, dan cara SSH ke server. Kalau bagian itu masih asing, selesaikan dulu bagian dasar shell dan SSH di seri Belajar Linux dari Nol, baru lanjut ke sini. Percaya deh, belajar Docker tanpa dasar terminal itu seperti belajar nyetir sambil belajar baca rambu.

    Kebutuhan sistemnya:

    • Ubuntu: versi 22.04 (Jammy) atau 24.04 (Noble), arsitektur 64-bit. VPS atau laptop sama saja.
    • Windows: Windows 10 64-bit versi 22H2 ke atas atau Windows 11, dengan fitur virtualisasi aktif di BIOS. RAM 8 GB sangat disarankan.

    Cara Install Docker di Ubuntu Lewat Repo Resmi apt

    Ubuntu punya paket docker.io di repo bawaan, tapi versinya sering tertinggal. Kita pakai repo resmi Docker supaya dapat Docker Engine 27.x yang terbaru beserta plugin Compose dan Buildx.

    1. Bersihkan Paket Lama dan Siapkan Dependensi

    Kalau sebelumnya pernah coba-coba install Docker dari repo bawaan, hapus dulu supaya tidak bentrok:

    for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

    Kalau paketnya memang tidak ada, apt hanya bilang paket tidak terpasang. Aman, lanjut saja. Lalu update index dan install alat bantu:

    sudo apt-get update
    sudo apt-get install ca-certificates curl

    2. Tambahkan GPG Key dan Repositori Docker

    GPG key dipakai apt untuk memastikan paket yang diunduh benar-benar dari Docker, bukan dari pihak lain:

    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc

    Lalu daftarkan repositorinya:

    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update

    Perintah di atas otomatis mendeteksi arsitektur dan kode nama Ubuntu kamu, jadi bisa dicopy apa adanya.

    3. Install Docker Engine dan Plugin-nya

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    Lima paket itu isinya: daemon Docker (docker-ce), perintah docker di terminal (docker-ce-cli), runtime container (containerd.io), plus plugin build dan Compose yang akan kita pakai di bagian-bagian berikutnya seri ini. Setelah selesai, service Docker otomatis jalan. Cek versinya:

    docker --version

    Output yang diharapkan kurang lebih seperti ini:

    Docker version 27.5.1, build 9f9e405

    Angka minor dan build bisa beda tergantung rilis terbaru saat kamu install. Yang penting versi mayornya 27 ke atas.

    Cara Install Docker di Windows: Docker Desktop dan WSL2

    Docker butuh kernel Linux. Di Windows, kebutuhan itu dipenuhi lewat WSL2 (Windows Subsystem for Linux versi 2), lalu Docker Desktop jalan di atasnya. Urutannya: aktifkan WSL2 dulu, baru install Docker Desktop.

    1. Aktifkan WSL2

    Buka PowerShell sebagai Administrator (klik kanan, Run as administrator), lalu jalankan:

    wsl --install

    Perintah ini mengaktifkan fitur WSL, mengunduh kernel Linux, menjadikan WSL2 sebagai default, dan menginstall distro Ubuntu. Setelah selesai, restart komputer. Kalau WSL sudah pernah terpasang, pastikan versinya 2 dengan wsl --status dan update dengan wsl --update.

    2. Install Docker Desktop

    1. Unduh installer dari https://docs.docker.com/desktop/setup/install/windows-install/, pilih yang x86_64.
    2. Jalankan Docker Desktop Installer.exe. Saat muncul pilihan backend, pastikan opsi Use WSL 2 instead of Hyper-V tercentang.
    3. Selesaikan instalasi, logout atau restart bila diminta, lalu buka aplikasi Docker Desktop.

    Tunggu sampai indikator di pojok kiri bawah Docker Desktop berwarna hijau dengan status Engine running. Setelah itu semua perintah docker bisa kamu jalankan dari PowerShell maupun dari terminal Ubuntu di WSL. Sepanjang seri ini perintahnya sama persis untuk Ubuntu asli maupun WSL, jadi pengguna Windows tidak perlu artikel terpisah.

    Verifikasi Instalasi: docker version, docker info, hello-world

    Ada tiga pengecekan standar setelah install. Pertama, docker version (tanpa tanda strip). Bedanya dengan docker --version, perintah ini menampilkan versi client sekaligus server. Kalau bagian Server muncul, artinya daemon Docker hidup dan bisa diajak bicara:

    docker version
    Client: Docker Engine - Community
     Version:           27.5.1
     ...
    Server: Docker Engine - Community
     Engine:
      Version:          27.5.1
     ...

    Kedua, docker info untuk melihat kondisi keseluruhan: jumlah container, jumlah image, storage driver, dan lainnya. Untuk instalasi baru, nilai Containers dan Images masih 0.

    Ketiga, tes paling memuaskan: jalankan container pertamamu.

    docker run hello-world

    Output yang diharapkan:

    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    e6590344b1a5: Pull complete
    Digest: sha256:...
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    Perhatikan alurnya, karena ini inti kerja Docker: image hello-world tidak ada di lokal, jadi Docker mengunduhnya dari Docker Hub, membuat container dari image itu, menjalankannya, lalu container mencetak pesan dan berhenti. Konsep image dan container ini kita bedah tuntas di bagian 2.

    Jalankan Docker Tanpa sudo: usermod -aG docker

    Di Ubuntu, daemon Docker jalan sebagai root dan socket-nya hanya bisa diakses root serta anggota grup docker. Karena itu, secara default setiap perintah harus diawali sudo. Capek kalau tiap perintah begitu. Solusinya, masukkan user kamu ke grup docker:

    sudo usermod -aG docker $USER

    Keanggotaan grup baru terbaca setelah kamu logout dan login lagi. Kalau tidak mau logout, jalankan newgrp docker untuk membuka shell baru dengan grup yang sudah aktif. Tes tanpa sudo:

    docker run hello-world

    Kalau pesan Hello from Docker muncul tanpa error, beres. Satu catatan penting: anggota grup docker pada praktiknya setara root di mesin itu, karena bisa me-mount filesystem host lewat container. Di laptop pribadi ini bukan masalah. Di server produksi yang dipakai banyak orang, pikirkan dulu siapa saja yang dimasukkan ke grup ini. Pengguna Docker Desktop di Windows tidak perlu langkah ini sama sekali.

    Troubleshooting: Error yang Sering Muncul Saat Install Docker

    permission denied while trying to connect to /var/run/docker.sock

    Pesan lengkapnya kurang lebih: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock. Penyebabnya user kamu belum masuk grup docker, atau sudah dimasukkan tapi belum logout-login. Solusi: jalankan sudo usermod -aG docker $USER, lalu logout dan login lagi. Cek dengan perintah groups, pastikan kata docker muncul di daftarnya.

    WSL2 Belum Aktif: “Docker Desktop requires a newer WSL kernel”

    Docker Desktop menolak jalan dan menyuruh update WSL. Ini terjadi karena WSL belum terpasang, masih versi 1, atau kernelnya usang. Buka PowerShell sebagai Administrator lalu jalankan wsl --update dan wsl --set-default-version 2, kemudian restart Docker Desktop. Kalau masih gagal, cek apakah virtualisasi aktif: buka Task Manager, tab Performance, lihat baris Virtualization. Kalau statusnya Disabled, aktifkan Intel VT-x atau AMD-V dari BIOS/UEFI.

    Unable to locate package docker-ce

    Muncul saat apt-get install docker-ce di Ubuntu. Artinya repositori Docker belum benar-benar terdaftar. Biasanya karena lupa menjalankan sudo apt-get update setelah menambah repo, atau file /etc/apt/sources.list.d/docker.list isinya salah karena perintah echo tadi tidak tercopy utuh. Cek isi file itu dengan cat, pastikan ada satu baris berisi kode nama Ubuntu kamu (misalnya noble), lalu ulangi sudo apt-get update.

    Cannot connect to the Docker daemon. Is the docker daemon running?

    Perintah docker jalan tapi daemon-nya mati. Di Ubuntu, nyalakan dengan sudo systemctl start docker dan supaya otomatis hidup saat boot jalankan sudo systemctl enable docker. Di Windows, error ini biasanya berarti aplikasi Docker Desktop belum dibuka. Buka dulu, tunggu status Engine running, baru jalankan perintah dari terminal.

    Sudah Terinstall, Selanjutnya Apa

    Sampai sini kamu sudah paham masalah yang diselesaikan container, punya Docker Engine 27.x yang jalan di Ubuntu atau Docker Desktop di Windows, dan sudah menjalankan container pertama tanpa sudo. Fondasi selesai.

    Di bagian 2, “Perbedaan Docker Image dan Container + Praktik Pertama”, kita bongkar konsep paling penting di Docker: apa itu image, apa itu container, dan kenapa keduanya sering tertukar di kepala pemula. Artikelnya terbit menyusul, pantau daftarnya di halaman hub Belajar Docker dari Nol.

    Referensi

  • Belajar Golang dari Nol #3: Function, Multiple Return, dan Error

    Belajar Golang dari Nol #3: Function, Multiple Return, dan Error

    Di Belajar Golang dari Nol #2 kamu sudah pegang variabel, tipe data, zero value, dan konversi tipe. Di sana kamu juga sempat ketemu sekilas dengan if err != nil waktu memakai strconv.Atoi. Waktu itu saya minta kamu terima dulu polanya tanpa banyak tanya. Sekarang saatnya membongkar asal-usulnya. Di bagian ini kita belajar function, multiple return, dan cara Go memperlakukan error.

    Function: bungkus logika biar bisa dipakai ulang

    Bayangkan function seperti mesin jus. Kamu masukkan buah, mesin bekerja, keluar jus. Kamu tidak perlu tahu isi mesinnya setiap kali mau bikin jus. Cukup tahu apa yang dimasukkan dan apa yang keluar.

    Di Go, bentuk dasarnya seperti ini.

    func sapa(nama string) string {
        return "Halo, " + nama
    }

    Baca pelan-pelan dari kiri ke kanan. func adalah kata kunci untuk membuat function. sapa adalah namanya. nama string artinya function ini menerima satu parameter bernama nama yang bertipe string. string di paling kanan adalah tipe nilai balikannya. Lalu return mengirim nilai itu keluar ke pemanggil.

    Kalau kamu pernah lihat Java atau C, urutannya terasa terbalik, karena Go memang sengaja menaruh tipe setelah nama supaya deklarasi tetap enak dibaca saat mulai kompleks.

    Begini cara memanggilnya dalam program utuh.

    package main
    
    import "fmt"
    
    func sapa(nama string) string {
        return "Halo, " + nama
    }
    
    func main() {
        pesan := sapa("Sari")
        fmt.Println(pesan)
    }

    Jalankan dengan go run main.go, hasilnya:

    Halo, Sari

    Parameter dan return value

    Function boleh menerima lebih dari satu parameter. Kita coba function hitung sederhana.

    func luasPersegiPanjang(panjang int, lebar int) int {
        return panjang * lebar
    }

    Ada satu trik kecil yang sering kamu temui di kode Go orang lain. Kalau beberapa parameter bertipe sama, tipenya cukup ditulis sekali di belakang.

    func luasPersegiPanjang(panjang, lebar int) int {
        return panjang * lebar
    }

    Keduanya sama persis artinya. Memanggilnya juga biasa saja: luas := luasPersegiPanjang(8, 5) akan mengisi luas dengan 40. Sampai sini belum ada yang aneh. Bagian menariknya baru mulai sekarang.

    Multiple return: ciri khas Go

    Di kebanyakan bahasa, function hanya bisa mengembalikan satu nilai. Go berbeda. Satu function boleh mengembalikan dua nilai atau lebih sekaligus. Ini bukan sekadar fitur gaya-gayaan. Ini fondasi dari cara Go menangani error.

    Contoh paling klasik adalah pembagian. Membagi angka dengan nol itu operasi yang tidak sah. Jadi function pembagi kita sebaiknya menjawab dua hal: berapa hasilnya, dan apakah operasinya berhasil.

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    func bagi(a, b float64) (float64, error) {
        if b == 0 {
            return 0, errors.New("tidak bisa membagi dengan nol")
        }
        return a / b, nil
    }
    
    func main() {
        hasil, err := bagi(10, 2)
        if err != nil {
            fmt.Println("terjadi error:", err)
            return
        }
        fmt.Println("hasil:", hasil)
    }

    Perhatikan bagian (float64, error). Itu artinya function ini mengembalikan dua nilai: hasil pembagian bertipe float64, dan sebuah error. Kalau semuanya lancar, error yang dikembalikan adalah nil, yang artinya kosong, tidak ada masalah. Kalau ada masalah, kita kembalikan nilai error yang berisi pesan.

    Di sisi pemanggil, dua nilai itu ditangkap sekaligus: hasil, err := bagi(10, 2). Ini pola yang akan kamu tulis ratusan kali selama menulis Go, jadi biasakan dari sekarang.

    Konvensi error di Go

    Di Go, error bukan sesuatu yang spesial. Error adalah nilai biasa, sama seperti angka atau string, hanya saja tipenya error. Karena dia nilai biasa, dia bisa dikembalikan dari function, disimpan di variabel, atau dibandingkan.

    Ada beberapa konvensi tidak tertulis yang dipegang hampir semua programmer Go:

    • Kalau function bisa gagal, nilai balikan terakhirnya bertipe error. Bukan yang pertama, bukan di tengah. Selalu yang terakhir.
    • Untuk membuat error dengan pesan tetap, pakai errors.New("pesan errornya") dari package errors.
    • Untuk pesan yang butuh format, pakai fmt.Errorf. Misalnya fmt.Errorf("stok tinggal %d", sisa).

    Satu hal lagi yang cukup kamu tahu namanya dulu. fmt.Errorf punya kata kerja format khusus, yaitu %w, yang dipakai untuk membungkus error lain di dalam error baru. Teknik ini namanya error wrapping, dan detailnya kita bahas di bagian lanjutan seri ini. Sekarang cukup ingat bahwa %w itu ada.

    Pola if err != nil, dijelaskan tuntas

    Sekarang kita jawab pertanyaan yang tertunda dari bagian 2: kenapa kode Go penuh dengan if err != nil?

    Bahasa seperti Java, Python, atau JavaScript memakai try-catch. Kamu tulis kode di blok try, dan kalau ada yang meledak di mana pun di dalamnya, eksekusi melompat ke blok catch. Go mengambil jalan lain. Tidak ada try-catch. Function yang bisa gagal mengembalikan error sebagai nilai, dan kamu memeriksanya langsung setelah pemanggilan.

    Alasannya soal kejujuran kode. Dengan try-catch, kamu bisa memanggil sepuluh function tanpa tahu mana yang bisa gagal. Di Go, kemungkinan gagal tertulis jelas di tanda tangan function. Pembaca kode langsung tahu titik mana saja yang bisa bermasalah, dan compiler akan protes kalau kamu menangkap err lalu tidak menyentuhnya sama sekali.

    Supaya adil, pendekatan ini ada harganya. Kode Go jadi lebih panjang, dan mengetik if err != nil berulang-ulang memang terasa repetitif. Ini kritik paling umum terhadap Go, dan kritik itu valid. Sebagian orang menganggapnya bertele-tele, sebagian lagi justru menyukainya karena alur kegagalan terlihat gamblang tanpa lompatan tersembunyi. Setelah beberapa minggu menulis Go, kebanyakan orang berhenti menganggapnya masalah.

    Pola pendampingnya bernama early return: begitu ketemu error, langsung return dan hentikan function. Kode sukses tidak perlu dibungkus blok else, jadi alur utamanya tetap lurus dari atas ke bawah. Contohnya sudah kamu lihat di function main tadi. Kalau err tidak nil, cetak pesannya lalu return. Baris di bawahnya hanya berjalan saat semuanya aman.

    Named return: singkat saja

    Go mengizinkan nilai balikan diberi nama di tanda tangan function.

    func bagi(a, b float64) (hasil float64, err error) {
        if b == 0 {
            err = errors.New("tidak bisa membagi dengan nol")
            return
        }
        hasil = a / b
        return
    }

    hasil dan err otomatis menjadi variabel di dalam function, dan return polos akan mengembalikan nilai keduanya saat itu. Kelihatan praktis, tapi pada function yang panjang, pembaca harus menebak apa isi return polos itu. Saran saya untuk sekarang: tulis return secara eksplisit seperti contoh-contoh sebelumnya. Named return baru berguna di kasus khusus yang akan kamu temui jauh di depan.

    Variadic function: parameter yang jumlahnya bebas

    Kadang kamu tidak tahu berapa banyak nilai yang akan dikirim ke function. Menjumlahkan isi keranjang belanja, misalnya. Bisa dua barang, bisa sepuluh. Untuk itu Go punya variadic function, ditandai tiga titik sebelum tipe.

    func totalBelanja(harga ...int) int {
        total := 0
        for _, h := range harga {
            total += h
        }
        return total
    }

    harga ...int artinya function ini menerima nol, satu, atau banyak nilai int. Di dalam function, harga berperilaku seperti kumpulan nilai yang bisa kita jelajahi dengan for range. Perulangan sendiri akan kita kupas dalam di bagian lain, untuk sekarang cukup pahami bahwa baris itu mengunjungi tiap harga satu per satu dan menambahkannya ke total.

    Memanggilnya luwes sekali: totalBelanja(15000, 20000) sah, totalBelanja(5000, 7500, 12000, 3000) juga sah. fmt.Println yang kamu pakai sejak bagian 1 juga variadic. Itu sebabnya dia mau menerima berapa pun argumen.

    Latihan: kalkulator diskon

    Sekarang kita rangkai semuanya jadi satu program utuh. Skenarionya sederhana: kasir menjumlahkan keranjang belanja, lalu menerapkan diskon. Diskon di bawah 0 persen atau di atas 100 persen jelas tidak masuk akal, jadi harus ditolak lewat error.

    package main
    
    import "fmt"
    
    func totalKeranjang(harga ...float64) float64 {
        total := 0.0
        for _, h := range harga {
            total += h
        }
        return total
    }
    
    func hitungDiskon(total, persen float64) (float64, error) {
        if persen < 0 {
            return 0, fmt.Errorf("persen diskon tidak boleh negatif, dapat %v", persen)
        }
        if persen > 100 {
            return 0, fmt.Errorf("persen diskon tidak boleh lebih dari 100, dapat %v", persen)
        }
        potongan := total * persen / 100
        return total - potongan, nil
    }
    
    func main() {
        total := totalKeranjang(15000, 42500, 8000)
        fmt.Println("Total keranjang:", total)
    
        bayar, err := hitungDiskon(total, 20)
        if err != nil {
            fmt.Println("Gagal menghitung diskon:", err)
            return
        }
        fmt.Println("Bayar setelah diskon 20 persen:", bayar)
    
        bayar, err = hitungDiskon(total, 150)
        if err != nil {
            fmt.Println("Gagal menghitung diskon:", err)
            return
        }
        fmt.Println("Bayar setelah diskon 150 persen:", bayar)
    }

    Jalankan, dan outputnya seperti ini.

    Total keranjang: 65500
    Bayar setelah diskon 20 persen: 52400
    Gagal menghitung diskon: persen diskon tidak boleh lebih dari 100, dapat 150

    Mari bedah sebentar apa yang terjadi:

    • totalKeranjang adalah variadic function. Dia menerima tiga harga dan menjumlahkannya jadi 65500.
    • hitungDiskon memakai multiple return: hasil bertipe float64 plus error di posisi terakhir, sesuai konvensi.
    • Validasi dilakukan di awal function dengan early return. Persen 20 lolos, jadi errornya nil dan program mencetak 52400.
    • Panggilan kedua mengirim persen 150. Validasi menolaknya, err terisi, dan blok if err != nil mencetak pesan lalu menghentikan main. Baris cetak “Bayar setelah diskon 150 persen” tidak pernah dijalankan.

    Coba ubah sendiri: ganti persen jadi -5, tambah barang di keranjang, atau buat function baru hitungPajak dengan pola yang sama. Semakin sering tanganmu menulis pola ini, semakin cepat dia jadi refleks.

    Rangkuman dan lanjut ke mana

    Hari ini kamu sudah belajar cukup banyak:

    • Function dideklarasikan dengan func, dan tipe ditulis setelah nama.
    • Function di Go bisa mengembalikan lebih dari satu nilai.
    • Konvensi error: nilai balikan terakhir bertipe error, dibuat dengan errors.New atau fmt.Errorf.
    • Go memilih pengecekan error eksplisit lewat if err != nil plus early return, bukan try-catch.
    • Named return ada, tapi untuk sekarang lebih baik return eksplisit.
    • Variadic function menerima jumlah argumen yang bebas.

    Dengan bekal ini, kamu sudah bisa memecah program jadi potongan-potongan kecil yang rapi dan tahan gagal. Di bagian berikutnya kita naik satu tingkat: “Belajar Golang dari Nol #4: Struct dan Method: Cara Go Menyusun Data”. Di sana function yang baru kamu kuasai akan menempel langsung ke data.

    Pola function dan error yang kamu latih hari ini persis pola yang kami pakai sehari-hari saat membangun backend produksi dengan Go untuk klien Arrazy.

  • Belajar Linux dari Nol #1: Cara Install Ubuntu 24.04

    Belajar Linux dari Nol #1: Cara Install Ubuntu 24.04

    Cara install Ubuntu 24.04 yang paling aman untuk pemula adalah lewat VirtualBox. Kamu download ISO Ubuntu 24.04 LTS dari ubuntu.com, buat virtual machine dengan RAM minimal 4 GB dan disk 25 GB, lalu ikuti installer sampai login desktop. Seluruh prosesnya sekitar 30 sampai 60 menit, dan kalau ada yang rusak, tinggal hapus VM lalu ulang dari nol tanpa menyentuh Windows atau data kamu.

    Artikel ini bagian pertama dari seri Belajar Linux dari Nol, seri tutorial 26 bagian yang membawa kamu dari belum pernah pegang terminal sampai bisa mengelola server sendiri. Di bagian ini kita siapkan fondasinya dulu: kenalan singkat dengan Linux, memilih jalur setup yang cocok, lalu praktik install sampai selesai.

    Apa Itu Linux dan Kenapa Seri Ini Pakai Ubuntu 24.04 LTS

    Linux adalah sistem operasi open source, sama seperti Windows atau macOS tapi gratis dan kodenya terbuka. Kamu mungkin belum sadar, tapi Linux sudah ada di mana-mana: Android jalan di atas kernel Linux, dan mayoritas server di internet memakai Linux. Kalau kamu mau kerja sebagai backend developer, DevOps, atau sysadmin, Linux bukan pilihan, tapi keharusan.

    Linux dirilis dalam bentuk distro (distribusi), yaitu paket kernel Linux plus kumpulan software siap pakai. Ada banyak distro: Ubuntu, Debian, Fedora, Arch, dan lainnya. Seri ini memakai Ubuntu 24.04 LTS dengan tiga alasan praktis:

    • LTS berarti Long Term Support. Ubuntu 24.04 (nama kodenya Noble Numbat) didukung update keamanan sampai tahun 2029. Kamu tidak perlu upgrade besar tiap enam bulan.
    • Paling banyak dipakai di server. Skill yang kamu pelajari di laptop langsung terpakai saat pegang server sungguhan. Tim Arrazy sendiri menjalankan hampir semua deployment klien, dari backend Go sampai aplikasi Laravel, di server Ubuntu.
    • Komunitasnya besar. Hampir semua error yang kamu temui sudah pernah ditanyakan orang lain. Solusinya gampang dicari.

    Tiga Jalur Setup: VirtualBox, WSL2, atau Dual Boot

    Ada tiga cara umum menjalankan Ubuntu di laptop yang sudah terpasang Windows. Masing-masing punya kelebihan dan risikonya sendiri.

    Jalur Cocok untuk Risiko
    VirtualBox Pemula yang mau eksperimen bebas, dapat desktop Ubuntu penuh Hampir nol, VM terisolasi dari Windows
    WSL2 Yang cuma butuh terminal Linux di dalam Windows Rendah, tapi tanpa pengalaman desktop Linux
    Dual boot Yang sudah yakin mau pakai Linux harian dengan performa penuh Salah partisi bisa menghapus data Windows

    Rekomendasi saya untuk seri ini: pakai VirtualBox. Kamu dapat pengalaman Ubuntu lengkap termasuk proses install, desktop, dan manajemen sistem, tanpa risiko apa pun ke laptop utama. Salah ketik perintah paling parah cuma merusak VM, tinggal buat lagi.

    Kalau Mau Jalur WSL2 di Windows

    WSL2 (Windows Subsystem for Linux) menjalankan Ubuntu langsung di dalam Windows 10/11 tanpa VM manual. Cukup satu perintah di PowerShell yang dijalankan sebagai Administrator:

    wsl --install -d Ubuntu-24.04

    Setelah restart, buka aplikasi Ubuntu dari Start Menu, buat username dan password, selesai. WSL2 sah-sah saja dipakai mengikuti seri ini karena 90 persen materi kita berbasis terminal. Yang tidak kamu dapat: pengalaman install OS dan desktop Linux.

    Kalau Mau Dual Boot

    Dual boot memasang Ubuntu berdampingan dengan Windows di disk yang sama. Performanya paling kencang karena tidak ada lapisan virtualisasi. Tapi jalur ini melibatkan pemotongan partisi disk, dan salah langkah bisa membuat Windows tidak bisa boot atau data hilang. Kalau kamu baru pertama kali, tunda dulu. Selesaikan seri ini di VirtualBox, nanti kalau sudah nyaman baru pindah ke dual boot dengan backup data lengkap.

    Praktik: Cara Install Ubuntu 24.04 di VirtualBox

    Yang kamu butuhkan: laptop dengan RAM minimal 8 GB (4 GB untuk VM, sisanya untuk Windows), ruang disk kosong 30 GB, dan koneksi internet untuk download sekitar 6 GB.

    Langkah 1: Download ISO Ubuntu 24.04

    Buka https://ubuntu.com/download/desktop lalu klik tombol download untuk Ubuntu 24.04 LTS. File yang kamu dapat bernama seperti ubuntu-24.04.2-desktop-amd64.iso dengan ukuran sekitar 5,8 GB. Angka di belakang 24.04 adalah point release, isinya tetap Ubuntu 24.04 plus update terbaru, jadi ambil saja versi yang ditawarkan.

    Langkah 2: Install VirtualBox dan Buat VM

    Download VirtualBox versi 7.1 dari https://www.virtualbox.org/wiki/Downloads, pilih “Windows hosts”, lalu install dengan pengaturan default. Setelah terbuka, buat VM baru:

    1. Klik New. Isi nama ubuntu-belajar, pilih ISO yang tadi didownload di kolom ISO Image. VirtualBox otomatis mendeteksi tipe Linux dan versi Ubuntu 24.04.
    2. Centang Skip Unattended Installation. Ini penting supaya kamu mengalami proses install manual, bukan diotomatiskan VirtualBox.
    3. Di bagian Hardware: set Base Memory 4096 MB dan Processors 2. Kalau laptop kamu punya RAM 16 GB, boleh naikkan ke 8192 MB supaya lebih lega.
    4. Di bagian Hard Disk: buat disk baru ukuran 25 GB. Ini ukuran maksimal, file di Windows hanya membesar sesuai pemakaian nyata.
    5. Klik Finish, lalu klik Start untuk menyalakan VM.

    Langkah 3: Jalankan Installer Ubuntu Sampai Selesai

    VM akan boot dari ISO dan masuk ke installer Ubuntu. Ikuti urutan ini:

    1. Pilih bahasa English. Bukan karena bahasa Indonesia jelek, tapi supaya pesan error kamu gampang dicari di Google, hampir semua dokumentasi memakai istilah Inggris.
    2. Pilih Install Ubuntu, lalu keyboard layout English (US) yang cocok dengan keyboard laptop Indonesia pada umumnya.
    3. Sambungkan ke internet kalau ditawarkan, lalu pilih Interactive installation dan Default selection untuk aplikasi bawaan.
    4. Di bagian tipe instalasi, pilih Erase disk and install Ubuntu. Tenang, “disk” di sini adalah disk virtual 25 GB milik VM, bukan disk Windows kamu.
    5. Isi nama, nama komputer, username, dan password. Catat password ini baik-baik, kamu akan memakainya terus untuk perintah sudo.
    6. Pilih zona waktu Jakarta, klik Install, lalu tunggu 10 sampai 20 menit.
    7. Setelah muncul “Installation Complete”, klik Restart Now. Kalau layar meminta “remove the installation medium”, cukup tekan Enter.

    Kalau semua lancar, VM akan boot ulang dan menampilkan layar login Ubuntu. Masukkan password, dan kamu resmi punya desktop Linux pertama.

    Update Pertama Kali Setelah Install Ubuntu

    Hal pertama yang wajib dilakukan setelah install adalah update sistem. ISO yang kamu pakai dibuat beberapa bulan lalu, jadi ada tumpukan update keamanan yang menunggu. Buka terminal dengan shortcut Ctrl+Alt+T, lalu jalankan:

    sudo apt update && sudo apt upgrade -y

    Kamu akan diminta password. Saat mengetik password di terminal, tidak ada tanda apa pun yang muncul di layar, itu normal, ketik saja lalu Enter. Output awalnya kira-kira seperti ini:

    Hit:1 http://id.archive.ubuntu.com/ubuntu noble InRelease
    Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
    Get:3 http://id.archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
    ...
    Reading package lists... Done
    Building dependency tree... Done
    XX packages can be upgraded. Run 'apt list --upgradable' to see them.

    Perintah apt update menyegarkan daftar paket, apt upgrade memasang versi terbarunya. Detail lengkap soal APT kita bahas di bagian 11 seri ini, untuk sekarang cukup paham bahwa dua perintah ini adalah ritual rutin pengguna Ubuntu. Di pekerjaan kami sehari-hari mengelola server klien yang menjalankan sistem aplikasi mereka, update rutin seperti ini adalah lapisan keamanan paling dasar yang tidak boleh dilewatkan.

    Terakhir, matikan VM dengan benar: klik menu power di pojok kanan atas desktop lalu pilih Power Off, atau dari terminal:

    sudo poweroff

    Troubleshooting: Error Umum Saat Install Ubuntu 24.04

    VT-x/AMD-V Tidak Aktif di BIOS

    Gejalanya VM menolak start dengan pesan seperti VT-x is not available (VERR_VMX_NO_VMX) atau AMD-V is disabled in the BIOS. Penyebabnya fitur virtualisasi di prosesor belum dinyalakan. Solusinya: restart laptop, masuk BIOS/UEFI (biasanya tekan F2, F10, atau Del saat logo vendor muncul), cari opsi bernama Intel Virtualization Technology, VT-x, atau SVM Mode untuk AMD, ubah ke Enabled, simpan, lalu boot ulang. Di Windows 11, cek juga Task Manager tab Performance, baris “Virtualization” harus tertulis Enabled.

    Installer Lambat atau Crash karena RAM VM Kurang

    Kalau RAM VM diset di bawah 4 GB, installer Ubuntu 24.04 desktop sering macet, sangat lambat, atau muncul pesan “the installer encountered an unrecoverable error”. Solusinya: matikan VM, buka Settings, System, Motherboard, naikkan Base Memory ke minimal 4096 MB. Kalau laptop kamu total RAM-nya hanya 8 GB, tutup aplikasi berat seperti browser dengan banyak tab sebelum menjalankan VM.

    Stuck di Layar Hitam Setelah Install

    VM boot tapi hanya menampilkan layar hitam atau kursor kedip. Ada dua penyebab paling umum. Pertama, VM masih boot dari ISO installer: buka Settings, Storage, klik ikon CD, lalu pilih Remove Disk from Virtual Drive. Kedua, masalah grafis: buka Settings, Display, naikkan Video Memory ke 128 MB, pastikan Graphics Controller diset VMSVGA, dan matikan centang Enable 3D Acceleration kalau sebelumnya aktif. Salah satu dari dua langkah ini menyelesaikan hampir semua kasus layar hitam yang kami temui.

    Lanjut ke Bagian Berikutnya

    Sampai sini kamu sudah punya Ubuntu 24.04 yang hidup, ter-update, dan aman untuk dieksperimeni. Itu modal utama untuk seluruh seri ini. Sering-seringlah masuk ke VM ini, karena satu-satunya cara jago Linux adalah memakainya tiap hari.

    Bagian berikutnya, “Belajar Linux dari Nol #2: Cara Menggunakan Terminal Linux”, akan mulai masuk ke jantung Linux yang sebenarnya: terminal, shell, dan cara membaca struktur perintah. Artikelnya terbit menyusul dan bisa kamu pantau di halaman hub Belajar Linux.

    Referensi

  • Belajar Golang dari Nol #2: Variabel, Tipe Data, dan Zero Value

    Belajar Golang dari Nol #2: Variabel, Tipe Data, dan Zero Value

    Di Belajar Golang dari Nol #1 kamu sudah install Go dan menjalankan program pertama lewat go run. Sekarang kita masuk ke bahan bangunan paling dasar dari semua program: variabel, tipe data, dan satu konsep khas Go yang namanya zero value.

    Anggap variabel itu seperti kotak berlabel. Labelnya nama variabel, isinya nilai. Bedanya dengan bahasa lain, di Go setiap kotak juga punya aturan ketat soal barang apa yang boleh masuk. Kotak untuk angka tidak bisa diisi teks. Aturan ini yang bikin program Go jarang error aneh saat sudah jalan.

    Tiga Cara Deklarasi Variabel di Go

    Go punya tiga gaya untuk membuat variabel. Semuanya sering dipakai, jadi kenali satu per satu.

    1. var tanpa nilai awal

    var nama string
    var umur int
    
    fmt.Println(nama) // (string kosong)
    fmt.Println(umur) // 0

    Di sini kamu hanya menyiapkan kotaknya. Isinya belum ada, tapi Go otomatis memberi nilai default. Soal nilai default ini kita bahas lebih dalam di bagian zero value nanti.

    2. var dengan nilai awal

    var nama string = "Rizky"
    var umur = 25 // tipe int ditebak otomatis oleh Go

    Kalau nilai awal sudah ada, kamu boleh menulis tipenya atau membiarkan Go menebak sendiri. Menebak tipe dari nilai ini disebut type inference. Nilai 25 otomatis dianggap int, nilai "Rizky" otomatis dianggap string.

    3. Short declaration dengan :=

    nama := "Rizky"
    umur := 25

    Ini cara paling ringkas dan paling sering kamu lihat di kode Go sehari-hari. Tanda := artinya “buat variabel baru sekaligus isi nilainya”. Tanpa kata var, tanpa menulis tipe.

    Ada satu aturan penting: := hanya boleh dipakai di dalam function. Di luar function, misalnya di level package, kamu wajib pakai var. Kode di bawah ini menunjukkan bedanya.

    package main
    
    import "fmt"
    
    var appName = "Kasir Sederhana" // level package, wajib var
    
    func main() {
    	versi := "1.0" // di dalam function, boleh :=
    	fmt.Println(appName, versi)
    }

    Lalu kapan pakai yang mana? Panduan sederhananya begini:

    • Pakai := untuk variabel biasa di dalam function. Ini pilihan default kamu.
    • Pakai var kalau kamu butuh variabel di level package, atau kalau kamu sengaja ingin variabel kosong dulu dan diisi belakangan.
    • Pakai var dengan tipe eksplisit kalau tipe tebakan Go bukan yang kamu mau. Misalnya var saldo float64 = 10000, karena saldo := 10000 akan jadi int.

    Tipe Data Dasar yang Wajib Kamu Kenal

    Go punya banyak tipe data. Untuk sekarang, empat tipe ini cukup untuk hampir semua latihan awal.

    string

    Teks. Selalu ditulis dengan tanda kutip dua, bukan kutip satu.

    namaToko := "Kopi Senja"
    alamat := "Jl. Merdeka No. 10, Purwokerto"

    int

    Bilangan bulat. Cocok untuk hal yang dihitung satuan: jumlah barang, umur, jumlah user.

    stok := 120
    jumlahKaryawan := 8

    Go juga punya varian seperti int8, int32, dan int64. Angka di belakangnya menunjukkan berapa bit memori yang dipakai, yang menentukan seberapa besar angka yang bisa ditampung. int64 misalnya sering dipakai untuk ID di database yang nilainya bisa sangat besar. Untuk belajar, pakai int biasa saja dulu. Sisanya akan terasa gunanya saat kamu mulai kerja dengan database atau API.

    float64

    Bilangan desimal. Cocok untuk harga, berat, rating, dan apa pun yang punya koma.

    hargaKopi := 25000.0
    beratBiji := 0.25 // kg

    Perhatikan 25000.0. Titik nol di belakang itu penting. Tanpa itu, Go menganggapnya int. Dengan titik desimal, Go tahu kamu mau float64.

    bool

    Nilai benar atau salah. Isinya cuma dua kemungkinan: true atau false.

    sudahBayar := true
    tokoTutup := false

    Tipe ini kelihatan sepele, tapi hampir semua logika program dibangun di atasnya. Setiap if yang kamu tulis nanti ujungnya selalu sebuah bool.

    Zero Value: Nilai Default yang Bikin Tenang

    Sekarang konsep khas Go yang tadi sempat disinggung. Di Go, variabel yang dideklarasikan tanpa nilai awal tidak pernah kosong tanpa arti. Go selalu mengisinya dengan nilai default sesuai tipenya. Nilai default ini disebut zero value.

    • string menjadi "" (string kosong)
    • int dan float64 menjadi 0
    • bool menjadi false
    • tipe seperti pointer, slice, dan map menjadi nil

    Coba jalankan program kecil ini dan lihat hasilnya.

    package main
    
    import "fmt"
    
    func main() {
    	var nama string
    	var stok int
    	var harga float64
    	var aktif bool
    
    	fmt.Printf("nama: %q\n", nama)
    	fmt.Printf("stok: %d\n", stok)
    	fmt.Printf("harga: %f\n", harga)
    	fmt.Printf("aktif: %t\n", aktif)
    }

    Outputnya:

    nama: ""
    stok: 0
    harga: 0.000000
    aktif: false

    Kenapa ini desain yang enak? Karena kamu tidak pernah perlu bertanya “variabel ini sudah diisi atau belum, isinya sampah memori atau bukan”. Setiap variabel selalu punya nilai yang jelas dan bisa diprediksi sejak lahir. Kalau kamu pernah pegang JavaScript, ini beda jauh dengan undefined yang sering muncul tiba-tiba di tempat yang tidak kamu duga.

    Zero value juga sering dimanfaatkan langsung. Counter mulai dari 0, flag mulai dari false, teks mulai dari kosong. Banyak kode Go sengaja didesain agar zero value-nya langsung berguna tanpa perlu setup tambahan.

    Konstanta: Nilai yang Dikunci

    Kadang ada nilai yang tidak boleh berubah selama program berjalan. Rate diskon, nama aplikasi, batas maksimal upload. Untuk itu Go punya const.

    const appName = "Kasir Senja"
    const diskonMember = 0.1
    const maksimalQty = 100

    Bedanya dengan var ada dua. Pertama, nilai const harus sudah diketahui saat program di-compile, jadi kamu tidak bisa mengisinya dari input user atau hasil pemanggilan function biasa. Kedua, nilainya terkunci. Kalau kamu coba mengubahnya, program tidak akan bisa di-compile.

    const diskonMember = 0.1
    diskonMember = 0.2 // error: cannot assign to diskonMember

    Ini bagus. Lebih baik error muncul saat compile daripada diam-diam ada kode yang mengubah rate diskon di tengah jalan. Aturan praktisnya: kalau sebuah nilai memang tidak akan pernah berubah, jadikan const. Sisanya baru var atau :=.

    Konversi Tipe: Go Itu Ketat, dan Itu Bagus

    Go tidak mau menebak-nebak saat dua tipe berbeda bertemu. Operasi int dicampur float64 langsung ditolak compiler. Kamu harus konversi dulu secara eksplisit.

    qty := 3          // int
    harga := 12500.0  // float64
    
    // total := qty * harga        // error: mismatched types
    total := float64(qty) * harga  // benar: 37500

    Polanya sederhana: tulis nama tipe tujuan, lalu bungkus nilainya dengan tanda kurung. float64(qty) artinya “ubah qty menjadi float64”. Berlaku juga sebaliknya, int(harga), dengan catatan angka di belakang koma akan dibuang.

    Angka ke string dan sebaliknya dengan strconv

    Untuk konversi antara angka dan string, tipe castingnya berbeda urusan. string(65) tidak menghasilkan teks “65”, tapi karakter dengan kode 65. Yang benar, pakai package strconv dari standard library.

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	// int ke string: Itoa (Integer to ASCII)
    	umur := 25
    	teksUmur := strconv.Itoa(umur)
    	fmt.Println("Umur saya " + teksUmur + " tahun")
    
    	// string ke int: Atoi (ASCII to Integer)
    	angka, err := strconv.Atoi("123")
    	if err != nil {
    		fmt.Println("Gagal konversi:", err)
    		return
    	}
    	fmt.Println("Hasil tambah satu:", angka+1)
    }

    Perhatikan baris angka, err := strconv.Atoi("123"). Kenapa hasilnya dua? Karena konversi string ke angka bisa gagal. String "123" jelas bisa jadi angka, tapi bagaimana dengan "abc"? Go menjawab kemungkinan gagal itu dengan mengembalikan dua nilai: hasilnya dan errornya. Kalau konversi sukses, err bernilai nil. Kalau gagal, err berisi keterangan kegagalannya dan kamu wajib menanganinya.

    Pola if err != nil ini akan kamu tulis ratusan kali sepanjang karier Go kamu. Ini cara Go memaksa programmer memikirkan kegagalan sejak awal, bukan menundanya sampai program crash di production. Detail cara kerja multiple return dan error akan kita kupas tuntas di bagian 3. Untuk sekarang, cukup hafalkan bentuknya.

    Kenalan dengan fmt.Printf

    Sebelum masuk latihan, kenalan dulu dengan fmt.Printf. Kalau fmt.Println mencetak apa adanya, Printf mencetak dengan format yang kamu atur lewat kode persen. Yang paling sering dipakai:

    • %s untuk string
    • %d untuk bilangan bulat
    • %f untuk desimal, dan %.2f untuk membatasi dua angka di belakang koma
    • %t untuk bool
    • %v untuk nilai apa pun, berguna saat malas mikir tipenya
    nama := "Rizky"
    qty := 3
    harga := 12500.0
    member := true
    
    fmt.Printf("%s beli %d barang seharga %.2f, member: %t\n", nama, qty, harga, member)
    // Rizky beli 3 barang seharga 12500.00, member: true

    Jangan lupa \n di akhir untuk pindah baris. Printf tidak menambahkannya otomatis seperti Println.

    Latihan: Program Hitung Total Belanja

    Sekarang gabungkan semua materi jadi satu program utuh. Kasusnya sederhana: hitung total belanja satu barang, lalu beri diskon 10 persen kalau pembelinya member. Buat file main.go baru, ketik ulang kodenya sendiri, jangan copy paste. Mengetik ulang itu cara belajar paling cepat.

    package main
    
    import "fmt"
    
    const diskonMember = 0.1 // 10 persen, dikunci dengan const
    
    func main() {
    	// data belanja
    	namaBarang := "Kopi Arabika 200g" // string
    	qty := 3                          // int
    	harga := 45000.0                  // float64
    	isMember := true                  // bool
    
    	// qty harus dikonversi dulu agar bisa dikali float64
    	subtotal := float64(qty) * harga
    
    	// zero value float64 adalah 0, jadi non-member otomatis diskonnya 0
    	var diskon float64
    	if isMember {
    		diskon = subtotal * diskonMember
    	}
    
    	total := subtotal - diskon
    
    	// cetak struk
    	fmt.Println("===== Struk Belanja =====")
    	fmt.Printf("Barang   : %s\n", namaBarang)
    	fmt.Printf("Qty      : %d\n", qty)
    	fmt.Printf("Harga    : Rp%.0f\n", harga)
    	fmt.Printf("Subtotal : Rp%.0f\n", subtotal)
    	fmt.Printf("Member   : %t\n", isMember)
    	fmt.Printf("Diskon   : Rp%.0f\n", diskon)
    	fmt.Printf("Total    : Rp%.0f\n", total)
    }

    Jalankan dengan go run main.go. Outputnya:

    ===== Struk Belanja =====
    Barang   : Kopi Arabika 200g
    Qty      : 3
    Harga    : Rp45000
    Subtotal : Rp135000
    Member   : true
    Diskon   : Rp13500
    Total    : Rp121500

    Lihat bagaimana semua materi hari ini terpakai. Ada const untuk rate diskon, := untuk variabel di dalam function, empat tipe data dasar, konversi float64(qty), zero value yang dimanfaatkan di variabel diskon, dan Printf untuk merapikan output.

    Sebagai latihan tambahan, coba ubah isMember jadi false dan jalankan lagi. Perhatikan diskon otomatis jadi 0 tanpa kamu menulis kode tambahan. Itu zero value yang bekerja untukmu. Lalu coba ganti qty := 3 menjadi qty := 3.0 dan lihat error apa yang muncul. Membaca pesan error compiler sejak dini akan sangat membantu di bagian-bagian berikutnya.

    Lanjut ke Bagian 3

    Hari ini kamu sudah pegang fondasi terpenting: tiga cara deklarasi variabel, empat tipe data dasar, zero value, konstanta, konversi tipe, dan kenalan pertama dengan pola if err != nil. Semua program Go, sesederhana atau serumit apa pun, dibangun dari bahan-bahan ini.

    Di bagian berikutnya kita masuk ke topik yang membuat kode kamu mulai terstruktur: “Belajar Golang dari Nol #3: Function, Multiple Return, dan Error Pertamamu”. Di sana misteri kenapa Atoi mengembalikan dua nilai akan terjawab tuntas.

    Seri ini kami tulis dari pengalaman sehari-hari, karena tim Arrazy memang membangun backend produksi dengan Go untuk berbagai sistem aplikasi klien kami.

  • Belajar Golang dari Nol #1: Kenalan dengan Go dan Cara Installnya

    Belajar Golang dari Nol #1: Kenalan dengan Go dan Cara Installnya

    Go (sering disebut Golang) adalah bahasa pemrograman open source yang dibuat di Google oleh Robert Griesemer, Rob Pike, dan Ken Thompson, lalu dirilis ke publik tahun 2009. Bahasa ini dirancang untuk satu hal: membuat software yang cepat dan mudah dirawat, tanpa ritual yang ribet. Di dunia nyata, Go paling sering dipakai untuk backend API, tool CLI, dan service yang butuh performa tinggi. Google jelas memakainya. Uber memakainya untuk banyak microservice mereka. Di Indonesia, Gojek dan Tokopedia sudah lama menjadikan Go tulang punggung backend mereka.

    Jadi kalau kamu ingin serius di dunia backend, Go adalah salah satu pilihan paling masuk akal saat ini. Seri “Belajar Golang dari Nol” ini akan menemani kamu dari titik paling awal: belum pernah menyentuh Go sama sekali. Mungkin kamu baru bisa sedikit PHP atau JavaScript. Tidak masalah. Kita mulai pelan.

    Kenapa Go Enak untuk Pemula Backend

    Ada beberapa alasan kenapa saya suka merekomendasikan Go sebagai bahasa backend pertama atau kedua.

    • Kompilasinya cepat. Kamu edit kode, jalankan, hasilnya muncul dalam hitungan detik. Siklus coba-salah-perbaiki jadi singkat, dan itu penting banget saat belajar.
    • Hasilnya satu binary. Saat kamu build program Go, hasilnya satu file executable yang bisa langsung dijalankan di server. Tidak perlu install runtime, interpreter, atau setumpuk dependency di server tujuan. Kalau kamu terbiasa dengan PHP yang butuh web server plus interpreter di sisi produksi, ini rasanya seperti pindah dari koper besar ke satu tas selempang.
    • Sintaksnya kecil. Go hanya punya 25 keyword. Bandingkan dengan bahasa lain yang bisa dua kali lipatnya. Artinya, hal yang perlu kamu hafal sedikit. Kode Go milik orang lain juga gampang dibaca karena semua orang menulis dengan gaya yang kurang lebih sama.
    • Ada garbage collector. Kamu tidak perlu mengatur memori secara manual seperti di C. Go yang membereskan memori yang sudah tidak terpakai. Kamu fokus ke logika program saja.

    Biar adil, Go juga punya sisi yang kurang enak. Pertama, kodenya cenderung verbose. Hal yang di JavaScript bisa satu baris, di Go kadang butuh lima baris. Kedua, error handling-nya berulang. Kamu akan sering sekali menulis pola if err != nil sampai hafal di luar kepala. Sebagian orang menganggap ini membosankan. Tapi ada hikmahnya: kamu dipaksa memikirkan setiap kemungkinan error, dan itu kebiasaan bagus untuk programmer backend.

    Cara Install Go

    Semua file instalasi resmi ada di satu tempat: go.dev/dl. Jangan unduh dari tempat lain. Pilih bagian sesuai sistem operasi kamu di bawah ini.

    Install Go di Linux

    Di Linux, cara paling bersih adalah memakai tarball resmi. Hindari install dari apt bawaan distro karena versinya sering tertinggal jauh.

    Pertama, unduh tarball dari go.dev/dl. Cek dulu nomor versi terbaru di halaman itu, lalu sesuaikan nama filenya. Contoh di bawah memakai versi 1.25.1 untuk arsitektur amd64:

    wget https://go.dev/dl/go1.25.1.linux-amd64.tar.gz

    Kedua, hapus instalasi Go lama (kalau ada) dan ekstrak ke /usr/local:

    sudo rm -rf /usr/local/go
    sudo tar -C /usr/local -xzf go1.25.1.linux-amd64.tar.gz

    Perintah tar -C /usr/local artinya ekstrak isi arsip ke folder /usr/local. Hasilnya, Go terpasang di /usr/local/go.

    Ketiga, tambahkan Go ke PATH. PATH itu daftar folder tempat terminal mencari program saat kamu mengetik sebuah perintah. Kalau folder bin milik Go tidak ada di PATH, terminal tidak akan kenal perintah go. Buka file ~/.bashrc (atau ~/.zshrc kalau kamu pakai zsh), lalu tambahkan baris ini di paling bawah:

    export PATH=$PATH:/usr/local/go/bin

    Simpan, lalu muat ulang konfigurasi shell:

    source ~/.bashrc

    Kalau pakai zsh, ganti dengan source ~/.zshrc.

    Install Go di Windows

    Di Windows jauh lebih sederhana:

    • Buka go.dev/dl lalu unduh file installer berakhiran .msi untuk Windows.
    • Jalankan file itu dengan klik dua kali, lalu ikuti wizard-nya. Klik Next terus sampai selesai. Secara default Go terpasang di C:\Program Files\Go.
    • Installer ini otomatis mengatur PATH untukmu, jadi tidak ada langkah manual tambahan.

    Satu catatan penting: setelah instalasi selesai, tutup semua jendela Command Prompt atau PowerShell yang sedang terbuka, lalu buka yang baru. Terminal yang sudah terbuka sebelum instalasi belum membaca PATH yang baru.

    Install Go di macOS

    Kalau kamu sudah pakai Homebrew, satu perintah ini cukup:

    brew install go

    Homebrew akan mengurus PATH secara otomatis. Kalau belum pakai Homebrew, alternatifnya unduh installer .pkg dari go.dev/dl, klik dua kali, lalu ikuti wizard-nya seperti install aplikasi Mac pada umumnya.

    Verifikasi Instalasi

    Apa pun sistem operasinya, cara mengeceknya sama. Buka terminal baru, lalu ketik:

    go version

    Kalau instalasi berhasil, kamu akan melihat output kurang lebih seperti ini:

    go version go1.25.1 linux/amd64

    Nomor versi dan nama platformnya bisa berbeda sesuai apa yang kamu install. Yang penting perintah itu mengeluarkan versi, bukan pesan “command not found”. Kalau muncul “command not found” di Linux atau macOS, kemungkinan besar masalahnya di langkah PATH tadi. Cek lagi apakah baris export sudah tersimpan dan kamu sudah menjalankan source atau membuka terminal baru.

    Oh ya, kalau kamu sempat baca tutorial Go yang lama, mungkin kamu menemukan pembahasan panjang soal GOPATH dan struktur folder yang wajib diikuti. Abaikan saja. Sejak Go versi modern memakai sistem module, kamu bisa menaruh proyek di folder mana pun yang kamu suka. Tidak perlu setting tambahan apa-apa lagi setelah langkah instalasi di atas.

    Program Go Pertama: Hello World

    Sekarang bagian paling menyenangkan. Buat folder baru untuk latihan, misalnya halo-go, lalu masuk ke dalamnya:

    mkdir halo-go
    cd halo-go

    Buat file bernama main.go dengan teks editor favoritmu (VS Code juga boleh), lalu isi dengan kode ini:

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Halo, Go!")
    }

    Enam baris saja, tapi setiap barisnya punya makna. Mari kita bedah satu per satu.

    package main

    Setiap file Go wajib diawali deklarasi package. Package itu semacam label yang mengelompokkan file-file kode yang saling berhubungan. Nah, package main punya arti khusus: ini penanda bahwa program kamu adalah program yang bisa dijalankan langsung, bukan sekadar pustaka yang dipakai program lain. Anggap saja seperti label “pintu masuk utama” pada sebuah gedung.

    import “fmt”

    Baris ini mengambil package fmt dari pustaka standar Go. Nama fmt singkatan dari format, isinya fungsi-fungsi untuk mencetak dan memformat teks. Tanpa baris import ini, kamu tidak bisa memakai fmt.Println. Go bahkan menolak kompilasi kalau kamu meng-import package yang tidak dipakai. Ketat memang, tapi hasilnya kode kamu selalu bersih dari import sampah.

    func main()

    func adalah kata kunci untuk mendefinisikan fungsi. Fungsi bernama main di dalam package main adalah titik awal eksekusi program. Saat program dijalankan, Go langsung mencari fungsi ini dan mengeksekusi isinya baris per baris. Satu program hanya boleh punya satu func main.

    fmt.Println(“Halo, Go!”)

    Ini isi programnya: memanggil fungsi Println milik package fmt untuk mencetak teks ke layar, lalu pindah ke baris baru. Pola namaPackage.NamaFungsi ini akan sangat sering kamu temui di Go.

    Menjalankan Program: go run vs go build

    Ada dua cara menjalankan program Go, dan keduanya penting kamu pahami. Cara pertama, go run:

    go run main.go

    Outputnya:

    Halo, Go!

    Perintah go run mengompilasi kode ke file sementara, menjalankannya, lalu membuang hasil kompilasinya. Cocok untuk fase belajar dan development karena praktis: satu perintah, langsung lihat hasil.

    Cara kedua, go build:

    go build -o halo main.go

    Perintah ini mengompilasi kode dan menyimpan hasilnya sebagai file executable bernama halo (flag -o menentukan nama outputnya). Di Windows hasilnya halo.exe. Sekarang jalankan binary itu:

    ./halo

    Di Windows cukup ketik halo. Hasilnya sama: teks “Halo, Go!” muncul di layar.

    Bedanya apa? go run itu seperti masak lalu langsung makan di dapur. go build seperti masak lalu mengemas makanannya rapi dalam kotak, siap dibawa dan dimakan di mana saja. File hasil go build bisa kamu salin ke server atau komputer lain yang bahkan tidak punya Go terinstall, dan program tetap jalan. Inilah keunggulan “satu binary” yang saya sebut di awal, dan alasan kenapa deployment aplikasi Go terkenal simpel.

    Persiapan Bagian 2: go mod init

    Satu hal lagi sebelum kita tutup. Proyek Go modern selalu diawali dengan membuat module. Module itu semacam identitas proyek plus catatan dependency-nya, mirip peran package.json di dunia Node.js. Di dalam folder proyekmu, jalankan:

    go mod init halo-go

    Perintah ini membuat file go.mod yang berisi nama module dan versi Go yang dipakai. Untuk latihan lokal, nama module bebas. Nanti kalau proyekmu dipublikasikan, biasanya nama module memakai alamat repositori seperti github.com/username/nama-proyek. Untuk sekarang, cukup tahu bahwa setiap proyek Go yang serius dimulai dengan go mod init. Kita akan memakainya terus di sepanjang seri ini.

    Sampai Ketemu di Bagian 2

    Sampai di sini kamu sudah punya Go yang terpasang rapi, paham struktur dasar sebuah program Go, dan tahu bedanya go run dengan go build. Itu fondasi yang cukup kuat untuk melangkah.

    Di bagian berikutnya, “Belajar Golang dari Nol #2: Variabel, Tipe Data, dan Zero Value di Go”, kita mulai menulis kode yang sesungguhnya: menyimpan data, mengenal tipe-tipe bawaan Go, dan memahami konsep zero value yang membuat Go beda dari kebanyakan bahasa lain. Sambil menunggu, coba ubah-ubah program hello world tadi. Ganti teksnya, tambah baris Println lain, lalu build ulang. Membiasakan jari itu bagian dari belajar.

    Seri ini kami tulis dari pengalaman langsung, karena tim Arrazy memakai Go untuk membangun backend produksi milik klien lewat layanan pengembangan sistem aplikasi.

  • Cara Membuat Website Sekolah: 3 Jalur, Biaya, dan Langkahnya

    Cara Membuat Website Sekolah: 3 Jalur, Biaya, dan Langkahnya

    Ada tiga jalur untuk membuat website sekolah. Pertama, bikin sendiri pakai WordPress atau platform gratisan, modalnya sekitar Rp500 ribu sampai Rp1 juta per tahun untuk domain dan hosting, sisanya dibayar pakai waktu dan tenaga. Kedua, sewa platform website sekolah yang sudah jadi, biayanya sekitar Rp1 juta sampai Rp3 juta per tahun. Ketiga, pesan ke pengembang, biayanya mulai Rp3 juta sampai Rp15 juta sekali bangun, tergantung fitur yang diminta.

    Tidak ada jalur yang salah. Yang salah itu memilih jalur tanpa melihat kondisi SDM dan dana sekolah sendiri. Kami menulis panduan ini dari sisi yang jarang dibahas tutorial lain, yaitu pengalaman membangun website sekolah sungguhan untuk klien, salah satunya SMK Sekar Bumi Nusantara. Dari proyek seperti itu kami tahu persis bagian mana yang bikin proyek molor, fitur mana yang akhirnya tidak pernah dipakai, dan kesalahan apa yang paling sering terjadi setelah website jadi.

    Tiga jalur membuat website sekolah, dibandingkan jujur

    Sebelum masuk ke langkah teknis, tentukan dulu jalurnya. Tabel ini rangkuman dari yang kami lihat di lapangan.

    Aspek Bikin sendiri (WordPress) Platform sekolah jadi Pesan ke pengembang
    Biaya Rp500 ribu s.d. Rp1 juta per tahun Rp1 juta s.d. Rp3 juta per tahun Rp3 juta s.d. Rp15 juta sekali bangun
    Waktu sampai jadi 2 s.d. 8 minggu, tergantung waktu luang 1 s.d. 2 minggu 3 s.d. 6 minggu
    Hasil Tergantung kemampuan yang mengerjakan Rapi tapi seragam, template yang sama dipakai banyak sekolah Desain dan fitur mengikuti kebutuhan sekolah
    Beban perawatan Sepenuhnya di sekolah Server dirawat penyedia, konten tetap urusan sekolah Bisa dikontrakkan ke pengembang

    Jalur pertama cocok kalau sekolah punya guru TIK atau staf yang memang mau belajar dan diberi waktu untuk merawat website. Kata kuncinya bukan bisa, tapi mau dan sempat. Banyak guru TIK yang sebenarnya mampu, tapi jam mengajarnya sudah penuh.

    Jalur kedua cocok untuk sekolah yang butuh cepat online dengan anggaran rutin tahunan. Kelemahannya, tampilan dan fitur mengikuti template penyedia. Kalau suatu saat ingin pindah, proses migrasi data kadang tidak mudah karena data ada di sistem mereka.

    Jalur ketiga masuk akal kalau sekolah ingin website jadi wajah resmi lembaga, butuh fitur khusus seperti PPDB online, dan tidak punya SDM untuk urusan teknis. Dana BOS dan dana komite umumnya bisa dipakai untuk ini karena masuk kategori pengembangan sistem informasi sekolah, tinggal sesuaikan dengan juknis yang berlaku di daerah masing-masing. Sekolah swasta biasanya lebih leluasa karena bisa pakai dana yayasan atau komite.

    Rentang harga jalur ketiga memang lebar. Website profil sederhana ada di kisaran bawah, sedangkan angka belasan juta biasanya sudah termasuk fitur seperti PPDB online, halaman per jurusan, dan pelatihan admin. Yang perlu diwaspadai justru penawaran yang terlalu murah tanpa kejelasan siapa yang merawat setelah serah terima, karena di situlah banyak sekolah akhirnya terlantar.

    Urus domain sch.id dulu, jangan pakai .com

    Apa pun jalurnya, alamat website sekolah sebaiknya pakai domain sch.id, misalnya namasekolah.sch.id. Alasannya sederhana. Domain sch.id hanya bisa didaftarkan oleh lembaga pendidikan yang bisa menunjukkan dokumen resmi. Orang tua yang membuka website dengan alamat sch.id tahu bahwa situs itu benar milik sekolah, bukan situs abal-abal. Domain .com bisa dibeli siapa saja tanpa syarat, jadi nilai kepercayaannya lebih rendah untuk lembaga pendidikan.

    Secara umum, registrar yang mengikuti ketentuan PANDI meminta dua hal untuk pendaftaran sch.id:

    • KTP penanggung jawab domain, biasanya kepala sekolah atau staf yang ditunjuk
    • SK pendirian lembaga dari instansi berwenang, atau surat permohonan resmi bertanda tangan kepala sekolah dengan kop surat sekolah

    Detail persyaratan bisa sedikit berbeda antar registrar, jadi cek langsung di tempat Anda mendaftar. Prosesnya sendiri tidak lama. Setelah dokumen diunggah dan diverifikasi, domain biasanya aktif dalam satu sampai tiga hari kerja. Harganya murah, umumnya di bawah Rp100 ribu per tahun.

    Satu saran penting dari kami: daftarkan domain atas nama lembaga dengan email resmi sekolah, bukan email pribadi guru. Simpan juga salinan dokumen pendaftaran dan data akun registrar di arsip tata usaha. Alasannya kami bahas di bagian kesalahan umum, karena kehilangan akses domain adalah masalah yang paling merepotkan untuk dipulihkan.

    Siapkan konten dulu, ini yang paling sering bikin molor

    Ini bagian yang hampir tidak pernah dibahas tutorial lain. Dari pengalaman kami mengerjakan website sekolah, penyebab proyek molor hampir tidak pernah masalah teknis. Yang bikin lama itu menunggu konten dari pihak sekolah. Website sudah siap, tapi halaman profil masih kosong karena teks belum dikirim.

    Jadi sebelum menyentuh urusan teknis atau menghubungi pengembang, siapkan dulu bahan-bahan ini:

    • Profil sekolah: sejarah singkat, visi misi, dan akreditasi. Cukup 3 sampai 5 paragraf, tidak perlu panjang
    • Foto asli kegiatan sekolah. Upacara, praktikum, ekstrakurikuler, lomba. Foto asli jauh lebih meyakinkan daripada foto stok, walau kualitasnya foto HP biasa
    • Data guru dan staf yang boleh dipublikasikan. Minta izin dulu, karena tidak semua guru nyaman nama dan fotonya tampil di internet. Untuk foto siswa, terutama yang wajahnya terlihat jelas, sebaiknya ada persetujuan orang tua lewat surat edaran di awal tahun ajaran
    • Struktur organisasi terbaru
    • Kalender akademik tahun berjalan
    • Informasi PPDB: jadwal, syarat, alur pendaftaran, dan kontak panitia
    • Kontak resmi: alamat lengkap, nomor telepon aktif, email sekolah, dan titik lokasi di Google Maps

    Kalau bahan ini sudah lengkap sejak awal, jalur mana pun yang dipilih akan jalan jauh lebih cepat. Website yang kami kerjakan bisa selesai sesuai jadwal justru karena kliennya rajin menyetor konten.

    Struktur halaman minimal yang layak untuk website sekolah

    Website sekolah tidak perlu banyak halaman untuk terlihat profesional. Yang penting halaman intinya ada dan isinya terawat:

    • Beranda: identitas sekolah, foto unggulan, dan pengumuman terbaru
    • Profil: sejarah, visi misi, akreditasi, struktur organisasi
    • Guru dan staf
    • Berita dan agenda kegiatan
    • Galeri foto
    • Halaman PPDB atau pendaftaran
    • Kontak

    Daftar fitur yang lebih lengkap beserta prioritasnya sudah kami tulis di artikel fitur website sekolah yang wajib ada.

    Satu catatan jujur soal fitur. Ada beberapa fitur yang sering diminta di awal tapi jarang benar-benar dipakai setelah website jalan. Forum diskusi hampir selalu sepi karena semua orang sudah di grup WhatsApp. E-learning penuh di website sekolah biasanya kalah praktis dibanding Google Classroom yang sudah dipakai guru. Fitur yang terbukti paling berguna justru yang sederhana: pengumuman yang rutin diperbarui, galeri foto kegiatan, dan halaman PPDB yang jelas.

    Khusus PPDB online, fitur ini memang layak dipertimbangkan serius karena dipakai setiap tahun dan mengurangi antrean pendaftaran fisik. Penjelasan lengkapnya ada di artikel apa itu PPDB online.

    Langkah teknis kalau memilih bikin sendiri

    Kalau sekolah memutuskan jalur pertama, urutan kerjanya seperti ini:

    1. Beli hosting dan daftarkan domain sch.id. Paket hosting sekitar Rp300 ribu sampai Rp600 ribu per tahun sudah cukup untuk website sekolah biasa
    2. Install WordPress. Hampir semua penyedia hosting punya installer sekali klik
    3. Pilih tema yang sederhana dan ringan. Tema gratis bawaan WordPress pun tidak masalah, yang penting rapi dan cepat dibuka dari HP
    4. Buat halaman inti sesuai struktur di atas, isi dengan konten yang sudah disiapkan
    5. Pasang plugin backup otomatis dan aktifkan pembaruan keamanan. Dua hal ini sering dilewati, padahal paling penting

    Estimasi waktu 2 sampai 8 minggu itu bukan waktu kerja penuh, tapi realita orang mengerjakan ini di sela tugas utama. Kalau ada satu orang yang bisa fokus, dua minggu cukup.

    Setelah website tayang, ada dua langkah kecil yang sering dilupakan. Pertama, buka website dari HP dan minta beberapa rekan mencobanya juga, karena mayoritas orang tua mengakses dari ponsel. Kedua, daftarkan website ke Google Search Console supaya muncul di hasil pencarian ketika orang mengetik nama sekolah. Dua langkah ini gratis dan selesai dalam satu sore.

    Kapan jalur ini masuk akal? Kalau ada guru atau staf yang memang tertarik, diberi SK tugas yang jelas, dan sekolah sadar konsekuensinya: kalau orang itu pindah tugas, harus ada serah terima akses dan pengetahuan. Kalau syarat itu tidak terpenuhi, lebih aman ambil jalur platform sewa atau pengembang.

    Kesalahan umum setelah website jadi

    Membuat website itu baru setengah pekerjaan. Setengahnya lagi adalah merawatnya, dan di sinilah kebanyakan website sekolah gagal. Ini pola yang paling sering kami temui:

    Website tidak pernah diupdate. Berita terakhir dua tahun lalu, kalender akademik masih tahun ajaran lama. Website seperti ini justru menurunkan citra sekolah di mata orang tua. Solusinya bukan teknologi, tapi penugasan: tunjuk satu admin resmi dengan SK, lalu buat jadwal posting minimal dua konten per bulan. Dokumentasi kegiatan sekolah selalu ada, tinggal difoto dan ditulis tiga paragraf.

    Akun penting pakai email pribadi. Domain, hosting, dan admin website didaftarkan pakai Gmail pribadi seorang guru. Ketika guru itu mutasi atau resign, sekolah kehilangan akses ke websitenya sendiri. Kasus seperti ini nyata dan sering. Selalu pakai email resmi sekolah yang kredensialnya dipegang lembaga, bukan perorangan.

    Tidak ada backup. Website kena hack atau server bermasalah, dan seluruh konten bertahun-tahun hilang karena tidak pernah ada cadangan. Backup otomatis mingguan itu gratis lewat plugin, cukup sekali setting. Simpan salinannya di luar server, misalnya di Google Drive milik akun sekolah, supaya kalau servernya yang bermasalah, cadangannya tetap aman.

    Konten hasil salin tempel. Beberapa website sekolah mengisi halaman berita dengan artikel yang disalin dari situs lain agar terlihat aktif. Ini percuma. Orang tua mencari kabar sekolah anaknya, bukan artikel umum yang bisa mereka temukan di mana saja. Tiga paragraf tentang lomba antar kelas jauh lebih berharga daripada sepuluh artikel salinan.

    Biaya perawatan tahunan dan kapan sebaiknya ke pengembang

    Website sekolah punya biaya rutin yang perlu masuk anggaran tahunan. Rinciannya kira-kira begini:

    • Perpanjangan domain sch.id: di bawah Rp100 ribu per tahun
    • Perpanjangan hosting: Rp300 ribu sampai Rp600 ribu per tahun
    • Perawatan teknis kalau dikontrakkan: Rp500 ribu sampai Rp2 juta per tahun, mencakup update sistem, backup, pemantauan keamanan, dan perbaikan ketika ada error

    Kalau dirawat sendiri, biaya perawatan teknis nol rupiah, tapi tugasnya tetap harus dikerjakan seseorang: update WordPress dan plugin tiap bulan, cek backup jalan atau tidak, dan memperbaiki kalau ada halaman rusak.

    Lalu kapan sebaiknya langsung ke pengembang? Menurut kami, jalur ini paling masuk akal dalam tiga kondisi. Pertama, sekolah butuh fitur di luar kemampuan template, misalnya PPDB online dengan verifikasi berkas dan pengumuman hasil seleksi. Kedua, tidak ada SDM yang bisa ditugaskan mengurus teknis dalam jangka panjang. Ketiga, sekolah ingin tampilan yang mencerminkan identitasnya sendiri, bukan template yang sama dengan puluhan sekolah lain.

    Kalau kondisi sekolah Anda masuk salah satu dari tiga itu, silakan lihat layanan jasa pembuatan website sekolah dari kami. Di sana ada rincian paket, harga, dan apa saja yang termasuk perawatan. Kalau belum, tidak apa-apa. Mulai saja dari jalur yang sesuai kemampuan sekarang, karena website sederhana yang terawat selalu lebih baik daripada website canggih yang terbengkalai.

    Pertanyaan yang sering ditanyakan

    Berapa biaya membuat website sekolah?

    Tergantung jalurnya. Bikin sendiri sekitar Rp500 ribu sampai Rp1 juta per tahun untuk domain dan hosting. Sewa platform jadi sekitar Rp1 juta sampai Rp3 juta per tahun. Pesan ke pengembang mulai Rp3 juta sampai Rp15 juta sekali bangun, ditambah biaya perawatan tahunan kalau dikontrakkan.

    Apakah website sekolah bisa dibuat gratis?

    Bisa, pakai Google Sites atau WordPress.com versi gratis. Tapi alamatnya bukan sch.id dan ada batasan fitur serta iklan. Untuk website resmi lembaga pendidikan, kami sarankan minimal keluar biaya domain sch.id dan hosting, karena alamat resmi itu yang membuat orang tua percaya.

    Berapa lama proses pembuatan website sekolah?

    Kalau konten sudah disiapkan lengkap, platform sewa bisa online dalam 1 sampai 2 minggu, pengembang butuh 3 sampai 6 minggu, dan bikin sendiri 2 sampai 8 minggu tergantung waktu luang pengerjanya. Faktor penentu terbesar bukan teknis, tapi kecepatan sekolah menyiapkan konten.

  • Footer Kecil Tapi Pengaruh Besar, Ini Tips Desain Footer Website yang Rapi

    Footer Kecil Tapi Pengaruh Besar, Ini Tips Desain Footer Website yang Rapi

    Jasa Pembuatan Website – Lagi bingung bikin bagian bawah website yang nggak bikin mata capek? Nah, Tips Desain Footer Website yang Rapi itu penting banget, bestie. Footer tuh ibarat penutup drama yang menentukan penonton bakal tepuk tangan atau malah kabur pelan-pelan. Banyak website keren di atas, tapi pas bawahnya malah kayak gudang kabel kusut.

    Duh, vibes-nya langsung turun kayak sinyal pas hujan deras. Makanya kamu wajib ngerti cara bikin footer yang estetik, jelas, dan nyaman dipandang. Yuk, cus baca Tips Desain Footer Website yang Rapi ini sampai habis biar websitemu makin keren dan nggak malu-maluin!

    1. Pakai Warna yang Kalem Tapi Tetap Hidup

    Tips Desain Footer Website Yang Rapi pertama adalah jangan asal tabrak warna. Footer terlalu rame bikin mata pengunjung dilempar glitter satu ember. Pilih warna yang senada sama tema website kamu. Kalau dominan putih, kasih footer abu gelap atau navy biar elegan. Kalau website penuh warna cerah, footer hitam bisa jadi penyeimbang yang manis. Jangan lupa, teks juga wajib kebaca jelas. Website itu bukan teka-teki silang, ya kan?

    2. Jangan Numpuk Informasi Kayak Lemari Diskonan

    Kadang ada yang masukin semua isi dunia ke footer. Link numpuk, tulisan kecil, ikon bertabrakan, hasilnya malah bikin pusing tujuh keliling. Tips Desain Footer Website Yang Rapi berikutnya adalah pilih informasi yang benar-benar penting. Masukkan kontak, alamat, navigasi utama, dan media sosial secukupnya. Footer yang bersih tuh ibarat kamar habis diberesin, adem dilihat dan bikin betah.

    3. Gunakan Font Simpel dan Mudah Dibaca

    Percuma desain kece kalau tulisannya bikin mata julid. Pilih font yang sederhana dan ukuran nyaman. Jangan pakai huruf meliuk-liuk kayak tanda tangan mantan. Tips Desain Footer Website Yang Rapi ini sering diremehin padahal efeknya gede banget. Pengunjung lebih nyaman membaca informasi saat tampilannya jelas. Apalagi kalau mereka buka website lewat HP sambil rebahan, duh jangan bikin mereka nyerah duluan.

    Baca juga: Jasa Landing page Purwokerto copywriting Bikin Jualan Kamu Auto Meledak

    4. Beri Jarak Antar Elemen Biar Nggak Sesak

    Footer sempit dengan isi padat tuh rasanya kayak naik angkot jam pulang kerja. Semua berhimpitan tanpa napas. Tips Desain Footer Website Yang Rapi selanjutnya adalah kasih ruang kosong antar elemen. White space itu bukan musuh, malah bikin tampilan lebih premium. Saat jarak antar teks dan ikon rapi, website kamu bakal terasa lebih profesional dan mahal.

    5. Tambahkan Call To Action yang Nggak Maksa

    Footer juga bisa dipakai buat ngajak pengunjung melakukan sesuatu. Misalnya ajakan kontak, langganan newsletter, atau konsultasi bisnis. Tips Desain Footer Website Yang Rapi ini bikin footer nggak cuma jadi pajangan.

    Kamu juga bisa masukin kalimat tentang Arrazy Inovasi. Arrazy Inovasi tuh jasa terpercaya untuk transformasi digital bisnis, menghadirkan solusi teknologi inovatif yang membantu bisnis tumbuh dan berkembang. Kalimat itu bisa jadi magnet yang diam-diam menarik perhatian.

    6. Pastikan Footer Tetap Responsive

    Kadang footer cakep di laptop, eh pas dibuka di HP malah berantakan kayak mi jatuh. Tips Desain Footer Website Yang Rapi berikutnya adalah wajib cek tampilannya di semua perangkat. Pastikan ukuran teks, ikon, dan jaraknya tetap nyaman. Pengunjung zaman sekarang maunya serba cepat dan praktis. Kalau footer aja bikin ribet, mereka bisa kabur tanpa pamit.

    Kesimpulan

    Pada akhirnya, Tips Desain Footer Website Yang Rapi bukan cuma soal estetika, tapi juga soal kenyamanan pengunjung. Footer yang bersih bikin website terasa lebih niat, lebih profesional, dan lebih dipercaya. Jangan takut bikin desain sederhana karena kadang yang simpel malah paling mencolok di tengah dunia digital berisik. Dan kalau kamu pengen bisnis makin naik level, kenalan sama Arrazy Inovasi.

    Arrazy Inovasi tuh jasa terpercaya untuk transformasi digital bisnis, menghadirkan solusi teknologi inovatif yang membantu bisnis tumbuh dan berkembang. Jadi, jangan cuma bikin website asal jadi, ya!

  • Ini Dia Fungsi Meta Title Untuk Klik Search yang Sering Diremehkan Tapi Efeknya Gila

    Ini Dia Fungsi Meta Title Untuk Klik Search yang Sering Diremehkan Tapi Efeknya Gila

    Jasa Pembuatan Website – Fungsi Meta Title Untuk Klik Search itu ibarat papan neon yang nyala paling terang di tengah jalan ramai. Orang yang lagi scrolling hasil pencarian bakal lebih cepat nengok kalau judulnya bikin penasaran, jelas, dan nyentil rasa ingin tahu.

    Banyak website tenggelam cuma gara-gara judulnya hambar kayak kerupuk kena hujan. Padahal, Fungsi Meta Title Untuk Klik Search bisa bantu website kamu lebih dilirik calon pengunjung dalam hitungan detik. Nah, biar website kamu nggak cuma lewat kayak angin sore, yuk lanjut baca sampai habis apa aja fungsi meta title untuk klik search ini!

    1. Bikin Orang Auto Pencet Website

    Fungsi Meta Title Untuk Klik Search yang paling terasa ada di bagian klik. Saat orang cari sesuatu di mesin pencari, mata mereka langsung nyangkut ke judul. Kalau judulnya padat, unik, dan relate, peluang diklik jadi makin gede. Meta title tuh kayak etalase toko. Kalau tampilannya kusam, orang malas mampir. Tapi kalau menarik, rasanya pengunjung kayak ditarik magnet.

    2. Bantu Website Lebih Gampang Naik

    Selain bikin klik naik, Fungsi Meta Title Untuk Klik Search juga bantu mesin pencari memahami isi halaman. Judul yang tepat bikin algoritma lebih mudah mengenali topik website kamu. Jadi jangan asal bikin judul cuma demi keren. Kata-kata yang terlalu lebay malah bisa bikin halaman susah bersaing. Kadang hal kecil kayak meta title justru jadi penentu antara page satu atau tenggelam di halaman belakang.

    Baca juga: Konsultan website Purwokerto strategi, Trik Gokil Biar Bisnismu Auto Melejit Tanpa Ribet!

    3. Membantu Branding Bisnis

    Website tanpa identitas itu mirip kopi tanpa gula, pahit dan gampang dilupakan. Fungsi Meta Title Untuk Klik Search bisa memperkuat branding karena nama bisnis kamu tampil langsung di hasil pencarian. Orang jadi lebih familiar dan perlahan mulai percaya. Kalau dipadukan dengan strategi digital yang rapi, hasilnya bisa bikin bisnis makin bersinar kayak lampu kota tengah malam.

    4. Membuat Pengunjung Lebih Tepat Sasaran

    Meta title yang jelas bikin pengunjung datang dengan tujuan yang sesuai. Fungsi Meta Title Untuk Klik Search membantu menyaring audiens supaya yang masuk memang benar-benar butuh informasi atau produk kamu. Jadi traffic nggak cuma ramai doang, tapi juga berkualitas. Rasanya kayak buka pintu buat tamu yang memang udah niat datang, bukan sekadar numpang lewat.

    5. Menambah Peluang Penjualan

    Banyak orang mikir penjualan cuma soal produk bagus. Padahal, Fungsi Meta Title Untuk Klik Search juga punya pengaruh besar ke omzet. Kalau judul berhasil menarik perhatian, pengunjung masuk ke website, lalu peluang transaksi ikut terbuka. Dari satu klik kecil, bisa muncul pelanggan baru. Efeknya kadang pelan, tapi terus jalan kayak ombak yang nggak capek nyentuh pantai.

    Jangan Asal Bikin Meta Title!

    Masih banyak pemilik website yang bikin judul terlalu panjang, muter-muter, bahkan nggak nyambung dengan isi artikel. Padahal, Fungsi Meta Title Untuk Klik Search bakal terasa maksimal kalau judul dibuat singkat, natural, dan memancing rasa penasaran. Jangan kebanyakan simbol aneh karena malah bikin hasil pencarian terlihat berantakan.

    Coba bayangin orang lagi buru-buru cari jawaban, lalu ketemu judul yang ribet kayak benang kusut. Pasti langsung dilewati. Makanya, penting banget meracik meta title dengan gaya yang santai tapi tetap jelas supaya pengunjung nyaman sejak klik pertama. Percayakan ke Arrazy.

    Kesimpulan

    Fungsi Meta Title Untuk Klik Search bukan cuma tempelan kata di mesin pencari. Bagian kecil ini bisa jadi pintu awal yang membawa pengunjung masuk ke website kamu. Kalau dikelola dengan benar, peluang traffic, branding, sampai penjualan bisa ikut meningkat.

    Buat kamu yang pengen bisnis makin berkembang di era digital, Arrazy Inovasi tuh jasa terpercaya untuk transformasi digital bisnis, menghadirkan solusi teknologi inovatif yang membantu bisnis tumbuh dan berkembang. Jadi, jangan cuma bikin website asal jadi, tapi maksimalkan juga Fungsi Meta Title Untuk Klik Search supaya klik terus berdatangan.