Tuesday, 9 June 2015

LUA let's say hello

Lua yang dalam bahasa indonesia berarti bulan adalah bahasa pemograman dinamis yang berbasis skrip.
Sebagai bahasa skrip, Lua memiliki API dalam bahasa C yang relatif lebih sederhana dibandingkan bahasa skrip lainnya.
Untuk permulaan tentu saja kita harus mengenal suasana kerja Lua, mari kita mulai dengan contoh klasik,
Tapi sebelum itu download terlebih dahulu Lua Binaries (dalam contoh ini untuk windows)
win32 bin
win32 dll and includes(MingW4 Compatoble)
ekstrak semua file lalu open lua5.1.exe, akan muncul command, mari kita tampilkan hello word...
untuk menampilkan text tidak jauh berbeda dengan pemograman lainnya yaitu menggunakan print
print("hello world") atau dapat menggunakan io.write("hello world \n")

berikut contoh lain eksekusi skrip lua :
buka cmd lalu arahkan pada direktori lua, kemudian load file lua yang berformat ".lua" seperti berikut
ini akan mengeksekusi file prima.lua yang berisi skrip :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function gen (n)
  return coroutine.wrap(function ()
    for i=2,n do coroutine.yield(i) end
  end)
end
 
function filter (p, g)
  return coroutine.wrap(function ()
    for n in g do
      if n%p ~= 0 then coroutine.yield(n) end
    end
  end)
end
 
N=N or 10
x = gen(N)       
while 1 do
  local n = x()       
  if n == nil then break end
  print(n)       
  x = filter(n, x)   
end

 
 
 Pada artikel ini saya akan memperkenalkan object table pada bahasa pemrograman Lua. Bagi Anda yang sudah familiar dengan pemrograman, tentu array merupakan hal yang tidak asing lagi. Demikian juga dengan Lua, bahasa pemrograman ini juga memiliki kemampuan menyimpan array yang diistilahkan dengan object table.
Table pada Lua sebenarnya bukan merupakan value ataupun variable, tetapi table merupakan object. Table juga tidak memiliki panjang yang telah ditentukan, artinya Anda dapat menambahkan elemen sebanyak mungkin dan panjang table akan otomatis bertambah secara dinamis. Langsung saja kita lihat bersama contoh implementasi table.
Cara deklarasi table di Lua:
Anda dapat mendeklarasikan object table dengan mudah di Lua seperti halnya membuat variable.
1
2
3
local tabelBuah = {}
--atau
tabelBuah = {}
Kode di atas mendeklarasikan table dengan nama "namaTabelSaya." Namun table tersebut belum memiliki elemen. Langkah berikutnya adalah mengisi table dengan values yang Anda kehendaki.
Cara mengisi table:
Untuk mengisi table pada Lua, cukup menggunakan kode  
1
table.insert(namaTable, values)
Contoh untuk mengisi tabelBuah yang telah Anda buat adalah:
1
2
3
4
table.insert(tabelBuah, "Mangga")
table.insert(tabelBuah, "Jeruk")
table.insert(tabelBuah, "Apel")
table.insert(tabelBuah, "Nanas")
Mudah sekali bukan? Namun table pada Lua memiliki kemampuan yang jauh lebih fleksibel dibandingkan array pada bahasa pemrograman lainnya. Sebagai contoh, Anda dapat mengisi element table menggunakan table. Sepertinya terdengar membingungkan, tetapi silakan lihat kode di bawah ini untuk lebih jelasnya.
1
2
3
4
5
6
local tabelBuahDanWarna = {}
 
table.insert(tabelBuahDanWarna, {nama="Mangga",warna="Hijau"})
table.insert(tabelBuahDanWarna, {nama="Jeruk",warna="Jingga"})
table.insert(tabelBuahDanWarna, {nama="Aple",warna="Merah"})
table.insert(tabelBuahDanWarna, {nama="Nanas",warna="Kuning"})
Kode di atas mendeklarasikan table baru dengan nama "tabelBuahDanWarna," masing-masing elemen berisikan table anonymous seperti {nama="Mangga",warna="Hijau"}. Perlu diketahui, Lua mendukung penggunaan object-object anonymous, termasuk function dan table anonymous. Dengan contoh di atas, setiap element "tabelBuahDanWarna" memiliki values berupa tabel berisi nama dan warna. Anda bebas menentukan identifier bagi setiap element table, pada contoh ini digunakan "nama" dan "warna."
Cara memanggil values table:
Setelah membuat table, tentu saja Anda ingin menggunakannya. Ada beberapa cara untuk memanggil element sebuah table, namun pada umumnya Anda juga ingin tahu berapa banyak element yang tersimpan di dalam table tersebut. Untuk mengetahui panjang table atau jumlah element, cukup gunakan kode:
1
#tabelBuah
Contoh di atas akan menghasilkan panjang table bernama tabelBuah. Apabila hasilnya ingin dicetak bisa menggunakan print(#tabelBuah)
Lalu untuk memanggil suatu element pada table, Anda bisa menggunakan cara-cara berikut:
1
2
3
4
5
6
7
8
9
10
11
12
--Variabel a digunakan untuk menampung element table yang Anda kehendaki
a = tabelBuah[2]
--Variable x berisi integer
x = 3
a = tabelBuah[x]
--Memanggil element terakhir suatu table
a = tabelBuah[#tabelBuah]
 
 
--Menggunakan atribut/member suatu tabel
a = tabelBuahDanWarna[1].nama
b = tabelBuahDanWarna[1].warna
Setelah memahami kode di atas, baru tampak fleksibilitas dari table Lua. Anda dapat memanipulasi table dengan mudah, menggunakan posisi maupun atribut/nama member (tabelBuahDanWarna).
Tidak berhenti sampai di situ, Anda juga bisa melakukan iterasi terhadap element-element suatu table, contohnya:
1
2
3
4
5
6
7
8
for i,buah in ipairs(tabelBuah) do
  print(i..". "..buah)
end
print("\n")
   
for i,buahDanWarna in ipairs(tabelBuahDanWarna) do
  print(i..". Nama: "..buahDanWarna.nama.."\tWarna: "..buahDanWarna.warna)
end
Code di atas akan mencetak setiap element yang dimiliki oleh tabelBuah dan tabelWarnaDanBuah. Model iterasi ini mirip dengan foreach pada bahasa pemrograman C#, hanya saja pada Lua, Anda mendapatkan nilai dari index iterator yang disimpan dalam variable i.
Source code lengkap tutorial:
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
local tabelBuah = {}
local tabelBuahDanWarna = {}
 
local initializeTable = function()
  -- Isi tabelBuah
  table.insert(tabelBuah, "Mangga")
  table.insert(tabelBuah, "Jeruk")
  table.insert(tabelBuah, "Apel")
  table.insert(tabelBuah, "Nanas")
   
  --Isi tabelBuahDanWarna
  table.insert(tabelBuahDanWarna, {nama="Mangga",warna="Hijau"})
  table.insert(tabelBuahDanWarna, {nama="Jeruk",warna="Jingga"})
  table.insert(tabelBuahDanWarna, {nama="Aple",warna="Merah"})
  table.insert(tabelBuahDanWarna, {nama="Nanas",warna="Kuning"})
end
 
main = function ()
  initializeTable()
   
  for i,buah in ipairs(tabelBuah) do
    print(i..". "..buah)
  end
   
  print("\n")
   
  for i,buahDanWarna in ipairs(tabelBuahDanWarna) do
    print(i..". Nama: "..buahDanWarna.nama.."\tWarna: "..buahDanWarna.warna)
  end
 
end
 
main() 
 

Penggunaan Canvas Pada J2ME Untuk Game Programming

Pada kesempatan kali ini saya akan memberikan kamu tutorial mengenai Canvas pada J2ME yang biasanya sering digunakan di dalam pembuatan Game! Pastinya kamu sudah tahu ya mengenai game pada platform klasik ini.
Dalam tutorial kali ini kamu perlu mempersiapkan beberapa tools diantaranya:
  1. Java Development Kit (JDK) v1.7
  2. NetBeans dengan fitur Java Mobile Edition (ME).
  3. Oracle (TM) ME SDK 3.2 Device Manager.
Sebelumnya akan saya jelaskan apa itu Canvas pada J2ME dan kegunaannya untuk pembuatan game. Lebih spesifik lagi, dalam tutorial ini saya menggunakan kelas GameCanvas yang merupakan turunan (inheritance) langsung dari kelas Canvas yang juga merupakan turunan (inheritance) dari kelas Displayable.
GameCanvas kelas menyediakan dasar untuk user interface game. Selain fitur yang diwarisi dari Canvas (commands, input events, dll) juga menyediakan kemampuan-game spesifik seperti buffer grafis off-layar dan kemampuan untuk menanyakan status kunci. Sedangkan Canvas adalah kelas dasar untuk menulis aplikasi yang perlu untuk menangani peristiwa-tingkat rendah dan untuk mengeluarkan panggilan grafis untuk menggambar ke layar. Aplikasi game kemungkinan akan membuat banyak penggunaan dari kelas Canvas. Dari perspektif pengembangan aplikasi, kelas Canvas dipertukarkan dengan kelas standar Screen, sehingga aplikasi dapat mencampur dan mencocokkan kanvas dengan layar tingkat tinggi yang diperlukan.
Sampel J2ME ini menunjukkan penggunaan kanvas di sebuah MIDlet. Sebagian besar metode grafis yang tersedia yang digunakan di sini untuk memberitahu Anda dengan cepat mempelajari konsep pemrograman grafis dalam program J2ME. Hal ini juga menunjukkan dasar-dasar membuat game J2ME menggunakan kontrol dari telepon. Misalnya penanganan kiri, tombol kanan dan atas, bawah tombol dll.
Itu tadi adalah penjelasan mengenai Canvas yang akan kita gunakan dalam pembuatan sample game ini. Selanjutnya saya bakal menjelaskan bagaimana jalannya aplikasi sample game yang akan kita buat
Kita akan membuat sample game yang bernama Moving Circle, dimana terdapat sebuah circle (lingkaran) dalam satu layar yang bergerak tanpa henti. Seperti yang telah kita ketahui sebelumnya bahwa aplikasi J2ME akan berjalan diatas MIDlet yang sama kegunaannya dengan Activity pada Android. Untuk itu dalam pembuatan aplikasi game ini saya akan membuat 1 kelas Canvas dan 1 kelas main (MIDlet).
Langsung saja langkah pertama yaitu buka NetBeans-nya *yaiyaalaah, dan langsung New->Project, pilih Java ME Project -> Mobile Application.
New Mobile App Project
Next, beri nama project.
project name
Next, pilih emulator dan device nya.
New Project 2
Setelah selesai membuat project baru, maka akan muncul dalam project explorer seperti ini:
Project explorer
Kemudian kita buat kelas yang pertama yaitu kelas MovingCircleCanvas.java dimana kegunaan kelas ini adalah untuk menggambar dan menggerakkan objek (lingkaran) dalam sebuah kanvas.
new class
Klik, kemudian beri nama file:
MovingCircleCanvas.java

Setelah file MovingCircleCanvas.java sudah dibuat, maka Let's Code! Kelas MovingCircleCanvas.java ini meng-extends kelas GameCanvas (yang sudah dijelaskan sebelumnya) dan meng-implements Runnable untuk menjalankan Thread.

1
public class MovingCircleCanvas extends GameCanvas implements Runnable {

Buat beberapa variable yang akan digunakan:
1
2
3
4
5
6
7
8
9
public MIDlet mainMidlet;
public Graphics g;
public static int SLEEP_TIME = 1000 / 30; //waktu sleep Thread
public static int ballRadius, ballX, ballY;
public static int speedBallX = 5; //kecepatan bola terhadap koordinat x
public static int speedBallY = 3; //kecepatan bola terhadap koordinat y
public static int diameter = 10; //diameter bola
private static final int BOX_HEIGHT = 290; //resolusi height
private static final int BOX_WIDTH = 240; //resolusi width
Bangun konstruktor untuk kelas ini untuk dipanggil pada kelas Midlet.java (kelas Main)
1
2
3
4
5
public MovingCircleCanvas(MIDlet midlet) {
    super(false);
    mainMidlet = midlet;
    //this.setFullScreenMode(true); //fullscreen
}
Kemudian buat method untuk menjalankan Thread, dalam method ini kita bakal membangun game logic dari game yang akan kita buat.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public void mulai() {
    Thread runner = new Thread(this);
    runner.start();
}
 
public void run() {
    // TODO Auto-generated method stub
    g = getGraphics(); //get graphics
 
    ballRadius = 0; //radius bola terhadap screens
 
    ballX = ballRadius + BOX_WIDTH / 2; // posisi awal bola (x,y)
    ballY = ballRadius + BOX_HEIGHT / 2;
 
    while (true) {
        g.setColor(255, 255, 255); //bgcolor
        g.fillRect(0, 0, getWidth(), getHeight()); //
 
        drawCircle(ballX, ballY, diameter, 0xff0000); //bentuk bola
 
        /**
         * membuat text di layar
         */
        g.setColor(0, 0, 0); //color untuk font dibawah
        g.drawString("A Game Test By @ndhaperdana", BOX_HEIGHT / 2, BOX_WIDTH / 2, g.TOP | g.HCENTER);
        Font font = g.getFont();
        g.drawString("UP-DOWN to move ball", BOX_WIDTH / 2, BOX_HEIGHT / 2 + font.getHeight(), g.TOP | g.HCENTER);
        g.drawString("LEFT-RIGHT to change ball size", BOX_WIDTH / 2, BOX_HEIGHT / 2 + font.getHeight() * 2, g.TOP | g.HCENTER);
 
        ballX += speedBallX; //biar bola bergerak searah koordinat X
        ballY += speedBallY; //biar bola bergerak searah koordinat Y
 
        /**
         * collision detection (tumbukan terhadap screen canvas)
         */
        if (ballX - ballRadius < 0) {
            speedBallX = -speedBallX;
            ballX = ballRadius;
        } else if (ballX + ballRadius > BOX_WIDTH) {
            speedBallX = -speedBallX;
            ballX = BOX_WIDTH - ballRadius;
        }
        if (ballY - ballRadius < 0) {
            speedBallY = -speedBallY;
            ballY = ballRadius;
        } else if (ballY + ballRadius > BOX_HEIGHT) {
            speedBallY = -speedBallY;
            ballY = BOX_HEIGHT - ballRadius;
        }
        flushGraphics(); // untuk buffer pada kanvas
        repaint(); // Permintaan repaint untuk seluruh kanvas.
        try {
            Thread.sleep(SLEEP_TIME); //sleep thread
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
 
/**
 * void untuk menggambar bentuk bola
 *
 * @param x //letak bola
 * @param y
 * @param diameter //diameter
 * @param color //warna
 */
public void drawCircle(int x, int y, int diameter, int color) {
    g.setColor(color);
    g.fillArc(x - diameter / 2, y - diameter / 2, diameter, diameter, 0, 360);
}
Setelah selesai membuat game logic tadi, maka lanjut membuat method untuk meng-handle ketika navigation key di tekan.
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
37
38
39
/**
 * void keyPressed untuk action kalau nav.key ditekan
 */
public void keyPressed(int keyCode) {
    int gameAction = getGameAction(keyCode);
    if (Midlet.isPaused) {
        if (gameAction == UP || gameAction == DOWN || gameAction == LEFT || gameAction == RIGHT) {
        } //disable nav. key
        else {
            super.keyPressed(keyCode);
        }
    } else {
        switch (gameAction) {
            case UP:
                ballX += 5;
                speedBallX += 5;
                ballY += 5;
                speedBallY += 5;
                break;
            case DOWN:
                ballX -= 5;
                speedBallX -= 5;
                ballY -= 5;
                speedBallY -= 5;
                break;
            case RIGHT:
                if (diameter < 20) {
                    diameter += 1;
                }
                break;
            case LEFT:
                if (diameter > 0) {
                    diameter -= 1;
                }
                break;
        }
    }
    repaint();
}

Selesai sudah membuat dan menggerakkan suatu objek pada Canvas, sekarang kita lanjut untuk menjalankan file tadi dengan memanggil file tadi ke file utama Midlet.java dan beberapa tambahan untuk meng-handle jika tombol left dan right pada handphone ditekan.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package movingcircle;
 
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.*;
 
/**
 * @author Nanda w Perdana
 */
public class Midlet extends MIDlet implements CommandListener {
    public MovingCircleCanvas canvas;
    public Alert alert;
    public static boolean isPaused = false;
    private Command exitCmd = new Command("Exit", Command.EXIT, 99);
    private Command pauseCmd = new Command("Pause", Command.SCREEN, 1);
    private Command resumeCmd = new Command("Resume", Command.SCREEN, 0);
    private int tempX, tempY;
 
    public Midlet() {
        // TODO Auto-generated constructor stub
        canvas = new MovingCircleCanvas(this);
        canvas.addCommand(exitCmd);
        canvas.addCommand(pauseCmd);
        canvas.setCommandListener(this);
    }
 
    protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
        // TODO Auto-generated method stub
    }
 
    protected void pauseApp() {
        // TODO Auto-generated method stub
    }
 
    protected void startApp() throws MIDletStateChangeException {
        // TODO Auto-generated method stub
        Display display = Display.getDisplay(this);
        display.setCurrent(canvas);
        canvas.mulai();
    }
 
    public void commandAction(Command c, Displayable s) {
        // TODO Auto-generated method stub
        if (c == exitCmd) {
            try {
                destroyApp(true);
                notifyDestroyed();
            } catch (MIDletStateChangeException e) {
                e.printStackTrace();
            }
        } else if (c == pauseCmd) {
            isPaused = true;
            canvas.addCommand(resumeCmd);
            canvas.removeCommand(pauseCmd);
            tempX = canvas.speedBallX;
            tempY = canvas.speedBallY;
            canvas.speedBallX = 0;
            canvas.speedBallY = 0;
        } else if (c == resumeCmd) {
            isPaused = false;
            canvas.addCommand(pauseCmd);
            canvas.removeCommand(resumeCmd);
            canvas.speedBallX = tempX;
            canvas.speedBallY = tempY;
//          canvas.mulai();
        }
    }
}
1
  
Yap, selesai sudah kita membuat satu aplikasi sample game ini, langkah selanjutnya tinggal compile dan jalankan aplikasinya
Running    Running 2

Sekian tutorial dari saya, terimakasih, dan Let's Rock!

Konversi Decimal ke Octadecimal, Hexadecimal dan Binary

Buat yang baru belajar java, awalnya mungkin bingung mikir gimana sih algoritmanya buat konversi bilangan decimal ke biner, hexa atau octal. disini saya kasih cara singkat mengkonversi bilangan decimal menggunakan fungsi yang telah di sediakan oleh java.
Berikut code'nya yang simpel sekali dan semoga mudah dipahami
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Scanner;
 
public class KonversiDecimal {
  public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    System.out.print("Input Decimal : ");
    long dec=in.nextLong();
     
    System.out.println("konversi binary : "+Long.toBinaryString(dec));
    System.out.println("konversi hexadecimal : "+Long.toHexString(dec));
    System.out.println("konversi octadecimal : "+Long.toOctalString(dec));
  }
}
Untuk hasilnya, kira-kira seperti ini :
hasil konversi

Pembulatan bilangan decimal

Mau sharing dikit nih tentang pembulatan bialangan decimal di java, siapa tau bermanfaat buat yang baru belajar java. Mungkin ada tutorial sebelumnya tentang operasi matematika menggunakan java, tapi pembulatan ini belum dibahas, oleh karena itu saya mau kasih tutorial buat tambahannya. hehe
di dalam java ada 3 tipe pembulatan :
  1. Pembulatan keatas : Math.ceil();
  2. Pembulatan kebawah : Math.floor();
  3. Pembulatan terdekat : Math.round()
biar lebih mudah dipahami, bisa liat contoh program berikut ini :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PembulatanDesimal {
    public static void main(String[] args) {
        double a,b;
        a=4.71;
        b=4.41;
        System.out.println("Nilai a : "+a);
        System.out.println("Nilai b : "+b);
        System.out.println("Pembulatan ke atas a : "+Math.ceil(a));
        System.out.println("Pembulatan ke atas b : "+Math.ceil(b));
        System.out.println("Pembulatan ke bawah a : "+Math.floor(a));
        System.out.println("Pembulatan ke bawah b : "+Math.floor(b));
        System.out.println("Pembulatan ke terdekat a : "+Math.round(a));
        System.out.println("Pembulatan ke terdekat b : "+Math.round(b));
    }
}
Berikut screenshot program diatas :
pembulatan
Mudah bukan, kalo ada ang masih bingung, bisa langsung aja kontak saya

Sang Array

Karena tulisan tentang awal menulis puisi (baca:ngoding) di iOS terhambat oleh upload image skrinsutnya, jadi saya akan nulis tutorial pendek. Semoga bermanfaat .
Kali ini saya akan mencoba menjelaskan tentang object array di Objective-C yang datang dalam dua bentuk, mutable dan immutable atau NSMutableArray dan NSArray, awalan NS di class-class cocoa framework berasal dari kata NextStep, kenapa NextStep, mungkin karena sejarah abang Jobs ajah :D .
skip...skip...skip...
perbedaan mutable dan tidak, intinya kalo mutable itu bisa dimodif (CMIIW).
Pertama kita buat objectnya,
1
2
3
NSArray *arraySatu = [NSArray arrayWithObjects:@"saya",@"minum",@"air",@"di wc"];
 
NSMutableArray *arrayDua = [NSMutableArray arrayWithObjects:@"saya",@"makan",@"daging",@"sapi"];
Mari kita cari tahu tentang berapa jumlah object yang ada di arraySatu, caranya mudah saja
1
NSLog (@"isi arraySatu berjumlah %d",[arraySatu count]);

nslog untuk menampilkan log di konsol XCode dan untuk menghitung jumlah isi dalam array tinggal [arraySatu count].
Setelah tau berapa isi array, mari kita coba edit si arrayDua (karena arraySatu immutable), kita ganti object pertama dengan kata lain. Caranya juga gampang, tinggal seperti ini
1
[arrayDua replaceObjectAtIndex:0 withObject:@"dia"];
Selanjutnya, mungkin kita coba tambahkan object baru ke dalam arrayDua
1
[arrayDua insertObject:@"rasa ayam" atIndex:4];
atau bisa seperti ini
1
[arrayDua addObject:@"bawang"];
setelah menambahkan, kita coba menghilangkan object di index tertentu, caranya seperti ini
1
[arrayDua removeObjectAtIndex:3];
atau kita ingin menghilangkan object "makan", maka caranya seperti ini
1
[arrayDua removeObject:@"makan"];<br>//atau<br>[arrayDua removeObjectIdenticalTo:@"makan"];
atau ingin mengosongkan array?
1
[arrayDua removeAllObjects];
Oh iya, untuk menampilkan isi object array, kita akses dengan fast enumeration (forin)
1
2
3
4
5
int i = 0;
for (NSString *kata in arrayDua){
    NSLog (@"isi index ke %d adalah %@", i, kata);
    i++;
{
sekian dulu artikel ini, nanti akan kita lanjutkan "menuangkan" array dari sini ke UITableView, sambil menunggu aplot-an skrinsut artikel dasarnya :D