Google Cloud: Create Custom Images on GCE

Hai!

Pada jurnal ini saya ingin membuat sebuah custom image dari instance dimana ia berisi konten website sederhana. Jadi, ketika ingin membuat instance webserver bisa langsung menggunakan custom image tadi karena didalamnya service webserver sudah terinstall dan berjalan.

Pertama, buat sebuah instance dengan spesifikasi sesuai keinginan. Disini saya menggunakan instance yang sama ketika saya membuat jurnal sebelumnya. Bisa dibaca di Google Cloud: How to Retrieve Instance Logs using the Google Stackdriver Logging Agent and Automatically Save them to a Bucket.

Cukup sederhana dengan tipe mesin f1-micro dan dengan sistem operasi Debian 10.

Pastikan Firewall yang Allow HTTP trafic sudah di allow ya. Jika belum bisa klik instance > edit dan centang. Untuh contoh ini saya HTTP, bisa disesuaikan jika ingin menggunakan HTTPS.

Lalu kita coba SSH instance, bisa menggunakan salah satu dari beberapa opsi yang disediakan.

Setelah bisa di SSH, update dan upgrade paket ke latest version:

sudo apt update && sudo apt upgrade

Lalu install paket webserver disini saya menggunakan nginx. Jangan lupa enable agar ketika reboot, service nginx otomatis dijalankan:

sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Selanjutnya, kita coba ubah file index.html nya:

sudo su
mv /var/www/html/index.nginx-debian.html /var/www/html/index.nginx-debian.html.bak
echo "<h1>My first custom image</h1>" > /var/www/html/index.html
cat /var/www/html/index.html

untuk pengujian bisa buka browser dan ketikkan IP publiknya. Hasilnya akan seperti ini:

Selanjutnya kita akan coba buat custom image nya. Pertama, stop instance nya terlebih dahulu.

Setelah instance berhenti. Klik menu Images di Compute Engine. Untuk membuat image baru klik Create Image.

Pastikan source-disk nya adalah instance tadi. Konfigurasi lainnya bisa disesuaikan lalu bisa klik create.

Lalu bisa diverifikasi apakah image nya sudah berhasil dibuat atau belum. Karena terlalu banyak image, bisa gunakan filter.

Setelah menggunakan console, bagaimana jika ingin membuat image menggunakan gcloud command-line? Bisa gunakan perintah di bawah ini:

gcloud compute images create {nama_image} --source-disk={instance_name} --source-disk-zone={zona} --family={optional}

Bisa klik refresh pada console, dan terlihat bahwa ada sudah dua image.

Untuk melihat detail image klik image di console atau bisa gunakan perintah:

gcloud compute images describe-from-family {family_name}

Dalam GCE, status image bisa menjadi empat, active, obsolete, deprecated, dan deleted. Disini saya akan coba set image menjadi deprecated. Deprecated diperuntukkan bagi image tua yang versi lebih barunya sudah ada, jadi versi tuanya dianggap sudah tidak layak digunakan.

Untuk set deprecated, klik action di image custom-webserver. Klik Deprecated.

Atur state menjadi Deprecated dan replacementnya pilih image webserver-custom.

Hasilnya akan terlihat seperti berikut ini.

Untuk mengubah status image menjadi Deprecated melalui cloud-shell, gunakan perintah:

gcloud compute images deprecate {image} --state DEPRECATED

Verifikasinya:

Untuk pengujian apakah custom image bisa digunakan, buat instance baru. Untuk parameter yang menjadi fokus utamanya adalah atur Boot disk ke custom image yang telah dibuat dan Allow HTTP traffic nya. Untuk yang lain bisa disesuaikan dan klik Create.

Hasil instance nya.

Dan coba akses EXTERNAL IP dari instance yang baru dibuat, hasilnya akan seperti berikut ini.

Sekian!

Google Cloud: How to Retrieve Instance Logs using the Google Stackdriver Logging Agent and Automatically Save them to a Bucket

Hai!

Pada jurnal ini saya tidak khusus membahas mengenai sebuah materi. Tapi sebuah skenario bagaimana mendapatkan log di instance GCE menggunakan GCE Stackdriver Logging Aggent dan log tersebut otomatis tersimpan di bucket GCS. Bingung?

Okay, langsung saja kita mulai. Perlahan-lahan semoga bisa paham.

Pertama, kita buat bucket nya terlebih dahulu. Untuk langkah pembuatan bucket di GCS bisa merujuk pada jurnal Google Cloud: Setting Up Buckets in Google Cloud Storage (GCS) dan Google Cloud: GCS via gsutil Command. Jika sudah ada, tidak usah buat baru tidak apa-apa.

Bucket yang saya miliki:

Catat nama bucketnya: misskecupbung-bucket-01.

Selanjutnya, kita buat instance baru. Dimana log dari instance ini nantinya yang akan disimpan di bucket. Langkah-langkah pembuatan instance bisa merujuk ke jurnal Google Cloud : Create a Virtual Machine with Console and gcloud Command Line dengan beberapa penyesuaian.

Dari dashboard klik Navigation Menu > Compute Engine > VM Instances. Tampilannya seperti di bawah ini. Klik create.

Untuk nama instance, region dan zone saya biarkan default. Untuk tipe mesin saya pilih terkecil yaitu f1-micro. Agar hasil stress test nya lebih terlihat. Lalu scroll kebawah.

Untuk sistem operasi saya pilih Debian 10. Identitiy and API access biarkan default. Untuk access scopes pilih Set access for each API.

Untuk API Stackdriver Logging API, Stackdriver Monitoring API, dan Stackdriver Trace saat jurnal ini ditulis secara default sudah write only. Jika belum bisa diubah. Untuk Storage pilih Write Only yang bertujuan agar dapat menyimpan log otomatis nya ke bucket.

Lalu klik Management, security, disks, networking, sole tenancy.

Kita fokus ke startup script, tambahkan script berikut:

#! /bin/bash

# Echo commands as they are run, to make debugging easier.
set -x

# Stop apt-get calls from trying to bring up UI.
export DEBIAN_FRONTEND=noninteractive

# Make sure installed packages are up to date with all security patches.
apt-get -yq update
apt-get -yq upgrade

# Install Google's Stackdriver logging agent, as per
# https://cloud.google.com/logging/docs/agent/installation
curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
bash install-logging-agent.sh

# Install and run the "stress" tool to max the CPU load for a while.
apt-get -yq install stress
stress -c 8 -t 120

# Report that we're done.

# Metadata should be set in the "lab-logs-bucket" attribute using the "gs://mybucketname/" format.
log_bucket_metadata_name=lab-logs-bucket
log_bucket_metadata_url="http://metadata.google.internal/computeMetadata/v1/instance/attributes/${log_bucket_metadata_name}"
worker_log_bucket=$(curl -H "Metadata-Flavor: Google" "${log_bucket_metadata_url}")

# We write a file named after this machine.
worker_log_file="machine-$(hostname)-finished.txt"
echo "Phew!  Work completed at $(date)" >"${worker_log_file}"

# And we copy that file to the bucket specified in the metadata.
echo "Copying the log file to the bucket..."
gsutil cp "${worker_log_file}" "${worker_log_bucket}"

Penjelasan: pertama kita update dan upgrade paket debian ke latest version, lalu install the Google’s Stackdriver logging agent. Ini berfungsi sebagai agent untuk mengirimkan log.

Lalu install paket stress dan jalankan stress selama 120 detik yang mana nanti utilisasi CPU akan terlihat di monitoring. Selanjutnya kita buat file .txt dan lempar ke bucket.

Untuk definisi metadata:

  • key: lab-logs-bucket
  • value: gs://{bucket_name}/

Perhatikan bahwa metadata ini berkaitan dengan script dari baris ke 24 ke bawah:)

Lalu bisa klik Create.

Setelah instance terbuat, kita akan melakukan tiga verifikasi. Pertama verifikasi utilisasi CPU, kedua Log, dan terakhir apakah file .txt tersimpan di bucket atau tidak.

Klik nama instance.

Setelah masuk ke VM instance details, untuk verifikasi pertama yaitu log instance. Klik Cloud Logging. Klik open link in new tab ya. Untuk verifikasi kedua yaitu monitoring CPU utilisasi klik tab Monitoring.

Kita perlu menunggu sampai proses selesai kira-kira lima menit. Verifikasi pertama akan terlihat seperti di bawah ini. Seluruh log akan terlihat disini. Perhatikan proses stress yang berjalan selama 120 detik.

Saat proses stress berjalan, di verifikasi kedua pada tab Monitoring kita bisa lihat utilisasi CPU yang melebihi batas. Ini hanya akan berlangsung selama proses stress berjalan dan ya.. berkat bantuan the stackdriver logging agent:)

Verifikasi ketiga yaitu ketika proses stress berakhir, maka dalam script akan membuat file .txt yang dimisalkan log dan akan tersimpan otomatis di bucket yang sudah didefinisikan di metadata.

Sekian!

Google Cloud: GCE In and Out with the gcloud Command-Line

Hi!

Pada jurnal ini saya ingin membahas mengenai services GCE atau Google Compute Engine di GCP menggunakan gcloud command-line. Sejujurnya sudah pernah saya bahas di jurnal Google Cloud : Create a Virtual Machine with Console and gcloud Command Line. Namun disana sangat sederhana dan ditekankan bahwa vm berjalan dan dapat diakses:)

Di jurnal ini saya ingin menjelaskan dari sudut pandang yang sedikit berbeda dengan skenario. Okay, langsung saja ya!

Setelah kita buka cloud-shell nya, coba verifikasi konfigurasi properti dari cloud-shell nya:

gcloud config list 

Untuk sekadar pengenalan, kita coba verifikasi tempat direktori kita berada beserta isinya:

pwd
ls -lah

Bisa verifikasi, dengan user apakah kita bekerja, nama komputer dalam hal ini cloud-shell nya, serta bisa verifikasi dengan ip berapakah cloud-shell kita bisa terhubung ke internet:

whoami
hostname
curl api.ipify.org

Untuk membuat sebuah instance, sebenarnya kita bisa langsung menggunakan perintah dibawah ini:

gcloud compute instances create {nama_vm}

Lalu untuk menghapusnya bisa langsung seperti ini:

gcloud compute instance delete {nama_vm}

Caranya sangat sederhana, bukan? Ketika parameter tidak didefinisiakan secara spesifik, maka ia akan mengambil konfigurasi defaultnya. Bisa dibaca jurnal sebelumnya: Google Cloud: Rundown gcloud Command-Line on GCP

Tapi, bagaimana jika kita ingin customize konfigurasinya sesuai keinginan? Banyak opsi yang ditawarkan oleh tool gcloud. Untuk melihatnya bisa menggunakan perintah:

gcloud compute instances create {nama_vm} -h

Jika ingin lebih jelas dimana disertakan pula penjelasan tiap-tiap parameter, bisa gunakan perintah berikut:

gcloud compute instances create {nama_vm} --help

Misalnya, kita ingin kustom parameter spesifikasi mesin mulai dari cpu dan memori, bisa kita lihat dulu daftarnya:

gcloud compute machine-types list

Daftar yang sangat panjang dan akan membuang waktu jika ingin melihatnya satu-per-satu bukan?

Di gcloud, ada satu perintah dimana fungsinya adalah untuk filtering. Mirip seperti grep, namun adakalanya ia lebih powerful dan pembacaanya lebih mudah. Untuk penjelasan detailnya bisa jalankan:

gcloud topic filters

Misal kita ingin filter tipe mesin dengan spesifikasi f1-micro, perintahnya

gcloud compute machine-types list --filter="NAME:f1-micro"

Masih terasa sangat panjang? kita bisa definisikan zona spesifiknya pula:

gcloud compute machine-types list --filter="NAME:f1-micro AND ZONE~asia-southeast"

Agar kita hanya mendefinisikan tipe machine, dan instance yang kita buat otomatis dapat berada di lokasi yang kita inginkan, kita bisa set default configuration untuk zona dan regionnya.

gcloud config set compute/zone {zone}
gcloud config set zompute/region {region}
gcloud compute instances create --machine-type=f1-micro myfirstvm

Pengujian menggunakan ping:

gcloud compute instances list
ping -c myfirstvm
ping -c IP-INTERNAL
ping -c IP-EXTERNAL

Mengapa hanya eksternal IP yang dapat di ping sedangkan internal dan melalui hostname tidak?

Mari kita coba SSH:

gcloud compute instances list
ssh EXTERNAL-IP
gcloud compute ssh myfirstvm

Jika dilihat secara seksama, ketika ssh melalui ip publik, dia tidak bisa. Dan ketika menggunakan perintah gcloud compute ssh dia akan bisa, hanya saja ada warning bahwa kita tidak memiliki SSH key.

Masih ingat saat menjalankan perintah ls -lah sebelumnya? bisa di scroll dulu ke atas:) Agar dapat ssh ke instance, cloud-shell membutuhkan key dan untuk generate nya bisa menjalankan:

ssh-keygen -t rsa

Saat menjalankan perintah tersebut, otomatis akan terbuat folder .ssh yang didalamnya berisi public key, private key, file know_hosts di clou-shell. Bisa exit dari instance dulu dan tampilannya seperti ini:

Dan ketika kita masuk ke instance, maka di file authorized_keys akan berisi public key dari cloud-shell yang artinya cloud-shell dapat akses ke instance:

Dan mari kita bereskperimen lain. Ketika kita menjalankan:

whoami 
hostname 
curl api.ipify.org

Terlihat bahwa IP public yang digunakan untuk akses internet antara cloud-shell dan instance berbeda.

Okay, selanjutnya kita akan bahas mengenai metadata. Banyak informasi tentang compute instance disimpan di dalam metadata yang dapat dilihat menggunakan perintah curl.

curl metadata.google.internal/computeMetadata/v1/

Terlihat bahwa client atau si instance tidak memiliki permission, dan perlu ditambahkan parameter Metadata-Flavor: Google.

curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/project/
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/project/project-id
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/project/attributes/
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/project/attributes/ssh-keys

Terlihat beberapa informasi yang terasa familiar, bukan? Mari coba lihat metadata yang lainnya:

curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/instance/
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/instance/name
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/
curl -H "Metadata-Flavor: Google" metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email

Informasi-informasi metadata tersebut memiliki banyak fungsinya, khususnya untuk verifikasi. Dan bahkan, kita bisa menjalankan perintah gcloud, bg, dan gsutil dari dalam instances:

gcloud config list
gsutil ls
gsutil ls gs://{bucket_name}

Apakah bisa diakses semua? bahkan menghapus instances dari dalam instances?

gcloud compute instances delete {instance_name}

Jawabannya ya dan tidak. Ya jika diberi akses, tidak jika secara default. Akses ini berupa full API dimana nanti akan dibahas di jurnal lain ya:) atau jika sudah tau penyebabnya bisa ditulis di kolom komentar.

Sekian!

Google Cloud: Rundown gcloud Command-Line on GCP

Hai!

Pada jurnal ini saya ingin menjelaskan secara lebih detail tentang apa itu gcloud, fungsinya, dan contoh penggunaanya di GCP. Seperti yang sudah di praktikkan di beberapa jurnal sebelumnya, selain menggunakan console, saya menggunakan tool gcloud.

Alat gcloud fungsi utamanya adalah untuk command-line yang dapat berinteraksi langsung dengan seluruh layanan di GCP. Pada dasarnya, gcloud lebih powerful dan lebih cepat dibandingkan console, tapi tidak lebih powerful dan cepat dibanding REST API.

Dalam GCP, selain gcloud ada tool command-line lain yang secara fungsinya mirip dengan gcloud meskipun memiliki tujuan yang berbeda:

  • bq: command-line untuk bigquery tapi dan fungsinya ketika kita menjalankan gcloud bigquery
  • gsutil: command-line untuk cloud storage dan sama fungsinya ketika kita menjalankan gcloud storage

Jadi ketiganya tetap saling berhubungan dan sebenarnya ketiganya pun merujuk ke file konfigurasi yang sama yaitu gcloud config. Tool gcloud memiliki tiga versi, versi alpha, beta, dan versi rilis yang stable. Bagaimana jika kita ingin mencobanya? Misal langsung tambahkan opsi beta atau alpha, seperti:

gcloud beta compute instances list
gcloud alpha compute instances list

Seperti itu ya dan wajib aware.

Mari kita lanjutkan ke sintak dasar. Pada dasarnya, penggunaan sintak di gcloud memiliki struktur:

gcloud <global flags> <services/product> <group/area> <command> <flags> <parameters>

Penjelasan: Pertama sintak diawali dengan perintah gcloud, lalu dilanjutkan dengan global flags yang bersifat opsional, selanjutnya kita definisiin services/product yang ingin digunakan, dan tiap services tersebut mungkin saja dipecah ke dalam beberapa area.

Selanjutnya kita berikan command atau perintah yang akan ditujukan ke services yang sudah didefinisikan. Perintah tersebut bisa jadi memiliki flags atau parameter yang bersifat opsional.

Contoh:

gcloud --project myproject compute instances list
gcloud --project=myproject compute instances list
  • –project myproject : global flags
  • compute: services/product
  • instances: area
  • list: command

Bagaimana dengan perintah di bawah ini?

gcloud compute instances create myvm
gcloud services list --available
gsutil ls
gsutil mb -l northamerica:northeast1 gs://mybucket

Disini akan saya tuliskan beberapa opsional dari global flags:

  • –help
  • -h
  • –project <project_id>
  • –account <account>
  • –filter (saat tulisan ini dibuat, belum tersedia untuk semua layanan di GCP, dan ini fungsinya mirip dengan grep)
  • –format (untuk mendefinisikan format JSON, YAML, CSV, dsb)
  • –quiet / -q

Properti untuk konfigurasi utama akan terlihat ketika kita menjalankan perintah:

gcloud config list

Dan untuk seluruh konfigurasi utama yang lebih lengkap dimana selain berisi konfigurasi properti, ia juga berisi konfigurasi default yang akan langsung di apply ketika tidak didefinisian secara spesifik, misal zona, region, dsb.

gcloud config configurations describe <cloudshell_name> --all

Baris di bawahnya masih panjang dan ya bisa kita kustom. Konfigurasi default Konfigurasi umum yang diubah:

  • account biasanya kita definisikan –acount, dan bisa set default value dengan mengubah core/account
  • project biasanya kita definisikan –project, dan bisa kita set default value dengan mengubah core/project
  • region biasanya kita definisikan –region, dan bisa kita set default value dengan mengubah core/region
  • zona biasanya kita definisikan –zone, dan bisa kita set default value dengan mengubah core/zone

Untuk mengubah default value bisa dengan perintah:

gcloud config set <property> <value>

Untuk memverifikasinya bisa menggunakan perintah:

gcloud config get-value <property>

Dan untuk membatalkan konfigurasi default bisa dengan perintah:

gcloud config unset <property>

Apakah kita bisa membuat konfigurasi baru? ya bisa. Konfigurasi ini bisa kita kustom sesuai kebutuhan masing-masing. Sintak yang bisa digunakan yaitu:

gcloud config configurations create ITS_NAME

Lalu untuk mengaktifkan konfigurasi yang dibuat dengan perintah:

gcloud config configurations activate ITS_NAME

Sumber:

Sekian!

Google Cloud: Find Out How the APIs and Services Basically Work in GCP

Hai!

Pada jurnal ini saya akan membahas tentang API dan Services, bagaimana mereka bekerja dan seberapa pentingnya di GCP secara sederhana. Yup, untuk jurnal ini masih dibahas secara dasarnya dan akan dijelaskan berdasarkan skenario.

Langsung saja ya!

Buka cloud-shell dan tampilannya akan seperti di bawah ini.

Secara default kita akan berada di project yang dimiliki oleh akun yang sedang kita gunakan, dan ini bisa diubah. Untuk melihat project yang sedang aktif, bisa menggunakan perintah:

gcloud config get-value project

Kita akan mulai skenarionya. Pertama ketika kita pertama kali menjalankan perintah untuk melihat daftar instance apa saja yang ada di project :

gcloud compute instances list

Maka akan muncul tampilan seperti di bawah ini karena secara default API untuk compute engine (compute.googleapis.com) belum aktif.

Yup, kita bisa saja langsung ketik y dan selesai. Tapi, bagaimana jika ketik N atau enter? Maka akan muncul tampilan seperti di bawah ini dimana akses belum dikonfigurasi dengan benar, dan ERROR.

Berdasarkan laman resminya https://cloud.google.com/apis/docs/overview, Google Cloud API berfungsi sebagai antarmuka agar semua services GCP dapat terhubung dengan benar dan dapat berfungsi dengan baik. Yup, everything.

Layanan-layanan di GCP ada yang memiliki API tersendiri dan ada yang tidak, tergantung bagaimana mereka bekerja. Dan ingat, API bekerja di masing-masing project. So, ketika kamu beralih project, jangan bingung.

Contohnya misal, dalam jurnal ini https://misskecupbung.wordpress.com/2021/02/17/google-cloud-set-up-billing-export-to-bigquery-dataset/, kita menggunakan BigQuery API untuk export data billing dan ia berada di project user admin. Ketika kita matikan BigQuery API di user misskecup_bung, apakah akan mengganggu jalannya export billing? Tidak.

Untuk melihat daftar API yang sedang aktif di project yang kita gunakan bisa menggunakan perintah:

gcloud services list

Atau bisa tambahkan opso –enabled, maka hasilnya sama.

Lalu, bagaimana cara melihat daftar yang sedang available yang artinya services tersebut belum aktif? kita bisa melihat opsi nya dengan bantuna –help atau -h:

gcloud services list -h

Perintahnya:

gcloud services list --available

Maka hasilnya akan seperti berikut ini:

Berapa totalnya? bisa gunakan perintah wc -l ya:

gcloud services list --available | wc -l

Kita bisa filter menggunakan perintah grep, misal hanya untuk melihat API dari compute:

gcoloud services list --available | grep compute

Setelah melihat daftarnya, lalu bagaimana cara mengaktifkan API tersebut? kita bisa mencari tahu opsinya dengan perintah:

gcloud services -h

Ketika kita menggunakan perintah di atas, maka bisa langsung bisa aktif API nya dan selesai.

Apakah ada cara lain? Ada. ketika kita perhatikan pesan ERROR di gambar sebelumnya dengan teliti, disana dilampirkan sebuah URL:

Ketika kita buka URL tersebut maka akan diarahkan ke laman Google APIs dimana disana ketika ingin mengaktifkan sebuah API, tinggal klik enable.

Mari kita coba klik panah <- dibawah navigation menu, maka hasilnya akan seperti berikut ini. Akan muncul API Libary dan ini seperti ketika kita menjalankan perintah google services list –available sebelumnya. Tinggal pilih mana API nya, buka dan aktifkan.

Mari coba klik panah <- lagi dari API Library dan hasilnya akan muncul dashboard APIs & Services yang secara default menampilkan API mana saja yang sedang aktif. Jika ingin mengangktifkan sebuah API tinggal klik + ENABLE di bagian atas dan kita akan diarahkan ke API Library.

Bagaimana jika kita klik navigation menu? maka akan muncul beberapa menu pilihan:

Pada menu IAM & Admin, ada banyak submenu yang bisa digunakan. Misal saya buka IAM & Admin > IAM:

Maka akan muncul tampilan untuk pengaturan IAM atau Identity and Access Management. Secara sederhananya adalah pengaturan user apa mendapatkan akses apa di sebuah objek apa. Kita akan bahas di jurnal lain.

Mari perhatikan bahwa hanya ada satu user yaitu user yang saya gunakan untuk login dan mengakses resouces.

Dan coba kita masuk ke Services Accounts maka akan kosong. Kenapa? karena kita belum mengaktifkan API yang perlu menggunakan services account. Services account ini berfungsi untuk akses sebuah resources ke resources lain. No human interactions.

Apakah ada cara yang lebih sederhana lagi? um.. ini bisa disebut sederhana atau sebenarnya tidak juga. Karena coba buka https://console.cloud.google.com/ dan masuk ke Compute Engine > VM Instances.

Dan bisa dilihat di bawah ini, secara tidak langsung ketika kita membuka dashboard nya VM Instances, API yang berhubungan dengannya akan otomatis menyala. Butuh sekitar 1-2 menit.

Notifikasinya seperti berikut ini:

Dan ketika kita melihat ulang daftar instances melalui cloud-shell dengan menjalankan perintah:

gcloud compute instances list

Maka tidak ada pesan galat lagi.

Dan ketika kita melihat API yang sedang aktif dengan menjalankan perintah berikut ini:

gcloud services list

Apa kalian lihat perbedaanya?

Ketika kita masuk ke menu IAM & Admin > IAM. Maka akan muncul user baru yaitu services account dengan role editor:

Hasilnya akan muncul juga ketika kita membuka menu Services Accounts. Akan dibuatkan secara otomatis sebuah services account untuk Compute API.

Sekian!

Google Cloud: GCS via gsutil Command

Hai!

Jurnal ini merupakan lanjutan dari jurnal Google Cloud: Setting Up Buckets in Google Cloud Storage (GCS). Jadi bisa dibaca dulu, ya! Pada jurnal tersebut menjelaskan mengenai bagaimana mengatur sebuah bucket di GCS melalui console. Dan disini, saya ingin menjelaskan GCS melalui command-line menggunakan command gsutil.

Okay, langsung saja ya!

Pertama, login ke https://console.cloud.google.com/. Pada tampilan dashboard, klik icon cloud-shell seperti gambar berikut:

Setelah klik, akan muncul tampilan seperti berikut ini. Klik continue.

Tampilan cloud shell di GCP seperti berikut ini:

Untuk melihat konfigurasi default di cloud-shell kita, bisa gunakan perintah:

gcloud config list

Bisa ketik ls untuk melihat file apa saja yang ada di cloud-shell dan pwd atau print working directory untuk melihat di direktori mana kita berada:

Okay, sudah cukup untuk pemanasannya. Mari kita mulai masuk ke GCS.

Pertama, kita coba lihat bucket apa saja yang berada di project kita. Perintahnya:

gsutil ls

Terlihat, bucket misskecupbung-bucket-01. Bucket tersebut dibuat di jurnal sebelumnya ya.

Untuk melihat apa saja file yang berada di bucket , bisa gunakan perintah:

gsutil ls gs://{nama_bucket}
gsutl ls gs://{nama_bucket}/**

Ketika menggunakan tanda double asterik, maka akan menampilkan file yang berada di folder juga.

Selanjutnya, ketika ingin membuat bucket bisa menggunakan perintah gsutil mb . Untuk melihat opsi apa saja yang tersedia bisa gunakan perintah:

gsutl mb --help
gsutl mb -help

Perbedaan antara –help dan -help adalah, jika –help akan menampilkan seluruh detail opsi beserta keterangan, dan -help menampilkan opsi secara ringkas.

Okay, lanjut.

Kita, coba buat bucket baru bernama misskecupbung-bucket-02. Perintahnya:

gsutil mb gs://misskecupbung-bucket-02
gsitul ls

Perintah diatas membuat bucket secara sederhana dengan lokasi northamerica-northeast1 dan dengan default storage class yaitu standard. Jika ingin custom, bisa disesuaikan ya!

Selanjutnya, kita coba mengatur label. Label ini untuk penanda dan informasi. Untuk lebih advanced nya lagi, label bisa digunakan untuk mengatur billing GCS juga. Tapi tidak akan dibahas disini.

Untuk melihat label yang dimiliki bucket, bisa menggunakan perintah:

gsutil label get gs://{bucket_name}

Untuk menambahkan label menggunakan perintah gsutil bisa dengan dua cara, pertama menggunakan file .json. Ekstrak label dari bucket pertama:

gsutil label get gs://{bucket_name} > bucketlabels.json
cat bucketlabels.json

Sesuaikan isinya, dan set menggunakan file .json tadi. Perhatikan alurnya di tangkapan layar ya.

gsutil label set bucketlabels.json gs://{bucket_name}

Cara kedua adalah dengan menambahkan langsung, dengan perintah:

gsutil label ch -l "key:value" gs://{bucket_name}

Selanjutnya, saya bahas versioning. Versioning ini akan sangat bermanfaat ketika sebuah file memiliki beberapa timestamp atau dihapus, ditimpa, dan memiliki nama file yang sama. Mereka akan terlihat perbedaannya ketika dilihat dari generation id.

Secara default, fitur versioning di GCS statusnya non-aktif atau suspended. Berikut perintah untuk verifikasi sekaligus untuk mengaktifkan versioning di sebuah bucket.

gsutl versioning get gs://{bucket_name}
gsutl versioning set on gs://{bucket_name}
gsutl versioning get gs://{bucket_name}

Untuk pengujian, misal saya salin file README-cloudshell.txt ke bucket. Dan gunakan perintah

gsutl cp README-cloudshell.txt get gs://{bucket_name}
gsutl ls gs://{bucket_name}
gsutl ls -la gs://{bucket_name}

Metageneration id dan generation id akan terlihat ketika menggunakan opsi -la atau -l saja.

Dan ketika dihapus filenya, maka file akan tetap terlihat ketika mengunakan opsi ls -la.

gsutl rm get gs://{bucket_name}/README-cloudshell.txt 
gsutl ls gs://{bucket_name}
gsutl ls -la gs://{bucket_name}
gsutl ls -l gs://{bucket_name}

Ini berlaku juga ketika menyalin file dari bucket lain, jadi untuk upload file tidak hanya dari lokal ke bucket ya. Tapi bisa dari bucket ke bucket.

gsutil cp gs://{bucket_name}/** gs://{bucket-name}
gsutil ls gs://{bucket_name}/
gsutil ls -a gs://{bucket_name}/

Okay, pembahasan terakhir saya ingin tuliskan satu perintah bagaimana memberikan permission ke sebuah file. Disini saya set ke AllUsers dengan akses Read ya.

gsutil acl ch -u AllUsers:R gs://{bucket_name}/nama_file

Sekian!

Google Cloud: Setting Up Buckets in Google Cloud Storage (GCS)

Hai!

Pada jurnal ini saya ingin berbagi mengenai Google Cloud Storage (GCS) yang merupakan salah satu service keren dan sangat powerful di GCP. Service Cloud Storage pada dasarnya adalah service penyimpanan untuk object storage, dan itu adalah data-data non-relational seperti video, audio, images, dll.

Disini akan dijelaskan bagaimana cara membuat sebuah bucket, folder, bagaimana mengupload sebuah file, set permission, move, dan delete ya.

Okay, langsung saja ya!

Pertama akses ke https://console.cloud.google.com/, buka menu Storage. Atau bisa langsung search Storage di kolom pencarian.

Setelah diklik akan muncul dashboardnya, seperti berikut ini. Dashboard ini berisi bucket-bucket yang kita buat. Oiya, bucket dalam GCP merupakan istilah untuk merepresentasikan sebuah wadah untuk 1 penyimpanan.

Berdasarkan gambar diatas, saya belum memiliki bucket. Untuk membuatnya, klik Create Bucket. Lalu akan muncul tampilan berupa step-step untuk membuat bucket.

Pertama, kita set nama bucket yang akan kita buat. Lalu klik Continue.

Oiya, perhatikan di panel kanan, itu menunjukkan prediksi berapa cost yang akan kita habiskan untuk bucket tersebut ya.

Selanjutnya kita pilih tipe lokasi ya.

Untuk tipe Region berarti bucket kita hanya akan berada di satu region saja dan latensinya kecil, ini biasanya untuk user yang hanya berada di sebuah region saja. Tampilan Region:

Untuk Dual-Region maka bucket akan berada di dua region dan akan ada HA di antara kedua region tersebut, misal Tokyo dan Osaka. Tampilan Dual-Region:

Jika Multi-region maka bucket akan berada di berbagai region yang areanya berdekatan misal untuk US kan terdiri dari beberapa region, ya. Untuk lebih lengkapnya ada di https://cloud.google.com/storage/docs/locations Disini saya pilih Multi-Region:

Disini saya pilih Multi-Region. Jika sudah, bisa klik Continue.

Selanjutnya, kita pilih default storage class. Berdasarkan dokumentasi resminya di https://cloud.google.com/storage, GCS memiliki beberapa tipe storage , seperti standard storage untuk tipe data hot atau yang sering diakses, nearline untuk data yang disimpan minimal 30 hari, coldline untuk data yang disimpan setidaknya 90 hari, dan yang terakhir adalah archive untuk data yang disimpan minimal 12 bulan atau 365 hari. Kesemua itu memiliki kelebihan dan kekurangan, yup dan harus disesuaikan dengan kebutuhan masing-masing.

Disini saya pilih Standard ya. Lalu klik Continue.

Selanjutnya, untuk control access. Saya pilih Fine-gained.

Untuk tab advanced settings, kita diminta untuk memilih tipe encryption, saya pilih google-managed encryption key.

Lalu klik Create. Hasilnya:

Perhatikan menu berikut ini:

Kesemua itu, merupakan beberapa fitur untuk manajemen bucket. Pertama, saya coba upload files ya. Klik Upload Files dan arahkan ke file yang ada di komputer/laptop yang akan diunggah ke bucket.

Secara default, file yang kita upload statusnya adalah Not Public. Artinya, hanya kita sebagai owner, dan user-user yang ditambahkan yang memiliki akses.

Untuk manajemen files seperti mengubah akses file, bisa klik titik tiga yang berada di kanan file. Tampilannya seperti berikut ini. Kita bisa menyalin, rename, move, edit metadata, dan kita akan coba untuk edit permission.

Berikut tampilan edit permission nya. Entity merupakan scope yang akan diberikan akses, Name untuk siapa yang diberikan akses, dan Access adalah akses apa yang diberikan. Disini saya coba akses untuk Public untuk semua users dan hak aksesnya adalah hanya baca.

Jika sudah, klik Save.

Hasilnya seperti berikut ini:

Bisa kita klik Copy URL dan coba buka di tab baru. Hasilnya akan seperti ini:

Untuk melihat seperti apa tampilan file yang tidak dishare, di url bagian nama file cukup diganti dengan nama files yang ingin dilihat. Misalnya:

Okay, selanjutnya kita coba buat folder. Bisa klik UPLOAD FOLDER:

Isikan nama:

Yang jadi pembeda antara file dengan folder adalah adanya simbol (/) atau slash di akhir nama folder. Seperti berikut ini.

Maka, ketika mengakses sebauh file dalam folder, akan tetera nama foldernya, seperti berikut ini:

Sekian!

Google Cloud: How to Add Non-Admin User Access to GCP

Hai!

Pada jurnal ini, saya ingin membahas secara sederhana bagaimana menambahkan akses ke pengguna non-admin ke GCP kita. Secara sederhana ya, karena disini saya akan mencoba menggunakan gmail. Untuk skala lebih besar pada corporation, bisa menggunakan email perusahaan dan struktur organisasinya akan lebih kompleks.

Goal dari jurnal ini adalah bagaimana menambahkan user biasa agar bisa menggunakan resources di GCP, dan otomatis billingnya akan masuk ke billing dari user admin. Semacam linked billing account.

Okay, langsung saja ya!

Pertama, kita login ke https://console.cloud.google.com/ menggunakan akun yang berperan sebagai admin, admin disini maksudnya adalah admin untuk keseluruhan environment di GCP. Masuk ke menu Billing.

Lalu masuk ke Account Management. Klik Show Info Panel untuk melihat member ya.

Selanjutnya, untuk menambahkan member, klik Add Member. Isikan email dan role nya ya. Disini diset Billing Member. Bisa centang send notification email untuk menginfokan user yang ingin ditambahkan. Lalu klik save.

Maka, setelah disave akan muncul seperti ini:

Coba buka https://console.cloud.google.com/ menggunakan private browser atau incognito dan gunakan user email yang sudah ditambahkan. Ketika masuk ke Dashboard, maka project akan kosong.

Ketika masuk ke menu Billing. Maka akan muncul seperti ini:

Ketika klik Account Management di menu Billing, maka akan muncul seperti ini:

User yang baru ditambahkan, tidak memiliki akses.

Selanjutnya, kita coba buat project baru. Misalnya My User Project.

Lalu, hasilnya seperti ini:

Dan, setelah ini. User tersebut bisa menggunakan resources yang ada di GCP.

Sekian!

Using Git For Windows With MSYS2

Developing software in Windows using GCC, Make, etc., is a little bit challenging, we have several choices, but I choose MSYS2.

The problem is, with the default Git from it repository is not quite friendly with Windows, in order to make this a little bit friendly we can use Git for Windows, to install it we can follow the steps from their GitHub:


https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper


Google Cloud: How to Set Up Budget Alert

Selamat sore!!

Pada jurnal ini saya ingin sharing sedikit mengenai bagaimana membuat Billing Alert di Google Cloud Platform. Alert ini berfungsi sebagai warning, ketika billing kita mencapai sekian persen, maka kita akan mendapatkan notifikasi. Bisa melalui pub/sub, atau sederhana menggunakan email seperti yang akan dicoba di sini. Jadi penggunaan cost bisa dimanajemen dengan baik.

Langsung saja ya!

Pertama, melalui console, masuk ke menu Billing.

Setelah masuk, pilih menu Budgets & Alerts. Secara default, saat pertama kali menggunakan GCP, budget dalam keadaan kosong. Kita akan coba buat, klik Create Budget.

Pada tampilan (1) Scope, isikan nama budget, pilih project dan services, disini saya pilih all project dan all services. Lalu klik Next.

Pada tampilan (2) Amount, pilih type budget. Saat pembuatan jurnal ini, ada dua tipe. Bedanya, jika spesific amount maka kita tentukan berapa budgetnya. Jika last month spend, maka akan dilihat penggunaan akhir bulan. Saya pilih Spesific Amount. Lalu klik Next.

Pada tampilan (3) Action, kita tentukan percent of budget. Maksudnya adalah, misal disini saya set 90%, 100%, dan 50%, maka saat budget mencapai persen tersebut, maka saya akan mendapatkan notifikasi.

Di Google Cloud Platform, ada tiga pilihan notifikasi, melalui email, link monitoring dan connect to pub/sub. Disini saya set alert by email.

Lalu klik Finish. Hasilnya:

Sumber: https://cloud.google.com/billing/docs/how-to/budgets

Sekian!

Google Cloud: Verify Sample Billing Data with BigQuery

Selamat siang!!

Okay. Pada jurnal ini saya ingin sharing tentang bagaimana cara melihat data billing yang sudah di export ke dataset BigQuery. Untuk cara bagaimana exportnya sudah dijelaskan di jurnal sebelumnya. Baca di Google Cloud: Set Up Billing Export to BigQuery Dataset.

Langsung saya ya! Disini saya menggunakan sample BigQuery milik Google Cloud:).

Pertama, dari console Google Cloud, masuk ke menu Big Query dari Navigation Menu, atau dari kolom search.

Tampilannya seperti berikut ini:

Kita fokus di editor ya. Kita akan menjalankan beberapa query pada editornya.

Query pertama:

SELECT *
FROM `cloud-training-prod-bucket.arch_infra.billing_data`

Pada query ini kita akan menampilkan semua data yang terdapat di public dataset cloud-training-prod-bucket.arch_infra.billing_data milik Google Cloud.

Bisa di scroll kanan-kiri, atas-bawah ya. Bisa dilihat, sample resource billingnya.

Query kedua:

SELECT *
FROM `cloud-training-prod-bucket.arch_infra.billing_data`
ORDER BY cost DESC

Mirip seperti query pertama, hanya saja kita urutkan secara descending dari cost tertinggi.

Query ketiga:

SELECT product, resource_type, start_time, end_time,
cost, project_id, project_name, project_labels_key, currency, currency_conversion_rate,
usage_amount, usage_unit
FROM `cloud-training-prod-bucket.arch_infra.billing_data`
WHERE (cost > 3)

Disini kita coba melihat resource mana yang cost nya lebih dari 3 dollar.

Query selanjutnya:

SELECT product, COUNT(*)
FROM `cloud-training-prod-bucket.arch_infra.billing_data`
GROUP BY product
LIMIT 200

Kita coba lihat, resource mana yang memiliki jumlah tertinggi.

Query terakhir:

SELECT product, cost, COUNT(*)
FROM `cloud-training-prod-bucket.arch_infra.billing_data`
WHERE (cost > 1)
GROUP BY cost, product
LIMIT 200

Disini, kita coba lihat resource mana yang cost nya terbanyak.

Silakan bereksperimen ya!

Sekian!

Migrasikan Konten Django Lama ke Jekyll

Para pengembang BlankOn Linux saat ini telah menggunakan Jekyll untuk beberapa situsnya, salah satunya adalah laman http://blankon.id. Penulisan konten berbasis Markdown dan situs statis merupakan pilihan yang diambil setelah beberapa tahun sebelumnya para pendahulu menggunakan Django untuk sebagian besar website mereka. Konsekuensinya konten-konten website lama yang berbasis Django tersebut perlu...

Permainan Baru di GCompris bagian 1 (Keyboard Bayi)

Awal bulan Oktober 2020 lalu penulis membaca pengumuman di Millis GCompris bahwa tim pengembang akan merilis GCompris V 1.0 pada tanggal 17 November 2020. Dengan adanya rencana rilis tersebut maka Server GCompris akan dibekukan pada tanggal 15 s/d 17 November 2020.

Dengan adanya pengumuman tersebut maka Tim Penerjemah GCompris Indonesia bergerak secara cepat melakukan diskusi melalui Telegram.

Nah di sini ternyata saya salah baca atau memahami tanggal dan bulan.


Yang seharus tanggal tanggal 15 November saya bacanya 15 September.

Pada rilis GCompris V 1,0 ini terdapat perubahan dan perbaikan pada beberapa permaianan, contohnya adalah permianan Jelajahi Peternakan Hewan, Permianan Catur, Menghitung Benda, Pengelompokan. dan lain-lain.

 

Selain itu terdapat juga beberapa permaian baru pada GCompris V1.0, yaitu: Keyboar Bayi, Listrik Analog, Labirin Pemrograman, Belajar Digit, Belajar Pengurangan,dan Belajar Penambahan.


Pada post kali ini penulis membahas permianan bernama Keyboard bayi, sedangkan permainan baru lainnya akan penulis bahas pada post berikutnya


Terjemahan pada judul permainan ini masih keliru, yang lebih tepat adalah Keyboard anak.
Tapi bisa dimaklumi karena tim penerjemah melakukan penerjemahan secara langsung dari judul aslinya yaitu Baby keyboard.



Permainan ini bertujuan sebagai sarana belajar memahami berbagai tombol pada keyboard sekaligus pengenalan huruf dan angka untuk anak-anak pada usia dini.

Cara memainkannya adalah Tekan tombol apa pun pada keyboard sesuai keinginan.
Maka Huruf, angka, atau karakter muncul di layar sesuai tombol yang ditekan tersebut.

Jika yang ditekan tombol berupa huruf dan angka maka keluar suara  sesuai tombol yang ditekan.
Jika yang ditekan tombol selain huruf dan angka maka suaranya hanya bleep.


Rencananya permainan ini akan penulis masukkan pada Buku Belajar Komputer Dasar tingkat 0 Tema 3 yang sedang penulis kerjakan, atau bisa jadi dimasukkan ke tema 1 atau 2 edisi revisi.

Untuk yang tertarik dengan buku yang penulis rilis dapat mengunjungi tautan berikut => Unduh Buku Digital Gratis



The First Verbeek Nightly Build with Package That Build by IRGSH

Today we’re pleased to announce our first nightly build (or “jahitan”) with package that build by our in-house toolchain IRGSH. This build featured Pop Shell extension package which marks our important milestone. The package help us to prove that IRGSH works as intended to help us to bring the source code to binary package, to injected it to signed repository then wrapped to a bootable ISO.

You can download the ISO file here. You may consider to use zsync to decerase the size of download between builds.

In case you’re curious about what Verbeek will be looks like, we’ve packaged Pop Shell because we want Verbeek to be developer-first desktop. The release will be providing software and tools you need as developer/IT professional. This is the third BlankOn Linux release that will have specific user as target, after Meuligoe Minimalist and Sajadah. If you want to get update about the development, please simply follow the BlankOn Linux Twitter account and click Watch on our release repository.

EJBCA Beginner Guide: From CA to Certificate Enrollment

X509 is a complicated thing and EJBCA makes it easier to grasp. Eww you may find EJBCA is complicated as well. This post will guide you to specific case as example:

CA that can issuing certificates for high education instutution. High education institution as end user can signing PDF files for their student certification.

This post is not the best practice example but it can introduce you to how EJBCA works. Let’s go.

EJBCA Preparation on local environment

docker-compose.yaml:

version: '3'

services:
  db:
    image: postgres:13-alpine
    env_file: .env
    restart: always
    volumes:
     - ./data:/data

  ejbca:
    image: primekey/ejbca-ce:6.15.2.6
    env_file: .env
    restart: always
    ports:
      - 80:8080
      - 443:8443
    depends_on:
      - db

.env:

# EJBCA
TLS_SETUP_ENABLED=simple
DATABASE_USER=postgres
DATABASE_PASSWORD=kLTPk5Ty9K3JHykCS38YBHDTVwXkVCgjsQs7HaT8wwT5VcY5G54tMbSNt6uCEztM
DATABASE_JDBC_URL=jdbc:postgresql://db/postgres

# DB
POSTGRES_PASSWORD=kLTPk5Ty9K3JHykCS38YBHDTVwXkVCgjsQs7HaT8wwT5VcY5G54tMbSNt6uCEztM
PGDATA="/data"

Spin them up with docker-compose up -d --force-recreate. It’ll take some minutes until EJBCA is ready to serve you.

Some notes:

  • Add 127.0.0.1 ejbca to your /etc/hosts as the ejbca declared itself on ejbca hostname/domain.
  • Make sure you can access https://ejbca/ejbca/adminweb/ without problem.

Issuing Root CA

  • On EJBCA Admin Web interface, go to CA Functions -> Certificate Authorities.
  • On Add CA form, write your Root CA common name, e.g. AgunoRootCA, then click Create
  • You’ll be redirected to complicated form of issuing CA.
  • Leave the default values as is except for:
    • CA Serial Number Octet Size: 20
    • Validity: set it to 10y
    • Issuing Distribution Point on CRLs: Use
    • Default CA defined validation data: click all Generate buttons in this section, then change the localhost strings to ejbca.
    • Monitor if CA active (healthcheck): Activate
  • Then click Create button.
  • At this point, you have two CAs:
    • ManagementCA
    • AgunoRootCA

Issuing Intermediate CA

  • Do the same again as above except:
    • The CA name is AgunoIntermediateCA
    • Leave the default values but set some values as above and:
      • CA Certificate Data, Signed By: AgunoRootCA
  • At this point, you have three CAs:
    • ManagementCA
    • AgunoRootCA
    • AgunoIntermediateCA

Preparing Certificate Profiles

Any attempt of issuing new certificate will require a certificate profile that define what kind of certificate that will be created. Let’s assume that we want to create certificate profile for high education institutions and it will be used to signing ijazah. Let’s name it HIGHEDUINSTITUTION.

  • On EJBCA Admin Web interface, go to CA Functions -> Certificate Profiles.
  • At the end of the list, enter your profile name, HIGHEDUINSTITUTION, click Add
  • It’ll be added to the list, now click Edit button as we need to modify some values. IMPORTANT NOTE: If you want to multiple select some values, press and hold Shift button or the previous selected values will be loss.
  • Now please set some values on this field :
    • Available Key Algorithms: select ONLY RSA, we need to make it broadly compatible.
    • Available Bit Lengths: select ONLY 4096 bits
    • Validity or end date of the certificate: 5y
    • Extended Key Usage: Use, Critical, select ONLY PDF Signing
    • Available CAs: select ONLY AgunoIntermediateCA
  • Click Save button

Preparing End Entity Profile

Certificate Profile defines the technical aspects of the certificate. On the other hand, EEP defines the entity aspects that related to identity.

  • Go to RA Functions -> End Entity Profiles
  • On Add Profile form, type your profile name, e.g. HIGHEDUINSTITUTION (same as the certificate profile name), then click the Add button.
  • After it added to the list, click the item then click Edit End Entity Profile button.
  • You’ll be redirected to (again) a complicated form. Leave it as is but modify some values:
    • Password: Required
    • Other subject attributes: Remove all attributes
    • Default Certificate Profile : HIGHENDINSTITUTION
    • Available Certificate Profiles: select ONLY HIGHENDINSTITUTION
    • Default CA: AgunoIntermediateCA
    • Available CAs: select ONLY AgunoIntermediateCA
    • Default Token: P12
    • Available Tokens: select ONLY P12
  • Click save
  • At this point, you have three CAs, a configured certificate profile and a configured entity profile. You’re ready to enroll new certificate for education institutions.

Let’s try to issuing and enrolling a new certificate for education institution

  • On EJBCA Web Admin interface, go to RA Functions -> Add End Entity
  • On End Entity Profile field, select HIGHEDUINSTITUTION, the form will be adjusted according to our end entity profile configuration.
  • Enter your entity information, e.g.:
    • Username: ugmacid
    • Password: enter the password for enrollment
    • E-mail address administration@ugm.ac.id
    • CN/Common name ugmacid
  • Leave other values as is.
  • Click Add button.

Let’s enroll the certificate

  • Go to https://ejbca/ejbca/, this is the public interface of the EJBCA instance.
  • On Enroll section, click Create Browser Certificate
  • Enter the username and Enrollment code (password)
  • You’ll be asked for confirmation, click Enroll button
  • A P12 file will be downloaded to your computer, it’s protected by passphrase. Use the password as passphrase.

At this point, you may check the new issued certificate against the certificate chain.

Next post

I’ll write about authentication, roles and security on maintaining EJBCA instance.

Cara Menginstall Python 3.6 di Debian 9 (stretch)

Debian 9 (stretch) secara default membawa python2.7 (default) dan python3.5. Saya sedang melakukan instalasi aplikasi yang ternyata membutuhkan Python versi 3.6. Pada beberapa tutorial di internet, menyarankan untuk menggunakan repo debian testing. Namun saat tulisan ini dibuat, saya cek repo debian testing memiliki python versi 3.8, sedangkan versi tersebut ketinggian....

Mengunci Versi aplikasi di CentOS

Setelah catatan sebelumnya kita berhasil downgrade versi aplikasi di CentOS, ternyata saat kita lakukan yum update, aplikasi kembali dinaikkan versinya ke versi yang lebih baru. Tentunya hal ini menjengkelkan karena aplikasi project kita akan kembali error alias tidak jalan. Namun jangan khawatir, pada postingan ini kita akan membahas bagaimana cara...

Cara Downgrade Aplikasi di CentOS

Sebuah aplikasi yang ditulis oleh temen-temen developer terkadang hanya kompatibel dengan versi runtime tertentu pada bahasa pemrogramannya. Hal ini akan menuntut administrator agar dapat menyesuaikan dengan kebutuhan tersebut. Nah, catatan ini disimulasikan dijalankan di sebuah VM dengan sistem operasi CentOS 8. Catatan ini juga berdasarkan pengalaman penulis saat menangani sebuah...

Multi Machine Vagrant dengan Vagrantfile Tunggal

Vagrant merupakan sebuah tools yang saya gunakan untuk provisioning Virtual Machine, khususnya untuk environment lokal di laptop. Vagrant juga dapat digunakan untuk provisioning VM dengan beberapa provider, antara lain VirtualBox, VMware, Docker, Hyper-V, maupun custom. Saya sendiri menggunakan provider Libvirt :D Oke, salah satu alasan kenapa tulisan ini saya buat...

Cara Install Autoscaling GitLab Runner yang Hemat Biaya

Ngomong-ngomong soal GitLab tidak lepas soal CI/CD (Continuous Integration/Continuous Delivery/Deployment). Nah, kebetulan Di tempat saya bekerja menggunakan gitlab-runner. GitLab Runner merupakan salah satu fitur yang sangat bermanfaat untuk menjalankan CI/CD. Saya tidak akan menjelaskan apa itu CI/CD di sini (mungkin akan saya jelaskan di postingan yang lain). Hanya akan saya...

Menjalankan Vagrant Provider Libvirt di openSUSE Leap 15.2

Melihat pak Andi Sugandi menggunakan vagrant untuk menyediakan lab VM saat beliau mengajar, saya pun jadi penasaran. Karena provisioning VM menggunakan vagrant ini sepertinya mengasyikkan, terutama karena….. Nanti deh saya ceritain apa, dan mengapa ini penting saya utarakan. Apa itu Vagrant? Tampilan Website Vagrant Vagrant merupakan sebuah perangkat lunak yang...

Cara Install gcloud CLI di openSUSE Leap 15.2

Postingan kali ini akan sangat singkat, karena merupakan catatan yang dibuat untuk sekedar mendokumentasikan apa yang saya ketikkan saat memasang gcloud CLI di laptop saya. Sistem Operasi yang digunakan di laptop saya seperti yant tertulis di judul tulisan ini, yaitu openSUSE Leap 15.2. Sebelumnya, mungkin perlu juga saya tulisan apa...

openSUSE Leap 15.2 di Google Cloud Platform (GCP)

Sebagai pengguna openSUSE, saya kadang merasa penasaran apakah bisa saya menggunakan os ini di langit sebagai server. Yang saya maksud di langit di sini adalah Google Cloud Platform (GCP), karena saya juga pengguna produk google tersebut di beberapa proyek milik klien. Namun melihat daftar templat citra (image template) di Google...

Pi Zero sebagai Tukang Periksa (Bot)

Bojongbot - Pi Zero

Saya memasang beberapa cctv berbeda merek, baik yang berjenis ip cam maupun yang analog dengan dvr. Kesemuanya terhubung ke 1 server shinobi video yang pernah saya tulis di artikel sebelumnya. Nah, beberapa perabotan itu tentunya memiliki IP, dan ada beberapa yang suka ngambek, gak hidup. Di-ping juga gak respon. Agak susah kalau tidak mengetahuinya. Kapan hari ada insiden panci presto meledak, namun cctv di area dapur pas heng. Jadi tidak ketahuan prosesnya.

Setelah kemarin ngoprek-ngoprek ARM (lagi setelah sekian lama), saya jadi inget punya beberapa perabotan arm yang tidak kepakai, salah satunya pi zero. Ya sudah itu aja dimanfaatkan jadi mesin bot. Tugasnya cuma kirim ping ke beberapa perangkat yang ada di daftar, jika gak ngasih balikan, ngirim pesan ke telegram via bot telegram.

Kodenya ada di https://github.com/princeofgiri/bojongbot.

Bot beraksi

Ada beberapa yang nanya, kenapa gak pakai ESP32 aja? Jawabannya sebagai berikut:

  1. Saya belum pernah ngoprek ESP32, baru order, belum datang saat tulisan ini dibuat
  2. Memanfaatkan yang sudah ada, jadi tinggal pakai gak perlu beli-beli
  3. Saya sangat familiar dengan linux dan bash, jadi ndak ribet bahasa pemrograman lainnya

Kepinginnya sih nanti botnya jadi tambah pinter, kulkas di rumah sepertinya ada API, bisa diintip nanti-nanti.

LibreOffice 7.0 di Raspberry Pi OS

Setelah kemarin bikin video Armbian dengan LibreOffice 7.0 (https://www.youtube.com/watch?v=1rTrCVgGXfA) ngoprek disela-sela kesibukan masih berlanjut. Kali ini ngidupin layar 7 inch dengan perangkat raspberry pi buat mainan bocah dengan GCompris.

Di Raspberry Pi OS (dulu Raspbian), yang berbasis debian buster. Caranya cukup mudah, pasang flatpak, pasang libreoffice dari flatpak. Beres!

Eh tunggu dulu, belum beres. Karena menu aplikasi libreofficenya belum bisa muncul. Harus digosok dulu. Berikut cara nggosoknya:

  • Edit berkas

/etc/xdg/lxsession/LXDE-pi/desktop.conf

  • Di paling bawah, tambahkan

[Environment_variable] XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/home/pi/.local/share/flatpak/exports/share:/usr/local/share/:/usr/share/raspi-ui-overrides:/usr/share/:/usr/share/gdm/:/var/lib/menu-xdg/

  • Reboot

Udah deh!

LibreOffice 7.0 di Raspberry Pi OSLibreOffice 7.0 di Raspberry Pi OS

Buku Belajar Komputer Tingkat Dasar 5 Tema 1

Puji syukur tim penulis panjatkan kepada Tuhan Yang Maha Esa yang telah memberikan rahmat dan karunia-Nya, setelah molor beberapa waktu akhirnya buku Belajar Komputer Tingkat Dasar 5 Tema 1 yang kami tulis hari ini bisa rilis.


Buku ini adalah lanjutan dari buku Belajar Komputer Tingkat Dasar 4 yang sudah terbit sebelumnya. Seperti pada buku sebelumnya, materi dalam buku ini juga masih mengusung tema belajar dan bermain secara menyenangkan.
Adapun beberapa materi dalam buku ini adalah:
  • Materi pada bab 1 berisi pelajaran geografi yaitu mengenal negara-negara di berbagai dunia, sehingga anak-anak dapat mengetahui nama benua dan negara di dunia. Di dalam bab ini juga berisi permainan tentang wilayah dalam berbagai negara di dunia.
  • Bab 2 berisi pelajaran huruf braille, yaitu huruf yang biasa digunakan oleh orang-orang tidak bisa melihat. Dengan menggunakan huruf braille, orang yang tidak bisa melihat bisa membaca. Di dalam bab ini juga dijelaskan sejarah singkat terciptanya huruf braille.
  • Bab 3 berisi pelajaran cara bermain catur untuk anak-anak. Di dalam bab ini dijelaskan pengetahuan dasar mengenai catur, notasi pada permainan catur, gerakan berbagai buah catur. Materi pelajar pada bab ini dapat dilakukan lewat permainan di komputer ataupun menggunakan perangkat catur asli yang tersedia.
 Untuk mengunduh buku digital Belajar Komputer Tingkat Dasar 5 Tema 1 silakan pilih salah satu tautan berikut:

Pembaca boleh menyebarkan buku versi digital ini ke masyarakat yang membutuhkan baik secara online ataupun offline, juga dipersilakan untuk membuat mirror di berbagai web atau server yang pembaca miliki.


-

Unduh Buku Digital Gratis

Halaman ini sengaja penulis buat untuk kumpulan buku digital yang sudah penulis rilis dan bagikan gratis.
Silakan klik pada masing-masing judul buku untuk menuju link download



Cara menjadi Sponsor pada buku yang akan terbit


Clicks to balance

One of the things that I am sure I will miss when moving back to Indonesia is how convenient it is to do bank-related transactions in The Netherlands. Almost everything, if not all, is already connected and standardized. There is no need for virtual accounts, going through e-wallet from startups, dealing with transaction cost, etc because there is a widely approved payment system called iDEAL. Every time I go for online shopping, this is the only logo I need to see to be sure that I can do business with the shop.

This is probably one of a series of posts comparing banking in Indonesia and The Netherlands. First, we will see what it takes to do one of the most important task, in my view, in an online banking site/app: Checking the balance. I consider this to be a common task but apparently different banks have gone different routes to provide this very basic information.

I will be comparing different banks that I have access to: BNI, BCAJenius, HSBC, ABN AMRO, and Bunq. The number to measure here would be the number of clicks I need to do after the login page to see the current balance. What I show here is from what I gather on the 28th of June 2020.

BNI Desktop Web

BNI Internet Banking requires you to do 2 clicks “Rekening” and then “Saldo Rekening” to see a supposedly list of accounts and the balances.

1_o6atev462exmp_8jtmoh2w

 

BNI Mobile Web

The mobile web version, on the other hand, requires you to do 6 clicks (or 7 depending on how many accounts you have I guess), to get into the balance page.

The wording is consistent to the desktop version and the important bits are put at the top which helps the navigation.

1_jipl5cmsdloz9qfje9i3nw

BNI Mobile App

Apparently to login I need to enter the number from the ATM card. I will skip this since I am too lazy to find the card 😂

BCA Desktop Web

This old school looking page (I think they take if it ain’t broke, don’t fix it mantra religiously) requires you to go to “Account Information” page and then “Balance Inquiry” and thus needs 2 clicks.

The menu wording is probably clear enough but the first menu is put at the middle of big list of options. For me, that rarely use this page, I have to remind myself of what the menu option is. Also, the small text size does not help me at all.

bca

BCA Mobile Web

Short of similar to the desktop version, this one requires 2 clicks: “Informasi Rekening” and then “Informasi Saldo” (same wordings as above but different language — probably just my settings). The first menu is also not put up front but fortunately the list is smaller.

bcam2

BCA Mobile App

The mobile app version follows almost the same steps with an additional PIN entry page before getting into the final balance page. However, unlike both desktop and mobile web versions, the required 3 clicks are on the items put at the top.

bcaa

Jenius Mobile App

Unlike the above banks, this mobile app only bank shows the balance up front immediately after the login page. For me who consider checking the balance amount an important task to do, this really saves my time.

1_yw1ltdtdi8pz-u86hylkza

HSBC Desktop Web

HSBC also puts the balance information on the first page after you login. Zero clicks needed.

1_zi0xh3px8zzuvpuk2kd2nq

HSBC Mobile App

This version of HSBC online banking also shows the accounts and balances on the first page.

1_8tvupqoxucjax5qk7cyuzq

ABN AMRO Desktop Web

ABN AMRO also shows all bank accounts and the balances immediately after the login process.

1_rfv8jtsguetrpil8vmgypw

ABN AMRO Mobile App

Same as the desktop version, accounts and balances up front.

1_rr8l_iatmvxh3lywrj5sbg

Bunq Mobile App

Bunq is probably my favorite bank so far in terms of user experience. As expected, it also shows all accounts and balances on the first page.

1_iclr9hee2gectjlm1sccfa

Bunq Desktop Web

Following the same pattern as the mobile app’s, the Desktop Web version shows all accounts and the balances.

1_1bwf5redxabfwgxjdjievg

Conclusion

If I can take any conclusion at all, I think Indonesian banks have to step up their game and give user experience more priority. Jenius is an exception here and it’s really a breath of fresh air.

Server CCTV dengan Shinobi Video – Bag. 5, IP Cam Murah Meriah

Setelah liat-liat di situs perbelanjaan daring, saya menemukan satu kamera yang fiturnya cukup pas untuk disambungkan dengan Shinobi, harganya juga berkisar 250 ribu rupiah. Berikut fitur yang penting untuk digunakan:

  • Onvif
  • AUTO TRACKING
  • PTZ Rotate Pan Tilt 360
  • Ada sensor suara, sensor gerak dan pemberitahuan ke Hp
Mini CameraMini Camera

PTZnya juga berhasil tersambung dengan Shinobi. Onvif devicenya dikenali bikinan Eyeplus.

Server CCTV dengan Shinobi Video – Bag. 4, Menyambungkan dengan DVR

Saya memiliki satu set CCTV beserta DVRnya. Mereknya Nathans, sponsor dari kantor (PT SKK). Ini CCTV asli ndak pakai ribet, just work. Nah … PRnya adalah gimana caranya nyambungin ke Shinobi. Berminggu-minggu saya gak berhasil menemukan solusinya. Sampai saya menyerah.

DVRDVR

Sekitar 2 mingguan lalu, saya tiba-tiba nemu sebuah saran url rtsp dari internet. Dan saya coba beneran bisa. Berikut urlnya:

rtsp://192.168.0.3:554/user=admin&password=passwordmu&channel=1&stream=1.sdp?real_stream–rtp-caching=100

Silahkan sesuaikan alamat IP beserta akun yang ada di DVR Anda.

Vortex Tab 75 Programming Guide

I need to write it down here so there will be no need to visit Vortex Gears’s incomplete documentation in the future.

Programming

  • Plug in the cable, you need the LED to guide you
  • PN + LEFT_CTRL (original position) to enter programming mode
  • Press the key that want to be programmed
  • Press the target key
  • PN to apply
  • PN + LEFT_CTRL to exit

It’s possible to lose a key. Sometimes you need to backup it first. Be careful.

Reset

  • Reset the current layer key-codes: Hold PN + R (original position)
  • Reset all layers’ key-codes and restore it to default: Hold LEFT_ALT + RIGHT_ALT (original position)

Bluetooth

  • PN + LEFT_ALT (on the left of the space bar key) for 3 seconds
  • PN + J or K or L (current position)
  • Pair the device

Fn swap

  • Hit FN + LEFT_SHIFT for 3 seconds then select new FN key directly

Pn swap

  • Hit PN + LEFT_SHIFT for 3 seconds then select new PN key directly

Layer

  • PN + M or < or > (original position), indicator on left LED.

Layout

  • PN + RIGHT_SHIFT (cycle) to change layout, indicator on right LED. No LED for Qwerty, red for Colemak, green for Dvorak

Operating system

  • PN + Q or W or E (original position) for Windows, Mac and Linux respectively

Vim's Native Multiple Cursors Feature

Sublime Text was my favourite text editor, I’ve been following it since its early days. The feature I most liked and can’t live without is the multiple cursors selection. Sublime Text lets you to select and edit string on multiple place at once based on pattern that you defined. I think it was a pain killer feature. The thing was that I always want to go back to Vim. The day I found this repository (https://github.com/terryma/vim-multiple-cursors), I switched back to Vim. vim-multiple-cursors is easy and intuitive as Sublime Text’s althought it has a bit differential. But nowdays vim-multiple-cursors has been broken, especially on the latest Vim release.

I were wondering if there is a way to do the same things with Vim’s internal command. Tada yada thanks to https://vim.fandom.com/wiki/Vim_Tips_Wiki. Not very intuitive as Sublime Text’s or vim-multiple-cursors but it works as intended. Actually it is not a multiple cursors thing, still and all it achieved the same as multiple cursors feature. It’s more like a multiple replay.

Vertical multiple replay

  • Ctrl+v to vertical select your lines, use jj to expand your selection.
  • Hit Shift+i then type the string you want to insert.
  • Pres Escape, the inserted text will be appears on all lines.

Multiple replay by pattern

  • Search your string with /stringyouwanttomark
  • Type cgn then type the new string.
  • Hit Ctrl-c to exit to visual mode.
  • Press . to replay it to the next one.

Update:

This repo showed up in vim-multiple-cursors’s issues (https://github.com/mg979/vim-visual-multi) and it works good too but I think I do stay on native Vim command so I don’t have to rely on my dotfiles for this feature.

UNK rev1 Trackpoint Module

As a person who have been using Thinkpad computers for years, I was always missing the trackpoint feature. I want to type on mechanical keyboard but also I don’t willing to dismiss the nipple. There are few solution for this issue: UHK, Tex Yoda, Tex Shinobi. These all are expensive keyboard, the shipping cost alone is crazy.

Trackpoint module is one of my goals while building UNK and I successfully build it. Here is the video if you wonder how it looks/works.

If you prefer to see it in pictures: https://imgur.com/gallery/cKV1syE

The trackpoint sensor is taken from a dead Thinkpad X201 keyboard. I was planning to make a magnetic detacable connector to the right half of the keyboard, just like magsafe but I didn’t success. So, I’m using another Pro Micro instead. It’s not perfect but it’s my build and I’m happy with it.

My First Custom Handwired Keyboard Build: UNK

More detail and build logs : https://github.com/herpiko/unk

Design Process

TO BE WRITTEN

Tensorflow GPU on Nvidia 1660 Ti

Although my GPU is not listed here, I can confirm that 1660 Ti works. The machine learning training is now significantly faster than using CPU.

➜  imagerec git:(updated-deps) ✗ nvidia-smi
Tue May  5 15:00:40 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 166...  On   | 00000000:01:00.0  On |                  N/A |
| 32%   35C    P8    12W / 130W |    293MiB /  5941MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1549      G   /usr/lib/xorg/Xorg                            18MiB |
|    0      1953      G   /usr/bin/gnome-shell                          48MiB |
|    0      2592      G   /usr/lib/xorg/Xorg                           108MiB |
|    0      2725      G   /usr/bin/gnome-shell                         114MiB |
+-----------------------------------------------------------------------------+
➜  imagerec git:(updated-deps) ✗ python
Python 3.7.7 (default, May  5 2020, 04:20:38) 
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
2020-05-05 15:01:16.900600: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libnvinfer.so.6
2020-05-05 15:01:16.901543: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libnvinfer_plugin.so.6
>>> device_lib.list_local_devices()
2020-05-05 15:01:21.071110: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-05-05 15:01:21.100259: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 3692985000 Hz
2020-05-05 15:01:21.100906: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55d1bb829330 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-05-05 15:01:21.100968: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2020-05-05 15:01:21.105053: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2020-05-05 15:01:21.217053: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-05-05 15:01:21.217492: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55d1bb8b7590 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:
2020-05-05 15:01:21.217525: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): GeForce GTX 1660 Ti, Compute Capability 7.5
2020-05-05 15:01:21.217760: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-05-05 15:01:21.218479: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1555] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: GeForce GTX 1660 Ti computeCapability: 7.5
coreClock: 1.86GHz coreCount: 24 deviceMemorySize: 5.80GiB deviceMemoryBandwidth: 268.26GiB/s
2020-05-05 15:01:21.218590: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-05-05 15:01:21.218654: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10
2020-05-05 15:01:21.220646: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10
2020-05-05 15:01:21.221035: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10
2020-05-05 15:01:21.223176: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10
2020-05-05 15:01:21.224561: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10
2020-05-05 15:01:21.224651: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-05-05 15:01:21.224857: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-05-05 15:01:21.225935: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-05-05 15:01:21.226839: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1697] Adding visible gpu devices: 0
2020-05-05 15:01:21.226907: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-05-05 15:01:21.443386: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1096] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-05-05 15:01:21.443435: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102]      0 
2020-05-05 15:01:21.443446: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] 0:   N 
2020-05-05 15:01:21.443650: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-05-05 15:01:21.444083: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-05-05 15:01:21.444563: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1241] Created TensorFlow device (/device:GPU:0 with 5176 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 7827239615455337760
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 9475332420332566901
physical_device_desc: "device: XLA_CPU device"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 11551463581523616297
physical_device_desc: "device: XLA_GPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 5427691520
locality {
  bus_id: 1
  links {
  }
}
incarnation: 634448236828243524
physical_device_desc: "device: 0, name: GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5"
]
>>> 

Using CPU,

python train.py  32,29s user 6,06s system 333% cpu 11,514 total

Using GPU,

GPU=1 python train.py  7,73s user 2,09s system 109% cpu 8,959 total

The setup is quite complex with various errors and version missmatches. I let myself to symlink different version of CUDA/cuDNN libraries.

If you’re planning to buy a GPU to support your machine learning project, pick a RTX graphics card. It’s tremendously faster with built-in tensor cores. Unlimited budget? Here you go.

I Spilled Coffee on My Mechanical Keyboard

My main keyboard was a Vortex Core. After my wife keep complaining about the noises (now you know it’s the blue one), I bought a Vortex Tab 75 with Cherry MX brown switches (she approved the new typing sound). It’s just a few weeks before I made an accidental disaster to the keyboard.

I was programming on some stuff while snacking Dua Kelinci peanuts. The peanuts were in a small plastic jar on the left of my keyboard. Also, there is a cup of coffee near there. I eat the peanuts by pouring them to my hand, then forwarded the peanuts to my mouth. These actions were done above the keyboard. Then I unconsciously grab the coffee cup and do the same as I thought it’s the peanut jar. So I just literally poured my hand with coffee and the fluid flood the keyboard!

What I’ve done to solve this:

Go to forums and read some advices

Most of the sources I found were from https://www.reddit.com/r/MechanicalKeyboards/.

Prepare some stuff

  • Screwdriver
  • Key puller
  • Solder
  • Vacuum desoldering pump
  • Tin
  • Alcohol
  • Cotton bud

Unplug it and/or turn it off

I grab the keyboard fast, unplugged the cable + batteries, then turned it upside down. Even if the keyboard uses a low voltage to operate, circuit short can causes a problem.

Pull all the keycaps

You need key puller. Full them all carefully.

Take apart and dried the board in a night

I put the board on top of a fan and left it for a night to make sure there is no fluid left behind.

Test it

The next morning, I plugged the keyboard into my computer and tested it. All the keys were worked as intended but some switches went bad. They felt terrible on my fingers. It may be easy for me if I poured plain water instead of coffee. My coffee contained a bit of sugar and it makes a big difference in how the switches feel. Sugar can make your switches sticky. I need to clean up the dried coffee fluid that remains in the switches’ housing. The only way to do this is to desolder the switches first.

I identified the bad switches and mark them with a permanent marker then unplugged the keyboard.

Desolder the bad switches

I carefully desolder the bad switches. A vacuum desoldering pump is a must here. You can’t do desoldering properly without this tool. I think this is the hardest part.

Take apart the switches and clean it with alcohol

I took apart each switch and cleaned it with a small amount of alcohol using the cotton bud. I reassembled the switches’ housing and test it immediately to make sure it does not feel sticky again.

Resolder

I resolder the switches back to the board. For me, resoldering is far much easy than desoldering.

Test it

I tested all the keys again but with keycap on. You need to test it using keycap to get the accurate feel of the switches. All my switches turned good except the K key switch. It still a bit sticky but it’s ok for me.

Reassembly

I reassembled the keyboard to its original shape. All was well.

UPDATE: 20200607

Turned out that the sticky K key became worse and it’s not ok for me because I used it intensively to navigate in Vim. Instead of fixing this particular one, I decided to replace the entire letter keys with Gateron brown switches. Gateron switches feel smoother than Cherry MX although I can’t overcome the difference while fast typing.

Here is a time-lapse video of me replacing the switches,

Data Diri Lengkap di Marketplace

Maraknya penjualan data yang dicuri dari marketplace sedikit banyak tidak lepas dari penggunanya juga, makanya sampai saat ini kalau ada notifikasi peringatan untuk melengkapi data diri (No KTP, KK, dll.) saya tidak melakukannya, termasuk dulu jamannya masih main di FJB Kaskus.

Di beberapa marketplace mensyaratkan kita harus melengkapi data diri tersebut agar akun kita bisa terverifikasi 100 %, tapi saya tetap tidak melakukan, biarlah akun saya tidak terverifikasi 100% tidak mengapa daripada data diri diperjual-belikan, resikonya sih calon pembeli yang belum begitu kenal sangsi dengan dengan reputasi toko online kita.

Segera ganti password dan PIN anda untuk mencegah kejadian yang tidak diinginkan

Satu lagi, jangan terlalu banyak membiarkan saldo kita di akun marketplace, lebih aman lagi kalau kita pindah ke rekening pribadi (walau tidak 100%).



Saatnya tarik saldo ah, kalau ada yang saldonya melimpah dan tidak punya rekening pribadi, saya tidak menolak jika anda mengirimnya ke rekening saya



Cara Install extensi redis di Azure App Service Linux

Pada proyek di salah satu klien di tempat saya bekerja, menggunakan layanan Azure app service untuk mendeploy aplikasi Laravel. Aplikasi tersebut membutuhkan ekstensi redis untuk dapat terhubung dengan cache service di azure yang berbasis Redis. Berikut langkah-langkah pemasangannya. Buka konsol KUDU https://<sitename>.scm.azurewebsites.net Pilih SSH pada konsol SSH, ketikkan perintah berikut...

Felix The Cat (1)


Buku ini cetakan kedua yang dicetak pada tahun 1928, saya temukan pada tahun 2017 di Surabaya. Harganya murah, cuma 20 ribu rupiah. Kisah yang diceritakan dalam buku ini sangat menarik, tak heran memenangi Pulitzer Prize. Umur buku ini hampir 1 abad. Buku yang paling tua yang pernah saya miliki. Tiap lembar kertasnya sangat tebal, setebal sampul buku tulis anak sekolahan, namun juga sangat rapuh. Saya menemukannya di belantara pasar Blauran, Surabaya. Buku ini terjepit di tumpukan paling bawah dari buku-buku yang mungkin tidak lagi dibaca oleh orang-orang. Kotor oleh tanah, sarang laba-laba dan beraroma tikus dan (maaf) pipis kucing. Yang pernah mengunjungi sektor buku bekas dari pasar Blauran di sekitar tahun 2015-2018 mungkin dapat membayangkan situasi yang saya maksud. Tapi bukan buku ini yang ingin saya bahas, melainkan buku lain yang diberikan sebagai bonus oleh penjual buku. Judulnya “Welcome To Felix the Cat”.


Felix The Cat sempat menarik perhatian saya karena sampulnya sangat tebal dan tidak ada nama penulis. Ketika saya buka, ternyata isinya tulisan tangan. Setelah saya bolak-balik dan baca cepat, saya menyadari bahwa ini adalah buku harian. Saya membiarkan buku itu dimasukkan ke kantong belanja saya.

Saya membaca separuh isi buku itu sepanjang perjalanan balik ke Jakarta. Setelah sampai di Jakarta, saya malah terbersit keinginan untuk kembali lagi ke Surabaya, mencari penulis buku ini.

Bersambung.

Screencast OBS Studio ke Google Meet di openSUSE

Saat ini masanya, masa pandemi ini banyak yang melakukan pekerjaan dari rumah (“WFH”). Salah satu kebutuhan saat meeting secara daring adalah melakukan screencasting, atau berbagi layar. Catatan ini menjelaskan bagaimana cara melakukannya dengan OBS Studio dan Google Meet. OS yang saya gunakan di laptop adalah openSUSE Leap 15.1. Yang perlu...

Xcode Not Enough Disk Space to Install

I need to update my Xcode on my MacBook Air, it only has 128 GB Flash Storage, and it is hard to upgrade the storage, obviously it has limited free storage, so I need to free some spaces, deleting my old files.

But, even there is already 23 GB free storage, it keep complaining, not enough disk space.

After I had 26 GB free storage, I can continue the update.

Membuat CI/CD di GitLab CI

Sekarang saatnya saya akan membuat sebuah catatan tentang bagaimana kita akan membuat CI/CD (Continuous Integration & Continuous Delivery/Deployment) di GitLab. Ini merupakan contoh sederhana yang mungkin dapat Anda jadikan acuan jika Anda sama sekali baru dalam dunia CI/CD, khususnya di GitLab CI. Istilah-Istilah Penting Hal pertama yang ingin saya jelaskan...

Raise/Lower Hand on Zoom Cloud Meeting

Raise/Lower Hand on Zoom Cloud Meeting is a very useful feature.

During online meeting, or online class using Zoom, not all participant can talk at the same time, sometimes the host will mute all participants, when participant want to interrupt, or asking something, so they need to raise the hand.

It seems like not all Zoom user have Raise/Lower Hand icon on the main window, the easiest way to do so is using short cut, for Mac user, the shortcut is: `option + y`.


Install GitLab Runner dengan Ansible

Setelah kita selesai menyiapkan server GitLab di postingan sebelumnya ini dan/atau ini, selanjutnya akan kita setup server atau instance untuk digunakan sebagai Runner. Apa itu GitLab Runner? GitLab Runner merupakan aplikasi sumber terbuka yang digunakan untuk menjalankan job dan mengirim kembali hasilnya ke GitLab. Sebagai penghubung dengan GitLab CI, layanan...

Quarantine PC Build

My wife has an old wish: a gaming platform to play both old games (e.g. Heroes of Annihilated Empires) and new games (e.g. The Witcher 3). I’ve setup a trial version VMWare Fusion on her Macbook Air to let her playing HoAE there but that old game does not run smoothly under VMWare DirectX 11 driver. Our Nintendo 3DS is not with us for now and our old Xbox 360 has been dead for a while (but the controllers still run well). On the other hand, self-quarantine easily gets us bored.

We already considered to buy a new gaming console but after some researches we reached a conclusion. It’s still cheaper to gaming on PC platfrom instead of console.

So I thought about building a budget PC gaming for her during this coronavirus quarantine period. PC Master Race subreddit call this Quarantine Build. The PC is mainly for my wife but sometimes I can use it. My goals are:

  • The budget should be less than 8 million rupiahs.
  • It should be able to play recent games (low setting is no problem for us)
  • It can support my job occasionally (huge RAM capacity, faster storage, minimum of 4 core processors for compiling purpose).

Let’s dive into the detail.

CPU and GPU: Ryzen 5 3400G with Radeon RX Vega 11 Graphics

After doing research on CPU and GPU, I decided to pick a Ryzen processor with iGPU. Radeon name still sounds great for me. If I bought a discrete GPU it’ll add at least another 4 millions to the budget. I’ll not make it. The CPU has 4 cores with 8 threads and 3.7Ghz base frequency. Some reviews said that this iGPU can run The Witcher 3 smoothly on low or medium settings. Should be ok for her. The CPU package provides stock CPU cooler named Wraith Spire.

Its price was almost at the same level as Ryzen 5 2500X (same core, thread and frequency), but with integrated GPU. The CPU has a 3 years warranty from EMD.

Motherboard: ASUS Prime A320M-K

ASUS said this motherboard has an overclocking feature. It’s conflicted with the fact that A320 chipset is not capable of OC. The recommended motherboards for 4500 series Ryzen are the A450, A550, and the X series chipsets. Some motherboard vendor updated their A320 motherboard to support the recent processors. This is a risky bet. If I got the outdated BIOS version, my build will not turn on correctly and show no display at all. At worst, I’ll have to:

  • find another old processor like Atlhon 200GE or
  • submit a request to AMD to send me a bootkit (also an Athlon 200GE) or
  • return the motherboard to the retailer and ask them to update the BIOS first.

The last one is not so convincing. I took the bet anyway and be prepared for bad luck.

The motherboard has a 3 years warranty as well.

RAM: 32GB V-Gen Platinum DDR 4 2666Mhz (2x16GB)

I want to play with k8s and be able to open hundreds of tabs on Firefox. My original plan is to buy a single 16GB RAM then add another 16GB several month later. But after seeing rupiah position going bad recently, I decided to pick 2 sticks at once instead. It will be 32GB RAM with dual channel activated. The processor supports up to 2933MHz and the motherboard supports it up to 3200Mhz. I see no cheap 2933Mhz at the market place and grab a pair of 2666Mhz RAM.

My first choice is the Klevv Bolt series but they are out of stocks everywhere. I got VGEN instead. This V-Gen RAM has no heatsink, just like the Klevv Value series. At least it’s black, matched with the mainboard.

Storage: Intel SSD 660P 512GB NVMe 2280 PCIe Gen 3 x4

My portable computer (X1 Carbon Gen 3) is fast enough with its NVME storage and I want NMVE SSD too in this build. At first Samsung EVO 970 is on my list but then this will not be a budget build. So I choose Intel 660p series for half of the price of Samsung EVO 970.

Power Supply Unit

I do care about PSU after a plurker gave a piece of advice so I pick a Cooler Master MWE 450W, an 80 plus PSU. Cheap enough but it has decent cable socket configuration, like 8 pins cable to power CPU and could handle most of the midrange graphic cards for future upgrade. The cables are in black color. I’ve no intent for overclocking, 450 watts should be enough.

Case: Micro ATX aigo darkFlash DLM22 Titanium

It’s a cheap minimalist but elegant case. Until now I don’t know if PC case has evolved to having the PSU on the bottom instead of the top.

Fans

Cheap fans with blue LED. I expected a modern fan with 3 pins small socket but I got otherwise. But that’s not a problem since the PSU has plenty of standard 4 pins unused.

Precaution on coronavirus

I cleaned then quarantined all the arrived packages for hours before opening them.

Building

Just like the old days, PC building is always fun.

After some digging, it turned out that this motherboard has X370 chipset instead of A320! No wonder if it has overclocking feature in the BIOS. The motherboard recognizes the Ryzen 5 3400G with no issue.

The bad part is the motherboard has some defects: it does not recognize the LAN port and the third PCIe lane. After all this coronavirus is over, I’ll look after the warranty.

Honestly, I was surprised by how the PC component has evolved since I was not following it for years.

Future Upgrade Plan

The motherboard has wide support for new Ryzen CPUs. My plan is after a year or more, I want to upgrade the CPU to non-APU with eight cores or more (maybe a zen 3 generation) and add a good graphic card (a GPU that equals with NVidia 1660 Ti or 2060).

PC Building in the past

I used to be a PC person. My first PC (actually it’s my dad’s PC) was an Intel 486. In 2015 I gave up my PC to my friend (a Pentium IV, 3.06GHz with hyperthreading and 4GB RAM) then moved to a bigger city. Since then my life depends on a portable computer/laptop. My PC was considered old at that time. PSU cables used to be yellow and red. PSU was placed on the top instead of the bottom. Cable management? There was no room on the back of the motherboard, you supposed to ties the cable manually. Even the best cable management was not neat enough for today’s standard. Boards are green, so are the RAM sticks. Graphic cards were used to be fanless. If it has a fan, it’s a small fan. Fans are loud compared to today’s fans that have a modern bearing. I have a small LCD screen but I preferred the CRT screen. Long live the CRT. PC cases were strong and heavy. It has front slots for CD/DVD ROMs and a floppy disk. BIOS user interface used to be plain just like the ncursed based UI, blue and white pixels.

I used to play with various operating systems, included Hackintosh.

The motherboard was placed on the table just like that.

Once I got a case, there was an apple sticker as I was dreaming of owning a Mac computer.

Conclusion

If you’re planning to build a PC, take a look at https://pcpartpicker.com/. It’ll help you to find the compatibility information and also the estimated watt needed for your build. Do not forget take some precautions while handling the packages and components. Wash your hand frequently.

Update: 2020/04/19

It was an early birthday present from my wife. It’s a bit silly to have two-but-not-scalable GPUs in one system but I’m happy with them. The Ryzen GPU can be used as spare if this discrete GPU gone wrong. At the time of this writing, 1660Ti is the latest GTX of NVidia. It has Turing architecture but without ray tracing feature (RTX). Any AAA games run well.

Update: 2020/04/29

My Dream PC

So I thought about what if I got a huge amount of cash to build my dream PC. Then it should be consist of:

  • Motherboard: ASUS ROG Strix AMD AM4 X570 Mini-ITX
  • CPU: Ryzen 9 3950X (3.5 GHz,105 Watt,64M L3 Cache,16 Cores)
  • GPU: AMD Radeon 5700 XT
  • HSF: Noctua NH-D15
  • RAM: G.Skill Trident Z RGB 32GB (16gb x 2) 3200mhz
  • Storage 1: Samsung 970 EVO NVMe M.2 SSD 500GB
  • Storage 2: Samsung 860 Pro 2TB x 2 (RAID 1/Mirroring)
  • PSU: Corsair CX650M 650 Watt 80+ Bronze
  • Monitor: Dell UltraSharp 25 inch U2518D x 2
  • Keyboard: Ultimate Hacking Keyboard Blue Switch with trackpad module.
  • Mouse: Logitech G304
  • Case: NZXT H200 - Mini-ITX

Server CCTV dengan Shinobi Video – Bag. 3, Menggunakan IP Cam Publik

Bagaimana kalau mau belajar pemasangan shinobi namun tidak memiliki IP Cam? ada caranya kah?

Ada. Pasti Ada

Salah satu caranya adalah dengan menggunakan IP Cam publik yang berada di beberapa wilayah/negara. Daftarnya bisa didapat di http://www.insecam.org/. Tidak semua bisa digunakan, namun tentu saja ada yang bisa. Saya sendiri menemukan satu yang sukses digunakan. Tahapannya kurang lebih seperti ini:

  1. Cari salah satu kamera. Saya menemukan yang berada di Jepang. http://www.insecam.org/en/view/534370/.
  2. Ambil IP Addressnya, investigasi url-urlnya dengan iSpy agar bisa mendapat informasi lebih detil.
  3. Jika tanpa nomor 2, juga bisa, kebetulan kameranya support ONVIF, tinggal masukin alamat IP dan atur-atur dan coba-coba sampai pas
  4. Khusus ini, saya menemukan bahwa konfigurasi yang pas itu MJPEG.
IP Cam PublikIP Cam Publik

Selamat mencoba dan latihan untuk kamera yang lain. Banyak spot-spot bagus juga lho.

 

PS: CCTV Xiaomi Yi Max 02 1080p Outdoor Smart IP Cam ini ndak support ONVIF gak bisa diakses via rtsp jadinya.

Server CCTV dengan Shinobi Video – Bag. 2, Pemasangan Shinobi

Pemasangan Shinobi cukup mudah sekali, cukup menjalankan sebaris perintah dari root:

bash <(curl -s https://gitlab.com/Shinobi-Systems/Shinobi-Installer/raw/master/shinobi-install.sh)

Selanjutnya tinggal mengikuti langkah-langkah yang ada di layar. Saya memilih mengambil dari branch development agar mendapatkan fitur-fitur terbaru sekaligus testing. Dokumentasi pemasangan secara lengkap bisa dibaca di sini.

Berikut hal-hal utama yang perlu dilakukan setelah pemasangan:

Peramban Firefox

Gunakan peramban Firefox. Karena peramban Chrome tidak mau bila ada https dan self sign. Juka untuk streaming beberapa video cctv. Firefox bekerja lebih benar dari pada Chrome. Enggak tau kenapa.

Masuk sebagai admin dan buat user

Kita perlu memasukkan url http://alamat-ip-shinobi-server:8080/super. User / Pass bakunya adalah admin@shinobi.video / admin. Dari halaman ini kita bisa membuat user baru untuk masuk ke dashboard shinobi server. Juga untuk mengganti password akun admin tersebut.

Super AdminSuper Admin

Shinobi Dashboard

Untuk masuk ke dashboard, buka peramban dan arahkan ke http://alamat-ip-shinobi-server:8080/ lalu masukkan username/password yang sudah dibuat tadi.

Menambahkan Kamera

Klik tombol + (Add Monitor). Di sini kamera disebut monitor. Lalu tinggal isikan parameter-parameter yang sesuai kamera. Saya mencoba sendiri dan ribet. Setelah beberapa kali percobaan, baru berhasil.

Menambah KameraMenambah Kamera

Ada cara gampangnya, melalui menu pojok kiri atas – ONVIF. Lalu isikan alamat ip dan klik tombol search. Secara pintar, shinobi bisa mendeteksi kamera dalam jaringan yang kombatibel ONVIF. Jika ketemu, akan ditampilkan deskripsi kamera, bahkan bisa tahu merek/modelnya. Lalu tinggal klik tombol bergambar 2 dokumen (seperti ikon duplicate).

Add Monitor - ONVIFAdd Monitor – ONVIF

Selanjutnya tinggal melengkapi/mengganti isian yang ditampilkan (sama dengan jendela Add Monitor). Tinggal disesuaikan saja atau langsung Save. Secara baku, kamera akan memiliki mode View Only. Kita bisa mengatur/mengganti modenya menjadi Record.

Dua Kamera/MonitorDua Kamera/Monitor

Power Video Viewer

Digunakan untuk melihat video yang sudah tersimpan terekam. Tombol ikonnya mirip seperti tag/point pada peta.

Video ViewerVideo Viewer

Seingat saya, Power Video Viewer ini yang tidak bisa di Chrome.

Dah itu dulu tulisan kali ini. Tulisan berikutnya saya akan jelaskan cara optimasinya.

 

*Featured image diambil dari http://getwallpapers.com/collection/hidden-leaf-village-wallpaper

Install GitLab dengan Ansible

Nah, kemarin sudah kita bahas instalasi GitLab secara manual di postingan sebelumnya. Kali ini saya akan tuliskan langkah-langkah instalasi GitLab dengan cara yang lebih simple, yaitu dengan Ansible. Ansible adalah sebuah alat otomasi yang dikembangkan oleh RedHat. Beberapa kata kunci yang melekat pada Ansible adalah “automation tool”, “configuration management”, “infrastructure...

Server CCTV dengan Shinobi Video – Bag. 1, IP Cam

Oprekan kali ini bermula dari lokasi proyek rumah yang kemalingan. Saat awal bangun, kemalingan genset, berikutnya beberapa minggu lalu, para tukang kemalingan handphone.

Saya memiliki cctv yang ada di rumah, subsidi dari Pak Bos yang memiliki perusahaan penjualan cctv. Yang sudah dipakai, sangat mudah dioperasikan. Just work. Namun kali ini sejak pandemi, saya kepikir untuk memanage cctv tersebut dengan linux, entah raspi atau pakai komputer-komputer spek rendah.

Sebelumnya, saya sama sekali tidak mengerti teknologi cctv beserta perabotannya. Namun sejak ngoprek ini, pengetahuan jadi bertambah. Awalnya hanya tau/nemu Shinobi Video saja, setelah itu bingung, harus bagaimana? cara koneksinya ke cctv bagaimana?

Dinamakan IP Cam, tentunya memiliki IP, umumnya, dari pabrikan diatur menjadi dhcp client. Sehingga dapat IP otomatis dari router/server dhcp. Saya dipinjami IP Cam oleh Pak Iwan Tahari. Dalam kardusnya tidak ada informasi apapun (buku manual juga tidak ada). Merek/Pabrikan pembuatnya juga tidak tahu. Jadi dengan coba-coba colokin aja ke router/modem yang ada di rumah, lalu diintip dapat IP berapa, nah itu dia tinggal dipanggil IPnya di peramban.

IP CamIP Cam

Setelah sukses dapat IP, saya punya 1 komputer yang rencananya jadi server cctv dan sudah ada dhcp servernya, saya sambungkan IP Cam tersebut ke komputer . Dapat IP 10.42.0.151. Tinggal dipanggil di peramban dan muncul antar muka web si kamera.

Antarmuka WebAntarmuka Web

Hal utama yang perlu dilakukan adala mengatur zona waktu/waktu, agar nantinya saat dipakai, timestamp yang ditampilkan sesuai. Hal berikutnya adalah pengaturan kualitas gambar. Kamera ini sanggup merekam video/gambar dengan codec H265 dan H264, juga bisa merekam audio serta pengaturan fps dan kualitas. Saya mengatur kualitas medium dan codec H264 (karena H265, rata-rata browser tidak mulus menampilkannya).

Selanjutnya, bagaimana cara menguji bahwa kamera tersebut bisa digunakan? Saya cukup bingung dengan pertanyaan sendiri. Mencari-cari, akhirnya menemukan jawaban, bahwa bisa menguji dengan menggunakan VLC. Tinggal memasukkan url rtp/udp melalui menu Open Network. Nah bagaimana mendapatkan urlnya? macem-macem jawabnya dan bingung. Namun saya menemukan aplikasi pembantu, yang bisa memandu kita.

Aplikasinya bernama iSpy, opensource, adanya di OS Windows saja. Cara penggunaannya cukup mudah, bisa mencari berdasarkan IP yang kita masukkan atau dia mencari melalui jaringan yang ada. Setelah itu dia akan memberikan info ke kita daftar url yang bisa digunakan.

iSpyiSpy

Ada beberapa format yang perlu diperhatikan:

  • ONVIF, ini format standar IP Cam, jika bisa ini, dengan Shinobi bisa otomatis dalam pendeteksiannya.
  • RTSP, catat url rtsp yang diberikan, di atas contohnya rtsp://ip:8554/live/ch00_0
VLC dengan rtspVLC dengan rtsp

Setelah sukses tampil di VLC, kita bisa melanjutkan pemasangan Shinobi Video.

Install GitLab di Ubuntu 18.04

Setelah sekian lama, saya merasa perlu memerbarui konten blog ini. Kali ini saya akan menulis ulang panduan instalasi GitLab di Ubuntu 18.04 dalam Bahasa Indonesia. Dokumentasi resminya dapat langsung diakses melalui halaman ini. Di sana cukup singkat dan mudah dipahami. Namun saya menambah beberapa cuil penjelasan tambahan berdasarkan hasil praktek...

Membuat VM dengan Ubuntu Cloud Image di KVM/virsh

PERINGATAN, Aku akan mengambil harta karunmu. Eh, bukan. Kalo disebut tutorial sebenarnya enggak juga, postingan ini lebih ke catatan pribadi. Dan mungkin akan banyak yang sulit dipahami, terutama jika pembaca belum pernah menggunakan Linux, atau belum pernah menggunakan virsh. Namun, saya akan tetap menulikan ini sebagai “tutorial” yang mungkin akan...

Pasang ulang Weibu F3C – Endless Mini PC (unreleased)

Saya mendapatkan komputer ini dari Baris, CEO Endless Solutions jaman saya masih jadi ambassador pada 2017. Sudah terpasang Endless OS dan berfungsi dengan baik. Beberapa hari ini saya memutuskan untuk mengganti OSnya dengan OS apapun yang memungkinkan.

Pengujian pertama dengan openSUSE Tumbleweed, pemasangan berjalan mulus, masuk desktop agak kacau dikarenakan layar HDMI dianggap sebagai layar extended. Jadi harus mengarahkan kursor yang tepat dan mengatur ulang layar beserta resolusinya. Setelah masuk desktop, wireless tidak bisa digunakan. ini sudah sesuai prediksi. Pasang firmware non-free juga tidak membuahkan hasil.

Pengujian berikutnya dengan Ubuntu 20.04 yang masih Beta. Hampir sama, perbedaannya hanya si Ubuntu sedikit lebih pintar mengenali layar dari pada openSUSE. Namun tetap perlu mengatur resolusi layarnya. Wireless juga sama-sama tidak bisa digunakan walaupun sudah memasang firmware non-free.

Berikutnya nyari firmware yang dipakai Endless OS, nemu di github https://github.com/endlessm/linux-firmware. Coba dipasang … jreng, tetep gagal. Karena masih penasaran, saya unduh iso Endless OS terkini, dan install lagi. Selanjutnya ambil /lib/firmware untuk dibandingkan, ternyata ada sedikit (bisa dibilang banyak sih) tambahan dari yang ada di github. Saya rangkum di https://lumbung.mycoop.id/ahmadharis/linux-firmware/commit/ee4aec2c50e82a06861e2b166814d418e3d5046b. Setelah dipasang, reboot, tetep gak mau.

Baca-baca dmesg, terus guling-guling, nemu titik terang untuk ambil dari https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20161130-3+rpt3_all.deb terus dibongkar. Dicomot yang brcmfmac43455. Saya rangkum di https://lumbung.mycoop.id/ahmadharis/linux-firmware/commit/1c1f19900b2399ce123dd5e5d2978aa6ba21e397.

Dicoba di Ubuntu 20.04 sukses. Di openSUSE Tumbleweed pun demikian.

openSUSE TumbleweedopenSUSE Tumbleweed

 

Ubuntu 20.04Ubuntu 20.04

Macbook Jadul dengan openSUSE Tumbleweed

Jadi kapan hari menjenguk duo R, dan keinget kalau ada “harta” lama yang gak dipakai. Jadinya saya minta dan dicoba dihidupkan. Macbook2,1. Laptop jaman Pak Beye kata teman saya.

Macbook2,1Macbook2,1

Ini komputer cukup nyusahin. Kalau pakai MacOS X mentok di Lion. Walhasil gak bisa ngapa-ngapain, wong banyak aplikasi ndak support. Boot usb linux juga ndak mau, gak kayak Macbook keluaran baru yang mau boot linux. Dulu masang ubuntu lewat media CD. Berhubung sudah gak punya CD, alhasil menggunakan segala cara agar bisa boot. Cara termudah adalah memasang ubuntu dari komputer lain, lalu pindah disknya ke macbook jadul tersebut.

Bagaimana dengan OS Linux lainnya? susah … gak bisa kepasang. Kesimpulan akhir, karena grub yang terpasang di ubuntu itu grub-pc i386 (walaupun pakai arch 64 bit). Jadi yang mulus terpasang pertama kali adalah ubuntu.

Selanjutnya usaha agar memasang openSUSE Tumbleweed. Berbagai cara sudah digunakan, ketemu kesimpulan cara yang mujarab sebagai berikut:

  1. Pasang opensuse (boot legacy, jangan uefi) pada disk (usb flashdisk) lain dengan komputer lain.
  2. Sediakan partisi kosong ext4 di macbook jadul tersebut.
  3. Salin isi usb flashdisk pada nomor 1 ke dalam partisi ext4 tadi. Salin dengan opsi -rapv biar kebawa semua atribut dan permission berkasnya.
  4. Uji dengan chroot, kalau mulus berarti sudah benar.
  5. Ubah fstab, sesuaikan dengan uuid yang baru, pindah motherboard/komputer akan membuat beda uuid.
  6. Edit grub di ubuntu, sesuaikan.

Ribet kan? tapi seru, buat nambah kesibukan selama masa diam di rumah.

Pergi ke FOSDEM 2020

Ini nulisnya telat banget, juga males nulis banyak karena udah telat. Intinya sih pingin pamer kalau berhasil pergi ke FOSDEM 2020 di Belgia. Dan seru-seruan bersama teman-teman TDF/LibreOffice.

TDF Board & MCTDF Board & MC

 

Biar kayak orang-orangBiar kayak orang-orang

 

Konser BrexitKonser Brexit

 

Bawaan balik ke kampungBawaan balik ke kampung

Foto lainnya masih banyak sih, tapi ndak minat ditaruh di sini. 🙂
Perjalanan ini ditanggung sepenuhnya oleh The Document Foundation (kecuali pembelian oleh-oleh).

Vim Dev Containers

I’ve been using vim and docker previously, but this post that explain how to use vscode devcontainers amaze me.

Pre-Req

Before try this tutorial you should have docker and docker-compose installed.

Setup Global .gitignore

Create .gitignore_global file to ignore .containers folder

$ echo '.containers' > ~/.gitignore_global

Then enable it by configure git

$ git config --global core.excludesfile ~/.gitignore_global

Create .containers directory for your project

In this post, I will use ruby repository for example. You can clone the repository from github

$ cd workspace
$ git clone https://github.com/ruby/ruby.git

Create your .containers directory inside ruby repository

$ cd ruby
$ mkdir .containers
$ touch .containers/docker-compose.yml
$ touch .containers/Dockerfile

You will have file structure similar to this

/home/user/workspace/ruby/
    .containers
    | | docker-compose.yml
    | | Dockerfile
    other_ruby_files

Edit your .containers/Dockerfile with this

FROM ubuntu:18.04

WORKDIR /workspace

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y git ruby autoconf bison gcc make zlib1g-dev libffi-dev libreadline-dev libgdbm-dev libssl-dev build-essential tzdata

You’ll need tzdata to running timezone-related tests in ruby repository

Before create compose file, some tests in ruby refer to [::1] as localhost, which makes us to enable ipv6 in our container. Configure your docker to enable ipv6 by editing /etc/docker/daemon.json

{
    "ipv6": true,
    "fixed-cidr-v6": "2001:db8:1::/64"
}

Then reload docker with $ sudo systemctl reload docker

Edit your .containers/docker-compose.yml with

version: '3'

services:
  dev:
    build:
      dockerfile: Dockerfile
      context: ./
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    command: sleep infinity
    volumes:
      - .bash_history:/root/.bash_history
      - ./..:/workspace:cached

To make persistent command history in our container, we can mount .bash_history.

Build Containers

Next we need to build our containers then running it as a daemon

$ docker-compose -f .containers/docker-compose.yml build
$ docker-compose -f .containers/docker-compose.yml up -d

To compile ruby and running tests, we need to use container shell

$ docker-compose -f .containers/docker-compose.yml exec dev bash

Build Ruby and Running Tests

To build ruby we need to run several commands based on README.md files

These commands run in your docker container

root@docker-hash-container:/workspace# autoconf
root@docker-hash-container:/workspace# ./configure
root@docker-hash-container:/workspace# make

To running tests

root@docker-hash-container:/workspace# make test-all #running all tests
root@docker-hash-container:/workspace# make test-all TESTS='test/ruby/test_time_tz.rb' #running single file test

Create shortcut

If you want to connect container’s shell via vim, you can add following lines to your .vimrc

nnoremap <silent> <leader>dev :terminal docker-compose -f .containers/docker-compose.yml exec dev bash<CR>

Now you can connect to container’s shell with <leader>dev, but you should spawn your container first. I also create alias in my .zshrc for easier command

alias container='docker-compose -f .containers/docker-compose.yml'

Now you can spawn or kill container with

$ container build #for build container
$ container up -d #for running container in background
$ container exec dev bash #for connecting to container shell
$ container down #for shutting down container

What Next

Now you can still use vim as editor, and have containerized development env.

Beli Kuota Rela, Tapi Beli Aplikasi Tidak Mau

Beberapa hari lalu saya mengisi acara Seminar Pendidikan yang diselenggarakan oleh salah satu yayasan, temanya adalah "Implementasi Belajar Sambil Bermain lewat Permainan di Gawai" (kurang lebih seperti itu kalau diterjemahkan ke bahasa Indonesia).

Salah satu Materi saya adalah mengenai penggunaan GCompris untuk belajar sesuai kurikulum yang berlaku.

Pada sesi tanya jawab ada salah seorang peserta yang bertanya;
  • Apakah GCompris bisa diinstal di Android?
  • Bisa, jawab saya singkat, cari saja di Playstore
Kemudian sebagian besar peserta seminar mulai mencarinya di playstore.
Salah seorang peserta bertanya;
  • Kok berbayar?

  • Ya, jawab saya dengan beberapa penjelasan singkat
  • Peserta lain kemudian menimpali kalau harganya terlalu mahal untuk sebuah permainan.
Saya pun menjawab:
  • Dalam satu bulan anda belu kuota habis berapa?
Dia jawab
  • Kurang lebih 100 ribu untuk saya, kalau untuk anak saya 20 ribu untuk seminggu.
Kemudian saya menimpali, Anda beli kuota setiap bulan saja tidak sayang, kok beli aplikasi yang harganya cuma 99.000 dan bisa dipakai seumur Android sayang banget.
Belum lagi kuota untuk anaknya yang dipakai untuk game online yang tidak jelas unsur pendidikannya.

Padahal rata-rata peserta seminar adalah tenaga pendidik (guru), termasuk kedua peserta yang bertanya tadi.
Sepertinya tingkat Edukasi untuk tenaga pendidik di Indonesia masih perlu ditingkatkan lagi.
 

Penulis Yang Egois



Belakangan ini saya memang sedang sering berinteraksi dengan orang-orang yang bergerak di bidang Keperpustakaan atau Literasi.

Dari obrolan dengan beberapa penulis buku dalam kegiatan tersebut, saya mendapatkan fakta bahwa kebanyakan penulis tersebutnya ketika mengawali jadi penulis menggunakan aplikasi yang tidak legal.
Sebagian dari mereka sadar bahwa aplikasi yang dia gunakan untuk menulis itu ilegal.

Sebagian lagi tidak mengetahuinya sama sekali karena ketika membeli komputer/laptop aplikasi tersebut sudah terpasang.
Saat sudah menjadi penulis terkenal, sebagian sudah menggunakan aplikasi yang legal dengan membelinya.

Sebagian lagi tetap menggunakan aplikasi yang ilegal walau sudah mampu membelinya dari hasil menulis buku. Dia pun tahu dan sadar kalau yang dia lakukan tidak benar.

Ada juga yang walau sudah menerbitkan puluhan judul buku tapi tetap tidak tahu kalau aplikasi yang dia gunakan untuk menulis itu ilegal.

Padahal di semua buku yang dia tulis, kemudian diterbitkan selalu tertulis kalimat kurang lebih seperti ini  
Hak Cipta dilindungi undang-undang. Dilarang memperbanyak atau memindahkan sebagian atau seluruh isi buku ini dalam bentuk apapun, baik secara elektronis maupun mekanis, termasuk memfotokopi, merekam atau dengan sistem penyimpanan lainnya tanpa izin tertulis dari penulis.


Dia sendiri ketika menulis buku sudah melanggar hak cipta, atau menggunakan aplikasi hasil penggandaan tanpa seijin pembuatnya, lha buku yang dia tulis kok tidak boleh digandakan!
Menurut saya ini namanya penulis yang egois dan dzalim.

Pesan saya, daripada menulis dengan aplikasi ilegal karena memang belum mampu beli, lebih baik pakai aplikasi yang walau gratis tapi legal.


Fungsi Fitur Arrange di Inkscape

Salah seorang pengguna Inkscape pemula ada yang bertanya mengenai fungsi dari fitur Arangge, mungkin karena bingung cara menggunakannya, atau belum pernah mencoba menggunakannya tapi sudah bertanya duluan.

Sayangnya lagi gambar yang ia lampirkan berupa hasil foto yang kurang jelas, mungkin ia tidak tahu cara mengambil cuplikan layar (screenshot) di komputer, ya mohon dimaklumi saja.

Sebenarnya  penjelasan mengenai fitur tersebut sudah saya tulis di buku Desain Grafis dengan Inkscape versi 2 yang rencanya akan terbit setelah Inkscape versi 1.0 rilis filnal secara resmi.

Di bawah ini adalah penjelasan singkat penggunaan Arrange yang saya Salin-Tempel dari buku yang sedang saya kerjakan tersebut.


Arrange digunakan untuk mengatur beberapa object yang letaknya tidak beraturan supaya rapi, cara kerjanya adalah menata object-object tersebut membentuk kolom dan baris dengan jarak tertentu sesuai parameter yang telah dilakukan.
Jendela pengaturan Arrange dapat ditampilkan dengan klik Object => Arrange.

Pada jendela pengaturan Arrange terdapat dua Tab, yaitu Rectangluar grid dan Polar Coordinate.

Berikut contoh penggunaan pada tab Rectangluar grid:
  • Seleksi object yang akan diatur

  • Isikan nilai tertentu pada kotak Rows dan Columns (contoh: 5 x 5)
  • Lakukan pengaturan pada menu Alignment (contoh: Center) 
  • Pilih salah satu menu Fit into selection box atau Set spacing (contoh: pilih Set spacing)
  • Isikan nilai tertentu pada kotak X dan Y (contoh: 2 X 2 cm)

Jika semua pengaturan dirasa sudah selesai dan benar, klik tombol Arrange, maka hasilnya seperti gambar di bawah ini


Berikut contoh penggunaan pada tab Polar Coordinate:
  • Pilih tab Polar Coordinate
  • Pada menu Objecs' bounding boxes: pilih Center

Pada menu Arrange on pilih Parameterized, maka segera tampil submenu seperti gambar di bawah ini:


Sebagai contoh latihan, lakukan langkah seperti berikut:
  • Pada kotak Center X/Y masing-masing isi dengan nilai 20,00 cm 
  • Pada kotak Radius X/Y masing-masing isi dengan nilai 20,00 cm
  • Pada kotak Angle X/Y isi dengan nilai 0,00 dan 360, jangan lupa unitnya pilih derajat (bukan turn, rad, atau grad).
  • Beri tanda centang pada Rotate objects
Jika semua pengaturan dirasa sudah selesai dan benar, klik tombol Arrange, maka hasilnya seperti gambar di bawah ini
Demikian penjelasan singkat contoh penggunaan fitur Arrange pada Inkscape.
Sampai jumpa pada tutorial menarik lainnya.
-
Sumber:
Draf naskah buku Desain Grafis dengan Inkscape v.2



Rute Bus Salatiga - Semarang

Sebenarnya penulis sudah lama ingin membuat artikel singkat ini, namun lupa terus karena lebih banyak menulis buku.

Artikel ini hanya berupa info singkat mengenai beberapa rute bus Salatiga - Semarang jika anda ingin  menggunakan moda transportasi umum.
Penulis sengaja menulis artikel ini untuk membatu pembaca yang bingung ketika memilih bus dari Salatiga yang mau ke Semarang.
  
Jika Anda akan naik Bus umum dari Salatiga ke Semarang memang harus lebih cermat, karena terdapat 3 tujuan terminal yang beda, dan satu bus jurusan tengah kota.

Salatiga - Terminal Mangkang
Bus ini cocok jika anda akan meneruskan perjalanan ke Semarang wilayah Barat dan Utara, Misalnya ke Bandara Ahmad Yani, Ngalian (Boja), Kendal, Jakarta, dan lain-lain. Anda bisa menggunakan Bus Patas Solo - Semarang yang lewat Tol Krapyak.




Salatiga - Semarang Kota
Bus ini rutenya lewat tengah kota (membelah jalur tengah kota), sangat cocok anda naiki jika tujuan anda adalah ke Semarang kota atau tengah, Misalnya ke Tembalang, Jatingaleh, RSUD Kariadi, Tugu Muda, Poncol, Johar, Kota lama, Tawang, dan lain-lain.
Anda bisa menggunakan Bus jurusan Salatiga - Semarang yang berupa Mini Bus, dan bus ini satu-satunya yang tidak lewat tol ketika ke Semarang, namun ketika bus ini kembali ke Salatiga (rute seblaiknya) lewat tol.
Bus jurusan ini hanya berjalan antara pukul 05.00 s/d 17.00 WIB.


Salatiga - Terminal Terboyo
Bus ini cocok jika anda akan meneruskan perjalanan ke wilayah Genuk, Demak, Kudus, Rembang, Surabaya (jalur Pantura), dan lain-lain. Namun perlu diingat, bahwa saat ini sudah jarang Bus dengan juruan Terboyo, karena terminal Terboyo sudah ditutup untuk Bus Umum dan dialih-fungsikan sebagai terminal Peti Kemas.
Namun masih ada satu-dua Bus Patas Solo - Semarang yang ke Terboyo, Bus ini melewati Tol Tembalang - Kaligawe, yaitu masuk gerbang tol Sukun dan keluar gerbang tol Kaligawe. Yang perlu diingat bahwa Bus jurusan ini tidak masuk ke terminal.



Salatiga - Terminal Penggaron
Rute Bus ini sejatinya sebagai pengganti Terminal Bus Terboyo, sangat cocok jika anda akan meneruskan perjalanan ke wilayah Kudus, Pati, Purwodadi, dan lain-lain.
Bus ini melewati Tol Tembalang - Gayamsari, yaitu masuk gerbang tol Sukun dan keluar gerbang tol Gayamsari

Catatan: 
  • Semua bus melewati Tuntang, Bawen, Pasar Karangjati, Pasar Babadan, Banyumanik, dan Sukun, setelah dari sukun jalurnya baru berubah seperti rute masing-masing. 
  • Beberapa penjelasan dari artikel di atas belum lengkap, untuk itu silakan baca beberapa komentar  yang sudah ada sebagai pelengkapnya.

    Proposal Sponsor Buku

    Beberapa bulan belakangan ini saya bersama teman-teman sedang menulis buku Belajar Komputer Tingkat Dasar untuk anak-anak.

    Buku yang kami tulis tersebut terdiri dari 16 seri yaitu:
    • 4 (empat) buku untuk tingkat 0 (nol), yaitu ditujukan untuk murid TK kecil dan besar yang masing-masing untuk semester 1 dan 2.
    • 12 (dua belas) buku tingkat 1 sampai dengan 6, yaitu ditujukan untuk murid tingkat SD yang masing-masing untuk semester 1 dan 2.
     Dalam waktu dekat ini kami akan mulai merilisnya satu persatu.
    Seperti beberapa buku yang sudah saya rilis sebelumnya yang menggunakan sistem sponsor. Buku yang kami tulis ini juga menganut cara yang sama.
    Beberapa orang teman sudah menanyakan tata cara menjadi sponsor buku tersebut. Maka malalui post ini saya lampirkan tautan tata cara menjadi sponsor buku tersebut

    Unduh Proposal sponsor buku

    Demikian pemberitahuan tentang perkembangan Belajar Komputer Dasar yang kami tulis.