Selasa, 06 Januari 2026

Website Pemesanan Tiket Kereta - SpoorGo

 

Peran Saya dalam Project SpoorGo

SpoorGo adalah aplikasi pemesanan tiket kereta api berbasis web yang dikembangkan dengan teknologi modern Laravel 12, Livewire 3, dan Laravel Reverb untuk fitur realtime. Aplikasi ini dirancang untuk memberikan pengalaman pengguna yang cepat, aman, dan intuitif dalam mencari jadwal kereta (baik antarkota maupun lokal), memilih kursi, melakukan pembayaran melalui dompet digital internal, serta menyediakan dashboard khusus bagi operator untuk manajemen operasional di lapangan.

Sebagai Project Manager, saya bertanggung jawab penuh atas keseluruhan siklus pengembangan SpoorGo, mulai dari tahap perencanaan kebutuhan, pembuatan roadmap, koordinasi tim pengembang, pengelolaan timeline, hingga memastikan proyek dapat diselesaikan tepat waktu dan sesuai dengan visi yang telah ditetapkan.

Di samping peran manajerial tersebut, saya juga turun tangan langsung sebagai Backend Developer untuk bagian-bagian krusial, terutama dalam pengembangan:

  • Logika server-side yang kompleks
  • Integrasi berbagai API eksternal
  • Pengolahan data transaksi & dompet digital
  • Sistem keamanan autentikasi (termasuk OTP dan Google OAuth)
  • Optimasi performa query database serta caching

Saat ini, SpoorGo telah berhasil di-deploy dan dapat diakses secara publik melalui subdomain resmi: https://spoorgo.healtech-aoen.com

Aplikasi ini merupakan bagian dari ekosistem HealTech — sebuah pryek dari organisasi mahasiswa Informatika Institut Teknologi Sains dan Kesehatan RS dr. Soepraoen yang bertujuan mengembangkan solusi teknologi untuk berbagai kebutuhan nyata, termasuk di bidang transportasi publik.

Fitur Utama SpoorGo (Ringkasan)

  • Pencarian & pemesanan tiket kereta (intercity & lokal)
  • Pemilihan kursi secara visual
  • Sistem dompet digital dengan top-up & riwayat transaksi
  • Autentikasi aman: Email + Password, Google OAuth, OTP untuk reset password
  • Fitur realtime menggunakan Laravel Reverb (notifikasi saldo, update kursi, dll)
  • Dashboard operator dengan hak akses terbatas (RBAC)
  • Scan log aktivitas boarding (untuk operator di lapangan)
  • UI responsif berbasis Livewire (tanpa banyak JavaScript custom)

Selanjutnya, saya akan menjelaskan beberapa file & struktur utama yang menjadi pondasi teknis dari aplikasi ini, mulai dari konfigurasi environment hingga organisasi kode.

1. File .env (Konfigurasi Environment) File .env merupakan pusat pengaturan konfigurasi aplikasi Laravel. 1.1 Konfigurasi Aplikasi Utama APP_NAME=SpoorGo APP_ENV=local APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx APP_DEBUG=true APP_URL=https://spoorgo.healtech-aoen.com Penjelasan: • APP_NAME → Nama aplikasi (digunakan di title, email, dll) • APP_ENV → Lingkungan aplikasi (local/staging/production) • APP_KEY → Kunci enkripsi utama Laravel (wajib ada) • APP_DEBUG → Tampilkan detail error (aktif hanya saat development) • APP_URL → URL utama aplikasi (penting untuk link & OAuth) 1.2 Pengaturan Lokal & Bahasa APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US 1.3 Logging & Keamanan Dasar BCRYPT_ROUNDS=12 LOG_CHANNEL=stack LOG_LEVEL=debug 1.4 Database (SQLite) DB_CONNECTION=sqlite Catatan: File database berada di database/database.sqlite Cocok untuk prototype, demo, atau pengembangan awal. 1.5 Session SESSION_DRIVER=file SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_SECURE_COOKIE=false 1.6 Cache & Queue CACHE_STORE=file QUEUE_CONNECTION=database 1.7 Realtime / Broadcasting (Laravel Reverb) BROADCAST_CONNECTION=reverb REVERB_APP_ID=my-app-id REVERB_APP_KEY=my-app-key REVERB_APP_SECRET=my-app-secret REVERB_HOST=localhost REVERB_PORT=8080 REVERB_SCHEME=http 1.8 Pengiriman Email (SMTP Gmail) MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=centralhisulive@gmail.com MAIL_PASSWORD=******** MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=centralhisulive@gmail.com MAIL_FROM_NAME="SpoorGo!" 1.9 OAuth Google Login GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=xxxx GOOGLE_REDIRECT_URI=https://spoorgo.healtech-aoen.com/auth/google/redirect Catatan: Redirect URI harus sama persis dengan yang didaftarkan di Google Cloud Console. 1.10 Variabel Frontend (Vite) VITE_APP_NAME="${APP_NAME}"


2. File composer.json 2.1 Informasi Dasar Proyek "name": "laravel/laravel", "type": "project", "description": "The skeleton application for the Laravel framework.", "license": "MIT" 2.2 Dependensi Utama "require": { "php": "^8.2", "laravel/framework": "^12.0", "laravel/reverb": "^1.0", "laravel/socialite": "^5.14", "laravel/tinker": "^2.9", "livewire/livewire": "^3.0" } Fungsi utama: • Laravel core framework • Reverb → realtime websocket • Socialite → OAuth Google • Livewire → UI interaktif tanpa banyak JavaScript 2.3 Script Otomatis Setup Awal (yang biasa dijalankan) composer install cp .env.example .env php artisan key:generate php artisan migrate npm install npm run build 


3. File routes/web.php (Routing Utama) Struktur Route SpoorGo: • Guest (belum login) - / - /login - /register - /forgot-password - /verify-otp - /reset-password • Google OAuth - /auth/google/start - /auth/google/callback - /auth/google/redirect • Semua route yang memerlukan login dilindungi: Route::middleware('auth')->group(function () { ... }); • Modul Kereta (prefix: /train) - Jadwal intercity & local - Pilih kursi - Checkout - Invoice • Modul Dompet (prefix: /wallet) - Top up - Riwayat transaksi - Debit (dummy untuk testing) • Area Operator (dilindungi middleware OperatorAccess) - Dashboard - Scan log - Manajemen user - Kelola jadwal & kursi - Manajemen stasiun 


4. Daftar Model Utama (folder app/Models) • User • Ticket • Order • Schedule • Seat • Station • OtpCode • TopUpHistory • ScanLog • PaymentSystem (dummy) 


5. Struktur Controller (folder app/Http/Controllers) Dikelompokkan berdasarkan domain/fitur: • AuthController    → login, register, google oauth • ForgotPasswordController     → reset password + OTP • TicketController    → pencarian jadwal, pemesanan • CheckoutController    → proses pembayaran & invoice • WalletController    → top up, riwayat dompet • Operator/DashboardController • Operator/ScanController • Operator/UserController • Operator/ScheduleController • FaceVerificationController


6. Folder database/migrations

Folder database/migrations berisi seluruh file skema database aplikasi SpoorGo. Setiap file migration merepresentasikan perubahan struktur tabel dan dijalankan secara berurutan berdasarkan timestamp pada nama filenya.

Pendekatan migration memastikan:

  • Konsistensi struktur database di semua environment
  • Kemudahan rollback jika terjadi masalah
  • Tracking riwayat perubahan database secara historis
  • Kolaborasi tim yang lebih aman

Berikut adalah daftar migration utama yang digunakan dalam proyek SpoorGo, dikelompokkan berdasarkan fungsi:

6.1 Migration Default Laravel (Core Framework)

  • 0001_01_01_000000_create_users_table.php Tabel utama untuk autentikasi pengguna Kolom penting: id, name, email, password, remember_token, created_at, updated_at
  • 0001_01_01_000001_create_cache_table.php Tabel untuk menyimpan cache aplikasi (file atau database driver)
  • 0001_01_01_000002_create_jobs_table.php Tabel untuk antrian job/queue Digunakan untuk proses asynchronous seperti pengiriman email, OTP, dan notifikasi

6.2 Master Data (Data Dasar Perkeretaapian)

  • 2025_12_11_070421_create_stations_table.php Tabel stasiun kereta api Kolom utama: name, code, city, region, is_active
  • 2026_01_07_044208_create_trains_table.php Tabel data kereta (kereta api itu sendiri) Digunakan sebagai referensi pada jadwal dan kursi

6.3 Logging & Keamanan

  • 2025_12_13_095108_create_scan_logs_table.php Mencatat setiap aktivitas scan tiket oleh operator (QR / Face Recognition)
  • 2026_01_04_040120_create_login_logs_table.php Log aktivitas login pengguna (untuk audit keamanan)
  • 2026_01_07_040221_add_type_to_scan_logs_table.php Menambahkan kolom type (QR, Face, Gate, Manual)
2026_01_06_193000_add_timestamps_to_scan_logs_table.php Penambahan created_at & updated_at pada scan_logs

6.4 Jadwal & Relasi Stasiun

  • 2026_01_05_043422_create_schedules_table.php Tabel jadwal perjalanan kereta
  • 2026_01_05_043423_create_jadwal_stasiun_table.php Pivot table (many-to-many) antara jadwal dan stasiun Menentukan urutan: stasiun asal → transit → tujuan
  • 2026_01_07_040410_add_train_type_to_schedules.php Menambahkan kolom train_type (Intercity / Lokal) untuk filtering

6.5 Kursi & Tiket

  • 2026_01_05_043425_create_seats_table.php Tabel kursi per kereta per jadwal Status: available, occupied, locked (saat checkout)
  • 2026_01_06_200923_create_tickets_table.php Tabel tiket yang sudah dibeli pengguna Relasi ke: user, schedule, seat
  • 2026_01_07_041500_enhance_tickets_table.php Penambahan kolom tambahan: status tiket, metadata, dll
  • 2026_01_06_200000_create_ticket_verifications_table.php Mencatat hasil verifikasi tiket saat scan di gate/stasiun

6.6 Transaksi & Pembayaran

  • 2026_01_05_043423_create_orders_table.php Tabel transaksi checkout (order ≠ ticket) Berisi informasi sebelum pembayaran selesai
  • 2026_01_05_043424_create_payments_table.php Log detail pembayaran setiap order
  • 2026_01_05_043425_create_payment_systems_table.php Tabel simulasi metode pembayaran (dummy debit, siap ekspansi ke QRIS/e-wallet)
  • 2026_01_06_195426_create_top_up_histories_table.php Riwayat top-up saldo dompet pengguna

6.7 User Enhancement & Keamanan Tambahan

  • 2026_01_05_080140_add_face_photo_to_users_table.php Kolom untuk menyimpan path foto wajah (face verification)
  • 2026_01_05_085500_add_membership_type_column.php Kolom membership_type (dasar fitur premium di masa depan)
  • 2026_01_06_183936_add_google_fields_to_users_table.php Kolom google_id, provider untuk integrasi Google OAuth
  • 2026_01_06_195426_add_balance_to_users_table.php Kolom balance untuk saldo dompet digital SpoorGo Pay
  • 2026_01_06_210000_create_otp_codes_table.php Tabel penyimpanan kode OTP (reset password, verifikasi email

7. File check_db_status.php

File ini adalah script diagnostik mandiri yang berjalan langsung melalui terminal (CLI) tanpa melalui route atau controller Laravel. Fungsi utama:

  • Memverifikasi koneksi database SQLite berjalan normal
  • Mengecek keberadaan tabel-tabel krusial
  • Melihat struktur kolom tanpa harus masuk ke aplikasi
  • Membantu debugging cepat saat proses deployment atau troubleshooting Struktur utama script:
PHP<?php // 1. Memuat autoload Composer & bootstrap Laravel require __DIR__.'/vendor/autoload.php'; $app = require_once __DIR__.'/bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); // 2. Mengecek keberadaan tabel cache (sebagai indikator migration berhasil) $tables = DB::select("SELECT name FROM sqlite_master WHERE type='table' AND name='cache'"); echo "Table 'cache' exists: " . (count($tables) > 0 ? 'YES' : 'NO') . PHP_EOL; // 3. Menampilkan struktur kolom tabel cache if (count($tables) > 0) { $columns = DB::select("PRAGMA table_info(cache)"); echo "\nStruktur kolom tabel cache:\n"; foreach ($columns as $col) { echo "- {$col->name} ({$col->type}) " . ($col->pk ? "[PK]" : "") . ($col->notnull ? "" : "[nullable]") . PHP_EOL; } } // 4. Penanganan error try { // Kode di atas sudah cukup aman, tapi bisa ditambah pengecekan koneksi DB::connection()->getPdo(); echo "\nKoneksi database: OK\n"; } catch (Exception $e) { echo "\nError koneksi database: " . $e->getMessage() . "\n"; }


Keuntungan Menggunakan SpoorGo

  • Hemat waktu: Tidak perlu antre atau datang ke loket
  • Lebih efisien: Perencanaan perjalanan jadi lebih mudah dengan data akurat
  • Aman & transparan: Pembayaran digital + riwayat jelas
  • Personalisasi: Data tersimpan, proses booking lebih simpel
  • Ramah lingkungan: Kurangi penggunaan kertas tiket

Konteks Akademik & Relevansi SpoorGo Dalam dunia pendidikan teknologi informasi, SpoorGo menjadi studi kasus nyata tentang penerapan sistem informasi terintegrasi untuk layanan publik. Mahasiswa bisa mempelajari bagaimana antarmuka pengguna, database, keamanan, dan manajemen proyek bersatu dalam satu aplikasi. Proyek ini juga relevan dengan tema transformasi digital, user experience, dan inovasi teknologi untuk masyarakat. Untuk informasi lebih lanjut terkait Informatika Soepraoen <https://informatika.itsk-soepraoen.ac.id/>

Sebagai Project Manager & Backend Developer di baliknya, saya bangga melihat SpoorGo menjadi salah satu bentuk kontribusi nyata dalam memajukan teknologi informasi untuk kebutuhan sehari-hari.

Selamat mencoba SpoorGo di https://spoorgo.healtech-aoen.com/ Link Youtube untuk penjelasan lebih detail https://youtu.be/BPgaGfGtr24

Senin, 27 Oktober 2025

Panduan Lengkap: Perintah Dasar Ubuntu untuk Pemula

Panduan Lengkap: Perintah Dasar Ubuntu


Tanggal: 28 Oktober 2025




Ubuntu, sebagai salah satu distribusi Linux paling populer di dunia, menawarkan antarmuka grafis yang ramah pengguna. Namun, untuk efisiensi maksimal, penguasaan terminal (atau command line interface) menjadi keterampilan esensial bagi administrator sistem, pengembang, dan pengguna tingkat lanjut. Terminal memungkinkan eksekusi perintah secara cepat, otomatisasi tugas, dan akses fitur mendalam yang tidak tersedia melalui GUI.

Artikel ini menyajikan panduan lengkap perintah dasar Ubuntu, dikelompokkan berdasarkan fungsi, dengan penjelasan detail, sintaks, contoh penggunaan, dan output tipikal. Semua contoh diuji pada Ubuntu 24.04 LTS (atau versi terbaru). Untuk memulai, buka terminal dengan menekan Ctrl + Alt + T.


1. Navigasi Direktori Dasar

Perintah ini membantu berpindah dan memeriksa lokasi dalam sistem file.

Perintah

Deskripsi

Sintaks

Contoh

pwd

Menampilkan direktori kerja saat ini (Print Working Directory).

pwd

$ pwd /home/user

ls

Mendaftar isi direktori. Opsi: -l (detail), -a (tersembunyi), -h (ukuran human-readable).

ls [opsi] [direktori]

$ ls -la drwxr-xr-x 2 user user 4096 Oct 28 10:00 . -rw-r--r-- 1 user user 123 Oct 28 09:00 file.txt

cd

Berpindah direktori. ~ = home, .. = parent, / = root.

cd [path]

$ cd /home $ cd ~ (kembali ke home) $ cd ..

Penjelasan Detail ls: Perintah ls -la menampilkan izin file (drwxr-xr-x: d=direktori, rwx=read/write/execute untuk owner/group/others), pemilik, ukuran, tanggal modifikasi, dan nama. Ini krusial untuk debugging izin akses.


2. Manajemen File dan Direktori

Buat, salin, pindah, atau hapus file/direktori.

Perintah

Deskripsi

Sintaks

Contoh

mkdir

Buat direktori baru. -p = buat nested tanpa error.

mkdir [opsi] nama

$ mkdir -p /home/user/proyek/baru

touch

Buat file kosong atau update timestamp.

touch nama_file

$ touch catatan.txt

cp

Salin file/direktori. -r = rekursif untuk direktori.

cp [opsi] sumber tujuan

$ cp file.txt /backup/

mv

Pindah atau rename file/direktori.

mv sumber tujuan

$ mv lama.txt baru.txt

rm

Hapus file/direktori. -r = rekursif, -f = force (tanpa konfirmasi). Hati-hati! Tidak ada Recycle Bin.

rm [opsi] nama

$ rm -rf /direktori_lama

Tips Keamanan rm: Selalu gunakan rm -i untuk konfirmasi interaktif pada file sensitif. Hindari rm -rf / yang akan menghapus seluruh sistem!


3. Melihat dan Mengedit Isi File

Akses konten file tanpa editor grafis.

Perintah

Deskripsi

Sintaks

Contoh

cat

Tampilkan seluruh isi file.

cat nama_file

$ cat /etc/hosts 127.0.0.1 localhost

less

Tampilkan file secara pager (scroll dengan panah, q=keluar).

less nama_file

$ less log.txt

head

Tampilkan baris awal. -n 10 = 10 baris pertama.

head [opsi] nama_file

$ head -5 /var/log/syslog

tail

Tampilkan baris akhir. -f = follow (real-time).

tail [opsi] nama_file

$ tail -f /var/log/auth.log (pantau login)

nano

Editor teks sederhana. Ctrl+O = simpan, Ctrl+X = keluar.

nano nama_file

$ nano config.conf

Penjelasan tail -f: Berguna untuk monitoring log secara real-time, seperti saat debugging server web.


4. Manajemen Paket dengan APT

Ubuntu menggunakan APT untuk instalasi/update paket.

Perintah

Deskripsi

Sintaks

Contoh

apt update

Perbarui daftar paket dari repository.

sudo apt update

Selalu jalankan sebelum upgrade.

apt upgrade

Upgrade semua paket terinstal.

sudo apt upgrade

Konfirmasi dengan Y.

apt install

Instal paket baru.

sudo apt install nama_paket

$ sudo apt install vim htop

apt remove

Hapus paket (biarkan config).

sudo apt remove nama_paket

 

apt autoremove

Hapus paket tidak terpakai.

sudo apt autoremove

 

apt search

Cari paket.

apt search kata_kunci

$ apt search editor

Catatan: Prefix sudo untuk hak admin. Masukkan password saat diminta.


5. Manajemen Proses

Pantau dan kendalikan proses yang berjalan.

Perintah

Deskripsi

Sintaks

Contoh

ps aux

Daftar semua proses.

ps aux

Tampilkan PID, CPU, MEM, command.

top / htop

Monitor real-time (instal htop untuk UI lebih baik).

top (q=keluar)

kill

Hentikan proses berdasarkan PID. -9 = force.

kill [opsi] PID

$ kill 1234 $ kill -9 1234

pkill

Hentikan berdasarkan nama proses.

pkill nama_proses

$ pkill firefox

Cara Dapat PID: Gunakan ps aux | grep nama_proses.


6. Perintah Bantuan dan Utilitas Lainnya

  • man perintah: Manual lengkap (q=keluar). Contoh: man ls.
  • perintah --help: Bantuan singkat. Contoh: ls --help.
  • clear: Bersihkan layar terminal.
  • history: Lihat riwayat perintah (!n = ulangi nomor n).
  • df -h: Ruang disk human-readable.
  • free -h: Memori RAM tersedia.
  • uname -a: Info sistem.


Kesimpulan

Menguasai perintah dasar Ubuntu membuka pintu menuju otomatisasi skrip Bash, server management, dan pengembangan DevOps. Latihan adalah kunci: Coba setiap perintah di direktori aman seperti ~/latihan. Untuk mendalami, pelajari Bash scripting atau ikuti kursus resmi Ubuntu.

Sumber Daya Tambahan:

Disclaimer: Selalu backup data sebelum menjalankan perintah destruktif seperti rm. Gunakan sudo dengan bijak untuk menghindari kerusakan sistem.

 











Sabtu, 11 Oktober 2025

Langkah - langkah install OS Ubuntu dekstop di VirtualBox

Langkah 1: Download File ISO Ubuntu

Pertama, kita perlu mengunduh file ISO Ubuntu Linux sebagai sistem operasi yang akan diinstal.

  1. Buka situs: https://www.nesabamedia.com/download-ubuntu-linux-iso/

  2. Scroll ke bawah hingga menemukan tombol “Download Now”, lalu klik.

  3. Kamu akan diarahkan ke halaman download — tunggu hingga file ISO selesai diunduh.




Langkah 2: Download VirtualBox Oracle

Selanjutnya, kita butuh aplikasi VirtualBox sebagai media untuk menjalankan Ubuntu.

  1. Buka situs: https://www.virtualbox.org/

  2. Klik tombol Download yang ada di kotak biru di halaman utama.

  3. Pilih versi sesuai dengan sistem operasi kamu.

    • Jika menggunakan Windows, pilih “Windows Host”.

  4. Proses download akan berjalan otomatis.



Langkah 3: Instal VirtualBox

Setelah file VirtualBox selesai diunduh, buka file instalasinya lalu ikuti petunjuk yang muncul (Next → Install → Finish).
Jika kamu masih bingung, ikuti tutorial video yang sudah disediakan di bawah ini.


Langkah 4: Buat Mesin Virtual Baru

  1. Buka VirtualBox, maka kamu akan melihat tampilan home seperti ini.

  2. Klik tombol “New” untuk membuat mesin virtual baru.

  3. Akan muncul jendela pengaturan awal:

    • Name: isi dengan nama bebas, misalnya Ubuntu VM.

    • ISO Image: pilih file ISO Ubuntu yang sudah kamu unduh tadi.



Langkah 5: Buat Akun Ubuntu

Di tahap berikutnya kamu akan diminta membuat akun:

  • Isi username dan password sesuai keinginan.

  • Untuk Host Name dan Domain Name, biarkan default saja.



Langkah 6: Atur Spesifikasi Virtual Machine

Tentukan sumber daya yang akan digunakan oleh Ubuntu:

  • RAM (Memory): disarankan minimal 2 GB.

  • CPU: bisa pilih 2 core agar lebih lancar.

  • Disk Size: beri minimal 10 GB agar cukup untuk instalasi dan aplikasi.


Langkah 7: Cek Ringkasan (Summary)

Setelah semua pengaturan selesai, akan muncul tampilan summary.
Langsung klik Next untuk melanjutkan.


Langkah 8: Proses Instalasi Ubuntu

VirtualBox akan mulai menjalankan proses instalasi Ubuntu.
Tunggu beberapa saat hingga selesai, dan kamu akan melihat tampilan awal sistem Ubuntu.



Langkah 9: Pengaturan Tambahan

Sebelum menjalankan Ubuntu, buka menu Settings pada mesin virtual:

  • Masuk ke tab Display

  • Pada bagian Graphics Controller, ubah menjadi VBoxSVGA
    (Ini penting agar tampilan lebih stabil dan tidak lag.)


Langkah 10: Jalankan Ubuntu

Klik tombol Start, maka Ubuntu akan mulai loading.
Pada proses pertama kali masuk, sistem akan melakukan beberapa preparation setup.
Ikuti saja langkah-langkah di layar sampai selesai.



Langkah 11: Masuk ke Ubuntu

Setelah semua pengaturan selesai, kamu akan diarahkan ke tampilan desktop Ubuntu.
Biasanya akan muncul jendela untuk menginstal aplikasi tambahan — pastikan kamu sudah terhubung ke internet agar proses berjalan lancar.


Langkah 12: Restart dan Selesai

Jika muncul perintah untuk restart, klik saja dan tunggu hingga sistem menyala kembali.
Selamat! 🎉
Sekarang kamu sudah berhasil menginstal dan menjalankan Ubuntu Linux di dalam VirtualBox.


Penutup

Dengan VirtualBox, kamu bisa bebas bereksperimen menggunakan Linux tanpa khawatir mengubah sistem utama Windows. Cocok banget untuk belajar pemrograman, jaringan, atau sekadar eksplorasi dunia open source.


Website Pemesanan Tiket Kereta - SpoorGo

  Peran Saya dalam Project SpoorGo SpoorGo adalah aplikasi pemesanan tiket kereta api berbasis web yang dikembangkan dengan teknologi moder...