PHP Direct Printing Printer Dot Matrix (LX-300)

Tidak diragukan lagi, direct printing masih menjadi andalan untuk urusan cetak-mencetak, terutama untuk program/aplikasi POS. Karena aplikasi ini membutuhkan kecepatan dalam melakukan cetak dokumen/struk.

Barusan ngoprek dan eksperimen dengan VB.Net untuk cetak langsung ke printer dot matrix tanpa spooling. Dan ternyata caranya hanya dengan meng-copy file temporary ke path printer (yang sudah disharing).

Bermodalkan teknik tersebut, saya coba terapkan di PHP dengan teknik yang sama dan berhasil.

Mudah-mudahan bermanfaat bagi teman-teman disini.


<?php
$tmpdir = sys_get_temp_dir();   # ambil direktori temporary untuk simpan file.
$file =  tempnam($tmpdir, 'ctk');  # nama file temporary yang akan dicetak
$handle = fopen($file, 'w');
$condensed = Chr(27) . Chr(33) . Chr(4);
$bold1 = Chr(27) . Chr(69);
$bold0 = Chr(27) . Chr(70);
$initialized = chr(27).chr(64);
$condensed1 = chr(15);
$condensed0 = chr(18);
$Data  = $initialized;
$Data .= $condensed1;
$Data .= "==========================\n";
$Data .= "|     ".$bold1."OFIDZ MAJEZTY".$bold0."      |\n";
$Data .= "==========================\n";
$Data .= "Ofidz Majezty is here\n";
$Data .= "We Love PHP Indonesia\n";
$Data .= "We Love PHP Indonesia\n";
$Data .= "We Love PHP Indonesia\n";
$Data .= "We Love PHP Indonesia\n";
$Data .= "We Love PHP Indonesia\n";
$Data .= "--------------------------\n";
fwrite($handle, $Data);
fclose($handle);
copy($file, "//localhost/xprinter");  # Lakukan cetak
unlink($file);
?>

Jangan lupa Printer yang akan digunakan untuk men-cetak di sharing terlebih dahulu. Ganti ‘localhost’ menjadi IP komputer dimana printer yang tadi disharing berada. “xprinter” adalah nama sharing printer.
Saya belum mencoba di jaringan LAN, baru dioba di localhost.
Untuk Escape Code akan saya posting dikemudian hari.

PHP MySQL Compare/Benchmark, PDO vs Mysql vs Mysqli OOP vs Mysqli Procedural

Saat ini saya akan develop aplikasi yang mature dan dapat diandalkan, sehingga saya mencari tahu cara yang terbaik untuk melakukan koneksi dan query terhadap Database Mysql. Saat ini yang tersedia (bawaan) dari PHP ada 3, yaitu koneksi mysql biasa (biasa disebut Raw Mysql, contoh mysql_connect()), PDO (PHP Data Object) dan Mysqli (OOP dan Procedural). Disamping ketiganya masih banyak lagi aplikasi 3rd party yang dapat digunakan untuk melakukan koneksi ke database Mysql seperti Doctrine (ORM) dkk.

Setelah mencari tahu di internet, kebanyakan dari hasil Benchmark Raw Mysql yang menang. Sehingga saya juga tertarik untuk melakukan perbandingan mana yang paling cepat. Cara yang saya gunakan disini adalah, PHP melakukan koneksi dan query menggunakan looping tanpa menampilkan data hasil query ke halaman website. Mungkin kedepannya saya juga akan melakukan komparasi dengan cara lain, yaitu berapa waktu yg dibutuhkan untuk melakukan query pada data yang besar.

Oke langsung saja saya jabarkan scriptnya disini.

Listing Code mysql_compare.php

<?
/* File name : mysql_compare.php
 * Author : ofidz
 * Email : offiedz@majezty
 * Web : mocopat.wordpress.com
 */
?>
<html>
 <style>
 input {
 font-family: courier;
 text-align: right;
 }
 </style>
 <body style="font-family: courier;">

<table>
 <tr><td align="right">Running time : </td><td><input id="running" value='0' size="10"></td><td align="center">detik</td><td align="center">qry/dtk</td></tr>
 <tr style="background-color: bisque;"><td align="right">PDO Process : </td><td><input id="pdo" value='0' size="10"></td><td><input id="pdt"></td><td><input id="avgpdo" value='0' size="7"></td></tr>
 <tr style="background-color:lightcyan ;"><td align="right">Raw Process : </td><td><input id="raw" value='0' size="10"></td><td><input id="rdt"></td><td><input id="avgraw" value='0' size="7"></td></tr>
 <tr style='background-color: lightgreen;'><td align="right">Mysqli OOP Process : </td><td><input id="sqli" value='0' size="10"></td><td><input id="sqlit"></td><td><input id="avgsqli" value='0' size="7"></td></tr>
 <tr style='background-color: lavender;'><td align="right">Mysqli Proc Process : </td><td><input id="sqlip" value='0' size="10"></td><td><input id="sqlipt"></td><td><input id="avgsqlip" value='0' size="7"></td></tr>
 </table>
 <script>
 var milisec = 0
 var seconds = 0
 document.getElementById('running').value='0'
 function display(){
 if (milisec >= 9){
 milisec = 0
 seconds += 1
 }
 else
 milisec += 1
 document.getElementById('running').value=seconds+"."+milisec+" detik"
 t = setTimeout("display()",100)
 }
 display()
 </script>
 <?
 set_time_limit(3600);
 $data = 1000;
 $server = "localhost";
 $user = "root";
 $pass = "";
 $db = "nwind";
 $sql = "SELECT * FROM order_details ";
 # Function

function xtime($start) {
 return microtime(true) - $start;
 }

# Begin Test PDO

function pdo_test($server, $db, $user, $pass, $data, $sql) {

$start = microtime(true);
 for ($i = 1; $i <= $data; ++$i) {

try {
 $conn = new PDO("mysql:host=$server;dbname=$db", $user, $pass);
 } catch (PDOException $e) {
 echo 'Connection failed: ' . $e->getMessage() . "\n";
 }

$conn->query($sql);
 echo "<script>document.getElementById('pdo').value='$i/$data';</script>";
 echo "<script>document.getElementById('pdt').value='" . xtime($start) . "';</script>";
 echo "<script>document.getElementById('avgpdo').value='" . number_format($i / xtime($start), 2, ',', '') . "';</script>";
 $conn = null;
 }
 echo "<tr style='background: bisque;'><td align='right'>PDO time : </td><td>" . xtime($start) . "</td></tr>";
 echo "<br/>";
 }

# Begin mysql_* Test

function mysql_test($server, $db, $user, $pass, $data, $sql) {
 $start = microtime(true);

for ($i = 1; $i <= $data; ++$i) {
 $conn = mysql_connect($server, $user, $pass);
 mysql_select_db($db);
 mysql_query($sql);
 echo "<script>document.getElementById('raw').value='$i/$data';</script>";
 echo "<script>document.getElementById('rdt').value='" . xtime($start) . "';</script>";
 echo "<script>document.getElementById('avgraw').value='" . number_format($i / xtime($start), 2, ',', '') . "';</script>";
 mysql_close($conn);
 }

echo "<tr style='background-color:lightcyan ;'><td align='right'>Raw time : </td><td>" . xtime($start) . "</td></tr>";
 }

# Mysqli OOP test

function mysqli_oop_test($server, $db, $user, $pass, $data, $sql) {
 $start = microtime(true);
 for ($i = 1; $i <= $data; ++$i) {
 $mysqli = new mysqli($server, $user, $pass, $db);
 $mysqli->query($sql);
 echo "<script>document.getElementById('sqli').value='$i/$data';</script>";
 echo "<script>document.getElementById('sqlit').value='" . xtime($start) . "';</script>";
 echo "<script>document.getElementById('avgsqli').value='" . number_format($i / xtime($start), 2, ',', '') . "';</script>";
 $mysqli->close();
 }
 echo "<tr style='background: lightgreen;'><td align='right'>Mysqli OOP time : </td><td>" . xtime($start) . "</td></tr>";
 }

# Mysqli Procedural Test

function mysqli_proc_test($server, $db, $user, $pass, $data, $sql) {
 $start = microtime(true);
 for ($i = 1; $i <= $data; ++$i) {
 $mysqli = mysqli_connect($server, $user, $pass, $db);
 mysqli_query($mysqli, $sql);
 echo "<script>document.getElementById('sqlip').value='$i/$data';</script>";
 echo "<script>document.getElementById('sqlipt').value='" . xtime($start) . "';</script>";
 echo "<script>document.getElementById('avgsqlip').value='" . number_format($i / xtime($start), 2, ',', '') . "';</script>";
 mysqli_close($mysqli);
 }
 echo "<tr style='background: lavender;'><td align='right'>Mysqli Proc time : </td><td>" . xtime($start) . "</td></tr>";
 }

 # Jumlah baris data
 function jml_row($server,$user,$pass,$db,$sql){
 $conn = mysql_connect($server,$user,$pass);
 mysql_selectdb($db);
 $xSql = mysql_query($sql);
 return mysql_num_rows($xSql);
 mysql_close($conn);
 }
 ?>
 <table>
 <tr><td align='right'><b>Result :</b></td><td><?= $data . " x ". jml_row($server, $user, $pass, $db, $sql)." row(s) execution"; ?></td></tr>
 <?
 pdo_test($server, $db, $user, $pass, $data, $sql);
 mysql_test($server, $db, $user, $pass, $data, $sql);
 mysqli_oop_test($server, $db, $user, $pass, $data, $sql);
 mysqli_proc_test($server, $db, $user, $pass, $data, $sql);
 ?>
 </table>
 <script>
 clearTimeout(t);
 </script>
 </body>
</html>

Pada script diatas, masing-masing driver menggunakan function, supaya kita lebih mudah dalam menempatkan driver yang lebih dulu akan dijalankan. Jumlah query yang akan dijalankan juga dapat disetting dengan mengganti nilai pada variabel $data. Berikut contoh hasil benchmark yang saya lakukan.

Software dan Hardware yang saya gunakan pada saat benchmark.

  • OS : Windows 7
  • Laptop Acer 4752G
  • Prosesor : Intel Core i3-2330
  • RAM : Kingston 2GB
  • Hardisk : Seagate 500GB
  • VGA NVIDIA GeForce GT 520M 1GB
  • Browser : Chrome 17
  • MySQL :  5.0.8
  • PHP : 5.3.8

Jika anda pernah melakukan benchmark juga, silahkan share disini. Saya juga minta pendapat anda mengenai script yang saya pakai untuk benchmark, mungkin kurang fair atau bagaimana, silahkan diluruskan jika kurang fair. Terima kasih.

Membuat Mirror Update ESET NOD32 Versi 4 di Linux (Shell/Bash)

Kedengarannya agak nyeleneh memang. Membuat mirror update Antivirus di Linux, tapi yang menggunakan update tersebut Komputer Windows (Walaupun ada juga ESET untuk Linux). Tapi memang begitulah, kadang kita membutuhkan bantuan Linux untuk membantu Windows. Pada tutorial kali ini saya akan memasang script di Webhosting. Sehingga nantinya bisa diakses oleh siapa saja. Sejauh ini saya baru menemukan 3 buah bahasa pemrograman untuk membuat update mirror ESET NOD32, yaitu : shell/bash, PHP dan Ruby. Sebenarnya kita bisa menggunakan Bahasa pemrograman apa saja untuk membuat mirror ini. Ketiga script bahasa pemrograman tersebut nantinya akan saya bahas semua nya, tapi untuk pemanasan, saya akan membahas yang menggunakan Shell terlebih dahulu.

Adapun Kelebihan dan kekurangan script ini dibandingkan dengan script PHP & Ruby adalah.

Kelebihan :

  • Langsung bisa dijalankan, hanya tinggal setting Crontab.
  • Ringan dan lebih cepat dibanding PHP dan Ruby (menurut saya ini lho), Karena trik download menggunakan WGET.
  • Hampir bisa dijalankan di semua Webhosting yang menggunakan OS Linux.
Kekurangan :
  • Belum bisa terintegrasi dengan database. (Mudah-mudahan di versi berikutnya bisa terintegrasi dengan Database, supaya mudah dalam perubahan Username dan Password).
  • Belum support notifikasi lewat Email & SMS jika update berhasil atau gagal. (Mudah-mudahan di versi berikutnya fitur ini sudah didukung, karena yang versi PHP sudah saya tambahkan kedua fitur ini).
  • Hanya jalan di Linux (Lha wong judulnya juga bikin di Linux :D ). Tapi versi PHP dan Ruby bisa jalan di Windows.
  • Belum bisa cek Expired Date Username. (di versi PHP sudah saya tambahkan fitur ini).
Okey, sekarang hal-hal yang perlu disiapkan atau dibutuhkan.
  • Langganan Webhosting dengan Bandwidth Unlimited dan OS Linux (tentunya) atau bisa di coba di PC Linux.
  • Jika dipasang di Webhosting, Free Space di Webhosting minimal 200MB (Karena kita akan Download semua module update dan semua versi termasuk Business Edition 32 & 64 bit, Smart Security 32 & 64 bit dan support bahasa).
  • Sedikit pengetahuan tentang programming, Linux dan cPanel.
  • Jika menggunakan Webhosting, sebaiknya menggunakan cPanel.
  • Download aplikasi unrar. Nanti akan digunakan untuk melakukan ekstrak file update.ver.
Kita mulai dengan download scriptnya di bagian bawah dan jangan lupa download juga aplikasi unrar, kemudian ekstrak kedu file tersebut. Langkah demi langkah yang saya lakukan untuk memasang script adalah sebagai berikut :
  • Buat direktori baru di /home/nama_user. Beri nama direktori tersebut dengan nama “bin”, sehingga nanti akan muncul direktori
/home/nama_user/bin.
  • Upload file nodupdate.sh dan unrar ke direktori /home/nama_user/bin.
  • Lakukan chmod/permission kepada kedua file tersebut menjadi 755 lewat file manager.
  • Buat direktori baru lagi di /home/nama_user/public_html. Beri nama direktori tersebut dengan nama “nod_upd”, sehingga akan ada direktori baru, yaitu
/home/nama_user/public_html/nod_upd.
  • Buatlah Crontab/Cron Job sesuai dengan kebutuhan anda. (Saya menggunakan interval eksekusi setiap 30 menit). Pada saat debugging, mungkin pada awalnya kita bisa mengeset sesuai keinginan kita.

Cron Job

  • Cek apakah file update sudah terbentuk di :
/home/nama_user/public_html/download

  • Jika masih gagal, cek Log file. Disitu ada keterangan kenapa gagal. Log file ini saya taruh di
/home/nama_user/tmp/nodsh.log.

Jangan lupa ganti yuor_name atau nama_user dengan nama yang digunakan untuk login di cPanel, dengan Hasil dari tutorial ini bisa anda lihat pada website http://smart-ics.com/nod_upd. Anda bisa mencoba untuk melakukan update ESET anda ke link tersebut (mumpung masih saya open :D ).

File-file yang di butuhkan (download) :
   - Bug fixed, Penambahan parameter (-y) pada saat ekstrak.
Script diatas saya peroleh dari forum http://ashus.ashus.net/viewtopic.php?f=16&t=68 dengan beberapa perubahan sesuai dengan kebutuhan saya. Anda juga diperkenankan untuk mengubahnya sendiri sesuai dengan keinginan anda.
Terima kasih banyak saya ucapkan kepada saudara Ashus yang telah memberi banyak inspirasi :D
Follow

Get every new post delivered to your Inbox.

Join 74 other followers