Академический Документы
Профессиональный Документы
Культура Документы
© 2012
Daftar Isi
1 Alasan 5
2 Pemasangan 6
3 Hello World! 9
3.2 Kondisi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Perulangan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4 Tip e Data 17
4.1 String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Bilangan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.2 Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2.3 Kalkulator . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3.1 Pemenggalan . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.4 Ditionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.5 Waktu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5 Mo dularitas 31
6 Fungsi 37
7 Database 42
7.1 Tab el . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
7.1.1 Sequene . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
DAFTAR ISI 2
7.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.4 Fungsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.4.1 PL/pgSQL . . . . . . . . . . . . . . . . . . . . . . . . . . 56
7.4.2 PL/Python . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.3 Synhronizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9 Lintas Sistem 80
9.2 File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.3 Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.4 XMLRPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
9.4.2 Drupal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
10 Pengemasan 90
DAFTAR ISI 3
15 Web 124
16 Hosting 125
Kata Pengantar
Python kepada p enulis untuk p ertama kali. Juga kepada Arie Zanahar yang
Bab 1
Alasan
gai platform sep erti Linux, Windows, Ma, Unix. Bahkan sudah tersedia
Hemat Bahasa ini b erkonsep hemat soure. Tampak pada ara p enulisannya
yang tidak membutuhkan karakter atau kata khusus untuk BEGIN dan
menjorok ke kanan).
Lalu mengapa PostgreSQL dipilih sebagai media p enyimpanan datanya ?
ki sifat umum traditional database sep erti transation, stored pro edure
(funtion), dan trigger. Bahkan funtion bisa ditulis dalam b erbagai ba-
hasa (tidak hanya SQL), Python, Perl, Shell, dan Java adalah ontoh ba-
Bab 2
Pemasangan
Pada saat tulisan ini dibuat kami menggunakan Ubuntu 10.04 (Luid). Anda
juga bisa menggunakan jenis Ubuntu lainnya sep erti Kubuntu (window manager
Pasa instalasi Ubuntu Python sudah disertakan. Namun masih ada yang
p erlu diunduh (download) lagi. Seb elumnya p erbaharui daftar paket yang akan
1 $ s u d o a p t − g e t u p d a t e
Pasang PostgreSQL:
1 $ s u d o a p t − g e t i n s t a l l p o s t g r e s q l p o s t g r e s q l − p
l p y t h o n − 8 . 4
1 $ s u d o a p t − g e t i n s t a l l p y t h o n − s q l a l h e m y p y t h o
n −p s y o p g 2
terpasang. Paket ini memuat psql yang digunakan untuk terhubung ke Post-
greSQL server, seara ommand line. Ada baiknya Anda juga memasang versi
web-nya:
1 $ s u d o a p t − g e t i n s t a l l p h p p g a d m i n
1 $ s u d o / e t / i n i t . d / a p a h e 2 s t a r t
Seara default Apahe hidup otomatis saat komputer b o ot. Lalu buatlah sym-
link phppgadmin:
1 $ s u d o l n − s / u s r / s h a r e / p h p p g a d m i n / v a r /www/
BAB 2. PEMASANGAN 7
http://loalhost/phppgadmin
Bagi p engguna window manager Gnome Anda bisa gunakan gedit sebagai text
editor. Sedangkan p engguna KDE bisa gunakan kate. Keduanya b erbasis GUI.
Jika Anda lebih nyaman dengan konsole bisa gunakan nano, jo e, atau vi.
1 $ s u d o a p t − g e t i n s t a l l v i m
1 $ s u d o v i / e t / v i m / v i m r
1 " V i m 5 a n d l a t e r v e r s i o n s s u p p o r t s y n t a x h i g h l i g
h t i n g .
U n o m m e n t i n g t h e n e x t
2 " l i n e e n a b l e s s y n t a x h i g h l i g h t i n g b y d e f a u l t .
3 s y n t a x o n
Saat Anda membuka #le untuk keduakalinya, maka kursor langsung menuju
1 " U n o m m e n t t h e f o l l o w i n g t o h a v e Vim j u m p t o t h e l a
s t
p o s i t i o n w h e n
2 " r e o p e n i n g a f i l e
3 i f h a s ( " a u t o m d " )
4 a u B u f R e a d P o s t * i f l i n e ( " ' \ " " ) > 0 && l i n e ( " ' \ "
" ) <=
5 e n d i f
Menjorok otomatis (auto indent), dan p enekanan tomb ol TAB diganti den-
1 " U n o m m e n t t h e f o l l o w i n g t o h a v e Vim l o a d i n d e n t a
t i o n
r u l e s a o r d i n g t o t h e
2 " d e t e t e d f i l e t y p e . P e r d e f a u l t D e b i a n Vim o n l y l
o a d
f i l e t y p e s p e i f i
3 " p l u g i n s .
4 i f h a s ( " a u t o m d " )
5 f i l e t y p e i n d e n t o n
6 s e t s m a r t i n d e n t
7 s e t e x p a n d t a b
8 s e t t a b s t o p =4
9 s e t s o f t t a b s t o p =4
10 s e t s h i f t w i d t h =4
11 e n d i f
1 s e t i g n o r e a s e " Do a s e i n s e n s i t i v e m a t h i n g
BAB 2. PEMASANGAN 8
Bila kata yang diari mengandung huruf b esar dan huruf keil, maka p en-
1 s e t s m a r t a s e " Do s m a r t a s e m a t h i n g
Bab 3
Hello World!
Anda bisa memulai Python dalam mo dus interaktif. Nanti kalau soure sudah
mulai panjang kita simpan dalam #le. Mo dus interaktif dijalankan di konsole,
lalu ketik:
1 $ p y t h o n
1 P y t h o n 2 . 6 . 5 ( r 2 6 5 : 7 9 0 6 3 , A p r 1 6 2 0 1 0 , 1 3 : 5 7 : 4 1
)
2 [ GCC 4 . 4 . 3 ℄ o n l i n u x 2
4 i n f o r m a t i o n .
5 >>>
p erintah print.
2 H e l l o W o r l d !
Gunakan tomb ol panah atas untuk mengulang p erintah seb elumnya, lalu ki-
ta oba sedikit salah satu iri p emgrograman b erorientasi ob jek (ob jet oriented
programming / OOP).
2 HELLO WORLD !
4 h e l l o w o r l d !
'Hello World!' adalah sebuah string, yaitu DATA yang b oleh b erisi alphanu-
meri, b oleh terdiri dari huruf dan angka atau karakter lainnya. Contoh di atas
menyebutkan bahwa string tidak hanya b erisi data, ia juga memuat FUNGSI
yang b ernama upp er() dan lower(). Dengan demikian 'Hello World!' bukan
sekedar string, tapi disebut OBJEK string. Inilah iri ob jek, memuat data dan
fungsi.
Selain menggunakan kutip tunggal, string juga dapat dibatasi oleh kutip ganda:
2 H a r i Jum ' a t
Bila string lebih dari satu baris Anda bisa gunakan kutip tiga kali:
2 . . . A l a m a t : B o g o r
4 Nama : Bummi D w i P u t e r a
5 A l a m a t : B o g o r
6 H o b i : M e n g g a m b a r
Perhatikan tiga buah titik di atas yang b erarti sebuah p erintah b elum b e-
rakhir.
dan hobi, lalu menampilkannya kembali di layar. Kali ini kita simpan dalam
sebuah #le p egawai.py. Anda bisa gunakan text editor favorit sep erti gedit,
2 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
3 h o b i = r a w _ i n p u t ( ' H o b i : ' )
5 p r i n t ' A l a m a t : ' , a l a m a t
6 p r i n t ' H o b i : ' , h o b i
1 $ p y t h o n p e g a w a i . p y
2 A l a m a t : B o g o r
3 H o b i : M e n g g a m b a r
raw_input() adalah fungsi untuk menerima masukkan dari user. Fungsi ini
variab el nama, alamat, dan hobi. Anda bisa kembali ke mo dus interaktif untuk
2 Nama : Bummi
3 >>> p r i n t t y p e ( nama )
Pada sript di atas kita mulai mengenal apa yang disebut variab el, yaitu
nama, alamat, dan hobi. Variab el bisa dikatakan sebagai p enampung. Tip e
data ketiga variab el di atas adalah string. Mari kita oba tip e data lainnya.
1 >>> a = 3
2 >>> b = 5
3 >>> p r i n t a + b
4 8
5 >>> p r i n t t y p e ( a )
Variab el a dan b b ertip e integer alias bilangan bulat. Berikut ini untuk
1 >>> = 7 . 2
2 >>> p r i n t t y p e ( )
Ya, p emisah bilangan bulat dengan p eahannya adalah dengan titik. Oh ya,
Python tergolong ketat dalam hal p engop erasian antar tip e data. Kita tidak
4 T r a e b a k ( m o s t r e e n t a l l l a s t ) :
2 Bummi u s i a 2 4 t a h u n
2 Bummi u s i a 2 4 t a h u n
Meski string tidak bisa ditambah dengan integer, namun string bisa dikalikan
dengan integer:
2 a b a b a b a b a b a b a b a b a b a b
Kembali ke #le p egawai.py, tidak dip erkenankan menulis #tidak rapi#. Cobal-
2 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
3 h o b i = r a w _ i n p u t ( ' H o b i : ' )
5 p r i n t ' A l a m a t : ' , a l a m a t
6 p r i n t ' H o b i : ' , h o b i
Kemudian jalankan:
1 $ p y t h o n p e g a w a i . p y
hasilnya Python protes karena ada indent (menjorok masuk) yang tidak
dip erkenankan:
1 $ p y t h o n p e g a w a i . p y
2 F i l e " p e g a w a i . p y " , l i n e 6
3 p r i n t ' H o b i : ' , h o b i
4 ^
5 I n d e n t a t i o n E r r o r : u n e x p e t e d i n d e n t
Sep erti kita lihat, sript Python tanpa diawali suatu BEGIN .. END atau
{ .. } atau b erbagai p enanda lainnya sebagai b entuk awal dan akhir program.
Baris-baris utama selalu tanpa indent alias rapat kiri. Baris yang memiliki
indent b erarti dianggap bagian dari sub-blok sep erti dalam lo oping (for) atau
kondisi (if ).
2 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
3 h o b i = r a w _ i n p u t ( ' H o b i : ' )
5 p r i n t ' A l a m a t : ' , a l a m a t
6 i f h o b i :
7 p r i n t ' H o b i : ' , h o b i
3.2 Kondisi
Python punya semaam p edoman dalam hal kondisi (if ), dimana jika suatu
1 i f h o b i :
2 p r i n t ' H o b i : ' , h o b i
1 i f h o b i ! = ' ' :
2 p r i n t ' H o b i : ' , h o b i
Seara tip e data hobi tentulah sebuah string, tapi bagaimana dengan hobi
!= # ? Mari kita uji di mo dus interaktif dimana variab el hobi ada isinya.
Integer 0 1
Float 0 1.2
List [℄ [10,20,30℄
3 T r u e
5 F a l s e
3 F a l s e
5 T r u e
2 >>> p r i n t k o s o n g
3 T r u e
Kembali ke p egawai.py dimana bila hobi tidak diisi maka program akan
memb erikan saran. Salinlah menjadi p egawai1.py sep erti b erikut ini.
2 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
3 h o b i = r a w _ i n p u t ( ' H o b i : ' )
5 p r i n t ' A l a m a t : ' , a l a m a t
6 i f h o b i :
7 p r i n t ' H o b i : ' , h o b i
8 e l s e :
9 p r i n t ' S e b a i k n y a h o b i d i i s i . '
2 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
3 h o b i = r a w _ i n p u t ( ' H o b i : ' )
5 p r i n t ' A l a m a t : ' , a l a m a t
6 i f h o b i . u p p e r ( ) == 'MENGGAMBAR ' :
7 p r i n t ' D a t a n g l a h d i p e l a t i h a n g a m b a r s e t i a
p S a b t u . '
8 e l i f h o b i :
9 p r i n t ' H o b i : ' , h o b i
10 e l s e :
11 p r i n t ' S e b a i k n y a h o b i d i i s i . '
Perhatikan juga p enggunaan titik dua ( : ) pada if dan else. Ini iri lain
untuk menandai awal suatu sub-blok. Jadi bisa dipastikan setelah titik dua
3.3 Perulangan
Mari kita buat input p egawai jadi lebih mudah, dimana program akan menanyakan
1 w h i l e T r u e :
3 i f n o t nama :
4 b r e a k
5 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
6 h o b i = r a w _ i n p u t ( ' H o b i : ' )
8 p r i n t ' A l a m a t : ' , a l a m a t
9 i f h o b i :
10 p r i n t ' H o b i : ' , h o b i
11 e l s e :
12 p r i n t ' S e b a i k n y a h o b i d i i s i . '
Perhatikan baris p ertama yang b erarti p erulangan tanpa henti. Yang menghen-
tikannya adalah baris ke empat. break adalah kata khusus untuk menghentikan
p erulangan dimana alur keluar menuju blok bawah di luar p erulangan tersebut.
Keb etulan dalam ontoh ini tidak ada blok lain di luar p erulangan.
Selanjutnya kita buat aturan baru untuk p engisian data ini, dimana:
2. Bila selesai satu data p egawai maka program akan menanyakan apakah
1 l a n j u t = ' Y '
2 w h i l e l a n j u t ! = ' S ' :
4 i f n o t nama :
6 o n t i n u e
7 a l a m a t = r a w _ i n p u t ( ' A l a m a t : ' )
8 i f n o t a l a m a t :
9 p r i n t ' A l a m a t h a r u s d i i s i . '
10 o n t i n u e
11 h o b i = r a w _ i n p u t ( ' H o b i : ' )
13 p r i n t ' A l a m a t : ' , a l a m a t
14 i f h o b i :
15 p r i n t ' H o b i : ' , h o b i
16 e l s e :
17 p r i n t ' S e b a i k n y a h o b i d i i s i . '
ini mengembalikan nilai string maka kita bisa lanjutkan dengan memanggil
fungsi upp er(). Dengan ara ini user dip erb olehkan memasukkan dengan s keil
maupun S b esar.
bila kita butuh p erulangan yang jumlahnya sudah diketahui ? Misalkan etak
angka 1 hingga 5.
1 f o r i i n [ 1 , 2 , 3 , 4 , 5 ℄ :
2 p r i n t i
Hasilnya:
Perhatikan [1,2,3,4,5℄ yang merupakan data b ertip e list atau sering juga disebut
sebagai array. Kita bisa p ersingkat p enulisannya dengan fungsi range().
1 f o r i i n r a n g e ( 5 ) :
2 p r i n t i
Hasilnya
Meski tidak dimulai dari 1 tapi jumlah barisnya tetap 5. Jika tetap ingin dimulai
1 f o r i i n r a n g e ( 1 , 6 ) :
2 p r i n t i
Bab 4
Tip e Data
Memp erhatikan tip e data salah satu p okok pada Python dan ini juga menjadi
4.1 String
1 >>> nama = A g u s
Masih b elum yakin apa tip e data variab el nama ? Gunakan typ e().
1 >>> t y p e ( nama )
2 < t y p e ' s t r ' >
Data b ertip e string bisa b erisi karakter apa sa ja sep erti huruf, angka, tanda
).
2 A g u s l a h i r h a r i Jum ' a t
Namun ara ini tidak disarankan karena membuat program menjadi sulit
dibaa. Kalau program sulit dibaa menyulitkan p enelusuran bila ada kesalahan
2 A g u s l a h i r h a r i Jum ' a t
17
2 K e u n t u n g a n b u l a n i n i m e n i n g k a t 1 0 %
4.2 Bilangan
Bilangan bulat atau integer atau disingkat int dinyatakan tanpa titik.
1 >>> a = 1 0
a ditambah 2
2 1 2
a dikurang 4
1 >>> a − 4
2 6
a dikali 5
1 >>> a * 5
2 5 0
a dibagi dengan 3
1 >>> a / 3
2 3
lat juga. Jika Anda mengharapkan hasil yang lebih rini maka salah satunya
1 >>> a / 3 . 0
2 3 . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 5
).
1 >>> a % 3
2 1
a pangkat 2
1 >>> a * * 2
2 1 0 0
2 1 0
1 >>> i n t ( 1 0 . 2 )
2 1 0
1 >>> r o u n d ( 1 0 . 4 )
2 1 0
3 >>> r o u n d ( 1 0 . 5 )
4 1 1
round() akan membulatkan ke bawah bila p eahan suatu bilangan lebih keil
#oat().
2 1 0 . 5
4.2.2 Formatting
1 >>> a = 3
2 >>> b = 2
4 3 + 2 = 5
Meski formatting %s bisa digunakan untuk tip e data apa sa ja, sebaiknya An-
Anda menetapkan bahwa variab el a itu harus b ertip e bilangan bulat (integer),
2 3 + 2 = 5
1 >>> a = 3 . 5
3 3 . 5 0 0 0 0 0 + 2 . 0 0 0 0 0 0 = 5 . 5 0 0 0 0 0
2 3 . 5 0 + 2 . 0 0 = 5 . 5 0
4.2.3 Kalkulator
Membuat kalkulator tidaklah sulit, Anda ukup gunakan eval(). Buatlah #le
1 w h i l e T r u e :
2 h i t u n g = r a w _ i n p u t ( ' H i t u n g : ' )
3 i f n o t h i t u n g :
4 b r e a k
5 p r i n t e v a l ( h i t u n g )
Jalankan.
1 $ p y t h o n a l . p y
2 H i t u n g : 2+3
3 5
4 H i t u n g : 7 * * 2
5 4 9
6 H i t u n g : 7 + 2 * 3
7 1 3
8 H i t u n g :
9 $
Mudah bukan?
aturan prioritas pada matematika umum b erlaku, dimana p erkalian lebih dulu
Program di atas akan terus meminta masukkan dari user hingga tomb ol
4.3 List
Tip e data list kerap digunakan. Kita lihat pada ontoh seb elumnya bagaimana
list menjadi wa jib pada p erulangan for. Bahkan string seb enarnya bisa dianggap
sebagai list.
2 p r i n t h ,
hasilnya:
1 Bummi
Perhatikan p enggunaan koma pada print yang b erarti #jangan ganti baris#.
2 >>> p r i n t d a t a [ 0 ℄
4 >>> p r i n t d a t a [ 1 ℄
5 ' B o g o r '
1 >>> p r i n t d a t a [ − 1 ℄
2 2 4
1 >>> p r i n t d a t a [ − 2 ℄
2 ' M e n g g a m b a r '
4.3.1 Pemenggalan
Selain dapat diambil p er elemen, juga dapat diambil b eb erapa elemen sekali-
gus, ini disebut sebagai p emenggalan (sliing). Tampilkan elemen p ertama dan
kedua:
1 >>> p r i n t d a t a [ 0 : 2 ℄
1 >>> p r i n t d a t a [ : 2 ℄
1 >>> p r i n t d a t a [ − 3 : ℄
batas elemen. Gambar 4.1 adalah ontoh string Python yang bisa dianggap
sebagai list. Cermati baik-baik bagaimana b ekerja dengan elemen dan batas
Anda memiliki daftar nama buah yang dapat diari oleh user. Setelah user
memasukkan nama buah program akan menarinya dalam list dan memb eri-
tahukan hasilnya. Setelah itu program akan kembali menanyakan nama buah
b erikutnya. Program b erakhir jika user hanya menekan Enter sa ja, alias tidak
3 w h i l e T r u e :
4 a r i = r a w _ i n p u t ( ' C a r i b u a h : ' )
5 i f n o t a r i :
6 p r i n t ' S e l e s a i '
7 b r e a k
8 i f a r i i n d a f t a r :
9 p r i n t ( ' D i t e m u k a n ' )
10 e l s e :
11 p r i n t ( ' T i d a k d i t e m u k a n ' )
Jalankanlah.
1 $ p y t h o n p r o d u k . p y
2 C a r i b u a h : m a n g g a
3 D i t e m u k a n
4 C a r i b u a h : d u k u
5 T i d a k d i t e m u k a n
6 C a r i b u a h :
7 S e l e s a i
Keb eradaan elemen bisa digunakan sebagai kondisi. Misalkan program Anda
dapat menerima masukan (input parameter) sesaat seb elum dijalankan, sering
disebut sebagai argument. Sep erti pada ontoh at.py b erikut ini.
1 i m p o r t s y s
2 p r i n t s y s . a r g v
Jalankanlah.
1 $ p y t h o n a t . p y
2 [ ' a t . p y ' ℄
1 $ p y t h o n a t . p y / e t / h o s t s
Perhatikan elemen p ertama adalah #le at.py itu sendiri, dan elemen kedua
adalah nama #le yang akan ditampilkan. Ya, kita akan membuatnya dapat
1 i m p o r t s y s
3 f i l e n a m e = s y s . a r g v [ 1 ℄
4 f = o p e n ( f i l e n a m e )
5 p r i n t f . r e a d ( )
6 f . l o s e ( )
Jalankan.
1 $ p y t h o n a t 1 . p y / e t / h o s t s
2 1 2 7 . 0 . 0 . 1 l o a l h o s t o m p a q
3 1 2 7 . 0 . 1 . 1 o m p a q
4
5 # T h e f o l l o w i n g l i n e s a r e d e s i r a b l e f o r I P v 6 a p a
b l e
h o s t s
6 : : 1 l o a l h o s t i p 6 − l o a l h o s t i p 6 − l o o p b a k
7 f e 0 0 : : 0 i p 6 − l o a l n e t
8 f f 0 0 : : 0 i p 6 − m a s t p r e f i x
9 f f 0 2 : : 1 i p 6 − a l l n o d e s
10 f f 0 2 : : 2 i p 6 − a l l r o u t e r s
11 f f 0 2 : : 3 i p 6 − a l l h o s t s
1 $ p y t h o n a t 1 . p y
2 T r a e b a k ( m o s t r e e n t a l l l a s t ) :
4 f i l e n a m e = s y s . a r g v [ 1 ℄
5 I n d e x E r r o r : l i s t i n d e x o u t o f r a n g e
Tampilan kesalahan ini jelas kurang informatif dan bisa jadi user tidak tahu
apa yang harus dilakukan. Saatnya menggunakan deteksi keb eradaan elemen.
1 i m p o r t s y s
3 i f n o t s y s . a r g v [ 1 : ℄ :
4 p r i n t ( ' C a r a m e n g g u n a k a n n y a : p y t h o n %s <nama −
f i l e > ' %
s y s . a r g v [ 0 ℄ )
5 s y s . e x i t ( )
7 f i l e n a m e = s y s . a r g v [ 1 ℄
8 f = o p e n ( f i l e n a m e )
9 p r i n t f . r e a d ( )
10 f . l o s e ( )
1 $ p y t h o n a t 2 . p y
2 C a r a m e n g g u n a k a n n y a : p y t h o n a t . p y <nama − f i l e >
if not sys.argv[1:℄:
Kalau kita p erhatikan lagi isi dari sys.argv pada saat tidak dib erikan input
parameter adalah:
['at.py'℄
[℄
Ingatlah mengenai p emenggalan list pada p embahasan seb elumnya. Bila suatu
if not sys.argv[1:℄:
bisa b erarti
if not [℄:
yang b erarti
if not False:
if True:
True b erarti kondisi terp enuhi dan blok di dalam if dijalankan, dan akhirnya
Lalu apa yang terjadi jika program mendapat input parameter ? Nilai
sys.argv menjadi
['at.py', '/et/hosts'℄
Dengan b egitu
if not sys.argv[1:℄:
bisa b erarti
if not ['/et/hosts'℄:
Karena ['/et/hosts'℄ adalah list yang b erisi (tidak hampa) maka bisa dianggap
if not True:
if False:
False b erarti kondisi tidak terp enuhi sehingga blok di dalam if tidak dijalankan.
Inilah salah satu mengapa program yang dibuat dengan Python b egitu ringkas
Contoh seb elumnya menjelaskan bagaimana menggunakan list. Kini kita oba
b erawal dari list hampa dan mengisinya dengan elemen data. Kembali ke mo dus
interaktif.
1 >>> d a f t a r = [ ℄
2 >>> d a f t a r
3 [ ℄
Tambahkan mangga.
2 >>> d a f t a r
3 [ ' m a n g g a ' ℄
2 >>> d a f t a r
2 >>> d a f t a r
1 >>> d e l d a f t a r [ 0 ℄
2 >>> d a f t a r
3 [ ' j e r u k ' ℄
4.4 Ditionary
List adalah serangkaian elemen yang #alamatnya# adalah nomor urut, sering
disebut sebagai index. Ditionary juga mirip, hanya sa ja alamatnya tidak harus
b erupa angka yang b erurutan. Bahkan bisa b ertip e string atau tip e data lain-
1 d a f t a r = {
2 2 : ' j e r u k ' ,
3 7 : ' m a n g g a ' ,
4 4 : ' p i s a n g ' ,
5 3 : ' j a m b u ' ,
6 9 : ' a p e l ' ,
7 }
9 p r i n t d a f t a r
Jalankan.
1 $ p y t h o n p r o d u k 1 . p y
m a n g g a ' }
Perhatikan urutan pada soure, dan bandingkan urutan buah saat dita-
mpilkan. Begitulah ditionary, dia memang tidak memp erhatikan urutan. Ini-
lah salah satu yang memb edakannya dengan list. Ditionary o ok untuk p en-
bagi variab el daftar. Key ini bisa sa ja dianggap sebagai ko de barang atau ko de
buah. Sedangkan ap el, jeruk, jambu, pisang, dan mangga merupakan nilai (val-
ue). Karena itu ditionary sering disebut sebagai tip e data dengan formasi key
value.
1 d a f t a r = {
2 2 : ' j e r u k ' ,
3 7 : ' m a n g g a ' ,
4 4 : ' p i s a n g ' ,
5 3 : ' j a m b u ' ,
6 9 : ' a p e l ' ,
7 }
9 w h i l e T r u e :
10 k e y = r a w _ i n p u t ( ' K o d e b a r a n g : ' )
11 i f n o t k e y :
12 p r i n t ' S e l e s a i '
13 b r e a k
14 i f k e y i n d a f t a r :
15 p r i n t d a f t a r [ k e y ℄
16 e l s e :
Cobalah.
1 $ p y t h o n p r o d u k 2 . p y
2 K o d e b a r a n g : 5
3 K o d e b a r a n g 5 t i d a k d i t e m u k a n
4 K o d e b a r a n g : 9
5 K o d e b a r a n g 9 t i d a k d i t e m u k a n
6 K o d e b a r a n g :
7 S e l e s a i
if key in daftar:
b erarti menari string key dalam daftar yang isinya bilangan bulat (integer)
bahwa key itu adalah string ubahlah sedikit pada baris terakhir
menjadi
1 $ p y t h o n p r o d u k 2 . p y
2 K o d e b a r a n g : 9
3 K o d e b a r a n g [ ' 9 ' ℄
4 t i d a k d i t e m u k a n
5 K o d e b a r a n g :
6 S e l e s a i
Dengan memb erikan kurung siku pada variab el maka akan tampak bahwa
key adalah string. Terlihat adanya kutip tunggal pada '9'. Lalu bagaimana
1 d a f t a r = {
2 2 : ' j e r u k ' ,
3 7 : ' m a n g g a ' ,
4 4 : ' p i s a n g ' ,
5 3 : ' j a m b u ' ,
6 9 : ' a p e l ' ,
7 }
9 w h i l e T r u e :
10 k e y = r a w _ i n p u t ( ' K o d e b a r a n g : ' )
11 i f n o t k e y :
12 p r i n t ' S e l e s a i '
13 b r e a k
14 k e y = i n t ( k e y )
15 i f k e y i n d a f t a r :
16 p r i n t d a f t a r [ k e y ℄
17 e l s e :
Jalankan lagi.
1 $ p y t h o n p r o d u k 3 . p y
2 K o d e b a r a n g : 5
3 K o d e b a r a n g [ 5 ℄ t i d a k d i t e m u k a n
4 K o d e b a r a n g : 9
5 a p e l
6 K o d e b a r a n g :
7 S e l e s a i
Resapi kembali mengenai tip e data ini karena akan sering dijumpai nanti.
4.5 Waktu
Mo dul time digunakan untuk p enanganan waktu. Kita kembali ke mo dus inter-
1 >>> i m p o r t t i m e
2 >>> t = t i m e . l o a l t i m e ( )
3 >>> t
4 t i m e . s t r u t _ t i m e ( t m _ y e a r = 2 0 1 0 , tm_mon= 8 , tm_mday =
2 0 ,
t m _ h o u r = 1 1 , tm_min = 4 4 , t m _ s e = 4 7 , tm_wday = 4 , t m _ y d a y
= 2 3 2 , t m _ i s d s t = 0 )
Fungsi time.lo altime() digunakan untuk mendapatkan waktu saat ini. Per-
1 >>> t . t m _ y e a r
2 2 0 1 0
atau bulannya
1 >>> t . tm_mon
2 8
atau harinya
1 >>> t . tm_mday
2 2 0
Waktu juga bisa diwujudkan dalam bilangan p eahan (#oat), sering disebut
1 >>> t i m e . t i m e ( )
2 1 2 8 2 2 8 0 6 9 9 . 2 2 8 0 3 8 1
Ep o h ini adalah jumlah detik sejak 1 Januari 1970 jam 00:00:00 (GMT)
Fungsi time.lo altime() seb enarnya bisa dib erikan masukan b erupa ep o h
2 t i m e . s t r u t _ t i m e ( t m _ y e a r = 1 9 7 0 , tm_mon= 1 , tm_mday= 1
,
t m _ h o u r = 7 , tm_min = 0 , t m _ s e = 0 , tm_wday = 3 , t m _ y d a y = 1 ,
t m _ i s d s t = 0 )
7 ? Ini terkait dengan zona waktu (timezone) pada komputer yang b erarti
wilayah Jakarta (+7). Jika komputer Anda diset pada zona waktu Bali maka
time.mktime():
1 >>> t i m e . m k t i m e ( ( 2 0 1 0 , 8 , 1 7 , 0 , 0 , 0 , 0 , 0 , 0 ) )
2 1 2 8 1 9 7 8 0 0 0 . 0
1 >>> a w a l = t i m e . m k t i m e ( ( 2 0 1 0 , 8 , 1 , 0 , 0 , 0 , 0 , 0 , 0 )
)
2 >>> a k h i r = t i m e . m k t i m e ( ( 2 0 1 0 , 8 , 1 7 , 0 , 0 , 0 , 0 , 0 ,
0 ) )
3 >>> a k h i r − a w a l
4 1 3 8 2 4 0 0 . 0
Itu adalah jumlah detiknya. Untuk mendapatkan hari kita p erlu mengolah-
nya kembali.
1 >>> ( a k h i r − a w a l ) / 2 4 / 6 0 / 6 0
2 1 6 . 0
Mo dul datetime
1 >>> f r o m d a t e t i m e i m p o r t d a t e
2 >>> a w a l = d a t e ( 2 0 1 0 , 8 , 1 )
3 >>> a k h i r = d a t e ( 2 0 1 0 , 8 , 1 7 )
4 >>> d = a k h i r − a w a l
5 >>> d . d a y s
6 1 6
Dengan mo dul ini kita juga dapat menghitung jumlah detik sejak 16 Agustus
1 >>> f r o m d a t e t i m e i m p o r t d a t e t i m e
2 >>> a w a l = d a t e t i m e ( 2 0 1 0 , 8 , 1 6 , 2 2 , 0 , 0 )
3 >>> a k h i r = d a t e t i m e ( 2 0 1 0 , 8 , 1 7 , 1 0 , 0 , 0 )
4 >>> d = a k h i r − a w a l
5 >>> d . s e o n d s
6 4 3 2 0 0
1 >>> d . s e o n d s / 6 0 / 6 0
2 1 2
Bab 5
Mo dularitas
Mari kita buat program yang menghitung nilai faktorial. Apa itu faktorial ?
5! = 5 * 4 * 3 * 2 * 1 = 120
4! = 4 * 3 * 2 * 1 = 24
3! = 3 * 2 * 1 = 6
2! = 2 * 1 = 2
1! = 1
0! = 1
-1! = 1
2. n! = n * (n-1)!
Selanjutnya kita akan buat program yang akan menanyakan nilai n dan menampilkan
nilai faktorial-nya.
1 p r i n t ' M e n g h i t u n g n i l a i f a k t o r i a l '
2 w h i l e T r u e :
3 n = r a w _ i n p u t ( ' n = ' )
4 i f n o t n :
5 b r e a k
6 n = i n t ( n )
7 i f n < 2 :
8 f = 1
9 e l s e :
10 f = 1
11 f o r i i n r a n g e ( 1 , n + 1 ) :
12 f = f * i
13 p r i n t '%d ! = %d ' % ( n , f )
31
BAB 5. MODULARITAS 32
Jalankan.
1 $ p y t h o n f a k t o r i a l 1 . p y
2 M e n g h i t u n g n i l a i f a k t o r i a l
3 n = 2
4 2 ! = 2
5 n = 3
6 3 ! = 6
7 n = 4
8 4 ! = 2 4
9 n =
10 $
Juga tidak ada lagi while karena GUI sudah mengatur p erulangannya.
sa ja yang p erlu di-opy-paste di soure GUI nanti. Anda juga harus menye-
suaikan variab el n yang menjadi masukannya, karena n tidak lagi b erasal dari
Di sini mulai terasa soure faktorial di atas tidak mo dular karena menyulitkan
dengan
kalau nanti Anda diminta membuat rumus lainnya yang jauh lebih rumit ?
urusan menghitung nilai faktorial dengan urusan input dan output tampilannya.
1 d e f f a k t o r i a l ( n ) :
2 i f n < 2 :
3 r e t u r n 1
4 f = 1
5 f o r i i n r a n g e ( 1 , n + 1 ) :
6 f = f * i
7 r e t u r n f
10 p r i n t ' M e n g h i t u n g n i l a i f a k t o r i a l '
11 w h i l e T r u e :
12 n = r a w _ i n p u t ( ' n = ' )
13 i f n o t n :
14 b r e a k
BAB 5. MODULARITAS 33
15 n = i n t ( n )
16 h a s i l = f a k t o r i a l ( n )
17 p r i n t '%d ! = %d ' % ( n , h a s i l )
Jalankan.
1 $ p y t h o n f a k t o r i a l 2 . p y
2 M e n g h i t u n g n i l a i f a k t o r i a l
3 n = 5
4 5 ! = 1 2 0
5 n = 2
6 2 ! = 2
7 n = 1
8 1 ! = 1
9 n = − 1
10 − 1 ! = 1
11 n =
Hasilnya memang sama sa ja, namun kini soure faktorial lebih mudah dibaa
Copy-paste soure sep erti itu tentu sa ja lebih sulit ketimbang opy-paste #le-
nya. Oleh karena itu Anda p erlu membuat soure itu menjadi mo dul faktorial
yang b erarti namanya menjadi faktorial.py sehingga program lain yang mem-
1 f r o m f a k t o r i a l i m p o r t f a k t o r i a l
2 n = 5
3 p r i n t f a k t o r i a l ( n )
1 d e f f a k t o r i a l ( a ) :
2 i f a < 2 :
3 r e t u r n 1
4 f o r i i n r a n g e ( 1 , a ) :
5 a = a * i
6 r e t u r n a
1 f r o m f a k t o r i a l i m p o r t f a k t o r i a l
BAB 5. MODULARITAS 34
3 p r i n t ' M e n g h i t u n g n i l a i f a k t o r i a l '
4 w h i l e T r u e :
5 n = r a w _ i n p u t ( ' n = ' )
6 i f n o t n :
7 b r e a k
8 n = i n t ( n )
9 h a s i l = f a k t o r i a l ( n )
10 p r i n t '%d ! = %d ' % ( n , h a s i l )
Jalankan.
1 $ p y t h o n o b a f a k t o r i a l . p y
2 M e n g h i t u n g N i l a i F a k t o r i a l
3 n = 5
4 5 ! = 1 2 0
5 n = 2
6 2 ! = 2
7 n =
Hasilnya tetap sama, namun kini Anda lebih mudah opy-paste soure fungsi
faktorial() karena ukup faktorial.py yang di-opy ke direktori program lainnya.
Untuk menoba mo dul faktorial Anda p erlu membuat #le lainnya yaitu
Benar, alangkah praktisnya jika soure untuk menguji fungsi faktorial() juga
soure uji oba tersebut tidak dijalankan. Silahkan ubah faktorial.py menjadi
b erikut ini.
1 d e f f a k t o r i a l ( a ) :
2 i f a < 2 :
3 r e t u r n 1
4 f o r i i n r a n g e ( 1 , a ) :
5 a = a * i
6 r e t u r n a
9 p r i n t ' M e n g h i t u n g n i l a i f a k t o r i a l '
10 w h i l e T r u e :
11 n = r a w _ i n p u t ( ' n = ' )
12 i f n o t n :
13 b r e a k
14 n = i n t ( n )
BAB 5. MODULARITAS 35
15 h a s i l = f a k t o r i a l ( n )
16 p r i n t '%d ! = %d ' % ( n , h a s i l )
Perhatikan bahwa __name__ adalah name yang diawali dan diakhiri oleh
dua
2 M e n g h i t u n g n i l a i f a k t o r i a l
3 n = 3
4 3 ! = 6
5 n = 4
6 4 ! = 2 4
7 n =
if __name__ == '__main__':
Dengan baris ini Python dib eritahu bahwa soure dibawahnya hanya dijalankan
1 $ p y t h o n o b a f a k t o r i a l . p y
sa ja merep otkan. Apalagi bila ada p erubahan soure pada faktorial.py, maka
Ada banyak direktori dimana Python akan menari mo dul yang dipang-
1 >>> i m p o r t s y s
2 >>> s y s . p a t h
3 [ ' ' ,
4 ' / u s r / l i b / p y t h o n 2 . 6 ' ,
5 ' / u s r / l i b / p y t h o n 2 . 6 / p l a t − l i n u x 2 ' ,
6 ' / u s r / l i b / p y t h o n 2 . 6 / l i b − t k ' ,
7 ' / u s r / l i b / p y t h o n 2 . 6 / l i b −o l d ' ,
8 ' / u s r / l i b / p y t h o n 2 . 6 / l i b − d y n l o a d ' ,
9 ' / u s r / l i b / p y t h o n 2 . 6 / d i s t −p a k a g e s ' ,
10 ' / u s r / l i b / p y t h o n 2 . 6 / d i s t −p a k a g e s / P I L ' ,
11 ' / u s r / l i b / p y t h o n 2 . 6 / d i s t −p a k a g e s / g s t − 0 . 1
0 ' ,
12 ' / u s r / l i b / p y m o d u l e s / p y t h o n 2 . 6 ' ,
13 ' / u s r / l i b / p y t h o n 2 . 6 / d i s t −p a k a g e s / g t k − 2 . 0
' ,
14 ' / u s r / l i b / p y m o d u l e s / p y t h o n 2 . 6 / g t k − 2 . 0 ' ,
15 ' / u s r / l o a l / l i b / p y t h o n 2 . 6 / d i s t −p a k a g e s ' ℄
BAB 5. MODULARITAS 36
rada. Selanjutnya ia akan menari di direktori lainnya sep erti yang Anda lihat
di atas.
tidak melalui instalasi paket Debian, maka saya sarankan diletakkan di direktori
/usr/loal/lib/python2.6/dist-pakages
1 $ s u d o p f a k t o r i a l . p y / u s r / l o a l / l i b / p y t h o n 2 .
6 / d i s t −
p a k a g e s
1 $ s u d o mv f a k t o r i a l . p y / u s r / l o a l / l i b / p y t h o n 2 .
6 / d i s t −
p a k a g e s
Jika Anda punya direktori lain, Anda bisa tambahkan pada sys.path terlebih
1 >>> i m p o r t s y s
3 >>> f r o m f a k t o r i a l i m p o r t f a k t o r i a l
Bab 6
Fungsi
6.1 Memanggil Dirinya Sendiri
Fungsi faktorial() sudah b ekerja dengan baik. Tapi mungkin soure-nya terlalu
panjang. Cobalah ubah menjadi sep erti di bawah ini pada faktorial.py.
1 d e f f a k t o r i a l ( a ) :
2 i f a < 2 :
3 r e t u r n 1
4 r e t u r n a * f a k t o r i a l ( a − 1 )
Jauh lebih e#sien bukan? Teknik sep erti ini disebut juga sebagai rekursif.
Pertama kali yang harus dip erhatikan dalam p embuatan fungsi rekursif adalah
batas kedalaman. Batas ini ditunjukkan pada baris 2-3. Rekursif yang tidak
p emisah ribuan adalah titik, sedangkan p emisah p eahan adalah koma. Untuk
1 >>> i m p o r t l o a l e
5 ' 1 0 . 0 0 0 , 0 0 '
2 ' 1 0 . 0 0 0 '
Namun jika saat setlo ale Anda menjumpai p esan kesalahan sep erti ini:
37
BAB 6. FUNGSI 38
1 T r a e b a k ( m o s t r e e n t a l l l a s t ) :
3 F i l e " / u s r / l i b / p y t h o n 2 . 6 / l o a l e . p y " , l i n e 5 1
3 , i n
s e t l o a l e
4 r e t u r n _ s e t l o a l e ( a t e g o r y , l o a l e )
5 l o a l e . E r r o r : u n s u p p o r t e d l o a l e s e t t i n g
1 $ s u d o l o a l e − g e n i d _ I D . UTF − 8
2 G e n e r a t i n g l o a l e s . . .
3 i d _ I D . UTF − 8 . . . u p − t o − d a t e
4 G e n e r a t i o n o m p l e t e .
Kini saatnya membuat fungsi untuk menampilkan nilai uang ini. Kita na-
p eahan.
Karena uang() adalah fungsi umum yang akan banyak digunakan di b erbagai
1 i m p o r t l o a l e
5 d e f u a n g ( n i l a i , p e a h a n = 2 ) :
10 p r i n t u a n g ( 1 0 0 0 0 )
11 p r i n t u a n g ( 1 0 0 0 0 . 3 )
12 p r i n t u a n g ( 1 0 0 0 0 . 5 , 0 )
Cobalah.
1 $ p y t h o n u a n g . p y
2 1 0 . 0 0 0 , 0 0
3 1 0 . 0 0 0 , 3 0
4 1 0 . 0 0 0
Perhatikan bagian
'%%.%df' % peahan
BAB 6. FUNGSI 39
Butuh fungsi yang lebih erdas ? Misalkan dengan sifat sep erti ini:
(integer) maka p eahan tidak ditampilkan. Selain kondisi itu b erarti di-
digit.
2. Selain kondisi di atas maka nilai uang ditampilkan sep erti biasa sesuai
Masih di uang.py.
1 i m p o r t l o a l e
5 d e f u a n g ( n i l a i , p e a h a n=N o n e ) :
6 i f p e a h a n i s N o n e :
7 i f t y p e ( n i l a i ) == t y p e ( 0 ) :
8 p e a h a n = 0
9 e l s e :
10 p e a h a n = 2
12
13
15 p r i n t u a n g ( 1 0 0 0 0 )
16 p r i n t u a n g ( 1 0 0 0 0 . 3 )
17 p r i n t u a n g ( 1 0 0 0 0 . 5 , 4 )
Jalankan lagi.
$ python uang.py
10.000
10.000,30
10.000,5000
Cermatilah baik-baik hasilnya. Di sini kita sudah mengenal fungsi yang memiliki
dua masukan dan juga memiliki nilai default pada salah satu masukannya. Juga
Rasanya fungsi uang kurang lengkap bila tidak disertai dengan mata uangnya.
1. Fungsi uang dib eri satu masukan baru yaitu variab el tanda untuk memb eri
BAB 6. FUNGSI 40
2. Bila variab el tanda tidak diisi maka mata uang diambil dari sistem, meng-
1 i m p o r t l o a l e
3 f r o m t y p e s i m p o r t I n t T y p e
4
6 d e f r i b u ( n i l a i , p e a h a n=N o n e ) :
7 i f p e a h a n i s N o n e :
8 i f t y p e ( n i l a i ) == I n t T y p e :
9 p e a h a n = 0
10 e l s e :
11 p e a h a n = 2
13
14 d e f u a n g ( n i l a i , p e a h a n=N o n e , t a n d a=N o n e ) :
15 i f t a n d a i s N o n e :
16 t a n d a = l o a l e . l o a l e o n v ( ) [ ' u r r e n y _ s y m b o l '
℄
17 r e t u r n '%s%s ' % ( t a n d a , r i b u ( n i l a i , p e a h a n ) )
18
19
21 p r i n t r i b u ( 1 0 0 0 0 )
22 p r i n t r i b u ( 1 0 0 0 0 . 3 )
23 p r i n t r i b u ( 1 0 0 0 0 . 5 , 4 )
24 p r i n t u a n g ( 1 0 0 0 0 . 7 )
25 p r i n t u a n g ( 1 0 0 0 0 . 7 , 2 , ' $ ' )
26 p r i n t u a n g ( 1 0 0 0 0 . 7 , t a n d a= ' $ ' )
Perhatikan fungsi tambahan ribu(). Fungsi ini seb enarnya salinan dari fungsi
uang() seb elumnya. Mengapa tidak langsung mengubah fungsi uang() sep erti
biasanya ?
Tujuannya adalah kita tidak ingin mengganggu algoritma yang sudah b er-
jalan baik itu. Sehingga bila ada kekeliruan pada algoritma di uang(), area
p enarian kesalahan bisa diminimalisir.
dimana kita melewatkan variab el kedua, yaitu p eahan pada fungsi uang(),
BAB 6. FUNGSI 41
Karena mo dul uang ini merupakan mo dul umum yang bisa digunakan oleh
pakages agar bisa digunakan oleh program lainnya. Lalu uji keb eradaannya di
mo dus interaktif.
1 >>> f r o m u a n g i m p o r t u a n g
2 >>> u a n g ( 1 0 0 0 0 )
3 ' 1 0 . 0 0 0 '
Bab 7
Database
Database atau p enyimpan data biasa digunakan untuk aplikasi bisnis sep erti
Pasanglah
1 $ s u d o a p t − g e t i n s t a l l p o s t g r e s q l
Linux maupun di sistem PostgreSQL itu sendiri. Pasa p emasangan user p ost-
1 $ s u d o s u
Masukkan password user yang Anda gunakan ketika login p ertama kali. Kini
1 # s u − p o s t g r e s
Kini Anda sudah menjadi user p ostgres. Menurut ketentuan default, bila
user Linux dan user PostgreSQL sama maka tidak p erlu password untuk login
ke PostgreSQL server. Sekarang mulailah membuat user database:
1 $ r e a t e u s e r − P i l h a m
2 E n t e r p a s s w o r d f o r n e w r o l e :
3 E n t e r i t a g a i n :
4 S h a l l t h e n e w r o l e b e a s u p e r u s e r ? ( y / n ) n
5 S h a l l t h e n e w r o l e b e a l l o w e d t o r e a t e d a t a b a s e
s ? ( y / n )
6 S h a l l t h e n e w r o l e b e a l l o w e d t o r e a t e m o r e n e w r o
l e s ? (
y / n ) n
Isilah password dengan 1234. Saat diketik password tidak akan ditampilkan.
Selebihnya user ilham ini tidak dizinkan sebagai sup eruser, tidak diizinkan mem-
Untuk menghapusnya:
1 $ d r o p u s e r i l h a m
42
BAB 7. DATABASE 43
1 $ r e a t e d b − O i l h a m t o t a l i n d o
Ini artinya kita membuat database b ernama totalindo yang dimiliki oleh user
1 $ d r o p d b t o t a l i n d o
1 $ p s q l
2 p s q l ( 8 . 4 . 4 )
3 T y p e " h e l p " f o r h e l p .
5 p o s t g r e s =# \ l
6 L i s t o f d a t a b a s e s
7 Name | O w n e r | E n o d i n g | C o l l a t i o n |
9 p o s t g r e s | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
10 t e m p l a t e 0 | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
11 t e m p l a t e 1 | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
12 t o t a l i n d o | i l h a m | UTF8 | i d _ I D . UTF − 8 |
13 ( 4 r o w s )
14
15 p o s t g r e s =#
1 p o s t g r e s =# \ q
2 $ w h o a m i
3 p o s t g r e s
Anda masih sebagai user p ostgres, keluarlah dengan p erintah logout atau
tekan Ctrl-D:
1 $ l o g o u t
2 # w h o a m i
3 r o o t
Kini Anda sebagai ro ot, keluarlah lagi dengan p erintah logout agar kembali
1 # l o g o u t
2 $ w h o a m i
3 s u g i a n a
1 $ p s q l − U i l h a m t o t a l i n d o − h l o a l h o s t
2 P a s s w o r d f o r u s e r i l h a m :
3 p s q l ( 8 . 4 . 4 )
BAB 7. DATABASE 44
5 T y p e " h e l p " f o r h e l p .
7 t o t a l i n d o =>
pada saat sebagai user p ostgres kita ukup mengetikkan psql sa ja. Apa b edanya
7.1 Tab el
1. Harus memiliki PRIMARY KEY, yaitu sebuah / b eb erapa #eld yang men-
2. Sebisa mungkin setiap #eld memiliki DEFAULT value dimana kalau tidak
3. Sebisa mungkin setiap #eld NOT NULL yang b erarti harus diisi.
BLE.
6 t o t a l i n d o ( > ) ;
Perhatikan prompt
totalindo=>
totalindo(>
BAB 7. DATABASE 45
yang b ermakna prompt itu kelanjutan dari prompt seb elumnya. Penulisan
yang diikuti dengan p enekanan tomb ol Enter membuat prompt memb eritahukan
Anda bahwa kurung buka masih aktif dan membutuhkan kurung tutup seb elum
Perintah dalam SQL (strutured query language) seb enarnya tidak memp er-
CREATE TABLE
menjadi
reate table
Sekarang kita lihat daftar tab el yang ada di database totalindo ini menggunakan
p erintah \dt.
1 t o t a l i n d o => \ d t
2 L i s t o f r e l a t i o n s
3 S h e m a | Name | T y p e | O w n e r
5 p u b l i | p e g a w a i | t a b l e | i l h a m
6 ( 1 r o w )
8 t o t a l i n d o =>
Lalu lihat struktur tab elnya menggunakan p erintah \d diikuti nama tab el.
1 t o t a l i n d o => \ d p e g a w a i
2 T a b l e " p u b l i . p e g a w a i "
3 C o l u m n | T y p e |
M o d i f i e r s
5 i d | i n t e g e r | n o t n u l l d e f a u l t
n e x t v a l ( ' p e g a w a i _ i d _ s e q ' : : r e g l a s s )
6 nama | h a r a t e r v a r y i n g ( 3 0 ) | n o t n u l l
7 t g l _ l a h i r | d a t e | n o t n u l l
8 I n d e x e s :
10
11 t o t a l i n d o =>
BAB 7. DATABASE 46
Perhatikan kolom / #eld id yang b ertip e integer, padahal seb elumnya kita
Tip e serial hanyalah ara epat untuk membuat sebuah #eld menjadi au-
toinrement (nomor urut). Jadi p ende#nisian suatu #eld menjadi serial akan
membuat:
7.1.1 Sequene
Sequene mirip tab el, tepatnya tab el satu reord yang b erisi data untuk ke-
otomatis terb entuk saat #eld id pada tab el p egawai dide#nisikan sebagai seri-
al. Data pada sequene bisa dilihat sebagaimana tab el menggunakan p erintah
SELECT.
4 p e g a w a i _ i d _ s e q | 1 | f |
6 ( 1 r o w )
2 i d | nama | t g l _ l a h i r
4 ( 0 r o w s )
3 INSERT 0 1
Perhatikan p erintah di baris p ertama tidak diakhiri dengan titik koma yang
totalindo->
yakni menggunakan karakter minus ( - ) yang b erarti baris ini merupakan ke-
lanjutan dari baris seb elumnya. Jika Anda salah dalam menuliskan p erintah di
baris p ertama dan terlanjur menekan Enter, akhiri sa ja dengan titik koma di
baris kedua. Kemudian mulai lagi dari awal. Berikut ini ontoh kesalahan yang
bisa sa ja terjadi.
BAB 7. DATABASE 47
2 t o t a l i n d o − > ;
5 ^
6 t o t a l i n d o =>
Kembali ke tab el p egawai yang sudah kita isi dengan p erintah INSERT.
2 i d | nama | t g l _ l a h i r
4 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7
5 ( 1 r o w )
Perhatikan saat INSERT tadi #eld id tidak disertakan, namun p erintah SE-
LECT memp erlihatkan bahwa #eld id terisi dengan angka 1. Inilah yang dise-
but dengan #eld autoinrement. Lalu apa yang terjadi dengan sequene p e-
gawai_id_seq ?
2 s e q u e n e _ n a m e | l a s t _ v a l u e | i s _ a l l e d
4 p e g a w a i _ i d _ s e q | 1 | t
6 ( 1 r o w )
SERT. Yang p erlu dip erhatikan adalah #eld is_alled dimana seb elumnya f
(False) kini menjadi t (True). Ini artinya sequene sudah digunakan agar
= 2.
3 INSERT 0 1
7 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7
8 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2
9 ( 2 r o w s )
Perhatikan kembali #eld id yang terisi dengan angka 2, dan lihat juga p e-
gawai_id_seq.
BAB 7. DATABASE 48
2 s e q u e n e _ n a m e | l a s t _ v a l u e | i s _ a l l e d |
4 p e g a w a i _ i d _ s e q | 2 | t | 1
6 ( 1 r o w )
Jawabannya b oleh, hanya ada yang p erlu dip erhatikan pada kon#gurasi
/et/postgresql/8.4/main/postgresql.onf
1 $ s u d o n a n o / e t / p o s t g r e s q l / 8 . 4 / m a i n / p o s t g r e
s q l . o n f
Jika sudah tampak dmy sep erti di atas maka Anda diizinkan mengisi #eld tang-
maka ubahlah mdy menjadi dmy, simpan, logout semua psql, dan restart Post-
greSQL.
1 $ s u d o / e t / i n i t . d / p o s t g r e s q l − 8 . 4 r e s t a r t
Perlu Anda ketahui, format dmy otomatis Anda dapatkan bila saat instalasi
Cobalah untuk menambah data p egawai lagi dengan tanggal lahir b erformat
tanggal-bulan-tahun.
3 INSERT 0 1
5 i d | nama | t g l _ l a h i r
7 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7
8 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2
9 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1
10 ( 3 r o w s )
BAB 7. DATABASE 49
2 i d | nama | t g l _ l a h i r
4 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2
5 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7
6 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1
7 ( 3 r o w s )
2 i d | nama | t g l _ l a h i r
5 ( 1 r o w )
Tampilkan p egawai yang lahir di tahun 1972 dan diurutkan mulai yang ter-
tua.
3 t o t a l i n d o − > ORDER BY t g l _ l a h i r ;
4 i d | nama | t g l _ l a h i r
6 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2
7 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1
8 ( 2 r o w s )
Gunakan DESC pada ORDER BY jika ingin diurut mulai yang termuda.
Tekan tomb ol panah atas untuk mengulang p erintah seb elumnya dan tam-
bahkan DESC.
3 ORDER BY t g l _ l a h i r DESC ;
4 i d | nama | t g l _ l a h i r
6 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1
7 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2
8 ( 2 r o w s )
Pegawai seb elumnya tampak sebagai laki-laki, terlihat dari namanya. Cobalah
BAB 7. DATABASE 50
Manusia bisa jadi memahami mana nama laki-laki dan mana p erempuan.
itu kita p erlu menambah #eld pria yang b ertip e logika (b o olean). Kita membu-
DEFAULT t r u e ;
2 ALTER TABLE
Sep erti dijelaskan pada sesi Python seb elumnya, b o olean hanya bisa diisi
dengan dua nilai, bisa True atau False. Kita menamakan #eld ini dengan pria
dengan b egitu nilai default-nya adalah True. Jika #eld pria False b erarti p
egawai
tersebut p erempuan. Sekarang kita lihat isi tab el p egawai setelah p enambahan
#eld di atas.
2 i d | nama | t g l _ l a h i r | p r i a
4 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2 | t
5 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7 | t
6 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1 | t
7 4 | N i t a P a n d r i a | 1 9 7 6 − 0 9 − 1 9 | t
8 ( 4 r o w s )
Perhatikan #eld pria, tampak semua tertulis t yang artinya True. Apa data
2 UPDATE 1
3 t o t a l i n d o => SELECT * FROM p e g a w a i ORDER BY nama ;
4 i d | nama | t g l _ l a h i r | p r i a
6 2 | A r i e f S e t i a d i | 1 9 7 2 − 0 5 − 0 2 | t
7 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7 | t
8 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1 | t
9 4 | N i t a P a n d r i a | 1 9 7 6 − 0 9 − 1 9 | f
10 ( 4 r o w s )
LECT, dan mengubahnya dengan UPDATE. Kini kita oba untuk menghapus-
2 DELETE 1
4 i d | nama | t g l _ l a h i r | p r i a
BAB 7. DATABASE 51
6 1 | Bummi D w i P u t e r a | 1 9 8 5 − 0 8 − 1 7 | t
7 3 | C e e p Z a h r u d i n | 1 9 7 2 − 0 6 − 0 1 | t
8 4 | N i t a P a n d r i a | 1 9 7 6 − 0 9 − 1 9 | f
9 ( 3 r o w s )
Jika Anda kurang suka dengan #eld pria yang b ertip e b o olean bisa dihapus
2 ALTER TABLE
2 DROP TABLE
SELECT, INSERT, UPDATE, dan DELETE adalah hal yang terkait den-
gan reord / baris data sehingga disebut sebagai Data Manipulation Language
(DML). Sedangkan CREATE, ALTER, dan DROP terkait dengan struktur tab el
7.2 View
Dibutuhkan sebuah lap oran yang menampilkan data p egawai b eserta usianya.
p e g a w a i ORDER BY t g l _ l a h i r ;
2 i d | nama | ? o l u m n ?
4 2 | A r i e f S e t i a d i | 1 3 9 5 7 d a y s 1 1 : 2 1 : 5 4 . 0 8 3 0 2 2
5 3 | C e e p Z a h r u d i n | 1 3 9 2 7 d a y s 1 1 : 2 1 : 5 4 . 0 8 3 0 2 2
6 4 | N i t a P a n d r i a | 1 2 3 5 6 d a y s 1 1 : 2 1 : 5 4 . 0 8 3 0 2 2
7 1 | Bummi D w i P u t e r a | 9 1 0 2 d a y s 1 1 : 2 1 : 5 4 . 0 8 3 0 2 2
8 ( 4 r o w s )
Kolom ketiga b erisi usia, tapi PostgreSQL tidak tahu harus dinamakan apa,
sehingga jadilah b ernama ?olumn?. Ada baiknya kita b erikan nama #usia#.
3 i d | nama | u s i a
5 2 | A r i e f S e t i a d i | 1 3 9 5 7 d a y s 1 1 : 2 8 : 3 4 . 0 0 1 1 4 2
6 3 | C e e p Z a h r u d i n | 1 3 9 2 7 d a y s 1 1 : 2 8 : 3 4 . 0 0 1 1 4 2
BAB 7. DATABASE 52
7 4 | N i t a P a n d r i a | 1 2 3 5 6 d a y s 1 1 : 2 8 : 3 4 . 0 0 1 1 4 2
8 1 | Bummi D w i P u t e r a | 9 1 0 2 d a y s 1 1 : 2 8 : 3 4 . 0 0 1 1 4 2
9 ( 4 r o w s )
Satuan usia menggunakan hari tentu sa ja kurang nyaman dibaa. Sebaiknya
2 t o t a l i n d o − > e x t r a t ( y e a r f r o m now ( ) ) − e x t r a t ( y
e a r f r o m
t g l _ l a h i r ) AS u s i a
4 i d | nama | u s i a
6 2 | A r i e f S e t i a d i | 3 8
7 3 | C e e p Z a h r u d i n | 3 8
8 4 | N i t a P a n d r i a | 3 4
9 1 | Bummi D w i P u t e r a | 2 5
10 ( 4 r o w s )
2 e x t r a t ( y e a r f r o m now ( ) ) − e x t r a t ( y e a r f r o m t g l _
l a h i r )
AS u s i a
3 FROM p e g a w a i ORDER BY t g l _ l a h i r ;
4 CREATE VIEW
2 i d | nama | u s i a
4 2 | A r i e f S e t i a d i | 3 8
5 3 | C e e p Z a h r u d i n | 3 8
6 4 | N i t a P a n d r i a | 3 4
7 1 | Bummi D w i P u t e r a | 2 5
8 ( 4 r o w s )
Penamaan VIEW tidak harus b erawalan #v_#. Penggunaan awalan itu un-
tuk memb edakan VIEW dengan tab el seb enarnya. Meski ia dapat di-SELECT
Walau v_p egawai sudah mengandung ORDER BY, kita masih bisa meng-
2 i d | nama | u s i a
BAB 7. DATABASE 53
4 2 | A r i e f S e t i a d i | 3 8
5 1 | Bummi D w i P u t e r a | 2 5
6 3 | C e e p Z a h r u d i n | 3 8
7 4 | N i t a P a n d r i a | 3 4
8 ( 4 r o w s )
Jika tab el p egawai b enar-b enar Anda hapus, sebaiknya mulailah membuatnya
lagi dan mengisinya. Selain langsung melalui psql mo dus interaktif, Anda bisa
1 CREATE TABLE p e g a w a i (
2 i d s e r i a l ,
4 t g l _ l a h i r d a t e NOT NULL ,
6 PRIMARY KEY ( i d )
7 ) ;
1 t o t a l i n d o => \ i p e g a w a i . s q l
i m p l i i t s e q u e n e " p e g a w a i _ i d _ s e q " f o r s e r i a l o
l u m n
" p e g a w a i . i d "
t a b l e " p e g a w a i "
4 CREATE TABLE
5 INSERT 0 1
6 INSERT 0 1
7 INSERT 0 1
8 INSERT 0 1
BAB 7. DATABASE 54
1 t o t a l i n d o => \ i / h o m e / s u g i a n a / p e g a w a i . s q l
1 $ pg_dump − U i l h a m t o t a l i n d o − h l o a l h o s t − F t − f
t o t a l i n d o . s q l . t a r
Mulailah untuk latihan restore, yaitu dengan membuat database lain b erna-
1 $ p g _ r e s t o r e − U i l h a m − h l o a l h o s t − d t o t a l i n d o _
1
t o t a l i n d o . s q l . t a r
1 $ pg_dump − U i l h a m t o t a l i n d o − h l o a l h o s t − f t o t a l i n
d o .
s q l
1 $ p s q l − U i l h a m t o t a l i n d o _ 1 − h l o a l h o s t − f t o t a l
i n d o . s q l
do.sql menggunakan teks editor biasa. Namun p enggunaan format ini terkadang
menimbulkan masalah saat restore bila ada #karakter aneh#, yaitu karakter den-
1 $ p s q l − U i l h a m t e m p l a t e 1 − h l o a l h o s t
2 p s q l ( 8 . 4 . 4 )
3 T y p e " h e l p " f o r h e l p .
5 p o s t g r e s =# \ l
6 L i s t o f d a t a b a s e s
7 Name | O w n e r | E n o d i n g | C o l l a t i o n |
9 p o s t g r e s | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
10 t e m p l a t e 0 | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
11 t e m p l a t e 1 | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
12 t o t a l i n d o | i l h a m | UTF8 | i d _ I D . UTF − 8 |
13 t o t a l i n d o _ 1 | i l h a m | UTF8 | i d _ I D . UTF − 8 |
14 ( 5 r o w s )
BAB 7. DATABASE 55
Perhatikan di versi ini default eno ding adalah UTF8. Jika Anda membak-
database yang baru pun Anda sebaiknya tetap menggunakan eno ding yang
1 $ s u d o s u
2 # s u − p o s t g r e s
3 $ r e a t e d b − O i l h a m − T t e m p l a t e 0 − E s q l _ a s i i t o t a
l i n d o _ 2
Kembali ke psql dan lihat daftar database. Karena masih sebagai user p ost-
1 $ p s q l
2 p s q l ( 8 . 4 . 4 )
3 T y p e " h e l p " f o r h e l p .
5 p o s t g r e s =# \ l
6 L i s t o f d a t a b a s e s
7 Name | O w n e r | E n o d i n g | C o l l a t i o n |
9 p o s t g r e s | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
10 t e m p l a t e 0 | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
11 t e m p l a t e 1 | p o s t g r e s | UTF8 | i d _ I D . UTF − 8 |
12 t o t a l i n d o | i l h a m | UTF8 | i d _ I D . UTF − 8 |
13 t o t a l i n d o _ 1 | i l h a m | UTF8 | i d _ I D . UTF − 8 |
14 t o t a l i n d o _ 2 | i l h a m | SQL_ASCII | i d _ I D . UTF − 8 |
15 ( 6 r o w s )
Mengenai ara bakup dan restore lainnya sama sep erti seb elumnya.
Bila database yang Anda bakup tidak mengandung karakter aneh (ASCI I
> 126) maka bisa dengan nyaman di-restore dari ke UTF8. Namun bila men-
gandung ASCI I > 126 maka restore ke UTF8 dari sumb er SQL_ASCI I bisa
menimbulkan masalah.
7.4 Fungsi
Sama sep erti Python, PostgreSQL juga mengenal fungsi. Contoh fungsi bawaan
2 now
3 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
4 2 0 1 0 − 0 8 − 2 4 1 6 : 0 6 : 5 8 . 6 7 8 0 5 6 + 0 7
5 ( 1 r o w )
Keunikan fungsi pada PostgreSQL adalah pada nama dan susunan masukan-
BAB 7. DATABASE 56
2 l p a d
3 −−−−−−−
4 A
5 ( 1 r o w )
Fungsi lpad() b erguna untuk memb eri spasi di seb elah kiri. Jumlah spasi
ditambah jumlah karakter string 'A' tidak b oleh melebihi 5. Jadi pada ontoh
di atas jumlah spasi di seb elah kiri 'A' sebanyak 4 buah. Untuk membuktikan
3 −−−−−−−−
4 5
5 ( 1 r o w )
Sekarang kita membutuhkan awalan '0' pada sebuah nomor, misalnya '00001'.
Ini lazim kita temui pada b eb erapa lap oran. Fungsi apa yang akan digunakan.
2 l p a d
3 −−−−−−−
4 0 0 0 0 1
5 ( 1 r o w )
bisa menerima masukan dua buah atau tiga buah. Jika dua buah sa ja yang
digunakan maka lpad() akan mengawalinya dengan spasi. Namun jika tiga buah
masukan, maka lpad() akan mengawalinya sesuai dengan karakter pada masukan
Jadi bila kita ingin membuat b eb erapa fungsi dengan nama sama
maka harus
1. Jumlah masukannya.
2. Jika jumlah masukannya sama maka b edakan tip e data setiap masukan
tersebut.
7.4.1 PL/pgSQL
fungsi tersebut bisa ditulis dalam b erbagai bahasa. Dimana Anda bisa menulis
fungsi dalam bahasa pgSQL, Python, Perl, hingga Tl. Seara default bahasa
1 $ s u d o s u p o s t g r e s − " r e a t e l a n g p l p g s q l t o t a l i n
d o "
BAB 7. DATABASE 57
1 $ p s q l − U i l h a m t o t a l i n d o − h l o a l h o s t
sedangkan yang kedua untuk text editor vi. Tentu sa ja Anda bisa menggu-
nakan gedit. Text editor akan kita gunakan untuk membuat #le-#le *.sql.
Sekarang kita akan membuat fungsi sederhana hello(), tanpa masukan apapun,
2 RETURNS t e x t
3 LANGUAGE p l p g s q l
4 AS $ $
5 BEGIN
7 END
8 $ $ ;
1 t o t a l i n d o => \ i h e l l o . s q l
2 CREATE FUNCTION
lalu obalah
1 t o t a l i n d o => SELECT h e l l o ( ) ;
2 h e l l o
3 −−−−−−−−−−−−−−
4 H e l l o w o r l d .
5 ( 1 r o w )
Transaksi Perbankan
Kita sudah punya tab el p egawai dimana setiap p egawai dianggap sebagai nasabah
saldonya b erkurang. Saat kas b on (pinjam) saldonya juga b erkurang. Jadi saldo
juga bisa negatif yang b erarti p egawai tersebut punya hutang ke p erusahaan.
si b erikut ini.
1 CREATE TABLE t r a n s a k s i (
2 i d s e r i a l PRIMARY KEY ,
BAB 7. DATABASE 58
5 k e t v a r h a r ( 1 0 0 ) NOT NULL ,
6 n o m i n a l f l o a t NOT NULL ,
7 s a l d o f l o a t NOT NULL
8 ) ;
bulan Nop emb er 2010 seb esar Rp 3.000.000,- maka query-nya adalah:
3 INSERT INTO t r a n s a k s i ( p i d , k e t , n o m i n a l , s a l d o )
5 FROM p e g a w a i
6 WHERE i d = 1 ;
Ya, kita butuh dua query untuk sebuah transaksi. Mungkin ada p ertanyaan,
untuk apa #eld saldo pada tab el transaksi ? Field ini digunakan untuk memu-
setiap transaksi.
1. ID p egawai
2. Keterangan transaksi
3. Nominal transaksi
Kalau transaksi ini dikemas dalam sebuah fungsi, lalu apa keluarannya ? Kelu-
aran atau output yang paling tepat adalah ID transaksi. Query-nya bisa kita
1 i d | p i d | t g l |
3 1 | 1 | 2 0 1 0 − 1 0 − 2 2 1 7 : 5 8 : 0 1 . 8 6 |
5 k e t | n o m i n a l | s a l d o
7 GAJI 1 1 − 2 0 1 0 | 3 0 0 0 0 0 0 | 3 0 0 0 0 0 0
2 p _ p i d i n t e g e r ,
3 p _ k e t t e x t ,
4 p _ n o m i n a l f l o a t )
5 RETURNS i n t e g e r
BAB 7. DATABASE 59
6 LANGUAGE p l p g s q l
7 AS $ $
8 DECLARE
9 r e r e o r d ;
10 BEGIN
11 UPDATE p e g a w a i
12 SET s a l d o = s a l d o + p _ n o m i n a l
13 WHERE i d = p _ p i d ;
14
15 INSERT INTO t r a n s a k s i (
16 i d , p i d , n o m i n a l , k e t , s a l d o )
17 SELECT t i d , p _ p i d , p _ n o m i n a l , p _ k e t , s a l d o
18 FROM p e g a w a i
19 WHERE i d = p _ p i d ;
20
21 SELECT i d
22 INTO r e
23 FROM t r a n s a k s i
24 ORDER BY i d DESC
25 LIMIT 1 ;
26
27 RETURN r e . i d ;
28 END
29 $ $
1 t o t a l i n d o => \ i f u n t r a n s a k s i . s q l
2 CREATE FUNCTION
2 t r a n s a k s i
3 −−−−−−−−−−−
4 2
5 ( 1 r o w )
Perhatikan nominal b erisi nilai negatif yang artinya mengurangi saldo. Sekarang
2 i d | p i d | t g l | k e t |
n o m i n a l | s a l d o
4 1 | 1 | 2 0 1 0 − 1 0 − 2 2 1 7 : 5 8 : 0 1 . 8 6 9 1 3 9 | GAJI 1 1 − 2 0 1 0 |
3 0 0 0 0 0 0 | 3 0 0 0 0 0 0
BAB 7. DATABASE 60
5 2 | 1 | 2 0 1 0 − 1 0 − 2 2 1 8 : 2 0 : 0 8 . 8 4 5 0 9 1 | BON |
− 2 0 0 0 0 0 | 2 8 0 0 0 0 0
6 ( 2 r o w s )
Dilihat dari asp ek keepatan, query SELECT terhadap tab el transaksi bisa
ini.
2 p _ p i d i n t e g e r ,
3 p _ k e t t e x t ,
4 p _ n o m i n a l f l o a t )
5 RETURNS i n t e g e r
6 LANGUAGE p l p g s q l
7 AS $ $
8 DECLARE
9 t i d i n t e g e r ;
10 BEGIN
11 UPDATE p e g a w a i
12 SET s a l d o = s a l d o + p _ n o m i n a l
13 WHERE i d = p _ p i d ;
14
15 t i d = n e x t v a l ( ' t r a n s a k s i _ i d _ s e q ' ) ;
16
17 INSERT INTO t r a n s a k s i (
18 i d , p i d , n o m i n a l , k e t , s a l d o )
19 SELECT t i d , p _ p i d , p _ n o m i n a l , p _ k e t , s a l d o
20 FROM p e g a w a i
21 WHERE i d = p _ p i d ;
22
23 RETURN t i d ;
24 END
25 $ $
Restore.
1 t o t a l i n d o => \ i t r a n s a k s i . s q l
2 CREATE FUNCTION
2 t r a n s a k s i
3 −−−−−−−−−−−
4 3
5 ( 1 r o w )
BAB 7. DATABASE 61
2 i d | p i d | t g l | k e t |
n o m i n a l | s a l d o
4 1 | 1 | 2 0 1 0 − 1 0 − 2 2 1 7 : 5 8 : 0 1 . 8 6 9 1 3 9 | GAJI 1 1 − 2 0 1 0 |
3 0 0 0 0 0 0 | 3 0 0 0 0 0 0
5 2 | 1 | 2 0 1 0 − 1 0 − 2 2 1 8 : 2 0 : 0 8 . 8 4 5 0 9 1 | BON |
− 2 0 0 0 0 0 | 2 8 0 0 0 0 0
6 3 | 5 | 2 0 1 0 − 1 0 − 2 2 1 8 : 4 1 : 4 5 . 3 0 9 4 5 1 | GAJI 1 1 − 2 0 1 0 |
1 5 0 0 0 0 0 | 1 5 0 0 0 0 0
7 ( 3 r o w s )
7.4.2 PL/Python
Penulisan fungsi PostgreSQL bisa juga dalam bahasa Python. Biasanya saya
gunakan bahasa ini untuk algoritma yang tidak membutuhkan akses database.
1 $ s u d o a p t − g e t i n s t a l l p o s t g r e s q l − p l p y t h o n − 8 .
4
2 $ s u d o s u p o s t g r e s − " r e a t e l a n g p l p y t h o n u t o t a l
i n d o "
? Kali ini akan kita gunakan pada fungsi di PostgreSQL. Buatlah uang.sql
b erikut ini.
2 RETURNS t e x t
3 LANGUAGE p l p y t h o n u
4 AS $ $
5 f r o m u a n g i m p o r t u a n g
6 r e t u r n u a n g ( n )
7 $ $ ;
10 RETURNS t e x t
11 LANGUAGE p l p y t h o n u
12 AS $ $
13 f r o m u a n g i m p o r t u a n g
14 r e t u r n u a n g ( n )
15 $ $ ;
Tidak sep erti plpgsql, fungsi yang ditulis menggunakan plpythonu harus
dibuat oleh user p ostgres.
BAB 7. DATABASE 62
1 $ s u d o s u p o s t g r e s − " p s q l t o t a l i n d o − f u a n g . s q l
"
2 [ s u d o ℄ p a s s w o r d f o r s u g i a n a :
3 CREATE FUNCTION
4 CREATE FUNCTION
Lalu obalah.
1 t o t a l i n d o => SELECT u a n g ( 1 0 0 0 0 ) ;
2 u a n g
3 −−−−−−−−
4 1 0 . 0 0 0
5 ( 1 r o w )
Bab 8
Data yang ada di PostgreSQL dapat digunakan oleh aplikasi yang ditulis den-
Pustaka ini dipilih karena sifatnya yang luwes dimana ia juga bisa menangani
1 $ s u d o a p t − g e t i n s t a l l p y t h o n − s q l a l h e m y
2 $ s u d o a p t − g e t i n s t a l l p y t h o n − p s y o p g 2
1 >>> i m p o r t s q l a l h e m y a s s a
2 >>> u r l = ' p o s t g r e s q l : / / i l h a m : 1 2 3 4 # l o a l h o s t /
t o t a l i n d o '
3 >>> d b = s a . r e a t e _ e n g i n e ( u r l )
4 >>> d b . o n n e t ( )
5 < s q l a l h e m y . e n g i n e . b a s e . C o n n e t i o n o b j e t a t
0 x 8 b 0 8 7 2 >
Sampai di sini Python sudah terhubung ke PostgreSQL dan uji oba login
b erhasil dengan p erintah onnet(). Anda bisa lanjutkan dengan p erintah query
2 >>> q = d b . e x e u t e ( s q l )
3 >>> f o r r i n q :
4 . . . p r i n t r
5 . . .
7 ( 2 , ' A r i e f S e t i a d i ' , d a t e t i m e . d a t e ( 1 9 7 2 , 5 , 2 )
, T r u e )
8 ( 3 , ' C e e p Z a h r u d i n ' , d a t e t i m e . d a t e ( 1 9 7 2 , 6 ,
1 ) , T r u e )
9 ( 4 , ' N i t a P a n d r i a ' , d a t e t i m e . d a t e ( 1 9 7 6 , 9 , 1 9 )
, F a l s e )
Lalu bagaimana kalau kita ingin melihat nilai b erdasarkan nama #eld-nya
63
1 >>> q = d b . e x e u t e ( s q l )
2 >>> f o r r i n q :
4 . . .
5 1 Bummi D w i P u t e r a
6 2 A r i e f S e t i a d i
7 3 C e e p Z a h r u d i n
8 4 N i t a P a n d r i a
1 >>> q = d b . e x e u t e ( s q l )
2 >>> f o r r i n q :
3 . . . p r i n t r . i d , r . nama
4 . . .
5 1 Bummi D w i P u t e r a
6 2 A r i e f S e t i a d i
7 3 C e e p Z a h r u d i n
8 4 N i t a P a n d r i a
Mudah bukan ?
Fungsi exeute() bisa juga digunakan untuk p erintah query lainnya sep erti
INSERT, UPDATE, dan DELETE. Contohnya mengganti huruf pada #eld nama
dengan kapital.
2 >>> d b . e x e u t e ( s q l )
3 < s q l a l h e m y . e n g i n e . b a s e . R e s u l t P r o x y o b j e t a
t 0 x b 7 4 8 a 9 a >
5 >>> q = d b . e x e u t e ( s q l )
6 >>> f o r r i n q :
7 . . . p r i n t r . nama
8 . . .
10 ARIEF SETIADI
11 CECEP ZAHRUDIN
12 NITA PANDRIA
Anda memiliki data p egawai dalam sebuah #le yang b erformat CSV yang isinya
2 2 ; ARIEF SETIADI ; 1 9 7 2 − 0 5 − 0 2 ; t
3 3 ; CECEP ZAHRUDIN; 1 9 7 2 − 0 6 − 0 1 ; t
5 5 ; ILHAM ; 1 9 8 4 − 1 1 − 0 5 ; t
File ini menerminkan tab el p egawai dimana setiap #eld dipisahkan dengan
kolom p ertama, p ersis sep erti tab el p egawai. Tugasnya adalah menyalin isi #le
ini ke dalam tab el p egawai. Jika ID p egawai sudah ada maka lakukan UPDATE,
Mari kita lihat terlebih dahulu isi tab el p egawai melalui psql.
1 $ p s q l − U i l h a m − h l o a l h o s t t o t a l i n d o
2 P a s s w o r d f o r u s e r i l h a m :
3 p s q l ( 8 . 4 . 4 )
5 T y p e " h e l p " f o r h e l p .
8 i d | nama | t g l _ l a h i r | p r i a
11 2 | ARIEF SETIADI | 1 9 7 2 − 0 5 − 0 2 | t
12 3 | CECEP ZAHRUDIN | 1 9 7 2 − 0 6 − 0 1 | t
13 4 | NITA PANDRIA | 1 9 7 6 − 0 9 − 1 9 | f
14 ( 4 r o w s )
nanti adalah:
HAM.
Buatlah #le p egawai.sv terlebih dahulu dengan isi sep erti di atas. Kemudian
buatlah #le up datep egawai.py.
1 i m p o r t s q l a l h e m y a s s a
3 u r l = ' p o s t g r e s q l : / / i l h a m : 1 2 3 4 # l o a l h o s t / t o
t a l i n d o '
4 d b = s a . r e a t e _ e n g i n e ( u r l )
5 d b . o n n e t ( )
7 f i l e n a m e = ' p e g a w a i . s v '
8 f = o p e n ( f i l e n a m e )
9 f o r l i n e i n f . r e a d l i n e s ( ) :
10 p i d , nama , t g l _ l a h i r , p r i a = l i n e . s t r i p ( ) . s p l i t
( ' ; ' )
11 p i d = i n t ( p i d )
12 p r i a = p r i a == ' t ' # A g a r b o o l e a n T r u e / F a l s e
14 q = d b . e x e u t e ( s q l )
15 i f q . r o w o u n t :
19 " p r i a = %s " + \
20 "WHERE i d = %d "
21 s q l = s q l % ( nama , t g l _ l a h i r , p r i a , p i d )
22 e l s e :
27 d b . e x e u t e ( s q l )
Jalankan.
1 $ p y t h o n u p d a t e p e g a w a i . p y
2 i d | nama | t g l _ l a h i r | p r i a
5 2 | ARIEF SETIADI | 1 9 7 2 − 0 5 − 0 2 | t
6 3 | CECEP ZAHRUDIN | 1 9 7 2 − 0 6 − 0 1 | t
7 4 | NITA PANDRIA | 1 9 7 6 − 0 9 − 1 9 | f
8 5 | ILHAM | 1 9 8 4 − 1 1 − 0 5 | t
9 ( 5 r o w s )
up datep egawai.py tergolong sulit dibaa, dan ini bisa menyulitkan debugging
1 $ s u d o a p t − g e t i n s t a l l p y t h o n − e l i x i r
Agar proses UPDATE dan INSERT masih terasa, buatlah p erubahan pada
2 2 ; ARIEF SETIADI ; 1 9 7 2 − 0 5 − 0 2 ; t
3 3 ; CECEP ZAHRUDIN , ST ; 1 9 7 2 − 0 6 − 0 1 ; t
4 4 ; NITA PANDRIA ; 1 9 7 6 − 0 9 − 1 9 ; f
5 5 ; ILHAM ; 1 9 8 4 − 1 1 − 0 5 ; t
6 6 ; MIRANDA ; 1 9 7 8 − 1 0 − 0 1 ; f
Perubahannya adalah UPDATE pada CECEP ZAHRUDIN menjadi CE-
CEP ZAHRUDIN, ST, dan INSERT pada MIRANDA. Selanjutnya buat #le
up datep egawai1.py.
1 f r o m e l i x i r i m p o r t E n t i t y , u s i n g _ o p t i o n s , s e t u
p _ a l l ,
m e t a d a t a , \
2 s e s s i o n
4 l a s s P e g a w a i ( E n t i t y ) :
5 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p e g a w a i ' , a u t o l o a
d =T r u e )
7 m e t a d a t a . b i n d = ' p o s t g r e s : / / i l h a m : 1 2 3 4 # l o a
l h o s t /
t o t a l i n d o '
8 s e t u p _ a l l ( )
10 f i l e n a m e = ' p e g a w a i . s v '
11 f = o p e n ( f i l e n a m e )
12 f o r l i n e i n f . r e a d l i n e s ( ) :
13 p i d , nama , t g l _ l a h i r , p r i a = l i n e . s t r i p ( ) . s p l i t
( ' ; ' )
14 p i d = i n t ( p i d )
15 p = P e g a w a i . q u e r y . f i l t e r _ b y ( i d =p i d )
16 i f p . o u n t ( ) :
17 r = p . o n e ( )
18 e l s e :
19 r = P e g a w a i ( )
20 r . i d = p i d
21 r . nama = nama
22 r . t g l _ l a h i r = t g l _ l a h i r
23 r . p r i a = p r i a == ' t '
24 s e s s i o n . o m m i t ( )
Jalankanlah.
1 $ p y t h o n u p d a t e p e g a w a i 1 . p y
2 i d | nama | t g l _ l a h i r | p r i a
5 2 | ARIEF SETIADI | 1 9 7 2 − 0 5 − 0 2 | t
6 3 | CECEP ZAHRUDIN , ST | 1 9 7 2 − 0 6 − 0 1 | t
7 4 | NITA PANDRIA | 1 9 7 6 − 0 9 − 1 9 | f
8 5 | ILHAM | 1 9 8 4 − 1 1 − 0 5 | t
9 6 | MIRANDA | 1 9 7 8 − 1 0 − 0 1 | f
10 ( 6 r o w s )
Hasil sudah sesuai harapan dengan soure yang jauh lebih mudah dibaa.
Lalu bagaimana menghapus salah satu reord ? Buatlah #le deletep egawai.py
b erikut ini.
1 f r o m e l i x i r i m p o r t E n t i t y , u s i n g _ o p t i o n s , m e t a
d a t a ,
s e t u p _ a l l , \
2 s e s s i o n
3 i m p o r t s y s
5 l a s s P e g a w a i ( E n t i t y ) :
6 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p e g a w a i ' , a u t o l o a
d =T r u e )
7
8 i f n o t s y s . a r g v [ 1 : ℄ :
10
11 t r y :
12 p i d = i n t ( s y s . a r g v [ 1 ℄ )
13 e x e p t V a l u e E r r o r :
14 s y s . e x i t ( ' I D p e g a w a i h a r u s a n g k a ' )
15
16 m e t a d a t a . b i n d = ' p o s t g r e s : / / i l h a m : 1 2 3 4 # l o a
l h o s t /
t o t a l i n d o '
17 s e t u p _ a l l ( )
18
19 p = P e g a w a i . q u e r y . f i l t e r _ b y ( i d = p i d )
20 i f n o t p . o u n t ( ) :
21 s y s . e x i t ( ' I D p e g a w a i %d t i d a k a d a ' % p i d )
22
23 r = p . o n e ( )
24 r . d e l e t e ( )
25 s e s s i o n . o m m i t ( )
26 p r i n t ' I D p e g a w a i %d s u d a h d i h a p u s ' % p i d
yaitu b erupa ID p egawai yang akan dihapus. Kita oba menghapus ID p egawai
4 NITA PANDRIA.
1 $ p y t h o n d e l e t e _ p e g a w a i . p y 4
2 I D p e g a w a i 4 s u d a h d i h a p u s
2 i d | nama | t g l _ l a h i r | p r i a
5 2 | ARIEF SETIADI | 1 9 7 2 − 0 5 − 0 2 | t
6 3 | CECEP ZAHRUDIN , ST | 1 9 7 2 − 0 6 − 0 1 | t
7 5 | ILHAM | 1 9 8 4 − 1 1 − 0 5 | t
8 6 | MIRANDA | 1 9 7 8 − 1 0 − 0 1 | f
9 ( 5 r o w s )
yang sama artinya dengan WHERE. Kini kita tampilkan semua reord tab el p e-
gawai tanpa kondisi apapun yaitu mengganti #lter_by() dengan all(). Buatlah
seletp egawai.py.
1 f r o m e l i x i r i m p o r t E n t i t y , u s i n g _ o p t i o n s , m e t a
d a t a ,
s e t u p _ a l l
2 i m p o r t s y s
4 l a s s P e g a w a i ( E n t i t y ) :
5 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p e g a w a i ' , a u t o l o a
d =T r u e )
7 m e t a d a t a . b i n d = ' p o s t g r e s : / / i l h a m : 1 2 3 4 # l o a
l h o s t /
t o t a l i n d o '
8 s e t u p _ a l l ( )
10 f o r r i n P e g a w a i . q u e r y . a l l ( ) :
11 p r i n t r . i d , r . nama , r . t g l _ l a h i r , r . p r i a
Jalankan.
$ python selet_pegawai.py
Butuh tampilan yang urut b erdasarkan nama ? Kita biasa menggunakan OR-
all().
1 f r o m e l i x i r i m p o r t E n t i t y , u s i n g _ o p t i o n s , m e t a
d a t a ,
s e t u p _ a l l
2 i m p o r t s y s
4 l a s s P e g a w a i ( E n t i t y ) :
5 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p e g a w a i ' , a u t o l o a
d =T r u e )
7 m e t a d a t a . b i n d = ' p o s t g r e s : / / i l h a m : 1 2 3 4 # l o a
l h o s t /
t o t a l i n d o '
8 s e t u p _ a l l ( )
11 p r i n t r . i d , r . nama , r . t g l _ l a h i r , r . p r i a
Jalankan.
1 $ p y t h o n s e l e t _ p e g a w a i . p y
2 2 ARIEF SETIADI 1 9 7 2 − 0 5 − 0 2 T r u e
5 5 ILHAM 1 9 8 4 − 1 1 − 0 5 T r u e
6 6 MIRANDA 1 9 7 8 − 1 0 − 0 1 F a l s e
1 f r o m e l i x i r i m p o r t *
2 i m p o r t s y s
4 l a s s P e g a w a i ( E n t i t y ) :
5 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p e g a w a i ' , a u t o l o a
d =T r u e )
7 m e t a d a t a . b i n d = ' p o s t g r e s : / / i l h a m : 1 2 3 4 # l o a
l h o s t /
t o t a l i n d o '
8 s e t u p _ a l l ( )
10 j e n i s = { T r u e : ' P r i a ' ,
11 F a l s e : ' W a n i t a ' }
12
14 f o r r i n p :
15 p r i n t s t r ( r . i d ) . e n t e r ( 3 ) , \
16 r . nama . l j u s t ( 2 0 ) , \
17 r . t g l _ l a h i r , \
18 j e n i s [ r . p r i a ℄
Jalankan.
1 $ p y t h o n s e l e t _ p e g a w a i . p y
2 2 ARIEF SETIADI 1 9 7 2 − 0 5 − 0 2 P r i a
5 5 ILHAM 1 9 8 4 − 1 1 − 0 5 P r i a
6 6 MIRANDA 1 9 7 8 − 1 0 − 0 1 W a n i t a
Elixir vs SQLAlhemy ?
python-elixir.
1 $ d p k g − s p y t h o n − e l i x i r
2 P a k a g e : p y t h o n − e l i x i r
3 V e r s i o n : 0 . 7 . 1 − 1
4 D e p e n d s : p y t h o n (>= 2 . 4 ) , p y t h o n − s u p p o r t (>= 0 . 9 0
. 0 ) ,
p y t h o n − s q l a l h e m y (>= 0 . 4 . 0 )
5 D e s r i p t i o n : D e l a r a t i v e M a p p e r f o r S Q L A l h e m y
Masih ingat fungsi sql b ernama transaksi() ? Kali ini akan kita buat transaksi
1 i m p o r t s q l a l h e m y a s s a
2 i m p o r t s y s
4 u r l = ' p o s t g r e s q l : / / i l h a m : 1 2 3 4 # l o a l h o s t / t o
t a l i n d o '
5 d b = s a . r e a t e _ e n g i n e ( u r l )
7 p r i n t ' T r a n s a k s i '
8 p i d = r a w _ i n p u t ( ' I D p e g a w a i : ' )
9 t r y :
10 p i d = i n t ( p i d )
11 e x e p t V a l u e E r r o r :
12 s y s . e x i t ( ' I D p e g a w a i %s t i d a k b e n a r ' % p i d )
13
15 q = d b . e x e u t e ( s q l )
16 i f n o t q . r o w o u n t :
17 s y s . e x i t ( ' I D p e g a w a i %d t i d a k a d a ' % p i d )
19
20 k e t = r a w _ i n p u t ( ' K e t e r a n g a n : ' )
21 i f n o t k e t :
22 s y s . e x i t ( ' K e t e r a n g a n h a r u s d i i s i ' )
23
24 n o m i n a l = r a w _ i n p u t ( ' N o m i n a l : ' )
25 t r y :
26 n o m i n a l = f l o a t ( n o m i n a l )
27 e x e p t V a l u e E r r o r :
28 s y s . e x i t ( ' N o m i n a l %s t i d a k b e n a r ' % n o m i n a
l )
29
n o m i n a l )
31 q = d b . e x e u t e ( s q l )
32 p r i n t ' T r a n s a k s i b e r h a s i l , I D ' , q . f e t h o n e (
) . t r a n s a k s i
Jalankan.
1 $ p y t h o n t r a n s a k s i . p y
2 T r a n s a k s i
3 I D p e g a w a i : 3
6 N o m i n a l : 4 5 0 0 0 0 0
7 T r a n s a k s i b e r h a s i l , I D 4
2 i d | p i d | t g l | k e t | n o m i n a l | s a l d o
4 1 | 1 | 2 0 1 0 − 1 0 − 2 2 | GAJI 1 1 − 2 0 1 0 | 3 0 0 0 0 0 0 | 3 0 0 0 0 0 0
5 2 | 1 | 2 0 1 0 − 1 0 − 2 2 | BON | − 2 0 0 0 0 0 | 2 8 0 0 0 0 0
6 3 | 5 | 2 0 1 0 − 1 0 − 2 2 | GAJI 1 1 − 2 0 1 0 | 1 5 0 0 0 0 0 | 1 5 0 0 0 0 0
7 ( 3 r o w s )
transaksi( ... ). Sep erti kita ketahui BEGIN tanpa COMMIT sama artinya den-
gan ROLLBACK. Itu artinya semua akti#tas DML sep erti INSERT, UPDATE,
1 i m p o r t s q l a l h e m y a s s a
2 f r o m s q l a l h e m y . s q l . e x p r e s s i o n i m p o r t t e x t
3 i m p o r t s y s
5 u r l = ' p o s t g r e s q l : / / i l h a m : 1 2 3 4 # l o a l h o s t / t o
t a l i n d o '
6 d b = s a . r e a t e _ e n g i n e ( u r l )
7
8 p r i n t ' T r a n s a k s i '
9 p i d = r a w _ i n p u t ( ' I D p e g a w a i : ' )
10 t r y :
11 p i d = i n t ( p i d )
12 e x e p t V a l u e E r r o r :
13 s y s . e x i t ( ' I D p e g a w a i %s t i d a k b e n a r ' % p i d )
14
16 q = d b . e x e u t e ( s q l )
17 i f n o t q . r o w o u n t :
18 s y s . e x i t ( ' I D p e g a w a i %d t i d a k a d a ' % p i d )
20
21 k e t = r a w _ i n p u t ( ' K e t e r a n g a n : ' )
22 i f n o t k e t :
23 s y s . e x i t ( ' K e t e r a n g a n h a r u s d i i s i ' )
24
25 n o m i n a l = r a w _ i n p u t ( ' N o m i n a l : ' )
26 t r y :
27 n o m i n a l = f l o a t ( n o m i n a l )
28 e x e p t V a l u e E r r o r :
29 s y s . e x i t ( ' N o m i n a l %s t i d a k b e n a r ' % n o m i n a
l )
30
n o m i n a l )
32 q = d b . e x e u t e ( t e x t ( s q l , a u t o o m m i t=T r u e ) )
33 p r i n t ' T r a n s a k s i b e r h a s i l , I D ' , q . f e t h o n e (
) . t r a n s a k s i
Penambahan pada baris 2:
q = db.exeute(sql)
menjadi
q = db.exeute(text(sql, autoommit=True))
8.3 Synhronizer
Pelanggan Anda memiliki usaha di bidang mini market dan telah memiliki b e-
b erapa outlet. Semua outlet itu telah terhubung ke Internet. Internet digunakan
untuk mengambil data pro duk yang dikirim kantor pusat melalui email. Data
Restore yang telah disediakan di aplikasi. Begitu juga dengan data transak-
si. Data disimpan terlebih dahulu ke dalam sebuah #le melalui menu Bakup.
Teknik ini sudah baik, namun lebih baik lagi jika p ekerjaan itu dilakukan
oleh waktu, misalkan jam 9:00 dan jam 17:00 setiap harinya. Berb eda dengan
let dapat mengakses database pusat. IP publik ini dapat dip esan ke ISP (In-
Kon#gurasi ini artinya semua host dapat mengakses database pusat, tentunya
2 * R e s t a r t i n g P o s t g r e S Q L 8 . 4 d a t a b a s e s e r v e r
1 $ p s q l − U i l h a m − h 1 1 0 . 1 3 7 . 1 2 0 . 2 5 1 t o t a l i n d o
url = 'postgresql://ilham:1234#110.137.120.251/totalindo'
Mudah bukan ?
Tapi nanti dulu. Meski outlet itu hanya mendapat akses terbatas di database
pusat, namun tetap sa ja ini masih menimbulkan resiko keamanan data. Alangkah
Dengan kata lain pusat-lah yang membaa database outlet, sedangkan outlet
Lalu bagaimana host pusat mengakses host outlet ? Apa p erlu p esan IP
Idealnya ya, namun tidak harus. Kita bisa menerapkan VPN alias Virtual
Private Network. Cukup pasang VPN server di pusat, dan pasang VPN lient
di outlet. Dengan VPN ini terb entuk jaringan baru dengan IP pusat 10.8.0.1,
sedangkan IP outlet 10.8.0.6, 10.8.0.10, 10.8.0.14, dst. Baik VPN server maupun
VPN lient bisa kita gunakan Op enVPN. Untuk p emasangan keduanya silahkan
http://jabber.rab.o.id/os/konfigurasi-openvpn
Ya, untungnya Op enVPN tersedia di untuk sistem op erasi itu, dan tetap
1 $ i f o n f i g t u n 0
2 t u n 0 L i n k e n a p : UNSPEC HWaddr
0 0 − 0 0 − 0 0 − 0 0 − 00 −0 0 − 00 − 00 −0 0 − 00 −00 − 00 − 00 −0 0 − 00 − 00
3 i n e t a d d r : 1 0 . 8 . 0 . 6 P − t − P : 1 0 . 8 . 0 . 5 M a s k
: 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5
: 1 5 0 0 M e t r i : 1
5 RX p a k e t s : 0 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
f r a m e : 0
6 TX p a k e t s : 6 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
a r r i e r : 0
7 o l l i s i o n s : 0 t x q u e u e l e n : 1 0 0
8 RX b y t e s : 0 ( 0 . 0 B ) TX b y t e s : 9 6 3 ( 9 6 3 . 0 B )
biasanya 10.8.0.1. Di host pusat, Anda juga bisa lihat IP masing-masing lient di
Op enVPN telah terpasang dan kedua host pusat dan outlet sudah bisa saling
di outlet .
1 $ s u d o s e r v i e p o s t g r e s q l − 8 . 4 r e s t a r t
2 * R e s t a r t i n g P o s t g r e S Q L 8 . 4 d a t a b a s e s e r v e r
1 $ p s q l − U i l h a m − h 1 0 . 8 . 0 . 6 t o t a l i n d o
1 r e a t e t a b l e p r o d u k (
2 i d s e r i a l p r i m a r y k e y ,
3 nama n a m e n o t n u l l u n i q u e ,
4 h a r g a f l o a t n o t n u l l
5 ) ;
, 1 0 5 0 0 ;
, 9 2 5 0 ;
, 1 4 3 0 0 ;
Untuk menyamakan data pro duk, kita memerlukan dua p erulangan (lo op).
Yang p ertama untuk INSERT dan UPDATE, sedangkan yang kedua untuk
1 i m p o r t s q l a l h e m y a s s a
2 f r o m e l i x i r i m p o r t E n t i t y , u s i n g _ o p t i o n s , s e t u
p _ a l l ,
m e t a d a t a
3 f r o m s q l a l h e m y . o r m i m p o r t s o p e d _ s e s s i o n , s e s
s i o n m a k e r
4 f r o m s q l a l h e m y . s h e m a i m p o r t T h r e a d L o a l M e t a
D a t a
7 e s = s a . r e a t e _ e n g i n e ( ' p o s t g r e s q l : / / i l h a m : 1
2 3 4 # l o a l h o s t /
t o t a l i n d o ' )
8 e t = s a . r e a t e _ e n g i n e ( ' p o s t g r e s q l : / / i l h a m : 1
2 3 4 # l o a l h o s t /
t o t a l i n d o 2 ' )
10 s s = s o p e d _ s e s s i o n ( s e s s i o n m a k e r ( b i n d= e s ) )
11 s t = s o p e d _ s e s s i o n ( s e s s i o n m a k e r ( b i n d= e t ) )
12
13 ms = m e t a d a t a
14 mt = T h r e a d L o a l M e t a D a t a ( )
15
16 ms . b i n d = e s
17 mt . b i n d = e t
18
19
20 l a s s P r o d u k S ( E n t i t y ) :
21 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p r o d u k ' , a u t o l o a
d =T r u e ,
m e t a d a t a =ms , s e s s i o n = s s )
22
23 l a s s P r o d u k T ( E n t i t y ) :
24 u s i n g _ o p t i o n s ( t a b l e n a m e = ' p r o d u k ' , a u t o l o a
d =T r u e ,
m e t a d a t a =mt , s e s s i o n = s t )
25
26 s e t u p _ a l l ( )
27
29
30 a l l _ p s = [ ℄
31 f o r p s i n P r o d u k S . q u e r y . a l l ( ) :
32 p r i n t p s . i d , p s . nama , p s . h a r g a ,
33 t r y :
34 p t = P r o d u k T . q u e r y . f i l t e r _ b y ( i d =p s . i d ) . o n e (
)
35 p r i n t ' d i u b a h '
36 e x e p t s a . o r m . e x . N o R e s u l t F o u n d , e :
37 p r i n t ' d i t a m b a h '
38 p t = P r o d u k T ( i d =p s . i d )
39 p t . nama = p s . nama
40 p t . h a r g a = p s . h a r g a
41 s t . o m m i t ( )
42 a l l _ p s . a p p e n d ( p s . i d )
43
44 # DELETE
45
46 f o r p t i n P r o d u k T . q u e r y . a l l ( ) :
47 i f p t . i d n o t i n a l l _ p s :
49 p t . d e l e t e ( )
50 s t . o m m i t ( )
BAB 8. PYTHON AKSES DATABASE 78
Anda sudah memiliki aplikasi yang menggunakan MySQL, dan kini ingin b eralih
1 $ s u d o a p t − g e t i n s t a l l p y t h o n − m y s q l d b
1 i m p o r t s q l a l h e m y a s s a
2 f r o m s q l a l h e m y . s h e m a i m p o r t T h r e a d L o a l M e t a
D a t a
3 f r o m s q l a l h e m y . o r m i m p o r t s o p e d _ s e s s i o n , s e s
s i o n m a k e r
4 f r o m e l i x i r i m p o r t *
5 i m p o r t s y s
8 d b s = s a . r e a t e _ e n g i n e ( s y s . a r g v [ 1 ℄ ) # s o u r e
9 d b t = s a . r e a t e _ e n g i n e ( s y s . a r g v [ 2 ℄ ) # t a r g e t
10 d b s . o n n e t ( )
11 d b t . o n n e t ( )
12 s e s s i o n _ s = s o p e d _ s e s s i o n ( s e s s i o n m a k e r ( b i n
d=d b s ) )
13 s e s s i o n _ t = s o p e d _ s e s s i o n ( s e s s i o n m a k e r ( b i n
d=d b t ) )
14 m e t a d a t a _ s = m e t a d a t a
15 m e t a d a t a _ t = T h r e a d L o a l M e t a D a t a ( )
16 m e t a d a t a _ s . b i n d = d b s
17 m e t a d a t a _ t . b i n d = d b t
18
19 f o r t a b l e n a m e i n d b s . t a b l e _ n a m e s ( ) :
20 l a s s S o u r e ( E n t i t y ) :
21 u s i n g _ o p t i o n s ( t a b l e n a m e =t a b l e n a m e , a u t o l o a
d =T r u e ,
22 m e t a d a t a=m e t a d a t a _ s , s e s s i o n = s e s s i o n _ s )
23
24 s e t u p _ a l l ( )
25
26 l a s s T a r g e t ( E n t i t y ) :
27 u s i n g _ o p t i o n s ( t a b l e n a m e =t a b l e n a m e ,
28 m e t a d a t a=m e t a d a t a _ t , s e s s i o n = s e s s i o n _ t )
29 f o r o l u m n i n S o u r e . m a p p e r . o l u m n s :
30 h a s _ f i e l d ( o l u m n . n a m e , o l u m n . t y p e ,
31 p r i m a r y _ k e y= o l u m n . p r i m a r y _ k e y ,
32 r e q u i r e d = n o t o l u m n . n u l l a b l e ,
33 )
34
35 s e t u p _ a l l ( T r u e )
36
Database Paket
PostgreSQL python-psyopg2
MySQL python-mysqldb
SQLite python-sqlite2
Interbase python-kinterbasdb
MS SQL python-pymssql
37 f o r s o u r e i n S o u r e . q u e r y . a l l ( ) :
38 t a r g e t = T a r g e t ( )
39 t a r g e t . f r o m _ d i t ( s o u r e . t o _ d i t ( ) )
40 s e s s i o n _ t . o m m i t ( )
Contoh p enggunaan:
1 p y t h o n d b m i g r a t i o n . p y m y s q l : / / r o o t : 6 7 8 9 # l o
a l h o s t / s u m b e r
p o s t g r e s : / / j e f r i : 1 2 3 4 # l o a l h o s t / t a r g e t
Untuk driver database lainnya Anda bisa lihat di informasi paket python-
1 $ d p k g − s p y t h o n − s q l a l h e m y
2 . .
3 S u g g e s t s : p y t h o n − s q l a l h e m y − d o , p y t h o n − p s y
o p g 2 , p y t h o n −
m y s q l d b (>= 1 . 2 . 1 − p 2 − 2 ) , p y t h o n (>= 2 . 5 ) | p y t h o n −
p y s q l i t e 2 (>= 2 . 3 . 0 − 1 ) | p y t h o n − p y s q l i t e 1 . 1 (>=
1 . 1 . 7 − 2 ) | p y t h o n − s q l i t e (>= 1 . 0 . 1 − 5 ) , p y t h o n −
k i n t e r b a s d b (>= 3 . 1 . 2 − 0 . 3 ) , p y t h o n − p y m s s q l
4 . .
Bab 9
Lintas Sistem
Kita telah membahas mengenai manfaat mo dularitas dalam fungsi dan mo dul
dimana sebuah aplikasi disusun bagaikan sebuah lego. Jika keseluruhan sistem
semakin kompleks maka hindari #konsep p emaksaan# sep erti #semua harus dit-
ulis dengan Python# atau #semua harus menggunakan PostgreSQL#. Kali ini kita
oba pahami bagaimana komunikasi antar sistem bisa terjadi tanpa p emaksaan
platform tertentu.
IP-nya. Anda tidak tahu mo dul apa yang bisa digunakan. Namun Anda tahu
1 $ i f o n f i g
2 e t h 0 L i n k e n a p : E t h e r n e t HWaddr 0 0 : 2 5 : b 3 : 7 7 : 3 e : 9
9
3 i n e t a d d r : 1 9 2 . 1 6 8 . 1 1 . 1 1 1 B a s t : 1 9 2 . 1 6 8 . 1 1 . 2
5 5
M a s k : 2 5 5 . 2 5 5 . 2 5 5 . 0
5 RX p a k e t s : 0 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
f r a m e : 0
6 TX p a k e t s : 0 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
a r r i e r : 0
7 o l l i s i o n s : 0 t x q u e u e l e n : 1 0 0 0
8 RX b y t e s : 0 ( 0 . 0 B ) TX b y t e s : 0 ( 0 . 0 B )
9 I n t e r r u p t : 1 7
10
11 l o L i n k e n a p : L o a l L o o p b a k
12 i n e t a d d r : 1 2 7 . 0 . 0 . 1 M a s k : 2 5 5 . 0 . 0 . 0
13 i n e t 6 a d d r : : : 1 / 1 2 8 S o p e : H o s t
80
15 RX p a k e t s : 5 6 2 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
f r a m e : 0
16 TX p a k e t s : 5 6 2 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
a r r i e r : 0
17 o l l i s i o n s : 0 t x q u e u e l e n : 0
18 RX b y t e s : 5 4 0 8 4 8 ( 5 4 0 . 8 KB ) TX b y t e s : 5 4 0 8 4 8
( 5 4 0 . 8 KB )
19
20 w l a n 0 L i n k e n a p : E t h e r n e t HWaddr 0 0 : 1 f : 3 : e 0 : 6 6 :
5 6
21 i n e t a d d r : 1 9 2 . 1 6 8 . 1 . 4 B a s t : 1 9 2 . 1 6 8 . 1 . 2 5 5
M a s k : 2 5 5 . 2 5 5 . 2 5 5 . 0
22 i n e t 6 a d d r : f e 8 0 : : 2 1 f : 3 f f : f e e 0 : 6 6 5 6 / 6 4 S o p
e :
L i n k
M e t r i : 1
24 RX p a k e t s : 3 2 1 9 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
f r a m e : 0
25 TX p a k e t s : 3 6 0 8 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0
a r r i e r : 0
26 o l l i s i o n s : 0 t x q u e u e l e n : 1 0 0 0
27 RX b y t e s : 1 5 8 6 2 9 7 ( 1 . 5 MB) TX b y t e s : 7 6 1 1 7 3
( 7 6 1 . 1 KB )
1 i m p o r t o m m a n d s
2 i m p o r t r e
4 d e f n e t d e v ( ) :
5 r = { }
6 f o r l i n e i n o m m a n d s . g e t o u t p u t ( ' i f o n f i g ' ) . s p
l i t l i n e s
( ) :
7 l i n e = l i n e . s t r i p ( )
8 m a t h = r e . o m p i l e ( ' ( . * ) L i n k e n a p ( . * ) ' ) . s e a
r h (
l i n e )
9 i f m a t h :
10 d e v i e = m a t h . g r o u p ( 1 ) . s t r i p ( )
11 r [ d e v i e ℄ = { }
12 m a t h = r e . o m p i l e ( ' HWaddr ( . * ) ' ) . s e a r h ( l i n e
13 i f m a t h :
14 r [ d e v i e ℄ [ ' a d d r ' ℄ = m a t h . g r o u p ( 1 )
15 o n t i n u e
16 m a t h = r e . o m p i l e ( ' i n e t a d d r : ( . * ) ' ) . s e a r h (
l i n e )
17 i f m a t h :
18 r [ d e v i e ℄ [ ' i p ' ℄ = m a t h . g r o u p ( 1 ) . s p l i t ( ) [ 0 ℄
19 r e t u r n r
20
21
23 n d = n e t d e v ( )
24 f o r d e v i n n d :
25 p r i n t d e v , n d [ d e v ℄
Jalankan.
1 $ p y t h o n n e t d e v . p y
: 9 9 ' }
Lintas sistem yang menggunakan ommand line ini tergolong lokal, artinya
9.2 File
File bisa digunakan sebagai sarana p emersatu input dan output. Misalkan An-
da sudah membuat sebuah daemon yang dapat menerima dan mengirim SMS.
Daemon ini p engendali mo dem. Oh ya, daemon adalah program yang selalu
hidup untuk siap menerima p erintah.
Di sisi lain Anda juga punya program p enerjemah SMS yang masuk (SMS
Anda bisa menggunakan #le sebagai p erantara. Saat ada SMS masuk, dae-
mon p engendali mo dem menyimpannya dalam sebuah #le di direktori /var/sp o ol/-
#lenya, dan membalas SMS tersebut dengan ara membuat #le di direktori
/var/sp o ol/mo dem/outb ox. File tersebut dibaa oleh daemon si mo dem untuk
Baik daemon mo dem maupun SMS parser bisa ditulis dengan bahasa yang
b erb eda. Mungkin yang p ertama dengan C++, sementara yang satunya di tulis
Ini juga tergolong lintas sistem yang lokal, keduanya harus di komputer yang
sama.
Dengan teknik NFS atau Samba Anda bisa membuat direktori b ersama
9.3 Database
Pelanggan Anda telah memiliki sebuah sistem p engisian pulsa dimana terdapat
fungsi yang b erkaitan dengan GSM mo dem. Fungsi yang dimaksud adalah yang
hasa Pasal) dan menggunakan database MySQL. Ia mengeluh pada Anda se-
laku develop er outsouring dimana komp onen SMS gateway yang dibangun-
nya tidak stabil. Di sisi lain Anda telah membuat SMS gateway yang ditulis
dengan bahasa Python dan database PostgreSQL. Tidak sep erti yang dimiliki
p elanggan tersebut, SMS gateway yang Anda buat sangat stabil dan telah teruji
Mirosoft Windows.
Langkah apa yang diambil untuk membuat SMS gateway-nya stabil ? An-
memaksa p elanggan Anda itu untuk b ela jar Python dan membangun ulang
Langkah yang bijaksana tentu tidak keduanya, karena p orsi tidak seimbang
akan sebuah komputer lagi untuk SMS gateway Anda, sebut sa ja server SMS
gateway. Server ini terhubung melalui LAN (lo al area network) dengan server
Ranangan SMS gateway yang Anda buat harus dapat mengirim SMS hanya
Lalu apa yang dilakukan oleh p elanggan Anda tadi ? Ia p erlu mengubah
untuk komp onen p engisian pulsa tetap b erlaku. Jadi dalam aplikasi Borland
Delphi terdapat dua koneksi database, yaitu ke MySQL yang ada di lo alhost
Lalu bagaimana untuk membaa SMS yang masuk ? Kembali, Anda diminta
untuk menyimpan SMS yang masuk ke dalam sebuah tab el, katakanlah b ernama
Lintas sistem ini tergolong bisa b eda komputer, karena baik PostgreSQL
9.4 XMLRPC
Database sebagai p erantara bisa jadi ditolak dengan b erbagai alasan. Salah
satunya adalah asp ek tanggung jawab, atau biasa disebut asp ek keamanan (se-
urity). Misalkan dalam sistem p erbankan. Sistem utama sebuah bank diban-
gun oleh PT Software Aman Banget (SAB). Namanya juga sistem utama, ia
Suatu saat bank ini ingin go Internet dimana nasabah dapat melakukan
transaksi melalui browser Firefox. Berarti dibutuhkan web develop er dan dip-
bangkan Internet banking, b erarti ada proses login untuk nasabah. Ini b erarti
menjadi masalah karena username dan password web bisa b erada di web server
melakukan SELECT tab el ke sistem utama bank tersebut yang dibangun oleh
SAB ?
tahui username dan password untuk login ke database sistem utama. Kalau
sudah b egitu maka WP bisa melihat-lihat data nasabah lainnya, bahkan meli-
hat tab el-tab el yang menyangkut sistem. Jelas ini sudah terlalu jauh dan bisa
XMLRPC adalah XML Remote Pro edure Call, yaitu sebuah #bahasa# p er-
tukaran data yang ditulis dalam format XML. Kita dapat memandang RPC
sebagai p emanggilan fungsi yang memiliki nilai masukan (input parameter) dan
1 d e f t a m b a h ( a , b ) :
2 r e t u r n a + b
XMLRPC bisa juga disebut sebagai web servie karena dokumen XML
Karena web servie, maka kita biara koneksi lient - server, sehingga ada
simple dan pustakanya (library) banyak tersedia untuk b erbagai bahasa sep erti
SAB menggunakan PostgreSQL. Namun semuanya itu tidak lagi menjadi hal.
yang b erisi fungsi mutasi(). Mari kita mulai membuat #le serverbank.py.
1 f r o m S i m p l e X M L R P C S e r v e r i m p o r t S i m p l e X M L R P C S
e r v e r
2 i m p o r t s q l a l h e m y a s s a
5 l a s s S e r v e r ( S i m p l e X M L R P C S e r v e r ) :
6 a l l o w _ r e u s e _ a d d r e s s = T r u e
8 d e f v e r i f y _ r e q u e s t ( s e l f , r e q u e s t , l i e n t _ a d d
r e s s ) :
9 s e r v e r . i p _ l i e n t = l i e n t _ a d d r e s s [ 0 ℄
10 p r i n t s e r v e r . i p _ l i e n t
12
13
14 d e f r e s p ( o d e , m s g ) :
15 r e t u r n { ' k o d e ' : o d e ,
16 ' p e s a n ' : m s g }
17
18
19 l a s s A g e n t :
20 d e f _ d i s p a t h ( s e l f , m e t h o d , p a r a m s = ( ) ) :
21 p r i n t m e t h o d , p a r a m s
22 t r y :
23 f u n = g e t a t t r ( s e l f , ' e x p o r t _ ' + m e t h o d )
24 e x e p t A t t r i b u t e E r r o r :
25 r e t u r n r e s p ( − 1 , ' F u n g s i %s t i d a k d i k e n a l ' %
m e t h o d )
26 r e t u r n f u n ( * p a r a m s )
27
28 d e f e x p o r t _ m u t a s i ( s e l f , p ) :
29 s q l = "SELECT t g l : : d a t e , k e t , n o m i n a l , s a l d o
" +
32 "ORDER BY i d "
34 q = d b . e x e u t e ( s q l )
35 m = [ ℄
36 f o r r i n q :
37 m . a p p e n d ( [ s t r ( r . t g l ) , r . k e t , r . n o m i n a l , r .
s a l d o ℄ )
38 r = r e s p ( 0 , 'OK ' )
39 r [ ' m u t a s i ' ℄ = m
40 r e t u r n r
41
42
43
44 u r l = ' p o s t g r e s q l : / / i l h a m : 1 2 3 4 # l o a l h o s t / t o
t a l i n d o '
45 d b = s a . r e a t e _ e n g i n e ( u r l )
46
47 p o r t = 9 3 0 3
48 s e r v e r = S e r v e r ( ( ' 0 . 0 . 0 . 0 ' , p o r t ) )
49 s e r v e r . r e g i s t e r _ i n t r o s p e t i o n _ f u n t i o n s ( )
50 s e r v e r . r e g i s t e r _ i n s t a n e ( A g e n t ( ) )
52 s e r v e r . s e r v e _ f o r e v e r ( )
Jalankan.
1 $ p y t h o n s e r v e r b a n k . p y
2 HTTP XMLRPC s e r v e r p o r t 9 3 0 3
Proses seolah hang, tapi seb enarnya ia sedang menunggu p ermintaan (re-
quest) dari XMLRPC lient. Port 9303 hanya ontoh sa ja dimana Anda bisa
1 i m p o r t x m l r p l i b
2
3 u r l = ' h t t p : / / 1 2 7 . 0 . 0 . 1 : 9 3 0 3 '
4 r e m o t e = x m l r p l i b . S e r v e r P r o x y ( u r l )
5 d = { ' p i d ' : 1 ,
8 r = r e m o t e . m u t a s i ( d )
9 i f r [ ' k o d e ' ℄ == 0 :
10 f o r t g l , k e t , n o m i n a l , s a l d o i n r [ ' m u t a s i ' ℄ :
11 p r i n t t g l , k e t . l j u s t ( 1 5 ) , \
12 s t r ( i n t ( n o m i n a l ) ) . r j u s t ( 1 0 ) , \
13 s t r ( i n t ( s a l d o ) ) . r j u s t ( 1 0 )
14 e l s e :
15 p r i n t r [ ' p e s a n ' ℄
1 $ p y t h o n l i e n t b a n k . p y
2 2 0 1 0 − 1 0 − 2 2 GAJI 1 1 − 2 0 1 0 3 0 0 0 0 0 0 3 0 0 0 0 0 0
3 2 0 1 0 − 1 0 − 2 2 BON − 2 0 0 0 0 0 2 8 0 0 0 0 0
Cermati baik-baik konsepnya. Juga p erhatikan tip e data ditionary dan list
yang digunakan sebagai nilai keluaran (return value) dari fungsi mutasi.
xmlrp -2.2.2.tar.gz. Carilah. Versi lain sep ertinya juga tidak masalah. Lalu
1 <? p h p
2 i n l u d e ( ' x m l r p . i n ' ) ;
3 $ p a r a m s = n e w x m l r p v a l (
4 a r r a y (
8 ) ,
9 ' s t r u t '
10 ) ;
11 $ f = n e w x m l r p m s g ( ' m u t a s i ' , a r r a y ( $ p a r a m s ) ) ;
13 $ r = $ − >s e n d ( $ f ) ;
14 $ v = $ r − > v a l u e ( ) ;
15 i f ( $ r − > f a u l t C o d e ( ) ) {
16 p r i n t $ r − > f a u l t S t r i n g ( ) ;
17 } e l s e {
18 $ r e s p = $ r − > s a l a r v a l ( ) ;
21 $ f = $m − > s a l a r v a l ( ) ;
22 $ t g l = $ f [ 0 ℄ − > s a l a r v a l ( ) ;
23 $ k e t = $ f [ 0 ℄ − > s a l a r v a l ( ) ;
24 $ n o m i n a l = $ f [ 0 ℄ − > s a l a r v a l ( ) ;
25 $ s a l d o = $ f [ 0 ℄ − > s a l a r v a l ( ) ;
26 p r i n t $ t g l . " " .
27 s t r _ p a d ( $ k e t , 2 0 ) . " " .
28 s t r _ p a d ( $ n o m i n a l , 1 0 ) . " " .
29 s t r _ p a d ( $ s a l d o , 1 0 ) . " \ n " ;
30 }
31 } e l s e {
32 p r i n t $ r e s p [ ' p e s a n ' ℄ − > s a l a r v a l ( ) ;
33 }
34 }
35 ?>
Karena sript ini akan kita jalankan sebagai ommand line, maka pasang
1 $ s u d o a p t − g e t i n s t a l l p h p 5 − l i
Lalu jalankan.
1 $ p h p l i e n t _ b a n k . p h p
2 2 0 1 0 − 1 0 − 2 2 GAJI 1 1 − 2 0 1 0 3 0 0 0 0 0 0 3 0 0 0 0 0 0
3 2 0 1 0 − 1 0 − 2 2 BON − 2 0 0 0 0 0 2 8 0 0 0 0 0
9.4.2 Drupal
Drupal
1
Anda tidak p erlu memasang mo dul tambahan. Cara p enulisannya juga lebih
1 <? p h p
2 f u n t i o n p e g a w a i _ m e n u ( ) {
3 $ i t e m s = a r r a y ( ) ;
10 ) ;
11 r e t u r n $ i t e m s ;
12 }
13
14 f u n t i o n p e g a w a i _ t r x ( $ p i d , $ a w a l , $ a k h i r ) {
15 $ u r l = ' h t t p : / / 1 2 7 . 0 . 0 . 1 : 9 3 0 3 ' ;
19 $ r = x m l r p ( $ u r l , ' m u t a s i ' , $ p ) ;
20 i f ( ! $ r [ ' m u t a s i ' ℄ ) {
21 r e t u r n d r u p a l _ s e t _ m e s s a g e ( ' T i d a k a d a d a t a
' ) ;
22 }
26 $ t g l = $ f [ 0 ℄ ;
http://drupal.org
27 $ k e t = $ f [ 1 ℄ ;
28 $ n o m i n a l = $ f [ 2 ℄ ;
29 $ s a l d o = $ f [ 3 ℄ ;
35 }
36 r e t u r n $ ;
37 }
38 ?>
1 n a m e = P e g a w a i
2 d e s r i p t i o n = D a t a p e g a w a i
3 o r e = 6 . x
4 v e r s i o n = " 6 . x − 1 . 0 "
mo dul p egawai dan klik Save. Lalu masukkan URL di browser sep erti
pegawai/trx/1/20101022/20101023
Bab 10
Pengemasan
Pada bab seb elumnya kita sudah membuat mo dul uang.py. Agar mo dul ini dap-
pakages. Proses opy mo dul sep erti ini memang sudah mudah, tapi ada lagi
yang lebih memudahkan, yaitu dengan mengemasnya dalam b entuk paket De-
bian.
yang b erisi
deb http://192.168.0.1/deb ./
dibutuhkan oleh paket utama, sering disebut sebagai dep endenies . Misalkan
1 $ s u d o a p t − g e t i n s t a l l p y t h o n − u a n g
uang.py adalah mo dul Python yang umum. Dengan kata lain bisa
sana. Juga tidak ada p erintah akses database sep erti SELECT dkk.
Awalan ini juga meniru dari paket umum lainnya sep erti python-
90
1 $ s u d o m k d i r − p / u s r / l o a l / s r / p y t h o n − u a n g /DEBIAN
1. /usr/lo al/sr/python-uang
2. /usr/lo al/sr/python-uang/DEBIAN
p ostinst sript yang dijalankan saat p emasangan b erlangsung, yaitu saat apt-
get install atau dpkg -i. Sript ini harus exeutable yang bisa diset dengan
hmo d 755.
prerm sript yang dijalankan saat p enghapusan b erlangsung, yaitu saat apt-
get remove atau dpkg -r. Sript ini juga harus exeutable.
on#les b erisi daftar nama #le kon#gurasi yang digunakan paket ini. Misalnya
b erisi /et/uang.onf. File kon#gurasi ini b erisi format negara yang di-
gunakan oleh fungsi uang(). Jadi tidak hard-o de menggunakan lo ale
alkan kini python-uang versi 0.1. Kemudian dibuatlah versi 0.2 yang juga
1 P a k a g e : p y t h o n − u a n g
2 P r i o r i t y : o p t i o n a l
3 S e t i o n : p y t h o n
5 A r h i t e t u r e : a l l
6 V e r s i o n : 0 . 1
7 D e p e n d s : p y t h o n − e n t r a l (>= 0 . 6 . 7 )
8 P y t h o n − V e r s i o n : a l l
9 D e s r i p t i o n : F o r m a t u a n g
1 $ d / u s r / l o a l / s r
2 $ s u d o m k d i r − p p y t h o n − u a n g / u s r / s h a r e / p y e n t r
a l / p y t h o n −
u a n g / s i t e −p a k a g e s
takkan uang.py di /usr/lo al ? Direktori /usr/lo al yang kita gunakan seb elum-
nya b ermakna bahwa uang.py b elum menjadi bagian dari paket Debian. Bila
sudah menjadi bagian dari paket Debian, maka diletakkan di /usr/share. Begi-
1 $ s u d o p / u s r / l o a l / l i b / p y t h o n 2 . 6 / d i s t −p a k a g
e s / u a n g . p y
p y t h o n − u a n g / u s r / s h a r e / p y e n t r a l / p y t h o n − u a n
g / s i t e −
p a k a g e s /
1 i m p o r t l o a l e
2 f r o m C o n f i g P a r s e r i m p o r t C o n f i g P a r s e r
4 o n f = C o n f i g P a r s e r ( )
5 o n f . r e a d ( ' / e t / u a n g . o n f ' )
7 l o a l e . s e t l o a l e ( l o a l e . LC_ALL, o n f . g e t ( ' d e f a u
l t ' , '
l o a l e ' ) )
10
11
12 d e f u a n g ( n i l a i , p e a h a n=N o n e ) :
13 i f p e a h a n i s N o n e :
14 i f t y p e ( n i l a i ) == t y p e ( 0 ) :
15 p e a h a n = 0
16 e l s e :
17 p e a h a n = DECIMAL
19
20
22 n = 1 0 0 0 0 . 5
23 p r i n t u a n g ( n )
24 p r i n t u a n g ( i n t ( n ) )
25 p r i n t u a n g ( n , 3 )
1 $ s u d o m k d i r − p p y t h o n − u a n g / e t
1 [ d e f a u l t ℄
2 l o a l e = i d _ I D . UTF − 8
3 d e i m a l = 2
1 / e t / u a n g . o n f
1 # ! / b i n / s h
2 p y e n t r a l p k g i n s t a l l p y t h o n − u a n g
Juga python-uang/DEBIAN/prerm.
1 # ! / b i n / s h
2 p y e n t r a l p k g r e m o v e p y t h o n − u a n g
1 $ s u d o h m o d 7 5 5 p y t h o n − u a n g /DEBIAN / p o s t i n s t
2 $ s u d o h m o d 7 5 5 p y t h o n − u a n g /DEBIAN / p r e r m
1 $ s u d o h o w n − R r o o t . r o o t p y t h o n − u a n g
1 $ f i n d p y t h o n − u a n g
2 p y t h o n − u a n g /
3 p y t h o n − u a n g /DEBIAN
4 p y t h o n − u a n g /DEBIAN / o n t r o l
5 p y t h o n − u a n g /DEBIAN / p r e r m
6 p y t h o n − u a n g /DEBIAN / o n f f i l e s
7 p y t h o n − u a n g /DEBIAN / p o s t i n s t
8 p y t h o n − u a n g / u s r
9 p y t h o n − u a n g / u s r / s h a r e
10 p y t h o n − u a n g / u s r / s h a r e / p y e n t r a l
11 p y t h o n − u a n g / u s r / s h a r e / p y e n t r a l / p y t h o n − u a
n g
12 p y t h o n − u a n g / u s r / s h a r e / p y e n t r a l / p y t h o n − u a
n g / s i t e − p a k a g e s
13 p y t h o n − u a n g / u s r / s h a r e / p y e n t r a l / p y t h o n − u a
n g / s i t e − p a k a g e s
/ u a n g . p y
14 p y t h o n − u a n g / e t
15 p y t h o n − u a n g / e t / u a n g . o n f
Kemas.
1 $ s u d o d p k g − d e b −− b u i l d p y t h o n − u a n g .
2 d p k g − d e b : p e r i n g a t a n : ' p y t h o n − u a n g /DEBIAN / o n t
r o l '
o n t a i n s u s e r − d e f i n e d f i e l d ' P y t h o n − V e r s i o n '
3 d p k g − d e b : m e m b u a t p a k e t ` p y t h o n − u a n g ' d i d a l a m
` . / p y t h o n −
u a n g _ 0 . 1 _ a l l . d e b ' .
4 d p k g − d e b : p e r i n g a t a n : i g n o r i n g 1 w a r n i n g s a b o u
t t h e
o n t r o l f i l e ( s )
Debian, tapi digunakan oleh pyentral. Sampai di sini p embuatan paket selesai.
1 $ s u d o d p k g − i p y t h o n − u a n g _ 0 . 1 _ a l l . d e b
2 M e m i l i h p a k e t p y t h o n − u a n g y a n g s e b e l u m n y a t i d a
k d i p i l i h .
3 ( S e d a n g m e m b a a b a s i s d a t a . . . 2 1 3 4 5 8 b e r k a s d a n
d i r e k t o r i
t e l a h t e r p a s a n g . )
4 S e d a n g membuka p a k e t p y t h o n − u a n g ( d a r i p y t h o n − u a n
g _ 0 . 1
_ a l l . d e b ) . . .
5 S e d a n g m e n y e t e l p y t h o n − u a n g ( 0 . 1 ) . . .
6 P r o e s s i n g t r i g g e r s f o r p y t h o n − e n t r a l . . .
Untuk menghindari keranuan karena ada dua mo dul uang yang terpasang,
1 $ s u d o mv / u s r / l o a l / l i b / p y t h o n 2 . 6 / d i s t −p a k a g
e s / u a n g . p y
/ tmp
1 $ p y t h o n
2 P y t h o n 2 . 6 . 5 ( r 2 6 5 : 7 9 0 6 3 , A p r 1 6 2 0 1 0 , 1 3 : 0 9 : 5 6
)
3 [ GCC 4 . 4 . 3 ℄ o n l i n u x 2
5 >>> f r o m u a n g i m p o r t u a n g
6 >>> u a n g ( 1 0 0 0 0 )
7 ' 1 0 . 0 0 0 '
1 $ s u d o a p t − g e t r e m o v e p y t h o n − u a n g
2 S e d a n g m e m b a a d a f t a r p a k e t . . . S e l e s a i
3 Membangun p o h o n k e t e r g a n t u n g a n
4 Membaa i n f o r m a s i y a n g t e r s e d i a . . . S e l e s a i
5 P a k e t b e r i k u t a k a n DIHAPUS :
6 p y t h o n − u a n g
7 0 d i m u t a k h i r k a n , 0 b a r u t e r i n s t a l , 1 a k a n d i h a p u
s d a n 1 9 2
t i d a k a k a n d i m u t a k h i r k a n .
8 S e t e l a h o p e r a s i i n i , 0B r u a n g k o s o n g h a r d d i s k a k
a n
d i g u n a k a n .
9 A n d a i n g i n m e l a n j u t k a n [ Y/ t ℄ ?
10 ( S e d a n g m e m b a a b a s i s d a t a . . . 2 1 3 4 6 0 b e r k a s d a n
d i r e k t o r i
t e l a h t e r p a s a n g . )
11 S e d a n g membuang p y t h o n − u a n g . . .
Kini saatnya membuat rep ository agar bisa di-apt-get dari komputer lain. Pasanglah
1 $ s u d o a p t − g e t i n s t a l l d p k g − d e v
1 $ s u d o m k d i r / v a r /www/ d e b
2 $ s u d o p / u s r / l o a l / s r / p y t h o n − u a n g _ 0 . 1 _ a l l .
d e b / v a r /www
/ d e b
1 rm − f P a k a g e s . g z
2 d p k g − s a n p a k a g e s −− a r h a l l . >/ d e v / n u l l > P a k a g
e s
3 g z i p −− b e s t P a k a g e s
1 $ d / v a r /www/ d e b
2 $ s u d o s h u p d a t e l i s t . s h
Akan terb entuk #le Pakages.gz. File inilah yang akan dibaa saat apt-get
up date.
Selanjutnya kita uji rep ository ini dengan membuat #le /et/apt/soures.list.d/
ustom.list.
1 d e b h t t p : / / 1 9 2 . 1 6 8 . 0 . 1 / d e b . /
1 $ s u d o a p t − g e t u p d a t e
1 $ s u d o a p t − g e t i n s t a l l p y t h o n − u a n g
yang dimaksud ke dalam sebuah #le ISO. Bukan hanya memasang, bahkan An-
1 $ s u d o a p t − g e t i n s t a l l s q u a s h f s − t o o l s m k i s o f s
Buat #le onf.
1 SOURCE=" / h o m e / s u g i a n a / U n d u h a n / b l a n k o n − 6 . 0 − d l
i v e − i 3 8 6 . i s o
"
2 TARGET=" b l a n k o n − 6 . 0 − d l i v e − s o h o − i 3 8 6 . i s o "
3 LABEL=" B l a n k O n 6 SOHO"
1 . . / o n f
2 m k d i r − p / tmp / d r o m / tmp / r o o t
3 m o u n t − o l o o p $SOURCE / tmp / d r o m
d r o m /
5 m o u n t − o l o o p − t s q u a s h f s / tmp / d r o m / a s p e r / f i l e
s y s t e m .
s q u a s h f s / tmp / r o o t
6 p − a / tmp / r o o t .
7 u m o u n t / tmp / r o o t
8 u m o u n t / tmp / d r o m
1 p / e t / r e s o l v . o n f r o o t / e t
2 h r o o t r o o t m o u n t − t p r o n o n e / p r o
3 h r o o t r o o t m o u n t − t s y s f s n o n e / s y s
4 h r o o t r o o t
5 rm − f r o o t / e t / r e s o l v . o n f
6 h r o o t r o o t a p t − g e t l e a n
7 h r o o t r o o t u m o u n t s y s
8 h r o o t r o o t u m o u n t p r o
BAB 10. PENGEMASAN 97
9 h r o o t r o o t rm − r f / tmp / * / r o o t / . b a s h _ h i s t o r y
10 rm − r f d r o m / p r o g r a m s
11 h m o d +w d r o m / a s p e r / f i l e s y s t e m . m a n i f e s t
12 h r o o t r o o t d p k g −q u e r y − W −−s h o w f o r m a t = ' $ { P a k a
g e } $ {
V e r s i o n } \ n ' > d r o m / a s p e r / f i l e s y s t e m . m a n i f e s
t
13 p d r o m / a s p e r / f i l e s y s t e m . m a n i f e s t d r o m / a s
p e r /
f i l e s y s t e m . m a n i f e s t −d e s k t o p
14 s e d − i e ' / u b i q u i t y / d ' d r o m / a s p e r / f i l e s y s t e
m . m a n i f e s t −
d e s k t o p
1 . . / o n f
2 rm − f d r o m / a s p e r / f i l e s y s t e m . s q u a s h f s
3 a w a l = ` d a t e `
4 m k s q u a s h f s r o o t d r o m / a s p e r / f i l e s y s t e m . s q u a
s h f s
5 d d r o m
i s o l i n u x . b i n − i s o l i n u x / b o o t . a t − n o − e m u l −b o o
t − b o o t −
l o a d − s i z e 4 − b o o t − i n f o − t a b l e − o . . / $TARGET .
8 e h o " A w a l $ a w a l "
9 e h o " A k h i r " ` d a t e `
sript kedua:
1 $ s u d o s h 2 − h r o o t . s h
Sript ini untuk masuk ke sistem Linux yang lain, yaitu ro ot diretory tadi.
1 r o o t # l a p t o p : / #
1 r o o t # l a p t o p : / # d / e t / a p t / s o u r e s . l i s t . d
2 r o o t # l a p t o p : / # w g e t h t t p : / / d e b i a n . r a b . o . i
d / r a b . l i s t
3 r o o t # l a p t o p : / # a p t − g e t u p d a t e
4 r o o t # l a p t o p : / # a p t − g e t i n s t a l l i n t e r n e t − s h a r
i n g d h p 3 −
s e r v e r s q u i d v i m
Kalau sudah selesai keluarlah dari hro ot dengan menekan Ctrl-D atau ketik
exit:
1 r o o t # l a p t o p : / # e x i t
2 e x i t
3 s u g i a n a # l a p t o p : ~ $
1 $ s u d o 3 − p a k . s h
1 P a r a l l e l m k s q u a s h f s : U s i n g 2 p r o e s s o r s
2 C r e a t i n g 4 . 0 f i l e s y s t e m o n d r o m / a s p e r / f i l e s y
s t e m .
s q u a s h f s , b l o k s i z e 1 3 1 0 7 2 .
3 [==========================| ℄ 1 5 0 6 3 / 8 4 2 5 8 17%
Terakhir sript akan memb erikan informasi ukuran iso yang dihasilkan b erikut
iso aslinya.
1 3 5 7 4 3 3 e x t e n t s w r i t t e n ( 6 9 8 MB)
2 A w a l S e n Agu 2 0 9 : 4 5 : 3 9 WIT 2 0 1 0
3 A k h i r S e n Agu 2 0 9 : 5 0 : 5 2 WIT 2 0 1 0
4 S o u r e 7 3 1 8 6 9 1 8 4
5 T a r g e t 7 3 2 0 2 2 7 8 4
Jika media yang Anda tuju nanti adalah CDROM, pastikan ukurannya
dibawah 700MB. Lebih mudahnya bandingkan dengan ukuran ISO aslinya. Pa-
da ontoh di atas terlihat ukuran Target masih lebih b esar dari Soure. Jika
masih terlalu b esar jalankan lagi sript kedua untuk menghapus paket yang tak
p erlu.
1 $ s u d o s h 2 − h r o o t . s h
1 $ s u d o s h 3 − p a k . s h
File ISO yang dihasilkan bisa Anda oba terlebih dahulu di VirtualBox
1
virtualb ox.org
Bab 11
Bab-bab seb elumnya kita memp ela jari bagaimana membuat aplikasi dalam lingkun-
fungsi raw_input() yang meminta masukan user dari konsole. Lingkungan yang
Kali ini kita masuk p emrograman b erbasis gra#s dimana mouse bisa digu-
nakan sebagai alat masukan untuk klik tomb ol, opy paste, dsb. Graphial Uset
Interfae (GUI) tidaklah wa jib di Python, ia hanya sebagai mo dul. Berb eda
dengan Visual Basi atau Borland Delphi yang mewa jibkan GUI.
Mo dul b erbasis GUI tidak hanya satu di Python, ada Qt, Wx, GTk, Tl, dst.
paketnya.
1 $ s u d o a p t − g e t i n s t a l l p y t h o n −q t 4
1 $ s u d o a p t − g e t i n s t a l l q t 4 − d o − h t m l
Sep erti biasa, mulailah dari yang sederhana, yaitu membuat aplikasi Hello
1 i m p o r t s y s
2 f r o m P y Q t 4 i m p o r t Q t
3 f r o m P y Q t 4 . Q t G u i i m p o r t *
5 l a s s FormUtama ( QMainWindow ) :
6 d e f _ _ i n i t _ _ ( s e l f ) :
7 QMainWindow . _ _ i n i t _ _ ( s e l f )
8 s e l f . s e t W i n d o w T i t l e ( ' H e l l o w o r l d ' )
10
99
11 a p p = Q t . Q A p p l i a t i o n ( s y s . a r g v )
12 f m = FormUtama ( )
13 f m . s h o w ( )
14 #a p p . e x e _ ( )
fm.show()
menjadi
fm.showMaximized()
ientasi ob jek (Ob jet Oriented Programming / OOP) diterapkan. Mari kita
Class bisa dianggap sebuah tip e data, diseja jarkan dengan tip e string, inte-
ger, #oat, list, ditionary, datetime, dst. Dengan demikian FormUtama meru-
lass FormUtama(QMainWindow):
Window. Itu artinya variab el dan fungsi yang dimiliki lass QMainWindow
juga dimiliki oleh lass FormUtama. Bahasa lainnya FormUtama mewarisi sifat
QMainWindow.
fm = FormUtama()
Itu adalah p emb entukan variab el fm yang b ertip e FormUtama. Disinilah fungsi
__init__() dipanggil.
lass. Namun di Python rasanya semua tip e data adalah lass. Mis-
alnya tip e string. Ia tidak hanya memuat data sep erti 'ab d' sa ja,
melainkan juga memuat fungsi sep erti replae(), rjust(), dst. Hal ini
Lalu apa itu self ? self adalah variab el yang mewakili FormUtama itu sendiri.
Setiap fungsi yang dimiliki oleh suatu lass setidaknya memiliki satu masukan
fm.show()
dimana kita tidak p ernah mende#nisikan fungsi show() di dalam lass FormU-
? Sep erti dijelaskan tadi, FormUtama mewarisi sifat QMainWindow, jadi fungsi
show() itu b erasal darinya. Fungsi ini digunakan untuk menampilkan form.
Lalu apa itu form ? Kotak Hello world itulah yang disebut form sep erti pada
gambar 11.1.
app = Qt.QAppliation(sys.argv)
terakhir
app.exe_()
tanpa lo op, alur langsung b erakhir. Form bisa banyak, tapi QAppliation ukup
satu sa ja.
Pahami lagi baik-baik konsep OOP ini agar semakin mudah untuk membuat
Mari kita buat form yang lebih lengkap. Form ini untuk memasukkan data
p egawai, terinspirasi dari tab el p egawai yang p ernah kita buat. Namun disini
1 i m p o r t s y s
2 f r o m P y Q t 4 i m p o r t Q t
3 f r o m P y Q t 4 . Q t G u i i m p o r t *
4 f r o m P y Q t 4 . Q t C o r e i m p o r t Q D a t e , SIGNAL
6 l a s s FormUtama ( QMainWindow ) :
7 d e f _ _ i n i t _ _ ( s e l f ) :
8 QMainWindow . _ _ i n i t _ _ ( s e l f )
9 s e l f . s e t W i n d o w T i t l e ( ' P e g a w a i ' )
10 s e l f . r e s i z e ( 5 5 0 , 5 5 0 )
11 s e l f . l a b e l N a m a = Q L a b e l ( s e l f )
12 s e l f . l a b e l A l a m a t = Q L a b e l ( s e l f )
13 s e l f . l a b e l T g l L a h i r = Q L a b e l ( s e l f )
14 s e l f . l a b e l J e n i s = Q L a b e l ( s e l f )
15 s e l f . e d i t N a m a = Q L i n e E d i t ( s e l f )
16 s e l f . e d i t A l a m a t = Q T e x t E d i t ( s e l f )
17 s e l f . e d i t T g l L a h i r = Q D a t e E d i t ( s e l f )
18 s e l f . e d i t J e n i s = QComboBox ( s e l f )
19 s e l f . b u t t o n S i m p a n = Q P u s h B u t t o n ( s e l f )
20 s e l f . l i s t P e g a w a i = Q T a b l e W i d g e t ( s e l f )
22 s e l f . l a b e l A l a m a t . s e t T e x t ( ' A l a m a t ' )
23 s e l f . l a b e l T g l L a h i r . s e t T e x t ( ' T g l L a h i r ' )
24 s e l f . l a b e l J e n i s . s e t T e x t ( ' J e n i s K e l a m i n ' )
25 s e l f . e d i t T g l L a h i r . s e t D i s p l a y F o r m a t ( ' d d − MM
− y y y y ' )
26 s e l f . e d i t T g l L a h i r . s e t D a t e ( Q D a t e ( 2 0 1 0 , 1 0 ,
2 3 ) )
28 s e l f . b u t t o n S i m p a n . s e t T e x t ( ' S i m p a n ' )
29 s e l f . l i s t P e g a w a i . s e t C o l u m n C o u n t ( 5 )
30 s e l f . l i s t P e g a w a i . s e t H o r i z o n t a l H e a d e r L a b e
l s ( [
31 ' I D ' , ' Nama ' , ' A l a m a t ' , ' T g l L a h i r ' , ' K e l a m i n '
℄ )
32 s e l f . l i s t P e g a w a i . s e t C o l u m n W i d t h ( 0 , 2 0 )
33 s e l f . l i s t P e g a w a i . s e t C o l u m n W i d t h ( 1 , 1 5 0 )
34 s e l f . e d i t N a m a . r e s i z e ( 2 0 0 , 3 0 )
35 s e l f . e d i t A l a m a t . r e s i z e ( 2 0 0 , 1 0 0 )
36 s e l f . l i s t P e g a w a i . r e s i z e ( 5 0 0 , 2 0 0 )
37 s e l f . l a b e l N a m a . m o v e ( 1 0 , 1 0 )
38 s e l f . l a b e l A l a m a t . m o v e ( 1 0 , 4 0 )
39 s e l f . l a b e l T g l L a h i r . m o v e ( 1 0 , 1 4 0 )
40 s e l f . l a b e l J e n i s . m o v e ( 1 0 , 1 7 0 )
41 s e l f . e d i t N a m a . m o v e ( 1 0 0 , 1 0 )
42 s e l f . e d i t A l a m a t . m o v e ( 1 0 0 , 4 0 )
43 s e l f . e d i t T g l L a h i r . m o v e ( 1 0 0 , 1 4 0 )
44 s e l f . e d i t J e n i s . m o v e ( 1 0 0 , 1 7 0 )
45 s e l f . b u t t o n S i m p a n . m o v e ( 1 0 0 , 2 0 0 )
46 s e l f . l i s t P e g a w a i . m o v e ( 1 0 , 3 0 0 )
47 s e l f . o n n e t ( s e l f . b u t t o n S i m p a n , SIGNAL ( ' l i k e
d ( )
' ) , s e l f . s i m p a n )
48
49 d e f s i m p a n ( s e l f ) :
50 r o w = s e l f . l i s t P e g a w a i . r o w C o u n t ( )
51 p i d = r o w+1
52 s e l f . l i s t P e g a w a i . s e t R o w C o u n t ( p i d )
53 s e l f . l i s t P e g a w a i . s e t I t e m ( r o w , 0 , Q T a b l e W i d
g e t I t e m (
s t r ( p i d ) ) )
54 s e l f . l i s t P e g a w a i . s e t I t e m ( r o w , 1 , Q T a b l e W i d
g e t I t e m (
s e l f . e d i t N a m a . t e x t ( ) ) )
55 s e l f . l i s t P e g a w a i . s e t I t e m ( r o w , 2 , Q T a b l e W i d
g e t I t e m (
s e l f . e d i t A l a m a t . t o P l a i n T e x t ( ) ) )
56 s e l f . l i s t P e g a w a i . s e t I t e m ( r o w , 3 , Q T a b l e W i d
g e t I t e m (
s e l f . e d i t T g l L a h i r . t e x t ( ) ) )
57 s e l f . l i s t P e g a w a i . s e t I t e m ( r o w , 4 , Q T a b l e W i d
g e t I t e m (
s e l f . e d i t J e n i s . u r r e n t T e x t ( ) ) )
58 s e l f . e d i t N a m a . l e a r ( )
59 s e l f . e d i t A l a m a t . l e a r ( )
60 s e l f . e d i t J e n i s . s e t C u r r e n t I n d e x ( 0 )
61 s e l f . e d i t N a m a . s e t F o u s ( )
62
63
64 a p p = Q t . Q A p p l i a t i o n ( s y s . a r g v )
65 f m = FormUtama ( )
66 f m . s h o w ( )
67 a p p . e x e _ ( )
Ya, ontoh kali ini menyertakan lass yang kerap digunakan. Berikut ini
QTextEdit Untuk memasukkan tulisan juga, tapi bisa lebih dari satu baris.
QPushButton Tomb ol yang bila di-klik menjalankan suatu fungsi. Dalam hal
Dari soure tersebut dan menganalisa tampilan form, rasanya Anda bisa mema-
Bab 12
Ob jet Oriented
Programming
Kita membuat fungsi dengan tujuan e#siensi soure, agar proses-proses yang
sama dapat diwakili dengan memanggil fungsi tertentu. Begitu juga pada p em-
Ada sebuah #le teks b ernama barang.txt dengan isi sep erti b erikut ini.
1 1 J e r u k 3 4 9 0 0 0
2 2 M a n g g a 8 0 0 0
3 3 P i s a n g 7 1 0 0 0 0
Pembuat #le itu memastikan data barang tersimpan dengan lebar kolom
ter, dan harga barang 8 karakter atau sisanya. Anda diminta memindahkan
data ini ke sebuah tab el di database. Mari mulai memp ertimbangkan langkah-
Andai sa ja kita bisa menggunakan split() yang bisa mengubah string menjadi
list, sehingga dengan mudah kolom p ertama ada ko de barang, kolom kedua
nama barang, dan seterusnya. Sayang sekali hal ini tidak dapat dilakukan.
Mengapa ?
Perhatikan baris Mangga dimana nilai stok kosong. Ini artinya kolom ketiga
menjadi harga barang. Tentu sa ja tidak konsisten dengan baris Jeruk dimana
kolom ketiga adalah stok. Idealnya p embuat #le itu mengubah programnya
agar kalau stok kosong dib eri angka 0. Namun p osisi kita sedang tidak bisa
memaksa.
auan. Sementara ini kita tidak p erlu terlalu jauh bagaimana struktur tab elnya.
Dari sudut pandang Python sa ja dulu, tip e data apa yang o ok untuk mewakili
#le ini. Untuk sementara anggap sa ja tip e data list yang sesuai karena ini
106
1 i m p o r t s y s
3 f i l e n a m e = s y s . a r g v [ 1 ℄
4 f = o p e n ( f i l e n a m e )
5 f o r l i n e i n f . r e a d l i n e s ( ) :
6 k o d e = l i n e [ : 3 ℄ . s t r i p ( )
7 nama = l i n e [ 3 : 3 + 1 0 ℄ . s t r i p ( )
8 s t o k = l i n e [ 3 + 1 0 : 3 + 1 0 + 2 ℄ . s t r i p ( )
9 h a r g a = l i n e [ 3 + 1 0 + 2 : ℄ . s t r i p ( )
10 p r i n t [ k o d e , nama , s t o k , h a r g a ℄
11 f . l o s e ( )
Jalankan.
1 $ p y t h o n b a r a n g 1 . p y b a r a n g . t x t
ab el ko de, nama, stok, dan harga. Namun barang1.py masih kurang mo dular
karena masukannya b erupa nama #le yang dib erikan melalui ommand line.
barang2.py b erikut.
1 d e f b a r a n g ( f i l e n a m e ) :
2 f = o p e n ( f i l e n a m e )
3 r o w s = [ ℄
4 f o r l i n e i n f . r e a d l i n e s ( ) :
5 k o d e = l i n e [ : 3 ℄ . s t r i p ( )
6 nama = l i n e [ 3 : 3 + 1 0 ℄ . s t r i p ( )
7 s t o k = l i n e [ 3 + 1 0 : 3 + 1 0 + 2 ℄ . s t r i p ( )
8 h a r g a = l i n e [ 3 + 1 0 + 2 : ℄ . s t r i p ( )
9 r o w = [ k o d e , nama , s t o k , h a r g a ℄
10 r o w s . a p p e n d ( r o w )
11 f . l o s e ( )
12 r e t u r n r o w s
13
14
16 i m p o r t s y s
17 f i l e n a m e = s y s . a r g v [ 1 ℄
18 f o r r o w i n b a r a n g ( f i l e n a m e ) :
19 p r i n t r o w
Jalankan.
1 $ p y t h o n b a r a n g 2 . p y b a r a n g . t x t
2 [ ' 1 ' , ' J e r u k ' , ' 3 4 ' , ' 9 0 0 0 ' ℄
Hasil tetap sama, namun kini sript tidak hanya mengandung fungsi tetapi
Sekarang asp ek generalitas, atau tingkat ke-umum-an fungsi, dimana lebar se-
tiap kolom sudah ditetapkan di dalam fungsi (hardo de). Bisakah ditingkatkan
generalitasnya ?
Kebutuhannya adalah ada #le lain selain barang.txt dengan lebar setiap
kolom b erb eda dengan barang.txt, namun sifatnya masih sama yaitu setiap
50, dan 20. Jadi bukan hanya lebar kolomnya b erb eda, jumlah kolomnya pun
b erb eda.
Karena sudah b ersifat umum sebaiknya nama fungsi dan nama #lenya pun
1 d e f f i x t a b l e ( f i l e n a m e , w i d t h s ) :
2 f = o p e n ( f i l e n a m e )
3 r o w s = [ ℄
4 f o r l i n e i n f . r e a d l i n e s ( ) :
5 a w a l = 0
6 r o w = [ ℄
7 f o r w i d t h i n w i d t h s :
8 a k h i r = a w a l + w i d t h
9 f i e l d = l i n e [ a w a l : a k h i r ℄ . s t r i p ( )
10 r o w . a p p e n d ( f i e l d )
11 a w a l = a k h i r
12 r o w s . a p p e n d ( r o w )
13 f . l o s e ( )
14 r e t u r n r o w s
15
16
18 i m p o r t s y s
19 f i l e n a m e = s y s . a r g v [ 1 ℄
20 f o r r o w i n f i x t a b l e ( f i l e n a m e , [ 3 , 1 0 , 2 , 8 ℄ ) :
21 p r i n t r o w
Jalankan.
1 $ p y t h o n f i x t a b l e . p y b a r a n g . t x t
Perhatikan lagi, hasil masih sama. Anda bisa uji dengan membuat p e-
gawai.txt.
2 2 ARIEF SETIADI 1 9 7 2 − 0 5 − 0 2L
3 3CECEP ZAHRUDIN , ST 1 9 7 2 − 0 6 − 0 1L
4 4NITA PANDRIA 1 9 7 6 − 0 9 − 1 9P
5 5ILHAM 1 9 8 4 − 1 1 − 0 5L
6 6MIRANDA 1 9 7 8 − 1 0 − 0 1P
1 f r o m f i x t a b l e i m p o r t f i x t a b l e
2 i m p o r t s y s
3
4 f i l e n a m e = s y s . a r g v [ 1 ℄
6 f o r r o w i n f i x t a b l e ( f i l e n a m e , [ 2 , 2 2 , 1 0 , 1 ℄ ) :
7 p r i n t r o w
Jalankan.
1 $ p y t h o n f i x p e g a w a i . p y p e g a w a i . t x t
2 [ ' 1 ' , 'BUMMI DWI PUTERA, ST ' , ' 1 9 8 5 − 0 8 − 1 7 ' , ' L ' ℄
3 [ ' 2 ' , ' ARIEF SETIADI ' , ' 1 9 7 2 − 0 5 − 0 2 ' , ' L ' ℄
4 [ ' 3 ' , ' CECEP ZAHRUDIN , ST ' , ' 1 9 7 2 − 0 6 − 0 1 ' , ' L ' ℄
5 [ ' 4 ' , ' NITA PANDRIA ' , ' 1 9 7 6 − 0 9 − 1 9 ' , ' P ' ℄
Lalu apa nilai yang o ok untuk stok Mangga yang tidak tertulis apapun alias
string hampa ? Apa tetap diisi sebagai string hampa ? Sebaiknya tidak, karena
kita akan menetapkan #eld stok b ertip e integer. Maka nilai yang o ok untuk
string hampa adalah None, alias ob jek hampa. Buatlah #le FixTableTyp e.py
b erikut ini.
1 f r o m t y p e s i m p o r t I n t T y p e , S t r i n g T y p e
3
4 d e f f i x t a b l e ( f i l e n a m e , f t y p e s ) :
5 f = o p e n ( f i l e n a m e )
6 r o w s = [ ℄
7 f o r l i n e i n f . r e a d l i n e s ( ) :
8 a w a l = 0
9 r o w = [ ℄
10 f o r w i d t h , f t y p e i n f t y p e s :
11 a k h i r = a w a l + w i d t h
12 f i e l d = l i n e [ a w a l : a k h i r ℄ . s t r i p ( )
13 i f n o t f i e l d :
14 f i e l d = N o n e
15 e l i f f t y p e == I n t T y p e :
16 f i e l d = i n t ( f i e l d )
17 r o w . a p p e n d ( f i e l d )
18 a w a l = a k h i r
19 r o w s . a p p e n d ( r o w )
20 f . l o s e ( )
21 r e t u r n r o w s
22
23
25 i m p o r t s y s
26 f i l e n a m e = s y s . a r g v [ 1 ℄
27 f i e l d s = [
28 [ 3 , I n t T y p e ℄ ,
29 [ 1 0 , S t r i n g T y p e ℄ ,
30 [ 2 , I n t T y p e ℄ ,
31 [ 8 , I n t T y p e ℄
32 ℄
BAB 12. OBJECT ORIENTED PROGRAMMING 111
33 f o r r o w i n f i x t a b l e ( f i l e n a m e , f i e l d s ) :
34 p r i n t r o w
Jalankan.
1 $ p y t h o n F i x T a b l e T y p e . p y b a r a n g . t x t
2 [ 1 , ' J e r u k ' , 3 4 , 9 0 0 0 ℄
3 [ 2 , ' M a n g g a ' , N o n e , 8 0 0 0 ℄
4 [ 3 , ' P i s a n g ' , 7 , 1 0 0 0 0 ℄
Perhatikan, tidak ada lagi kutip di kolom p ertama, ketiga, dan keempat.
buah #le sejenis, meski tidak harus ke barang.txt lagi. Fitur semakin b ertambah
dimana:
Tip e integer
Bab 13
Kerja Sampingan
GSM mo dem. Program ini b ersifat daemon yang artinya selalu b erjalan seolah
tanpa akhir. Tugas utamanya adalah mengirim SMS yang b erasal dari seluruh
#le yang ada di direktori /tmp/job. Hasil p engiriman SMS (b erhasil / tidak)
Mo dem tersebut hanya bisa mengirim sebuah SMS pada satu saat yang
membutuhkan waktu 10 detik. Di sisi lain daemon ini harus mengabari status
5 detik. Bahkan kalau terkena masalah bandwidth XMLRPC lient ini bisa
Saat Thread 1
Total waktu yang dibutuhkan untuk mengirim dua SMS adalah 30 detik.
dari single-thread. Bagi SMS gateway itu merupakan jeda yang ukup b erarti
1 f r o m t h r e a d i n g i m p o r t T h r e a d
112
2 i m p o r t t i m e
3 i m p o r t o s
4 f r o m g l o b i m p o r t g l o b
7 l a s s K i r i m ( T h r e a d ) :
8 d e f _ _ i n i t _ _ ( s e l f , k ) :
9 s e l f . k e r j a = T r u e
10 s e l f . k a b a r = k
11 T h r e a d . _ _ i n i t _ _ ( s e l f )
12
13 d e f r u n ( s e l f ) :
15 w h i l e s e l f . k e r j a :
16 t i m e . s l e e p ( 1 )
17 i f n o t s e l f . k a b a r :
18 o n t i n u e
19 h a s i l = s e l f . k a b a r [ 0 ℄
20 d e l s e l f . k a b a r [ 0 ℄
21 # s e l f . k a b a r = s e l f . k a b a r [ 1 : ℄
: % S ' ) , h a s i l )
23
24 d e f j o i n ( s e l f ) :
25 p r i n t ' K e r j a s a m p i n g a n b e r a k h i r '
26 s e l f . k e r j a = F a l s e
27 T h r e a d . j o i n ( s e l f )
28
29
31 k a b a r = [ ℄
32
33 s a m p i n g a n = K i r i m ( k a b a r )
34 s a m p i n g a n . s t a r t ( )
35
'
37 w h i l e T r u e :
38 t i m e . s l e e p ( 1 )
39 i f n o t o s . p a t h . e x i s t s ( j o b _ d i r ) :
40 o n t i n u e
41 f i l e n a m e s = g l o b ( '%s / * ' % j o b _ d i r )
42 i f n o t f i l e n a m e s :
43 o n t i n u e
44 f i l e n a m e = f i l e n a m e s [ 0 ℄
45 f = o p e n ( f i l e n a m e )
46 j o b = f . r e a d ( )
47 f . l o s e ( )
48 o s . r e m o v e ( f i l e n a m e )
j o b )
50 k a b a r . a p p e n d ( j o b )
51
52 p r i n t ' P e k e r j a a n u t a m a b e r a k h i r '
53 s a m p i n g a n . j o i n ( )
Jalankan.
1 $ p y t h o n t e s t t h r e a d . p y
2 0 4 : 5 6 : 5 4 P e k e r j a a n u t a m a d i m u l a i
3 0 4 : 5 6 : 5 4 K e r j a s a m p i n g a n d i m u l a i
1 $ m k d i r / tmp / j o b
1 $ e h o h e l l o > / tmp / j o b / h e l l o . t x t
1 0 4 : 5 6 : 5 6 KERJAKAN h e l l o
2 0 4 : 5 6 : 5 7 KABARI h e l l o
Pointer
Perlu dip erhatikan variab el kabar yang b ertip e list (baris 30). Ini adalah
vari-
ab el b ersama , artinya dapat diolah baik oleh thread 1 maupun thread 2. Di
sini b erlaku apa yang disebut p ointer yang artinya alokasi memori pada baris
30 dengan baris 10
1 s e l f . k a b a r = k
1 d e l s e l f . k a b a r [ 0 ℄
1 s e l f . k a b a r = s e l f . k a b a r [ 1 : ℄
Namun teknik ini akan membuat alokasi memori yang baru dimana thread 2
tidak lagi menggunakan variab el kabar sebagaimana yang digunakan oleh thread
1.
Bab 14
SMS Gateway
SMS Gateway adalah salah satu pro duk RAB yang memanfaatkan Python dan
ang semo dular mungkin agar mudah dipakai oleh sistem lainnya yang bukan
Pro duk ini juga menerapkan teknik event driven dan plug-in.
14.1 Pemasangan
1 $ s u d o a p t − g e t i n s t a l l i m − gw
#g.py. File ini p erlu diisi dengan otenti#kasi ke database yang sudah dibuat
tadi.
1 d b _ u r l = ' p o s t g r e s : / / i l h a m : 1 2 3 4 # l o a l h o s t : 5
4 3 2 / t o t a l i n d o '
Kemudian jalankan:
1 $ s u d o d p k g − r e o n f i g u r e i m − gw
Paket im-gw digunakan untuk hal yang b erkaitan dengan database sep erti
menyimpan dan mengirim p esan. Daemonnya bisa Anda stop dan start dengan
ara:
1 $ s u d o / e t / i n i t . d / i m − gw r e s t a r t
im-gw juga otomatis hidup saat komputer dihidupkan. Anda bisa memantau
1 $ s u d o t a i l − f / v a r / l o g / i m / gw . l o g
2 2 0 1 1 − 0 1 − 1 8 0 5 : 1 2 : 2 0 , 8 8 3 INFO S t a r t r e s u l t d i r / v
a r / s p o o l /
i m / r e s u l t /
3 2 0 1 1 − 0 1 − 1 8 0 5 : 1 2 : 2 0 , 8 8 6 INFO S t a r t j o b a t p i d 1 2 0
2
115
4 2 0 1 1 − 0 1 − 1 8 0 5 : 1 2 : 2 0 , 9 2 8 INFO S t a r t r e s u l t x m l r p
s e r v e r
o n p o r t 9 3 1 7
Tekan Ctrl-C untuk mengakhiri. Tapi sebaiknya tetap terpantau, dan Anda
Untuk mengirim dan menerima SMS yang seb enarnya dibutuhkan p engen-
dali mo dem:
1 $ s u d o a p t − g e t i n s t a l l i m − modem
Paket ini juga akan membuat tab el, menggunakan kon#gurasi yang sama
dengan im-gw.
Pasanglah mo dem GSM atau CDMA. Merk yang sudah teruji adalah Wave-
om, iTegno, dan Multiteh. USB devie lebih disarankan karena mendukung
1 $ p s a x | g r e p modem
2 5 6 2 7 ? SN 0 : 0 6 / u s r / b i n / p y t h o n / u s r / b i n / modem − h o
t p l u g
3 2 8 4 6 4 ? S l 0 : 0 1 p y t h o n / u s r / b i n / modem / d e v / t t y U S B
0
Perhatikan /usr/bin/mo dem-hotplug, dialah yang memantau aktivitas p e-
masangan p erangkat USB. Lalu ada juga /usr/bin/mo dem, daemon inilah yang
Anda pastikan dulu mo dem itu terpasang di serial p ort b erapa. Keb eradaan
1 $ d m e s g | g r e p t t y S
2 [ 2 5 . 9 7 2 1 9 7 ℄ s e r i a l 8 2 5 0 : t t y S 0 a t I /O 0 x 3 f 8 ( i r q
= 4 ) i s
a 1 6 5 5 0A
3 [ 2 5 . 9 7 3 1 4 1 ℄ 0 0 : 0 7 : t t y S 0 a t I /O 0 x 3 f 8 ( i r q = 4 ) i s
a
1 6 5 5 0A
4 [ 4 2 . 4 4 2 5 2 8 ℄ 0 0 0 0 : 0 5 : 0 1 . 0 : t t y S 4 a t I /O 0 x d 1 0 0
( i r q = 1 7 )
i s a 1 6 5 5 0A
5 [ 4 2 . 4 4 2 7 5 0 ℄ 0 0 0 0 : 0 5 : 0 1 . 0 : t t y S 5 a t I /O 0 x d 2 0 0
( i r q = 1 7 )
i s a 1 6 5 5 0A
6 [ 4 2 . 5 3 8 3 5 9 ℄ 0 0 0 0 : 0 5 : 0 2 . 0 : t t y S 6 a t I /O 0 x d 7 0 0
( i r q = 1 9 )
i s a 1 6 5 5 0A
7 [ 4 2 . 5 3 8 5 7 4 ℄ 0 0 0 0 : 0 5 : 0 2 . 0 : t t y S 7 a t I /O 0 x d 8 0 0
( i r q = 1 9 )
i s a 1 6 5 5 0A
Anda bisa menyebutkan semua serial p ort yang ada pada #le /et/im/-
mo dem/mo dem.onf:
1 [ d e v i e ℄
2 ; d e v i e d i / d e v / t t y
S 6 S 7
1 $ s u d o / e t / i n i t . d / modem r e s t a r t
1 $ p s a x | g r e p modem
2 1 1 2 1 1 ? R l 1 0 : 2 9 p y t h o n / u s r / b i n / modem / d e v /
t t y S 0
1 $ s u d o l s / v a r / l o g / modem
2 5 1 0 0 1 2 5 4 1 2 1 8 9 1 1 . l o g
1 $ s u d o t a i l − f / v a r / l o g / modem / 5 1 0 0 1 2 5 4 1 2 1 8 9 1 1 . l
o g − n 3 0
5 2 0 1 1 − 0 1 − 1 8 0 1 : 4 5 : 2 4 , 3 0 8 INFO < − OK
8 2 0 1 1 − 0 1 − 1 8 0 1 : 4 5 : 2 6 , 3 1 2 INFO < − OK
12 2 0 1 1 − 0 1 − 1 8 0 1 : 4 5 : 2 7 , 3 2 7 INFO < − OK
18 2 0 1 1 − 0 1 − 1 8 0 1 : 4 5 : 3 1 , 3 3 3 INFO < − OK
21 2 0 1 1 − 0 1 − 1 8 0 1 : 4 5 : 3 2 , 3 4 6 INFO < − OK
22 2 0 1 1 − 0 1 − 1 8 0 1 : 4 5 : 3 2 , 3 5 2 INFO S e r v i n g / d e v / t t y U
S B 1 a n d /
v a r / s p o o l / i m / j o b / modem / 5 1 0 0 1 2 5 4 1 2 1 8 9 1 1 / a t p i d
2 8 4 6 4
Bila Anda sudah b erjumpa kalimat yang b erawalan Serving sep erti di atas,
Lalu apa yang dimaksud dengan angka 510012541218911 pada nama #le log ?
Angka itu disebut dengan IMEI alias identitas hip / SIM ard. Jika kom-
manusia / user membutuhkan IMEI sebagai identitas hip yang ada di dalam
mo dem. Aktivitas menerima dan mengirim SMS tentu melekat pada hip, bukan
pada mo dem. Karena itu p enggunaan IMEI pada nama log adalah yang paling
Lagi pula devie p ort yang digunakan mo dem USB kadang b erubah. Saat
ini mungkin mo dem dikenali di USB0. Coba Anda lepas dan pasang lagi di
14.1.2 Database
disebut sebagai startup. Saat itulah im-gw memeriksa keb eradaan IMEI terse-
but di tab el im.agent. Kalau b elum ada ia tambahkan, dan kalau sudah ada ia
p erbaharui statusnya.
1 $ p s q l − U i l h a m − h l o a l h o s t t o t a l i n d o
2 P a s s w o r d f o r u s e r i l h a m :
3 p s q l ( 8 . 4 . 4 )
5 T y p e " h e l p " f o r h e l p .
7 i d | s t a t u s
8 −−−−−−−−−−−−−−−−− + −−−−−−−−
9 5 1 0 0 1 2 5 4 1 2 1 8 9 1 1 | 0
10 ( 1 r o w )
Status 0 b erarti mo dem siap, status negatif b erarti sebaliknya. Alasan untuk
3 INSERT 0 1
1 t o t a l i n d o => SELECT i d , s t a t u s , p e n g i r i m , p e n e r i m a
, p e s a n
3 i d | s t a t u s | p e n g i r i m | p e n e r i m a |
p e s a n
5 1 0 6 5 | 0 | 5 1 0 0 1 2 5 4 1 2 1 8 9 1 1 | + 6 2 8 1 7 9 1 4 0 0 6 8 | H e l l
o
w o r l d !
6 ( 1 r o w )
Diterima
1 t o t a l i n d o => SELECT i d , k i r i m , p e n g i r i m , p e n e r i m a ,
p e s a n
2 t o t a l i n d o − > FROM i m . a n t r i a n ;
3 i d | k i r i m | p e n g i r i m | p e n e r i m a | p e s a n
5 1 0 7 1 | f | + 6 2 8 1 7 9 1 4 0 0 6 8 | 5 1 0 0 1 2 5 4 1 2 1 8 9 1 1 |
D i t e r i m a
6 ( 1 r o w
digunakan, b egitu juga saat menerima p esan. Lalu apa p emb edanya ?
Perhatikan #eld kirim di atas. Jika #eld kirim = f (False), itu b erarti reord
Ada dua paket utama di sini, yaitu im-gw dan im-mo dem. Keduanya terhubung
sebagaimana pada gambar 14.1. Lalu mengapa harus ada dua paket ?
Meski judul tulisan ini adalah SMS Gateway, namun pada konsepnya sistem
ini dapat disanding dengan paket instant messenger sep erti Yaho o! Messenger
dan XMPP (Jabb er, GTalk). Keduanya ada di paket im-ym dan im-xmpp.
Jadi im-mo dem, im-ym, dan im-xmpp seja jar kedudukannya. Kalau im-mo dem
Internet.
Jadi bila Anda ingin menoba sistem ini namun b elum memiliki mo dem,
maka bisa gunakan im-ym dan im-xmpp.
Seb elum p emasangan, sebaiknya Anda siapkan Yaho o! aount yang baru yang
pasang paketnya.
1 $ s u d o a p t − g e t i n s t a l l i m − ym
1 $ p s a x | g r e p ym
2 2 3 3 9 ? S l 2 4 : 4 4 p y t h o n / u s r / b i n /ym i n f o r a b
1 $ s u d o t a i l − f / v a r / l o g /ym/ i n f o r a b . l o g
2 2 0 1 1 − 0 2 − 2 5 1 4 : 2 4 : 4 6 , 7 2 9 INFO S t a r t u p { ' s t a t u s
' : 0 }
Sekarang oba add buddy dari Yaho o! Messenger lient sep erti Pidgin. Ten-
1 2 0 1 1 − 0 2 − 2 5 1 5 : 1 0 : 4 3 , 8 8 5 INFO I n b o x { ' t g l _ o p e r a
t o r ' :
1 t o t a l i n d o => SELECT i d , k i r i m , j a l u r , p e n g i r i m , p e n
e r i m a ,
p e s a n
2 t o t a l i n d o − > FROM i m . a n t r i a n ;
3 i d | k i r i m | j a l u r | p e n g i r i m | p e n e r i m a | p e s a n
5 2 0 7 4 | f | 5 | i n f o _ r a b | i n f o r a b | h e l l o w o r l d
6 ( 1 r o w )
Sekarang p erhatikan kolom jalur yang b erisi 5. Itu artinya jalur ym. Sedan-
gkan jalur mo dem b erisi 1 (default). Daftar jalur ini ada di tab el jalur.
14.3.2 XMPP
Jika Anda punya aount di Gmail maka Anda dapat hatting dengan user
Gmail lainnya. Namun seb enarnya Anda dapat hatting dengan user dari server
lain yang menggunakan protokol XMPP sep erti jabb er.org atau jabb er.rab.o.id.
Ya, sep erti email, protokol XMPP memungkinkan user dari server b erb eda da-
1 $ s u d o a p t − g e t i n s t a l l i m − xmpp
1 u s e r s = { ' i n f o r a b # g m a i l . om ' :
4 }
Sesuaikan inforab dan 1234. Setelah disimpan tunggu satu menit hingga
daemon-nya up. Setelah hidup, Anda bisa lakukan p engujian yang serupa sep er-
ti ym.
Jika Anda ingin menggunakan server lokal, bisa oba daftar ke jabb er.rab.o.id
b erikut.
1 u s e r s = { ' i n f o r a b # g m a i l . om ' :
2 { ' p a s s w o r d ' : ' 1 2 3 4 ' , ' s a s l ' : T r u e ,
5 }
Ya, im-xmpp juga dapat menghidupkan lebih dari satu aount. Keb etulan
ontoh di atas.
14.4 Broadast
Anda telah memiliki banyak p elanggan dan ingin mengirim p esan yang sama
1 INSERT INTO i m . a n t r i a n ( p e n e r i m a , p e s a n )
Sayangnya untuk jumlah p enerima yang sangat banyak tidak bisa semudah
itu, karena /usr/bin/mo dem memiliki nilai job timeout yang default-nya 420 de-
tik alias 7 menit. Jika setiap p esan membutuhkan waktu 10 detik untuk dikirim,
maka hanya 42 p esan sa ja yang akan dikirim. Selebihnya akan dilap orkan oleh
Menaikkan nilai timeout di /et/im/mo dem/mo dem.onf bisa juga jadi so-
lusi, namun tidak disarankan. Teknik yang paling pas adalah menyiapkan dae-
mon baru yang memantau nilai #eld job. Jika job lebih b esar dari 5 maka tidak
1 $ s u d o a p t − g e t i n s t a l l i m − b r o a d a s t
Untuk mengirim p esan kita p erlu melakukan INSERT ke dua tab el, yaitu
gkan tab el kedua b erisi p enerimanya. Kedua tab el ini akan diproses oleh daemon
2 n e x t v a l
3 −−−−−−−−−
4 8
5 ( 1 r o w )
' ;
3 INSERT 0 1
Field judul hanya untuk keterangan sa ja. Field p esan-lah yang nanti akan
p e n e r i m a )
3 INSERT 0 1
Jalur default yang digunakan adalah 1 (mo dem). Untuk jalur lainnya ser-
, j a l u r )
3 INSERT 0 1
Bab 15
Web
15.1 Django
15.2 Webpy
124
Bab 16
Hosting
16.1 Virtualmin
Ingin b erbisnis web hosting ? Terb entur biaya untuk p engadaan CPanel ? Saat-
lain pangsa PHP ? Anda masih bisa mengubah kemampuan Virtualmin. Tidak
punya IP publik statik ? Hanya dapat IP publik dinamik ? Jangan ragu, tetap
gunakan Virtualmin.
dengan bisnis web hosting Anda. Ia memb erikan kemudahan dalam p endaf-
taran domain, p emb erian hak akses, dan juga kuota. Ia merupakan pro duk op en
soure yang mengatur b erbagai aplikasi standar lainnya sep erti Apahe, PHP,
likasi tersebut.
gunakan Ubuntu jenis LTS (Long Term Supp ort), sep erti Hardy (8.04) atau
Luid (10.04). Kali ini kita akan gunakan versi 10.04 dimana Anda bisa pilih
untuk prosesor 32 bit (i386) atau 64 bit (amd64). Paling aman gunakan i386,
tapi prosesor terbaru rata-rata sudah mendukung versi amd64, bahkan yang
Oh iya, ada lagi p engkategorian lainnya, yaitu versi desktop atau server. Jika
server sering b erada di depan Anda - misalkan server ada di rumah - sebaiknya
Namun jika server diletakkan nun jauh di sana, pilihlah versi server agar Anda
http://virtualmin.om
http://ubuntu.om
125
Amannya pilih yang mana ? Pilihlah Ubuntu 10.04 i386 Desktop Edition
4
ISO bisa di-burn ke CD-ROM 700 MB. Rata-rata motherb oard sekarang su-
dah mendukung b o ot melalui #ashdisk. Jadi ada baiknya burn ISO ke #ashdisk
menggunakan aplikasi Unetb o otin, tersedia untuk sistem op erasi Windows dan
Linux.
Sebaiknya pilihlah Bahasa Indonesia agar default format sesuai dengan Indone-
sia sep erti format tanggal (dmy), p emisah ribuan (thousand separator), dsb.
Setelah p emasangan selesai dan server sudah di-b o ot, ubahlah hak akses
pada home diretory Anda agar user lain tidak bisa melihat isinya.
Anda tidak p erlu melakukan ini jika membuat user baru melalui Virtualmin
nanti.
Untuk menetapkan IP, Anda bisa menggunakan menu System, Preferenes, Net-
work Connetions. Jika Anda tidak memasang GUI, bisa lakukan kon#gurasi
2 a d d r e s s 2 0 2 . 5 9 . 2 0 1 . 6 7
3 n e t m a s k 2 5 5 . 2 5 5 . 2 5 5 . 1 9 2
4 g a t e w a y 2 0 3 . 1 3 0 . 2 3 1 . 6 5
hidup. Kemudian ujilah dengan mengunjungi salah satu IP yang Anda kenal:
$ telnet 203.130.231.120 80
Jika Anda mendapati baris "Esap e harater is" b erarti gateway b erfungsi
dengan baik:
Trying 203.130.231.120...
Conneted to 203.130.231.120.
Oh iya, juga sesuaikan /et/resolv.onf agar Anda bisa memanggil dengan nama
(DNS), misalnya:
nameserver 203.130.231.120
i386.iso
$ telnet google.om 80
Trying 74.125.235.20...
Conneted to google.om.
Provider Anda.
memastikan IP LAN tetap statik. Bisa diset melalui menu tadi, atau melalui
$ wget http://software.virtualmin.om/gpl/sripts/install.sh
Lalu jalankan:
$ sudo sh install.sh
Saat ia menanyakan hostname, jawablah sesuai nama domain hosting yang Anda
kelola:
sabilawebhosting.om
ifon#g, interfae apa yang digunakan. Kalau terhubung dengan kab el biasanya
Tunggulah, ini memerlukan waktu b eb erapa lama. Jika b erhasil, p esan ter-
akhirnya adalah:
Virtualmin sedang di-restart. Tunggulah b eb erapa saat, dan jalankan lagi sript
$ sudo sh install.sh
Jika Anda menggunakan GUI, gedit bisa digunakan untuk text editor:
$ sudo gedit
Namun jika Anda terbiasa dengan konsole, vi dan nano sudah tersedia. Bagi
yang terbiasa dengan vi ada baiknya pasang vim (vi improved) untuk kenya-
manan:
ini untuk mengingat p osisi kursor pada #le yang p ernah Anda buka:
1 " U n o m m e n t t h e f o l l o w i n g t o h a v e Vim j u m p t o t h e l a
s t
p o s i t i o n w h e n
2 " r e o p e n i n g a f i l e
3 i f h a s ( " a u t o m d " )
5 e n d i f
1 " U n o m m e n t t h e f o l l o w i n g t o h a v e Vim l o a d i n d e n t a
t i o n
r u l e s a n d p l u g i n s
2 " a o r d i n g t o t h e d e t e t e d f i l e t y p e .
3 i f h a s ( " a u t o m d " )
4 f i l e t y p e p l u g i n i n d e n t o n
5 s e t s m a r t i n d e n t
6 s e t e x p a n d t a b
7 s e t t a b s t o p =4
8 s e t s o f t t a b s t o p =4
9 s e t s h i f t w i d t h =4
10 e n d i f
Aktifkan p enarian pintar dimana kalau Anda menuliskan huruf keil semua
saat p enarian maka tidak memp edulikan huruf keil ataupun b esar (inase-
sensitive). Namun jika Anda menyertakan huruf b esar maka ase-sensitive
b erlaku.
1 s e t i g n o r e a s e " Do a s e i n s e n s i t i v e m a t h i n g
2 s e t s m a r t a s e " Do s m a r t a s e m a t h i n g
Selesai dan simpanlah. Kon#gurasi ini seara otomatis juga b erlaku bagi
Ya, kita atur dulu urusan PHP sebagai bahasa yang umum digunakan oleh
p engembang web. Pasang mo dul suphp agar setiap sript PHP dijalankan oleh
p emiliknya:
ganti baris
doroot=/var/www:${HOME}/publi_html
menjadi
doroot=/home
1 m a x _ e x e u t i o n _ t i m e = 1 0 0 0
2 m a x _ i n p u t _ t i m e = 1 0 0 0
3 m e m o r y _ l i m i t = 1 2 8M
4 p o s t _ m a x _ s i z e = 1 0 0M
5 u p l o a d _ m a x _ f i l e s i z e = 1 0 0 0M
Post#x p erlu diatur agar b oleh menerima relay dari network lain. Misalkan user
1 s u b m i s s i o n i n e t n − − − − s m t p d
2 s m t p s i n e t n − − − − s m t p d
MECHANISMS="pam"
menjadi
MECHANISMS="shadow"
Restart daemon-nya:
16.1.7 PostgreSQL
Kalau eno ding masih SQL_ASCI I b erarti Anda harus menggantinya ke UTF8.
Berikutnya kon#gurasi awal melalui web. Jika Anda memasang desktop, bisa
langsung ke url:
https://127.0.0.1:10000
Namun jika server sudah b erada di remote, Anda bisa gunakan IP publiknya
Pada awal login, Anda dihadapkan pada wizard untuk kon#gurasi. Seara
umum Anda ukup memilih Yes dan klik Next hingga selesai. Setelah Next
on#guration page.
Jika IP publik server adalah statik, maka lanjutkan klik mo dule on#guration
yang dimaksud. Atau seara menu melalui System Settings, Virtualmin Con-
ternal address
Klik Save. Jangan lupa mengatur mo dem ADSL untuk mengarahkan seluruh
p ermintaan dari luar ke server 192.168.1.2. Mekanisme ini sering disebut sebagai
Jika Anda tidak p ernah memesan IP publik statik pada ISP, hampir di-
sa ja urusan DNS di atas, karena DNS yang Anda butuhkan p erlu ditangani
Ini artinya server tidak bisa disentuh (baa: di- route ) dari luar. Praktis Anda
tidak bisa b erbisnis hosting. Untuk memastikannya, oba minta teman Anda
ia mendapatkan p esan:
It works!
gin . Akan lebih nyaman bila formatnya menggunakan user#domain , agar sama
3. Pada bagian Format for usernames that inlude domain pilihlah user-
name#domain .
4. Klik Save.
#domain . Lebih jelasnya Anda bisa lihat di menu Edit Mail and FTP users
Berikanlah user hak untuk membuat virtual server . Ini artinya jika user Anda
Klik Save.
Bila nanti user login menggunakan ssh (seure shell), ia akan mendapat shell
sederhana, yaitu /bin/sh . Terus terang, shell ini kurang nyaman, dimana tidak
memiliki history dan autoompletion . Sebaiknya Anda memb erikan /bin/bash .
Klik menu System Customization, Custom Shel l, Custom shel ls below . Gantilah
1 # e n a b l e b a s h o m p l e t i o n i n i n t e r a t i v e s h e l l s
2 i f [ − f / e t / b a s h _ o m p l e t i o n ℄ && ! s h o p t − o q p o s i
x ; t h e n
3 . / e t / b a s h _ o m p l e t i o n
4 f i
Agar lebih nyaman dalam memasang b erbagai aplikasi dari GitHub dan
Ya, akhirnya kita sampai ke bagian ini, dimana user seara default menggunakan
Juga Virtual Environment agar user dimudahkan dalam memasang mo dul Python
Virtualmin sudah menyediakan apa yang disebut Server Template . Saat p endaf-
taran domain, admin dib erikan kesempatan memilih bahasa apa yang akan di-
Python. Pilihan ini terdapat di menu Create Virtual Server, Server on#gu-
ration template . Di sana ada pilihan Default Settings yang b erarti PHP yang
Lalu dimana pilihan Python ? Seharusnya ada di bawahnya, namun saat ini
Klik Create and Next . Pada bagian Edit template setion , pilih Apahe website .
Ini untuk mengganti form isian dengan hal-hal yang b ersifat Apahe. Pada
bagian Diretives and settings for new websites , dan pada radio button Apahe
WSGISriptAlias / ${HOME}/wsgi/wsgi_handler.py
WSGIProessGroup ${DOM}
Klik Save.
soure PHP, dimana bila URL yang dimaksud dipanggil melalui browser - mis-
itulah yang dijalankan Apahe. Istilahnya root doument . Karena kita juga
akan membangun Python hosting, maka root doument akan diganti dengan
Seb enarnya dengan apa yang Anda sudah pasang tadi sudah ukup bagi
sript yang dijalankan setelah sebuah domain dibuat. Praktis ini mengurangi
#guration ategory , pilihlah Ations upon server and user reation . Lalu pada
1 # ! / u s r / b i n / p y t h o n
3 i m p o r t o s
4 i m p o r t s y s
7 o s . s y s t e m ( ' p − r / u s r / l o a l / e t / v i r t u a l m i
n / w s g i %s ' % (
8 o s . e n v i r o n [ 'VIRTUALSERVER_HOME ' ℄ ) )
9 o s . s y s t e m ( ' d %s / w s g i ; l n − s . w s g i ' % o s . e
n v i r o n [ '
VIRTUALSERVER_HOME ' ℄ )
10 o s . s y s t e m ( ' v i r t u a l e n v %s / e n v ' % o s . e n v i r o n
[ '
VIRTUALSERVER_HOME ' ℄ )
11 o s . s y s t e m ( ' h o w n − R %s . % s %s / w s g i %s / e n v ' % (
14 o s . e n v i r o n [ 'VIRTUALSERVER_HOME ' ℄ ,
15 o s . e n v i r o n [ 'VIRTUALSERVER_HOME ' ℄ ) )
Pastikan exeutable:
taruh di $HOME/ :
Daemon Python ?
Ya. Setiap sript Python yang dibuat oleh user akan dijalankan oleh Apahe
sebagai daemon, dalam sebuah sub-pro ess. Monitoring sript b erguna untuk
memantau p erubahan #le pada direktori $HOME/wsgi. Bila sript ini menda-
pati ada #le yang b erubah, seara otomatis ia akan mengakhiri dirinya sendiri,
dan pada saat URL situs dipanggil lagi melalui browser, Apahe - seara otoma-
1 i m p o r t o s
2 i m p o r t s y s
3 i m p o r t t i m e
4 i m p o r t s i g n a l
5 i m p o r t t h r e a d i n g
6 i m p o r t a t e x i t
7 i m p o r t Q u e u e
9 _ i n t e r v a l = 1 . 0
Interpreter Python mengizinkan kita untuk mengubah #le *.py selama sript sedang b
er-
jalan ( runtime ). Namun p erubahan itu b erfungsi saat sript itu dijalankan ulang.
10 _ t i m e s = { }
11 _ f i l e s = [ ℄
12
13 _ r u n n i n g = F a l s e
14 _ q u e u e = Q u e u e . Q u e u e ( )
15 _ l o k = t h r e a d i n g . L o k ( )
16
17 d e f _ r e s t a r t ( p a t h ) :
18 _ q u e u e . p u t ( T r u e )
19 p r e f i x = ' m o n i t o r ( p i d=%d ) : ' % o s . g e t p i d ( )
20 p r i n t >> s y s . s t d e r r , '%s C h a n g e d e t e t e d t o \
' % s \ ' . '
% ( p r e f i x , p a t h )
21 p r i n t >> s y s . s t d e r r , '%s T r i g g e r i n g p r o e s s r
e s t a r t . '
% p r e f i x
22 o s . k i l l ( o s . g e t p i d ( ) , s i g n a l . S I G I N T )
23
24 d e f _ m o d i f i e d ( p a t h ) :
25 t r y :
26 # I f p a t h d o e s n ' t d e n o t e a f i l e a n d w e r e
p r e v i o u s l y
27 # t r a k i n g i t , t h e n i t h a s b e e n r e m o v e d o r t h e
f i l e t y p e
28 # h a s h a n g e d s o f o r e a r e s t a r t . I f n o t
p r e v i o u s l y
29 # t r a k i n g t h e f i l e t h e n w e a n i g n o r e i t a s
p r o b a b l y
30 # p s e u d o r e f e r e n e s u h a s w h e n f i l e e x t r a t e d
f r o m a
31 # o l l e t i o n o f m o d u l e s o n t a i n e d i n a z i p f i l e .
32
33 i f n o t o s . p a t h . i s f i l e ( p a t h ) :
34 r e t u r n p a t h i n _ t i m e s
35
36 # C h e k f o r w h e n f i l e l a s t m o d i f i e d .
37
38 m t i m e = o s . s t a t ( p a t h ) . s t _ m t i m e
39 i f p a t h n o t i n _ t i m e s :
40 _ t i m e s [ p a t h ℄ = m t i m e
41
42 # F o r e r e s t a r t w h e n m o d i f i a t i o n t i m e h a s
h a n g e d , e v e n
43 # i f t i m e n o w o l d e r , a s t h a t o u l d i n d i a t e o l d e r
f i l e
44 # h a s b e e n r e s t o r e d .
45
46 i f m t i m e ! = _ t i m e s [ p a t h ℄ :
47 r e t u r n T r u e
48 e x e p t :
49 # I f a n y e x e p t i o n o u r e d , l i k e l y t h a t f i l e h a s
b e e n
50 # b e e n r e m o v e d j u s t b e f o r e s t a t ( ) , s o f o r e a
r e s t a r t .
51
52 r e t u r n T r u e
53
54 r e t u r n F a l s e
55
56 d e f _ m o n i t o r ( ) :
57 w h i l e 1 :
58 # C h e k m o d i f i a t i o n t i m e s o n a l l f i l e s i n s y s .
m o d u l e s .
59
60 f o r m o d u l e i n s y s . m o d u l e s . v a l u e s ( ) :
61 i f n o t h a s a t t r ( m o d u l e , ' _ _ f i l e _ _ ' ) :
62 o n t i n u e
63 p a t h = g e t a t t r ( m o d u l e , ' _ _ f i l e _ _ ' )
64 i f n o t p a t h :
65 o n t i n u e
67 p a t h = p a t h [ : − 1 ℄
68 i f _ m o d i f i e d ( p a t h ) :
69 r e t u r n _ r e s t a r t ( p a t h )
70
71 # C h e k m o d i f i a t i o n t i m e s o n f i l e s w h i h h a v e
72 # s p e i f i a l l y b e e n r e g i s t e r e d f o r m o n i t o r i n g .
73
74 f o r p a t h i n _ f i l e s :
75 i f _ m o d i f i e d ( p a t h ) :
76 r e t u r n _ r e s t a r t ( p a t h )
77
78 # Go t o s l e e p f o r s p e i f i e d i n t e r v a l .
79
80 t r y :
81 r e t u r n _ q u e u e . g e t ( t i m e o u t = _ i n t e r v a l )
82 e x e p t :
83 p a s s
84
85 _ t h r e a d = t h r e a d i n g . T h r e a d ( t a r g e t =_ m o n i t o r )
86 _ t h r e a d . s e t D a e m o n ( T r u e )
87
88 d e f _ e x i t i n g ( ) :
89 t r y :
90 _ q u e u e . p u t ( T r u e )
91 e x e p t :
92 p a s s
93 _ t h r e a d . j o i n ( )
94
95 a t e x i t . r e g i s t e r ( _ e x i t i n g )
96
97 d e f t r a k ( p a t h ) :
98 i f n o t p a t h i n _ f i l e s :
99 _ f i l e s . a p p e n d ( p a t h )
100
101 d e f s t a r t ( i n t e r v a l = 1 . 0 ) :
102 g l o b a l _ i n t e r v a l
103 i f i n t e r v a l < _ i n t e r v a l :
104 _ i n t e r v a l = i n t e r v a l
105
106 g l o b a l _ r u n n i n g
107 _ l o k . a q u i r e ( )
108 i f n o t _ r u n n i n g :
' % p r e f i x
111 _ r u n n i n g = T r u e
112 _ t h r e a d . s t a r t ( )
113 _ l o k . r e l e a s e ( )
1 d e f a p p l i a t i o n ( e n v i r o n , s t a r t _ r e s p o n s e ) :
2 s t a t u s = ' 2 0 0 OK '
3 o u t p u t = ' H e l l o W o r l d ! '
5 ( ' C o n t e n t − L e n g t h ' , s t r ( l e n ( o u t p u t
) ) ) ℄
6 s t a r t _ r e s p o n s e ( s t a t u s , r e s p o n s e _ h e a d e r s )
7 r e t u r n [ o u t p u t ℄
10 i m p o r t o s , s y s
11
12 s y s . s t d o u t = s y s . s t d e r r
13 s y s . p a t h . a p p e n d ( o s . p a t h . d i r n a m e ( o s . p a t h .
a b s p a t h ( _ _ f i l e _ _ )
) )
[ : 2 ℄ ) )
15 e n v _ p a t h = o s . p a t h . d i r n a m e ( o s . p a t h . d i r n a m e
( o s . p a t h .
a b s p a t h ( _ _ f i l e _ _ ) ) ) + \
17 s y s . p a t h . a p p e n d ( e n v _ p a t h )
18
s e t t i n g s '
20 #i m p o r t d j a n g o . o r e . h a n d l e r s . w s g i
21 # a p p l i a t i o n = d j a n g o . o r e . h a n d l e r s . w s g i . W S
G I H a n d l e r ( )
22
23 i m p o r t m o n i t o r
24 m o n i t o r . s t a r t ( i n t e r v a l = 1 . 0 )
Mari dimulai dengan membuat domain p erusahaan hosting Anda sendiri, dalam
http://sabilawebhosting.om
Hello world!
hampir dipastikan domain tersebut b elum sep enuhnya dikenal oleh para ISP.
Jika Anda browsing di server pastikan baris b erikut ini ada di urutan teratas
/et/resolv.onf :
nameserver 127.0.0.1
Namun jika Firefox Anda b erada di mesin b erb eda, pastikan DNS teratas adalah
nameserver 202.59.201.67
Anda bisa membuka Virtualmin dengan sub domain admin , yaitu dengan url:
http://admin.sabilawebhosting.om
Hal serupa dapat dilakukan oleh p elanggan Anda sesuai domain mereka masing-
masing.
Sedangkan untuk mail, mereka bisa mengunjungi sub domain webmail , dalam
hal ini ontohnya adalah:
http://webmail.sabilawebhosting.om.
User dip erkenankan melakukan SSH ke server dengan username awalan nama
$ d wsgi
1 i m p o r t o s , s y s
3 s y s . s t d o u t = s y s . s t d e r r
4 s y s . p a t h . a p p e n d ( o s . p a t h . d i r n a m e ( o s . p a t h . a
b s p a t h ( _ _ f i l e _ _ )
) )
[ : 2 ℄ ) )
6 e n v _ p a t h = o s . p a t h . d i r n a m e ( o s . p a t h . d i r n a m e (
o s . p a t h .
a b s p a t h ( _ _ f i l e _ _ ) ) ) + \
8 s y s . p a t h . a p p e n d ( e n v _ p a t h )
9
s e t t i n g s '
11 i m p o r t d j a n g o . o r e . h a n d l e r s . w s g i
http://djangopro jet.om
12 a p p l i a t i o n = d j a n g o . o r e . h a n d l e r s . w s g i . W S G
I H a n d l e r ( )
13
14 i m p o r t m o n i t o r
15 m o n i t o r . s t a r t ( i n t e r v a l = 1 . 0 )
It worked!
rets . Isilah pada bagian Doument diretory aliases . Misalkan From diisi
Oh iya, seb enarnya juga tersedia Installer Django di sini. Namun tidak dis-
arankan karena masih menggunakan Fast CGI (konon yang terbaik menggu-
Template telah siap. Kini obalah mendaftarkan domain baru pada menu
Create Virtual Server . Setelah memasukkan Domain name dan Administration
password , pilih Python pada Server on#guration template . Klik Create Server .
san:
Hello World!
yang b erasal dari #le wsgi/wsgi_hand ler.py . Jika tadi Anda pilih Default Set-
Forbidden
Bibliogra#
[4℄ https://onvore.om/id-python/gathering-online-22-july-2011
141
Indeks
__name__, 35
Android, 5
apt-get install, 6
apt-get up date, 6
autoinrement #eld, 46
BlankOn, 6
break, 14
ontinue, 15
CREATE TABLE, 44
CREATE VIEW, 52
reatedb, 43
reateuser, 42
date(), 30
datestyle, 48
datetime(), 30
DEFAULT, 44
DELETE FROM, 50
DROP TABLE, 51
drop db, 43
dropuser, 42
ep o h, 29
eval(), 20
#oat, 11
for, 16
formatting, 17, 19
fullpath, 54
Gnome, 7
int(), 19, 27
integer, 11
KDE, 6, 7
konsole, 6
length(), 56
Linux, 5
lo ale-gen, 38
lo altime(), 28
lower(), 9
lpad(), 56
Ma, 5
mktime(), 29
mo dul datetime, 30
mo dul lo ale, 37
mo dul time, 28
nextval(), 47
None, 39
NOT NULL, 44
ob jek hampa, 39
ORDER BY, 48
pg_dump, 54
pg_restore, 54
plpgsql, 6
plpython, 6
p ostgresql.onf, 48
PRIMARY KEY, 44
print, 9, 20
psql, 6, 43
rata kanan, 55
raw_input(), 10, 27
sequene, 46
142
INDEKS 143
serial, 46
sisa p embagian, 18
SQLAlhemy, 6
string, 9, 11
sudo, 42
Symbian, 5
text editor, 7
time(), 29
transation, 72
typ e(), 17
Ubuntu, 6
Unix, 5
Unix time, 29
UPDATE, 50
upp er(), 9
variab el, 11
vi, 7
while, 15