Life,Contribute!!!

I may fail, I may succeed. But i’ll live my life as I believe!!

Life,Contribute!!! header image 1

Safari 4 dan Fluid.app

June 23rd, 2009 · No Comments

Gw seneng banged konsep web as application dari fluid.app seperti posting gw sebelumnya. Hari ini gw install update di Leopard dan menyadari bahwa ternyata Safari 4 udah release, heheehe telat banged yah :D. Nah masalahnya fluid.app 0.9.5 ternyata masih menggunakan Safari 3, walau udah diupdate safarinya.

Browsing2 ternyata safari 4 punya menu “File -> Save As Web Application” eh ternyata menu ini dihilangkan setelah release. Browsing lagi ke kanan kiri, ternyata fluid.app v0.9.6 sudah mendukung safari 4. Horeee..

Sekarang gw tetep bisa membuat facebook.app, gmail.app, arsenal.app dst :))

Note : goshh… safari 4 memang kueencennggg

→ No CommentsTags: mac

MacOs X Sudah punya mail server secara default

June 15th, 2009 · 3 Comments

Hari ini rencananya mau download apache james untuk setup mail server lokal di hardisk. Seperti di posting Endy tentang spring Integration, gw perlu settup mail server local untuk tujuan testing.

Terakhir kali setup apache james gak berjalan mulus dan masih banyak hal2 yang gak gw ngerti tentang mail server. Apache james juga masih mendukung protokol IMAP secara experimental. Nah setelah googling beberapa saat, ternyata baru tahu kalau macos sudah punya mail server secara default yang terinstall di /usr/sbin/sendmail.

Graham Orndorff secara detail menerangkan bagaimana mensetup sendmail dan postfix di macosx. Selain itu ada page yang menerangkan berbagai macam tutorial dan link untuk masalah mail server

Sampe sekarang baru explore2, nanti kalau sudah ada hasilnya gw posting lagi deh, janji ;))

→ 3 CommentsTags: mac

Menjalankan Netbeans di Ubuntu Server dari MacOs client

June 4th, 2009 · 2 Comments

Lagi dapet kerjaan deployment hari ini, coba-coba hal baru yang unik. Tim kita coding di NetBeans dan semua library ikut punya netbeans. Awalnya sih library di commit ke Svn Server, tapi akhirnya membuat server subversion membengkak ukuranya, dan proses checkout menjadi sangat lama. Inilah sebabnya kemudian kita explore ant-ivy untuk proses buildnya, ivy mempunyai keunggulan dibanding maven. namun tetap saja di negara miskin bandwith international mendownload library dari repository bukan perkara yang gampang. Selain itu cukup makan waktu juga mengajarkan ke programmer baru.

Jadilah kita kembali ke jaman batu dengan menggunakan ant build bawaanya NetBeans. Nah muncul lagi masalah ketika mau deployment. Programmer itu rata-rata males, seperti halnya saya, copy paste binary dari laptop ke server deployment aja saya males :)). Akhirnya cari2 cara gimana di server saya install netbeans trus projectnya disetting librarynya agar build.xml punya project itu bisa kita jalankan lewat menggunakan ant command console.

Hmm. Saya akhirnya mencoba menjalankan NetBeans yang ada di server dari laptop, nah kepikirnya pake remote desktop seperti di windows. Eh ternyata linux lebih canggih. Dengan SSH protokol kita bisa melakukan X11 forwarding. Jadi nantinya kita bisa menjalankan X application apapun yang ada di server dan nongol di client. Canggih ya :))

Saya mengikuti tutorial dari sini dan ternyata tidak ada setting tambahan sama sekali untuk server Ubuntu 08.10 dan Macos Leopard.

Pertama tentu saja copy file instalasi netbeans ke server, set filenya agar executable dan kemudian jalankan instalasinya dari client.

$ ssh -Y server@192.168.0.1 /home/server/netbeans-6.5-ml-linux.sh

Setelah proses instalasi selesai, kita bisa jalanin netbeansnya dari folder instalasi, biasanya sih di ~/netbeans-6.5

$ ssh -Y server@192.168.0.1 /home/server/netbeans-6.5/bin/netbeans

Tarara…. Nongol dah netbeansnya di client

Note :
Untuk client ubuntu gunakan option -X

$ ssh -X server@192.168.0.1 /home/server/netbeans-6.5/bin/netbeans

Selamat mencoba

→ 2 CommentsTags: Uncategorized

Mengirim File Attachment Ke GMail

June 1st, 2009 · 1 Comment

Hari ini lagi oprek-oprek kode JavaMail agar bisa kirim email ke GMail dengan file attachemnt. Setelah berkelana ke web kiri kanan dan mencoba beberapa kali akhirnya dapet juga kodenya :

  /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.artivisi.termos.service.impl;

import java.io.File;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 *
 * @author ifnu
 */
public class NewClass {

    public static void main(String[] args) {
        try {
            Properties props = System.getProperties();
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465"); // smtp port
            Authenticator auth = new Authenticator() {

                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("username-gmail", "password-gmail");
                }
            };
            Session session = Session.getDefaultInstance(props, auth);
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress("username-gmail@gmail.com"));
            msg.setSubject("Mencoba attachment gmail");
            msg.setRecipient(RecipientType.TO, new InternetAddress("username-gmail@gmail.com"));
            //add atleast simple body
            MimeBodyPart body = new MimeBodyPart();
            body.setText("Mencoba attachment");
            //do attachment
            MimeBodyPart attachMent = new MimeBodyPart();
            FileDataSource dataSource = new FileDataSource(new File("file-yg-dikirim.txt"));
            attachMent.setDataHandler(new DataHandler(dataSource));
            attachMent.setFileName("file-yg-dikirim.txt");
            attachMent.setDisposition(MimeBodyPart.ATTACHMENT);
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(body);
            multipart.addBodyPart(attachMent);
            msg.setContent(multipart);
            Transport.send(msg);
        } catch (AddressException ex) {
            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MessagingException ex) {
            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

Selamat mencoba.

→ 1 CommentTags: netbeans

Detik Search Launching: Congrats….

May 20th, 2009 · No Comments

Hari ini detik.com melaunching layanan search untuk semua berita di detik.com

Menarik buat saya karena teknologi hadoop menjadi tulang punggung di balik detiksearch. Hadoop adalah teknologi opensource yang menggunakan konsep serupa dengan teknologi google untuk search enginenya, yaitu big table.

Jadi, first Hadoop cluster in Indonesia?

→ No CommentsTags: event

StringUtils class untuk membuang Bad Character

May 14th, 2009 · No Comments

Hari ini dapet sesi konsultasi dari si imut-imut untuk menghilangkan karakter jelek (bad character) dari string yang akan diinsert dalam database.

MySQL punya karakter escape tersendiri untuk menyimpan karakter-karakter jelek ini. Misalnya kalau kita ingin menyimpan data string nama pelatih klub-klub English Premiere league, kemungkinan besar query yang kita jalankan akan error ketika menyimpan nama Martin O’neil. Kenapa? karena ada karakter petik (’) di dalam kata O’neal.

Ilustrasinya begini :

String name = "Martin O'neal";
String club = "aston villa"
String sql = "insert into headcoach(name,club) values ("+ name + "," + club +")";
Statement stm = conn.createStatement();
stm.execute(sql);

Sql diatas akan menghasilkan error “You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘neal’)’ at line 1″

Sebenarnya kalau kita menggunakan teknik JDBC yang lebih baik, yaitu dengan PreparedStatement, error diatas pasti tidak akan terjadi.

String name = "Martin O'neal";
String club = "aston villa";
PreparedStatement ps = conn.prepareCall("insert into headcoach(name,club) values(?,?)");
ps.setString(1, name);
ps.setString(2, club);
ps.execute();

Nah, karena tidak diperlukan untuk merubah aplikasi secara drastis, error bisa dihindari dengan cara membuang karakter-karakter yang potensial bisa menyebabkan query dalam mysql jadi error.

public class StringUtils {
    public static final String BAD_CHAR="'\"`~";
    public static String removeBadChar(String data){
        StringBuffer buffer = new StringBuffer();
        char[] charArray = data.toCharArray();
        for(char c : charArray){
            if(BAD_CHAR.indexOf(c)<0){
                buffer.append(c);
            }
        }
        return buffer.toString();
    }
}

Setiap kali kita akan melakukan insert atau update, yang perlu dilakukan adalah membuang karakter-karakter buruk seperti ‘ ` ~ dan ”

Kode query diatas bisa dirubah menjadi

String name = "Martin O'neal";
String club = "aston villa"
String sql = "insert into headcoach(name,club) values ("+ StringUtils.removeBadChar(name) + "," + StringUtils.removeBadChar(club) +")";
Statement stm = conn.createStatement();
stm.execute(sql);

Morale story: Use PreparedStatement please!

→ No CommentsTags: mysql

MySQLDump memisahkan schema dan data

May 14th, 2009 · No Comments

Beberapa bulan terakhir gw berkutat dengan development yang struktur tablenya berubah-rubah cukup sering seiring adanya change request dari user. Sejalan dengan itu gw harus bisa mantain struktur data dan sample data. Sebenarnya cara yang paling optimal adalah mengenerate struktur data dari Entity hibernate, namun karena struktur tablenya sedikit tidak sinkron dengan mapping entitynya, hal tersebut tidak dapat dilakukan.

Pada awalnya gw menyimpan struktur table dan datanya di satu file .sql hasil dump, kalau ada perubahan struktur table gw buat satu lagi file .sql yang menyimpan statement alter dari struktur table utama. Masalah kemudian muncul karena ternyata perubahan struktur cukup sering terjadi seiring adanya change request dari user, akhirnya gw punya cukup banyak file .sql.

Endy memberikan saran untuk memisahkan antara struktur table dan data, setiap kali ada perubahan struktur table gw langsung lakukan di mysql instance, kemudian gw dump struktur table dan datanya secara terpisah agar lebih mantainable. Nah berikut ini perintah mysqldump untuk menyumpan struktur table dan data secara terpisah :

$ mysqldump -u termos -p mydb -d > mydb-schema.sql
$ mysqldump -u termos -p mydb -n -t -c > mydb-data.sql

→ No CommentsTags: mysql

MD5 hash di java

May 11th, 2009 · No Comments

MD5 di java ternyata tidak terlalu susah. Java Criptography Extention sudah menyediakan class untuk melakukan enkripsi. Kira-kira begini kodenya :

            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] ret = digest.digest("test".getBytes());

Masalahnya adalah kita perlu mekalukan convert dari byte[] menjadi string hexa decimal. Caranya ternyata tidak terlalu susah juga, saya ambil dari tutorial ini :

http://www.rgagnon.com/javadetails/java-0596.html

Saya copy paste deh kodenya ke sini :

import java.io.UnsupportedEncodingException;
public class StringUtils {
  static final byte[] HEX_CHAR_TABLE = {
    (byte)'0', (byte)'1', (byte)'2', (byte)'3',
    (byte)'4', (byte)'5', (byte)'6', (byte)'7',
    (byte)'8', (byte)'9', (byte)'a', (byte)'b',
    (byte)'c', (byte)'d', (byte)'e', (byte)'f'
  };
  public static String getHexString(byte[] raw)
    throws UnsupportedEncodingException
  {
    byte[] hex = new byte[2 * raw.length];
    int index = 0;
    for (byte b : raw) {
      int v = b & 0xFF;
      hex[index++] = HEX_CHAR_TABLE[v >>> 4];
      hex[index++] = HEX_CHAR_TABLE[v & 0xF];
    }
    return new String(hex, "ASCII");
  }
}

nah setelah membuat class StringUtils diatas, kode untuk convert text menjadi MD5 hash jadi seperti ini :

            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] ret = digest.digest("test".getBytes());
            System.out.println(StringUtils.getHexString(ret));

Ada juga yang membuat library fast MD5 jika kita ingin membuat MD5 hash dengan lebih cepat.

http://www.twmacinta.com/myjava/fast_md5.php

hasil download fast md5 ini berupa zip dan source code. Untuk melakukan kompilasi install dulu ant, kemudian jalankan perintah “ant jar” dari folder hasil extract file zip, akan dihasilkan file jar. Gunakan file jar tersebut sebagai libary.

Kode untuk menggunakan fast-md5 ini sangat gampang

            MD5 md5 = new MD5("test");
            System.out.println(md5.asHex());

Hasilnya sama persis dengan hasil fungsi md5() di php.

Selamat mencoba

→ No CommentsTags: netbeans

26

March 15th, 2009 · 4 Comments

Hari ini gw 26 tahun, tahun lalu semua seperti berjalan sangat cepat. Momentum besar-besar terjadi dengan sangat tak terduga. Mulai dari kenekatan gw dan Endy membuat perusahaan dengan modal dengkul, sampai ketika saat mendebarkan melamar gadis cantiq berjilbab ini lebaran tahun lalu. 

Tahun depan sepertinya akan jauh lebih “semarak” lagi, artivisi telah berkembang cepat, sampai-sampai gw sendiri gak percaya. Februari 2 tahun lalu, kita cuma bertiga. Bulan berikutnya sudah berlima. Setelah setahun, kita sudah ber-22 (karyawan + siswa magang). Gimana rasanya ber-100 ya? 

Tadi malam rasanya semuanya berjalan sempurna, dimulai dengan MU yang dihajar Liv 4-1 lanjut arsenal menang 4-0. Semuanya ditonton sambil ditemani … ehm ehm.

Tahun depan, sasaran gw kira-kira begini:
   - Menikah
   - Artivisi sudah punya divisi training dengan ruang traning yang exelent
   - Belajar bahasa lain selain java, Ruby?
   - More managing than just Coding 
yah cukup deh, ga usah banyak-banyak, sepertinya berat-berat semua ;)

 

→ 4 CommentsTags: life

Mrinding!

March 11th, 2009 · 2 Comments

Dari minggu lalu artivisi punya kantor baru, di wisma fajar blok A lt 2. Itu lho gedung tua sebelahnya hotel atlit century park. Setiap hari ceritanya serem-serem terus, ada yang lihat “bayangan berkelebat”, “suara meja diseret-seret”, uhhh…..

Tadi malem akhirnya saya terbangun jam 2.30 trus tidur lagi, eh pikiranya hantu terus… aduh maaak ini kantor baru dan kos baru kok bikin mrinding semua siih…

aw aw..

→ 2 CommentsTags: life