Jumat, 02 November 2012

Serial Com Access

Sejak kemarin coba mencari cara untuk mengakses port serial com dari PHP. Berhasil sih, tetapi untuk membaca data dari port masih tidak sinkron, karena timingnya tidak sesuai dengan sinyal RtS dari hardware. hardware yang sedang coba di akses adalah Magnetic Card Reader/Writer. Lalu kecurigaan muncul, dan beberapa cara pemecahan dijalani, salah satunya dicoba dengan native apps.

Lalu dibuatlah program percobaan sederhana menggunakan FPC 2.6.0 dan beberapa function dari Windows API. Awalnya sama saja dengan ketika melakukan percobaan di PHP, yaitu timing untuk membaca tak bisa sinkron dengan RtS dari device. Diselidiki... dicari... dan terus mencari hingga seharian. Ternyata masalahnya harus menggunakan teknik overlapped reading/writing. Tetapi masih saja belum saja berhasil, selidiki lagi..., selidiki lagi..., selidiki terus...., dan ketemu juga. Overlapped harus menggunakan timeout, kalau tidak maka percuma saja karena ketika reading dari port tidak akan menunggu input masuk.

Hehehe... setelah setting overlapped dan timeout, JRENG.... berhasil deh. Data masuk dan bisa diolah. Di bawah ini adalah sourcenya, atau bisa download di: http://sites.google.com/site/karuniaprojects/documents/magread.pas

Berikutnya coba porting ke PHP, pastinya menggunakan library Windows dan command linux stty. Hmm... tantangan.


uses crt,windows;

const
 bfsize=4096;

var
 comhnd:handle;
 evtwr:toverlapped;
 evtrd:toverlapped;
 tmo:_commtimeouts;
 dcb:_dcb;

procedure comwrite(st:string);
var
 ln:dword;
 written:dword;
begin
 setcommmask(comhnd,ev_rxchar);
 ln:=length(st);
 written:=0;
 writefile(comhnd,st[1],ln,written,@evtwr);
 repeat until getoverlappedresult(comhnd,evtwr,written,true);
end;

function comread:string;
type
 tbuffer=array[0..bfsize-1] of char;
var
 buffer:^tbuffer;
 readed:dword;
 st:string;
begin
 purgecomm(comhnd,purge_rxclear);
 setcommmask(comhnd,ev_rxchar);
 getmem(buffer,bfsize);
 write('data buffer: ');
 writeln(sizeof(buffer^));
 readfile(comhnd,buffer^,bfsize,readed,@evtrd);
 repeat until getoverlappedresult(comhnd,evtrd,readed,true);
 write('data readed: ');
 writeln(readed);
 readln;
 setlength(st,readed);
 move(buffer^,st[1],readed);
 freemem(buffer);
 comread:=st;
end;

procedure init();
begin
 clrscr;
 evtwr.offset:=0;
 evtwr.offsetHigh:=0;
 evtwr.hevent:=createevent(nil,true,false,nil);
 if(evtwr.hevent=0) then begin
  writeln('failed create write event');
  halt;
 end;
 evtrd.offset:=0;
 evtrd.offsetHigh:=0;
 evtrd.hevent:=createevent(nil,true,false,nil);
 if(evtwr.hevent=0) then begin
  writeln('failed create read event');
  closehandle(evtwr.hevent);
  halt;
 end;
 comhnd:=createfile(
  pchar('\\.\COM2'),
  generic_read or generic_write,0,nil,open_
  existing,file_attribute_normal or file_flag_overlapped,0
 );
 setcommmask(comhnd,ev_rxchar);
 setupcomm(comhnd,bfsize,bfsize);
 purgecomm(comhnd,
  purge_txabort or purge_rxabort or purge_txclear or purge_rxclear
 );
 // timeout
 tmo.readintervaltimeout:=300;
 tmo.readtotaltimeoutmultiplier:=1000;
 tmo.readtotaltimeoutconstant:=300;
 tmo.writetotaltimeoutmultiplier:=2;
 tmo.writetotaltimeoutconstant:=0;
 setcommtimeouts(comhnd,@tmo);
 // comm state
 dcb.dcblength:=sizeof(dcb);
 getcommstate(comhnd,@dcb);
 dcb.baudrate:=9600;
 dcb.bytesize:=8;
 dcb.parity:=noparity;
 dcb.stopbits:=1;
 setcommstate(comhnd,@dcb);
 // okeh
 escapecommfunction(comhnd,setdtr);
end;

procedure done();
begin
 comwrite(#27#48);
 setcommmask(comhnd,0);
 escapecommfunction(comhnd,clrdtr);
 purgecomm(comhnd,purge_txabort or purge_rxabort or purge_txclear or purge_rxclear);
 closehandle(comhnd);
 closehandle(evtwr.hevent);
 closehandle(evtrd.hevent);
 exitcode:=0;
end;

procedure run();
begin
 //comwrite(#27#48);
 comwrite(#27#66#84#27#106);
 writeln('read track command sended, hit return!');
 readln;
 writeln('waiting input...');
 writeln(comread);
 readln;
 //comwrite(#27#66#84#27#106);
 //readln;
end;

begin
 init;
 run;
 done;
end.

Selasa, 31 Juli 2012

Simple Language Selector


Ada beberapa cara agar membuat halaman web bisa memberi layanan multi language. Diantaranya adalah dengan: Server side script (PHP, ASP, JSP, dll), Client side script (Javascript), dan CSS. Cara paling mudah adalah dengan menggunakan CSS. Berikut ini adalah contoh scriptnya:

<!DOCTYPE html>
<html>

<head>
<title>Simple Language Selector</title>
<style>
body:lang(id) *:lang(en),body:lang(en) *:lang(id) { display:none; }
</style>
</head>

<body lang="id">

<div>
<a href="#" onclick="document.body.setAttribute('lang','en'); return false;">English</a> | <a href="#" onclick="document.body.setAttribute('lang','id'); return false;">Bahasa</a>
</div>
<h3><span lang="id">Contoh</span><span lang="en">Example</span></h3>
<div><span lang="id">Ini adalah halaman contoh dalam menyediakan fasilitas multi bahasa</span><span lang="en">This is a sample page in supporting of multi-lingual</span>.</div>

</body>

</html>

Download script: http://sites.google.com/site/karuniaprojects/documents/multi-lang.html

Rabu, 11 Juli 2012

The Programmer's Code - 27 Rules to Code By


Daily Disciplines

  1. Be consistent.
  2. Fail fast and hard.
  3. Never write the same code twice.
  4. Be explicit.
  5. Code for the maintainer.
  6. Adapt and adopt.
  7. Simplify, simplify, simplify. Or I just say, simplify.
  8. Minimize scope.


Design Disciplines

  1. Beware the BSOD (Bright Shiny Object of the Day).
  2. Layers, levels, loops and bubbles.
  3. Make decisions at the lowest level possible.
  4. Favor composition over inheritance.
  5. Minimize dependencies.
  6. Names matter.
  7. Don't design the future.
  8. Functional first.
  9. Everything is an API.
  10. Minimize UI code.


Attitudes

  1. Humility happens.
  2. Never say *should*, *impossible* or *it works for me*.
  3. Everything is possible with enough time and money.
  4. Think like a user.
  5. The Missouri Mind (Show Me)


Precepts

  1. Assess often.
  2. If it's not demoed, it's not done.
  3. If it can be forgotten, it will be.
  4. Rules are best broken by those who have mastered them.

Senin, 27 Februari 2012

Hidden Menu (Hover)

Contoh kali ini adalah perbaikan dari contoh yang diposting sebelumnya (http://webkriting.blogspot.com/2012/02/hidden-menu.html). Kali ini ketika menu dihover oleh mouse maka akan langsung memperlihatkan diri. Dan jika link panah diklik maka akan menahan menu untuk terus terlihat. Tidak menggunakan onmouseover, tetapi menggunakan selector pseudo-class :hover.

Download: http://sites.google.com/site/karuniaprojects/documents/hidden-menu-hover.html

Rabu, 22 Februari 2012

Hidden Menu

Eksperimen sederhana membuat menu tersembunyi. Ketika mendapat triger (onclick atau onhover) maka menu tersembunyi itu muncul. Hanya menggunakan sedikit Javascript, selebihnya adalah permainan CSS. Terinspirasi dari menu pada icon user google dan facebook.




Download: http://sites.google.com/site/karuniaprojects/documents/hidden-menu.html

Kamis, 16 Februari 2012

HTTP Secure Simple Login

Proses login sederhana menggunakan protokol HTTP ternyata tidak sulit. Di bagian bawah ada link download untuk contohnya. Tekniknya menggunakan kamuflase input berupa password, yang sebelum form dikirim input tersebut dibaca dan diamankan menggunakan MD5 dan penanda waktu yang dikirim server melalui cookie, lalu dimasukkan ke dalam input yang lain bertipe hidden. Untuk lebih amannya lagi, input yang bertipe password tidak diberi properti name agar ketika form dikirim tidak ikut terkirim.

Setelah data password itu sampai di sisi server, script membaca password asli dan melakukan proses yang sama seperti di sisi browser, yaitu memproses hash dengan bumbu penanda yang dikirim sebelumnya melalui cookie. Setelah proses komparasi antara password dikirim dengan password yang ada, maka jika valid akan dilanjutkan menuju url selanjutnya. Untuk lebih jelas, download dan pelajari scriptnya.

catatan:
ada 2 user contoh untuk login, pertama test1 dengan password 1234, kedua test2 dengan password 1234.






Downlod: http://sites.google.com/site/karuniaprojects/documents/simple-login.zip

Senin, 13 Februari 2012

Mengamankan String Komparasi Dengan MD5, SHA1, atau CRC32

Script tester MD5, SHA1, dan CRC32, string dibandingkan antara hasil dari Javascript dengan hasil dari PHP. Dengan operasi MD5 dan SHA1 di sisi browser, maka data-data sensitif untuk komparasi seperti password dapat terlindungi dari para pengintai jaringan, terutama para pengelola jaringan yang nakal. Berikut ini link-linknya, silahkan dicoba menggunakan Apache+PHP, atau bisa langsung dibuka menggunakan web browser dengan mengubah ekstensi file menjadi html.


MD5: http://sites.google.com/site/karuniaprojects/documents/js-md5.php


SHA1: http://sites.google.com/site/karuniaprojects/documents/js-sha1.php


CRC5: http://sites.google.com/site/karuniaprojects/documents/js-crc32.php