Maklumat

Tulisan-tulisan terkini dapat juga didapatkan di halaman Kompasiana di alamat https://kompasiana.com/didikaha

Khusus untuk konten-konten sastra seperti puisi, cerpen dan esai silahkan kunjungi http://blog.edelweis-art.com. Terima kasih (Penulis)

Tampilkan postingan dengan label PHP. Tampilkan semua postingan
Tampilkan postingan dengan label PHP. Tampilkan semua postingan

Kamis, November 05, 2020

Membaca Data KTP Elektronik dengan Tesseract OCR

 

Ektraksi data teks dari KTP-el dengan Tesseract OCR

Bagi kita para pengembang aplikasi perangkat lunak (software), adakalanya barangkali kita mendapat keluhan atau tepatnya request dari pengguna aplikasi kita untuk menyediakan fitur yang dapat memudahkan proses verifikasi data, seperti data KTP pelanggan. 

Selama ini memang setiap layanan yang mewajibkan penggunanya (dalam hal ini: pelanggan) untuk menginput data KTP seperti NIK, Nama dan Tanggal Lahir, memang mewajibkan pula untuk mengunggah juga foto KTP-nya. 

Tidak lain digunakan untuk proses verifikasi dan validasi data yang telah diinput. Namun, hal ini tidak menutup kemungkinan juga untuk terjadinya kekeliruan. 

Terlebih jika data yang mesti diverifikasi tidak sedikit jumlahnya. Tentu waktu yang dibutuhkan menjadi semakin lama. Hal ini tentu dapat berakibat kurang baik juga bagi image pelayanan terhadap pelanggan. (Baca selengkapnya)

Minggu, September 29, 2019

Menguji Instalasi Server Web dan Koneksi ke Database

Pada tulisan sebelumnya, saya telah membahas tentang cara menginstal Apache, PHP & MariaDB untuk keperluan server web. Indikasi instalasi tersebut sukses atau tidak bisa kita lihat melalui Windows Services apakah masing-masing service-nya telah/dapat berjalan atau belum (dalam hal ini: service dari Apache & MariaDB). Jika masing-masing service telah berjalan, maka saatnya kita melakukan pengujian.

Pengujian yang pertama kita lakukan untuk Apache dan PHP. Pertama, kita coba cek log error untuk Apache & PHP. Nama dan lokasi file log error untuk Apache bisa dilihat pada baris ErrorLog "logs/error.log" pada file http.conf. Sementara file log error untuk PHP bisa dilihat pada baris error_log = php_errors.log pada file php.ini.

Apa yang tertulis di file log error Apache tergantung dari LogLevel yang ada, yaitu debug, info, notice, warn, error, crit, alert & emerg (lihat tabel di bawah ini).


Jika pada httpd.conf yang kita temukan adalah LogLevel warn artinya, sesuai tabel di atas, Apache akan mencatatkan kondisi-kondisi yang terjadi. Kita dapat mengubah LogLevel yang ada sesuai dengan kebutuhan kita. Sementara untuk log error PHP, secara bawaan PHP akan membiarkannya kosong jika tidak terjadi masalah. Artinya, jika kita tidak atau belum menemukan file log error PHP berarti baik-baik saja adanya.

Sekarang kita coba lihat file log error Apache.


Untuk proses instalasi yang telah kita lakukan, pada file log error Apache terlihat adanya sebuah warning saat service Apache dijalankan: [ssl:warn] [pid 4628:tid 652] AH01873: Init: Session Cache is not configured [hint: SSLSessionCache]. Ini sepertinya berkaitan dengan module ssl yang telah kita aktifkan namun belum kita atur konfigurasi ssl-nya. Untuk itu, sementara kita nonaktifkan kembali module ssl-nya dengan memberikan kembali tanda pagar (#) pada dua baris berikut:

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so

Setelah kita restart Apache-nya, warning itu tidak lagi muncul (lihat gambar di bawah).


Adapun file log error PHP, ternyata belum ditemukan, artinya settingan pada file php.ini tidak ada yang bermasalah.

Berikutnya kita buat file index.php yang kita letakkan di root dokumen web dengan isian sebagai berikut:


Lalu kita coba buka melalui browser web di komputer server pada alamat http://localhost/index.php atau cukup http://localhost saja, maka akan nampak tampilan seperti di bawah ini.


Ya, phpinfo() memang berfungsi untuk menampilkan semua informasi terkait PHP yang kita gunakan. Sekarang kita coba buka halaman index.php tersebut dari komputer atau perangkat lain, yaitu cukup dengan mengetikkan alamat IP server pada browser web yang ada.


Yang muncul pada halaman kemudian berbeda dari apa yang ditampilkan saat mengaksesnya dari komputer server. Yang muncul hanyalah tulisan Hello, World! karena memang telah kita atur demikian. Dan memang sebaiknya informasi yang didapat dari phpinfo() janganlah ditampilkan untuk publik karena memang informasi yang ada bersifat krusial menyangkut data konfigurasi server kita.

Sekarang kita akan melakukan pengujian koneksi ke MariaDB menggunakan mysqli. Untuk itu kita buat file db_conn.php dengan isian sebagai berikut:


Setelah itu kita coba buka halamannya.



Ups! Ternyata error. Dan setelah kita cek di file log error PHP ditemukan keterangan: PHP Fatal error:  Uncaught Error: Call to undefined function mysqli_connect() in D:\htdocs\db_conn.php:11 Stack trace: #0 {main} thrown in D:\htdocs\db_conn.php on line 11.

Dari keterangan error yang ada, ternyata mysqli tidak atau belum dikenali. Sekarang kita coba cek php.ini. Ternyata mysqli-nya belum diaktifkan. ;extension=mysqli. Begitu pun dengan semua extention lainnya. Untuk itu, kita aktifkan dulu mysqli dengan membuang tanda titik-koma (;) yang berada di depannya. Sekalian juga kita aktifkan beberapa extention lainnya yang kita perlukan, seperti curl, fileinfo, pdo_mysql dan lain-lain. Setelah itu kita restart service Apache, dan kita coba buka kembali halaman db_conn.php.



Yess! Sekarang kita telah bisa tersambung ke database MariaDB.

Penting untuk selalu memperhatikan dan memahami log error jika sewaktu-waktu terjadi kendala, karena memang fungsi dari log error adalah membantu kita untuk mengetahui kondisi yang ada agar dapat diperbaiki

Untuk pengelolaan database lebih lanjut, kita akan menggunakan phpMyAdmin yang bisa diunduh di situs www.phpmyadmin.net. Saat ini versi stable terakhir yang tersedia adalah phpMyAdmin 4.9.1. Setelah kita unduh, ekstrak file phpMyAdmin-4.9.1-all-languages.zip lalu kita tempatkan di root dokumen web. Agar tidak sulit saat kita akan membukanya karena namanya terlalu panjang, ubahlah namanya menjadi misalnya phpmyadmin saja.


Ada beberapa settingan yang perlu kita lakukan. Pertama, secara default phpmyadmin tidak mengijinkan akses ke database tanpa password. Untuk itu kita perlu mengubahnya, jika saat instalasi MariaDB kita membiarkan password untuk root tetap kosong. Cari file config.sample.inc.php kemudian kita copy atau rename menjadi config.inc.php. Buka file tersebut lalu cari baris $cfg['Servers'][$i]['AllowNoPassword'] = false; dan ubah nilai false menjadi true. Kedua, ini sebenarnya opsional namun jika Anda tidak ingin phpmyadmin diakses dari luar komputer server, maka kita perlu membatasi aksesnya dengan mengubah sedikit isi pada file index.php dengan menambahkan beberapa baris berikut pada bagian paling atas:


Dengan pembatasan akses di atas, maka jika ada yang berusaha mengakses phpmyadmin dari luar komputer server akan otomatis diarahkan ke halaman utama web kita.

Demikian, mudah-mudahan bisa menambah pencerahan. Salam!

Sabtu, September 28, 2019

Menginstall Apache, PHP & MariaDB pada Windows

Meski sekarang tren penggunaan server pribadi sudah mulai beralih ke layanan cloud semacam AWS dan Alibaba Cloud, namun penggunaan server pribadi tentu masih diperlukan adanya. Misalnya untuk keperluaan internal semacam perpustakaan, lab atau untuk keperluan pengujian dan development secara offline. Bagi Anda yang ingin membangun server web secara instan di komputer Windows, Anda bisa memanfaatkan XAMPP. Dengan sekali instal, Anda akan mendapatkan sekaligus Apache, PHP & MariaDB (yang menggantikan MySQL) terinstal di komputer Anda. Namun bagi Anda yang ingin membangun server web secara manual, maka Anda mesti menginstal satu per satu aplikasi yang diperlukan tersebut (Apache, PHP & MariaDB). Saya sendiri, lebih suka membangun server web secara manual, baik untuk development maupun production, karena lebih mudah melakukan pengaturan, update dan upgrade versi. Namun, tentu ini adalah soal selera, karena sebenarnya menggunakan XAMPP pun kita masih bisa melakukan pengaturan khusus seperti yang kita inginkan.

Well, bagi Anda yang ingin membangun server web secara manual, berikut akan sedikit saya share cara instalasinya. Sebelumnya, tentunya Anda harus mempersiapkan installer dari aplikasi-aplikasi yang diperlukan.

Catatan:

Tutorial ini berlaku untuk Windows 10 64-bit. Jika Anda menggunakan versi Windows lain, mungkin akan ada beberapa langkah yang berbeda, terutama untuk file installer-nya. Silahkan Anda sesuaikan atau cari referensinya ke Mbah Google.

Pertama, Apache. Apache sebagai aplikasi utama server web yang memungkinan data yang disediakan dapat diakses dengan mudah melalui http. Anda bisa mengunduh installer Apache melalui situs apachelounge.com. Sampai tulisan dibuat, versi yang terakhir yang tersedia adalah Apache 2.4 VS16 yang dirilis pada tanggal 14 Agustus 2019.

KeduaPHP. Sesuai namanya (PHP: Hypertext Preprocessor), berfungsi untuk mengolah script yang kita tulis sebelum ditampilkan pada halaman web ataupun untuk mengelola inputan dari pengguna yang kemudian disimpan di database ataupun ditampilkan hasilnya pada halaman web. Untuk mengunduh installer PHP, Anda bisa mengunjungi alamat http://windows.php.net/download/. Versi terakhir saat ini adalah PHP 7.3 (7.3.10) yang dirilis pada tanggal 16 September 2019.

Ketiga, MariaDB. Anda bisa mengunduh installer MariaDB melalui alamat https://mariadb.com/downloads/. MariaDB, sebagaimana MySQL, merupakan aplikasi database yang berfungsi untuk menampung data yang dipergunakan untuk dipublikasikan melalui server web. Versi Community Server, yaitu yang tersedia secara cuma-cuma, yang terakhir dari MariaDB saat ini adalah versi 10.4.8.

Instalasi Apache & PHP


Kita akan menggunakan file zip untuk menginstal Apache dan PHP. Ekstrak file aplikasi Apache yang telah kita unduh yaitu httpd-2.4.41-win64-VS16.zip lalu pindahkan folder Apache24 yang berada di dalamnya ke drive C. Sementara untuk PHP, setelah kita ekstrak, ubahlah nama folder hasil ekstraksi dari php-7.3.10-Win32-VC15-x64.zip menjadi php lalu pindahkan ke drive C.

Bukalah file httpd.conf pada folder C:\Apache24\conf. Tambahkan baris Define PHPROOT "c:/php7" dan baris Define DOCROOT "d:/htdocs" setelah baris Define SRVROOT "c:/Apache24" (ketiga baris ini untuk mendefinisikan folder utama dari Apache & PHP serta folder htdocs) serta tambahkan baris PHPIniDir "${PHPROOT}" setelah baris ServerRoot "${SRVROOT}". Di bawahnya tambahkan lagi tiga baris berikut yang berfungsi agar file PHP dapat dijalankan di server web karena secara default file PHP tidak dapat dijalankan secara langsung:

AddHandler application/x-httpd-php .php
AddType application/x-httpd-php .php .html
LoadModule php7_module "${PHPROOT}/php7apache2_4.dll"

Setelah itu, ubah email pada baris ServerAdmin admin@example.com menggunakan email Anda serta ubah nama server pada baris ServerName www.example.com:80 dengan nama domain atau ip server Anda. Ubah juga baris DocumentRoot "${SRVROOT}/htdocs" dan <Directory "${SRVROOT}/htdocs"> menjadi DocumentRoot "${DOCROOT}" dan <Directory "${DOCROOT}">. DOCROOT sendiri tidak harus berada di folder d:/htdocs. Bisa saja di d:/www atau kita tempatkan di folder atau drive lainnya. Yang terpenting adalah jangan meletakkannya di drive OS (C). Karena jika sewaktu-waktu OS-nya error atau rusak dan mesti diinstal ulang, kita lebih mudah untuk menyelamatkan datanya.

Selanjutnya, carilah baris AllowOverride None lalu ubah menjadi AllowOverride All (agar konfigurasi tambahan yang kita tulis pada file .htaccess kemudian dapat dijalankan juga). Lalu cari lagi baris DirectoryIndex index.html dan tambahkan index.php di depan index.html sehingga menjadi DirectoryIndex index.php index.html (berfungsi agar jika ada dua file index yang sama dengan ekstensi .php dan .html maka yang akan didahulukan/dieksekusi adalah file index.php).

Terakhir, aktifkan module rewrite, sochace_shmcb & ssl dengan membuang tanda pagar (#) pada baris-baris berikut:

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so

Jangan lupa save!. Module rewrite berfungsi salah satunya untuk mengubah url agar menjadi lebih enak dibaca dan diingat-ingat (misalnya mengubah url www.toko-sembako-online.com/index.php?cat=12&product=3456 menjadi www.toko-sembako-online.com/beras/beras-cianjur). Sedangkan module sochace_shmcb & ssl kita aktifkan agar web kita bisa diakses menggunakan https.

Selanjutnya, bukalah folder C:\php lalu copy file php.ini-development atau php.ini-production menjadi file php.ini. Bukalah file php.ini.

Jika diperlukan, ubahlah nilai-nilai dari max_execution_time, max_input_time, post_max_size, upload_max_filesize & memory_limit sesuai kebutuhan Anda. Setelah itu jangan lupa save. Parameter max_execution_time berfungsi untuk mengatur batas waktu berapa detik eksekusi sebuah script (default 30 dan 0 untuk tanpa batas). Sedangkan max_input_time, mengatur batas waktu input/request berapa detik sejak inputan/request diterima sampai dengan dieksekusi (default 60 dan -1 untuk tak terbatas). post_max_size mengatur batas ukuran file yang dapat dikirim melalui POST (misal 2MB atau 2048). upload_max_filesize mengatur batas ukuran file yang dapat diunggah (misal 1MB atau 1024) dan memory_limit mengatur alokasi memory komputer yang akan digunakan untuk mengeksekusi script PHP (misal 2048MB untuk alokasi memory sebesar 2GB).

Agar PHP dapat dikenali oleh sistem komputer, maka kita perlu memasukkan folder C:\php ke dalam Path System Environtment. Dan agar Apache dapat berjalan otomatis setiap kali komputer dinyalakan, maka silahkan buka CMD (buka sebagai Administrator) lalu ketik cd /d C:\Apache24\bin. Setelah aktif pada folder C:\Apache24\bin, ketik httpd.exe -k install -n "Apache2.4" untuk menginstall service Apache2.4.

Untuk melakukan upgrade versi Apache & atau PHP, sangat mudah, yaitu cukup mengganti file Apache yang berada di folder C:\Apache24 dan file PHP yang berada di folder C:\php dengan file baru. Jangan lupa sesuaikan konfigurasi dan pengaturannya di file httpd.conf & php.ini

Instalasi MariaDB


Jika untuk Apache & PHP kita menggunakan file zip, maka untuk menginstal MariaDB kita menggunakan file installer Windows (msi) yaitu mariadb-10.4.8-winx64.msi. Silahkan jalankan file tersebut dan ikuti petunjuk-petunjuk yang ada hingga proses instalasi selesai.

klik Next

centang untuk menyetujui lalu klik Next

klik tanda silang pada pilihan Database Instance

pilih Entire feature untuk menginstal semua fitur lalu klik Next

isikan kata sandi untuk 'root' atau buang centang pada Modify password
untuk membiarkan tanpa kata sandi lalu klik Next

klik Next

klik Install

tunggu sampai proses selesai lalu klik Next

selesai

Setelah MariaDB terinstal, seperti halnya folder htdocs, kita perlu memindahkan pula folder data MariaDB agar lebih aman. Untuk itu, silahkan buka Windows Service lalu stop dulu MariaDB. Buka folder data yang berada di C:\Program Files\MariaDB 10.4. Buka file my.ini lalu ganti lokasi penyimpanan data pada baris datadir=C:/Program Files/MariaDB 10.4/data ke lokasi baru misalnya menjadi datadir=D:/MariaDB/data. Jangan lupa save. Kemudian, pindahkan semua file dan folder yang berada di C:/Program Files/MariaDB 10.4/data ke D:/MariaDB/data (kecuali file my.ini). Jalankan kembali MariaDB.

Untuk mengupdate versi MariaDB ataupun menginstal lagi MariaDB pada komputer yang sama, cukup jalankan lagi file installernya dan ikut petunjuk yang ada. Jika kita bermaksud mengupdate versi, gunakan port yang sama seperti yang sedang digunakan (default port-nya 3306 seperti MySQL). Namun, jika bermaksud menginstal lagi, gunakan port dan nama service yang berbeda dan juga folder data yang berbeda. Jangan lupa menyesuaikan juga lokasi penyimpan pada file my.ini jika bermaksud mengupdate versi

pilih Create new untuk menginstal baru/menambahkan atau
pilih Do not create jika akan mengupgrade lalu klik Next

ubah Service Name dan TCP port untuk menginstal baru/menambahkan
atau biarkan apa adanya jika akan mengupgrade lalu klik Next

klik Ok

klik Finish untuk pengaturan lebih lanjut

klik No

centang pada pilihan database yang akan diupgrade lalu klik Upgrade

tunggu sampai proses selesai

selesai



Buka file my.ini pada folder data pada lokasi MariaDB yang baru (lihat gambar di atas) lalu sesuaikan lokasi data. Jika kita sedang mengupgrade maka kita tidak perlu memindahkan file dan folder yang ada pada folder data, karena kita akan menggunakan file dan folder yang telah ada sebelumnya. Namun jika kita bermaksud menginstal baru, maka kita perlu memindahkannya seperti saat instalasi pertama.

Jika kita sedang mengupgrade, pastikan service MariaDB sebelumnya sudah tidak ada atau di-disable pada Windows Services, sebab akan bisa membuat MariaDB tidak dapat dijalankan karena port-nya masih aktif.

Selamat mencoba!

Untuk melakukan pengujian terhadap instalasi Apache, PHP & MariaDB, silahkan baca tulisan saya yang berikutnya: Menguji Instalasi Server Web dan Koneksi ke Database

Selasa, September 11, 2018

Mengunggah Foto dari Ponsel dengan HTML5, jQuery dan PHP

Di jaman mobile sekarang ini, pengembang aplikasi berbasis web pun dituntut harus bisa menyesuaikan diri. Di mana tampilan dan fitur yang dibuat, harus mobile friendly juga. Salah satu fitur yang biasa digunakan adalah mengunggah foto. Dan untuk kasus mobile device, kamera menjadi hal utama yang harus dipertimbangkan.

Beruntung, jika kita mau rajin mencari dan membaca, sebenarnya di internet telah tersedia banyak artikel, contoh dan panduan untuk pengembangan aplikasi yang kita buat. Tinggal kita sesuaikan saja dengan kebutuhan dan kemampuan nalar kita. Karena, tidak selalu yang kita dapatkan cocok dan bisa kita terapkan untuk aplikasi kita. Seperti halnya tentang pengunggahan foto dari ponsel baik dari data yang sudah ada maupun mengambil langsung menggunakan kamera, dari sekian yang saya baca, saya menemukan satu artikel yang saya anggap cocok. Dan melalui tulisan ini, saya ingin berbagi dengan Anda yang sedang memerlukannya.

Secara umum, proses pengunggahan foto (baik dari perangkat selular maupun komputer biasa), dapat dibagi menjadi 3 bagian, yaitu:

  1. Memilih atau mengambil foto
  2. Memfilter dan mempreview foto
  3. Mengunggah foto

Untuk memilih atau mengambil foto, kita bisa menggunakan elemen input pada HTML5. Kenapa mesti HTML5? Ya, karena pada HTML5 telah dimungkinkan untuk menginput foto atau file lebih dari satu sekaligus. Sementara untuk memfilter foto (biasanya mengatur ulang ukuran atau dimensi foto yang terasa cukup besar) serta mempreviewnya, bisa dilakukan di sisi klien maupun server. Namun, saya lebih suka melakukannya di sisi klien. Toh, jika kemudian pengguna bermaksud membatalkan unggahannya, tidak perlu sampai merecoki server. Untuk memfilter dan mempreview foto di sisi klien, kita bisa menggunakan jQuery. Dan untuk hal terakhir, yaitu proses pengunggahan--dan penyimpanan--foto ke server, kita pun bisa menggunakan jQuery yang kemudian akan diterima dan diteruskan prosesnya menggunakan PHP.

Berikut impelementasinya:

file index.html
<div>
  <input id="upload-image" type="hidden" /><input accept="image/*" id="image-file" multiple="" type="file" /> <button id="upload-file">Upload</button>
</div>
<div id="preview-image"></div>

file upload.js
$(document).ready(function(){
 canvasLastID = 0;

 $(document).on("change", '#image-file', function(e) {
  var files = e.target.files;

  $.each(files, function(index,value){
   if(value) {
    if(/^image\//i.test(value.type)) {
     readFile(value,canvasLastID);
     canvasLastID++;
    } else {
     alert("Oops! Invalid file type");
    }
   }
  });

  $(this).val('');
 });

 $(document).on("click",".delete-canvas",function(){
  var index = $(this).attr('data-id');
  var dataURL = $(this).attr('data-content');

  var attachments = $("#upload-image").val();
  attachments = JSON.parse(attachments);

  var iO = attachments.indexOf(dataURL);
  attachments.splice(iO,1);

  var n = attachments.length;

  if(n == 0) {
   $("#upload-image").val('');
   $("#preview-image").empty();
   canvasLastID = 0;
  } else {
   attachments = JSON.stringify(attachments);
   $("#upload-image").val(attachments);
   $('.canvas-box[data-id='+index+']').remove();
  }
 });

 $(document).on("click","#upload-file",function(e){
  e.preventDefault();

  var data = {};
  data.imgs = $("#upload-image").val();

  if(data.imgs=="") {
   alert("Please select atleast one photo");
  } else {
   $.post("upload.php", data, function(data) {
    var data = JSON.parse(data);

    if(data.status==1) {
     $("#upload-image").val('');
     $("#preview-image").empty();
     canvasLastID = 0;
    }

    alert(data.message);
   });
  }

  return false;
 });
});

function readFile(file,index) {
 var reader = new FileReader();

 reader.onloadend = function () {
  processFile(reader.result, file.type, index);
 }

 reader.onerror = function () {
  alert("Oops! An error has occurred");
 }

 reader.readAsDataURL(file);
}

function processFile(dataURL, fileType, index) {
 var maxWidth = 800;
 var maxHeight = 800;

 var maxIconWidth = 150;
 var maxIconHeight = 150;

 var image = new Image();
 image.src = dataURL;

 image.onload = function () {
  var width = image.width;
  var height = image.height;

  if ((width > maxWidth) || (height > maxHeight)) {
   var newWidth;
   var newHeight;

   if (width > height) {
    newHeight = height * (maxWidth / width);
    newWidth = maxWidth;
   } else {
    newWidth = width * (maxHeight / height);
    newHeight = maxHeight;
   }

   var canvas = document.createElement('canvas');

   canvas.width = newWidth;
   canvas.height = newHeight;

   var context = canvas.getContext('2d');

   context.drawImage(this, 0, 0, newWidth, newHeight);

   dataURL = canvas.toDataURL(fileType);
  }

  // create icon images
  var newIconWidth;
  var newIconHeight;

  if ((width > maxIconWidth) || (height > maxIconHeight)) {
   if (width > height) {
    newIconHeight = height * (maxIconWidth / width);
    newIconWidth = maxIconWidth;
   } else {
    newIconWidth = width * (maxIconHeight / height);
    newIconHeight = maxIconHeight;
   }
  } else {
   newIconHeight = height;
   newIconWidth = width;
  }

  var canvas2 = document.createElement('canvas');
  canvas2.id = 'ImgIcon'+index;

  canvas2.width = newIconWidth;
  canvas2.height = newIconHeight;

  var context2 = canvas2.getContext('2d');

  context2.drawImage(this, 0, 0, newIconWidth, newIconHeight);

  // push dataURL to attachments
  var attachments = $("#upload-image").val();

  if(attachments=="") {
   attachments = [dataURL];
  } else {
   attachments = JSON.parse(attachments);
   attachments.push(dataURL);
  }

  attachments = JSON.stringify(attachments);

  $("#upload-image").val(attachments);

  // add icon image to preview image box
  $("#preview-image").append('<div class="canvas-box" data-id="'+index+'" style="width:'+newIconWidth+'px;height:'+newIconHeight+'px"></div>');
  $('.canvas-box[data-id='+index+']').append(canvas2);
  $('.canvas-box[data-id='+index+']').append('<span class="text-red delete-canvas" data-id="'+index+'" data-content="'+dataURL+'" style="position:absolute;top:4px;right:6px;z-index:99"><img src="icons/close.png" /></span>');
 };

 image.onerror = function () {
  alert("Oops! An error has occurred");
 };
}

file upload.php
$time = date('YmdHis');
$return = array();

function saveFromBase64($imageData,$newImage) {
 $imageData = explode('base64,', $imageData);
 $imageBase64 = $imageData[1];
 $imageString = base64_decode($imageBase64);
 $img = imagecreatefromstring($imageString);

 if($img !== false) {
  $path_parts = pathinfo($newImage);
  $extension = strtolower($path_parts['extension']);

  if($extension=='jpg' || $extension=='jpeg') {
   $save = imagejpeg($img, $newImage);
  } elseif($extension=='png') {
   $save = imagepng($img, $newImage);
  } else {
   $save = false;
  }

  imagedestroy($img);

  if($save) {
   return true;
  } else {
   return false;
  }
 } else {
  return false;
 }
}

if(isset($_POST['imgs']) && $_POST['imgs']!="") {
 $imgs = json_decode($_POST['imgs']);

 $count = 0;
 $success = 0;
 $failed = 0;

 $n = 0;

 foreach ($imgs as $img) {
  $n++;

  $filename = "images/img-$time-$n.png";
  $saved = saveFromBase64($img,$filename);

  if($saved) {
   $success++;
  } else {
   $failed++;
  }
 }

 $count = $n;

 if($count==$failed) {
  $return['status'] = 0;
  $return['message'] = "Oops! An error has occurred. No photos uploaded";
 } elseif($count==$success) {
  $return['status'] = 1;
  $return['message'] = "Yes! All photos uploaded";
 } else {
  $return['status'] = 2;
  $return['message'] = "$success of $count photos uploaded";
 }
} else {
 $return['status'] = 0;
 $return['message'] = "Invalid request";
}

echo json_encode($return);

Mula-mula, foto-foto yang akan diunggah, dicek dulu dimensinya. Dalam hal ini kita buat dimensi maksimal foto yang akan diunggah misalnya adalah width=800px dan height=800px. Artinya, jika dimensi foto melebihi ukuran tersebut, maka foto akan dikecilkan terlebih dahulu menggunakan canvas HTML5. Foto-foto tersebut lalu dikonversi menjadi data url yang akan dikirimkan ke server. Dan untuk memudahkan pengguna, sebelum foto-foto tersebut dikirim, kita buatkan preview-nya dalam ukuran-ukuran yang lebih kecil, misal width & height 150px menggunakan canvas HTML5. Di sini pengguna dapat menghapus juga foto-foto yang keliru dipilih. Setelah diterima di server, data url foto kemudian dikembalikan menjadi file image untuk disimpan.

Demikian, mudah-mudahan bermanfaat. Jika Anda membutuhkan source code-nya, silahkan klik di sini untuk mengunduhnya.





Kamis, Mei 25, 2017

API Data Wilayah Administratif di Indonesia

Sebagai pengembang aplikasi, adakalanya kita memerlukan data nama seluruh wilayah administratif yang ada di Indonesia, yang biasanya untuk mempermudah input data alamat.

Jika kita googling, maka sebenarnya telah banyak tersedia source untuk itu, terutama yang disediakan oleh lembaga formal/pemerintah seperti BPS, Kemendagri dan Kemendikbud. Namun demikian, kebanyakan source yang disediakan berupa 'data mentah' dalam bentuk pdf ataupun langsung ditampilkan di websitenya yang perlu pengolahan lagi untuk dapat kita pergunakan yang kadang cukup ribed. Meski ada juga yang menyediakannya dalam bentuk API, salah satunya Kemendikbud tersebut. Nah, melalui postingan ini, saya ingin berbagi tentang API Data Wilayah Administratif di Indonesia yang disediakan oleh Kemendikbud.


Awalnya saya mendapatkan informasi tentang data Kemedikbud tersebut dari portal Satu Data Indonesia (tentu, setelah sebelumnya bertanya-tanya ke mbah Google juga, hehehe).

API yang disediakan, bagi saya, cukup sederhana dan mudah digunakan, yaitu cukup dengan mengakses url http://jendela.data.kemdikbud.go.id/api/index.php/CWilayah/wilayahGET?mst_kode_wilayah=xxxxxx, di mana xxxxxx adalah kode wilayah master untuk mendapatkan data wilayahnya. Misalnya dengan xxxxxx sebagai kode wilayah suatu propinsi, maka kita akan mendapatkan daftar kabupaten/kota yang ada di propinsi tersebut. Demikian seterusnya, sampai dengan daftar desa/kelurahan yang ada di suatu kecamatan. Adapun kode wilayah pokoknya adalah 000000 yang akan menampilkan daftar propinsi yang ada di Indonesia.

Dengan pola seperti itu, sangat memungkinkan untuk kita menggunakannya di website ataupun aplikasi kita secara online, tanpa kita perlu mengunduh/memiliki databasenya sendiri. keuntungan lainnya, data yang kita tampilkan akan selalu mutakhir mengikuti perkembangan update data yang ada di situs Kemendikbud.

Berikut adalah contoh bagaimana menampilkan data wilayah tersebut di website kita dengan bantuan cURL dan jQuery.

Pertama, kita siapkan dua file: form.php dan update.php. File yang pertama kita gunakan untuk menampilkan form yang memuat data wilayah, sedangkan file yang kedua kita gunakan untuk mengolah data wilayah yang dibutuhkan.

Alurnya adalah, mula-mula data propinsi kita tampilkan saat halaman form.php dimuat, sementara data kabupaten/kota, kecamatan dan desa/kelurahan kita biarkan kosong. Selanjutnya, saat kita memilih atau mengganti data propinsi, maka data kabupaten/kota akan ditampilkan. Begitu seterusnya. Untuk menampilkan datanya, menggunakan method post() pada jQuery, form.php mengirimkan request ke  update.php yang selanjutnya akan diteruskan ke situs Kemendikbud. Data yang diterima oleh update.php akan diteruskan kembali ke form.php untuk ditampilkan.

Sebelum kita melanjutkan, kita perlu mengetahui juga model data yang akan kita terima dari situs Kemendikbud. Karena beda model data, beda pula penanganannya.



Ya, data yang akan kita diterima dari situs Kemendikbud adalah berupa JSON dengan hirarki seperti pada gambar di atas. Seperti terlihat, masing-masing data terdiri dari: kode_wilayah, nama dan mst_kode_wilayah.

Baiklah, sekarang kita lanjutkan dengan membuat script untuk halaman form.php dan update.php.

Silahkan copy terlebih dahulu script di bawah ini untuk kita gunakan/paste pada file form.php.

<!doctype html>
<html>
<head>
 <title>Data Wilayah Indonesia</title>
 <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
 <script type="text/javascript">
  $(document).ready(function(){
   updateData('pokok', '000000');

   $(".data-wilayah select").change(function(){
    var id_wilayah = $(this).attr('id');
    var kode_wilayah = $(this).val();

    if(id_wilayah!='kelurahan') {
     updateData(id_wilayah, kode_wilayah);
    }    
   })
  });

  function updateData(id_wilayah, kode_wilayah) {
   if(id_wilayah=='pokok') {
    $("#propinsi").empty().prepend('<option value="">-- Pilih Nama Propinsi --</option>');
   }

   if(id_wilayah=='pokok' || id_wilayah=='propinsi') {
    $("#kota").empty().prepend('<option value="">-- Pilih Nama Kabupaten/Kota --</option>');
   }

   if(id_wilayah=='pokok' || id_wilayah=='propinsi' || id_wilayah=='kota') {
    $("#kecamatan").empty().prepend('<option value="">-- Pilih Nama Kecamatan --</option>');
   }

   if(id_wilayah=='pokok' || id_wilayah=='propinsi' || id_wilayah=='kota' || id_wilayah=='kecamatan') {
    $("#kelurahan").empty().prepend('<option value="">-- Pilih Nama Desa/Kelurahan --</option>');
   }

   if(kode_wilayah!="") {
    $.post('update.php',{
     update: kode_wilayah
    }, function(data) {
     var data = jQuery.parseJSON(data);

     if(data.status==1) {
      var obj = '#propinsi';
      var content = '';

      if(id_wilayah=='propinsi') {
       obj = '#kota';
      } else if(id_wilayah=='kota') {
       obj = '#kecamatan';
      } else if(id_wilayah=='kecamatan') {
       obj = '#kelurahan';
      }

      $.each(data.content.data, function(i,d) {
       content += '<option value="'+d.kode_wilayah+'">'+d.nama+'</option>';
      });

      $(obj).append(content);
     }
    });
   }
  }
 </script>
</head>
<body>
 <h3>Data Wilayah Indonesia</h3>
 <form id="territory">
  <p class="data-wilayah"><label for="propinsi">Propinsi</label> <select id="propinsi">
   <option value="">-- Pilih Nama Propinsi --</option>
  </select></p>
  <p class="data-wilayah"><label for="kota">Kabupaten/Kota</label> <select id="kota">
   <option value="">-- Pilih Nama Kabupaten/Kota --</option>
  </select></p>
  <p class="data-wilayah"><label for="kecamatan">Kecamatan</label> <select id="kecamatan">
   <option value="">-- Pilih Nama Kecamatan --</option>
  </select></p>
  <p class="data-wilayah"><label for="kelurahan">Desa/Kelurahan</label> <select id="kelurahan">
   <option value="">-- Pilih Nama Desa/Kelurahan --</option>
  </select></p>
 </form>
</body> 
</html>

Selanjutnya, silahkan copy script di bawah untuk file update.php.

<?php

$return = array();
$return['status'] = 0;
$return['content'] = "";

function clearJSON($json_data) {
 if (0 === strpos(bin2hex($json_data), 'efbbbf')) {
       return substr($json_data, 3);
    } else {
     return $json_data;
    }
}

if(isset($_POST['update']) && trim($_POST['update'])!='') {
 $mst_kode_wilayah = trim($_POST['update']);
 $url = "http://jendela.data.kemdikbud.go.id/api/index.php/CWilayah/wilayahGET?mst_kode_wilayah=$mst_kode_wilayah";

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

 if(curl_exec($ch) === false) {
  $output = '{"data":[]}';
 } else {
  $output = curl_exec($ch);
 }

 curl_close($ch);

 $json_data = clearJSON($output);
 $output = json_decode($json_data, true);

 if(count($output['data']) > 0) {
  $return['status'] = 1;
  $return['content'] = $output;
 }
}

echo json_encode($return);

?>

Pada form.php, kita gunakan function updateData() untuk menampilkan data wilayah. function ini dijalankan saat halaman dibuka untuk menampilkan data propinsi, dan akan dijalankan setiap kali ada perubahan data propinsi, kabupaten/kota maupun kecamatan untuk menampilkan data wilayah di bawahnya.

Sedangkan pada update.php, ketika ada request yang diterima dari form.php, menggunakan cURL, data yang di-request kemudian diambil dari website Kemendikbud. Jika data tersedia, data akan diteruskan kembali ke form.php dalam bentuk JSON. Begitupun jika datanya tidak tersedia, atau ada kendala saat mengambil data, tetap akan diinformasikan ke form.php.

Pada update.php, kita membuat function clearJSON() untuk memfilter/menangani karakter BOM yang (seringkali) 'menyusup' di awal teks data yang kita dapatkan. Dan kebetulan, pada data wilayah yang didapat dari website Kemendikbud, karakter tersebut muncul :).

Btw, jika Anda mengalami kendala dalam meng-copy script di atas, Anda bisa mengunduhnya di sini.

Mengunduh Data


Nah, bagaimana jika kita ingin mengambil datanya secara keseluruhan untuk kita masukkan ke database kita sendiri? Karena memang, untuk beberapa hal, ada kalanya menampilkan data dari database sendiri adalah lebih baik ataupun merupakan satu-satunya pilihan. Misalnya karena aplikasi yang kita kembangkan sifatnya offline.

Ya, meninjau pada API yang disediakan, maka kita memang harus mengambilnya satu demi satu, mulai dari data pokok (propinsi) sampai dengan data desa/kelurahan. Ribed, dong? Tergantung :). Jika kita hanya menggunakan metode 'apa adanya' sebagaimana yang disediakan, iya. Tapi jika sebagai pengembang kita mau sedikit jeli, sebenarnya kita bisa membuat/menggunakan metode atau fungsi rekursif untuk menanganinya.


Video di atas adalah capture proses download data full yang langsung saya inject ke database dan juga saya buat sebagai file csv. Insya Allah nanti saya update tulisan ini berkaitan dengan proses download data. Namun jika saat ini Anda memerlukannya, silahkan klik di sini untuk mengunduhnya.

Salam!

Sabtu, Mei 09, 2015

Cara Mengambil Angka dari Sebuah String pada PHP & MySQL

Baik pada PHP maupun MySQL, telah disediakan function untuk mengambil atau mengekstrak angka dari sebuah string. Pada PHP, antara lain kita bisa menggunakan function intval() dan floatval(), sementara pada MySQL kita bisa menggunakan function convert(). Contoh penggunaannya yaitu:
// PHP
$teks1 = "12 buah";
$angka1 = intval($teks1); // hasilnya 12
$teks2 = "2.5%";
$angka2 = floatval($teks2); // hasilnya 2.5

// MySQL
SELECT CONVERT('24 ons', SIGNED); # hasilnya 24
Namun demikian, baik function intval() dan floatval() pada PHP maupun convert() pada MySQL, hanya dapat diterapkan jika posisi angka berada di bagian awal string. Jika posisi angka tidak berada di awal string, akan menghasilkan 0. Contoh:
// PHP
$teks3 = "pukul 14";
$angka3 = intval($teks3); // hasilnya 0
$teks4 = "km 2.3";
$angka4 = floatval($teks4); // hasilnya 0

// MySQL
SELECT CONVERT('F12', SIGNED); # hasilnya 0
Toh, untuk kasus yang sederhana, yaitu di mana komposisi string sudah kita ketahui, misalnya bagian yang bukan angka hanya "Rp ", atau angka selalu dimulai pada urutan ke-4 pada string, kita masih bisa mengakalinya, yaitu dengan cara membuang bagian yang bukan angka dengan menggunakan function str_replace() atau substr_replace() pada PHP atau function replace() pada MySQL, yang seringkali juga dipadukan dengan fungsi trim(), ltrim() ataupun rtrim(). Misalnya:
// PHP

// mengambil angka pada string uang yang disertai dengan "Rp"

$teks5 = "Rp 3500";
$angka5 = str_replace("Rp","",$teks5); // hasilnya " 3500"
$angka5 = ltrim($angka5); // sekarang menjadi "3500"

$teks6 = "12750 Rp";
$angka6 = rtrim(str_replace("Rp","",$teks6)); // hasilnya "12750"

// mengambil angka pada string alphanumeric yang berada di bagian tengah diapit masing-masing 2 huruf
$teks7 = "ab1123cd";
$angka7 = substr_replace(substr_replace($teks7,"",0,2),"",-2); // hasilnya 1123
$teks8 = "fc101074ae";
$angka8 = substr_replace(substr_replace($teks8,"",0,2),"",-2); // hasilnya 101074

// MySQL
SELECT TRIM(REPLACE('nomor 28', 'nomor', '')); # hasilnya 28
Selain function-function di atas, masih terdapat pula beberapa function lain yang bisa digunakan untuk mengekstrak angka dari sebuah string seperti substr() dan substring() pada PHP ataupun substring() dan substring_index() pada MySQL. Namun, semua function tersebut hanya berlaku jika kita telah mengetahui komposisi stringnya. Lalu, bagaimana halnya jika kita tidak dapat memastikan komposisi stringnya? Misalnya huruf apa sajakah yang menyertai angka pada string tersebut, atau apakah angkanya berurutan atau tidak, atau apakah selain huruf ada karakter-karakter lainnya yang menyertai angka pada string atau tidak.
Pada PHP, untuk string yang acak, kita bisa menggunakan bantuan regular expresion untuk membuat rumusan yang bisa berlaku umum untuk mengekstrak angka dari sebuah string. Misalnya kita ingin mengambil angka dari string 'rumah nomor 35 di jalan merdeka' dan 'ab72dw5d659s3', kita bisa melakukannya dengan menggunakan function preg_replace(), yaitu:
// PHP

$pattern = '/([^0-9]+)/';

$teks1 = 'rumah nomor 35 di jalan merdeka';
$angka1 = preg_replace($pattern,'',$teks1); // hasilnya 35

$teks2 = 'ab72dw5d659s3';
$angka2 = preg_replace($pattern,'',$teks2); // hasilnya 7256593
Sayangnya, pada MySQL, meski tersedia pula function regular expresion untuk string, namun itu hanya berfungsi untuk pencarian saja, yaitu regexp. Karenanya, kita mesti menentukan atau membuat sendiri function yang akan kita gunakan untuk mengekstrak angka dari sebuah string.
Berikut adalah sebuah function yang bisa digunakan untuk mengekstrak angka dari sebuah string. Function ini saya ambil dari forum yang membahas hal yang sama. Function ini telah saya kembangkan agar bisa dipergunakan pada komposisi string yang lebih kompleks.
DELIMITER //

DROP FUNCTION IF EXISTS GET_NUMBER //

CREATE FUNCTION GET_NUMBER(input VARCHAR(255))
  RETURNS VARCHAR(255)
BEGIN
  DECLARE output   VARCHAR(255) DEFAULT '';
  DECLARE iterator INT          DEFAULT 1;

  WHILE iterator < (LENGTH(input) + 1) DO
    IF SUBSTRING(input, iterator, 1) IN ('.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-') THEN
      SET output = CONCAT(output, SUBSTRING(input, iterator, 1));
    END IF;
    
    SET iterator = iterator + 1;
  END WHILE;

  WHILE (SUBSTRING(output, -1) = '.') OR ((SUBSTRING(output, -1) = '0') AND (SUBSTRING(output, 1, LENGTH(output) - 1) LIKE '%.%')) DO
    SET output = SUBSTRING(output, 1, LENGTH(output) - 1);
  END WHILE;

  WHILE SUBSTRING(output, 1, 1) = '0' DO
    SET output = SUBSTRING(output, 2);
  END WHILE;

  WHILE SUBSTRING(output, 1, 2) = '-0' DO
    SET output = CONCAT('-', SUBSTRING(output, 3));
  END WHILE;

  IF REPLACE(REPLACE(REPLACE(output, '.', ''), '0', ''), '-', '') = '' THEN
    SET output = '';
  ELSEIF (LENGTH(output) - LENGTH(REPLACE(output, '.', ''))) > 1 THEN
    SET output = REPLACE(output, '.', '');
  ELSEIF (((LENGTH(output) - LENGTH(REPLACE(output, '-', ''))) = 1) AND (SUBSTRING(output, 1, 1) <> '-')) OR ((LENGTH(output) - LENGTH(REPLACE(output, '-', ''))) > 1) THEN
    SET output = REPLACE(output, '-', '');
  END IF;

  IF SUBSTRING(output, 1, 1) = '.' THEN
    SET output = CONCAT('0', output);
  ELSEIF SUBSTRING(output, 1, 2) = '-.' THEN
    SET output = CONCAT('-0', SUBSTRING(output, 2));
  ELSEIF output = '' THEN
    SET output = '0';
  END IF;

  RETURN output;
END //

DELIMITER ;

# contoh penggunaan:
SELECT GET_NUMBER('asdf275$$s43::21'); # hasilnya 2754321
SELECT GET_NUMBER('ukuran 17.2 inci'); # hasilnya 17.2
SELECT GET_NUMBER('-def000.15ds00'); # hasilnya -0.15
SELECT GET_NUMBER('.75kg'); # hasilnya 0.75
Demikian, semoga bermanfaat.

Sabtu, Juni 06, 2009

Cek Keabsahan ID YM dan Online tidaknya ID tersebut

Meski chatting kini tidak lagi melulu dilakukan melalui Yahoo! Messenger (YM), namun bisa juga melalui media yang lain seperti Facebook yang sedang ramai belakangan ini, tetap saja YM mempunyai nilai plus. Selain terintegrasi dengan layanan Yahoo! lainnya seperti email, YM juga kini mempunyai versi webnya yang tidak lagi mengharuskan kita menginstal aplikasinya di komputer kita untuk dapat melakukan chatting. Juga, YM dapat terintegrasi dengan layanan-layanan instant messaging semacam eBuddy, dan bisa langsung diakses dari ponsel. Satu lagi, status online dan offline kita dapat kita tampilkan di situs atau blog kita yang tentu hal ini dapat membantu orang lain menghubungi kita, karena selain tampilan status, orang lain juga dapat langsung menghubungi kita dengan mengklik ikon status yang ada, dengan syarat, pada komputer tempat mengakses situs atau blog kita, telah tersedia aplikasi YM.

Untuk memasang ikon tampilan status di web ataupun blog kita, caranya sangat mudah. Cukup copy & paste script berikut di halaman web ataupun blog Anda:

<a href="ymsgr:sendIM?ID_YM_ANDA"><img style="border: 0px" src="http://opi.yahoo.com/online?u=ID_YM_ANDA&m=g&t=2" alt="YM STATUS" /></a>

Setelah Anda tempel script tersebut (jangan lupa ganti kata ID_YM_ANDA dengan ID YM Anda), maka pada tempat tersebut akan muncul gambar di bawah ini. Gambar sebelah kiri adalah tampilan jika status kita sedang online, sedang gambar di sebelah kanan adalah tampilan saat kita sedang offline.




Mengetahui Status ID YM Orang Lain

Nah, sekarang bagaimana, kalau kita yang ingin tahu status ID YM teman kita (tanpa kita harus login ke YM) dan ternyata dia tidak memasang statusnya di web atau blognya (karena memang tidak punya web ataupun blog :D)?

Mudah saja, cukup copy bagian script di atas: http://opi.yahoo.com/online?u=ID_YM_ANDA&m=g&t=2, ganti ID_YM_ANDA dengan ID YM teman kita, lalu paste di kotak address browser kita, enter ... Cling!! Gambar status seperti di atas pun akan muncul.

By the way, namun coba, ID YM yang Anda masukkan sembarang atau keliru, yang mana ID tersebut ternyata tidak atau belum ada yang menggunakan (misal ID teman kita bocah_ganteng tapi kita salah ketik jadi bovah_ganteng), upss.. ternyata gambarnya nongol juga dengan status offline (padahal kalau kita masukkan ID-nya dengan dengan benar, ternyata dia sedang online) dan parahnya, kita tidak sempat mengkoreksi apakah ID yang kita masukkan benar atau salah. What happened??

Setelah coba-coba browsing sana browsing sini, don't worry, ada kok cara atau script untuk mengetahui ID seseorang bener-bener merupakan ID Yahoo! atau cuman rekaan saja. Dan setelah saya kombinasikan dengan script lain, jadilah class php di bawah ini. Output dari class ini adalah memberitahukan apakah ID Yahoo! yang kita masukkan valid atau tidak. Jika valid, maka akan ada tambahan statusnya, online atau offline.

<?php

# this class is used to check validity and online status of a YM ID
# this class in developed base on script at http://www.gsdesign.ro/blog/how-to-check-if-a-yahoo-user-exits-using-php & http://www.rumahweb.com/journal/yahoo-messenger-indikator-bag-2.htm

# developed by usman didi khamdani at usmankhamdani@gmail.com

class YM {

var $ID; // YM ID will be checked

function Status() {
// firstly, check the validity of ID
$check = file_get_contents('https://edit.yahoo.com/reg_json?PartnerName=yahoo_default&AccountID='.$this->ID.'&ApiName=ValidateFields');
if ( strpos($check,'SUCCESS')===false ) { // if ID is valid, then check the status
$open = fopen("http://opi.yahoo.com/online?u=".$this->ID."&m=t","r");

if(!$open) {
die ("<img src=\"http://opi.yahoo.com/online?u=".$id."&m=g&t=2\"/>");
}

while($read = fread($open, 2048)) {
$status .= $read;
}
fclose($open);

if($status == $this->ID." is ONLINE"){ // output if status is online
echo "<b>".$this->ID."</b> is a valid Yahoo! ID and now is <span style=\"color:#0000ff\">online</span>";
} else {
// output if status is offline
echo "<b>".$this->ID."</b> is a valid Yahoo! ID and now is <span style=\"color:#ff0000\">offline</span>";
}
} else {
// output if ID is not valid
echo "<span style=\"color:#ff0000\"><b>".$this->ID."</b> is not a valid Yahoo! ID</span>";
}
}
}

?>

Simpan terlebih dahulu class tersebut dalam sebuah file, misalnya check_ym.class.php. Untuk menggunakannya, kita tinggal memanggil class tersebut, seperti contoh berikut:

<?php include("check_ym.class.php"); ?>

<!DOCTYPE HTML>
<html>
<head>
<title>Check The Validity and Status of a Yahoo! ID</title>
<meta name="keywords" content="ym,yahoo,yahoo messenger,yahoo!,yahoo! messenger,check,status" />
<meta name="description" content="Script to check if someone has a valid Yahoo! ID or not and to check if someone online or not in YM" />
</head>
<body>
<h3>Check The Validity and Status of a Yahoo! ID</h3>
<hr />

<?php

if(isset($_POST['ID'])) {
$YM = new YM();
$YM->ID = $_POST['ID'];
$status = $YM->Status()."<hr />";
} else {
}

if(isset($status)) {
echo $status;
} else {
}

?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<p>Yahoo! ID: <input type="text" name="ID" /> <input type="submit" value="Check" />
</form>
</body>
</html>

Klik di sini untuk download source file-nya.

Senin, Maret 30, 2009

Class untuk Menghitung Waktu Suatu Peristiwa

Banyak jalan menuju Roma. Banyak cara pula yang bisa dilakukan untuk menghitung waktu kejadian suatu peristiwa, seperti berapa lama perjalanan yang telah ditempuh Kang Rohim dari Brebes ke Jakarta menggunakan kereta api kemarin (siapa Kang Rohim?? ;) Just sample..), atau berapa lama seorang karyawan hadir di kantor melakukan pekerjaannya selama satu bulan.

Class PHP di bawah ini hanyalah satu cara yang dapat dimanfaatkan untuk melakukan penghitungan waktu tersebut. Class Count Hour atau Penghitung Jam (CountHour.class.php).

Class Count Hour ini mempunyai fungsi pokok yaitu untuk menghitung lama kejadian suatu peristiwa dan juga menghitung jumlah waktu kejadian beberapa peristiwa. Contoh paling sederhana dari penerapan class ini adalah untuk menghitung absensi karyawan dalam satu minggu atau satu bulan.

class CountHour {

function
check_time($time) { // mengecek input waktu, format waktu harus JJ:MM:DD
$pattern = '^([0-9]{2}):([0-9]{2}):([0-9]{2})$';
if(
ereg($pattern,$time)) {
return
true;
} else {
die(
'Error. Format '.$time.' seharusnya JJ:MM:DD.');
}
}

function
check_time2($time) {
// mengecek input waktu, format waktu harus J:M:D
$pattern = '^([0-9]{1,100}):([0-9]{1,2}):([0-9]{1,2})$';
if(
ereg($pattern,$time)) {
return
true;
} else {
die(
'
Error. Format '.$time.' seharusnya J:M:D.');
}
}

function
seconds($time) { // merubah satuan waktu menjadi detik
$this->check_time($time);

$time = explode(':',$time);
$hour = $time[0]*3600;
$minute = $time[1]*60;
$second = $time[2];

$seconds = $hour+$minute+$second;
return
$seconds;
}

function
std($time) { // merubah waktu dengan satuan detik ke format JJ:MM:DD
if($time<0) {
return
'tidak terdefinisikan';
} elseif(
$time<3600) {
$hour = 0;
$hourr = $time;
} else {
$hour = $time/3600;
$hour = floor($hour);
$hourr = $time%3600;
}
if(
$hourr<60) {
$minute = 0;
$second = $hourr;
} else {
$minute = $hourr/60;
$minute = floor($minute);
$second = $hourr%60;
}

if(
strlen($hour)==1) {
$hour = '0'.$hour;
} else {
$hour = $hour;
}
if(
strlen($minute)==1) {
$minute = '0'.$minute;
} else {
$minute = $minute;
}
if(
strlen($second)==1) {
$second = '0'.$second;
} else {
$second = $second;
}

$time = $hour.':'.$minute.':'.$second;
return
$time;
}

function
diff_seconds($first,$last) { // menghitung lama waktu dalam satuan detik
$first1 = $this->seconds($first);
$last1 = $this->seconds($last);
if(
$last1<$first1 || $last1==$first1) {
die(
'error. '.$first.' lebih besar daripada '.$last);
} else {
return
$last1-$first1;
}
}

function
diff($first,$last) { // menghitung lama waktu dan menampilkannya dengan format JJ:MM:DD
$diff = $this->diff_seconds($first,$last);
return
$this->std($diff);
}

function
define_hour($time) { // mendefinisikan jam, menit dan detik
$this->check_time2($time);

$time_array = explode(':',$time);
$hourr = $time_array[0];
$minutee = $time_array[1];
$secondd = $time_array[2];

if(
$hourr==0) {
$hourr = '';
} elseif(
$hourr<10) {
$hourr = str_replace('0','',$hourr).' jam ';
} else {
$hourr = $hourr.' jam ';
}
if(
$minutee==0) {
$minutee = '';
} elseif(
$minutee<10) {
$minutee = str_replace('0','',$minutee).' menit ';
} else {
$minutee = $minutee.' menit ';
}
if(
$secondd==0) {
$secondd = '';
} elseif(
$secondd<10) {
$secondd = str_replace('0','',$secondd).' detik';
} else {
$secondd = $secondd.' detik';
}

return
trim($hourr.$minutee.$secondd);
}
}

Contoh penggunaan (1):

include('CountHour.class.php');
$time = new CountHour();

$first = '12:57:23';
$last = '21:09:04';
$time_difference = $time->diff($first,$last);
$time_difference2 = $time->define_hour($time_difference);

echo 'Waktu Mulai = '.$first.' Selesai =
'.$last.' Lama kejadian = '.$time_difference.' ('.$time_difference2.')';

Contoh penggunaan (2):

// menghitung absensi selama satu minggu

include('CountHour.class.php');
$time = new CountHour();

$day[0] = '08:00:27,17:05:23'; // variabel jam masuk dan pulang hari ke-1
$day[1] = '07:50:25,17:12:12'; // variabel jam masuk dan pulang hari ke-2
$day[2] = '07:55:34,17:05:00'; // variabel jam masuk dan pulang hari ke-3
$day[3] = '08:01:22,17:03:54'; // variabel jam masuk dan pulang hari ke-4
$day[4] = '08:03:14,17:02:28'; // variabel jam masuk dan pulang hari ke-5
$day[5] = '07:59:07,17:11:11'; // variabel jam masuk dan pulang hari ke-6
$day[6] = '08:10:43,16:01:20'; // variabel jam masuk dan pulang hari ke-7

// jam istirahat
$rest_time = '01:00:00'; // lama waktu istirahat, dalam hal ini 1 jam
$rest_time1 = $time->seconds($rest_time); // konversi jam istirahat ke satuan detik

// mendefinisikan jam, menit, detik
$restt = $time->define_hour($rest_time);

// menghitung jumlah hari kerja
$count_day = count($day);

for($i=0;$i<$count_day;$i++) {
// mengambil waktu absen masuk dan absen pulang
$hour[$i] = explode(',',$day[$i]);

// menghitung lama jam kerja
$diff_seconds[$i] = $time->diff_seconds($hour[$i][0],$hour[$i][1])-$rest_time1;
$diff[$i] = $time->std($diff_seconds[$i]);

$j = $i+1;
echo 'Hari ke-'.$j.'. Masuk = '.$hour[$i][0].' Pulang = '.$hour[$i][1].' Jam kerja = '.$diff[$i].' ';
}

// menghitung total jam kerja
$total_seconds = array_sum($diff_seconds);
$total = $time->std($total_seconds);
$totall = $time->define_hour($total);

echo 'Total jam kerja = '.$total.' ('.$totall.') => Jam kerja = jumlah jam di antara absen datang dan pulang dikurangi jam istirahat ('.$restt.')';

Silahkan klik di sini untuk mendownload Class Count Hour di atas.