Tangkuban Perahu
Catatan singkat tentang konversi karakter pada script Bash. Tepatnya saya ingin mengubah string variabel menjadi huruf besar semua (atau menjadi huruf kecil semua). Begini cara yang saya dapat dari banyak referensi di Internet :
ttirtawi@macbook-air:~$ TEST='MonkeyBANANA' ttirtawi@macbook-air:~$ NEW=$(echo $TEST | tr '[a-z]' '[A-Z]') ttirtawi@macbook-air:~$ echo $NEW MONKEYBANANA ttirtawi@macbook-air:~$
Seperti terlihat pada contoh di atas, saya cukup menggunakan perintah tr. Perintah tr sendiri artinya translate characters. Cara penggunaannya cukup mudah, cukup definisikan '[a-z]' '[A-Z]' untuk mengganti semua karakter dari huruf kecil menjadi huruf besar. Sebaliknya untuk mengubah semua karakter menjadi huruf kecil bisa dilihat pada contoh di bawah ini :
ttirtawi@macbook-air:~$ TEST='MonkeyBANANA' ttirtawi@macbook-air:~$ NEW=$(echo $TEST | tr '[A-Z]' '[a-z]') ttirtawi@macbook-air:~$ echo $NEW monkeybanana ttirtawi@macbook-air:~$
Saat bekerja dengan server Linux, cara untuk menentukan jumlah CPU yang terpasang pada sebuah server adalah dengan melihat berkas /proc/cpuinfo. Contohnya seperti tampilan berikut ini :
[oracle@uimdbsit01 ~]$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 0 siblings : 5 core id : 0 cpu cores : 5 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 0 siblings : 5 core id : 1 cpu cores : 5 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 2 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 0 siblings : 5 core id : 2 cpu cores : 5 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 0 siblings : 5 core id : 3 cpu cores : 5 apicid : 3 initial apicid : 3 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 4 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 0 siblings : 5 core id : 4 cpu cores : 5 apicid : 4 initial apicid : 4 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 5 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 1 siblings : 5 core id : 0 cpu cores : 5 apicid : 8 initial apicid : 8 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 6 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 1 siblings : 5 core id : 1 cpu cores : 5 apicid : 9 initial apicid : 9 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 7 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 1 siblings : 5 core id : 2 cpu cores : 5 apicid : 10 initial apicid : 10 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 8 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 1 siblings : 5 core id : 3 cpu cores : 5 apicid : 11 initial apicid : 11 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 9 vendor_id : GenuineIntel cpu family : 6 model : 37 model name : Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz stepping : 1 cpu MHz : 2394.000 cache size : 30720 KB physical id : 1 siblings : 5 core id : 4 cpu cores : 5 apicid : 12 initial apicid : 12 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat bogomips : 4788.00 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: [oracle@uimdbsit01 ~]$
Pada contoh ini server yang sedang saya akses memiliki 10 buah CPU Intel(R) Xeon(R). Penomoran CPUnya dimulai dari angka 0.
Server pada contoh ini dipakai untuk menjalankan Oracle Database 11g. Bila sedang mengakses database melalui SQL*Plus, kita bisa juga memeriksa jumlah CPU yang terpasang. Lihat contoh berikut ini :
SQL> select a.inst_id,a.instance_name,b.name,b.value
2 from gv$instance a, gv$parameter b
3 where a.inst_id=b.inst_id
4 and
5 b.name in ('cpu_count','parallel_threads_per_cpu')
6 ;
INST_ID INSTANCE_NAME NAME VALUE
---------- ---------------- ---------------------------------------- ------------
1 uimdbsit1 parallel_threads_per_cpu 2
1 uimdbsit1 cpu_count 10
2 uimdbsit2 parallel_threads_per_cpu 2
2 uimdbsit2 cpu_count 10
SQL>
Karena databasenya adalah cluster RAC, maka akan muncul informasi CPU yang dimiliki oleh masing-masing node RAC. Dalam contoh tadi, dari SQL*Plus kita bisa melihat bahwa masing-masing node RAC beroperasi pada server berkekuatan 10 CPU. Sebagai catatan, untuk bisa menggunakan perintah SQL di atas, user harus punya privilege untuk mengakses gv$parameter (atau jalankan saja lewat user sysdba)
Setiap hari saya sering bekerja dengan menggunakan Vim, Vim adalah aplikasi editor teks berbasis CLI (command line interface). Beberapa waktu ini saya baru mempelajari satu lagi fiturnya Vim, fitur tersebut adalah folding. Folding di sini maksudnya menyembunyikan sementara bagian dokumen yang tidak ingin dibaca. Misalnya saya sedang menulis sebuah script PL/SQL, dan saya ingin menyembunyikan dulu bagian deklarasi variabel yang cukup panjang dan menyesaki layar. Pertama saya pindahkan kursor ke bagian awal dokumen yang ingin ditutup :

Lalu saya tekan kombinasi tombol Control & V untuk mengaktifkan mode visual :

Lalu saya gunakan tombol panah bawah untuk menandai semua bagian dokumen yang ingin saya sembunyikan :

Setelah menandai semua baris yang ingin disembunyikan, saya tekan tombol z dan f secara berurutan (zf). Secara otomatis Vim akan menyembunyikan semua baris tadi. Vim akan menampilkan indikator tanda +, diikuti dengan jumlah baris yang disembunyikan, serta tampilan baris awal yang disembunyikan seperti terlihat pada contoh di bawah ini :

Secara instan, 29 baris deklarasi variabel tersebut hilang tersembunyi dalam 1 baris saja. Dengan ukuran layar Terminal yang sama saya bisa melihat bagian script berikutnya.
Lalu bagaimana bila saya ingin memunculkan kembali semua baris tadi? Saya cukup mengarahkan kursor pada baris indikator tadi lalu menekan kombinasi tombol z dan o. Dan untuk menyembunyikan kembali baris-baris tersebut saya gunakan kombinasi tombol z dan c. Supaya mudah mengingat kombinasi tadi saya cukup hapalkan tombol pertamanya saja, cukup ingat tombol z untuk mulai menggunakan menu folding. Lalu ingat f untuk fold, o untuk open fold, dan c untuk close fold
Canggihnya lagi, semua pengaturan fold tadi bisa disimpan dengan menggunakan perintah mkview. Dengan menggunakan perintah mkview saya tidak perlu repot-repot menyembunyikan baris-baris tadi setiap saat membuat dokumen tersebut. Tanpa menggunakan mkview, setiap kali membuka dokumen yang sama saya perlu mengatur lagi bagian-bagian mana yang ingin saya sembunyikan.

Misalnya saya membuka lagi dokumen tersebut, saya cukup gunakan perintah loadview untuk mengaktifkan semua pengaturan yang sudah saya buat sebelumnya :

Tips ini saya temukan di website http://vim.wikia.com/wiki/Folding. Tips ini sangat berguna saat menggunakan Vim untuk mengolah dokumen (atau script) yang cukup panjang. Layar jadi tidak lagi disesaki dengan bagian yang sedang tidak kita perlukan. Menghemat waktu memindahkan kursor naik turun dokumen. Kita jadi bisa fokus pada salah satu bagian saja & menyembunyikan bagian lain untuk sementara waktu.
Untuk bisa menggunakan media penyimpanan dalam sistem operasi Linux (dan sistem operasi Unix lain bahkan Mac OSX), kita perlu melakukan proses mount terlebih dahulu. Beberapa distro Linux yang dilengkapi dengan desktop environment (tampilan grafis) melakukan proses mounting secara otomatis. Jadi misalnya kita ingin menyalin data ke dalam USB flash disk, kita menyalin data ke dalam direktori yang dipakai sebagai mountpoint perangkat USB tersebut. Ilustrasi berikut saya ambil dari mesin Ubuntu saya :

Pada contoh di atas USB saya di-mounting otomatis pada direktori /media/ttirtawi/TTIRTAWI. Dari Terminal saya bisa lihat statusnya seperti tampilan berikut :
ttirtawi@ubuntu1404:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 12G 7,2G 4,0G 65% / none 4,0K 0 4,0K 0% /sys/fs/cgroup udev 492M 4,0K 492M 1% /dev tmpfs 101M 976K 100M 1% /run none 5,0M 0 5,0M 0% /run/lock none 501M 200K 501M 1% /run/shm none 100M 36K 100M 1% /run/user /dev/sdb1 29G 26G 3,5G 88% /media/ttirtawi/TTIRTAWI ttirtawi@ubuntu1404:~$
OS mengenali flash disk tadi dengan nama perangkat /dev/sdb1. Opsi mount yang digunakan dapat dilihat dengan menggunakan perintah mount seperti contoh berikut ini :
ttirtawi@ubuntu1404:~$ mount | grep sdb /dev/sdb1 on /media/ttirtawi/TTIRTAWI type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2) ttirtawi@ubuntu1404:~$
Tanpa proses mount saya tidak bisa langsung menyalin data ke dalam perangkat /dev/sdb1.
Nah ada kalanya OS Linux yang saya gunakan tidak melakukan proses mount secara otomatis. Misalnya yang saya alami saat menggunakan Oracle Linux 6.5. Di sistem ini saya tidak memiliki desktop environment. Saya cuma bisa mengakses command line console saja. Oleh karenanya saat saya perlu menggunakan USB flash disk, saya lakukan proses mounting secara manual dengan perintah seperti berikut ini :
ttirtawi@uimtest-X220:/$ sudo mount /dev/sdb1 /mnt
Saya lakukan mount USB-nya pada direktori /mnt. Saat saya cek statusnya dengan perintah df -h, nampak USB tersebut siap digunakan :
ttirtawi@uimtest-X220:/$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_uimtest-lv_root 30G 8.4G 21G 30% / tmpfs 3.8G 420K 3.8G 1% /dev/shm /dev/sda1 477M 55M 397M 13% /boot /dev/mapper/vg_uimtest-lv_home 44G 19G 24G 45% /home /dev/mapper/vg_uimtest-lv_opt 212G 52G 150G 26% /opt /dev/sdb1 29G 21G 8.7G 71% /mnt ttirtawi@uimtest-X220:/$
Lalu saya coba tes membuat sebuah berkas kosong dalam direktori /mnt tadi.
ttirtawi@uimtest-X220:/$ touch /mnt/testing touch: cannot touch `/mnt/testing': Permission denied ttirtawi@uimtest-X220:/$
Ternyata saya belum bisa mengisikan data apapun ke dalam USB flash disk tadi. Saya mendapati error Permission denied. Ternyata saya lupa mengatur hak akses user ttirtawi, jadi hanya user root saja yang bisa mengakses USB flash disk tersebut. Saya perlu mengulangi proses mount tadi dengan opsi yang benar. Pertama saya lakukan proses umount dulu, proses ini melepaskan USB flash disk tadi dari mountpoint /mnt.
ttirtawi@uimtest-X220:/$ sudo umount /mnt
Sebelum mengulang proses mount saya cek dulu User ID & Group ID user ttirtawi dengan menggunakan perintah id seperti contoh berikut ini :
ttirtawi@uimtest-X220:/$ id uid=500(ttirtawi) gid=500(ttirtawi) groups=500(ttirtawi),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ttirtawi@uimtest-X220:/$
Informasi uid & gid tersebut perlu ditambahkan pada perintah mount supaya user ttirtawi bisa menyalin/membaca data dari dalam USB flash disk tadi. Kira-kira perintahnya menjadi seperti berikut ini :
ttirtawi@uimtest-X220:/$ sudo mount -o uid=500,gid=500 /dev/sdb1 /mnt
Dengan tambahan opsi “-o uid=500,gid=500”, saya memberi tahu kernel Linux bahwa user ttirtawi dengan ID 500 diperkenankan mengakses USB flash disk yang terpasang pada direktori /mnt. Setelah itu saya sudah bisa membuat/menghapus berkas ke dalam USB flash disk tadi :
ttirtawi@uimtest-X220:/$ touch /mnt/testing ttirtawi@uimtest-X220:/$ rm /mnt/testing ttirtawi@uimtest-X220:/$
Tips ini berlaku tidak hanya untuk USB flash disk, tapi berlaku juga pada setiap jenis media penyimpanan (SSD, harddisk eksternal, SD Card, dsb).