Vim : Folding

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.

Sekilas Tentang Mount Permission

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).

Tampilan Banner SSH Server

Seringnya saat mengakses suatu server lewat SSH, saya mendapati tampilan seperti ini :

Saya langsung disuguhi prompt untuk memasukkan password. Tapi ada kalanya server memberikan tampilan seperti di bawah ini :

Tampilan welcome seperti itu di kontrol oleh parameter Banner pada konfigurasi Open SSH server. Contoh di atas saya ambil dari server yang menggunakan CentOS Linux 6.5. Konfigurasi Banner tersebut bisa dilihat pada berkas sshd_config seperti contoh berikut ini :

[ttirtawi@bestpractise ~]$ sudo grep Banner /etc/ssh/sshd_config
Banner /etc/issue
[ttirtawi@bestpractise ~]$ 

Pada contoh di atas parameter Banner menggunakan sumber teks dari berkas /etc/issue. Dengan kata lain semua tampilan welcome tadi tersimpan dalam berkas /etc/issue.

[ttirtawi@bestpractice ~]$ sudo cat /etc/issue
[sudo] password for ttirtawi:

###############################################################
#  Welcome to Best Practice                                   #
#  All connections are monitored and recorded                 #
#  Disconnect IMMEDIATELY if you are not an authorized user!  #
###############################################################

[ttirtawi@bestpractice ~]$

Secara baku Open SSH Server tidak menggunakan parameter Banner (parameter Banner-nya masih diberi tanda pagar (commented)). Sehingga bila kita mengubahnya seperti contoh di atas kita perlu melakukan restart servis SSH Servernya seperti berikut ini :

[ttirtawi@bestpractise ~]$ sudo service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
[ttirtawi@bestpractise ~]$

Dengan cara tadi kita bisa menyampaikan pesan selamat datang atau pesan peringatan pada siapa saja yang akan mengakses server tersebut lewat SSH.

SQL*Plus Pada Mac OSX

SQLPlus adalah aplikasi yang berfungsi sebagai antar muka (interface) Oracle Database. Dengan menggunakan SQLPlus user bisa menjalankan perintah-perintah SQL, mengeksekusi PL/SQL procedure, atau melakukan administrasi databasenya (menyalakan/mematikan database, membuat tablespace, membuat schema, dsb). SQLPlus termasuk dalam paket instalasi Oracle Database. Biasanya saya menggunakan perntah sqlplus langsung dari server databasenya.

Beberapa waktu lalu saya iseng mencari apakah ada caranya memasang SQLPlus pada Mac OSX. Ternyata saya bisa memasang paket SQLPlus-nya saja tanpa harus memasang Oracle Database. Aplikasi SQL*Plus tersedia di website Oracle ini : http://www.oracle.com/technetwork/topics/intel-macsoft–096467.html

Ada 2 berkas instalasi SQL*Plus yang perlu saya unduh dari web Oracle tadi :

ttirtawi@macbookpro:Downloads$ ll instantclient-*
-rw-r--r--@ 1 ttirtawi  staff    25M Apr 14 22:06 instantclient-basiclite-macos.x64-11.2.0.4.0.zip
-rw-r--r--@ 1 ttirtawi  staff   864K Apr 14 22:06 instantclient-sqlplus-macos.x64-11.2.0.4.0.zip
ttirtawi@macbookpro:Downloads$

Ini catatan saya untuk memasang SQL*Plus pada Mac OSX :

  1. Saya siapkan direktori baru untuk tempat instalasi SQL*Plus
    ttirtawi@macbookpro:Downloads$ cd /usr/local/
    ttirtawi@macbookpro:local$ mkdir instantclient_11_2
    ttirtawi@macbookpro:local$ cd instantclient_11_2/
    
  2. Berikutnya saya ekstrak kedua berkas instalasi yang sudah diunduh tadi :
    ttirtawi@macbookpro:~$ cd /usr/local/instantclient_11_2/
    ttirtawi@macbookpro:instantclient_11_2$ sudo unzip /Users/ttirtawi/Downloads/instantclient-basiclite-macos.x64-11.2.0.4.0.zip
    Archive:  /Users/ttirtawi/Downloads/instantclient-basiclite-macos.x64-11.2.0.4.0.zip
      inflating: instantclient_11_2/BASIC_LITE_README 
      inflating: instantclient_11_2/adrci 
      inflating: instantclient_11_2/genezi 
      inflating: instantclient_11_2/libclntsh.dylib.11.1 
      inflating: instantclient_11_2/libnnz11.dylib 
      inflating: instantclient_11_2/libocci.dylib.11.1 
      inflating: instantclient_11_2/libociicus.dylib 
      inflating: instantclient_11_2/libocijdbc11.dylib 
      inflating: instantclient_11_2/ojdbc5.jar 
      inflating: instantclient_11_2/ojdbc6.jar 
      inflating: instantclient_11_2/uidrvci 
      inflating: instantclient_11_2/xstreams.jar 
    ttirtawi@macbookpro:instantclient_11_2$ sudo unzip /Users/ttirtawi/Downloads/instantclient-sqlplus-macos.x64-11.2.0.4.0.zip
    Archive:  /Users/ttirtawi/Downloads/instantclient-sqlplus-macos.x64-11.2.0.4.0.zip
      inflating: instantclient_11_2/SQLPLUS_README 
      inflating: instantclient_11_2/glogin.sql 
      inflating: instantclient_11_2/libsqlplus.dylib 
      inflating: instantclient_11_2/libsqlplusic.dylib 
      inflating: instantclient_11_2/sqlplus 
    ttirtawi@macbookpro:instantclient_11_2$
    
  3. Lalu saya perlu mengatur ulang berkas tnsnames.ora. Berkas tnsnames.ora berisi detail koneksi ke setiap remote database.
    ttirtawi@macbookpro:instantclient_11_2$ vi tnsnames.ora
    RSDOD =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.57.100)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = ORCL)
        )
      )
    ttirtawi@macbookpro:~$ 
    

    Pada contoh di atas saya tambahkan 1 koneksi ke database ORCL yang berada pada server dengan IP 192.168.57.100.

  4. Berikutnya saya perlu menambahkan direktori tempat instalasi SQL*Plus tadi ke dalam berkas .bash_profile.
    ttirtawi@macbookpro:~$ cat .bash_profile
    export LC_ALL=en_US.UTF-8 
    export LANG=en_US.UTF-8
    export DYLD_LIBRARY_PATH=/usr/local/instantclient_11_2
    export TNS_ADMIN=/usr/local/instantclient_11_2
    export PATH="${PATH}:/Users/ttirtawi/MacPorts/bin:/Users/ttirtawi/bin:$PATH:/usr/local/instantclient_11_2"
    [[ -s ~/.bashrc ]] && source ~/.bashrc
    ttirtawi@macbookpro:~$ 
    ttirtawi@macbookpro:~$ 
    
  5. Sekarang saya bisa tes koneksi ke database tadi :
    ttirtawi@macbookpro:~$ sqlplus orauser/orauser@RSDOD
    
    SQL*Plus: Release 11.2.0.4.0 Production on Tue Dec 9 22:14:12 2014
    
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> show parameter db_name;
    
    NAME                         TYPE      VALUE
    ------------------------------------ ----------- ------------------------------
    db_name                     string      orcl
    SQL>
    

Kira-kira begitu langkah-langkah instalasi SQL*Plus pada MacOSX. Dengan begitu sekarang saya bisa langsung mengakses database tanpa perlu login dulu ke server databasenya.