Rabu, Desember 31, 2008

Belajar Ruby

Berawal dari sebuah kebutuhan untuk mengetahui kapan DHCP Client memperbaharui IP Address, saya akhirnya malah belajar Ruby dan jadilah script sederhana berikut ini. FYI, saya menggunakan GNU/Linux Ubuntu Intrepid Ibex. Saya butuh informasi waktu perbaharuan IP berikutnya dari DHCP Client. Dari file /var/log/daemon.log saya bisa mendapatkan informasi berikut ini


$ grep renewal /var/log/daemon.log
Dec 29 10:32:41 hantulab dhclient: bound to 192.168.1.31 -- renewal in 14563182 seconds.
Dec 29 10:39:10 hantulab dhclient: bound to 192.168.1.31 -- renewal in 14168572 seconds.
Dec 29 12:18:45 hantulab dhclient: bound to 192.168.1.31 -- renewal in 13948234 seconds.
Dec 30 08:08:48 hantulab dhclient: bound to 10.2.13.34 -- renewal in 1496 seconds.
Dec 30 08:33:44 hantulab dhclient: bound to 10.2.13.34 -- renewal in 21496 seconds.
Dec 30 14:32:00 hantulab dhclient: bound to 10.2.13.34 -- renewal in 18630 seconds.
Dec 31 08:53:45 hantulab dhclient: bound to 10.2.13.34 -- renewal in 1446 seconds.


Ide awalnya adalah mengubah angka detik menjadi format jam. Dari tiga bahasa scripting yang terinstall di laptop saya, Perl, Python, dan Ruby, saya memutuskan untuk coba menggunakan Ruby sambil belajar. Dengan bekal panduan dari http://pine.fm/LearnToProgram/, sayapun membuat script sederhana berikut ini:

#!/usr/bin/env ruby

hour = ARGV[0].to_i / 3600
reminder = ARGV[0].to_i % 3600
minute = reminder / 60
second = reminder % 60

puts ARGV[0] + ' = ' + hour.to_s + ':' + minute.to_s + ':' + second.to_s


Lalu saya coba jalankan

$ ruby sectomin.rb 1446
1446 = 0:24:6


Hmm, lumayan. Script simple pertamaku pake Ruby. Selanjutnya aku juga perlu penjumlahan jam nih. Cari-cari nama fungsi dengan fungsionalitas sama dengan explode di PHP, nemu method split. Sekalian aku edit scriptnya dengan membuat fungsi.

#!/usr/bin/env ruby

def sectohour sec
hour = sec / 3600
reminder = sec % 3600
minute = reminder / 60
second = reminder % 60

hour.to_s + ':' + minute.to_s + ':' + second.to_s
end

def houradd hour1 hour2
arr_hour1 = hour1.split(':')
arr_hour2 = hour2.split(':')
result = (arr_hour1[0].to_i + arr_hour2[0].to_i) * 3600
+ (arr_hour1[1].to_i + arr_hour2[1].to_i) * 60
+ (arr_hour1[2].to_i + arr_hour2[2].to_i)
sectohour result
end

hour = sectohour ARGV[0].to_i

puts ARGV[0] + ' = ' + hour
puts ARGV[1] + ' + ' + ARGV[0] + ' = ' + houradd ARGV[1] hour


Coba dijalankan:

$ ruby sectomin.rb 1446 08:53:45
sectomin.rb:12: syntax error, unexpected tIDENTIFIER, expecting '\n' or ';'
sectomin.rb:19: syntax error, unexpected kEND, expecting $end


Wah...wah... koq error yah. Sebelum buka manual, coba-coba lagi, kali ini nambah koma sebagai pemisah argumen, ternyata berhasil. Untuk statemen multi baris juga mesti pake backslash, karena ga ada akhir baris pake ' seperti php. Untuk manggil fungsi dua argumen mesti pake tanda kurung. Inilah hasil script yang jalan, plus penyempurnaan sectohour.

#!/usr/bin/env ruby

def sectohour sec
hour = sec / 3600
reminder = sec % 3600
minute = reminder / 60
second = reminder % 60

hour.to_s \
+ ':' + (minute.to_s.length < 2 ? '0' : '') + minute.to_s \
+ ':' + (second.to_s.length < 2 ? '0' : '') + second.to_s
end

def houradd hour1,hour2
arr_hour1 = hour1.split(':')
arr_hour2 = hour2.split(':')
result = (arr_hour1[0].to_i + arr_hour2[0].to_i) * 3600 \
+ (arr_hour1[1].to_i + arr_hour2[1].to_i) * 60 \
+ (arr_hour1[2].to_i + arr_hour2[2].to_i)
sectohour result
end

hour = sectohour ARGV[0].to_i

puts ARGV[0] + ' = ' + hour
puts ARGV[1] + ' + ' + ARGV[0] + ' = ' + (houradd ARGV[1],hour)


Hasil running:

$ ruby sectomin.rb 1446 08:53:45
1446 = 0:24:6
08:53:45 + 1446 = 9:17:51


Setelah ini selesai, selanjutnya perlu otomatisasi dari pembacaan log sampai didapatkan hasil penjumlahannya. Dengan kombinasi grep dan tail, saya bisa dapat info ini:

$ grep renewal /var/log/daemon.log | tail -n 1
Dec 31 08:53:45 hantulab dhclient: bound to 10.2.13.34 -- renewal in 1446 seconds.


Selanjutnya dengan bantuan gawk yang powerfull, saya bisa membentuk string ini

$ grep renewal /var/log/daemon.log \
| tail -n 1 \
| gawk '{print "ruby sectomin.rb " $12 " " $3;}'
ruby sectomin.rb 1446 08:53:45


Lalu saya tambahkan backtick (`) sehingga saya bisa mendapatkan:

$ grep renewal /var/log/daemon.log \
| tail -n 1 \
| `gawk '{print "ruby sectomin.rb " $12 " " $3;}'`
1446 = 0:24:6
08:53:45 + 1446 = 9:17:51


Jreng...jreng... selesailah script sederhana Ruby pertama saya, plus parsing log. Semoga tulisan singkat saya ini bermanfaat. Ruby ternyata asik juga, cuman kadang saya terbawa kebiasaan di php. Belajar bahasa baru memang harus merubah paradigma dan pola pikir. Nantikan tulisan saya selanjutnya di blog ini.

Jumat, Desember 05, 2008

OSS Week di ITB

Saya membaca info rilis OpenSolaris 2008.11 dari blognya mas Alex Budiyanto. Di akhir tulisan blognya, ada link mengenai OSS Week yang diadakan di ITB. Karena itu, siang ini saya sempatkan berkunjung ke bekas kampus saya itu, setelah sholat Jumat.

Saya datang dari arah Borromeus menuju jalan Ganeshe. Karena jalan Ganesha sehabis sholat Jumat pasti macet, saya putuskan untuk memarkir motor di parkir Timur. Setelah itu, saya berjalan kaki menuju aula barat dan mendapati aula barat penuh kursi, panggung, dan peralatan band. Install Fest kok gini yah, curiga ini bukan acara Install Fest, akhirnya saya coba mencari outlet POSS ITB yang katanya ada di jalan Ganesha No 15A.

Karena tidak tahu letaknya, saya sempat tanya di Pusat Inkubasi ITB yang di depannya ada tulisan alamat Ganesha. Saya diberitahu bahwa POSS ITB ada di sebelah. Saya pun jadi sempat nyasar masuk Plasa Telkom, dan diberitahu bahwa POSS ada di belakang Plasa Telkom ini.

Saya masuk ke ruangan POSS ITB dan langsung nodong CD OpenSolaris dan NetBeans. Sebenarnya saya ingin berkenalan lebih lanjut dengan rekan-rekan di POSS, tapi berhubung saya sudah capek jalan-jalan di kampus nyari-nyari letak POSS, dan juga harus segera kembali ke kantor karena jam istirahat akan segera berakhir, saya pun tidak sempat berkenalan dan memperkenalkan diri.

Untuk rekan-rekan di POSS ITB, terima kasih atas CD OpenSolaris dan NetBeans-nya. Mungkin lain kali kita bisa berkenalan dan saling berbagi pengalaman. Semoga berhasil memperkenalkan Open Source di bekas kampus saya ini :)