Browsing Blackberry Bold dengan TelkomselFlash

Semula saya pikir untuk internet-an di Blackberry dengan kartu Halo, di-haruskan dengan berlangganan BIS. Ternyata, tidak begitu. Saya iseng2x menggunakan kartu Halo yang sudah berlangganan Internet TelkomselFlash di Blackberry Bold 9800. Dengan mengubah settings di Options -> Lalu search “tcp” supaya melihat opsi TCP/IP.

Disana di-set :

1
2
3
apn: internet
username:
password:

Save lalu open Browser. Yap! sekarang bisa surfing website dengan telkomselflash di Blackberry.

Baca artikel berikut untuk menjadikan Blackberry sebagai USB modem di Ubuntu

Tips git menampilkan branch pada console / terminal ubuntu

Ketika bekerja dengan beberapa git project, seringkali kita lupa sedang berada di branch mana. Apakah sedang di branch master, experimental, testing atau custom ? Kadang kita juga lupa untuk selalu melakukan “git branch” untuk melihat branch yang aktif.

Solusi untuk masalah ini adalah dengan menampilkan status branch pada console / terminal secara otomatis.
Saya menggunakan Ubuntu 11.10 Oneiric dalam contoh ini. Untuk menampilkan branch pada console :
Continue reading

Mengenal Branch di Github

Ketika kita men-develop applikasi menggunakan git, tentu secara default kita menggunakan master sebagai repository utama. Pada kebanyakan kasus ketika developing, kita menambahkan fitur2x / perubahan yang bersifat untuk “testing”. Namun, perubahan tersebut tidak ingin di-commit ke master. Pada kondisi inilah kita membutuhkan branch.

Branch adalah repository yang berbeda dengan master dan independen. Kia bisa mem-publish repository branch ini untuk di-clone oleh orang lain. Selain itu, ketika perubahan di branch sudah “layak” dimasukkan ke dalam master repo, maka kita melakukan “merge” alias penggabungan 2 repositori.
Continue reading

Solve Permission denied (publickey). fatal: The remote end hung up unexpectedly

After upgrading my Ubuntu into 11.10 ( Oneiric ), then i start to develop my application on Github local folder. When i push several commit, suddenly i got this kind of error :

1
2
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

I feel have correct configuration and there should be no error. Until i realize that my SSH keys for Github was deleted with the past OS. :D

So, i start to generate ssh-key and add into Github.

1
2
3
4
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub

Copy to SSH Key on Github Account. Then, i start configuring my local github profiles :

1
2
3
4
git config --global user.name "My Name"
git config --global user.email my-email
git config --global github.user yodiaditya
git config --global github.token mytoken

Feel embarassing that i forgot about using brand new Ubuntu Oneiric :)

Bash replacing string inside text files using SED command line Ubuntu

This is mostly happen when we have many configuration or text files inside our Ubuntu / servers. For example , i have 5 nginx virtualhost files. For some reason, i need to change my sites to run NGINX on port 84. So i need to change

1
listen 80;

into

1
listen 84;

in each virtualhost files.

The fast way to do it is by using SED. The pattern is :

1
sed -i 's/<search-string>/<replace-string>/ your-files'

Here are example :

1
sudo sed -i 's/listen   80;/listen   84;/' *

Now all files which contain listen 80; will replaced with listen 84;. Easy right ? :D

Bermain dengan Awk untuk log / file text processing

Salah satu bahasa pemograman di Linux yang sering dipakai oleh para professor, programmer dan peneliti di luar negeri adalah Awk. Ini semacam “little” programming language. Awk biasanya dipakai untuk analasis log yang panjang atau grab text lalu di-modify. Intinya, kalau anda mendapatkan data di file text dan butuh di-analisis namun tidak mau ribet, bisa memakai Awk.

Saya menggunakan Ubuntu Natty 11.04 dimana Awk sudah ter-install otomatis didalamnya. Untuk pengetahuan dasar, strutur penggunaan awk adalah

1
awk ''

. Dimana syntax pemograman bisa dilakukan di dalam kurung-kurawal {}. Contohnya adalah awk ‘{print $3}’. Mari kita coba & silahkan buka terminal / console anda.

1. Awk digunakan untuk print kata ke-n

1
echo 'this is for testing purpose only' | awk '{print $3}'

Ini akan menghasilkan result : “for”. Awk meng-analisis string yang di-echo. Lalu Awk meng-eksekusi fungsi “print $3″ dimana memunculkan kata ke-tiga dari string yang didapatkan.

2. Mem-parsing log files.
Berikut ini contoh file log dari NGINX salah satu domain saya, silahkan disimpan menjadi test.log.
Continue reading

Bermain pythonchallenge.com untuk belajar algoritma python

Hari ini saya baru tahu kalau ada situs yang mengajarkan Python melalui teka-teki asik yaitu pythonchallenge.com. Iseng-iseng saya mencoba 2 level karena lekas mau mandi. Setelah saya menjawab 2 pertanyaan maka pattern dari situs ini bisa ditebak.

Untuk lolos dari pertanyaan di situs ini, coba perhatian kata kunci di URL setelah /def/ serta hiraukan .html. Biasanya clue2x-nya adalah menyelesaikan masalah atau menemukan formula, lalu dari kata kunci di URL atau gambar itu, di jalankan di formula / solusi yang kita bikin. Selanjutnya, tinggal re-name saja URL-nya (setelah def) dan tetep pakai .html.

Penasaran? Ini jawaban saya :

Tahap 1 :
Karena tulisannya adalah 2  pangkat 38, maka di Python adalah 2**38. Ketika mengganti 0.html dengan 2**38.html maka langsung ketahuan jawabannya.

Tahap 2:
Ini adalah memindahkan karakter menjadi 2 kedepan. Ini script Python saya :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import string

def arrange(text):
    textLength = len(text)
    newText = []

    for i in range(textLength):
        if text[i].isalpha():             # Cek bila karakter adalah alphabet
            digitText = ord(text[i])+2
            if digitText > 122 :          # Kembali ke huruf depan bila lebih dari Z
                digitText = digitText-26

            newText.append(chr(digitText))
       
        else:
            newText.append(text[i])       # Pass bila bukan alphabet
   
    print(''.join(newText))               # Gabungkan kembali List yang dibuat

if __name__ == '__main__':
    text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    # uncomment dibawah ini untuk lanjut ke tahap berikutnya
    # karena maksudnya apply on url, ambil keyword URL lalu di-translate
    #text = 'map'
    arrange(text)

Cheers! :)

Memahami Context Switch

Pada postingan sebelumnya, saya membahas tentang implementasi thread di dunia website. Sekilas info, traditional processing adalah dimana di dalam menjalankan instruksi harus sesuai dengan urutan/alur-nya. Berbeda dengan itu, thread bisa membagi-bagi sebuah alur yang diberikan (seperti gambar) lalu di-eksekusi & tetap di dalam processing.

Analoginya, ada sebuah tugas untuk memotong2x wortel. Traditional processing akan memotong dari kiri – kanan berurutan menggunakan satu tangan. Berbeda dengan thread, wortel dipotong oleh lebih dari 1 tangan dengan tidak berurutan namun hasilnya sama dengan yang traditional processing. (seperti gambar).

Salah satu kelebihan Thread adalah kemampuan untuk sharing memory / resource lain untuk digunakan bersama-sama . Selain itu thread menggunakan address space yang sama. Sampai disini dulu untuk threadnya, karena nantinya akan berkaitan dengan context switch.

Context switch adalah sebuah proses untuk menyimpan context ( variable, data2x ) dari eksekusi sebuah program / processing ketika di-interrupt, lalu dapat di-restore kembali dari proses yang terakhir ketike hendak di-eksekusi kembali. Ini mirip dengan proses download di browser. Kita bisa men-stop sebuah download file lalu me-resume kembali dimana dilanjutkan download yang sudah ada. Context switching yang membuat sebuah proses bisa di-interrupt lalu di-lanjutkan kembali dengan hasil proses sebelumnya.

Dengan context switching, multiple process bisa di jalankan di single CPU. Jadi sebenarnya ketika kita menjalankan berbagai aplikasi ( multi-tasking ) di atas single CPU (single-core), maka CPU tersebut menjalankan semua proses dengan berpindah-pindah dari satu ke lainnya. Context switching ini dilakukan oleh Operating System (OS). Secara interval context-switching pada sistem umumnya sekitar 10 milliseconds!

Kembali lagi ke thread. Penggunaan thread akan terasa bila dijalankan di multiple core dibandingkan di single core. Namun, penggunaan multiple-threading di single-core tetap lebih cepat dibandingkan single process.

Bila thread bisa dijalankan di multiple-core, maka context switching juga berjalan di multiple-core juga. Sekarang kita sudah memahami konsep Context Switch di level OS. Dengan ini kita bisa lebih mendalami ke hal2x lain seperti asynchronous IO, blocking, non-blocking dan banyak lagi!

 

Mengenal Threading di dunia Web

Di dunia website, tentunya kegiatan request & response menjadi proses utama. Setiap request yang masuk akan diproses oleh sebuah program lalu diberikan outputnya (response). Topik kali ini adalah tentang bagaimana menjalankan proses untuk mengatasi request yang masuk lalu memberikan response-nya.

Kita membuat suatu program yang memproses setiap request lalu memberikan outputnya. Kita punya request yaitu “request”, di-proses dengan menambahkan kata2x “Hasil eksekusi dari :” di depan request masuk. Lalu outputnya di keluarkan. Dalam contoh ini, saya menggunakan Python dan berikut ini contoh prototipe sederhana :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# buat file bernama  test.py
# Ekskusi : python test.py request

import sys
import datetime
import time

__author__ = 'Yodi aditya - re.web.id'

def simpleProgram(request):
    start = datetime.datetime.now()              # Waktu input masuk
    time.sleep(1)                                            # Sleep selama 1 detik
    now = datetime.datetime.now()               # Waktu output
   
    return request+ ': %s \nresponse: %s ' % (start,now)

""" proses utama ketika melakukan eksekusi ex : python test.py input """
if __name__ == '__main__' :
    if len(sys.argv) > 1 :
        print(simpleProgram(sys.argv[1]))
    else:
        print('Tidak ada input! Coba : python test.py request.')

Contoh ouput program ini :
request: 2011-08-15 14:27:52.789295
response: 2011-08-15 14:27:53.790361

Mari buat asumsi bahwa dalam kasus ini ternyata setiap pengolahan sebuah request membutuhkan waktu 1 detik karena keterbatasan kemampuan server / komputer. Sekarang kita punya pengunjung yang melakukan request tiap 1 detik. Apa yang terjadi? Tentunya program ini akan berjalan lancar bukan?

Nah, bagaimana bila pada 1 detik yang bersamaan, ada 3 visitor yang mengakses program ini?
Kalau gitu kita ubah kode berikut menjadi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# buat file bernama  test.py
# Ekskusi : python test.py request

import sys
import datetime
import time

__author__ = 'Yodi aditya - re.web.id'

def simpleProgram(request):
    start = datetime.datetime.now()              # Waktu input masuk
    time.sleep(1)                                            # Sleep selama 1 detik
    now = datetime.datetime.now()               # Waktu output
   
    return request+ ': %s \nresponse: %s ' % (start,now)

""" proses utama ketika melakukan eksekusi ex : python test.py input """
if __name__ == '__main__' :
    if len(sys.argv) > 1 :
        for i in range(3):                                    # Lakukan 3 kali iterasi
            print(simpleProgram(sys.argv[1]))
           
    else:
        print('Tidak ada input! Coba : python test.py request.')

Outputnya :

request: 2011-08-15 14:31:18.284534
response: 2011-08-15 14:31:19.285620
request: 2011-08-15 14:31:19.285862
response: 2011-08-15 14:31:20.286936
request: 2011-08-15 14:31:20.287031
response: 2011-08-15 14:31:21.287550

Dari sini terlihat bahwa program pertama kali melayani visitor 1 ( 18-19 ). Setelah selesai, maka akan melayani request visitor kedua ( 19-20 ). Dan yang terakhir, visitor ketiga (20-21).

Program ini memproses tiap 1 request saja. Setelah 1 request selesai, program baru menerima request berikutnya. Program ini tidak menerima request baru ketika proses request yang diterima belum selesai. Inilah yang disebut Blocking.

Lalu bagaimana kalau kita ingin program yang sedang memproses request bisa menerima request baru? Bagaimana program bisa menjalankan semua request secara simultan/bersamaan?

Dalam kondisi ini, kita membutuhkan Threading, yaitu metode untuk menjalankan semua proses masuk secara simultan. Program mampu menerima request baru sembari memproses request yang lama.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# buat file bernama  test.py
# Ekskusi : python test.py request

import sys
import datetime
import time
import threading

__author__ = 'Yodi aditya - re.web.id'

def simpleProgram(self, request):

    start = datetime.datetime.now()              # Waktu input masuk
    time.sleep(1)                                            # Sleep selama 1 detik
    now = datetime.datetime.now()               # Waktu output

    print '(%s)\n%s: %s \nresponse: %s ' % (self.getName(), request, start,now)

class ThreadClass(threading.Thread):
    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(self, *self._args)

""" proses utama ketika melakukan eksekusi ex : python test.py input """
if __name__ == '__main__' :
    if len(sys.argv) > 1 :
        for i in range(3):                                    # Lakukan 3 kali iterasi
            t = ThreadClass(simpleProgram, sys.argv[1])
            t.start()
    else:
        print('Tidak ada input! Coba : python test.py request.')

Outputnya adalah :

(Thread-1)
request: 2011-08-15 15:19:37.864748
response: 2011-08-15 15:19:38.865882
(Thread-3)
request: 2011-08-15 15:19:37.864960
response: 2011-08-15 15:19:38.866367
(Thread-2)
request: 2011-08-15 15:19:37.864887
response: 2011-08-15 15:19:38.866516

Dari sini kelihatan bahwa 3 request bersamaan di-eksekusi langsung oleh program. Semua request di-eksekusi pada 37 dan output pada 38 ( 1 detik proses ).

Penggunaan Threading bisa dilakukan di berbagai bahasa pemograman yang support Threading seperti Python, Java, Clojure, C++ dan lainnya.

Implementasi Threading sangat penting di dunia website. Banyak sekali implementasi threading, seperti mengatasi proses Chatting dimana orang bisa menulis secara bersamaan. Membuat crawler yang mengunjungi berbagai situs lalu mengambil informasinya. Serta menghadapi request masuk secara bersamaan ketika website mendapatkan traffic tinggi.

Dapatkan source code via GitHub di https://github.com/yodiaditya/learning-python

Referensi :
http://linuxgazette.net/107/pai.html
http://www.ibm.com/developerworks/aix/library/au-threadingpython/