On Base64

March 31st, 2009 by Peb Ruswono Aryan

*duh, dah lama nggak update blog saking sibuknya (cari alesan)*

Beberapa waktu yang lalu ada permintaan untuk melakukan encoding/decoding ke format base64. karena waktu yang mendesak dan jumlah item requirement yang banyak maka alternatif pertama adalah mencari kode public domain di internet. ternyata tidak satupun yang bisa dipakai (pada saat yang sempit itu). hambatannya bermacam-macam, mulai dari hasil encoding yang tidak sesuai, atau hasil decoding yang beda dengan acuan. setelah duduk sebentar sambil melototin lagi halaman wikipedia yang mendeskripsikan aturan pengkodean basis64 akhirnya langkah terakhir malah bikin sendiri fungsi yang sesuai dengan spek (teks dari/ke base64, binary(variabel bertipe ataupun byte stream) dari/ke base64).

bagi yang berminat menggunakan, dipersilakan menggunakan kode berikut sebebas-bebasnya (pubdom as no warranty for using).

(*
 * auth : Peb Ruswono Aryan
 * desc : base64 encoding/decoding for delphi
 *)
type
  tbytearr = array of byte;

{
	encode64 : Pointer x Nat --> string
	desc: encode binary data to base64 message
}
function encode64( const v: Pointer; vsize: cardinal ): string;
const
  lut64             = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var
  tribyte           : array[0..2] of byte;
  p                 : PByteArray;
  ci, i             : cardinal;

  function enc3byteto4char( len: integer ): string;
  begin
    result := lut64[1 + tribyte[0] shr 2];
    result := result + lut64[1 + ( ( tribyte[0] and $03 ) shl 4 ) + ( tribyte[1] shr 4 )];
    if len > 1 then
      result := result + lut64[1 + ( tribyte[1] and $0F ) shl 2 + ( tribyte[2] shr 6 )]
    else
      result := result + '=';
    if len > 2 then
      result := result + lut64[1 + tribyte[2] and $3F]
    else
      result := result + '=';
  end;
begin
  p := PByteArray( v );
  ci := 0;
  repeat
    i := 0;
    while i < 3 do begin
      if ci >= vsize then break;
      tribyte[i] := p[ci];
      inc( ci );
      inc( i );
    end;
    result := result + enc3byteto4char( i );
  until ci >= vsize;
end;

{
	decode64 : String --> DynamicArray of byte
	desc: decode base64message to binary data (array of byte)
}
function decode64( msg: string ): TbyteArr;
var
  pb                : array of byte;
  lm, pi            : integer;
  len               : integer;

  function decodechar( c: char; var code: byte ): boolean;
  begin
    result := true;
    case c of
      'A'..'Z': code := ord( c ) - ord( 'A' );
      'a'..'z': code := ord( c ) - ord( 'a' ) + 26;
      '0'..'9': code := ord( c ) - ord( '0' ) + 52;
      '+': code := 62;
      '/': code := 63;
    else
      result := false;
    end;
  end;

  procedure decodeblock( blk: string );
  var
    t, i            : byte;
    w               : dword;
  begin
    w := 0;
    i := 0;
    while i < 4 do begin
      if not decodechar( blk[i + 1], t ) then break;
      w := w shl 6 + t;
      inc( i );
    end;
    result[pi] := ( w shr 16 ) and $FF;
    inc( pi );
    if pi >= len then exit;
    result[pi] := ( w shr 8 ) and $FF;
    inc( pi );
    if pi >= len then exit;
    result[pi] := ( w and $FF );
    inc( pi );
  end;
begin
  len := length( msg ) * 3 div 4;
  lm := length( msg );
  if msg[lm] = '=' then dec( len );
  if msg[lm - 1] = '=' then dec( len );
  setlength( result, len );
  pi := 0;
  repeat
    decodeblock( copy( msg, 1, 4 ) );
    delete( msg, 1, 4 );
  until length( msg ) <= 0;
end;

{
	encode64str : string --> string
	desc: encode text string into base64 message
}
function encode64str( msg: string ): string;
var
  p                 : TByteArr;
  i                 : integer;
begin
  setlength( p, length( msg ) );
  for i := 0 to high( p ) do
    p[i] := ord( msg[i + 1] );
  result := encode64( @p[0], length( p ) );
end;

{
	decode64str : string --> string
	desc: decode base64 message containing text
}
function decode64str( msg: string ): string;
var
  p                 : TByteArr;
  i                 : integer;
begin
  result := '';
  p := decode64( msg );
  for i := 0 to length( p ) do
    result := result + chr( p[i] );
end;

Bad Day

March 31st, 2009 by Petra Novandi Barus

Well, actually there is no bad day. A day is a day. There is neither good day nor bad day. A day is as good as how one thinks of and as bad as what one makes it.

A friend once told me a story

A shepherd was asked by his friend, “will it be rain or sunny?”

He answered, “I don’t know but one thing: I will love it”. His friend so curious, “If you don’t know what it will be, how do you know whether you will love it?”

And the shepherd simply replied, “I had learnt that I couldn’t change the weather but I could change my heart to like whatever I have been given”

Despite how boring your lecturer was lecturing this morning, how many appointments you had to cancel few days ago only for an appointment that suddenly canceled by your friend today, how wet your clothes got while walking to dental clinic in rain -forgetting your umbrella and having to catch up the appointment-, how many hours you had to waste waiting for your so-late dentist in wet clothes, how uninteresting newspaper you bought in the wait -because you thought it would be nice to wait reading newspaper-, how bad your lunch -because you unconsciously put to much chilly on it-, how hurt headache you got from walking in the rain, how buggy your code for this-week-due assignment; it’s you who decides whether this day a good day or a bad day.

It’s you the one who smiles before calling it a day.

And I really want to smile before this long night sleep….

Laptop Baru!

March 30th, 2009 by Petra Novandi Barus

Akhirnya dieksekusikan saja, sodara-sodara, beli laptopnya!

Ini produknya! Lumayan lah, dengan spek yang diinginkan harganya cukup terjangkau Semoga bisa lebih produktif!

Kasi nama apa ya, laptopnya….. Ada usul gak?
*Bosen kasi nama komputer-komputer gw berdasarkan harganya *

Hujan, Kerudung Hitam, dan 11 Januari

March 29th, 2009 by Muhammad Insan Al Amin

Hari ini jam 10 pagi berkemas pergi dari kostan untuk ikut kampanye partai keluarga sumringah di gasibu. di jalan jalan, simpatisan dan kader partai tsb tumpah tubleg dengan atribut yg unik unik. Ada yg naek delman, yg bawa roko, ada juga yg bawa istri.

Gasibu macet banget yah, ada ibu ibu, cewek2 gaul, tukang pakean luar dan dalem, polisi polisi gagah berseragam, petani, dan panggung yg besar.

Jam 10, kampanye dimulai. Ada mupla, djiwa, Iwan Falsu, juga MC yg umurnya macem macem. Ada yg tua dua orang, satu lagi masih kisaran 28 - 30 taunan lah.

Asa teu paruguh yeuh, baru di kampanye partai kita sayangi ada musik yg gedebuk gedebuk banyak melodian. Apalagi vokalisnya britis2 emo. Yah tapi suasana jadi tambah rame, dan massa nambah banyak. Djiwa band. ( sori kalo salah ngeja hehehe )

Tiba tiba ada bang Iwan, Iwan Falsu. Lagu pertamanya “Bento” langsung disambut sama orang yg pada nonton. Gaya ngebawain lagunya mirip sama Iwan yang asli. Cuma rada lebih cempreng dan nyereng hehehe.

Jam 12 break solat. Ketemu si Mas Bay dan kakaknya. Ditraktir timbel, di suatu gerobak di taman lansia jalan diponogoro bdg. Timbelnya enak euy.

[ PLC : siemens , omron . Siemens especially. Omron bekas : 1 jt. KP cari yg PLC, lebih mangpaat ]

Jam satu, dari tempat timbel kedenger musik paling indah di negri ini, Indonesia Raya instrumentalis. lagu itu seolah manggil kami bertiga untuk segera ke lapangan. Beuhhh.. jadi penuh begindang cuy.

Shoutul Harokah main, menyanyikan lagu yg diputer di kampanye yg sama 5 taun lalu pas kelas 1 SMA. how nostalgic brow. Lalu bang iwan falsu nyanyi himnenya partai kusuka selalu. hehehe, hehehe, promosi tingkat tinggi yeuh!!

Berdoa, ngangkat tangan ke udara biar semuanya bisa jadi orang yg amanah, bersih hati, limpah rejeki

Orasi dari pak Ahmad Heryawan. Hidup ibu ibu !!! hiduuuup , Hidup ciparay !! hiduuup , Hidup …

Hujan

Basah

Berlari mencari pelindung

Cwek memisahkan diri membentuk barisan yg dijaga ama kader2 yg diantaranya seorang gadis berkerudung hitam yg tatapan matanya ngeluluh lantakin hati saya yg lagi kehujanan.

Orasi dari para caleg

Harapan DPR yang bersih, yang harus diwujud bareng bareng !

Ganti MC, Aa jenggot, Teteh Cantik

Ibu Ledia berpantun

Amanah dari bapak ketua majelis suro yg bisa ngomong sunda

hujan yg semakin lebat

dan..

GIGI EUYYYYYYYYYYY , Band Gigi, nyaho teu ? Si Ncep Arman kembali goyang kampanye hujan dengan 9 hitsnya. Jomblo , 11 Januari , Pintu Sorga, Kepastian yg ku tunggu, nakal, hingga perdamaian dan kawan kawan.

11 Januari bertemu.. menjalani kisah cinta ini.. naluri berkata engkaulah.. milikku

Badan basah, payung orang lain ilang entah kemana

Kampanye pun usai, ditutup dengan 2 lagu dari band para ustad. Bangkitlah negriku, harapan itu masih ada !

Buku Buku Kenangan

March 29th, 2009 by Cecep Mahbub
Fundamental Acoustic, Introduction to Dynamic Systems, Medical Physics, Introduction to Signal Processing, Thermal Enviromental Engineering

Fundamental Accoustic, Introduction to Dynamic Systems, Medical Physics, Introduction to Signal Processing, Thermal Enviromental Engineering

Lagi iseng lihat-lihat rak buku di Garut. Ternyata di tumpukan rak itu ada buku-buku yang dulu pernah jadi bantal di kost-kostan.

Dulunya buku-buku itu ada di tumpukan kardus. Tapi seminggu yang lalu diberesin dan ditumpuk ke rak buku. Bisa dilihat juga ada buku tentang PHP dan UNIX programming, dua buku yang gagal dikuasai dengan baik (sekarang hanya tersisa sedikit saja hahaha).

Arkavidia: IT for Our Future Public Services

March 28th, 2009 by Prasetyo Andy Wicaksono

Arkavidia

Coming soon, 2-4 April 2009 D

Penuh

March 28th, 2009 by Gunawan Prasetia
rserver# ftp ftp.itb.ac.id Connected to ftp.itb.ac.id. 421 50 users (the maximum) are already logged in, sorry ftp> exit rserver# date Sat Mar 28 07:21:38 WIT 2009 Aneh.. dari tadi malam penuh mulu..

Help me : SQLite versus mySQL in PHP

March 27th, 2009 by Anton Rifco

Hi guys,

Lately, I read in http://www.sqlite.org/speed.html, that sqlite is a bit faster than mysql and postgreSQL. But, when I perform a little testing to compare them in PHP, I got a contrast result.

For both testing, I use this table :
CREATE TABLE test (a varchar(20) PRIMARY KEY, b varchar(20), c varchar(20), d varchar(20), e varchar(20),  f varchar(20), g varchar(20), h varchar(20),  i varchar(20), j varchar(20))

for that table, I perform 5000 insert for both sqlite and mysql :
here’s for sqlite code :
=============== sqlite-test.php ===============

$time_start = microtime(true);
$db = sqlite_open(’pegawai.db’, 0666, $sqliteerror);

sqlite_exec($db, "PRAGMA synchronous = OFF;");
for($i = 0; $i < 5000; $i++)
{
$sql = “INSERT INTO test VALUES (’a$i’,'b$i’,'c$i’,'d$i’,'e$i’,'b$i’,'b$i’,'b$i’,'b$i’,'b$i’)”;
$q = sqlite_query($db, $sql);
}
sqlite_close($db);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo “executed in $time seconds\n”;

=========================================

and here’s for mysql code :
============= mysql-test.php ================

………….
$time_start = microtime(true);
for($i = 0; $i < 5000; $i++)
{
$sql = “INSERT INTO test VALUES (’a$i’,'b$i’,'c$i’,'d$i’,'e$i’,'b$i’,'b$i’,'b$i’,'b$i’,'b$i’)”;
$q = mysql_query($sql);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo “executed in $time seconds\n”;
…………..

===========================================

when I run those 2 script, the first one (sqlite) run for 43.4918169975 seconds, while the second (mysql) only take 0.52137298584 seconds.

It means that sqlite run 80x longer than mysql did (very contrast with the one I read in http://www.sqlite.org/speed.html).

Please tell me where do I did wrong. Thanks very much.

Toleransi dalam Dunia Persilatan

March 27th, 2009 by Rima Putri Agustina

yoko1

Kalo sering nonton Derings bangun-kikuk-bangun-kikuk, kalian pasti tau apa yang dimaksud dengan “KIKIL”. Dan KIKIL of the week kali ini adalah sontrek Return of the Condor Heroes yang dipopulerkan oleh Yuni Shara.

Seketika gua langsung teringat masa kecil gua dulu waktu jadi bocah yang hobi banget nonton Yoko. Gua masih inget tuh dulu, saking ngefansnya, sampe-sampe bahan obrolan di sekolah pun (waktu itu gua kelas 4 SD) ga jauh dari urusan Yoko, Bibi Lung, Cupetong, dan tokoh-tokoh lain, serta intrik-intrik yang ada di dalamnya. Dulu kami sempet protes kenapa Bibi Lung-nya diganti. Tentu saja karena Bibi Lung yang asli lebih cantik daripada Bibi Lung imitasi.

Dulu, saat buku diari-yang-wangi-tapi-wanginya-ga-jelas-itu masih berjaya jauh sebelum orgi apalagi binder, geng gua punya salinan lirik lagu sontrek Yoko di diarinya. Untuk apa? Yaitu untuk dinyanyiin bareng-bareng saat istirahat makan siang. (Yo oloh, masa kecil gua ga jelas banget ya.)

Suatu hari, saat tumben-tumbenan gua yang bersuara sember ini ikutan nyanyi bagian refrain-nya, tiba-tiba temen gua nyeletuk “Eh, bentar-bentar, apaan tadi? Tendangan?”

“Iya, tendangan indah pun meeeeemudaaaaar…”

Seketika itu juga geng ga jelas dengan aktivitas ga jelas itu pun tertawa terbahak-bahak, “Woi, kenangan indah bukan tendangan indah…!!!”

Loh, ini kan film silat, wajar dong ada kata-kata tendangan-nya. Harusnya masih bisa ditoleransi lah… Kalian ga belajar PPKn ya?

Sayangnya saat itu gua ga kepikiran buat ngomong kayak gitu.

Pesan moral: Lakukanlah toleransi pada tempatnya.

Pengen beli laptop…..

March 27th, 2009 by Petra Novandi Barus

Bingung ini mau beli laptop….
Laptop yang lama udah rusak parah banget….

Budgetnya kira-kira 6-7 jutaan…. Merk lokal juga gpp (toh cuman bakal bentar ini dipake)

Gak usah bagus-bagus… Yang penting ukurannya gede (sekitar 14 sampe 17 inch….), soalnya gak seneng ngoding di keyboard yang kecil… Cuman buat ngetik sama ngoding doang ini… Yang penting gak terlalu lambat kalo buka iTunes + Word 2007 + XAMPP + Netbeans barengan…. Sistem operasinya juga cuman Windows XP aja (gak suka sama Vista)

Apa ya kira-kira….

Kalau Dosen Pembimbing Ketemu Dengan Orang Tua

March 26th, 2009 by Petra Novandi Barus

Ketika gw masih SD, gw inget banget yang namanya pertemuan orang tua dengan wali kelas. Sebuah acara caturwulan (tiap 4 bulan, kalo gak salah) yang selalu membuat gw ingin tiba-tiba menghilang dari Jakarta dan muncul entah di mana. Bukan kenapa-kenapa, dulu tuh gw termasuk anak yang bandel: males belajar, males ngerjain PR, suka ngobrol di kelas, suka coret-coret buku catatan dengan gambar-gambar kartun, dan lain-lain (kebiasaan yang kayaknya masih kebablasan sampai sekarang). Dan pasti habis acara pertemuan itu pasti gw selalu kena marah….

Sebenarnya di bangku kuliah, tidak ada acara pertemuan saat itu. Acara pertemuan terjadwal yang melibatkan kehadiran orang tua hanya pertemuan IOM dan wisuda. Orang tua biasanya dipanggil ketika mahasiswa yang bersangkutan memiliki kasus akademik. Dan ini biasanya kasusnya sangat jarang terjadi.

Cerita ini berawal ketika gw harus pergi ke Jakarta untuk bimbingan. Well, berhubung dosen pembimbing harus pergi ke Belanda untuk waktu yang sangat lama (meski biasanya juga ninggalin mahasiswa TAnya untuk waktu yang lama juga) dan beliau insist gw harus untuk secepatnya seminar, maka beliau meminta gw untuk segera merampungkan tulisan dan melakukan bimbingan terakhir sebelum seminar.

Yup, gw sepertinya terlihat niat banget sampe harus nyusul ke Jakarta meski esok siangnya ada UTS Sistem Terdistribusi yang konon membuat panik 2 angkatan Informatika. (*alah berlebihan, cem gw belajar aja*)

– Anyway, intermezzo dikit. Sejak perjalanan Jakarta-Makassar dan Jogja-Bandung dalam 5 bulan terakhir ini, Jakarta-Bandung udah gak kerasa lama lagi, hehe. –

Perjalanan dua setengah jam dilalui hanya untuk bimbingan yang cuman setengah jam. Melihat senyuman si Ibu yang sepertinya puas melihat puluhan lembar yang gw ketik 3 hari 2 malam, rasa lelah selama perjalanan Jakarta-Bandung sepertinya hilang. Tiba saatnya untuk pulang, tiba-tiba hujan turun.

Ibu pembimbing bilang, “Kamu udah makan?
Belum, Bu…” (cemmana coba mau makan.. baru juga nyampe di Jakarta )
“Ya udah kamu makan di sini aja. Kamu dijemput siapa?”
“Ayah sama Ibu”
“Ya udah kamu telpon saja, sambil nunggu makan di sini”

Dan akhirnya gw makan di rumah saudaranya beliau itu (rumah beliau khan di Bandung) yang kebetulan deket rumah gw juga. Well, yang ngira ceritanya bakal berlanjut ke gw dikenalin sama ponakan perempuan beliau yang cantik dan seumuran, silakan terus berimajinasi… Soalnya gak ada. Udah pada lulus dan kerja semuanya kayaknya.

Pas tiba-tiba kedengaran bunyi mobil ortu gw, gw langsung bilang.
“Udah dijemput, Bu”
“Oh kamu terusin makan aja. Biar saya yang keluar”
“Oh….”
(aduh perasaan dah gak enak.. tapi, sialnya, makanannya enak banget.. )

Sementara gw menikmati makanan yang enak banget itu, kedengeran suara si Ibunya keluar gerbang, ngejemput orang tua gw, sampai akhirnya ketiganya masuk ke ruang tamu. Dan gw langsung cepet-cepet kelarin makan buat bergabung…

Pembicaraan yang terjadi yah kayaknya standar ibu-ibu ngobrol gitu deh. Si Ibu muji-muji gw. Nyokap gw muji-muji si Ibu sekalian ngerendah-rendahin gw dikit…. Yah, well, entah kenapa sepertinya keliatan si Ibu pengen ketemu ortu gw dan ortu juga pengen ketemu si Ibu.

Pertama-tama agak marah-marah kalo ngasih makan gw….

“Aduh, Bu, si Petra jangan dikasih makan, Bu” , (well, sejak kecil diajarin jangan makan di rumah orang (kecuali rumah impal)… kayak masih berlaku)
“Oh, tenang aja kok, Bu, saya selalu batasi kok”
“Oh gitu ya Bu?”
“Saya khan sering itu bawa makanan buat anak-anak di lab kalau habis ngawas ujian”
(dan maksudnya gw kalo makan pasti diliatin supaya gak nambah lagi…. belum lagi pas di Makassar gw pasti kena marah pas keliatan kepingin nambah….)

Yah abis itu ya gitu deh…

Kami terima kasih banget loh, Bu, Ibu udah mau ngebimbing si Petra(kata nyokap gw)
Iya, Bu, sama-sama(kata si Ibu)
Petra sering cerita tentang Ibu, makanya kami pengen banget ketemu Ibu (hayaaah…… berlebihan deh)
Oh iya??
Petra juga jadi dapat pengalaman ke sana kemari kayak kemaren ke Makassar sama Jogja
Iya, Bu, saya juga terima kasih sama Ibu jadi ada anak
(yang bisa disuruh-suruh maksudnya, hihihi)

Wew, dan ngeliat orang tua sama pembimbing ngobrol tuh entah kenapa rasanya seneng juga sih… Ngeliatin si Ibu cerita tentang aktivitas di Sumatera Utara (which ortu gw dari Sumut juga) dan kebanggaan beliau dengan tempat di sana. Bokap juga cerita-cerita tentang tempat-tempat di sana. Hihihi….

Dan tiba saatnya ngomongin progres TA.

“Iya Bu, saya rencana nanti Petra seminar sensor, prasidang sensor, dan sidang sensor“ , lanjut si Ibunya.
“Oh iya, gitu yah, Bu?”, bales nyokap
“Nanti rencana sehabis prasidang, saya bawa Petra ke Siantar sana. Biar konsen bimbingan TA dan gak keluyuran ke mana-mana” (hayaaaaaah )
“Bawa aja, Bu, silakan!” (weeeeew)
“Biar di sana juga nanti bisa bantu-bantu saya”
“Oh gak apa-apa, Bu, biar bisa fokus TA kalau dekat Ibu”,
nyokap keknya antusias banget ngusir gw ke Siantar….

Yah, well.. Kalau progres tetep lancar, berarti gw dapet tiket liburan perjalanan gratis ke Siantar….. Entah di mana yang namanya Siantar itu….   Maklum, jangankan Siantar; ke Tanah Karo aja gw cuman sekali. (anyway, perasaan ngeliat di peta, Siantar sama Lagu Boti jauh banget deh….)

Dan pas pulang dari tempatnya si Ibu, gw tetep kena marah sama bokap gara-gara dibilang males… Ternyata informasi yang bocor dan gak sempet ketangkap biro penerangan…. huhuhuhu….

Seringai - Mengibarkan Perang (Single)

March 26th, 2009 by Herry Kurniawan

diambil dari DRS,

Ya, sebuah lagu baru dari Seringai! Ini bukan single album terbaru Seringai, hanya sebuah lagu yang diikutkan ke dalam kompilasi Yamaha yang tidak dijual, hanya bisa didapatkan kalau membeli sebuah motor Yamaha. Tapi tentu saja, tidak menjadikan sebuah halangan bagi kalian serigala-serigala, kalian bisa men-download-nya disini! Lagu ini rencananya merupakan lagu non-album untuk album berikut Seringai [tentu saja, rencana bisa berubah x)], dimana Seringai sudah memiliki 7 lagu baru yang sudah diaransemen final, dan 7 lagu lagi yang masih direvisi. Great songs so far!

Dan, ini liriknya:

Mengibarkan Perang

Kerja keras, banting tulang: hanya bertahan hidup.
Curah keringat, simbah darah: apa semua cukup?
Anggap semua permainan, dan mengambil keuntungan.
Mereka takkan peduli dan kita terabaikan.

Mereka selalu sulitkan hidupmu.
Dan kita kan selalu, mencoba bertahan, mencoba melawan.

Siapa mendapat untung, siapa tertinggal di belakang?
Siapa yang tertawa, dan siapa yang membusuk dan meregang?
Semua peraturan ini, menguntungkan - mereka.
Mungkin saatnya kita, memberikan neraka.

Mereka selalu sulitkan hidupmu.
Dan kita kan selalu, mencoba bertahan, mencoba melawan.
Mereka selalu sulitkan hidupmu.
Dan kita kan selalu, mencoba bertahan, mencoba melawan.

Semoga kalian dapat dengan mudah menikmati ”Mengibarkan Perang”!
Keep rocking in the free world, and please spread/forward this news!
Hailz! \m/

Try

* Arian 13 makin mirip siapa yaaaa ,,,,,, hehehe :P

dasar

March 26th, 2009 by Aulia Ibrahim Yeru
hawa nafsu memang jika dibiarkan akan membawa kesengsaraan
kalau begitu, akal sehat harus ditegakkan

In Google We Trust

March 26th, 2009 by Cecep Mahbub

Setelah membaca tulisan Fixer Dave, In Google We Trust, saya jadi sedikit berpikir apakah kita sudah siap ketika suatu saat google berubah jadi “evil”.

Saya sendiri sekarang seorang pengguna gmail, google apps (gmail hosting), membaca rss feed menggunakan google reader, tracking statistik web menggunakan google analytics, kadang pakai google webmaster tools, jadi pelanggan milist yang di hosting di googlegroups, dan tentu saja tidak bisa lepas dari pencarian di mesin pencari google.

Saya (dan mungkin Anda), mungkin telah amat bergantung pada Google. Dan mungkin sudah saatnya bertanya-tanya, apakah kita sudah siap jika suatu saat google menghentikan beberapa servicenya? Apakah sudah siap jika suatu saat Google merubah kebijakan seputar service yang mereka berikan?

Let’s see…

March 26th, 2009 by Eric Lontong
Setelah 2 tahun (atau malah lebih?) melanglang buana kemana-mana (walaupun lebih banyak dunia virtual), yaaaa…. akhirnya ada waktu kosong sejenak buat nulis2 lagi. Perjalanan dimulai dari ngos2an ngemis minta dilulusin (di ujung tanduk buoy!!), sampai sekarang yang baru sadar 2 tahun ini ngapain aja ya? xixixi…. Koploknya, pas ngerjain TA dan udah dekat deadline DO (DropOut, [...]

Masih Malas Blogging Kalau Belum Bisa Blogwalking

March 25th, 2009 by Enggar Subono
Saya lagi-lagi pengen curhat, tentang blogging lagi. Ternyata saya masih benar-benar malas untuk blogging. Karena saya mungkin belum punya waktu untuk blogwalking. Entah kenapa saya berpikir, namanya blogging itu juga harus blogwalking. Ya mungkin ini cuma pikiran saya, tapi rasanya tidak afdhol ngeblog tapi cuma nulis aja di blog. Inginnya bisa jalan-jalan ke blog blogger [...]

Pilihlah Pulau Komodo Sebagai 7 Keajaiban Dunia yang Baru

March 25th, 2009 by Rendy Maulana

Dulu sewaktu saya masih SD, 7 Keajaiban Dunia itu hanya itu itu saja, mulai dari Borobudur, Taman Gantung Babylonia, dan kawan kawannya, lepas dari SD, saya tidak memerhatikan lagi apa itu 7 Keajaiban Dunia dan bagaimana perkembangannya.

Facebook merupakan salah satu alternatif saya dalam menemukan perkembangan informasi yang ada di Indonesia, dari undangan seorang teman di Departemen Kebudayaan dan Pariwisata Indonesia, saya mengetahui bahwa saat ini Keajaiban dunia adalah pilihan dari mayoritas orang-orang yang ada di Dunia, dan Anda adalah salah satu orang yang dapat mengubah kondisi tersebut.

Indonesia memiliki banyak sekali obyek wisata yang menarik dan juga sepantasnya masuk kedalam 7 Keajaiban Dunia, Borobudur, Candi Prambanan, Pulau Komodo, dan masih banyak lagi obyek menarik yang bisa kita Kunjungi.

Bagaimana cara kita utuk memilih Pulau Komodo Sebagai 7 Keajaiban Dunia yang Baru ? Caranya cukup mudah, hanya tinggal membuka situs New7Wonders, dan masuk kedalam menu Vote now for Komodo National Park.

Terus terang saya ingin sekali ke Pulau Komodo, melihat bagaimana rupanya hewan purba kala tersebut dari jarak dekat di alamnya, ada yang mau juga ke Pulau Komodo ?

addthis_url = 'http%3A%2F%2Fwww.rendymaulana.com%2Farchives%2F2009%2F03%2F25%2Fpilihlah-pulau-komodo-sebagai-7-keajaiban-dunia-yang-baru%2F'; addthis_title = 'Pilihlah+Pulau+Komodo+Sebagai+7+Keajaiban+Dunia+yang+Baru'; addthis_pub = '';

JMS Quick Start Using Apache ActiveMQ

March 25th, 2009 by Lindung P. Manik
Read first JMS First Impression in the previous post. A JMS message has three parts:
1. Header, consists of: JMSDestination, JMSDeliveryMode, JMSExpiration, JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, JMSReplyTo, JMSType, JMSRedelivered.
2. Properties (optional). If we need addition values besides header fields, we can set and create message properties.
3. Body (optional). JMS API defined five message body formats, also called message types, consists of: TextMessage, MapMessage, BytesMessage, StreamMessage, ObjectMessage, Message.

JMS Message delivery styles. JMS supports synchronous and asynchronous delivery messages:
1. Synchronous Delivery. For example:
A client can request the next message from a message consumer using one of its receive methods. There are several variations of receive that allow a client to poll or wait for the next message.

QueueReceiver receiver = null;
receiver = session.createReceiver(queue);
StreamMessage stockMessage;
stockMessage = (StreamMessage)receiver.receive();

In the above code fragment, the receiver will wait indefinitely for a message. Alternatively, we could have specified a timeout in milliseconds, such as:

// wait for 10 seconds only.
stockMessage = (StreamMessage)receiver.receive(10*1000);

Or, no wait at all:

// Don’t wait?
stockMessage = (StreamMessage)receiver.receiveNoWait();

2. Asynchronous Delivery
Instead of waiting/polling the message consumer for messages, a client can register a message listener with a message consumer. A message listener is an object that implements the MessageListener.

// asynchronous reader, register a message listener.
// listener will be called for each message that come into the queue
receiver.setMessageListener(listener);

At last, but not at least. We will make a Point-to-Point Simple Calculator Application. Client will write message in queue in XML format after got request from user and read synchronously a response queue from server with specific time out by using a selector. Server will read request queue asynchronously and write response in response queue. I'm using Netbeans 6.5, and Spring Framework. Also prepare the other library like jms.jar, dom4j.jar, and Apache ActiveMQ library. Create a new Java application named CalculatorMQ. Create new package named com.ndung.mq.util. In this package we will write all utility class that needed by JMS and MQ Vendor. The First class named MQConfig.java.

package com.ndung.mq.util;

public class MQConfig {
private String queueName;
private int timeout;

//getter & setter
}


The second class named MQWriter.java. This class will be used to write message in queue.

package com.ndung.mq.util;

import java.io.*;
import java.util.Map;
import java.util.Properties;
import javax.jms.*;
import javax.naming.*;

public class MQWriter {

private ConnectionFactory queueConnectionFactory;
private QueueConnection queueConnection;
private QueueSession queueSession;
private Queue queue;
private QueueSender queueSender;
private MQConfig config;

public MQWriter(MQConfig config) {
this.config = config;
}

public void init() {
openConnection();
}

public void terminate() {
try {
if (queueConnection != null) {
queueConnection.close();
queueConnection = null;
}
} catch (JMSException e) {
e.printStackTrace();
}
}

public void openConnection(){
try {
Properties props = new Properties();
props.load(new FileInputStream(new File("src/jndi.properties")));
Context jndiContext = new InitialContext(props);
queueConnectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");
queueConnection = (QueueConnection) queueConnectionFactory.createConnection();
queueConnection.start();
} catch (NamingException ne) {
ne.printStackTrace();
} catch (JMSException je) {
je.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
}

public void write(String message, Map properties) throws JMSException {
queueSender = null;
queueSession = null;
try {
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = queueSession.createQueue(config.getQueueName());
queueSender = queueSession.createSender(queue);
TextMessage textMessage = queueSession.createTextMessage();
if (properties != null || properties.size() != 0) {
for (Object o : properties.keySet()) {
if (o instanceof String)
textMessage.setStringProperty(o.toString(), properties.get(o).toString());
if (o instanceof Integer)
textMessage.setIntProperty(o.toString(), Integer.parseInt(properties.get(o).toString()));
if (o instanceof Long)
textMessage.setLongProperty(o.toString(), Long.parseLong(properties.get(o).toString()));
}
}
textMessage.setText(message);
queueSender.send(textMessage);
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (queueSender != null)
queueSender.close();
if (queueSession != null)
queueSession.close();
}
}
}

The third class named MQSyncReader.java. This class will read message in queue synchronously.

package com.ndung.mq.util;

import java.io.*;
import java.util.Properties;
import javax.jms.*;
import javax.naming.*;

public class MQSyncReader {

private ConnectionFactory queueConnectionFactory;
private QueueConnection queueConnection;
private QueueSession queueSession;
private Queue queue;
private QueueReceiver queueReceiver;
private MQConfig config;

public MQSyncReader(MQConfig config) {
this.config = config;
}

public void init() {
openConnection();
}

public void terminate() {
try {
if (queueSession != null)
queueSession.close();
if (queueConnection != null)
queueConnection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}

public void openConnection() {
try {
Properties props = new Properties();
props.load(new FileInputStream(new File("src/jndi.properties")));
Context jndiContext = new InitialContext(props);

queueConnectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");
queueConnection = (QueueConnection) queueConnectionFactory.createConnection();
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueConnection.start();
} catch (NamingException ne) {
ne.printStackTrace();
} catch (JMSException je) {
je.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
}

public String read(String selector) throws JMSException {
queueReceiver = null;
String out = "";
try {
queue = queueSession.createQueue(config.getQueueName());
if (selector != null || !selector.equals("")) {
queueReceiver = queueSession.createReceiver(queue, selector);
} else {
queueReceiver = queueSession.createReceiver(queue);
}
TextMessage textMessage = null;
if (config.getTimeout() != -1)
textMessage = (TextMessage) queueReceiver.receive(config.getTimeout());
else
textMessage = (TextMessage) queueReceiver.receive();
if (textMessage != null)
out = textMessage.getText();
} catch (JMSException je) {
je.printStackTrace();
} finally {
if (queueReceiver != null)
queueReceiver.close();
}
return out;
}
}

The third class named MQAsyncReader.java. This class will read message in queue asynchronously.

package com.ndung.mq.util;

import java.io.*;
import java.util.Properties;
import javax.jms.*;
import javax.naming.*;

public class MQAsyncReader implements Runnable{

private ConnectionFactory queueConnectionFactory;
private QueueConnection queueConnection;
private QueueSession queueSession;
private Queue queue;
private QueueReceiver queueReceiver;
private MQConfig config;
private MessageListener listener;
private volatile Thread thread = null;

public MQAsyncReader(MQConfig config, MessageListener listener) {
this.config = config;
this.listener = listener;
}

public void start(){
try{
Properties props = new Properties();
props.load(new FileInputStream(new File("src/jndi.properties")));
Context jndiContext = new InitialContext(props);

queueConnectionFactory = (ConnectionFactory) jndiContext.lookup("ConnectionFactory");
queueConnection = (QueueConnection) queueConnectionFactory.createConnection();
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueConnection.start();
queue = queueSession.createQueue(config.getQueueName());
queueReceiver = queueSession.createReceiver(queue);
thread = new Thread(this);
thread.start();
}
catch(NamingException ne){
ne.printStackTrace();
}
catch(JMSException je){
je.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
}

public void stop() throws JMSException {
thread.interrupt();
thread = null;
if (queueReceiver != null)
queueReceiver.close();
if (queueSession != null)
queueSession.close();
if (queueConnection != null)
queueConnection.close();
}

public void run() {
Thread thisThread = Thread.currentThread();
while (thisThread == thread) {
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
ie.printStackTrace();
break;
}

try{
queueReceiver.setMessageListener(listener);
}
catch(JMSException ex){
ex.printStackTrace();
}
}
}
}

Then we will make client application. Create package named com.ndung.calc.client. Create two classes named Client.java and Main.java.

package com.ndung.calc.client;

import com.ndung.mq.util.MQSyncReader;
import com.ndung.mq.util.MQWriter;
import java.util.HashMap;
import java.util.Map;
import javax.jms.JMSException;

public class Client {
private MQWriter mQWriter;
private MQSyncReader mQSyncReader;
private String transid;

public Client(MQWriter mQWriter, MQSyncReader mQSyncReader){
this.mQWriter = mQWriter;
this.mQSyncReader = mQSyncReader;
}

public String execute(int arg1, String operator, int arg2) throws JMSException{
this.transid = String.valueOf(System.currentTimeMillis());
String message = "\n" +
"\n" +
""+arg1+"\n"+
""+operator+"\n"+
""+arg2+"\n"+
"";
queuePullRequest(message);
String result = lookupFromQueue();
return result;
}

private void queuePullRequest(String message) throws JMSException {
Map map = new HashMap();
map.put("TransactionID", transid);
mQWriter.write(message, map);
}

private String lookupFromQueue() throws JMSException{
StringBuffer selector = new StringBuffer(1024);
selector.append("TransactionID = '").append(transid).append("'");
return mQSyncReader.read(selector.toString());
}
}


package com.ndung.calc.client;

import java.util.Scanner;
import javax.jms.JMSException;
import javax.naming.NamingException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {
public static void main(String[] args) throws NamingException, JMSException {
Scanner scanner = new Scanner(System.in);
System.out.print("Please input the first arg: ");
int arg1 = scanner.nextInt();
System.out.print("Please input the operation, example: +,-,/,* : ");
String operator = scanner.next();
System.out.print("Please input the second arg: ");
int arg2 = scanner.nextInt();

ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Client client = (Client) ctx.getBean("client");
System.out.println("The Result is = "+client.execute(arg1, operator, arg2));
}
}

After that we make server application. Create package named com.ndung.calc.server. First make a listener class that will be registered to catch for each message that listed in request queue. This class named MQHandler.java. Then make an interface named Processor.java, that used to process request. And then four classes that implements Processor. These classes represent each calculator operation that will be handled. Last, make a Main class for server application named Main.java.

package com.ndung.calc.server;

import com.ndung.mq.util.MQWriter;
import java.io.*;
import java.util.*;
import javax.jms.*;
import org.dom4j.*;
import org.dom4j.io.SAXReader;

public class MQHandler implements MessageListener{

Map<String, Processor> map;
MQWriter mQWriter;

public MQHandler(Map<String, Processor> map, MQWriter mqWriter){
this.map = map;
this.mQWriter = mqWriter;
}

public void onMessage(Message msg) {
try {
if (msg instanceof TextMessage) {
TextMessage txtMsg = (TextMessage) msg;
String rqMsg = txtMsg.getText();
System.out.println(rqMsg);
String transID = txtMsg.getStringProperty("TransactionID");
Map properties = new HashMap();
properties.put("TransactionID", transID);
//process response message
InputStream in = new ByteArrayInputStream(rqMsg.getBytes());
SAXReader reader = new SAXReader();
Document document = reader.read(in);
Element root = document.getRootElement();
int arg1 = Integer.parseInt(root.elementText("arg1"));
int arg2 = Integer.parseInt(root.elementText("arg2"));
String operator = root.elementText("operator");
Processor processor = map.get(operator);
int result = 0;
if (processor!=null)
result = processor.process(arg1, arg2);
System.out.println("RESULT="+result);
mQWriter.write(String.valueOf(result), properties);
}
} catch (JMSException e) {
e.printStackTrace();
} catch (DocumentException de){
de.printStackTrace();
}
}
}


package com.ndung.calc.server;

public interface Processor {
public int process(int arg0, int arg1);
}


package com.ndung.calc.server;

public class ProcessorAdd implements Processor{

public ProcessorAdd(){
}

public int process(int arg0, int arg1) {
int result = arg0 + arg1;
return result;
}
}


package com.ndung.calc.server;

import com.ndung.mq.util.MQAsyncReader;
import javax.jms.JMSException;
import javax.naming.NamingException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {
private boolean active = true;
MQAsyncReader[] reader;
private int maxHandler = 1;
static ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");

public void start() throws JMSException {
MQAsyncReader r = (MQAsyncReader) ctx.getBean("mqAsyncReader");
if (active) {
reader = new MQAsyncReader[maxHandler];
for (int i = 0; i < maxHandler; i++) {
reader[i] = r;
reader[i].start();
}
}
else {
System.out.println("start no active");
}
}

public synchronized void stop() throws JMSException {
for (int i = 0; i < reader.length; i++) {
reader[i].stop();
}
}

public static void main(String[] args) throws NamingException, JMSException{
final Main main = new Main();
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
public void run() {
try {
main.stop();
} catch (JMSException ex) {
ex.printStackTrace();
}
}
}, "ShutdownHook"));
main.start();
}
}

Last make two configuration files in folder src. First named jndi.properties that used for JNDI configuration and the second named applicationContext.xml that used for Spring configuration file.

java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="mqAsyncReader" class="com.ndung.mq.util.MQAsyncReader">
<constructor-arg>
<ref local="reqConfig" />
</constructor-arg>
<constructor-arg>
<ref local="mqHandler" />
</constructor-arg>
</bean>
<bean id="reqConfig" class="com.ndung.mq.util.MQConfig">
<property name="queueName">
<value>Q.REQUEST</value>
</property>
</bean>
<bean id="respConfig" class="com.ndung.mq.util.MQConfig">
<property name="queueName">
<value>Q.RESPONSE</value>
</property>
<property name="timeout">
<value>20000</value>
</property>
</bean>
<bean id="mqHandler" class="com.ndung.calc.server.MQHandler">
<constructor-arg>
<map>
<entry key="+">
<bean class="com.ndung.calc.server.ProcessorAdd">
</bean>
</map>
</constructor-arg>
<constructor-arg>
<ref local="mqRespWriter" />
</constructor-arg>
</bean>
<bean id="mqReqWriter" class="com.ndung.mq.util.MQWriter" init-method="init"
destroy-method="terminate">
<constructor-arg>
<ref local="reqConfig" />
</constructor-arg>
</bean>
<bean id="mqRespSyncReader" class="com.ndung.mq.util.MQSyncReader" init-method="init"
destroy-method="terminate">
<constructor-arg>
<ref local="respConfig" />
</constructor-arg>
</bean>
<bean id="client" class="com.ndung.calc.client.Client">
<constructor-arg>
<ref local="mqReqWriter"/>
</constructor-arg>
<constructor-arg>
<ref local="mqRespSyncReader"/>
</constructor-arg>
</bean>
<bean id="mqRespWriter" class="com.ndung.mq.util.MQWriter" init-method="init"
destroy-method="terminate">
<constructor-arg>
<ref local="respConfig" />
</constructor-arg>
</bean>
</beans>

Run one instance of com.ndung.calc.server.Main, run and enter user inputs for several instance of com.ndung.calc.client.Main. Next post, introducing into MQ vendor that so many used in market and industry. It is MQSeries from IBM.

100 Hari Menuju Wisuda Juli 2009

March 25th, 2009 by Petra Novandi Barus

MENILIK


MENIMBANG


MENANYAKAN

Sudah seberapa besar kah usahaku memasuki H-100 ini?

Lima Hal, Bukan Nomor Lima

March 24th, 2009 by Irvan Tambunan
Sebenarnya, saya sudah lama ingin sekali menulis tentang 5 hal untuk menilai pasangan anda. Saya mohon agar anda tidak terlalu serius menanggapinya. Ini hanya sekadar rangkuman pembicaraan yang tidak terfilter sama sekali. Jadi, santai saja. Jangan terlalu diambil hati. Lima hal yang digunakan tersebut adalah sebagai berikut : 1. Resolusi Anda harus pintar atau lebih tepatnya [...]

« Previous Entries