30 November 2008

Membuat Peta Digital dengan Flash MX


Sesuai dengan permintaan tentang cara membuat peta digital dengan flash di komentar posting tentang peta surabaya, akhirnya jadilah program darurat ini. Bagi yang pernah mempelajari GIS (Geoghraphical Information System), pasti punya pandangan lain seputar "peta digital". Sedangkan program ini cuma untuk memberikan gambaran dan pencerahan betapa mudahnya membuat sebuah peta digital dengan menggunakan flash. Ngga sampe sejam kok. Tutorial ini menggunakan Macromedia Flash MX, bukan Flash 5 yang terlalu sederhana, dan juga bukan Flash 2004 keatas yang begitu rumit. Fungsi utama yang sudah ada disini berupa navigasi, zooming, dragging, dan jump to location. Tentang penjelasan langkah pembuatan, dengan begitu begitu banyaknya langkah yang harus dilakukan dan peletakkan action script, yang entah dimana saja ada, Tentu tidak bisa dijelaskan dengan cara konvensional, "klik sana dan open sini dan selanjutnya gini gitu" TM. Yang penting adalah langkah dasar yang harus dilakukan, mempelajari script dalam file FLA secara langsung, setelah itu tinggal dikembangkan sendiri secara langsung. Tentu dengan asumsi dasar sudah bisa caranya membuka file FLA. Gunakan kolom komentar untuk pertanyaan lanjutan.

Langkah dasar:
- Siapkan semua bahan: gambar peta, library tombol, suara, dan multimedia item lainnya yang akan dipakai.
- Buat Dokumen flash sesuaikan dengan ukuran gambar peta. Untuk contoh ini punya ukuran 1000x600 px dengan satu scene, dua layer, dan satu frameset.
- Tambahkan peta ke layer satu dan komponen lainnya ke layer 2.
- Buat semua komponen movie clip dan button yang dibutuhkan: Peta, Tombol Navigasi, Tombol Zoom, Text keterangan.
- Pastikan untuk memberi nama semua komponen dengan nama yang unik. Nama inilah yang akan dipanggil melalui action script.
- Tambahkan action script yang dibutuhkan di frame. Script ini berjalan secara global. Skrip ini untuk dragging mouse.
- Tambahkan script untuk setiap komponen tombol yang dibutuhkan. setiap komponen mempunyai script sesuai dengan event yang dijalankan.
- Untuk membuat jump to location, Buat daftar tempatnya, masukkan dalam listbox. Tandai semua lokasi sesuai dengan list dengan sebuah symbol, jangan lupa beri nama. Kemudian Tempatkan script-nya di frame 1. Ubah warna symbol penanda lokasi dengan warna background / putih agar tidak kelihatan.
- Untuk Dragging, tempatkan scriptnya di object peta.
- Gunakan Window, Movie Explorer untuk melihat semua komponen beserta semua script yang sudah ada.
- Coba jalankan, Gunakan perintah publish untuk membuat hasil berupa swf dan exe projector.

Gampang Khan?
Pikiran Anda pasti terlalu kreatif untuk bisa puas dengan cuma hasil segini. Jadi, kembangkan saja sesuai imajinasi dan berbagilah.


Script:

Scene 1
actions for frame 1
_global.w = 401;
_global.h = 301;
_root.L.setChangeHandler("myHandler");
function myHandler(component) { // Untuk Jump to Location
MAPS._width =800;
MAPS._height = 600;
if (_root.L.getSelectedIndex() == 0) {
_root.MAPS._x = _root.MAPS._width-_root.facebook._x;
_root.MAPS._y = _root.MAPS._height-_root.facebook._y;
} else if (_root.L.getSelectedIndex() == 1) {
_root.MAPS._x = _root.MAPS._width-_root.friendster._x;
_root.MAPS._y = _root.MAPS._height-_root.friendster._y;
} else if (_root.L.getSelectedIndex() == 2) {
_root.MAPS._x = _root.MAPS._width-_root.youtube._x;
_root.MAPS._y = _root.MAPS._height-_root.youtube._y;
} else if (_root.L.getSelectedIndex() == 3) {
_root.MAPS._x = _root.MAPS._width-_root.WINDOWS._x;
_root.MAPS._y = _root.MAPS._height-_root.WINDOWS._y;
} else if (_root.L.getSelectedIndex() == 4) {
_root.MAPS._x = _root.MAPS._width-_root.yahoo._x;
_root.MAPS._y = _root.MAPS._height-_root.yahoo._y;
} else if (_root.L.getSelectedIndex() == 5) {
_root.MAPS._x = _root.MAPS._width-_root.blog._x;
_root.MAPS._y = _root.MAPS._height-_root.blog._y;
} else if (_root.L.getSelectedIndex() == 6) {
_root.MAPS._x = _root.MAPS._width-_root.irc._x;
_root.MAPS._y = _root.MAPS._height-_root.irc._y;
} else if (_root.L.getSelectedIndex() == 7) {
_root.MAPS._x = _root.MAPS._width-_root.wikipedia._x;
_root.MAPS._y = _root.MAPS._height-_root.wikipedia._y;
} else if (_root.L.getSelectedIndex() == 8) {
_root.MAPS._x = _root.MAPS._width-_root.myspace._x;
_root.MAPS._y = _root.MAPS._height-_root.myspace._y;
}
}
actions for Zoom Out
on (release) {
MAPS._width += 15;;
MAPS._height += 15;;
}
actions for Zoom In
on (release) {
MAPS._width -= 15;;
MAPS._height -= 15;;
}
actions for Center
on (release) {
MAPS._x = MAPS.center._x + _global.w;
MAPS._y = MAPS.center._y + _global.h;
}
actions for Right
on (release) {
MAPS._x += 15;
}
actions for Left
on (release) {
MAPS._x -= 15;
}
actions for Left
on (release) {
MAPS._y -= 15;
}
actions for Right
on (release) {
MAPS._y += 15;
}
actions for Reset Zoom
on (release) {
MAPS._width =800;
MAPS._height = 600;
}
actions for maps
onClipEvent (load) { Untuk Dragging
_root.MAPS.onMouseDown = function() {
startDrag(_root.MAPS);
};
_root.MAPS.onMouseUp = function() {
stopDrag();
};
}



{Satu hutang selesai! masih ada hutang ajax, ireport, java, C, .NET + Pikiran liar sendiri. Kok ngga abis-abis yah?}
{Info tambahan, apabila melakukan google image search dengan keyword "peta surabaya", blog ini selalu ada di halaman pertama, malah kadang paling atas.}

Download om4gus' Online Map v1 + FLA Source ( Without Jump to Location )
Download om4gus' Online Map v2 + FLA Source ( Full Version )
N3XT...arrow

03 November 2008

Samsung E590 Review, Ponsel Kamera yang dipaksakan sebagai Mobile Browser



Desain? Meskipun katanya hasil desainer terkenal, tapi kok seperti tidak ada rasa seninya. Yang penting bentuknya minimalis, tidak terlalu banyak lekuknya, ringan karena chasingnya terbuat dari plastik, kecil, lebih terkesan sebagai mainan daripada sebuah hp canggih. Satu-satunya bagian yang menonjol adalah camera yang ada dibelakang yang sekaligus membuat nyaman sebagai pengganjal tangan. Joystick yang kecil dan pendek, yang bisa membuat jempol perlu dipijet sakit apabila dipakai browsing terlalu lama. Keypad yang mendatar lumayan nyaman untuk dipakai. Pokoknya, masalah bentuknya, aku banget deh kayaknya, kaku.

Instalasi Java? Menyebalkan. Perlu sedikit kerja keras untuk cuma untuk sekedar menambah sebuah game atau aplikasi. Vendornya secara resmi malah cuma mendukung instalasi melalui wap. Tidak bisa melalui kabel, bluetooth, atau memory card. Jadi harus menggunakan browser standarnya untuk melakukan download aplikasi dalam bentuk jar, bukan jad, kemudian baru bisa diinstall. Sebenarnya ada cara mengakalinya, meskipun tidak didukung vendornya dan tidak ada dalam manual resminya, untuk menginstall aplikasi melalui kabel data dengan diperlakukan sebagai virtual serial port. Tapi yang ini malah harus menyertakan jad selain jar-nya. Jadi, tidak perlu mengeluarkan pulsa lagi untuk sekedar menginstall. Pertanyaannya, kenapa dibuat sedemikian rumit oleh samsung? Tidak mungkin mereka tidak tahu teknologi yang lebih nyaman untuk ini, jadi kemungkinan besar alasannya adalah untuk menyusahkan piracy sofware. Paling tidak perlu sedikit kerja keras untuk sekedar membajak, dan lebih kerja keras lagi untuk sekedar memakai software free.

Misalkan, Bersiaplah untuk terkejut. Di daftar tipe yang didukung Operamini, untuk merk samsung, setelah E580, langsung E600. Kenapa ngilangnya E590? Apabila melakukan browsing dengan hp, maka akan ada tulisan bahwa tipe ini tidak didukung. Jadi jangan berharap untuk bisa menginstall dari website resmi atau dari wap.getjar, juga karena keduanya menyediakan jad, bukan jar. Setelah bekerja keras menggunakan Browser untuk melakukan googling website yang menyediakan download operamini.jar, akhirnya bisa didownload dan dijalankan, mulai dari Operamini 3, Operamini 4 beta, Operamini 4, kemudian baru mencoba Operamini 4.1. Semuanya dicoba berulangkali dari beberapa website yang berbeda, akhirnya berhasil dinstall dan saling berjalan sendiri, tanpa saling mengugrade, karena penamaan aplikasi yang berbeda. Instalasi melalui kabel cuma Operamini 3 yang berhasil.
JSR-75, tambahan java midp2 yang terutama digunakan oleh Operamini4.1 untuk upload dan download file secara langsung serta menyimpan halaman yang terbuka untuk disimpan dan dibuka kembali, bisa berjalan sempurna. Cukup ada konfirmasi awal untuk memberikan hak akses, setelah itu bisa berjalan tanpa ada pertanyaan lagi.

Sedangkan yang dicoba diinstall melalui kabel data adalah mig33, ymtiny. Untuk game yang kebetulan dijadikan percobaan semuanya bisa berjalan sempurna, seperti zuma, chessmaster, 5ud0ku. Zuma, meskipun bisa berjalan, bisa dipastikan akan selalu menang kalau main, asal bisa mengatur timing penembakannya, karena berjalan begitu lambat. Selain itu sepertinya ada batasan ukuran jar maksimal yang masih bisa berjalan, tidak seperti model SE yang bisa menjalankan aplikasi ukuran besar.

Internet? Apabila menggunakan standar browser WAP 2.0/xHTML, akan terasa begitu lambat, dan menguras pulsa karena tidak bisa mendisable gambar. Selain itu juga seringnya terjadi disconnect padahal mendukung EDGE Class 10 selain GPRS Class 10, entah siapa yang salah. Dengan kinerja java yang payah, pernah membuat sedikit penyesalan membeli hp ini. Operamini 3 maupun Operamini 4 yang baru selesai diinstall juga tidak banyak membantu. Hal yang membuat jatuh cinta kembali dengan hp ini adalah setelah berhasil menginstall Operamini4.1 Beta. Yang versi final masih gagal diinstall. Tapi semua fungsinya sudah ada di versi beta ini. Simpan web, sinkronisasi dengan komputer, tampilan yang menyenangkan, dan kecepatan browsing, seperti yang digemborkan, 50% lebih cepat dari versi sebelumnya. Kompresi data, selain mempercepat, juga mengurangi pemakaian bandwidth, tentu saja selain dengan fasilitas standar untuk tidak menampilkan gambar.

angan lupakan juga fasilitas pembuka dokumennya, yang bisa membuka file Word, Excel, PowerPoint, PDF. Dulu, tipe ini terkenal karena merupakan tipe hp paling murah yang bisa digunakan anak-anak sma, mungkin juga kuliahan, untuk nyontek. Tinggal membuat file ms word, masukan ke hp, setelah itu bisa dibuka kapan saja. Bagi saya, lumayan, bisa buat bahan bacaan tanpa harus menguras pulsa saat waktu menunggu yang menjemukan.

Untuk multimedia, ada MP3/AAC/AAC+/E-AAC+/WMA player, FM radio, 3gp/H.263/mpeg-4 video player. Suaranya lumayan. Dan baru terasa bagusnya setelah menggunakan headset stereo yang disertakan. selain itu juga mendukung Bluetooth Headset A2DP.

Sebenarnya tipe ini lebih terkenal sebagai hp camera, itulah sebabnya yang menyebabkannya payah dalam hal konektifitas dan aplikasi. Karena tidak tahu hal apapun soal fotografi selain hal teknis yang disediakan seperti, 3Mpx, resolusi 2048x1536, Autofocus, Multishoot, Panorama, video H.263/mpeg-4 dengan CIF (352 x 288 pixels) pada 15 fps, Image Editor. Jadi satu kata saja, Sempurna. Eh iya, satu lagi. Ada aksesoris yang disertakan. Beberapa forum mengatakan kalau itu adalah pembersih kamera. Tapi, itu namanya BagPod, mas/mba. Jadi untuk dipasang di kamera supaya bisa steady, tidak goyang, saat diletakkan dalam permukaan apapun. Semacam tripod, dengan bentuk yang unik. Dan cuma hp jenis ini yang punya.

Untuk transfer file harus menggunakan Samsung PC Studio. Sebenarnya ada tiga konektifitas yang bisa dipilih, Modem, Mass Storage, atau Pictbridge. Modem dan pictbridge, bisa berfungsi sempurna. Dengan Pictbridge, kita bisa melakukan koneksi ke printer untuk melakukan pencetakan secara langsung tanpa melalui perantara komputer. Sedangkan apabila memilih Mass Storage, maka akan dikenal Philips Dev. 0 LUN 0, seperti halnya sebuah flashdisk. Tapi Entah harus memakai driver apa, tapi ini sama sekali tidak berfungsi.

Hal-hal kecil, yang jarang diperhatikan orang, dan tidak bisa langsung diketahui saat pertama kali mencoba, juga sangat meyebalkan. Misalkan,
Fasilitas copy-paste, yang harusnya ada pada setiap field untuk mempercepat pengetikan, tidak disediakan. (Pembandingnya adalah SE W200i)
Tidak bisa membuat folder baru, membuatnya begitu mengesalkan saat semua terlihat berantakan pada folder default dan lamanya loading thumbnail. (Pembandingnya adalah SE W200i)
Yang aneh, kenapa antar tombol, 1, *, 0, dan # sering berpindah fungsi! misalkan spasi, kadang di tombol 1 atau 0, Simbol kadang ada di tombol 1, atau *. Tombol C, bisa untuk menghapus, kadang untuk back. TOmbol Off yang digabungkan dengan tombol Drop. Tombol volume disamping yang tidak berfungsi universal. Harus membuka aplikasinya, entah player atau radio, atau dalam posisi standby, untuk bisa berfungsi. Tombol khusus kamera, Yang jumlahnya empat macam di bagian samping, cuma berfungsi saat kamera diaktifkan. Selain itu, cuma hiasan. (Pembandingnya adalah Nokia 5300)
T9, payah. meskipun ada bahasa indonesia dan english, tapi jangan terlalu berharap untuk bisa digunakan secara nyaman, selain malah bingung dengan fungsi tombol-tombol yang meloncat-loncat entah untuk apa saja. Apalagi kalo dipanggil dari java, payah. (Pembandingnya adalah Nokia 5300)
Kustomeisasi yang mini. Theme yang tidak bisa diubah, selain default, black atau white. Backlight, menyala saat malam dan mati saat siang, unik juga yah? (Pembandingnya adalah Nokia 5300)
Hal kecil lain yang lumayan melegakan adalah multitasking, yang ada di radio dan music player. Meskipun jangan mengharapkan lebih dari itu. Aplikasi java, video player, atau image editor, tidak bisa di-minimize, tapi harus keluar untuk bisa menjalankan yang lain. (Pembandingnya adalah SE W200i)
Mungkin keanehan ini berlaku untuk barisan produk samsung lainnya, seperti halnya nokia yang terkenal dengan kenyamanannya dan SE yang maju dengan teknologinya, atau Benq-siemens dengan konektifitasnya. Jadi, Kalau boleh dibandingkan dengan browser, Nokia itu Google Chrome, SE itu Opera, Samsung itu Safari, Benq-Siemens itu Konqueror. Kalo Firefox? mungkin jajaran PDA yah? Ponsel Cina? Mungkin Operamini kali, atau maksimal IE6 untuk yang jajaran atas. Yang penting bisa buat nelpon kan?


Kesimpulan:
Ada tiga hal yang awalnya mendasari saya, Internet Adicted, memilih ponsel ini: Java midp 2, Bluetooth, Egde, Slot Memori Card. Eh, empat ya? Java? Payah. Bluetoth? Lumayan. Edge? Sering putus. Memori Card? microSD, lambat. Jadi, payah semua, tapi yang penting semuanya bisa berjalan, meskipun harus dengan kerja keras dan kesabaran. Mungkin SE W200i lebih memenuhi syarat kalau cuma untuk ini. Fasilitas tambahan yang akhirnya sedikit mengurangi sakit hati adalah: Pembuka dokumen, camera 3Mpx dengan segala kelengkapannya untuk hobi baru, bentuknya yang mungil. Selain fasilitas standarnya: Radio FM, Video & Music Player, Memori internal 90MB (lumayan gede). Selain itu ada game yang disertakan: Cannonball, Forgotten Warrior, Midnight Pool (trial), Mini Golf Las Vegas (trial), Paris Hilton's Diamond Quest (trial), and Sonic the Hedgehog (trial). Meskipun yang bagus semuanya cuma sekedar trial.

Disclaimer:
Semua ini pendapat pribadi, dengan pengetahuan soal gadget terkini yang sangat terbatas. Semuanya berasal dari coba-coba pribadi saja.

Instalasi Java dengan Kabel Data
Download Samsung PC Studio 3
Download Opera Mini 2,3,4
N3XT...arrow

24 September 2008

Unofficial XAMPP FAQ

Daftar pertanyaan yang sering saya dengar mengenai XAMPP, merupakan panduan FAQ tidak resmi untuk menambahkan yang sudah disediakan oleh website resminya :

Apa perbedaan XAMPP, XAMPP Lite, dan LAMP ?
- XAMPP Merupakan paket lengkap server Web, Mysql, Mail, dan FTP untuk Widnows. Aplikasi yang disertakan adalah Apache HTTPD, MySQL, PHP + PEAR + Switch, MiniPerl, Openssl, phpMyAdmin, XAMPP Control Panel, Webalizer, Mercury Mail Transport System für Win32 und NetWare Systems, FileZilla FTP Server, SQLite, ADODB, Zend Optimizer, XAMPP Security. Selain itu juga ada addon tambahan yang bisa disertakan.
- XAMPP Lite mempunyai nama MiniXAMPP pada masa lalu, jenis "Take-Run-Delete-Forget-it". Merupakan paket server dalam ukuran kecil dengan mengurangi tambahan seperti Mercury Mail dan FTP. Terdiri dari Apache, PHP (without PEAR), MySQL, phpMyAdmin, Openssl, SQLite. Selain itu juga tidak bisa ditambahankan addon tambahan.
- LAMP merupakan paket server untuk Linux. sekarang sudah berganti nama menjadi XAMPP for Linux, dengan isinya yang tidak jauh berbeda dengan versi windows.

Bagaimana cara membuat paket server bersifat portable?
- Portable disini berarti kita membawa paket aplikasi XAMPP ini dalam sebuah folder di dalam device removable, misalkan flashdisk, maka apabila kita menjalankan XAMPP Control untuk menjalankan aplikasi server di komputer yang berbeda dengan peletakan drive yang berbeda pula, bisa berjalan tanpa masalah. Apache bisa berjalan, mysql dan lainnya pun bisa berjalan sempurna.
- Gunakan paket dalam bentuk ZIP arsip atau Selfextracting 7-ZIP archive yang disediakan di website resminya. Bisa paket XAMPP atau XAMPP Lite yang untuk windows. Jangan mendownload versi Installer, karena installer akan menginstall di sebuah komputer bersifat standalone, tidak portable lagi.
- Yang perlu dilakukan cuma ini. Ekstrak paket tersebut diatas dalam folder root drive. Artinya bukan di subfolder lainnya. Jadi hasilnya, C:\XAMPP atau G:\XAMPP, atau G:\xampplite. Bukan, misalkan, C:\Server Web, atau G:\Portable\XAMPP, Karena ini tidak akan bisa berjalan.
- Jangan pernah memanggil setup_xampp.bat. Karena akan akan menginstall di komputer dan folder tersebut, sehingga tidak bisa bersifat portable lagi. Kalau perlu, hapus file ini karena tidak terlalu diperlukan apabila sudah yakin server bisa berjalan sempurna secara portable.
- Jangan membuat aplikasi server sebagai service. Didalam XAMPP COntrol terdapat checkbox untuk mengatur ini.
- Apabila kita menjalankan XAMPP jenis portable di komputer yang sudah terinstall salah satu aplikasi server, kita harus memberhentikan service tersebut. Misalkan sudah terinstall PHPTriad, Pertama, coba dilihat XAMPP Control, Stop semua aplikasi yang berjalan, biasanya Apache dan MySQL, pastikan untuk menghilangkan semua tanda check pada Svc, pastikan semuanya dalam status stop, setelah itu jalankan satu persatu.
- Di PortableApps.com tersedia XAMPP Control for PortableApps. Aplikasi portable ini bisa berjalan apabila ada paket PortableApps dan XAMPP atau xampplite di drive yang sama dengan peletakkan direktori masing-masing yang benar.
Jadi:
\StartPortableApps.exe
\PortableApps\XAMPP\XAMPP.exe
\xampp\xampp-control.exe

Bagaimana cara menginstall XAMPP?
- Menginstall artinya, membuat paket ini bersifat standalone, berjalan dalam sebuah komputer dan folder yang tetap, terinstall, dan tidak bisa dipindah, kecuali datanya masing-masing. Yaitu data htdocs, data mysql, dll.
- Gunakan paket installer. Jalankan program tersebut untuk melakukan instalasi.
- Untuk dalam bentuk ZIP atau Selfextracting 7-ZIP archive, lakukan ekstrak ke harddisk. Setelah itu jalankan setup_xampp.bat.
- Apabila menginstall XAMPP di komputer yang sudah terinstall salah satu aplikasi server, kita harus memberhentikan service tersebut. Misalkan sudah terinstall PHPTriad, Pertama, coba dilihat XAMPP COntrol, Stop semua aplikasi yang berjalan, biasanya Apache dan MySQL, pastikan untuk menghilangkan semua tanda check pada Svc, pastikan semuanya dalam status stop, setelah itu jalankan satu persatu. Lakukan langkah selanjutnya.
- Pastikan agar semuanya menjadi service melalui XAMPP Control.
- Untuk XAMPP for Linux, jalankan dengan 'tar xvfz xampp-linux-1.5.5a.tar.gz -C /opt'. Yang otomatis akan mengupgrade versi sebelumnya.

Dimanakah letak file konfigurasi yang penting?
- PHP. Ini yang paling penting. terdapat dua buah file PHP.ini di dalam paket ini, yaitu di \XAMPP\PHP\PHP.ini dan \XAMPP\Apache\bin\php.ini. Dan file konfigurasi yang akan selalu dipanggil adalah yang ada di Apache bin. Pastikan untuk menggunakan yang ada di folder PHP hanya sebagai panduan saja untuk melakukan konfigurasi.
- Apache. Terdapat di \XAMPP\apache\conf\httpd.conf
- MySql. di \XAMPP\mysql\bin\my.cnf
- Untuk MercuryMail, bisa menggunakan gui yang disertakan untuk melakukan konfigurasi. Secara manual, FTP ada di FileZillaFTP\FileZillaFTP Server.xml dan Mail di \XAMPP\MercuryMail\MERCURY.INI

Bagaimana cara memindahkan data web ke server yang lain?
- memindahkan data web artinya adalah memindahkan script web yang dijalankan apache dan database mysql yang diperlukan.
- Script web, baik berupa HTML, PHP, dan lainnya diletakkan di \XAMPP\htdocs secara default. Pindahkan semua isi folder yang diperlukan ke server yang baru.
- Database mysql secara default berada di \XAMPP\mysql\data. Setiap sebuah database direpresentasikan dengan satu directory disini. Pindahkan direktori di server yang baru. Atau gunakan fasilitas export di http://localhost/phpmyadmin. kemudian import dari server mysql yang baru. Cara lainnya adalah dengan mysql dump, karena proses yang lebih cepat. Pelajari sendiri untuk hal ini.
- Cara yang paling mudah adalah dengan menerapkan analogi XAMPP Lite, "Take-Run-Delete-Forget-it". Artinya, Ekstrak xampplite sebagai sebuah portable server, selalu gunakan paket ini untuk mengubah konfigurasi, development web, development database, dan testing sampai proyek selesai. Setelah itu kopikan ke server yang baru, bisa dijalankan sebagai portable lagi atau lakukan instalasi di server yang baru dengan cara install xampp diatas. Berjalan. Semuanya beres dan selesai. Happily, Ever, After.

Bagaimana cara menjalankan servlet dan JSP di XAMPP?
- Install addon tambahan berupa tomcat
- Komputer harus sudah terinstall JDK 5 keatas,sesuai kebutuhan versi tomcat.
- Ubah konfigurasi tomcat sesuai dengan letak JDK Home
- Jalankan service tomcat

Mengapa XAMPP tidak bisa berjalan di komputer saya?
- Tidak bisa berjalan dalam hal ini, service langsung mati begitu dijalankan, atau dalam kasus apache, bisa berjalan tapi halaman web yang diinginkan tidak bisa dipanggil.
- Pastikan panduan untuk salah satunya, yaitu membuat sebagai portable atau installer sudah benar-benar dikerjakan.
- XAMPP sebagai paket aplikasi server yang mengakses jaringan, tentu saja bermasalah dengan dua hal, Firewall dan Aplikasi web yang lain.
- Untuk firewall, jalankan semua service firewall yang ada, kemudian berikan hak akses jaringan kepada service yang diperlukan, dalam hal Apache web server dan MySQL server. Jadi jangan mematikan service firewall. Hal ini juga berlaku untuk firewall yang secara default berada di XP SP 2.
- Aplikasi web bisa berupa aplikasi lain yang juga menggunakan port yang sama. Dalam hal ini IIS atau paket instalasi lain seperti WAMPP, AppServ, PHPTriad, dll. Untuk meyakinkan, uninstall aplikasi lain tersebut. Atau cukup dengan memberhentikan service melalui XAMPP Control.
- XAMPP tidak bisa berjalan pada komputer yang terinstall McAfee VirusScan. Saya selalu mengalami hal ini, jadi tolong dikoreksi kalau ternyata bisa berjalan di komputer anda. McAfee, secara default memiliki firewall sendiri, yang meskipun tidak dijalankan akan tetap menghalangi Apache yang ada di XAMPP untuk bisa berjalan. Menginstall ulang windows pada komputer yang sudah pernah terinstall McAfee, apalagi XP SP2, adalah satu-satunya solusi, dan jangan pernah gunakan antivirus ini lagi. Kalo perlu jangan pernah gunakan antivirus lagi! HEHE. (Biar aku ada temennya....)

Bagaimana cara membuat XAMPP portable kita mempunya path yang selalu tetap?
- Artinya di komputer manapun removable device kita dipasang, akan selalu mendapatkan fullpath direktori XAMPP yang tetap. Diperlukan jika script PHP kita membutuhkan fullpath yang selalu sama, misalkan untuk instalasi, konfigurasi, dan menjalankan CMS seerti Joomla, Mambo, OSCOmmerce, dll.
- Gunakan subst untuk membuat virtual drive.
- Misalkan diletakkan di H:\XAMPP:
+ H:\> subst W: .
- sehingga akan selalu berada di W:\XAMPP
- Untuk menghilangkan:
+ H:\> subst /d W:
- Analogi ini berlaku untuk banyak hal pada aplikasi lain yang bersifat standalone tapi dipaksakan mempunyai fullpath yang konsisten meskipun menjadi portable.

Jadi Kalo ada pertanyaan lagi, punya jawaban standard, "Liat aja blognya...", Kayak orang penting aja yah.
N3XT...arrow

26 August 2008

Data Encription Standard & MD5 di Java

DES ya?
Tidak seperti halnya MD5, DES(Data Encryption Standard) menggunakan sebuah file key untuk melakukan enkripsi dan dekripsi. Jadi, hasil enkripsi dari sebuah kalimat akan berbeda sesuai dengan key yang digunakan. Dan untuk bisa melakukan dekrip, harus menggunakan key sesuai dengan pembuatnya. Key persis berperan sebagai kunci pembuka. Untuk teorinya, silakan tanyakan ke dosen masing-masing aja. Sedangkan contoh ini merupakan penerapan DES, yang sekaligus merupakan enkripsi dari md5. class DES akan membuat key terlebih dahulu apabila belum ada. Key ini yang akan selalu digunakan untuk melakukan enkripsi. Dekripsi tidak bisa dilakukan apabila key ini hilang, karena pembuatan key baru pasti akan menghasilkan key yang berbeda dengan sebelumnya.
Pada contoh gambar, Input yang pertama merupakan Kalimat yang kemudian dienkrip. Sedangkan pada input kedua mencoba melakukan dekrip dari hasil pertama. Melakukan dekrip pada kata yang bukan merupakan hasil enkrip DES akan menyebabkan IllegalFormatException seperti saat pertama. Selain itu, ada proses enkripsi didahului MD5 kemudian baru DES.
Sebenarnya, penggunaan MD5 dan DES sendiri berbeda. MD5 digunakan khusus untuk mendapat hash dari kalimat atau file, dan tidak diperlukan proses dekripsi. Untuk mendapatkan kebenaran dari nilai MD5, dilakukan dengan membandingkan nilai tersebut dengan hasil enkrip MD5 kata itu lagi, bukan dengan proses dekripsi. Kita tidak bisa mendapatkan nilai awal dari sebuah hasil enkripsi MD5. Sedangkan DES sendiri memungkinkan untuk melakukan enkripsi sekaligus dekripsi untuk mengembalikan nilai awal, dengan key yang tepat tentunya. Meskipun untuk saat ini sudah tidak diterapkan secara profesional karena kelemahan algoritma ini yang bisa dipecahkan dengan cara brute force, tapi, sudah lumayan, bisa buat mainan surat rahasia.
Untuk class MD5 berasal dari posting sebelumnya.
Mmmmmm, jadi pengin membahas DSA, Digital Signature Algorithm nih, lengkap dengan PKI-nya. Jauh lebih menarik! Eh iya, ngga ada download source kali ini, kayaknya bisa langsung jadi deh.

import java.io.*;
import java.security.*;
import javax.crypto.*;
import sun.misc.*;

class AeSimpleMD5 {
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9)) {
buf.append((char) ('0' + halfbyte));
} else {
buf.append((char) ('a' + (halfbyte - 10)));
}
halfbyte = data[i] & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}

public static String MD5(String text)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance("MD5");
byte[] md5hash = new byte[32];
md.update(text.getBytes("iso-8859-1"), 0, text.length());
md5hash = md.digest();
return convertToHex(md5hash);
}
}

class DES {
String R = "";
public static String encrypt(String text) {
return process("e", text);
}
public static String decrypt(String text) {
return process("d", text);
}
public static String process(String mode, String text) {
// Get or create key.
Key key;
try {
try {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("SecretKey.ser"));
key = (Key) in.readObject();
in.close();
} catch (FileNotFoundException fnfe) {
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
key = generator.generateKey();
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("SecretKey.ser"));
out.writeObject(key);
out.close();
}

// Get a cipher object.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

// Encrypt or decrypt the input string.
if (mode.indexOf("e") != -1) {
cipher.init(Cipher.ENCRYPT_MODE, key);
String amalgam = text;

byte[] stringBytes = amalgam.getBytes("UTF8");
byte[] raw = cipher.doFinal(stringBytes);
BASE64Encoder encoder = new BASE64Encoder();

String base64 = encoder.encode(raw);
//System.out.println(base64);
return base64;
} else if (mode.indexOf("d") != -1) {
cipher.init(Cipher.DECRYPT_MODE, key);
BASE64Decoder decoder = new BASE64Decoder();
byte[] raw = decoder.decodeBuffer(text);
byte[] stringBytes = cipher.doFinal(raw);
String result = new String(stringBytes, "UTF8");
//System.out.println(result);
return result;
}
} catch (Exception e) {
//System.out.println("DES Error:" + e);
}
return "Error!";
}
}

class Main {
public static void main(String[] args) throws IOException {
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input string: ");
String rawString = userInput.readLine();
try {
System.out.println("Hasil MD5 : '" + AeSimpleMD5.MD5(rawString) + "'");
System.out.println("Hasil Encript DES : '" + DES.encrypt(rawString) + "'");
System.out.println("Hasil Decrypt DES : '" + DES.decrypt(rawString) + "'");
System.out.println("Hasil Encript MD5 -> DES : '" + DES.encrypt(AeSimpleMD5.MD5(rawString)) + "'");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}


Selamat...... hari selasa.
N3XT...arrow

25 August 2008

Pembuatan PDF di PHP dengan FPDF dan HTML2FPDF

Untuk membuat pdf dengan menggunakan php, kita bisa menggunakan fpdf yang berbasis class. Sedangkan html2fpdf digunakan untuk mengubah html menjadi pdf. Dengan hanya menggunakan fpdf, kita harus menentukan semua hal yang mengatur tampilannya berbasis code sesuai dengan aturan dan fungsi yang disediakan class tersebut. Dengan menggunakan html2fpdf, kita cuma perlu membuat sebuah file html dan tampilannya langsung diubah menjadi sebuah file pdf, tentu dengan beberapa keterbatasan dan perubahan tampilan. Saat ini, fpdf terbaru pada versi 1.6 sedangkan html2fpdf versi 3.

Instalasi:
+ Ekstrak file fpdf dan html2fpdf. Sebenarnya html2fpdf merupakan inheritance dari class fpdf, tapi class di fpdf yang disdertakan di paket html2fpdf telah dimodifikasi dari aslinya sesuai dengan kebutuhan konversi tersebut. Class original dari fpdf akan kita pakai untuk pembuatan pdf secara manual, bukan dari html.
+ Ganti nama file fpdf.php misalkan menjadi fpdf16.php. Karena untuk bebrapa versi instalasi php terbaru sudah menyertakan fpdf secara default sebagai salah satu plugin. Misalkan, paket xampp meletakannya di w:\xampplite\php\pear\fpdf.php. Apabila tidak diganti namanya, pada saat proses include atau require, yang terpanggil adalah fpdf.php dari sistem php. Penggunaan fpdf yang biasanya tidak sesuai dengan versi yang kita inginkan akan selalu menyebabkan kesalahan. Beberapa perbaikan tersebut adalah: perbaikan alamat include, error loading css dan gambar, gif parser error, penambahan spasi yang tidak perlu yang menyebabkan error Header.
+ Lakukan modifikasi pada beberapa file php, karena kita sudah melakukan penggantian nama. Selain itu entah kenapa masih ada beberapa bug didalamnya yang harus diperbaiki secara manual. Sebenarnya bisa dengan melakukan pelacakan sendiri pada saat terjadi kesalahan. Sebenarnya pengin dijelasin satu persatu, tapi daripada rumit, silakan download saja arsip fpdf dan html2fpdf yang sudah dimodifikasi dan diberi beberapa perbaikan dibagian bawah, kemudian lakukan ekstraksi. Sehingga susunannya menjadi seperti contoh sebagai berikut:

W:\xampplite\htdocs\
pdf\
pdf\fpdf16\
fpdf16.php
pdf\fpdf16\doc\
pdf\fpdf16\font\
pdf\fpdf16\font\makefont\
pdf\fpdf16\tutorial\
pdf\try\
index1.php
index3.php
test1.html
index4.php
index5.php
index2.php
pdf\html2fpdf\
htmltoolkit.php
source2doc.php
html2fpdf.php
no_img.gif
fpdf16.php
gif.php
pdf\html2fpdf\font\
pdf\html2fpdf\font\makefont\

Sekarang kita mulai contohnya :
1. Hello World!, tentunya contoh paling sederhana.
2. Menggunakan class fpdf. Manual yang disertakan sudah lengkap, jadi bisa dipelajari sendiri. Pada versi 1.6 sudah mendukung penggunaan gif sebagai gambar. Setiap teks dan gambar yang akan kita masukkan dalam file pdf berasal dari barisan kode dengan parameter letak koordinat, ukuran, tampilan, beserta teks atau gambar tersebut. Pada contoh ini juga ada pengambilan file text untuk menjadi pdf. (TXT2PDF)
3. Mengambil dan melakukan konversi file html menjadi pdf. (HTML2PDF).
4. Mengambil dan mengubah file php. Tentu harus berasal dari server yang sama karena menggunakan perintah include untuk pengambilannya. (PHP2PDF).
5. Mengambil dan mengubah sebuah lokasi web (URL2PDF). Menggunakan CURL untuk mengambil content web, tapi ternyata hasilnya berantakan. Hal yang sama terjadi pada saat dicoba menggunakan get_content(). Penyebabnya sih karena pada contoh ini memanggil cms phpnuke yang entah kenapa tidak bisa mengambil css eksternal yang didefinisikan sehingga semuanya menjadi tidak beraturan tanpa aturan css. Ada yang punya saran?

1. Hello World!

2. TXT2PDF

3. HTML yang diubah

3. HTML2PDF

4. PHP yang diubah

4. PHP2PDF

5. URL yang diubah

5. URL2PDF

////////////////////index1.php//////////////////////
<?php
require('../fpdf16/fpdf16.php');

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output('doc.pdf','I');
?>


///////////////////index2.php//////////////////////


<?php
require('../fpdf16/fpdf16.php');

class PDF extends FPDF
{
function Header()
{
global $title;

//Arial bold 15
$this->SetFont('Arial','B',15);
//Calculate width of title and position
$w=$this->GetStringWidth($title)+6;
$this->SetX((210-$w)/2);
//Colors of frame, background and text
$this->SetDrawColor(0,80,180);
$this->SetFillColor(230,230,0);
$this->SetTextColor(220,50,50);
//Thickness of frame (1 mm)
$this->SetLineWidth(1);
//Title
$this->Cell($w,9,$title,1,1,'C',true);
//Line break
$this->Ln(10);
}

function Footer()
{
//Position at 1.5 cm from bottom
$this->SetY(-15);
//Arial italic 8
$this->SetFont('Arial','I',8);
//Text color in gray
$this->SetTextColor(128);
//Page number
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}

function ChapterTitle($num,$label)
{
//Arial 12
$this->SetFont('Arial','',12);
//Background color
$this->SetFillColor(200,220,255);
//Title
$this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
//Line break
$this->Ln(4);
}

function ChapterBody($file)
{
//Read text file
$f=fopen($file,'r');
$txt=fread($f,filesize($file));
fclose($f);
//Times 12
$this->SetFont('Times','',12);
//Output justified text
$this->MultiCell(0,5,$txt);
//Line break
$this->Ln();
//Mention in italics
$this->SetFont('','I');
$this->Cell(0,5,'(end of excerpt)');
}

function PrintChapter($num,$title,$file)
{
$this->AddPage();
$this->ChapterTitle($num,$title);
$this->ChapterBody($file);
}
}

$pdf=new PDF();
$title='20000 Leagues Under the Seas';
$pdf->SetTitle($title);
$pdf->SetAuthor('Jules Verne');
$pdf->PrintChapter(1,'A RUNAWAY REEF','text.txt');
$pdf->Output('doc.pdf','I');
?>


///////////////////////index3.php////////////////////////


<?
require("../html2fpdf/html2fpdf.php");
$htmlFile = "test1.html";
$file = fopen($htmlFile,"r");
$size_of_file = filesize($htmlFile);
$buffer = fread($file, $size_of_file);
fclose($file);

$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($buffer);
$pdf->Output('doc.pdf','I');
?>

//////////////////////index4.php/////////////////////////


<?php
ob_start();
include "../../Files/index.php";
$htmlbuffer=ob_get_contents();
ob_end_clean();
require('../html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($htmlbuffer);
$pdf->Output('doc.pdf','I');
?>

////////////////////index5.php//////////////////////////

<?php
function load($url){
if (!$curld = curl_init()) {
echo "CURL GAGAL.\n";
exit;
}

curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
curl_close($curld);
return $output;

}
ob_start();

echo load("http://localhost/nuker/");
$htmlbuffer=ob_get_contents();
ob_end_clean();
require('../html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($htmlbuffer);
$pdf->Output('doc.pdf','I');
?>

Download:

fpdf v1.6
html2fpdf-3.0.2b
fpdf dan html2fpdf, dengan modifikasi perbaikan dan contohnya.
N3XT...arrow

06 August 2008

Java: Pengiriman Parameter antar Frame

Sebenarnya konsep ini berlaku bukan hanya pada frame, tapi bisa dilakukan antar object dari class yang sifatnya umum, karena Java yang sifatnya sudah full OOP. Tapi, karena lebih sering diterapkan dalam pemrograman GUI desktop, khususnya dengan Netbeans, maka dicontohkan dengan class javax.swing.JFrame.
Setiap bentuk code java harus dibentuk dalam bentuk class, biar sebagaimanapun sederhananya. Tidak seperti pemrograman lainnya yang menggunakan konsep OOP sebagai tambahan dan pengembangan dari yang sudah ada sebelumnya. Itulah sebabnya kita mengenal class di C++, Pascal, PHP, tapi masih diperbolehkan untuk tetap menggunakan konsep primitif. Sedangkan pada kasus java dan .NET, OOP merupakan inti utamanya yang harus selalu diikuti dan diterapkan. Awalnya akan sangat membingungkan, tapi sangat mudah untuk langkah pengembangan selanjutnya. Sudah lihat JavaDoc? itu adalah dokumen pemrograman yang paling aneh didunia, pada pandangan pertama. Coba bandingkan dengan MSDN-nya .NET, PHP Manual, atau Delphi Help, JavaDoc cuma serangkaian kamus aneh hampir tanpa contoh penggunaannya. Tapi itulah asiknya OOP, dengan serangkaian aturan yang serupa, yang bisa diterapkan untuk class apa saja, kita bisa membuat apapun yang bisa dibuat dengan java cuma mengandalkan kamus aneh ini.
Class sendiri merupakan serangkaian aturan dan definisi dari program yang akan dibuat. Class harus dibuat menjadi object untuk bisa memanfaatkan program yang ada didalamnya. Keharusan ini membuat perintah 'new', sebuah keyword untuk membuat object dari class, sangat sering ditemui. Pada saat pembuatan object, selain membuat object dengan nama yang ditentukan atau bisa juga cuma sebuah object anonim, juga melaksanakan perintah yang ada dalam constructor. Constructor adalah fungsi khusus dengan nama sama dengan nama class yang dibuat, dengan tipe akses public tanpa penentuan tipe data. Apabila tidak ada constructor, tidak ada proses yang dijalankan bersamaan dengan pembuatan object, dan itu diperbolehkan. Sedangkan pembuatan constructor lebih dari satu untuk tujuan yang berbeda juga diperbolehkan. Dengan sarat, memakai jumlah dan atau tipe data parameter yang berbeda.

public class namaClass{
public namaClass(){
}
public namaClass(String params){
}
public namaClass(int params){
}
}


Sedangkan untuk pengiriman data antar frame, kita menggunakan parameter yang kita sebutkan di constructor ini. Dengan beberapa contoh penggunaannya. Yang jelas, kita harus membuat constructor dengan parameter yang disesuaikan. Constructor hanya dijalankan pada saat pertama kali pembuatan object. Tapi contoh dibawah ini, selain contoh pertama, isi data parameter akan berubah, jadi tidak bersifat statis pada saat runtime.

1. frameOne memanggil sambil mengirimkan parameter string ke frameTwo.

Yang harus dilakukan adalah menyediakan constructor String di frameTwo, selanjutnya menampilkan data yang diterima. Dalam hal ini dalam bentuk JLabel.

public frameTwo(String parameter){
initComponents();
jLabel1.setText(parameter);
}

Sedangkan pada frameOne sebagai pembanggil, membuat object dari class dengan constructor frameTwo yang sudah dibuat, mengisi parameter dari constructor sesuai dengan string yang dikirimkan, kemudian menampilkan object frameTwo. Gunakan jButton1 untuk tempat perintah tersebut.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
frameTwo obj2=new frameTwo("DATA");
obj2.setVisible(true);
}

2. frameOne memanggil sambil mengirimkan parameter berupa object JtextField ke frameThree. Isinya diambil oleh frameThree.

Ini artinya, Secara runtime, JtextField bisa dimanipulasi bukan hanya dari frameOne sebagai pemilik, tapi juga frameThree. Isi dari JTextField bisa langsung diambil apabila ada perubahan saat runtime melalui tombol JButton. Tapi, frameOne sebagai pemilik JTextField harus diinisialisasi terlebih dahulu, apabila belum, akan terjadi NullPointerException.

Kita harus membuat constructor di frameThree dengan parameter JTextField, Membuat variabel global untuk tempat parameter yang diterima, membuat jLabel1 dan tombol jButton1 untuk mengupdate isinya.

public frameThree(JTextField parameter){
initComponents();
this.parameter = parameter;
jLabel1.setText(this.parameter.getText());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
jLabel1.setText(parameter.getText());
}
JTextField parameter;

Pada frameOne, kita memanggil constructor dari frameThree dengan parameternya dan menampilkan frame tersebut. Buat jTextField1 untuk dilewatkan sebagai parameter dan jButton2 untuk pemanggilan.

Sekarang coba lakukan perubahan pada JtextField di frameOne, maka Isi dari JLabel di frameThree akan berubah setelah tombol dibawahnya diklik, sesuai isi yang terbaru dari JTextField di frameOne.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
frameThree obj3=new frameThree(jTextField1);
obj3.setVisible(true);
}

3. merupakan kebalikannya dari yang kedua. frameOne memanggil sambil mengirimkan parameter berupa object JLabel ke frameThree. Isi dari JLabel nantinya bisa ditentukan dari frameFour.

Buat constructor pada frameFour dengan parameter JLabel. Buat jTextField1 dan jButton1 untuk mempengaruhi isi dari label di frameOne.

public frameFour(JLabel parameter) {
initComponents();
this.parameter=parameter;
this.parameter.setText(jTextField1.getText());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
parameter.setText(jTextField1.getText());
}
public JLabel parameter;


Di frameOne, panggil frameFour dengan melewatkan parameter jLabel1.

Sekarang, panggil frameFour dengan tombol di frameOne, setelah frameFour tampil, lakukan perubahan isi jTextField1, tekan tombolnya, maka isi jLabel1 di frameOne akan berubah.

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
frameFour obj4=new frameFour(jLabel1);
obj4.setVisible(true);
}

Selain itu, buat DefaultCloseOperation dari semua frame selain frame utama menjadi dispose.

Selesai. Sekarang, selali lagi, penerapannya bisa dalam banyak hal. Misalkan dengan mengirimkan parameter berupa JButton sehingga event yang dilakukan bisa dijalankan di frame yang lain. Atau banyak hal lainnya yang melibatkan banyak class dan object secara simultan.

Source Code:

/////////////////////////////////////////////////////////////////

/* frameOne.java */

public class frameOne extends javax.swing.JFrame {

public frameOne() {

initComponents();

}

private void initComponents() {


jButton1 = new javax.swing.JButton();

jButton2 = new javax.swing.JButton();

jTextField1 = new javax.swing.JTextField();

jButton3 = new javax.swing.JButton();

jLabel1 = new javax.swing.JLabel();


setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setTitle("frameOne");


jButton1.setText("panggil FrameTwo dengan mengirim parameter String \"DATA\"");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});


jButton2.setText("panggil frameThree dengan mengirim parameter JTextField1");

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton2ActionPerformed(evt);

}

});


jTextField1.setText("jTextField1");


jButton3.setText("panggil frameFour");

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton3ActionPerformed(evt);

}

});


jLabel1.setBackground(new java.awt.Color(204, 255, 255));

jLabel1.setText("jLabel1");

jLabel1.setOpaque(true);


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(122, 122, 122)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(27, 27, 27)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jButton1)

.addComponent(jButton2)))

.addGroup(layout.createSequentialGroup()

.addGap(120, 120, 120)

.addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(94, 94, 94)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(36, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(52, 52, 52)

.addComponent(jButton1)

.addGap(31, 31, 31)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jButton2)

.addGap(38, 38, 38)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jButton3)

.addContainerGap(31, Short.MAX_VALUE))

);


pack();

}// </editor-fold>


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

frameTwo obj2=new frameTwo("DATA");

obj2.setVisible(true);

}


private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

frameThree obj3=new frameThree(jTextField1);

obj3.setVisible(true);

}


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

frameFour obj4=new frameFour(jLabel1);

obj4.setVisible(true);

}



public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameOne().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton3;

private javax.swing.JLabel jLabel1;

private javax.swing.JTextField jTextField1;

// End of variables declaration



}


/////////////////////////////////////////////////////////////////////////////////////

/* frameTwo.java */


public class frameTwo extends javax.swing.JFrame {

public frameTwo() {

initComponents();

}

public frameTwo(String parameter){

initComponents();

jLabel1.setText(parameter);

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


jLabel1 = new javax.swing.JLabel();


setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("frameTwo");


jLabel1.setBackground(new java.awt.Color(204, 255, 255));

jLabel1.setText("jLabel1");

jLabel1.setOpaque(true);


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(72, 72, 72)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(72, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(37, 37, 37)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(65, Short.MAX_VALUE))

);


pack();

}// </editor-fold>



public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameTwo().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JLabel jLabel1;

// End of variables declaration



}


/////////////////////////////////////////////////////////////////////////////////////

/* frameThree.java */


import javax.swing.*;

public class frameThree extends javax.swing.JFrame {

public frameThree() {

initComponents();

}

public frameThree(JTextField parameter){

initComponents();

this.parameter = parameter;

jLabel1.setText(this.parameter.getText());

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


jLabel1 = new javax.swing.JLabel();

jButton1 = new javax.swing.JButton();


setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("frameThree");


jLabel1.setBackground(new java.awt.Color(204, 255, 255));

jLabel1.setText("jLabel1");

jLabel1.setOpaque(true);


jButton1.setText("update jLabel1");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(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()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(99, 99, 99)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(75, 75, 75)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(48, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(33, 33, 33)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(38, Short.MAX_VALUE))

);


pack();

}// </editor-fold>


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

jLabel1.setText(parameter.getText());

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameThree().setVisible(true);

}

});

}

JTextField parameter;

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JLabel jLabel1;

// End of variables declaration

}


/////////////////////////////////////////////////////////////////////////////////////

/* frameFour.java */


import javax.swing.*;

public class frameFour extends javax.swing.JFrame {

public frameFour() {

initComponents();

}

public frameFour(JLabel parameter) {

initComponents();

this.parameter=parameter;

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


jButton1 = new javax.swing.JButton();

jTextField1 = new javax.swing.JTextField();


setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("frameFour");


jButton1.setText("ubah JLabel di frameOne");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});


jTextField1.setText("jTextField1");


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(75, 75, 75)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(25, 25, 25)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 231, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(62, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap(43, Short.MAX_VALUE)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(32, 32, 32)

.addComponent(jButton1)

.addGap(42, 42, 42))

);


pack();

}// </editor-fold>


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

parameter.setText(jTextField1.getText());

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameFour().setVisible(true);

}

});

}

public JLabel parameter;

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

/////////////////////////////////////////////////////////////////////////////////////

Berantakan ya? masih nyoba2 pake scribefire soalnya.....
N3XT...arrow

29 July 2008

Membuat Multiple Document Interface (MDI) Window



MDI Window? Sebuah Jendela yang bisa menamping beberapa dialog didalamnya yang berdiri sendiri. Cara pembuatannya, supaya tidak tergantung dengan jenis editor yang digunakan, kita pahami dulu langkah pembuatannya. Langkah ini juga bisa untuk memahami sedikit konsep tentang OOP. Sedangkan editornya bisa apa aja. Yang jelas, source code yang disediakan dibawah bisa dijalankan meskipun diedit dengan Notepad. Sedangkan editor lainnya, bisa dicoba sehingga mempunyai pemahaman dan cara masing-masing. Karena langkah ini cuma salah satunya yang agak sederhana.
- Buat sebuah Form Utama untuk tempat semua form lainnya, kita namakan parent window
- Tambahkan JDesktopPane untuk tempat tampilan semua child window nantinya.
- Pada parent window, tambahkan tombol atau menu untuk memanggil form child window
- Buat sebuah kelas untuk menyimpan semua prilaku object child window supaya seragam, sehingga semua child window merupakan inheritance dari class dasar ini. Kita namakan namakan nJFrame yang merupakan inheritance dari JInternalFrame. Pada kelas ini juga ada method buka untuk menampilkan dan menghilangkan child window.
- Sekarang buat child window dengan jenis JInternalFrame, yang diganti menjadi inheritance nJFrame yang kita buat.
- pada parent window, add semua child window kedalam desktopPane dengan method add pada saat inisialisasi.
- Gunakan method buka dari nJFrame pada setiap tombol di parent window yang berfungsi menampilkan child window masing-masing.





Source Code untuk Masing-masing class:



//frmMenu.java
public class frmMenu extends javax.swing.JFrame {
public frmMenu() {
initComponents();
desktop.add(c2);
desktop.add(c1);

setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
}
private void initComponents() {//GEN-BEGIN:initComponents
jToolBar1 = new javax.swing.JToolBar();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
desktop = new javax.swing.JDesktopPane();


addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});

jButton1.setText("Child1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

jToolBar1.add(jButton1);

jButton2.setText("Child2");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});

jToolBar1.add(jButton2);

getContentPane().add(jToolBar1, java.awt.BorderLayout.NORTH);

getContentPane().add(desktop, java.awt.BorderLayout.CENTER);

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
}//GEN-END:initComponents

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
nJFrame.buka(c2);
}//GEN-LAST:event_jButton2ActionPerformed

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
nJFrame.buka(c1);
}//GEN-LAST:event_jButton1ActionPerformed

/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
System.exit(0);
}//GEN-LAST:event_exitForm

public static void main(String args[]) {
new frmMenu().show();
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JDesktopPane desktop;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JToolBar jToolBar1;
// End of variables declaration//GEN-END:variables
private frmChild1 c1 = new frmChild1();
private frmChild1 c2 = new frmChild1();
}



//nJFrame.java
public class nJFrame extends javax.swing.JInternalFrame {
public nJFrame() {
super( "" , //title
false, //resizable
true, //closable
false, //maximizable
false);//iconifiable

}
public static void buka(javax.swing.JInternalFrame frame){
if(frame.isVisible()){
frame.setVisible(false);
}else{
frame.setVisible(true);
try {
frame.setSelected(true);
} catch (java.beans.PropertyVetoException e) {}
}

}
}


//frmChild1.java
public class frmChild1 extends nJFrame {
public frmChild1() {
initComponents();
}
private void initComponents() {//GEN-BEGIN:initComponents

setBounds(0, 0, 352, 276);
}//GEN-END:initComponents


// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables

}


//frmChild2.java
public class frmChild2 extends nJFrame {
public frmChild2() {
initComponents();
}
private void initComponents() {//GEN-BEGIN:initComponents

setTitle("Window");
setBounds(0, 0, 416, 302);
}//GEN-END:initComponents


// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables

}
N3XT...arrow

01 July 2008

MyTotalPack 4.4!

MyTotalPack 4.4,
Portable and Installer version,
Beginner and Advance version.

http://mytotalpack.blogspot.com/2008/06/mytotalpack-44.html N3XT...arrow

CURL_PHP: untuk send-request antar web server

CURL, Client URL Library
FORM HTTP POST
CURL IN ACTION


Libcurl membuat semua jenis komunikasi antar sever mungkin terjadi dengan berbagai macam cara. Bisa dengan protocol http, https, ftp, gopher, telnet, dict, dan ldap dengan dukungan HTTPS certificate, HTTP POST, HTTP PUT, FTP uploading, upload berbasis HTTP form, proxy, cookies, bahkan autentifikasi user dan password. Yang akan dibahas untuk sementara ini adalah HTTP FORM. CURL harus diaktifkan dulu melalui php.ini di bagian windows extention ( untuk windows ) dengan menghilangkan comment di extension=php_curl.dll.

Untuk mengembangkan imaginasi, situasi yang mungkin memerlukan adanya curl:

- Pengiriman data ke server web dengan berbasis FORM HTTP GET dilakukan dengan mengisi sebuah form dengan method GET yang hasilnya ditampilkan dalam url tujuan. Tapi pengiriman juga bisa dilakukan tanpa mengisi sebuah form, cukup dengan memanggil alamatnya, misalkan https://ebank.com/getstatus.php?no=1&pengirim=011&nominal=1000000, maka data bisa dikirim. Proses tersebut tentu saja bisa digantikan oleh mesin secara otomatis, baik dengan javascript location.assign maupun dengan referal php header. Sedangkan pada skrip penerima, semua parameter yang dikirim ada pada Predefined variabel $_GET atau $HTTP_GET_VARS, atau juga bisa $_REQUEST di file getstatus.php. Kesimpulannya, FORM HTTP GET bisa digunakan untuk pengiriman data antar server, dan terlalu sederhana dan bodoh untuk dibahas lebih lanjut. Tapi tetap saja memanfaatkan curl akan membuat proses ribuan kali lebih cepat dan otomatis

- Itu untuk kasus GET, sekarang bagaimana dengan FORM HTTP POST? Form post merupakan kebalikan dari get, semua variabel tidak dilewatkan melalui sebuah alamat link. POST dirancang agar data berasal dari sebuah form dengan method POST dengan skrip penerimanya ada pada bagian action, bukan lagi berasal dari sebuah link. Itulah sebabnya GET banyak digunakan untuk form yang memungkinkan untuk kembali dengan mudah, bookmark-able page, sedangkan POST hampir selalu digunakan untuk semua form untuk pengiriman data dan upload file. Sedangkan pada skrip penerima, semua parameter yang dikirim ada pada Predefined variabel $_POST atau $HTTP_POST_VARS di file getstatus.php. Pengiriman data tidak bisa dilakukan secara otomatis dengan memanggil alamat action dari form, yang tentu saja malah akan mendapat apapun karena tidak ada data yang dikirimkan, atau dengan memaksakan diri dengan memaksakan diri dengan memanggil alamat lengkap dengan parameternya seperti halnya, ini bunuh dir. Ngga ada gunanya. Kecuali untuk programmer skrip penerima yang begitu lugunya menggunakan variabel global atau $_REQUEST untuk menerima datanya. Proses penerimaan dan pengiriman data untuk otomatisasi tidak bisa dilakukan dengan skrip php biasa, harus dengan mengisi sebuah form, lengkap dengan aturan untuk menekan tombol submit untuk memulai pengiriman form. Untuk alasan inilah curl diperlukan. THAT’S WHY CURL EXISTS!

- Ingin membaca halaman web dari server lain untuk ditampilkan kembali? Pake curl

- Harus mengirim data antar server? Pake curl

- Otomatisasi, tanpa perlu mengisi form berulang-ulang untuk ribuan data, cukup mengandalkan php? Pake curl

- Ingin mendapatkan status selesainya transaksi yang dilakukan web lain? Pake curl

- Ingin memberikan akses kepada web server lain untuk mendapat data yang diperlukan dari web server kita, tanpa harus memberikan akses ke database mysql secara langsung? Cukup dengan memberikan alamat skrip dan parameter yang diperlukan beserta format hasil datanya. Ini cara paling mudah dan bukan paling aman. pake curl.

- Brute force attack, mencoba ribuan kombinasi username dan password dalam sedetik, atau melumpuhkan server lain dengan mudah? Pake CURL. Itulah alasannya curl tidak diaktifkan secara default karena kekuatanya. Itulah alasannya ada algoritma UID (Unique Identity) untuk setiap pengiriman form ke pengisi. Itulah sebabnya ada captcha! Menyebalkan, kita seperti di tes membaca dan menulis sekaligus dites mata cuma untuk daftar email!, gini2, bukan cuma lulusan TK. THAT’S WHY CAPTCHA EXSIST!

Sekarang, contoh untuk penerimaan data. Skrip dibawah ini akan mengambil tampilan dari detik.com kemudian langsung menampilkan hasilnya......


<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.detik.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>


Sekarang, contoh untuk pengiriman data. Misalkan webserver penjual.com ingin mengetahui status transaksi dari seorang pelanggan melalui ebank.com. Apabila sudah dilakukan, menghasilkan nilai 1, apabila belum menghasilkan nilai 0. Sebagai contoh menggunakan dua buah skrip php berbeda server untuk berkomunikasi.


/* http://penjual.com/sender.php */
<?
function ambilStatusMutasi($no,$pengirim,$penerima,$nominal){
$url='http://ebank.com/receive.php'; //?no=1&pengirim=011&nominal=1000000';

$postfields = array ('no' => $no,
'pengirim' => $pengirim,
'penerima' => $penerima,
'nominal' => $nominal
);

if (!$curld = curl_init()) {
echo "CURL GAGAL.\n";
exit;
}

curl_setopt($curld, CURLOPT_POST, true);
curl_setopt($curld, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
//echo "Received data: <hr>$output<hr>\n";
curl_close($curld);
//echo $output;
return $output;

}

//pemakaian fungsi
if(ambilStatusMutasi(“11”,”012”,”001”,”100000”)==1){
echo”Mutasi Berhasil”;
}else{
echo”Mutasi GAGAL atau belum bayar”;
}
?>




/* http://ebank.com/receive.php */
<?
$no_mutasi = $_REQUEST[no];
$pengirim = $_REQUEST[pengirim];
$penerima = $_REQUEST[penerima];
$nominal = $_REQUEST[nominal];
$result = mysql_query("select id_mutasi, id_nasabah_debit,id_nasabah_kredit,nominal from mutasi_tb where id_mutasi='$no_mutasi' and id_nasabah_debit='$pengirim' AND id_nasabah_kredit = '$penerima' AND nominal >= $nominal ");

if(mysql_num_rows($result)>0){
echo 1;
}else{
echo "0 $no_mutasi $pengirim $penerima $nominal";
}

?>


Bisa ditambahkan verifikasi $_REMOTE untuk memastikan request data berasal dari server yang diberikan akses.

Entah, kenapa php_manual yang selalu jadi andalan tidak bisa memberikan jawaban seperti ini untuk situasi dan saat tertentu.

Hari ini? Bahagia. Karena tahu segalanya......

Kadang, harus jadi orang idiot untuk mendapatkan sebuah rahasia besar
N3XT...arrow

26 June 2008

Portable Torrent Client!

PORTABLE TORRENT CLIENT WOOOOOOY!
http://om4gus-apps.blogspot.com/2008/06/portable-torrent-client.html N3XT...arrow

24 June 2008

Advanced Tag Editor Windows Media Player 11: MP3 Album Art & Lyrics


Setelah punya banyak waktu untuk merenung, akhirnya menemukan beberapa hal baru yang bisa dieksplorasi. Diantaranya, WMP11 ini. Bagian yang paling banyak berubah dari versi sebelumnya adalah Library. Yang menarik adalah tag editor. Berbeda dengan ID3 baik v1 maupun v2, yang hanya berisi beberapa informasi standar seperti judul lagu, nama artis, album. Tag pada WMP11, banyak tambahan yang bisa dilakukan, bukan cuma teks dengan ukuran banyak, tetapi gambar. Semuanya diembeded, dimasukkan langsung kedalam file aslinya. Fasilitas ini bisa dibuka lewat Library, Advanced Tag Editor. Yang akan dibahas adalah dua hal dari beberapa field tambahan yang disediakan, yaitu Lyric dan Album Art. Entah kenapa cuma berlaku pada MP3, bukan WMA yang dikembangkan microsoft sendiri!
1. Album Art, berupa gambar.
Bisa diisi cover album, gambar artis, atau logo. Dengan jumlah yang lebih dari satu. ALbum art akan ditampilkan di bagian library untuk menunjukkan album dari lagu, dan juga ditampilkan saat lagu dijalankan. Tinggal buka Advanced Tag Editor, bagian picture.



2. Lyric, bisa menyimpan banyak lirik, dalam beberapa bahasa yang berbeda, dalam bahasa yang berbeda.
Tambahannya adalah, sinkronisasi, penyesuaian lirik lagu dengan waktu. Pada Advanced Tag Editor, Klik Add, Pilih bahasanya, dan tambahkan teks liriknya. Setelah di-OK, jalankan lagunya, maka lirik secara keseluruhan akan keluar pada bagian bawah visualization, Now Playing. Apabila ingin melakukan perubahan pada timingnya, sehingga teks yang sesuai yang akan keluar saat dijalankan, lakukan dengan mengeklik Synchronized Lyrics. Kemudian, secara otomatis setiap baris lirik akan ditempatkan secara berurutan, sekarang tinggal menjalankan dan menggeser posisi timing lagu sesuai dengan liriknya. Oh Iya, hal yang paling menyebalkan adalah dragndrop yang terlalu sensitif, yang bisa membuat sebuah baris lirik lagu bisa langsung meloncat entah kemana. Jadi, sering-seringlah melakukan apply, sehingga bisa melakukan cancel untuk membatalkan bagian yang salah, dan mencoba lagi.
Selamat Mencoba!
N3XT...arrow

16 June 2008

PHP: Menyembunyikan Path File Download

Hah, mulai lagi. Sebagai pemanasan dimulai dengan yang mudah dulu,dalam hal pengamanan download file. Tujuannya adalah dengan membuatsebuah script download tanpa harus langsung diarahkan ke file tujuanyang bisa diambil user. Langkah yang paling primitif dalam menyediakan download file adalah dengan anchor hyperlink.
<a href='Arsip/Laporan-jun-08.pdf' >download</a>
Dengan hyperlink diatas, file yang disediakan di server akan dikirimkan untuk diambil, misalkan dengan fullpath dari file tersebut'/var/www/Arsip/Laporan-jun-08.pdf'. Sekarang dengan fasilitas headerdari php, kita bisa menyembunyikan relatif sekaligus fullpath dari file.
Dengan menyembunyikan url file, user tidak perlu mengetahui path asli dari file, download dialog cuma menampilkan bahwa file diambil darisebuah file php.

Dengan tujuan dan keuntungan dari metode ini adalah:
- Lebih menyamarkan susunan direktori dari htdocs server.
- Memaksa browser untuk langsung menyediakan download dialog, tanpa terlebih dahulu melihat tipe file yang didownload.
Pada direct url, browser terlebih dahulu melihat plugin pembuka fileyang ada didalam dirinya, dan membuka, bukan lagi mendownload file, apabila memungkinkan. Misalkan kita menyediakan url dengan tipe filepdf, maka browser mendeteksi mime-type-nya sebagai application/pdf,membuka internal viewer untuk pdf, misalkan berupa plugin dari acrobatreader. Tentu ini menjengkelkan bagi user karena lebih mudah kalau filedidownload terlebih dahulu setelah itu file yang sudah tersimpan dilain waktu.
Dengan menggunakan hiding url, browser tidak bisa melakukan deteksitipe file karena mime-type-nya sudah disamarkan sebagai octet-stream,bahkan apabila kita memberikan download untuk file dengan tipe yangbisa dibuka langsung oleh browser, misalkan html, php, atau xml.
- Tidak menyediakan langsung alamat aslinya, artinya lebih menyulitkanuser yang menggunakan download manager yang bersifat multiple downloadsekaligus yang bisa memperlambat user yang lain. Url yang diperlihatkankepada user adalah url dari file php dengan skrip hiding url ini.
- Dengan memanfaatkan session, kita bisa mengatur hanya user yang sudahmelakukan autentifikasi yang bisa mengambil file yang kita sediakan.
- kita bisa menyediakan url file yang bersifat valid untuk sementara,dengan penambahan angka random dalam url, dengan tanggal expired yang bisa ditentukan.
- Bisa meyediakan fasilitas php yang lain, selain session dan random,misalkan, integrasi dengan database untuk manajemen dan statistikdownload, download file yang di-generate secara dinamis melalui imagecreate, memanfaatkan variabel $_POST, dll. Tergantung kreatifitas aja deh.

Fungsi dasar yang digunakan adalah:
- ob, untuk melakukan output buffering, mengumpulkan beberapa data untuk dikirimkan semua sekaligus ke user secara langsung.
- header, untuk menentukan header dari respon server. header, artinyaskrip ini harus diletakkan di paling atas dari skrip yang lain. Tidak boleh didahului dengan header yang lain dan respon server lainnya.Misalkan didahului oleh echo atau tag html, bahkan harus diatas<html> sekalipun. HMMM, sekarang masalah header agak sedikitpanjang seritanya, makanya coba dulu beberapa hal.

+ Contoh dari penggunaan header adalah untuk melakukan redirect dengan cara berikut:
<?
header('Location: http://www.om4gus.blogspot.com/');
?>


+ kemudian letakkan skrip diatas yang lain, tambahkan exit untuk memastikan tidak ada respon lainnya yang dikirimkan:
<?
header('Location: http://www.om4gus.blogspot.com/');
exit();
?>


+ Header yang didahului respon lainnya akan mengembalikan error berikut:
Warning: Cannot add header information - headers already sent
contohnya untuk :
<html>
<?
header('Location: http://www.om4gus.blogspot.com/');
?>


untuk memastikan tidak ada error yang berhubungan dengan header tersebut cek isi header terlebih dahulu:
if (!headers_sent()) {
header('Location: http://www.om4gus.blogspot.com/');
exit;
}


Sekarang Alternatif untuk redirect tanpa harus memikirkan header segala macam, bisa diletakkan dibagian manapun, adalah dengan menggunakan js
<?
echo "<script>location.assign('http://www.om4gus.blogspot.com/')</script>";
exit();
?>


atau memaksa user untuk kembali ke halaman sebelumnya dengan back(), forward untuk halaman berikutnya:
<? echo "<script>history.back();</script>"; ?>

Tambahan, karena perintah header selalu diletakkan di paling atas, usahakan selalu menggunakan file php yang terpisah dari file lain, dengan keperluan khusus untuk menangani download file. Atau kalaupun bersamaan dengan lainnya, gunakan sebuah kondisi, misalkan pengecekan dengan variabel session atau get, sehingga hanya dijalankan karena kondisi tertentu.

Sekarang kembali ke topik utama, masalah implementasi.....
Tinggal membuat hiperlink yang diarahkan ke sebuah php, yang mentrigger terjadinya proses download.
<html>
<a href='dl.php' />Download</a>
</html>


Yup, simple! ingat, ke php, bukan file aslinya seperti sebelumnya, <a href='Arsip/Laporan-jun-08.pdf'>, kemudian buat file pdf sesuai alamat tersebut untuk percobaan selanjutnya.


Untuk Source dari file php yang dipanggil, coba satu-persatu contoh implementasi berikut:
Fungsi dasar untuk melakukan hiding url fullpath, dengan tetap menggunakan nama file asli dari file yang didownload:
<?
//file dengan nama dl.php
//pembuatan fungsi
function download($url){
ob_start();
$mm_type="application/octet-stream";
header("Cache-Control: public, must-revalidate");
header("Pragma: File Download");
header("Content-Type: $mm_type");
header("Content-Length: ".(string)(filesize($url)));
header('Content-Disposition: attachment; filename="'.basename($url).'"');
header("Content-Transfer-Encoding: binary\n");
ob_end_clean();
readfile($url);
exit();
}
//Contoh pemanggilan
if(file_exists("Arsip/Laporan-jun-08.pdf"))
download("Arsip/Laporan-jun-08.pdf");
?>


Fungsi dengan melakukan hiding fullpath, sekaligus memberikan nama file falsu sebagai default save name:
<?
//pembuatan fungsi
function download($url,$fakename){
ob_start();
$mm_type="application/octet-stream";
header("Cache-Control: public, must-revalidate");
header("Pragma: File Download");
header("Content-Type: $mm_type");
header("Content-Length: ".(string)(filesize($url)));
header('Content-Disposition: attachment; filename="'.$fakename.'"');
header("Content-Transfer-Encoding: binary\n");
ob_end_clean();
readfile($url);
exit();
}
//Contoh pemanggilan
if(file_exists("Arsip/Laporan-jun-08.pdf"))
download("Arsip/Laporan-jun-08.pdf","Laporan-current.pdf");
?>



Sekarang, contoh yang menggunakan session
<?
session_start();
function download(){
$url=$_SESSION[user]."/Laporan-jun-08.pdf";
ob_start();
$mm_type="application/octet-stream";
header("Cache-Control: public, must-revalidate");
header("Pragma: File Download");
header("Content-Type: $mm_type");
header("Content-Length: ".(string)(filesize($url)));
header('Content-Disposition: attachment; filename="'.$_SESSION[user]."_".basename($url).'"');
header("Content-Transfer-Encoding: binary\n");
ob_end_clean();
readfile($url);
exit();
}
if(isset($_SESSION[user]))
download();

if(isset($_POST[uname])){
if($_POST[uname]=="me"&&$_POST[pass]=="em"){
session_register(user);
$_SESSION[user]="Aku";
//<script>location.assign('http://www.om4gus.blogspot.com/')</script>
}else if($_POST[uname]=="mine"&&$_POST[pass]=="enim"){
session_register(user);
$_SESSION[user]="Saya";
} header('Location: '.$_SERVER[PHP_SELF]);
}else{
?>
<form method=POST>
<center>
<input type=text name=uname><br/>
<input type=password name=pass><br/>
<small>coba, username me passwordnya em</small><br/>
<input type=submit name=login value="login untuk mendownload">
<center>
</form>
<?
}
?>


That's it. Gampang khan?
N3XT...arrow