Saturday, March 9, 2013

Mempersiapkan Sistem untuk Scala

Gw membuat Ngajak Jalan–sebuah situs jodoh untuk mencari pacar–dengan Scala. Minggu lalu gw menulis tentang perkenalan Scala dari Java yang menunjukkan bagaimana sebuah program Java jika ditulis ulang dengan Scala. Berdasarkan masukan, kali ini gw akan menjabarkan bagaimana mempersiapkan sistem kamu untuk development Scala.

0. Install Java Development Kit

Ambil Java terbaru dari http://www.oracle.com/technetwork/java/javase/downloads/index.html dan lakukan instalasi sesuai sistem kamu. Setelah selesai, cek instalasi kamu dengan menjalankan java -version dan javac -version:

septerra:~ wiradikusuma$ java -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build 1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

septerra:~ wiradikusuma$ javac -version
javac 1.7.0_13

1. Install Scala Development Kit

Ambil Scala terbaru dari http://www.scala-lang.org/downloads dan lakukan instalasi sesuai sistem kamu. Setelah selesai, cek instalasi kamu dengan menjalankan scala -version:

septerra:~ wiradikusuma$ scala -version
Scala code runner version 2.10.0 -- Copyright 2002-2012, LAMP/EPFL

Kalau kamu melihat pesan kesalahan seperti "command not found", masukkan direktori bin dari instalasi Scala kamu ke dalam PATH.

2. Install IntelliJ IDEA Community Edition

Langkah ini opsional, tapi sangat disarankan.

Ambil IntelliJ IDEA Community Edition terbaru dari http://www.jetbrains.com/idea/download/ dan lakukan instalasi sesuai sistem kamu. Setelah selesai, buka programnya.

Di menu Quick Start, pilih Configure lalu Plugins. Klik Browse repositories… lalu pilih Scala dari daftar. Klik ikon Download and Install di sudut kiri atas dan unduh plugin Scala untuk IDEA. Setelah selesai, klik Close lalu OK. Pilih Restart ketika diberikan pilihan. Tunggu sebentar dan kamu akan melihat kembali tampilan menu awal.

Klik Create New Project dan pilih Scala Module. Masukkan hello-world untuk Project name, tentukan Project location sesuai yang kamu inginkan, lalu klik New… untuk membuat Project SDK baru—arahkan ke lokasi Java Development Kit kamu.

Klik di bagian Set Scala Home dan arahkan ke lokasi Scala Development Kit kamu. Centang Make global libraries. Klik Finish dan biarkan IDEA menyiapkan struktur awal proyekmu.

IntelliJ IDEA CE Scala blank project

Klik-kanan src, pilih New > Scala Class lalu masukkan scala0.HelloWorld (tanpa spasi) untuk Name dan Object untuk Kind. Klik OK. Kamu akan melihat class HelloWorld dalam package  scala0 yang disimpan dalam file HelloWorld.scala dalam direktori src/scala0. Kalau familiar dengan Java, kamu pasti bergumam, "Oh, mirip ya." Buka HelloWorld dan ganti isinya dengan ini:

package scala0

/**
 * Menampilkan "Hello World" di layar.
 *
 * @author Thomas Wiradikusuma
 */
object HelloWorld extends App {
  println("Hello World")
}

Jangan lupa ganti nama gw dengan namamu :)

Arahkan kursor ke teks HelloWorld di dalam dokumen yang sedang terbuka, klik-kanan dan pilih Run 'HelloWorld.main()'. IDEA akan mengompilasi program kamu, menjalankannya dan menampilkan hasilnya di bawah. Hore, program Scala pertama kamu!

Hello World

Process finished with exit code 0

Untuk menjalal Scala, kita tidak perlu membuat file apalagi proyek seperti di atas. Buka Command Prompt (atau program ekuivalen seperti Shell atau Terminal) dan ketik scala.

septerra:~ wiradikusuma$ scala
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

Sekarang kamu masuk ke dalam Scala REPL (Read-Evaluate-Print Loop), ini adalah lingkungan interaktif untuk menjajal kode. Ketik println("Hello World") di kursor.

scala> println("Hello World")
Hello World

Dengan REPL, kamu bisa menjalal kode tanpa menunggu proses kompilasi yang lambat (compiler Scala memang lambat, kita akan membahasnya di hari lain termasuk cara mengatasinya). Coba masukkan 1 + 1 atau Math.cos(30), seperti kalkulator!

Sementara menunggu tulisan berikutnya, kalau kamu masih jomblo, silakan mampir ke Ngajak Jalan, tempat untuk mencari TTM, pacar sampai istri.

Saturday, March 2, 2013

Perkenalan Scala dari Java

Belakangan ini gw sibuk mengembangkan Ngajak Jalan, sebuah situs jodoh untuk mencari pacar. Karena sedang belajar Scala, gw membuat Ngajak Jalan dengan Scala.

Banyak yang bilang bahwa Scala adalah "Java yang lebih baik". Terlepas dari benar atau tidaknya, gw akan menunjukkan bagaimana sebuah program Java ditulis dalam Scala. Oh ya, iklan dulu: Untuk yang jomblo, jangan lupa bergabung di Ngajak Jalan. OK, lanjut :)

Andaikan kita punya input.txt dengan isi sebagai berikut:

Nama	Usia
Thomas	30
Budi	28
Wati	25
Jojon	38
Santi	20

Kita ingin membaca dokumen tersebut lalu menampilkan isinya jika usia lebih kecil atau sama dengan 30. Berikut ini tampilan yang diharapkan:

Thomas = 30
Budi = 28
Wati = 25
Santi = 20

Dengan Java:

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Program {
    public static void main(String args[]) throws Exception {
        Scanner scanner = new Scanner(new File("input.txt"));
        List<String> lines = new ArrayList<String>();

        scanner.useDelimiter("\n");

        while (scanner.hasNext())
            lines.add(scanner.next());

        scanner.close();

        lines = lines.subList(1, lines.size());

        for (String line : lines) {
            String[] tokens = line.split("\t");
            String name = tokens[0];
            int age = Integer.parseInt(tokens[1]);

            if (age <= 30)
                System.out.println(name + " = " + age);
        }
    }
}

Mari kita "Scala-kan" program di atas. Agar mudah dimengerti, mari kita lakukan bertahap. Tahap pertama adalah menghilangkan titik koma dan men-Scala-kan elemen yang terpaksa harus diubah (agar tidak compile error):

import java.io.File
import java.util.Scanner
import collection.mutable.ListBuffer

object Program {
    def main(args: Array[String]) {
        val scanner = new Scanner(new File("input.txt"))
        var lines = new ListBuffer[String]()

        scanner.useDelimiter("\n")

        while (scanner.hasNext())
            lines.+=(scanner.next())

        scanner.close()

        lines = lines.slice(1, lines.size)

        lines.foreach(line => {
            val tokens = line.split("\t")
            val name = tokens(0)
            val age = Integer.parseInt(tokens(1))

            if (age <= 30)
                System.out.println(name + " = " + age)
        })
    }
}

Ini program Scala lho, mirip Java kan? Bagaimana rasanya tanpa titik koma? Lebih enak dilihat? Mari kita hilangkan beberapa noise:

import java.io.File
import java.util.Scanner
import collection.mutable.ListBuffer

object Program {
    def main(args: Array[String]) {
        val scanner = new Scanner(new File("input.txt"))
        var lines = new ListBuffer[String]()

        scanner useDelimiter "\n"

        while (scanner.hasNext)
            lines += scanner.next

        scanner.close()

        lines = lines slice(1, lines.size)

        lines.foreach(line => {
            val tokens = line split "\t"
            val name = tokens(0)
            val age = tokens(1).toInt

            if (age <= 30)
                println(s"$name = $age")
        })
    }
}

Mirip program sebelumnya, tapi sedikit lebih "bersih". Kita juga menggunakan fitur baru di Scala 2.10 bernama string interpolation. Mari kita peringkas lagi dengan lebih idiomatik:

import io.Source._

object Program extends App {
    val lines = fromFile("input.txt").getLines().toList drop 1
    val tokens = lines.map(_ split '\t').map(arr => (arr(0), arr(1).toInt))

    tokens.foreach(
        _ match {
            case (name, age) if age <= 30 => println(s"$name = $age")
            case _ =>
        }
    )
}

OK, ini mulai terlihat asing—mari kita bahas.

  • extends App adalah shortcut untuk main() yang biasa kamu kenal.
  • fromFile adalah metode dari io.Source untuk membaca file.
  • map adalah fungsi yang mentransformasi sebuah koleksi ke koleksi lain. 
  • map yang pertama mengubah list String ke list Array ([Nama,Usia],[Thomas,30],…). 
  • map yang kedua mengubah list Array ke list Tuple ((Nama,Usia),(Thomas,30),…). Tuple ini dibutuhkan untuk match-case.

Kalau program kita diubah ke bahasa manusia:

  • Baca input.txt baris per baris, taruh di list dan buang elemen pertama.
  • Untuk setiap elemen di list, pisahkan dengan TAB, lalu buat berpasangan (nama-usia).
  • Untuk setiap elemen di list, namai name untuk data kiri dan age untuk data kanan, tapi hanya kalau elemennya merupakan sebuah pasangan dan age lebih kecil atau sama dengan 30. Tampilkan di layar.

Bagaimana? Menarik? Kalau ada yang belum jelas, mohon tulis di komentar supaya bisa gw jawab. Kalau peminatnya banyak, gw akan melanjutkan blognya. Jangan lupa kasih ide apa yang perlu dibahas :) Eh tunggu, iklan lagi deh: Ngajak Jalan adalah tempat untuk mencari TTM, pacar sampai istri. Jangan lupa di-share kalau bermanfaat (tulisannya, bukan soal cari TTM-nya)!