arradyscode

http://www.arradyscode.com

Welcome to arradyscode.
Share algorithms, logic and codes of programming languages.

Penjumlahan Infinite Digits pada Delphi

Bagi programmer delphi pasti sudah tidak asing dengan fungsi strtoint(), fungsi ini mengubah string menjadi integer, yang kemudian hasilnya dalam dioperasikan secara matematika. Sebagai contoh:
procedure TForm1.Button2Click(Sender: TObject);
var
  hasil : integer;
begin
  hasil := strtoint(edit1.text) + strtoint(edit2.text);
end;
Permasalahannya adalah, strtoint hanya menampung bilangan dengan kapasitas integer. Bagaimana jika digit angkanya terlalu banyak? Memang dalam penggunaannya nanti, kemungkinan digit terlalu banyak ini kecil sekali. Namun apa salahnya kita bermain logika sejenak mengimplimentasikan konsep penjumlah yang dulu pernah dipelajari di sekolah dasar (SD).
Langsung saja saya share coding nya.
procedure TForm1.Button1Click(Sender: TObject);
var
  ank_1, ank_2 : string;
  hasil : string;
  pjg,i,tampung,simpan : integer;
begin
  {valuenya}
  ank_1 := edit1.Text;
  ank_2 := edit2.Text;

  if length(ank_1) > length(ank_2)
  then pjg := length(ank_1)
  else pjg := length(ank_2);

  for i := 0 to pjg do begin
    if length(ank_1) < pjg then ank_1 := '0' + ank_1;
    if length(ank_2) < pjg then ank_2 := '0' + ank_2;
  end;

  hasil  := '';
  simpan := 0;
  for i := pjg downto 1 do begin
    tampung := strtointdef(ank_1[i],0)
             + strtointdef(ank_2[i],0)
             + simpan;

    hasil := inttostr(tampung mod 10)
             + hasil;
    simpan := tampung div 10;
  end;

  if simpan <> 0 then hasil := inttostr(simpan) + hasil;
  edit3.Text := hasil;
end;
Dan berikut adalah tampilan form setelah dijalankan:
Anda dapat melihat bahwa angka dimasukkan melampaui kapasitas integer namun tetap dapat dijumlahkan. Semoga logikanya berguna untuk bermain-main diwaktu senggang.

Membuat dan Memahami Pembuatan CAPTCHA pada PHP

Form yang dapat diakses oleh public, biasanya akan rentan dengan pengguna-pengguna iseng yang menginputkan data asal. Selain itu, form yang sifatnya membutuhkan authentikasi bisa dicoba-coba dengan menggunakan bruteforce attack.
Oleh karena itu, dibutuhkan sebuah kode acak yang harus diisi sebelum melakukan submit form. Pada tutorial kali ini saya akan mencoba menjelaskan pembuatan captcha pada pemrograman PHP.
Form yang akan saya buat hanya memiliki 1 inputan, yaitu inputan khusus untuk captcha nya itu sendiri. Berikut coding dasar pembuatan captha:
<?php
  // random angka 10000 hingga 99999,
  // Anda juga bisa menggunakan fungsi random yg dibuat
  // agar dapat menampung huruf dan angka
  $teksnya = rand(10000,99999);
?>
<form method="POST">
Kode Capcha :<br />
<input readonly="" type="text" value="<?php echo $teksnya; ?>" />

Masukkan Kode Diatas:<br />
<input name="capt" type="text" value="" />

<input name="submit" type="submit" /> 
</form>

coding diatas akan menghasilkan bentuk form seperti ini:
 
Anda dapat melihat, kode Captcha yang dihasilkan adalah hasil random angka 10000 hingga 99999. Kode tersebutlah yang akan dicek benar atau tidak pengisiannya pada saat user melakukan submit.
Kemudian, disaat user melakukan submit, cek apakah capthca sesuai yang diisi user atau tidak. Karena posisi penyimpanan captcha sebelumnya dibutuhkan, maka penyimpanan dilakukan di SESSION.
sehingga coding diatas dilengkapi menjadi:
<?php
  session_start();
  //cek disini, sebelum generate captcha baru, jangan terbalik
  if ($_SESSION['capt'] == $_POST['capt']){
    echo 'Captcha Benar';
    // proses-proses lainnya.
  }else{
    echo 'Capthca Salah';
  }

  // random angka 10000 hingga 99999,
  // Anda juga bisa menggunakan fungsi random yg dibuat
  // agar dapat menampung huruf dan angka
  $teksnya = rand(10000,99999);
  $_SESSION['capt'] = $teksnya;
?>

<form method="POST">
  Kode Capcha :<br/>
  <input type="text" value="<?php echo $teksnya; ?>" readonly/><br/>
  Masukkan Kode Diatas:<br/>
  <input type="text" name="capt" value="" /><br/>
  <input type="submit" name="submit"/> 
</form>
Silahkan dicoba terlebih dahulu sebelum dilanjutkan. Ingat untuk tidak terbalik, pengecekan dilakukan diatas fungsi generate capctha yang baru.
Kendalanya sekarang adalah, kode tersebut terlalu riskan, karena dapat diambil dengan Curl, atau dapat juga dicopas saja oleh user. Sehingga dibutuhkan fungsi khusus agar kode tersebut ditampilkan dalam bentuk gambar.
Oleh karena ini, perlu dibuat sebuah fungsi untuk mengubah teks menjadi gambar, agar hanya bisa dibaca dan tidak dapat dicopy atau di grab. Gambar ini nantinya akan dipanggil oleh halaman yang akan menampilkan captcha.
Untuk lebih jelasnya, coding-coding yang saya jelaskan diatas dipisah, menjadi 2 halaman.

index.php

<?php
  session_start();
  if ($_SESSION['capt'] == $_POST['capt']){
    echo 'Captcha Benar';
  }else{
    echo 'Capthca Salah';
  }
?>

<form method="POST">
  Kode Capcha :<br/>
  <img src='capt.php'/><br/>
  Masukkan Kode Diatas:<br/>
  <input type="text" name="capt" value="" /><br/>
  <input type="submit" name="submit"/> 
</form>

capt.php

<?php
session_start();
$textnya = rand(10000,99999);
$_SESSION["capt"] = $textnya;

//warna gambar dan teks
$width = 65;
$height = 25;
$font_size = 14;
$image_p = imagecreate($width,$height);
$white   = imagecolorallocate($image_p,0,0,0);
$black   = imagecolorallocate($image_p,225,225,225);

imagestring($image_p,$font_size,5,5,$textnya,$black);
imagejpeg($image_p,null,80);
?>
Silahkan buat masing-masing halaman tersebut, jalankan file index.php, dan captcha Anda telah selesai jika Anda telah mendapatkan output seperti ini

Mengubah String Menjadi Variable PHP

Sebelumnya saya sudah menjelaskan masalah extract yang terlupakan, saya rasa perlu juga untuk membahas hal kecil ini. Selama ini saya pribadi sering melihat beberapa teman menyalahkan penggunaan $$ (dua tanda dolar) pada sebuah variable.
Contoh:
<?php
  $$nama = 'arradyscode';
Sebenarnya salah atau tidaknya adalah sesuai atau tidaknya penggunaan tanda tersebut, tetapi yang ingin saya sampaikan adalah secara pemrograman itu bukanlah syntax error. Penggunaan $$ adalah trik yang sangat bagus untuk mengubah string menjadi variable.
Sebagai contoh:
<?php
  $nama = 'arradys';
  $$nama = 'code';
Jika dilihat pada penulisan coding diatas sama halnya dengan menuliskan:
<?php
  $nama = 'arradys';
  $arradys = 'code';
Perhatikan pada $$nama dan $arradys, Kenapa demikian?, karena PHP mengganggap $$ mengubah value pada variable tersebut menjadi sebuah variable lainnya.
Contoh penggunaan lain saya lampirkan untuk memudahkan pemahaman.
<?php
  $jawaban = $_GET['jawaban'];

  if ($jawaban == 'A'){
    echo $jawab_A;
  }elseif ($jawaban == 'B'){
    echo $jawab_B;
  }elseif ($jawaban == 'C'){
    echo $jawab_C;
  }elseif ($jawaban == 'D'){
    echo $jawab_D;
  }elseif ($jawaban == 'E'){
    echo $jawab_E;
  }
Coding di atas sama halnya dengan menulis coding ini:
  $jawaban = 'jawab_'.$_GET['jawaban'];
  echo $$jawaban;
Demikian tutorial singkat tentang mengubah string menjadi variable di PHP, semoga bermanfaat dan membuat coding lebih efesien.

Fungsi "extract()" pada PHP yang terlupakan

Tutorial kali ini sebenarnya hanya opini saya saja, awalnya saya melihat-lihat coding yang dibuat oleh teman-teman saya yang masih berstatus mahasiswa baru. Pada coding tersebut saya melihat pengulangan-pengulangan yang mungkin menurut saya sedikit mubazir, Biasanya hal-hal seperti ini disebabkan karena belum/tidak tahu bahwa ada fungsi yang dapat menghandle tujuan yang diinginkan.
Coding tersebut kira-kira seperti ini:
<?php
  $nama   = $_POST['nama'];
  $alamat = $_POST['alamat'];
  $telpon = $_POST['telpon'];
  $kota   = $_POST['kota']
  .....
  mysql_query("INSERT INTO peserta VALUES('$nama','$alamat','$telpon','$kota')");
Saya sempat berpikir, jika dalam sebuah form terdapat belasan field saja, dan didaftarkan seperti ini, berapa baris yang terbuang sia-sia. Oleh karena itu saya menulis tutorial ini, hanya untuk memberikan kabar gembira bagi yang masih menggunakan cara tersebut, bahwa $_POST sekarang ada extract() nya,,
contoh penggunaan:
<?php
  extract($_POST);
  mysql_query("INSERT INTO peserta VALUES('$nama','$alamat','$telpon','$kota')");
Satu baris yang dapat mewakili semua baris diatas.
Menjadi pertanyaan sekarang, apakah cara pertama salah? Tentu jawabannya tidak, jika Anda hanya ingin mengambil beberapa value saja misalnya, maka cara diatas dipakai, tetapi jika dalam sebuah form, semua value dari setiap element dalam form ingin diambil, maka saya rasa penggunaan extract() akan lebih efesien.
Namun, semua programmer memiliki gaya codingnya sendiri,, kembali kepada masing-masing.

Huruf Kapital di Awal Kata dengan Delphi

Pada beberapa hal, kita membutuhkan penulisan kata dengan huruf kapital pada huruf pertamanya, sebagai contoh "Arradys Code" memiliki huruf kapiral pada huruf A dan huruf C.
Tidak seperti halnya pemrograman PHP yang sudah menyediakan fungsi ucFirst(), delphi harus dibuatkan fungsi tersendiri untuk menghandle hal seperti ini.
Sebenarnya fungsi ini sederhana, Anda hanya perlu mengetahui pada saat-saat seperti apa huruf tersebut harus di-kapital-kan.
Pada tutorial kali ini, kapital akan dilakukan jika huruf tersebut berada di awal kalimat, atau berada setelah spasi, setelah titik dan setelah dash(-). Berikut fungsinya, silahkan di copy ke unit Anda.
function firstCapital(edit : string) : string;
var
  j   : integer;
  r : string;
begin
  r := '';

  for j := 1 to length(edit) do
    if charInset(edit[j-1],[' ','-','.']) or (j = 1) then
      r := r + uppercase(edit[j])
    else
      r := r + lowercase(edit[j]);

  result := r;
end;
Pada kode tersebut Anda dapat melihat (j=1), melakukan pengecekan jika huruf berada di awal kalimat. Kemudian juga melakukan pengecekan charInset(edit[j-1],[' ','-','.']), jika huruf berada setelah spasi,titik atau dash.
Anda dapat menambahkan daftarnya dan kondisi-kondisi pengecekan lainnya.
Perlu diketahui, fungsi charInset tidak terdapat pada delphi 7, sehingga jika Anda adalah pengguna delphi7, anda perlu mengubah kode berikut:
if charInset(edit[j-1],[' ','-','.']) or (j = 1) then
menjadi:
if (edit[j-1] in ([' ','-','.'])) or (j = 1)then
Kemudian, untuk menggunakannya Anda hanya perlu memanggil fungsi firstCapital();
procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(firstCapital('ini sudah di capital'));
end;
Silahkan coba kode di atas, maka Anda akan mendapat output yang sudah dikapitalkan huruf awalnya, silahkan dimodifikasi dan semoga bermanfaat.

Validasi eMail dengan Delphi

Saat penyimpanan sebuah data, terkadang kita membutuhkan email yang sesuai format, sehingga diperlukan sebuah fungsi untuk mengecek apakah email tersebut valid atau tidak.
Hal ini dilakukan untuk menghindari pengisian asal-asal oleh pengguna. Terlepas apakah email tersebut benar-benar ada atau hanya rekayasa.
Untuk email yang harus benar-benar terdaftar kita dapat melakukan pengecekan dengan mengirim sebuah link aktifasi ke email tersebut, dengan demikian kita dapat memastikan apakah email tersebut benar-benar terdaftar atau tidak. Namun pada tutorial kali ini saya hanya akan memberikan fungsi pengecekan email sesuai format, tanpa melakukan pengecekan terdaftarnya email tersebut.
Validasi ini dapat digunakan dengan regex, namun Anda harus mengincludekan unit baru ke delphi/project Anda, oleh karena itu kali ini saya hanya akan menggunakan fungsi biasa tanpa memerlukan unit khusus.
Email yang dianggap valid pada tutorial saya kali ini adalah email yang terdapat yyy@domain.xxx, di sini saya membatasi karakter minimal pada yyy dan domain, sehingga jika Anda mengisi y@d.xxx akan menghasilkan email yang tidak valid.
Langsung saja, tuliskan (copy) kode berikut ke unit Anda:
function emailCheck(email : string) : boolean;
begin
  result := false;
  if (AnsiPos('@',email) > 2) and
     (AnsiPos('.',copy(email,AnsiPos('@',email) + 1,length(email))) > 2) then
      result := true;
end;
Kemudian, untuk melakukan pengecekan saat menyimpan Anda hanya perlu menuliskan kode berikut:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (emailCheck('fuad.arradhi@yahoo.com')) then
    showmessage('Email Anda Valid');
end;
Demikian tutorial melakukan validasi email pada delphi, semoga bermanfaat.

Konversi Bilangan Integer ke Romawi pada Delphi

Bilangan romawi adalah salah satu bilangan yang sering digunakan dalam kehidupan sehari-hari. Sehingga terkadang pada pemrograman pun memerlukan output dengan bilangan tersebut. Sebagai contoh pada report yang berbentuk golongan pegawai, bilangan romawi ini dapat digunakan untuk memisahkan golongan/ruang.
Berikut adalah fungsi yang dapat digunakan untuk mengkonversi bilangan integer ke bilangan romawi:
function IntToRoman(num: Cardinal): string;
const
  Nvals = 13;
  vals: array [1..Nvals] of word =
    (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
  roms: array [1..Nvals] of string[2] =
    ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C',
    'CD', 'D', 'CM', 'M');
var
  b: 1..Nvals;
begin
  result := '';
  b := Nvals;
  while num > 0 do
  begin
    while vals[b] > num do
      dec(b);
    dec (num, vals[b]);
    result := result + roms[b]
  end;
end;
Untuk penggunaannya, Anda hanya perlu menulis fungsi di atas di unit baru atau langsung ke unit yang akan memanggil fungsi IntToRoman(). Fungsi tersebut akan menghasilkan output dalam tipe string.
procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(inttoroman(12));
end;
Kode di atas jika dijalankan akan menghasilkan output "XII".
  • http://delphidabbler.com/tips/101

Access Violation Pada Delphi dan Lazarus

Dalam pemrograman, error atau kesalahan bukanlah hal yang asing, mulai dari kesalahan sederhana sampai yang komplit. Kesalahan-kesalahan ini sendiri beragam, ada kesalahan pada penulisan (syntax error) ada juga kesalahan pada logika (logic error).
Kesalahan yang disebabkan salah penulisan biasanya akan lebih mudah diketahui dikarenakan adanya pesan kesalahan oleh compiler secara terperinci. Tetapi kesalahan logika hanya dapat diperbaiki dengan logika pula, dengan mengubah pandangan dalam berpikir, menganalisa dan mencoba dengan logika baru.
Perlu digarisbawahi bahwa programming bukanlah ilmu menebak, setiap tindakan melalui proses analisa yang sangat indah tersusun dalam bentuk algoritma. 
Salah satu kesalahan logika yang sering dijumpai dalam pemrograman khususnya Delphi dan Lazarus adalah Access Violation, hal ini dikarenakan sebuah object diakses pada saat object tersebut belum tersedia. Sebagai contoh, pemanggilan form secara defaultnya adalah cukup dengan code ini.
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.show;
end;
Tetapi bagaimana jika form2 adalah available form, yang artinya form2 tidak di create otomatis oleh Delphi atau Lazarus, tentunya form2 harus di create terlebih dahulu secara runtime sehingga menjadi:
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2 := TForm2.create(self);
  form2.show;
end;
Pada script di atas terlihat jelas bahwa form2 di create terlebih dahulu sebelum dipanggil, sehingga pada saat diakses form2 tersebut sudah tersedia. Hal ini tentunya akan menghindarkan dari access violation.
Begitu juga halnya pada saat akan membebaskan memory, pastikan object tersebut tersedia untuk di free kan. Dalam hal tertentu Anda dapat menggunakan assigned() untuk melakukan pengecekan apakah object tersebut tersedia sebelum diakses.
procedure TForm1.Button1Click(Sender: TObject);
begin
  { cek ketersediaan object sebelum diakses }
  if assigned(form2) then
    form2.show;

  { jika tidak ada create }
  if not assigned(form2) then
    form2.create(self);

  { cek sebelum dibebaskan}
  if assigned(form2) then
    form2.free;
end;
Perlu digarisbawahi bahwa procedure yang saya tulis di atas hanya contoh akses object yang menyebabkan access violation. Anda dapat menjadikan ini sebagai acuan Anda dalam mendebug kesalahan pada aplikasi Anda.
Jika Anda mempunyai penyebab-penyebab lain pada access violation, silahkan beri komentar dibawah, semoga dapat menjadi referensi pembaca.

Penomoran Otomatis Pada Delphi dan PHP

Pada dasarnya setiap database sudah memiliki AutoNumber nya tersendiri. Autonumber ini dapat diperolah dengan mendefinisikan field primary sebagai autoincrement. Dengan demikian setiap ada penginputan record baru, record tersebut akan memiliki satu kode unik yang selalu bertambah satu (increment).
Namun demikian ada saatnya kita memerlukan penomoran dengan format yang berbeda, katakanlah kita memerlukan prefix atau suffix pada penomoran. Untuk menjawab persoalan tersebut pada kesempatan kali ini saya akan mencoba menguraikan langkah-langkah yang dilakukan untuk membuat penomoran otomatis.
Penomoran otomatis dapat dilakukan dengan semua bahasa pemograman, baik itu terhubung ke database atau tidak, namun pada kesempatan ini saya hanya akan mencontohkannya dalam bahasa pemrograman Delphi dan PHP dengan asumsi telah terhubung ke database. Semoga dapat dipahami dan disesuaikan pada bahasa pemograman lain. Untuk penomoran otomatis pada Stored Procedure MySQL akan saya uraikan pada artikel saya selanjutnya.
Langkah-langkah yang dilewati dalam pembuatan nomor otomatis ini antara lain:
  1. Ambil nomor terakhir pada database, jika tidak ada maka nomor terakhir adalah 0 (nol).
  2. Tambahkan nomor tersebut dengan 1 (satu).
  3. Hasil pada langkah ke 2 (dua) merupakan nomor baru pada inputan selanjutnya.
Perlu dicermati, point 1 dan 3 begitu sederhana jika penomorannya hanya angka, tanpa prefix ataupun suffix. Untuk permasalahan tersebut Anda dapat menggunakan fungsi-fungsi pengolah string pada bahasa pemrograman yang Anda gunakan.
Untuk memudahkan tutorial saya kali ini, saya tentukan penomoran yang akan kita pelajari dengan format : KODE-00001.
Sebelum kita mulai, buatlah sebuah database "penomoran" dan tabel "otomatis", berikut saya sertakan query untuk create tabelnya.
CREATE TABLE `otomatis` (
 `nomor` CHAR(10) NOT NULL,
 `nama` VARCHAR(30) NULL DEFAULT NULL,
 PRIMARY KEY (`nomor`)
)
ENGINE=InnoDB;
Kemudian tambahkan beberapa baris ke tabel tersebut, nomor diisi sesuai format:

Seperti saya sebutkan sebelumnya, pada tutorial kali ini saya asumsikan Anda sudah memahami tentang koneksi dan sudah terhubung ke database.

Delphi

procedure TForm1.Button1Click(Sender: TObject);
var
  no_urut : string;
  no_baru : string;
begin
  with ZQuery1 do begin
    { query mengambil nomor urut terakhir }
    sql.text := 'SELECT nomor FROM otomatis ORDER BY nomor DESC LIMIT 1';
    open;

    { nomor urut saat ini }
    no_urut := fieldbyname('nomor').AsString;

    { karena nomor urut sebenarnya adalah 5 angka terakhir
      contoh: Kode-00001, nomor urutnya adalah 00001,
      maka perlu fungsi mengambil 5 karakter dari kanan. }
    no_urut := rightStr(no_urut,5);

    { nomor urut baru adalah nomor lama + 1}
    no_baru := inttostr( strtointdef( no_urut,0) + 1);

    { tambahkan kembali prefix "Kode" }
    no_baru := 'Kode-'+formatfloat('00000',strtofloat(no_baru));

    { hanya untuk ujicoba hasil }
    showmessage(no_baru);
  end;
end;

PHP

<?php
  mysql_connect('localhost','root','');
  mysql_select_db('penomoran');

  #query ambil urut terakhir
  $qry = mysql_query('SELECT nomor FROM otomatis ORDER BY nomor DESC LIMIT 1');

  #ambil 5 angka terakhir, jika tidak ada record otomatis 0
  if (mysql_num_rows($qry) == 1){
   $nomor = mysql_result($qry,0,0);
   $nomor = substr($nomor,-5);
  }else
   $nomor = 0;

  #tambahkan 1, increment
  $nomor++;

  #format kembali
  $nomor = 'Kode-' . str_pad($nomor, 5, '0', STR_PAD_LEFT);

  echo $nomor;
?>
Jika kedua script di atas dijalankan, maka Anda akan mendapat hasil "Kode-00003", dikarenakan nomor urut terakhir di table adalah "Kode-00002".
Demikian contoh sederhana pembuatan nomor otomatis pada Delphi dan PHP, Anda yang menggunakan Lazarus tentunya dapat menggunakan script Delphi juga.
Untuk pembuatan penomoran otomatis pada Stored Procedure akan saya jelaskan pada tulisan saya berikutnya.