Membuat Compiler/Interpreter Bahasa Sendiri

Seringkali di sebuah domain persoalan kita membutuhkan sebuah perangkat pemrograman untuk menyelesaikan masalah. Berbeda dengan general purpose programming language seperti Java, C, C++, dan lain-lain, ada beberapa bahasa pemrograman yang diciptakan hanya untuk dipakai pada permasalahan tertentu. Bahasa seperti ini disebut DSL atau Domain specific language. Untuk membuat bahasa-bahasa baru seperti ini dibutuhkan kemampuan untuk membuat compiler atau interpreter bahasa tersebut.

Pak Joe baru merilis sebuah tutorial sederhana bagaimana membuat compiler atau interpreter untuk sebuah bahasa pemrograman. Tutorial bisa dibaca di sini. Sejauh yang saya baca, tutorialnya cukup sederhana tapi lumayan komprehensif: mengenalkan kita kepada konsep parsing, abstract syntax tree, assembly, dan lain-lain.

Well, kebetulan saya gak sempat ngambil mata kuliah Teknik Kompilasi, tapi menurut saya ini cukup berguna buat pengenalan awal.

Persistence di Java EE

Persistence adalah sebuah fitur yang mampu melakukan mapping object ke relasional. Dengan adanya fitur ini maka kita bisa dengan mudah melakukan pengembangan objek dengan menggunakan basisdata tanpa harus mengkodekan koneksi manual ke database. Kemaren gw baru nyobain fitur persistence itu untuk Java EE dengan menggunakan Netbeans dan MySQL.

Ceritanya gw bikin sebuah table namanya products


CREATE TABLE `product` (
`ID` VARCHAR( 8 ) NOT NULL ,
`Name` TEXT NOT NULL ,
`Price` INT NOT NULL ,
`Quantity` INT NOT NULL ,
PRIMARY KEY ( `ID` )
) ENGINE = MYISAM ;

Untuk melakukan manajemennya bisa dilihat di sini.
Nantinya akan keluar
mysql1

Setelah itu kita bikin aplikasi berbasis Java EE, entah itu Enterprise app atau sekadar Web app.
Nah kita langsung coba bikin Class dari database.

mysql2

Setelah itu tinggal ikutin langkah-langkah aja.

mysql3

Kita pilih data source yang diperlukan…. Terus abis itu kita pilih table-table yang dibutuhkan juga… Dan nanti masing-masing table akan menjadi sebuah class.

mysql4

Nah nantinya kita akan punya sebuah class Product. (Nama product terpaksa direname sendiri karena pada table biasanya menggunakan nama plural sedangkan nama class biasanya singular)


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author Petra Barus
 */
@Entity
@Table(name = "products")
@NamedQueries({@NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p"), @NamedQuery(name = "Product.findById", query = "SELECT p FROM Product p WHERE p.id = :id"), @NamedQuery(name = "Product.findByPrice", query = "SELECT p FROM Product p WHERE p.price = :price"), @NamedQuery(name = "Product.findByQuantity", query = "SELECT p FROM Product p WHERE p.quantity = :quantity")})
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private String id;
    @Basic(optional = false)
    @Lob
    @Column(name = "Name")
    private String name;
    @Basic(optional = false)
    @Column(name = "Price")
    private int price;
    @Basic(optional = false)
    @Column(name = "Quantity")
    private int quantity;

    public Product() {
    }

    public Product(String id) {
        this.id = id;
    }

    public Product(String id, String name, int price, int quantity) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.quantity = quantity;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Product)) {
            return false;
        }
        Product other = (Product) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "model.Product[id=" + id + "]";
    }

}

Happy Birthday, PHP!

Ngeliat status di page PHP di Facebook, hari ini PHP berulang tahun ke 14. Sebenernya ultahnya tanggal 8 Juni, sekarang udah 9 Juni, tapi mari kita hormati waktu di benua bagian barat sana. Hehehe.

PHP adalah bahasa pemrograman web yang paling populer di dunia. At least itu menurut gw. Dan PHP adalah bahasa pemrograman web yang pertama kali gw kenal.

Gimana sih gw bisa kenal sama PHP?

Pertama kali gw kenal PHP itu di bangku SMA. Yup, seperti yang gw bilang di post ini, masa SMA adalah saat di mana gw mulai menekuni ilmu komputer. Sebelumnya gw emang pernah kenal Pascal di SD, QBasic, x86 assembly, Visual Basic, dan Java di bangku SMP. Tapi anehnya gw gak pernah setertarik itu sebelum di SMA.

Baca selebihnya »

Contoh dialog SMTP dan POP

Berikut contoh dialog antara server dan client pada SMTP. C adalah Client, S adalah Server.
Baca selebihnya »

Fitur Facebook yang gak guna ituh..

Pertama-tama gw gak habis pikir kenapa sih Facebook ngasih fitur buat ngasi liat wall orang ke orang lain….

Setelah beberapa bulan, Facebook menambahkan fitur baru…. Yakni ngomentarin wall orang ke orang lain…. Fitur yang sama gak kalah pentingnya sama fitur di atas, menurut gw….

Dan pada akhirnya gw menyesali kebodohan gw…. Karena saat ini gw tau gunanya buat apa….

Haha

Facebook is the best lah!

Di mana menaruh session?

Session adalah sebuah pertukaran informasi semi permanen antara dua buah device. Dengan menggunakan session sebuah device terus dapat mengenali sebuah device identik dalam jangka waktu yang tidak terlalu lama dan dapat menyimpan informasi mengenai komunikasi antara kedua device tersebut. Session ini bersifat stateful (meski mungkin ada yang tidak, tapi gw pribadi gak tau contohnya). Sebuah device dapat mengingat apa sih yang terjadi antara device tersebut dengan sebuah device yang lain selama komunikasi berlangsung.

3wayhandshakeContoh session adalah TCP session. Pada awal sebuah komunikasi TCP, kedua device akan membuka sebuah socket untuk berkomunikasi. Sebuah TCP session adalah dari awal sebuah device mengirimkan SYN sampai dengan pesan ACK penutupan koneksi tersebut.

Di dalam desain protokol, kita perlu mengetahui state sebuah device. Dengan adanya session, state tersebut dengan mudahnya diketahui selama kedua device masih berada dalam session. Pada contoh di post-post sebelumnya, awal sebuah session dimulai ketika sebuah socket selesai melakukan blocking dan menerima koneksi sampai socket ditutup. Selama sesi ini kedua device bertukar pesan-pesan. Pesan-pesan ini nantinya akan diparsing oleh kedua device berdasarkan protokol yang sudah ditetapkan oleh si desainer protokol.

Akan tetapi ada beberapa protokol yang sifatnya stateless, seperti protokol HTTP. Pada protokol ini, client hanya mengirim sebuah HTTP request dan server mengembalikan sebuah HTTP response. Hal ini dirasa cukup karena pada awalnya HTTP mungkin digunakan untuk static web. Pada penggunaan selanjutnya ada kebutuhan untuk membuat sebuah web sedikit lebih statis. Kemudian diciptakanlah sebuah mekanisme session di atas protokol HTTP.

Pada mekanisme ini, saat server menerima request dari sebuah client, server tersebut akan memeriksa apakah client tersebut sudah berada dalam sebuah session atau belum. Jika belum maka server membangkitkan sebuah hash dan menyimpannya pada basis data. Setelah itu server akan mengembalikan response yang disertai dengan hash tersebut pada header dari response. Selanjutnya si client diwajibkan untuk menyertakan hash tersebut pada header dari request yang dikirim kepada si server. Dengan demikian server dapat mengetahui apakah si client sudah berada pada sebuah session atau belum.

Java Socket Programming: Simultaneous Connections

Salah satu cara mengatasi kemungkinan timeout yang diakibatkan oleh blocking pada postingan sebelumnya adalah dengan menggunakan multithread.

Baca selebihnya »

Java Socket Programming: Multiple Connection

Pada post yang lalu, server yang dijalankan hanya bisa memaintain sebuah koneksi kemudian keluar. Cara untuk mengatasinya adalah dengan menggunakan infinite loop.
Baca selebihnya »

Java Socket Programming: Simple Client with GUI

Kalau dipost yang ini dan ini, gw udah nyoba client menggunakan Telnet dan Command Line Application, sekarang gw bakal nyoba bikin client dengan GUI.

a1

Jadi ada 3 buah obyek form: textbox, button, sama textarea. Nah pada textbox, gw pengen mengetikkan apa yang ingin gw kirim ke server. Kemudian gw klik button “Kirim”. Di textarea akan keliatan pesan-pesan dari server.

Baca selebihnya »

Java Socket Programming: Simple Client

Kalau di post ini kita nyobanya pake Telnet, maka sekarang kita bikin client sederhana untuk berkomunikasi dengan server tersebut.
Baca selebihnya »