Monday, December 28, 2015

How To Make Program to Corrupt File (Java)

Sometime we intentionally want our file to be corrupted e.g. to test software reliability. So, I made a program in Java that intentionally corrupt file. Please be careful to use this program as this program will make your file corrupt and cannot be reverted. Please backup your file before making it corrupt.

OK, the logic is very simple. For each byte in the file, I simply put any random character (ASCII character is from 0 to 255). Here is the complete Java program:

import java.io.RandomAccessFile;
import java.util.Random;

/**
 *
 * @author arwankhoiruddin
 */
public class CorruptFile {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        String FILEPATH = args[0];

        System.out.println("File to corrupt: " + FILEPATH);
        System.out.println("File corruption process started");
     
        try {
            RandomAccessFile file = new RandomAccessFile(FILEPATH, "rw");
            Random r = new Random();
            for (int i=0; i                
                String dt = "" + (char) r.nextInt(255);
                file.seek(i);
                file.write(dt.getBytes());
            }
            file.close();
         
            System.out.println("File " + FILEPATH + " has now been corrupted. Enjoy!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


Sunday, December 27, 2015

Tips Berwisata di Saat Liburan Panjang bagi Pembenci Macet dan Keramaian

Saya adalah seorang yang tidak suka pada macet dan tempat wisata yang terlalu ramai. Saya tidak suka macet karena macet bikin waktu serasa cuma habis di jalan. Saya tidak suka tempat wisata yang terlalu ramai karena tujuan berwisata adalah menikmati alam dan menikmati quality time bersama keluarga. Di tempat wisata yang terlalu ramai, waktu biasanya akan dihabiskan untuk nyari tempat parkir, nyari tempat kosong untuk berteduh atau bermain, dan susah sekali untuk bisa menikmati tempat wisatanya sendiri karena justru yang terlihat adalah ramainya.

Pada liburan panjang seperti ini (natal dan tahun baru di akhir minggu ditambah dengan liburan anak sekolah), kondisi jalan dan tempat wisata mainstream sungguh sangat tidak menarik. Di mana-mana jalanan macet, dan di tempat-tempat wisata, terlalu banyak orang yang berkunjung.

Untuk menyiasati, ada beberapa hal yang bisa dilakukan:
1. Jangan lewat jalan yang biasa dilewati orang. Carilah jalan alternatif (lebih baik gunakan aplikasi peta seperti google map atau waze. Mencari jalur alternatif sendiri tanpa bantuan aplikasi kadang justru akan menghabiskan waktu ketika menemui jalan buntu).

2. Carilah objek wisata baru yang belum terlalu banyak diketahui orang. Objek wisata baru berarti (a) kemungkinan belum ada retribusi masuk (b) parkir gratis (c) tempat belum terkelola dengan baik, atau (d) siap-siap kecewa karena ternyata kondisinya tidak seperti yang diharapkan. Minggu kemarin, saya dan keluarga mendengar ada air terjun baru yang ditemukan beberapa kilo dari rumah. Setelah mendaki gunung lewati lembah, melewati jalan naik turun dan hutan jati yang sangat lebat, ditemani dengan puluhan nyamuk yang setia mengikuti dan menggigit kita sepanjang jalan, akhirnya sampailah kita pada ujung jalan yang dimaksud, dan... akhirnya perjalanan panjang kami sia-sia karena airnya tidak mengalir, saudara-saudara. Hahahaha....

3. Berjalan saja ke jalan-jalan yang belum pernah kita lewati, ikuti feeling. Berlibur tidak harus ke tempat wisata. Menurut saya, mengetahui jalan-jalan baru, tempat-tempat baru, berkenalan dengan orang baru (dan yang jelas, makan di tempat baru) merupakan wisata yang lebih me-refresh.

Itu sedikit tips dari saya. Sebelum saya tutup, ada beberapa pesan dari saya:

1. Wisata itu untuk menikmati, bukan untuk selfie. Sudah banyak sekali korban manusia dan tempat-tempat indah yang jadi korban selfie yang tidak bertanggung jawab.

2. Wisata itu merefresh pikiran, bukan mem-"bunek"-kan pikiran karena jalan macet dan antre wahana yang lama.

Matur nuwun.

Friday, December 25, 2015

Install Python 3 and use VirtualEnv (OS X)

  1. Install xcode: $ xcode-select --install
  2. Install homebrew: $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  3. Create .bash_profile: $ touch ~/.bash_profile
  4. Put this line inside .bash_profile: export PATH=/usr/local/bin:$PATH
  5. Install python3: $ brew install python3
  6. Create virtual environment. To make it easily found, create it under home: $ cd ~ && pyvenv arwan
  7. Activate the virtual environment created: $ source arwan/bin/activate
  8. Now you can start working in the new virtual environment. Note that it is worth to look at requirements.txt to see required packages on certain projects.

Pull Older Version from Git

  1. Clone the current repository: $ git clone
  2. Go to the cloned directory: $ cd
  3. Find the sha1 of the commit to pull. For stash, click on the commit and look at the address bar. It will be the last part of the url. For example, the sha1 for http://mystash.arwan.com/repos/arwanproj/commits/0b004fdb420838ca04c15b25ad2e0b66a5693963 will be 0b004fdb420838ca04c15b25ad2e0b66a5693963 
  4. Fetch the version based on the sha1 number found: $ git fetch origin
  5. Checkout: $ git checkout FETCH_HEAD

Monday, November 23, 2015

Understanding *args and **kwargs in Python

I need some time figuring out what is behind *args and **kwargs. Finally I understand it, so I want to share it with you here.

First of all, you need to know that what you need to understand here is the asterix (*), not the "args" and "kwargs". So if you write f(*params, **oparams) and f(*args, **kwargs), they both will behave similarly.

* is used to pass varied length of arguments. Here is an example on how to use *
def test_args(a, *b):

 def test_args(a, *b):  
   print "normal variable: ", a  
   print "first argument: ", b[0]  
   print "second argument: ", b[1]  
   print "third argument: ", b[2]  
 test_args('arwan', 1,2,3,4,5)  

From the example, "a" is single variable while "b" is varied length of argument. Thus, the first argument will be passed to "a" where the next variable will be passed to "b". Thus, all arguments (1,2,3,4,5) will be passed to "b" while only "arwan" will be passed to "a".

Double asterix (**) is used for varied argument with key. Here is an example.


 def test_args(a, **c):  
   print "normal variable: ", a  
   print "first argument: ", c['one']  
   print "second argument: ", c['two']  
   print "third argument: ", c['three']  
 test_args('arwan', one=1, two=2, three=3)  

In this example, the first argument is passed to "a", while next variable will be passed to "c".  Please notice that the way we pass the variable is different with single asterix(*). For two asterix (**), we need to define key for each value we pass. Note that the key is "one", "two" and "three" while the values are everything after "=".  The number of argument passed may be varied.

To make everything even more clear, here is another example to combine both.

 def test_args(a, *b, **c):  
   print "normal variable: ", a  
   print "arg 0: ", b[0]
   print "arg 1: ", b[1]
   print "arg 2: ", b[2]
   print "first argument: ", c['one']  
   print "second argument: ", c['two']  
   print "third argument: ", c['three']  
 test_args('arwan', 1, 2, 3, 4, one=1, two=2, three=3)  

Sunday, October 25, 2015

Stack Implementation in Python

Stack is one of important concepts in data structure. Stack can be defined as abstract data type (ADT) that collects items with LIFO (last in, first out) principle. Two operations are known for stack i.e. push and pop. Push will add an item into stack, while pop will remove the last element that was added into stack. 

You may think stack concept as if you arrange your plates. You will put a plate above other plates, but when you want to take one plate, you will take it from the top.

To implement it in python, you will have at least three methods i.e. __init__, push, and pop. However, here we will add some more methods i.e. isEmpty (to check if the stack is empty), peek (to get the item at the top) and size(to get the number of item(s) in the stack). Here are the implementation in python:

 class Stack:  
   def __init__(self):  
     self.items = []  
   def isEmpty(self):  
     return self.items == []  
   def push(self, item):  
     self.items.append(item)  
   def pop(self):  
     if not self.isEmpty():  
       return self.items.pop()  
   def peek(self):  
     if not self.isEmpty():  
       return self.items[len(self.items)-1]  
   def size(self):  
     return len(self.items)  
So, now you may implement the stack like following:
 s = Stack()  
 s.push('arwan')  
 s.push('ahmad')  
 s.push('khoiruddin')  
 print(s.isEmpty())  
 s.pop()  
 print(s.size())  
The output will be
 False  
 2  
By the way, I am using Python 3. However, for python 2 implementation, for this code, you will just need to change the print command. So it will be like this.
  s = Stack()   
  s.push('arwan')   
  s.push('ahmad')   
  s.push('khoiruddin')   
  print s.isEmpty()   
  s.pop()   
  print s.size()  
Hope it helps.

Thursday, October 8, 2015

Dragon Ball Super Opening Lyrics (Chozetsu - Dynamic)

Itsuka Togireta 
yume no tsudzuki Hajimeyou 
 
Hoshi o tsunagete 
Sora ni tobira kakebaii 
 
arata na suteeji wa 
Kami ni idomu basho 
 
Kyouretsu - mouretsu -dynamic! Let's Go! GO ! daipanikku 
Makeru to tsuyoukunaru 
 
Minohodo shirazu ni wa 
koukai toka genkai toka nai mon 
 
 Souzetsu-chouzetsu-dynamic! Let's Go! Yes ! renda kikku 
abisete mushaburui 
 
sugee koto ga matterun da ze

Friday, July 31, 2015

Free overnight stay at KLIA2

I landed at Malaysia yesterday night. My plan was to find a hotel nearby and go to KL in the morning. I saw some quite cheap hotels near KLIA2. Luckily, while in waiting room before flight, I met a new friend that will fly to Laos and have overnight transit at KLIA2. A new conversation will give us a new friend, and a new friend will always benefit us in any way. He told me to just make a free overnight stay at KLIA2. Hmmm... I should try.

In KLIA2, most of the chairs are not meant to be used to sleep. They design the chair so that it is almost impossible for a person to lay down on the chair. But, "most" means that we will find some chairs that can be comfortably used for sleeping. The chairs are above the Departure hall in 3rd Floor (just another floor above gate to international departure).

Fiuuuuh, my pocket is saved for one night... thanks, pal...

Thursday, July 23, 2015

Download YouTube video as MP3

There are some ways to convert youtube video to mp3. I used to use online converter, but it fails when the video is lengthy (say more than 30 minutes). From my experience, the most convenient way for me is using youtube-dl (I love terminal. It is command based, so it might not very convenient for those who love GUI-based app). Here are the most convenient steps that I use:

## INSTALLATION ##
The most convenient way to install is using pip. Followings are full steps for installation:
1. Install python
2. Download pip installer here.
3. Go to folder where you put get-pip.py then write this in your terminal
$ python get-pip.py
4. Now you have pip installed. Time to download youtube-dl. Type this in your teminal
$ pip install youtube-dl
## DOWNLOAD TIME ##
1.  Now you can download youtube video and convert it to mp3. Just type this in your terminal (change the video URL to the one you want to download)
$ youtube-dl --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=S0hRlPacL5U
2. If you are running behind proxy, you need to add into your command
$ youtube-dl --proxy http://username:password@proxy_address:proxy_port --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=S0hRlPacL5U

Enjoy

Thursday, June 4, 2015

Tips Murah Parkir Menginap di Stasiun Jogja

Bismillah...

Menjadi seorang pelanggan PJKA (Pulang Jumat Kembali Ahad) seperti saya memang perlu trik-trik khusus di perjalanan, baik itu trik untuk menyiasati perjalanan agar terasa nyaman, tidak melelahkan, tapi juga trik bagaimana agar mengeluarkan duit seminimal mungkin. Pada posting kali ini saya ingin berbagi tentang parkir motor menginap yang murah di stasiun Jogja.

Di Jogja, ada dua stasiun besar, yaitu Lempuyangan dan Tugu. Selain itu, ada beberapa stasiun kecil (yang saya tahu Stasiun Wates dan Stasiun Maguwo atau bandara). Dari stasiun tersebut, saya hanya akan membandingkan dua stasiun besar di Jogja saja, yaitu Lempuyangan dan Tugu.

Stasiun Tugu
Di Stasiun Tugu, setau saya hanya ada parkir di area dalam stasiun. Tarif parkir di tempat ini sudah begitu banyak dikeluhkan orang, bahkan beberapa kali malah sempat masuk berita. Bagaimana tidak mengeluh, tarif yang digunakan adalah tarif per jam. Kalau kita menginap sehari semalam, maka tarif sehari semalam kira2 sebesar 15-18 ribu, sehingga untuk PJKA seperti saya, maka untuk 6 hari saja, kalau saya parkir di stasiun tugu, saya harus merogoh kocek sebesar 15x6=90 ribu rupiah.

Stasiun Lempuyangan
Untuk Lempuyangan, kita bisa parkir di dalam stasiun maupun di luar stasiun. Kalau parkir di dalam stasiun, parkirnya per hari adalah sebesar 8 ribu rupiah. Sedangkan di luar stasiun, rata2 tarifnya adalah sebesar 3 ribu rupiah. Jaraknya sama sekali tidak jauh dari stasiun. Hanya seberang stasiun, dan di sana sudah berjajar banyak rumah yang disulap menjadi tempat parkir menginap.

Anda parkir di dalam atau di luar stasiun sebenarnya tergantung mantepnya dimana sih. Kalau saya, lebih memilih di luar karena lebih murah. Setiap minggu, saya hanya merogoh kocek biasanya 20 ribuan atau kurang (tergantung mas parkirnya pas ngitung masih ngantuk atau tidak. Hehehe). Tapi kalau anda penggemar parkir yang terkomputerisasi, maka parkirlah di dalam stasiun. Paling2 kan "cuma" 50 ribu. Hehehe... :D

Anda PJKA tapi dapet keretanya dari Stasiun Tugu?
Hmmm... saya juga pernah mengalami yang demikian. Cara saya mensiasatinya adalah sebagai berikut: parkir motornya di stasiun Lempuyangan lalu naik ojek ke Stasiun Tugu. Lempuyangan ke Tugu sebenarnya tidak jauh, jadi kalau nawar ojek sekitar 15 atau 10 ribu sih harusnya boleh.

Kesimpulan
Parkir yang paling mahal: Stasiun Tugu (15-18 ribu per hari)
Parkir yang paling murah: Di luar Stasiun Lempuyangan (3 ribu per hari)
Rekomendasi untuk yg parkir inap: Berangkat dari Tugu atau Lempuyangan, selalu usahakan untuk parkir motor di luar stasiun Lempuyangan

Semoga bermanfaat.... :D

Wednesday, April 15, 2015

Some important adb commands (android)

In Mac, the adb is located at /Library/Android/sdk/platform-tools/

list connected devices
./adb devices
list installed applications
./adb shell pm list packages
clean app data
./adb shell pm clear com.scramphoto.scramphoto
uninstall app using adb
./adb uninstall com.scramphoto.scramphoto
install app using adb
./adb install -r ~/Download/scramphoto.apk
log for adb
./adb logcat
save logcat to text
./adb logcat -d > ~/Documents/logcat.txt
clear logcat
./adb logcat -c 
browse directory on device
./adb shell ls /sdcard/Pictures
copy files from device to computer
./adb pull /sdcard/Pictures/ ~/Documents/Pictures 
remove files on device 
./adb shell rm /sdcard/Pictures/* 

Sunday, March 15, 2015

Sikuli Tutorial - Detect any activity in monitor

This script is used if we want to detect if any activity(ies) happen in monitor using Sikuli. The idea is simple:
1. Capture the screen,
2. Take another capture after certain time interval
3. Compare the second capture to the first
4. Delete temporary image

Here is the script (I use python script)
def activityDetected():
    screen = Screen()
    while True:
        file = screen.capture(screen.getBounds())
        sleep(2)
        file2 = screen.capture(screen.getBounds())
        f = Finder(file)
        f.find(Pattern(file2).exact())
        matchVal = f.hasNext() 
        f.destroy()
        
        os.remove(file)
        os.remove(file2)
        if matchVal:
            return False
        else:
            return True

Hope this helps you.

Tuesday, March 10, 2015

Automated Software Testing: Handling Memory Problem in Sikuli

One of the most important step in software engineering is software testing. Proper software testing will dramatically reduce the risk during software implementation. By the end of the day, testing will ensure your stakeholder about the quality of your software.

When you find a bug, you will assign a task to developer to fix it. When the developer has fixed the bug, it will be reassigned back to you. When you find another bug, you and the developer will do it again and again. Bad news is, when your program is fixed in one part, sometime it will make trouble in other part. Sometime what you have found as bug and then fixed, it will be bug again when the developer works in another part or your software. Thus, we have to do thorough testing for each release to ensure that no bugs are re-introduce.

Isn't it boring?

Yes, doing repetitive task (especially if the developer make daily release) will be boring. Thus, we need to automate our testing. You can do automation with any software you like. But, as I use Sikuli, here I share my hands-on experience with Sikuli.

Sikuli provides you handy API for GUI testing. However, when you want to do repetitive testing or combinatorial testing (you combine each choices in each features you have in your software), sikuli will have a problem with its heap memory especially when you have a lot of click() method. Here what I did for handling this problem:

1. In Java, we can force to release unused memory using System.gc(). In python, we can use gc.collect(). But as Sikuli runs Jython, we cannot use both. So, we have to do another way.

2. The problem is with memory. So, we have to minimize our variable in memory as much as possible. Thus, once we know that the memory is no longer used, then directly delete it from memory.

3. Here's an example for what I have done:

So, instead of using click([capture]), I put the image as one variable. So you do it by entering the name of the variable like this

size_500 =

And then you press "take screenshot" button 

Next thing you do is to click to the variable declared.

Lastly, if you think this screenshot will only used once, then directly delete the variable from memory by using

del size_500

Hope this helps if you have same problems with me.

=====
Thanks for ScramSoft for giving me amazing experiences.

Tuesday, March 3, 2015

Tips memulai riset - mencari topik dan literatur

Ketika kita mau mendorong sebuah mobil, maka tahap yang paling susah adalah ketika mulai mendorong dan belum bergerak. Ketika mobil sudah bergerak, maka tenaga yang diperlukan tidak sebanyak sebelum bergerak. Dalam banyak hal di hidup kita, memulai biasanya juga merupakan tahap yang paling susah, termasuk dalam urusan riset. Banyak hal yang membuat kita bimbang: topik apa? harus mulai belajar darimana? dan sebagainya.

Kebimbangan pertama: mencari topik

Untuk mencari topik, kita bisa memulai dengan mencari kata kunci yang saat ini sedang trend di dunia. Pencarian ini tentu saja bergantung pada bidang yang anda tekuni. Apabila anda adalah orang social science, maka riset anda bisa dimulai dari permasalahan yang menurut anda penting dan kira-kira bisa anda cari solusinya. Jika anda bingung, bisa mencoba memulai dari google trend (http://www.google.com/trends/?geo=ID) atau mencari trending topik di twitter, atau juga dengan skimming judul-judul berita di situs-situs berita. Atau juga dengan diskusi dengan orang yang anda anggap kapabel di bidang anda.

Jika anda adalah orang informatika, anda bisa memulai dari situs-situs semacam IEEEXplore (http://ieeexplore.ieee.org/Xplore/home.jsp). Di sana ditampilkan trending topic sekaligus juga kata yang paling banyak dicari oleh orang akhir-akhir ini.

Kenapa memulai dari yang tren? Apakah kita harus ikut arus? Meneliti topik yang sedang tren berarti kita akan diuntungkan dengan paling tidak dua hal: (1) Topik itu masih banyak dicari orang, sehingga kelak ketika kita publikasi, peluang ilmu kita terpakai lebih besar (2) Kita akan cenderung lebih mudah mencari literatur, sehingga proses riset kita bisa lebih lancar.

Kebimbangan kedua: mencari literatur

Setelah topik ditemukan, biasanya permasalahan yang selanjutnya dihadapi adalah mencari, membaca, dan memahami literatur. Biasanya pencarian literatur dilakukan melalui mesin pencari. Dengan cara ini, permasalahan yang dihadapi adalah bahwa kebanyakan (atau beberapa) literatur yang ditemukan tersebut berbayar. Kalau kita kuliah di luar negeri, kebanyakan kampus di luar berlangganan banyak jurnal, sehingga kita bisa bebas mengunduh artikel-artikel yang dibutuhkan. Akan tetapi karena harganya mahal, hanya sedikit kampus di Indonesia yang mampu berlangganan. Alternatifnya bisa melalui PNRI (Perpustakaan Nasional Republik Indonesia) - http://e-resources.perpusnas.go.id/index.php atau dengan mencari sendiri di google, tapi dengan melakukan sedikit trik sebagai berikut:

Misal kita ingin mencari paper-paper tentang "profilometry", maka ketika mencari di google, jangan langsung mengetikkan kata kunci tersebut, tapi di depannya kita tambah dengan "filetype:pdf". Penambahan kata kunci ini akan membuat hasil pencarian kita langsung mengarah pada artikel-artikel PDF yang bisa langsung kita unduh. Pada gambar berikut, anda bisa perhatikan bahwa hasilnya adalah file-file yang tipe-nya PDF dan bisa langsung kita unduh. Perhatikan bahwa hasil pertama tidak diawali dengan [pdf]. ini berarti bahwa konten itu berbayar. Jika anda mau cara ekonomis, silakan klik hasil-hasil yang diawali dengan [pdf] saja.


Saking banyaknya file yang ditemukan, mungkin kita akan bingung mana yang harus diunduh dan dibaca. Ngunduh sih gampang, bacanya itu yang susah. Hahaha.... hmm... beberapa tips berikut mungkin bisa digunakan:

1. Mulailah dengan skimming judul-judul yang ada di sana. Unduhlah judul-judul yang kira-kira menarik atau relevan.
2. Jika belum klik alias tidak bisa mendapatkan sense sehingga bingung mana yang menarik, relevan, dan harus diunduh, mulailah dari melihat sitasi dari paper tersebut. Pada contoh gambar di atas, paper kedua disitasi oleh 1596 paper lain (bagian cited by). Unduhlah paper-paper seperti ini, yang mempunyai sitasi banyak terlebih dahulu.
3. Jangan hanya berhenti di tab pertama (gambar di bawah). Mungkin google sudah punya algoritma agar pencarian yang paling relevan dengan kita ada di halaman depan. Tapi percayalah, untuk urusan riset, mungkin anda akan menemukan yang menarik di tab ke-15 atau 25.

Setelah mengunduh paper-paper terpilih, saatnya untuk mulai membaca. Untuk menajamkan insting, lebih baik mengubah nama file dari paper yang telah diunduh sesuai dengan judulnya. Dengan demikian, kita bisa melakukan skimming lagi hanya dari judul-judulnya (hal ini juga bisa dilakukan dengan menggunakan software seperti Mendeley. Mendeley secara otomatis akan mendeteksi judul dan informasi lain dari paper yang kita punya). Contoh yang saya punya adalah seperti ditampilkan di gambar berikut.



Jika langkah ini sudah dilakukan, maka sebelum membaca satu demi satu, kita bisa membuka explorer (windows) atau Finder (mac) di folder tempat kita menaruh paper-paper yang sudah diunduh dan diganti nama file-nya. Lalu mulailah dengan membaca judulnya satu demi satu. Catatlah informasi-informasi penting yang bisa di-ekstrak dari judul yang ada.

Kebimbangan selanjutnya: membaca dan memahami

Langkah selanjutnya adalah membaca. Bagi yang sudah menguasai bidang riset tersebut, maka membaca adalah hal yang tidak terlalu susah. Tapi bagi yang baru memulai, biasanya akan mengalami kesusahan. Bagi yang baru, bacalah bagian-bagian penting dari papernya saja (abstrak, pendahuluan, kesimpulan, dan grafik-grafik serta angka-angka di pembahasan). Catatlah informasi penting dari bagian-bagian itu. Untuk tahap ini, jangan terlalu khawatir dengan pengetahuan kita tentang istilah-istilah teknis di paper tersebut. Yang penting catat dulu. Salah satu contoh catatan yang saya buat untuk riset saya dulu adalah sebagai berikut:


Setelah catatan sudah kita buat, maka kita bisa melihat mana dulu yang harus dipelajari. Dalam contoh yang saya buat, sepertinya Fourier transform dan Phase Shift menarik untuk dipelajari, karena object yang digunakan adalah objek nyata dan bukan smooth surface. Untuk mempelajari, mungkin sedikit tips ini akan membantu juga:
1. Ambil kata kuncinya, lalu ketikkan di google. Kalau menemukan artikel wikipedia atau tutorial atau slide, mulailah dari sana. Pengalaman saya, untuk teori-teori yang belum kita kuasai, jangan memulai membaca dari paper.
2. Jika ada kuliah atau tutorial di youtube, mulailah dari sana.

Setelah tahap ini dilalui, maka ucapkanlah pada diri anda sendiri:

SELAMAT DATANG DI DUNIA RISET.