| Subcribe via RSS

Kamus Minang

June 19th, 2008 | 22 Comments | Posted in General

Baa kaba? lai aman2 sjo kan? Awak alhamdulillah kaba baik.
Awak mangakeh di rantau urang..indak jauh bana do..cuma di riau. Awak urang Makassar kota tapeknya di kecamatan panakukkang.
Awak mau carito sakete mengenai program bahaso minang, itu se dulu yo..

Hehe… bener ga ya? gw baru belajar bahasa minang nih, asik juga yah ;)
Kalo belajar bahasa selain adaptasi juga perlu tool kan ya? nah gw buat nih toolnya :)

Mengenai program ini

Software ini adalah software penterjemah bahasa minang ke bahasa indonesia.
Software ini Free artinya Anda tidak perlu membayar royalti kepada saya (kalo mo ngasi sih gpp :P)

Bagaimana menggunakannya?

Simple, cukup dengan mengklik salah satu kata di sebelah kiri, dan terjemahan di list sebelah kanan.
Bila anda ingin mencari kata, isi field yang bertanda label Search field.

Bagaimana menambah record?

Mudah, cukup dengan klik Add, dan ketik kata yang diinginkan dengan aturan format :

minang_word=indonesian_word
Contoh:
baa=bagaimana

Bila ingin menambahkan lebih dari satu baris, tekan enter, dan pindah ke baris selanjutnya
Contoh:
baa=bagaimana
a=apa

Download :
kamus-minang

Ini screenshootnya:

Thats all folks

Episode 1: Java Persistence API dengan Toplink dan MySQL

May 28th, 2008 | 6 Comments | Posted in Java, Netbeans

Konsep

JPA adalah salah satu Java framework yang menggunakan pendekatan Object-relational mapping (ORM).
Lahirnya ORM dilatarbelakangi oleh cara pandang OOP dalam dunia nyata untuk melihat sistem, termasuk ke dalam sistem basis data.

Cara kerja ORM ini adalah memetakan objek ke dalam database. Objek yang dimasukkan akan dibaca oleh ORM tersebut dan diubah ke dalam sintaks SQL. selanjutnya baru kemudian dijalankan di basis data relasional dan hasilnya kembali ke ORM.
Berbagai macam teknologi yang menggunakan pendekatan ini seperti Entity Beans 2.x, Toplink, Hibernate, JDO, JDBC dengan DAO.

Dengan banyaknya pilihan teknologi, membuat pakar JAVA EE terinspirasi dengan membuat suatu framework yang dikenal dengan Java Persistence API (JPA).
JPA merupakan fitur baru yang ditambahkan mulai dari Java EE 5 dan merupakan sub-spesifikasi dari EJB 3. Selain untuk Java EE, JPA juga dapat dipergunakan untuk membangun aplikasi berbasis Java SE yang akan dibahas pada artikel ini.

Implementasi
Pada artikel ini, saya akan membuat menggunakan model sederhana aplikasi Employee, untuk menyimpan data employee ke dalam database.

Sebelum memulai ada baiknya kita mengetahui bagaimana cara kerja JPA.
Seperti Hibernate, JPA menggunakan annotation untuk melakukan mapping objek-objek ke dalam basis data relasional. Objek ini sering disebut dengan entitas. Entitas JPA adalah Plain Old Java Object (POJO) yang tidak meng-extend berbagai kelas atau meng-implement berbagai interface.

Salah satu kelebihan dari sini, kita tidak perlu membuat XML descriptor untuk melakukan mapping. Jika kita lihat dokumentasi API, JPA dibuat dengan menggunakan sedikit kelas dan interface. Sebagian besar package javax.persistence adalah annotation.

Disini saya menggunakan Netbeans IDE, anda bisa menggunakan IDE yang anda gemari, seperti Eclipse, IDE hanyalah tools untuk memudahkan saja, agar pekerjaan bisa menjadi lebih cepat :) Untuk basis data relasional saya menggunakan MySQL 5.

Sekarang mari kita mulai membuat aplikasi sederhana Employee.

Login ke mysql dan buat sebuah database employee

create database employee;

Pada Netbeans

  • Buat Project Baru (Ctrl+Shift+N)
  • Pilih kategori Java dan Project Java Application, Next

  • Project name: Employee, uncheck Create main class. Check Set as Main Project. Finish

  • Tambahkan library MySQL pada project. Klik kanan pada Libraries -> Add Library

  • Cari MySQL JDBC Driver, dan klik Add Library

Sekarang, kita buat Entity Class Employee

  • Klik kanan pada Source Packages, pilih New -> Entity Class

  • Pada New Entity Class

Class Name: Employee
Package: model
Primary Key: Long

  • Klik Create Persistence Unit.

Persistence Unit Name: EmployeePU
Persistence Library :Toplink
Database Connection: New Database Connection…

  • Pada New Database Connection

Name: MySQL (Connector/J driver)
Database URL: jdbc:mysql://localhost:3306/employee
User Name: root
Password: **********

Centang Remember password
Klik Ok

- Kembali pada Create Persistence Unit

Pilih option Create pada Table Generation Strategy, hal ini agar tabel dibuat secara otomatis oleh JPA. Kemudian klik Create dan klik Finish.

Netbeans secara otomatis membuat package META-INF dan menggenerate file persistence.xml yang berisikan informasi seperti database yang akan digunakan, driver JDBC yang akan digunakan, juga provider dan berbagai macam properties lainnya.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 

http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="EmployeePU" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <class>model.Employee</class>
    <properties>
      <property name="toplink.jdbc.user" value="root"/>
      <property name="toplink.jdbc.password" value="password"/>
      <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/employee"/>
      <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Pada Employee.java tambahkan attribut seperti name, department, job_title beserta setter dan getter method.

Employee.java

package model;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
    private String department;
    private String jobTitle;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getJobTitle() {
        return jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }

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

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Employee)) {
            return false;
        }
        Employee other = (Employee) 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.Employee[id=" + id + "]";
    }

}

Kembali pada kode diatas, terdapat beberapa aturan yang harus diikuti, yaitu :

  • Harus didentifikasikan sebagai entity dengan menggunakan @javax.persistence.Entity atau disingkat dengan @Entity annotation.
  • Harus ada attribute yang bertugas sebagai identifier (Id) yang dianotasikan dengan @javax.persistence.Id

Sedangkan @javax.persistence.GeneratedValue adalah annotation yang akan membuat JPA akan menggenerate primary key auto increment. Ada 4 macam strategy yang digunakan, yaitu:

  • AUTO (default), membiarkan provider (dalam hal ini toplink) yang menentukan 3 dari strategy dibawah ini.
  • SEQUENCE, menggunakan SQL Sequence untuk mendapatkan primary key
  • TABLE, toplink akan secara otomatis membuat satu table SEQUENCE dengan dua kolom: nama sequence dan nilainya (toplink default strategy)
  • IDENTITY, menggunakan identity generator, seperti kolom yang di set auto_increment pada MySQL

Sekarang mari kita buat main class

  • Klik kanan pada Source Packages -> New -> Java Main Class

  • Pada New Java Main Class

Class Name: MainEmployee
Package: main

  • Klik Finish

MainEmployee.java

package main;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import model.Employee;

public class MainEmployee {

    public static void main(String[] args) {
        Employee emp = new Employee();
        emp.setName("Roy Abu Bakar");
        emp.setDepartment("ICT");
        emp.setJobTitle("Kuli Komputer");

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeePU");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        try {
            em.persist(emp);
            em.getTransaction().commit();
        } catch (Exception ex) {
            ex.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }
}

Run Main class, lalu buka console MySQL

use employee;
show tables;
+--------------------+
| Tables_in_employee |
+--------------------+
| EMPLOYEE           |
| SEQUENCE           |
+--------------------+

2 rows in set (0.00 sec)

desc employee;

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ID         | bigint(20)   | NO   | PRI |         |       |
| NAME       | varchar(255) | YES  |     | NULL    |       |
| DEPARTMENT | varchar(255) | YES  |     | NULL    |       |
| JOBTITLE   | varchar(255) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

select * from employee;

+----+---------------+------------+---------------+
| ID | NAME          | DEPARTMENT | JOBTITLE      |
+----+---------------+------------+---------------+
|  2 | Roy Abu Bakar | ICT        | Kuli Komputer |
+----+---------------+------------+---------------+

1 row in set (0.00 sec)

Kita bisa melihat bahwa JPA membuat tabel secara otomatis dan menginsert objek-objek ke dalam tabel, pada contoh diatas kita sama sekali tidak menggunakan sql command :)

Sampai disini, episode selanjutnya, kita akan mencoba untuk meng-customize tabel tersebut.
Salam,

Tags: , ,

Hibernate JPA Netbeans

May 19th, 2008 | 1 Comment | Posted in Netbeans

Beberapa waktu yang lalu saya melakukan upgrade Netbeans ke versi 6.1, kemudian mengaktifkan module hibernate, namun persistence library hibernate belum di include ke dalam module tersebut. Tentu saja ini sedikit membingungkan, seperti yang dialami oleh user pada thread ini
http://www.nabble.com/Hibernate-on-NB-6.1-td16976842.html#a16978691

Untuk dapat menggunakan persistence library hibernate, terlebih dahulu harus menambahkan library hibernate entity manager and javaee ke dalam hibernate modules.

Berikut adalah library yang dibutuhkan untuk menggunakan JPA dengan hibernate :
Hibernate Core:
hibernate3.jar
lib/antlr-2.7.6.jar
lib/asm-attrs.jar
lib/asm.jar
lib/c3p0-0.9.1.jar
lib/cglib-2.1.3.jar
lib/commons-collections-2.1.1.jar
lib/commons-logging-1.0.4.jar
lib/concurrent-1.3.2.jar
lib/dom4j-1.6.1.jar
lib/ehcache-1.2.3.jar
lib/javassist.jar
lib/log4j-1.2.11.jar

Hibernate Entity Manager:
hibernate-entitymanager.jar
lib/hibernate-annotations.jar
lib/hibernate-commons-annotations.jar
lib/jboss-archive-browsing.jar

Java EE 5 SDK:
javaee.jar

Pada Netbeans 6.1, tambahkan library tersebut secara manual dengan cara :

1. Klik pada menu : Tools - > Libraries
2. Pilih Hibernate
3. Klik Add/Jar Folder…
4. Pada open dialog, pilih library-library yang dibutuhkan

Seperti terlihat pada gambar dibawah ini :


Lakukan ujicoba dengan membuat suatu project baru, kemudian add new Persistence Unit.
Jika berhasil, combo box Persistence Library akan bertambah 1 item, yaitu Hibernate, seperti terlihat pada gambar dibawah ini:



Tags: ,

Hello World

May 19th, 2008 | No Comments | Posted in Java

Ya, mungkin kalimat tersebut tidak asing lagi di mata anda, “Hello World” biasanya pertama kali ditulis bagi seorang yang baru mempelajari bahasa pemrograman.

Maksud dan tujuan tulisan ini hanyalah share dan pendapat saya tentang bagaimana sebaiknya langkah awal seorang yang berniat mempelajari suatu bahasa pemrograman.

Dari pengamatan dan pengalaman pribadi saya, banyak cara belajar seseorang mulai mempelajari bahasa pemgrograman. Namun saran saya secara pribadi, sebaiknya memulai benar-benar dari dasar.

Memahami dasar pemrograman
Model seperti ini cenderung benar-benar mencoba memahami esensi atau fundamen pemrograman, ibarat dalam membangun sebuah rumah, terlebih dahulu mempelajari bagaimana membuat pondasi, agar rumah tersebut kokoh dan kuat, mungkin dari bahan-bahannya, seperti bagaimana campuran semen dan pasirnya, dsb.
Begitupun dengan pemrograman, dengan gaya belajar seperti ini, tentunya si pencari ilmu pertama kali mencari bahan-bahan yang cocok untuk memulai, misalnya Algoritma. Kemudian setelah ilmu algoritma-nya dirasa sudah cukup dikuasai, kemudian beranjak ke konsep dasar pemgrograman itu sendiri, misalnya dalam Java, dimulai dengan memahami Object Oriented Programming, seperti encapsulation, inheritance dan polymorphism, kemudian belajar sintaks-sintaks atau keyword yang digunakan dalam bahasa pemgrograman tersebut, misalnya class, static, public, if, then, else, dsb. Sembari mempelajari konsep tersebut, langsung implementasikan misalnya seperti ilustrasi dibawah ini :

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Sekilas terlihat dari ilustrasi diatas, terdiri dari beberapa keyword, misalnya public, class, static, dsb. Nah, inilah yang harus dipelajari, mungkin setiap kita melihat suatu keyword, kita set pertanyaan dalam benak kita

Mengapa menggunakan ini?

Misalnya

Mengapa menggunakan kata kunci public?

Mengapa menggunakan kata kunci class?

Mengapa menggunakan kata kunci void?

Mengapa oh mengapa…?

Ya, pertanyaan itu yang nantinya mungkin bisa membawa anda menjadi seorang programmer yang hebat dan rendah hati :)

Tags: ,

Eksplorasi package java.net

May 18th, 2008 | No Comments | Posted in Java, Network

Package java.net menyediakan class-class yang dipakai untuk komunikasi network memakai protokol Internet, yaitu yang dikenal dengan TCP (Transmission Control Protocol), IP (Internet Protocol) maupun UDP (User Datagram Protocol).

Sejak versi 1.4, Java 2 mendukung IPv6. Dengan demikian J2SE mendukung standar berikut: RFC 2373: “IPv6 Addressing Architecture”; RFC 2553: “BasicSocket Interface Extensions for IPv6″; dan RFC 2732: “Format for Literal IPv6 Addresses in URLs”.

Dengan class-class dari package java.net kita dapat mengakses dan berkomunikasi dengan setiap server. Bahkan kita dapat membuat server sendiri.

java.net: Adresssing

Berikut adalah kelas-kelas dalam java.net untuk melakukan addressing :

Untuk IP Address:

  • InetAddress, untuk menyatakan IP Address.
  • Inet4Address, untuk menyatakan IP Address (v4) 32 bit. Merupakan subclass dari InetAddress.
  • Inet6Address, untuk menyatakan IP Address (v6) 128 bit. Merupakan subclass dari InetAddress.

Untuk socket-address:

  • SocketAddress, menyatakan alamat socket independen, tidak di bawah protokol tertentu.
  • InetSocketAddress. Merupakan subclass dari SocketAddress, menyatakan IP socket-address.

Addressing.java

import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

/**
 *
 * @author squall
 */
public class Addressing {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // ip address
        try {
            InetAddress ias = Inet4Address.getByName("babe-squall.kapukvalley.net");
            InetAddress ian4 = Inet4Address.getByName("172.16.0.174");
            InetAddress ian6 = Inet6Address.getByName("fe80::213:46ff:fe3a:d381");
            InetAddress ial = Inet4Address.getByName(null);
            InetAddress iah = Inet4Address.getLocalHost();

            System.out.println("ias: " + ias.getHostName());
            System.out.println("ias: " + ias.getHostAddress());
            System.out.println("ian4: " + ian4.getAddress());
            System.out.println("ian4: " + ian4.getHostAddress());
            System.out.println("ian6: " + ian6.getHostAddress());
            System.out.println("ial: " + ial.getHostAddress());
            System.out.println("ial: " + ial.getHostName());
            System.out.println("iah: " + iah.getHostAddress());
            System.out.println();

            // socket-address
            InetSocketAddress isan = new InetSocketAddress(ian4, 80);
            InetSocketAddress isas = new InetSocketAddress("localhost", 80);
            InetSocketAddress isal = new InetSocketAddress(8080);

            System.out.println("isan: " + isan.getPort());
            System.out.println("isas: " + isas.getHostName());
            System.out.println("isal: " + isal.getAddress());
        } catch (UnknownHostException ex) {
            System.err.println("Error: " + ex.getMessage());
        }
    }
}

Output :

ias: babe-squall.kapukvalley.net
ias: 172.16.0.174
ian4: [B@3e25a5
ian4: 172.16.0.174
ian6: fe80:0:0:0:213:46ff:fe3a:d381
ial: 127.0.0.1
ial: localhost
iah: 172.16.0.174

isan: 80
isas: localhost
isal: 0.0.0.0/0.0.0.0
java.net: Koneksi TCP

Dua class yang digunakan untuk koneksi TCP adalah ServerSocket dan Socket.

ServerSocket menyatakan sebuah socket pada sebuah server. Fungsinya adalah menunggu dan mendengarkan RFS (Request for Service) dari client.

Client yang akan meminta service dari server akan membentuk object Socket.

Jika server menerima RFS dari client maka ia akan membuat object Socket untuk melayaninnya, sedangkan ia sendiri tetap mendengarkan melalui ServerSocket untuk menerima RFS yang lain.

Jadi koneksi client-server terbentuk antara kedua socket. Komunikasi antar keduanya dapat dilakukan denga metode getInputStream() dan getOuputStream().

Berikut adalah contoh sederhana client/server programming dengan memakai socket, dimana akan berjalan pada thread tersendiri.

ServerFrame.java

/*
 * ServerFrame.java
 *
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * @author  squall
 */
public class ServerFrame extends javax.swing.JFrame implements Runnable {

    private volatile Thread thread = null;
    private ServerSocket server = null;
    private Socket client = null;

    /** Creates new form ServerTCP */
    public ServerFrame() {
        initComponents();

        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        txtLog = new javax.swing.JTextArea();
        btnControl = new javax.swing.JToggleButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Server Socket");

        txtLog.setColumns(20);
        txtLog.setEditable(false);
        txtLog.setLineWrap(true);
        txtLog.setRows(5);
        jScrollPane1.setViewportView(txtLog);

        btnControl.setText("START");
        btnControl.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnControlActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnControl)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(12, 12, 12)
                .addComponent(btnControl)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void btnControlActionPerformed(java.awt.event.ActionEvent evt) {
        if (btnControl.getText() == "START") {
            btnControl.setText("STOP");
        } else {
            btnControl.setText("START");
        }
    }                                          

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

                    public void run() {
                        new ServerFrame().setVisible(true);
                    }
                });
    }

    // Variables declaration - do not modify
    private javax.swing.JToggleButton btnControl;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea txtLog;
    // End of variables declaration                   

    public void run() {
        try {
            // Buat Socket server
            server = new ServerSocket(31337);
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
            ex.printStackTrace();
            System.exit(-1);
        }

        while (server != null) {
            BufferedReader bufRead = null;
            PrintStream bufPrint = null;
            String data;

            try {
                client = server.accept();

                InputStream rawIn = client.getInputStream();

                InputStreamReader inSR = new InputStreamReader(rawIn);
                bufRead = new BufferedReader(inSR);

                OutputStream rawOut = client.getOutputStream();
                bufPrint = new PrintStream(rawOut);
            } catch (IOException ex) {
                txtLog.setText("Error:\n" + ex.getMessage());
            }

            while (true) {
                try {
                    thread.sleep(500);
                } catch (InterruptedException ex) {
                }

                if (btnControl.getText() == "STOP") {
                    try {
                        data = bufRead.readLine();
                        txtLog.setText("Server started: " + data);
                        bufPrint.println("Received: " + data);
                    } catch (IOException ex) {
                        txtLog.setText("Error:\n" + ex.getMessage());
                    }
                } else if (btnControl.getText() == "START") {
                    txtLog.setText("Server stopped.");
                }
            }
        }
    }
}

Hal penting yang perlu diperhatikan:

Pada kode diatas terdapat JToggleButton untuk Start dan Stop socket, dengan event apabila teks dari tombol = “START” akan diubah menjadi “STOP” dan sebaliknya jika “STOP” akan diubah menjadi “START”.

private void btnControlActionPerformed(java.awt.event.ActionEvent evt) {
        if (btnControl.getText() == "START") {
            btnControl.setText("STOP");
        } else {
            btnControl.setText("START");
        }
    }

Program ini memakai thread, karena itu diimplementasikan interface Runnable.

public class ServerFrame extends javax.swing.JFrame implements Runnable

Didalam Constructor ServerFrame() ditambahkan baris perintah untuk menjalankan thread.

if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }

Pada metode run(), dibuat server socket

server = new ServerSocket(31337);

Kemudian program akan looping. Di dalam looping ini server akan mendengarkan (listening) socket jika ada permintaan service dari client, yaitu dengan :

client = server.accept();

Looping ini akan terus menerus sampai ada data yang masuk ke port.

Jika ada akses dari client, maka program akan keluar dari accept() serta mengembalikan object Socket. Object ini dipakai untuk komunikasi dengan client. Kemudian dibuat object InputStream dan OutputStream dari socket client yang akan dipakai untuk berkomunikasi.

Kedua object stream tersebut berisikan data mentah (byte). Untuk konversi ke bentuk String, InputStream diumpankan ke InputStreamReader yang kemudian diumpankan lagi ke BufferedReader. Sedangkan OutputStream diumpankan ke PrintStream.

InputStream rawIn = client.getInputStream();

Konversi ke String (Unicode)

InputStreamReader inSR = new InputStreamReader(rawIn);
bufRead = new BufferedReader(inSR);

Output ke client

OutputStream rawOut = client.getOutputStream();
bufPrint = new PrintStream(rawOut);

Setelah terbentuk koneksi client-server ini, maka program akan masuk ke dalam looping lagi. Kali ini kedua pihak akan saling berkomunikasi.

Untuk membaca input, maka dipakai metode BuffereReader.readLine(). Sedangkan untuk menulis output, dipakai PrintStream.println();

Teks yang dibaca akan ditampilkan dalam txtLog. Sedangkan untuk memulai dan menghentikan server dipakai btnControl. Button ini bersifat toggle, sehingga jika teksnya = “STOP” berarti user telah menekan “START” dan sebaliknya.

ClientFrame.java

/*
 * ClientFrame.java
 *
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

/**
 *
 * @author  squall
 */
public class ClientFrame extends javax.swing.JFrame implements Runnable {

    private volatile Thread thread = null;
    private Socket socket = null;

    /** Creates new form ClientFrame */
    public ClientFrame() {
        initComponents();
        txtKirim.requestFocus();

        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        txtTerima = new javax.swing.JTextArea();
        jScrollPane2 = new javax.swing.JScrollPane();
        txtKirim = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Client Socket");

        txtTerima.setColumns(20);
        txtTerima.setEditable(false);
        txtTerima.setLineWrap(true);
        txtTerima.setRows(5);
        jScrollPane1.setViewportView(txtTerima);

        txtKirim.setColumns(20);
        txtKirim.setLineWrap(true);
        txtKirim.setRows(5);
        jScrollPane2.setViewportView(txtKirim);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

                    public void run() {
                        new ClientFrame().setVisible(true);
                    }
                });
    }
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea txtKirim;
    private javax.swing.JTextArea txtTerima;
    // End of variables declaration                   

    public void run() {
        BufferedReader bufRead = null;
        PrintStream bufPrint = null;

        try {
            socket = new Socket("localhost", 31337);
        } catch (IOException ex) {
            txtTerima.setText("Error:\n" + ex.getMessage());
        }

        while (true) {
            try {
                thread.sleep(500);
            } catch (InterruptedException ex) {
            }

            try {
                InputStream input = socket.getInputStream();
                InputStreamReader reader = new InputStreamReader(input);
                bufRead = new BufferedReader(reader);

                OutputStream os = socket.getOutputStream();
                bufPrint = new PrintStream(os);

                bufPrint.println(txtKirim.getText());

                txtTerima.setText(bufRead.readLine());
            } catch (IOException ex) {
                txtTerima.setText("Error:\n" + ex.getMessage());
            }
        }
    }
}

Dalam program client diatas, pertama akan dibuat object Socket lokal dengan nama host = “localhost” dan port = 31337. Nomor port ini adalah nomor port dari Server.

Kemudian akan dibuat dua object stream yaitu InputStream dan OuputStream dari socket ini. Sama seperti program Server, keduanya akan dikonversi ke bentuk String dengan BufferedReader dan PrintStream.

Object PrintStream bufPrint akan mengirimkan teks yang kita ketikkan dalam txtKirim ke server. Sedangkan BufferedReader bufRead akan menerima data teks dan menuliskannya ke txtTerima.

Jalankan Aplikasi Client-Server
Saatnya menjalankan kedua program tersebut. Pertama, jalankan ServerFrame.java lalu jalankan ClientFrame.java. Pada Aplikasi server, tekan tombol “START” untuk memulai socket. Tampilan kedua aplikasi seperti ini dibawah ini (Diasumsikan seorang warteg-er memesan es teh manis secara online :))

Client

Server

Kedua program tersebut masing-masing mempunya thread tersendiri. Keduanya saling berkomunikasi terus menerus. Setiap karakter yang diketikkan dalam client akan dikirimkan ke server dan kemudian akan dikembalikan lagi ke client. Ini menunjukkan bahwa keduanya saling mengirim (melalui OutputStream) dan saling menerima (melalui InputStream).

Tags: ,

MD5 Checksum Application

May 17th, 2008 | No Comments | Posted in Java, Security

Apa tujuan aplikasi ini?
Aplikasi ini dirancang untuk tujuan keamanan jaringan komputer.

Mengapa dibutuhkan?
Aplikasi ini dibutuhkan untuk membantu pengguna komputer dalam menguji integritas sebuah file, user dapat mengetahui mana file yang asli dan mana yang tidak. Si cracker bisa saja menyusupkan atau memodifikasi file yang asli dengan tujuan untuk menguasai system Anda atau dengan maksud jahat tertentu. Misalnya si Badu mendownload suatu file di internet, dan pada waktu dia mengeksekusi file tersebut, program tersebut otomatis membuka port yang digunakan untuk masuk ke system Anda.

Mengapa MD5?
Secara perhitungan matematis, tidak dimungkinkan untuk mendapatkan dua pesan yang memiliki hash yang sama, selain itu MD5 relatif lebih cepat.
Aplikasi ini di develop dengan menggunakan Java SE versi 1.6, dengan menggunakan Netbeans IDE 6 Beta 2.

Download MD5 Checksum

Berikut screen shoot aplikasi :

Screen shoot progress bar :

Moga-moga bermanfaat :)

Tags: ,

Emulasi Cisco dengan Dynamips

May 16th, 2008 | 4 Comments | Posted in Network

Dynamips adalah sebuah software emulator yang memungkinkan kita untuk menjalankan IOS Cisco 7200 di komputer PC kita. Software ini tersedia pada berbagai platform, seperti Linux, Windows dan Mac. Pada topic kali ini, software dynamips akan dijalankan pada mesin Linux.

Dynagen adalah berisikan file-file untuk konfigurasi cisco router maupun cisco switch.

Pertama, buat direktori penyimpanan semua file dan direktori dynamips.

mkdir /opt/dynamips
cd /opt/dynamips

Download binary dynamips-0.2.7-RC3-x86.bin, ganti permisi file agar bisa dieksekusi dan buat link ke /usr/sbin

chmod 755 /opt/dynamips/dynamips-0.2.7-RC3-x86.bin
ln -sf /opt/dynamips/dynamips-0.2.7-RC3-x86.bin /usr/sbin/dynamips

Download dynagen-0.9.2 dan extract pada direktori /opt/dynamips

tar zxvf dynagen-0.9.2.tar.gz

Ambil image IOS Cisco c7200-jk9o3s-mz.124-7a.image dan simpan pada direktori /opt/dynamips

Sekarang akan dilakukan pengeditan atau pembuatan file dynagen, untuk membuat topologi jaringan yang akan digunakan. Dyamips memberikan banyak contoh file topologi, seperti terlihat pada direktori /opt/dynamips/dynagen-0.9.2/sample_labs. Kali ini akan digunakan file topologi simple.net

vi /opt/dynamips/dynagen-0.9.2/sample_labs/simple1/simple1.net

Default isi file tsb demikian :

[localhost]
[[7200]]
image = \Program Files\Dynamips\images\c7200-jk9o3s-mz.124-7a.image
# On Linux / Unix use forward slashes:
# image = /opt/7200-images/c7200-jk9o3s-mz.124-7a.image
npe = npe-400
ram = 160
[[ROUTER R1]]
s1/0 = R2 s1/0
[[router R2]]
# No need to specify an adapter here, it is taken care of
# by the interface specification under Router R1

Lalu ubah seperti ini :

# Simple lab
[localhost]
[[7200]]
# image = \Program Files\Dynamips\images\c7200-jk9o3s-mz.124-7a.image
# On Linux / Unix use forward slashes:
image = /opt/dynamips/c7200-jk9o3s-mz.124-7a.image
npe = npe-400
ram = 160
[[ROUTER R1]]
s1/0 = R2 s1/0
[[router R2]]
# No need to specify an adapter here, it is taken care of
# by the interface specification under Router R1

Jalankan binary dynamips dengan parameter -H 7200 agar listening pada port 7200 dengan proses secara background.

dynamips -H 7200 &amp;amp;

Jalankan binary dynagen dengan simple1.net sebagai parameternya.

cd /opt/dynamips/dynagen-0.9.2/sample_labs/simple1
dynagen simple1.net

Contoh output:

Reading configuration file...
Shutdown in progress...
Shutdown completed
Warning: Starting R1 with no idle-pc value
CPU0: carved JIT exec zone of 64 Mb into 2048 pages of 32 Kb.
NVRAM is empty, setting config register to 0x2142
C7200 instance 'R1' (id 0):
  VM Status  : 0
  RAM size   : 160 Mb
  IOMEM size : 0 Mb
  NVRAM size : 128 Kb
  NPE model  : npe-400
  Midplane   : vxr
  IOS image  : /opt/dynamips/c7200-jk9o3s-mz.124-7a.image
  Loading ELF file '/opt/dynamips/c7200-jk9o3s-mz.124-7a.image'...
  ELF entry point: 0x80008000
  C7200 'R1': starting simulation (CPU0 PC=0xffffffffbfc00000), JIT enabled.
  Warning: Starting R2 with no idle-pc value
  CPU0: carved JIT exec zone of 64 Mb into 2048 pages of 32 Kb.
  NVRAM is empty, setting config register to 0x2142
  C7200 instance 'R2' (id 1):
  VM Status  : 0
  RAM size   : 160 Mb
  IOMEM size : 0 Mb
  NVRAM size : 128 Kb
  NPE model  : npe-400
  Midplane   : vxr</pre>
  IOS image  : /opt/dynamips/c7200-jk9o3s-mz.124-7a.image
  Loading ELF file '/opt/dynamips/c7200-jk9o3s-mz.124-7a.image'...
  ELF entry point: 0x80008000</pre>
  C7200 'R2': starting simulation (CPU0 PC=0xffffffffbfc00000), JIT enabled.
  Network successfully started
  Dynagen management console for Dynamips
  => help
  Documented commands (type help <topic>;):
  ========================================<
  capture  exit    help    import  push    resume  shell  stop     ver
  clear    export  hist    list    py      save    show   suspend
  console  filter  idlepc  no      reload  send    start  telnet

Happy routing ;)

Tags: ,

Shell script Instalasi Oracle 10g di Slackware

May 15th, 2008 | 3 Comments | Posted in Open Source

Ada isu yang mengatakan bahwa Oracle 10g hanya dapat diinstall di RHEL, namun ternyata bisa juga diinstall di Slackware! Kuncinya adalah hanya menambah 1 buat file di direktori /etc kemudian isi file tersebut ditambahkan dengan string “redhat-3″, seperti ini : echo "redhat-3" > /etc/redhat-release, tujuannya agar si Oracle mengidentifikasi Slackware sebagai RHEL, hehehe…

Berikut bash script selengkapnya:

#!/bin/sh
# Bismilahirahmanirrahim

ROOT_UID=0
E_NOTROOT=67
E_VERSI=0
DIR_ORA=/data/oracle

# Cek requirement
if [ "$UID" -ne "$ROOT_UID" ]; then
        echo "Kamu harus login sebagai root!"
        exit $E_NOTROOT
else
        echo "UID : root [OK]"
fi

if [ -f "/etc/slackware-version" ]; then
        echo "Cek Versi : " `cat /etc/slackware-version` [OK]
else
        echo "Kamu tidak menggunakan versi Slackware"
exit $E_VERSI
fi

STDC++=libstdc++.so.5
if [ -f "/usr/lib/$STDC++"]; then
        echo "Cek Library stdc++ : versi 5 [OK]"
else
        echo "Library stdc++ versi 5 di direktori /usr/lib/tidak ditemukan"
        echo "Mengcopy file /usr/i486-slackware-linux/lib/$STDC++ ke /usr/lib"
        cp /usr/i486-slackware-linux/lib/libstdc++.so.5.* /usr/lib
        ln -sf /usr/lib/libstdc++.so.5.* /usr/lib/libstdc++.so.5
fi

# Tambah group oracle
echo "Menambahkan group dan user oracle"
groupadd dba
groupadd oinstall
groupadd oper

# Tambah user oracle
useradd -g oinstall -G dba,oper oracle -s /bin/bash
passwd oracle
mkdir /home/oracle
chown -R oracle:dba /home/oracle

# Buat direktori /oracle (dir aplikasi oracle) dan dir /database (dir database oracle)
# Direktori ini bukan de facto oracle, terserah Anda mau buat spt apa
mkdir $DIR_ORA

# Ubah kepemilikan direktori diatas
chown -R oracle:oinstall $DIR_ORA
chmod -R 775 $DIR_ORA

# Buat seakan2 slackware ini adalah redhat :P
echo "redhat-3" > /etc/redhat-release

# Setting parameter kernel
cat > /etc/sysctl.conf << EOF
kernel.sem=250 32000 100 128
kernel.shmmax=2147483648
kernel.shmall=2097152
kernel.shmmni=4096
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144
EOF

sysctl -p</code>

# Setting user shell limit
cat >> /etc/profile << EOF
if [ "\`id -u\`" = "0" ]; then
        ulimit -n 65536
        ulimit -u 16384
fi
EOF

# Oracle Environment
cat > /home/oracle/.bash_profile << EOF
export ORACLE_BASE=$DIR_ORA
export ORACLE_HOME=$DIR_ORA
export ORACLE_SID=orcl
export TNS_ADMIN=\$ORACLE_HOME/config
LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$ORACLE_HOME/lib:\$ORACLE_HOME/network/lib
export LD_LIBRARY_PATH
PATH=\$PATH:\$ORACLE_HOME/bin
EOF

chown oracle:dba /home/oracle/.bash_profile

#END

Moga-moga berguna.

Tags: ,