Cara Memahami Legacy Code

Sebelum kita bahas lebih lanjut mungkin ada yang belum familiar dengan kata legacy code. Jadi apa itu legacy code, jikalau diartikan legacy sendiri artinya adalah warisan, jadi legacy code adalah code warisan atau code yang didapat dari orang lain. Dalam industry legacy code kadang disebut sebagai istilah untuk “code yang tidak dapat dipahami dan sulit untuk dirubah” dan menurut pendapat dari Michael Feather

–“legacy code secara sederhana adalah code tanpa test”

Jadi apa hubunganya test dengan disebutkanya sebuah code itu baik atau buruk. Code tanpa test adalah code yang buruk. Tidak peduli seberapa baik penulisannya , seberapa cantik atau berorientasi object atau ber enkapasulasi dengan baik karena dengan test, kita dapat merubah perilaku code kita dengan cepat dan dapat di verivikasi. Tanpa test kita tidak tahu apakah code kita menjadi semakin baik atau semakin buruk.

Balik lagi ke legacy code , dari tadi kita bahas tentang testing tapi sebenernya kita tidak akan fokus pada testing melainkan tentang bagaimana cara merubah code pada legacy code. Sebelum kita mengetahui cara meruba code pada legacy code , kita harus tahu kenapa kita merubah legacy code , menurut michael feather ada 4 alasan umum untuk merubah code.

  • Adding Feature
  • Fixing Bug
  • Improving Design (Refactoring)
  • Optimizing Resource Usage

Ketika kita akan melakukan perubahan pada legacy code ada beberapa langkah yang harus dilakukan.

1. Identify Change Point

Jika kita tidak memahami design dengan baik akan sangat sulit membuat perubahan yang benar terutama pada code yang tidak kita kenal seperti legacy code. Sebenarnya terdapat beberapa cara untuk membentu memahami sebuah code, seperti

  • Notes/Sketching

Digambar atau mungkin lebih tepatnya coretan/sketsa , kita tidak perlu sampai sedemikian complexnya membuat UML diagram atau graph function secara detail , cukup tuliskan nama nama yang dirasa penting seperti cara kerja code tersebut atau relasi dengan fungsi lainya lalu buat buat bentuk dan beri garis untuk relasinya dan seterusnya . Maka dari situ code yang sedang dipahami paling tidak tertuang dalam gambar dan tidak hilang.

  • Listing Markup

Dalam bahasa singkatnya memberi tanda/comment , kita bisa memberi tanda seperti memberikan penjelasan pada akhir block perulangan atau validasi . Atau memberikan comment apabila pada bagian code butuh validasi atau perbaikan dan sebagainya.

  • Scratch Refactoring

Dalam refactoring diperlukan unit test untuk memastikan bahwa code yang kita refactor tidak terjadi error , tapi dalam kasus legacy code tidak ada unit test yang mendukung itu dan untuk membuat unit test kita perlu pemahaman tentang kode tersebut. Jadi mau tidak mau kita harus merefactoring code tersebut tanpa unit test untuk dengan tujuan untuk memahami code tersebut itulah yang disebut Scratch Refactoring.

  • Delete Unused Code

Jika dirasa ada baris code yang tidak terpakai , biasanya ragu dan berpikir apakah baris code tersebut akan dipakai di tempat lain atau mungkin terpakai di lain kali. Dalam kasus seperti ini kadang kita akan berpikir untuk membiarkan kode tersebut / mendisable kode tersebut (di komen) yang akan berakibat memperpanjang kode (padahal tidak terpakai). Maka kode ini sebaiknya di delete saja dan untuk masalah akan terpakai atau tidak, ada tool yang akan menghandle itu seperti version-control/git.

2. Find Test Point

Atau menemukan bagian mana yang harus di test, terkadang kita akan menemui masalah saat membuat test seperti dependencies yang harus kita pecah dsb. Untuk menemukan bagian yang harus di test ada beberapa konsep yang bisa digunakan.

  • Interception Points

Pada dasarnya Interception point hanyalah letak dimana kita dapat mendeteksi efek dari perubahan tertentu. Cara terbaik untuk memulai adalah mengidentifikasi tempat-tempat di mana perlu melakukan perubahan dan mulai melacak efek ke luar dari titik perubahan tersebut dan setiap tempat yang berpotensi menimbulkan efek itulah disebut interception points.

  • Detecting pinch point

Apa itu pinch point : tempat di mana tes terhadap beberapa metode dapat mendeteksi perubahan dalam banyak metode. Dengan melakukan testing pada pinch point kita bisa memahami code dengan cakupan yang lebih luas.

3. Break Dependencies

Setelah kita mengidentifikasi letak dari test point biasanya langkah selanjutnya adalah membuat code test , sayangya tidak semudah itu salah satu penyebabnya adalah dependencies , sebelum kita menulist code test ada baikntya kita memecah dependecies terlebih dahulu. Untuk contoh pemecahan dependencies bisa dilihat di sini untuk kasus parameter.

4. Write tests

  • Characterization Test

Yang dimaksud Chatacterization test adalah Tes yang mencirikan perilaku sebenarnya dari sepotong kode , caranya

* Gunakan Potongan code yang akan dites
* Tuliskan assertion yang membuatnya gagal
* Hasil gagal tersebut akan memberitahu behaviour dari code tersebut
* Perbaiki test tersebut sesuai dengan behaviournya

  • Characterizing Class

Kita memiliki class dan kita ingin mencari tahu apa yang di uji , langkah awalnya mencoba untuk memahami apa yang Class itu lakukan pada level yang lebih tinggi

* Cari code yang terlihat membingungkan lalu uraikan ke beberapa variable untuk membuatnya mudah dipahami
* Setelah tahu cara kerja dari class tersebut coba untuk membuat unit test yang memicu code tersebut

5. Make change and Refactor

Dan setelah beberapa code telah tercover oleh unit testing maka langkah selanjutnya adalah melakukan Refactoring atau melakukan perubahan. Untuk penjelasan Refactoring sendiri bisa dilihat pada tulisan sebelumnya.

Begitulah tips dan trik membaca legacy code , untuk contoh lebih jelas dan lengkap bisa dibaca bukunya Michael C. Feathers tentang “Working Effectively with Legacy Code”. Semoga bermanfaat dan jangan lupa untuk tidak membuat legacy code yang lainnya.

Sumber Referensi

https://www.goodreads.com/book/show/44919.Working_Effectively_with_Legacy_Code

Advertisements

Memperbaiki desain code dengan Refactoring

Bagi yang pernah memakai IDE seperti NetBeans atau Intellij IDEA pasti pernah menemui kata Refactor saat sewaktu akan merubah nama sebuah file,  dikarenakan merubah nama dari suatu file termasuk salah satu dari teknik refactoring.  Jadi apasih itu refactoring ?

Menurut Martin Fowler refactoring adalah proses mengubah software system , tapi tidak merubah tingkah laku atau behaviour dari code tersebut tetapi membuat struktur didalamnya menjadi lebih baik.  Biasanya dalam bahasa teknik kita lebih sering menyebutnya dengan clean up code atau bersih bersih kode program.

Contohnya:

Ada sebuah code, di situ dituliskan baris pertama memanggil fungsi dotask1() kemudian dotask2() dan dotask3(). Seratus baris kemudian di panggil lagi dotask1() dotask2() dan dotask3() dan akan dipanggil lagi di 80 baris berikutnya , anggap saja code ini berjalan dengan lancar tapi bisa dilihat apakah ini termasuk code yang baik , tidak karena disana terjadi duplikasi code yang berarti code itu kurang effisien. Untuk membuatnya effisien kita bisa merefactor code ini dengan tekhnik “extract method” yaitu membuat method baru untuk menampung code yang duplicate.

Setelah di refactor maka code akan terlihat lebih mudah untuk dibaca juga akan lebih mudah jika ada perubahan atau penambahan code di kemudian harinya. Itu gambaran sederhana dari refactoring.

Kenapa diperlukan refactoring, apakah bermasalah jika tidak melakukan refactoring?. Semua kembali kepada programmer yang menulis code tersebut. Jika programmer tersebut dapat menulis code dengan rapi mudah dibaca dan effisien pada percobaan pertama mungkin refactoring tidak perlu dilakukan. Tetapi hal seperti itu jarang ditemukan bahkan oleh programmer profesional sekaligus. Selain itu refactoring juga mempunya beberapa manfaat seperti.

Refactoring membuat design software menjadi lebih baik. Tanpa refactoring design program semakin lama akan semakin memburuk dalam arti menjadi membingungkan, selain berakibat sulitnya untuk dibaca juga sulit untuk melakukan perubahan dan tambahan fitur.

Refactoring membuat software mudah untuk dipahami. Yang ini jelas kode yang rapi dan bersih akan membuatnya mudah untuk dipahami.

Refactoring membantu menemukan bug. Code yang mudah dipahami akan membantu programmer untuk menemukan bug bug yang tersembunyi.

Refactoring membantu mempercepat pembuatan program. dengan design software yang baik , kode yang mudah dipelajari , dan lebih mudah menemukan bug bukankah akan membuat pengembangan suatu software menjadi lebih cepat.

Itulah beberapa alasan kenapa refactoring itu diperlukan , mungkin ada yang beranggapan kalau refactoring itu membuang waktu hanya untuk menulis ulang program. Perlu diingat bahwa melakukan refactoring berarti membiasakan diri untuk menulis program yang dapat dibaca. Program yang dapat dibaca membuat perubahan dapat dijalankan dengan cepat, bukankah itu hal yang bagus.

Kapan kita harus melakukan refactoring ?
Sebelum kita melakukan refactoring ada beberapa syarat yang harus dipenuhi yaitu.

  • Lakukan refactoring hanya pada kode yang sudah berjalan / tidak error
  • Lakukan refactoring pada bagian yang memiliki unit test, dikarenakan kita tidak mau setelah melakukan refactoring malah menimbukan bug baru.

Setelah hal diatas sudah terpenuhi kita bisa melakukan refactoring, kapan ?. Pada dasarnya refactoring bisa dilakukan kapan saja tapi pada umumnya dilakukan pada saat 3 hal ini.

Saat akan menambah fitur baru. Saat akan menambah fitur baru ada baiknya kita melakukan refactor dahulu sebagai persiapan, karena seperti yang dijelaskan sebelumnya bahwa refactoring membuat perubahan dan penambahan kode menjadi lebih mudah.

Saat akan memperbaiki bug. Ada kalanya kita tidak tahu bug berasal dari mana, pada saat itulah refactoring dibutuhkan karena refactoring membuat code program menjadi lebih mudah dipahami dan membuat bug menjadi mudah ditemukan.

Saat melakukan code review (kapan waktu code rewiev kamu yang putuskan sendiri). Biasanya beberapa perusahan menjadwalkan beberapa jam untuk melakukan code review.

Martin fowler juga membuat beberapa workflow yang bisa digunakan untuk melakukan refactoring
diantaranya adalah

  • TDD Refactoring
  • Litter-pickup Refactoring
  • Comprehension Refactoring
  • Preparatory Refactoring
  • Planned Refactoring
  • Long-term refactoring

* Untuk penjelasan detailnya bisa dilihat di referensi bawah

Walaupun refactoring itu perlu tapi ada beberapa situasi yang tidak perlu memerlukan refactoring seperti. Ketika kamu sedang dalam deadline , sebaiknya refactoring di lakukan setelah deadline selesai. Contoh kasus lainnya adalah ketika sebuah program memiliki banyak bug , tidak ada unit testing , bahkan mungkin tidak berjalan , sehingga keputusan untuk menulis ulang akan lebih bijaksana.

Seperti itulah penjelasan singkat tentang Refactoring semoga bermanfaat.

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

Sumber Referensi

https://refactoring.com

https://martinfowler.com/articles/workflowsOfRefactoring

Bcrypt (Adaptive Hashing Algorithm)

Pernah ada kenalan tanya ke saya “bisa gak sih kita tau password yang di daftarkan user yang ada di database” , kemungkinan besar tidak bahkan untuk pembuat sistem sekalipun karena yang di simpan dalam database sistem bukanlah password asli user melainkan hash password.

Apa itu hash , hash adalah transformasi dari character string menjadi value yang panjangnya sudah ditentukan, dan function/ algoritma yang digunakan disebut dengan hash function / hashing algorithm. Kali ini saya akan membahas tentang bcrypt salah satu hash function yang sering dimplementasikan untuk menyimpan password.

Bcrypt adalah salah satu password hashing yang di desain oleh Niel Provos dan David Mazieres dengan dasar dari blowfish cipher dan di publikasikan di USENIX pada tahun 1999

Mengapa menggunakan bcrypt ? , karena bcrypt itu lambat , iya lambat. Dibandingkan dengan hashing algoritma lain seperti md5 atau sha  , dalam mengenerate password bcyrpt dapat memakan waktu lebih lama dikarenakan algoritma eksblowfish dan jumlah round yang dapat diinputkan secara dinamik itulah kenapa bcrypt disebut adaptive.

Contoh hasil hashing menggunakan bcrypt

Gambar diatas adalah contoh hasil hash dari bcrypt dengan 10 adalah jumlah round yang dilakukan semakin besar jumlah round maka waktu yang dibutuhkan untuk mengenerated password akan semakin lama , dan 22 character setelahnya adalah generated salt

Algoritma bcrypt sangat bergantung pada key setup pada eksblowfish algoritma karena waktu terlama untuk mengenerate password berada disini

InitState bekerja seperti original blowfish algoritma yaitu mengisi P-Array dan S-box dengan dengan fractional pi dalam hexadecimal , sedangkan ExpandKey sama seperti blowfish keySchedule dengan perbedaan menggunakan 123-bit salt sebagai kuncinya.

Original Blowfish Feistel Network

Sedangkan untuk algorithma bcrypt sendiri terdiri dari eksblowfish algoritma dan OrpheanBeholderScryDoubt yang menjalankan algoritma blowfish standart dalam mode ECB sebanyak 3 64-bit blocks (3×64).

Sebagai perbandingan pada jurnal Niel Provos dan David Mazieres telah dibandingkan kecepatan generate password dengan algoritma hashing lainnya.

* Untuk implementasi dan detail penjelasan algoritma akan dijelaskan pada posting selanjutnya jika sempat

Sumber referensi:
https://en.wikipedia.org/wiki/Bcrypt
https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf

Kannel , Open Source SMS Gateway

Kannel adalah sebuah aplikasi open source yang berfungsi sebagai WAP Gateway dan SMS Gateway untuk jaringan GSM. Dibangun dengan bahasa C dan dapat terhubung dengan SMSC , handphone , dan GSM/GPRS Modem. Kannel menggunakan interface HTTP/HTTPS untuk mengirim dan menerima sms

  • Instalasi Kannel pada Ubuntu

# apt-get install kannel

  • Konfigurasi Kannel

Setelah kannel terinstall , rubah file konfigurasi kannel yang biasanya terletak di  /etc/kannel/kannel.conf

#BEARERBOX/CORE SETUP
group = core
admin-port = 13000
admin-password = password
status-password = password
log-file = "/var/log/kannel/bearerbox.log" ##->letak log bearerbox
log-level = 0 ##-> 0 = debug , 1 = info , 2 = warning , 3 = error , 4 = panic
access-log = "/var/log/kannel/access.log"
smsbox-port = 13001
store-location = "/var/log/kannel/kannel.store" ##-> letak file dimana pesan disimpan

#SMSC modem
group = smsc
smsc = at
host = localhost
port = 13013
smsc-id = idsmsc
my-number = 082123456789 ##-> nomor SIM card yang dipake
modemtype = wavecom
device = /dev/ttyUSB0 ##-> lokasi modem , biasanya terletak di ttyUSB0/ttyUSB1
speed = 115200

#MODEM
group = modems
id = WAVECOM
name = wavecom
detect-string = "WAVECOM"
detect-string2 = "MODEM"
init-string = "AT+CNMI=1,2,0,1,0;+CMEE=1"

# SMSBOX SETUP
group = smsbox
bearerbox-host = localhost
sendsms-port = 13131
sendsms-chars = "0123456789+"
log-file = "/var/log/kannel/smsbox.log" ##-> log sms yang masuk
log-level = 0
access-log = "/var/log/kannel/access.log"
global-sender = 082123456789

# SEND-SMS USERS
group = sendsms-user
username = username
password = password
user-allow-ip = 127.0.0.1 ##-> alamat ip yang diperboleh kan mengirim pesan

group = sms-service
keyword = default
max-messages = 0
get-url = "http://urlapiservice/respond?msg=%a&time=%t&sender=%p"

*Catatan

– Setting kannel diatas diperuntukan untuk pengiriman pesan menggunakan modem , untuk pengiriman langsung ke smsc memerlukan akses ke smsc tujuan yang tergolong susah didapat
– pada group sms-service get-url adalah alamat url yang akan dikirimkan data pesan yang masuk melalui protocol http dalam hal ini GET dengan parameter %a = isi pesan yang diterima , %t = waktu pesan tiba , %p = nomor pengirim

  • Menjalankan Kannel

# /usr/sbin/bearerbox /etc/kannel/kannel.conf &

Untuk menjalankan bearerbox

# /usr/sbin/smsbox /etc/kannel/kannel.conf &

Untuk menjalankan smsbox untuk memantau pesan yang masuk

Untuk menghentikan service kannel cukup ketikkan perintah

# pkill box

Secara garis besar kalau tidak ada masalah kannel sudah bisa berjalan , untuk mencoba mengirimkan pesan bisa mencoba masukkan url ini dibrowser

http://127.0.0.1:13013/cgi-bin/sendsms?username=user&password=pass&to=085xxxxxx&text=mau+kirim+sms

*Catatan

– 127.0.0.1 adalah alamat dimana aplikasi kannel berada dan 13013 adalah port yang diatur di group SMSC , sedangkan user dan password harus sesuai yang ditulis di group sendsms-user, serta alamat / ip komputer browser yang menjalankan perintah ini juga harus terdaftar di group sendsms-user

Sumber Referensi

http://www.kannel.org/download/1.4.4/userguide-1.4.4/userguide.pdf

https://firtstest.wordpress.com/hacking/sms-gateway-di-linux-kannel-wvdial-di-ubuntu/

SMS , SMS Center , dan SMS Gateway

Seringkali kita mendapat sebuah pesan atau sms dari sebuah toko usaha atau sejenisnya yang berisi tentang promosi tentang produknya, yang dimana tidak hanya kita yang mendapat pesan tersebut tetapi orang lain juga disaat yang hampir bersamaan dan dalam jumlah yang banyak. Bagaimana cara itu dilakukan, apakah ada orang yang mengetik pesan tersebut dan mengirimnya secara manual satu persatu ? , tentu tidak.

Pada postingan kali ini saya akan menjelaskan bagaimana cara itu dilakukan.

  • Apa itu SMS

SMS (Short Message Service) adalah sebuah teknologi yang memungkinkan penggunanya untuk menerima dan mengirimkan pesan antar handphone . SMS pertama kali muncul di Eropa pada tahun 1992

  • SMSC

SMSC atau SMS Center bertanggung jawab untuk mengendalikan pengiriman sms . Ketika pesan dari hanpdhone terkirim dia akan dikirmkan ke smsc terlebih dahulu kemudian smsc akan meneruskannya ke tujuan. Ketika alamat tujuan tidak dapat dihubungi maka pesan akan disimpan oleh smsc kemudian akan dikirim lagi beberapa saat kemudian. Pada dasarnya alamat smsc itu seperti nomor biasa hanya saja menggunakan nomor international , pada kartu SIM (Subscriber Identity Module) lama / hp lama biasanya kita harus mensettting alamat smsc tersebut secara manual tetapi untuk sekarang alamat smsc tersebut sudah tersimpan dalam kartu SIM .

  • SMS Gateway

SMS Gateway berfungsi untuk menjembatani pesan yang dikirim dan diterima , seperti penghubung antara dua smsc yang berbeda protocol (terkadang tiap organisasi/vendor mempunyai protocol tersendiri di smsc mereka ) ,  mengirimkan pesan melalui SIM card ,  membuat pesan yang masuk menjadi email  dan sebagainya termasuk mengirim pesan massal untuk promosi .

Pada Umumnya terdapat 2 cara untuk mengirimkan pesan melalui komputer

1)  Menghubungkan komputer dengan handphone atau GSM/GPRS Modem kemudian menginstruksikan modem dengan SIM card didalamnya untuk mengirimkan pesan dengan menggunakan AT Command .

2) Menghubungkan komputer dengan SMSC lalu mengirimkan pesan menggunakan protocol yang digunakan oleh SMSC tujuan

Dari kedua cara tersebut cara kedua lebih dapat mengirimkan pesan lebih banyak dan lebih cepat tetapi untuk melakukanya kita harus mempunyai akses ke smsc tujuan tersebut. Sedangkan cara pertama kita hanya perlu membutuhkan sebuah modem yang mendukung perintah untuk mengirimkan pesan dan sebuah SIM Card yang ada pulsanya tentunya.

  • Mengirimkan SMS menggunakan AT Command

Install Minicom / Hyper Terminal (windows) atau aplikasi sejenisnya untuk menjalankan AT Command. Atur konfigurasi pada minicom untuk Linux, Modem USB biasanya terletak pada /dev/ttyUSB0 atau /dev/ttyUSB1 . Ketikkan AT, jika ada response OK berarti sudah terhubung dengan modem.

AT
OK
AT+CMGF=1
OK
AT+CMGW="+6285123456789"
> A simple demo of SMS text messaging.
+CMGW: 1

OK
AT+CMSS=1
+CMSS: 20

OK

– Pada Baris ke 3 , AT+CMGF menginstruksikan modem untuk bekerja kedalam text mode
– Pada baris ke 5 , AT+CMGW berfungsi untuk menyimpan pesan kedalam penyimpanan di modem dengan nomor tujuan (62 kode nomor indonesia ) 85123456789
– Pada baris ke 7 , 1 adalah nomor index dimana pesan itu dismpan
– Pada baris ke 9 , AT+CMSS=1 mengirimkan pesan yang ada pada storage di index 1

Pengiriman dengan cara ini cukup banyak menyita waktu dan harus menghafal AT Command , oleh karena itu dibuatlah SMS Gateway untuk melakukan peran ini dan kita hanya perlu mengatur konfigurasinya. Yang mana akan di jelaskan di postingan selanjutanya.

 

Referensi Lengkap : http://www.developershome.com/sms

Menggunakan Shared Folder pada VirtualBox

Hal yang sering dijumpai ketika kita menggunakan virtual box adalah bagaimana caranya kita mengirim file yang ada pada OS komputer kita (Host OS) kedalam OS yang ada pada Virtual Box (Guest OS) . Mumpung masih fresh saya share gimana caranya :

Dalam kasus saya , saya memakai VirtualBox Ver. 4.3.10_Ubuntu dan Operating Sistem nya menggunakan Lubuntu 14.04 sebagai Host dan Windows 7 x86 (32bit) sebagai Guest nya (sebenernya nemu kaya gini gara2 kerjaan juga -_-# )

Dalam virtual box terdapat fitur yang bernama Shared Folder , untuk menggunakannya kita harus menginstall Guest Additions detailnya , dilinux cukup jalankan perintah :

sudo apt-get install virtualbox-guest-additions-iso

Setelah terinstall nyalakan Windows 7 pada virtualbox , pada tab Device (di pojok kanan atas) pilih “Shared Folder Settings” kemudian tambahkan folder yang akan di share , check “Auto-mount” dan “Make Permanent”.

desktop 2_017

Kembali ke tab Device lagi sekarang pilih “Insert Guest Addition CD image” . Jalankan Windows 7 pada Virtualbox dan buka windows explorer . Pada bagian CD Drive akan muncul “VirtualBox Guest Addition” pilih lalu jalankan installer didalamnya. Setelah terinstall maka akan muncul drive vboxsrv yang pathnya menuju folder yang kita share .

Wn7

Mengatasi freeze / hang mendadak pada Lubuntu 12.04

Udah lama ga nulis nih , postingan kali ini saya akan membahas bagaimana cara mengatasi freeze yang sering terjadi di TeaLinux OS 5.0 Kukicha , kenapa di judul tulisanya Lubuntu 12.04 . Soalnya “Kukicha” itu adalah remaster dari Lubuntu 12.04 jadi memiliki kernel yang sama . Jadi permasalahan kenapa sering hang itu karena ada masalah di kernelnya , jadi solusinya ya ganti kernel , gimana caranya ?

Pertama download file file yang di butuhkan http://kernel.ubuntu.com/~kernel-ppa/mainline/ dan cari “v3.4-precise/” folder. Download 3 file yang ada disitu yaitu

1. linux-headers-3.4.0-030400-generic_3.4.0-030400.201205210521_i386.deb

2. linux-headers-3.4.0-030400_3.4.0-030400.201205210521_all.deb

3. linux-image-3.4.0-030400-generic_3.4.0-030400.201205210521_i386.deb

Kalau pake Lubuntu 12.04  64bit download yang “amd64” selain “i386”.

Setelah di download tinggal jalanin/double klik aja terus install satu persatu lalu restart komputernya . Jika Komputer anda memiliki lebih dari satu OS maka akan ada tambahan pilihan grub 12.04 dengan kernel yang lama , untuk menghilangkannya hapus saja semua file kernel yang dulu di synaptic / hapus pilihannya di grub.cfg / biarin aja juga gpp (mungkin :p) .

Dah gitu aja gampang kan semoga bermanfaat.