Programming

Kemaren lagi iseng pengen tau nilai kurs USD-IDR, karena dari tiap website beda2, akhirnya bikin script BASH untuk ngambil info kurs dari beberapa website. Bekelnya cuma WGET, CAT, GREP, CUT. Ini source-code nya:

#!/bin/bash

# Info Kurs Ekstraktor
# Agustus 2013 oleh sedjat1
# Lisensi : GNU GPL v.3.0

merah="\e[31m"
hijau="\e[32m"
kuning="\e[33m"
biru="\e[34m"
magenta="\e[35m"
cyan="\e[36m"
normal="\e[39m"

mtu="$cyan"
svc="$kuning"

echo -e "Info kurs ${mtu}USD${normal}"

echo -n -e "${svc}Bank Mandiri   ${normal}= "
wget -q -Osrc.txt "http://www.bankmandiri.co.id/resource/kurs.asp"
readarray kurs < <(cat src.txt | grep 'USD</option>' | cut -d"\"" -f2)
te="Beli "
for item in "${kurs[@]}"
do
	usd=`echo "${item/$'\n'/}" | cut -d. -f1`
	echo -n -e "${te}${usd}"
	te=" ; Jual ${merah}"
done
echo -n -e "${normal} ; "
cat src.txt | grep 'Last Updated:' | cut -d"<" -f2 | cut -d">" -f2
rm src.txt

echo -n -e "${svc}Yahoo! Finance ${normal}= "
wget -q -Osrc.txt "http://download.finance.yahoo.com/d/quotes.csv?s=USDIDR=X&f=sl1d1t1c1ohgv&e=.csv"
usd=`cat src.txt | cut -d, -f2 | cut -d. -f1`
tgl=`cat src.txt | cut -d"\"" -f4`
jam=`cat src.txt | cut -d"\"" -f6`
echo -e "${merah}${usd} ${normal}@ $tgl $jam"
rm src.txt

echo -n -e "${svc}Google Finance ${normal}= "
wget -q --no-check-certificate -Osrc.txt "https://www.google.com/finance?q=USDIDR"
usd=`cat src.txt | grep '1 USD =' | cut -d. -f1 | cut -d">" -f2`
jam=`cat src.txt | grep 'class=time' | cut -d">" -f2 | cut -d"<" -f1`
echo -e "${merah}${usd} ${normal}@ $jam"
rm src.txt

Hasilnya begini:
kurs.sh

Ini paket program yang baru saya selesaikan versi beta-nya. SeRem adalah kependekan dari Semi Remote. Kenapa Semi Remote? Karena paket program yang saya buat ini bukan benar2 me-remote komputer dari jauh, melainkan menjalankan beberapa fungsi yang telah didaftarkan dulu sebelumnya. Fungsi2 tersebut bisa di-trigger melalui email.

Kenapa saya buat SeRem. Karena kadang kala saya perlu melakukan sesuatu di komputer kantor saat saya tidak berada di kantor. Tetapi karena di kantor banyak lapisan security nya, saya tidak bisa (dan tidak mau) berbuat banyak, saya tidak mau membuka celah keamanan sedikitpun.

Sepengetahuan saya, bisa saja saya menjalankan TeamViewer. Tapi kok rasanya kurang pas, karena terus terang saja koneksi internet saya amat sangat terbatas. Dengan menggunakan SeRem, saya bisa menggunakan email client untuk mengirim perintah ke komputer lain dengan “ongkos” yang minim.

Perintah dikirim lewat email, dan hasilnya pun diterima lewat email, karena “remote” nya tidak secara langsung (real-time) maka saya namakan “Semi Remote”. Awalnya saya mau buat dengan melakukan query ke sebuah website (bikin sendiri) untuk mengambil request dan mengepost hasil eksekusinya, tapi terlalu banyak yang harus saya kerjakan, karena saya programmer males akhirnya jadi deh yg sekarang ini. Awalnya pengen dikasih nama M2M-RC (Mail To Mail Remote Control), tapi karena “lebih Indonesia” kata2 SeRem ya udah jadinya SeRem aja.

Pada versi beta ini, saya cuma mendaftarkan 3 perintah: Screenshot, File List, Youtube Downloader. Masing2 perintah mempunyai file eksekusi-nya sendiri2, makanya saya katakan SeRem sebagai Paket Program. Ini dia isinya:

  1. Progam GETMAIL. Ini adalah program console yang fungsinya untuk mengambil email dari server pop3, dan menyimpannya dalam format txt. Sebenarnya saya bisa bikin sendiri, tapi males, udah ada yang bikin bagus.
  2. Progam sendEmail yang saya buat sendiri. Kebalikan dari GETMAIL (pop3) program console ini mengirim email (smtp) untuk menjawab/response dari perintah yang diterima. Yang ini sudah saya buat lama (waktu saya masih rajin)
  3. Youtube-dl.py yaitu script python untuk mendownload video dari beberapa server video terkenal termasuk Youtube, Metacafe, dll. Tentu saja program ini membutuhkan instalasi Python.
  4. Program Screenshot (dibuat pake AutoIt3) tentu saja fungsinya untuk mengambil screenshot komputer dan mengirimkan hasilnya lewat email.
  5. Program FileList (dibuat pake AutoIt3) sesuai namanya untuk mengambil list file di folder tertentu dan mengirimkan hasilnya lewat email.
  6. Program yang saya namai Commander (dibuat pake AutoIt3) yang fungsinya untuk mengecek email dan memparsing isinya, lalu menjalankan program sesuai instruksi dari dalam email tsb.

Nantinya koleksi program untuk menjalankan perintahnya akan ditambah, dan tentunya SeRem akan menjadi lebih komplit lagi. Karena ini kumpulan program yang sebagian besar jalan di console (dengan output yang tidak menarik) dan sebagian lagi memang tanpa GUI, maka saya tidak bisa memberikan screenshotnya.

Banyak hal yang terlihat sederhana tapi ternyata bikin sakit kepala, salah satunya adalah “Scrollable HTML Table”. Apasih susahnya bikin table pake HTML, tinggal pake tag <table>, <tr> dan <td> aja? Susahnya adalah kalo kita mau bikin yang fieldnya banyak, kalo cuma row-nya yang banyak saya sudah bikin html table pake paging dengan javascript.

Saya mendambakan html table sederhana dengan scroll vertikal dan horizontal yang punya fixed header biar kalo table nya di-scroll headernya gak hilang, pokoknya mirip komponen Grid di desktop application.

Sebagai seorang programmer yg malas, saya langsung nyari solusinya pake google. Ternyata saya tdk menemukan satupun solusi mudah dan murah (maksudnya kalo pake javascript gak usah yg gede2 kaya’ jquery, mootools, dll).

Saya nemuin beberapa solusi yang sudah ada, diantaranya:

  • Jawaban di stackoverflow.com: , yg ini kalo gak salah pake JQuery, bisa bikin table yang rumit, ada field yang pake colspan atau rowspan, udah gitu juga selain fixed header ngedukung fixed column juga. Tapi kalo ngeliat source-code nya kok ada pengaturan lebar tiap kolom (field), padahal ini yg mau saya hindari. Saya mau table nya seperti layaknya HTML table biasa yang bisa ngatur sendiri berapa lebarnya.
  • Ada lagi di imaputz.com, cssbakery.com, dan di cssplay.co.uk tapi semuanya gak punya horizontal scroll. Sedangkan saya mau yg pake horizontal scroll maupun vertical scroll, pokoknya saya mau terima beres, saya cuma bikin table biasa trus nanti dia bisa otomatis scroll nya muncul.

Akhirnya karena tidak menemukan solusi yang tepat guna, berbekal teori2 dari table2 di atas dengan terpaksa saya bikin sendiri deh html table sederhana yg cuma punya 1 fixed row dengan sedikit javascript+css.

Kekurangannya ada banyak, yaitu: cuma punya 1 fixed row, tidak punya fixed column, fungsi fix() harus dijalankan berkali-kali untuk dapat menyinkronisasi lebar cell pada header dan data tanpa mengorbankan sisi visual table[2].

Yang fungsi fix() ini yg saya masih kurang ngerti[1], waktu saya coba hitung berapa kali fungsi fix() dijalanin ternyata browser yg pake Webkit (Safari & Chrome) harus menjalankan antara 30x sampai 40x baru sinkron lebar kolom antara header dan data, sedangkan Firefox (pake Gecko) cuma dibawah 12x sama seperti Opera (pake Presto).

Untuk sekarang saya gak mau repot, biarin aja mau dieksekusi 100x juga gak apa2, yg penting kepala udah gak pusing lagi gara2 html table.

Udah ah.

— Edit 1 : Misteri yang menyelimuti fungsi fix() sudah terkuak. Ternyata di CSS nya harus ditambah box-sizing: border-box; -moz-box-sizing: border-box;. Di Google Chrome fungsi fix() cuma dijalanin 1x sementara di Mozilla Firefox dijalanin 2x. Tapi anehnya justru di Mozilla Firefox ukuran kolomnya jadi beda antara header dan data kalo di pinggir kanan header dikasih garis (border). Aneh, ada bug?

— Edit 2 : Kekurangan yang lain adalah tidak mendukung colspan dan rowspan untuk header dan data baris pertama. Sebenarnya tidak susah untuk modifikasi agar bisa colspan dan atau rowspan tapi saya belum bisa (baca: malas) bikin yang fleksibel.