Saturday, August 13, 2005

Mengenal protokol Hessian/Burlap

Hessian
  • Protokol binary yang sederhana (lightweight) untuk menghubungkan web services.
  • Menggunakan HTTP sebagai protokol transport
  • Karena sederhana/kecil hessian dapat digunakan pada J2ME
  • Spesifikasinya bersifat terbuka, dapat dilihat di http://www.caucho.com/resin-3.0/protocols/hessian-1.0-spec.xtp

  • Dikembangkan oleh Caucho Technology
  • Implementasi library java dari Caucho Tech. berlisensi Apache License

  • Implementasi Hessian server berupa servlet
  • Tidak memerlukan intermediate definition language (IDL) atau schema eksternal
  • Cukup menggunakan interface

  • Implementasi service untuk server hanya perlu meng-extend com.caucho.hessian.server.HessianServlet
  • Service pada server juga dapat berupa POJO yang kemudian menggunakan IoC
  • Contoh:
   import com.caucho.hessian.server.HessianServlet;

public class BasicService extends HessianServlet implements BasicAPI {
private String _greeting = "Hello, world";

public void setGreeting(String greeting) {
_greeting = greeting;
}

public String hello() {
return _greeting;
}
}
  • Sedangkan client hanya memerlukan com.caucho.hessian.client.HessianProxyFactory untuk memanggil service di server
  • Contoh:
   import com.caucho.hessian.client.HessianProxyFactory;
public class BasicClient {

public static void main(String[] args) {
// Setting jika menggunakan proxy
System.getProperties().put("proxySet", "true");
System.getProperties().put("http.proxyHost", "10.0.0.1");
System.getProperties().put("http.proxyPort", "8080");

String url = "http://www.caucho.com/hessian/test/basic";
HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = null;
try {
basic = (BasicAPI) factory.create(BasicAPI.class, url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
System.out.println("hello(): " + basic.hello());
}
}
  • Client dan server menggunakan interface yang sama yaitu:
   public interface BasicAPI {
public String hello();
}
Burlap

Friday, August 05, 2005

CAPTCHA

Saat ini, ketika kita mencoba registrasi ke suatu sistem dalam aplikasi web di internet, kita mendapatkan pertanyaan verifikasi seperti menjawab suatu tulisan pada suatu gambar yang sedikit dikaburkan tapi masih bisa terbaca, atau menjawab suatu operasi matematik sederhana.

Proses verifikasi seperti itu dilakukan untuk menghindari registrasi otomatis (screen scraping) yang dilakukan program komputer. Jadi sistem registrasi mencoba memverifikasi bahwa yang register adalah orang, bukan mesin.

Program untuk dapat membuat dan melakukan grade test sehingga banyak orang/manusia dapat melewati (pass) sedangkan program komputer saat ini tidak dapat melewatinya, bisa kita sebut sebagai CAPTCHA. (Kata "banyak" dan "saat ini" didefiniskan kemudian).

CAPTCHA singkatan dari "Completely Automated Public Turing Test to Tell Computers and Humans Apart". Public berarti kode program harus diberi komentar dan mudah untuk dimengerti, dan semua data yang digunakan pada sebuah CAPCHA haruslah bersifat publik. Turing test adalah test menebak sesuatu oleh manusia, dalam hal ini 'lawan'-nya adalah program komputer.

Metode untuk mendistorsi karakter pada gambar biasanya adalah:
  • tipe font
  • penambahan latar belakang (pattern, gradasi warna)
  • penambahan object lain yang sedikit menutupi karakter/huruf
  • perbedaan warna tiap-tiap huruf, atau border dari huruf
  • mengubah karakter dengan menggunakan algoritma distrosi misalnya
    - pembelokan garis sehingga karakter jadi meliuk-liuk (shadowgimpy)
    - memperesar bagian tertentu dengan kesan cermin cembung (FishEye)


LINKs:

CAPTCHA homepage
Salah satu implementasi Java - JCAPTCHA

Wednesday, July 27, 2005

commons-dbutils little hacks

commons-dbutils-1.0

1. Mapping nama kolom ke bean properties
Untuk merubah mapping nama kolom ke bean properties, dari standar penulisan field tabel di database yaitu dengan separator underscore "_" menjadi standar penulisan object field di java class yaitu tanpa separator dengan huruf kapital di awal kata. Misalnya: CUSTOMER_NAME menjadi customerName.

Ubah method mapColumnsToProperties pada class BeanProcessor pada line 365 yaitu:

String columnName = rsmd.getColumnName(col);
menjadi
columnName = StringUtils.replace(columnName, "_", "");
Referensi ini ternyata lebih baik dari apa yang saya buat disini.

2. QueryRunner yang bersifat scrollable.
Kita biasanya perlu berpindah-pindah cursor (scrollable) dari suatu result set dengan menggunakan method afterLast(), beforeFirst() dan lain-lain.

Default class QueryRunner dalam commons-dbutils adalah menghasilkan ResultSet yang bersifat TYPE_FORWARD_ONLY dan CONCUR_READ_ONLY. Untuk mengubah agar ResultSet dapat kita perlu membuat subclass dari class QueryRunner yang implementasinya seperti ini:

/*
* Created on Sep 23, 2004
*
*/

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;

public class QueryRunnerScrollable extends QueryRunner {

public QueryRunnerScrollable() {
super();
}

public QueryRunnerScrollable(DataSource ds) {
super(ds);
}

protected PreparedStatement prepareStatement(Connection conn, String sql)
throws SQLException {
return conn.prepareStatement(
sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
}
}

Monday, June 06, 2005

Java basic: Protected modifier and default modifier

Protected modifier dari suatu field dalam suatu class berarti selain dirinya sendiri yang dapat mengakses field tersebut, class lain yang bisa mengakses field tersebut adalah:
  • class yang satu package dengan class tersebut
  • class yang merupakan subclass dari class tersebut walaupun berbeda package

Default modifier agak berbeda dengan protected modifier, karena

  • subclass di package yang berbeda tidak dapat mengakses field tersebut

Java Network Launching application

Ini beberapa alternatif aplikasi untuk lauching java program lewat network:

Followers