Archive for the ‘Tip’ Category

OSS – Burn CD/DVD

Posted by mkhairul

Bagi mereka yang hanya hendak burn CD, tanpa segala benda lain (CD Label Designer, etc) yang tak diperlukan, saya cadang menggunakan Infra Recorder. Ianya percuma dan sumber terbuka (open source).

Saiznya yang kecil (3.27MB) juga membuatkannya senang untuk digunakan di mana sahaja (download je bila nak guna).

Menghasilkan screenshot lengkap laman web

Posted by mkhairul

Perisian apa yang anda gunakan untuk menghasilkan screenshot? Saya menggunakan hoversnap untuk mengambil screenshot harian, tetapi menggunakan plugin khas untuk membuat screenshot laman web.

Ini kerana hoversnap tidak dapat mengambil keseluruhan isi kandungan laman web tersebut. Setakat yang hujung sahaja, kalau content bawah kena scroll dan ambil semula.

Mungkin anda menggunakan perisian lain, tetapi bagi tugasan sebegini, saya menggunakan Screengrab!, plugin firefox. Kelemahannya, ambil screenshot pada firefox sahaja.

Berikut adalah contoh screenshot yang diambil..


Belang pada table (zebra stripe)

Posted by mkhairul

Berikut adalah cara untuk format table supaya mempunya ‘zebra stripe‘. Sesetengah orang kata, bantuan yang diberikan oleh zebra stripe ni hanyalah mitos dalam meningkatkan keboleh bacaan data dalam bentuk jadual (tabular). Data daripada kajian (Zebra Stripes: Does it really help?) yang dijalankan oleh Jessica Enders di A List Apart menyatakan yang ianya membantu. Pada diri saya, ia membantu, entahlah, lain orang lain cara dibantu.

Berikut adalah cara saya menggunakannya dalam bentuk javascript.

$(document).ready(function(){
  $("table tbody tr:nth-child(odd)").addClass("odd");
})

Dimana ia akan memasukkan class ‘odd’ kedalam baris yang ganjil dan formatkan dalam bentuk berikut:

tr.odd{ background-color: #C3D9FF; }

Edit: Terlupa nak beritahu, anda memerlukan jquery.

Memastikan input betul di dalam Perl

Posted by mkhairul

Library tersebut dihasilkan untuk memudahkan input yang diterima didalam kriteria tertentu (integer, alpha, alphanumeric, etc). Mungkin ada library yang telah pun wujud didalam CPAN, saya pun tak pasti tetapi saya tidak menjumpainya.

package input_lib;
use CGI::Carp "fatalsToBrowser";

@ISA = qw(Exporter);

@EXPORT = qw (
input_validate
);

my $required = 0;

sub input_validate{
    my ($value, $rules) = @_;

    use Data::Dumper;
	$required = 0;
	my @error_messages;

    my @rules = split('\|', $rules);
    foreach my $rule (@rules)
    {
        # Extract the rules and param (if there is a param)
        # e.g. max_length[5]
        @match = ($rule =~ m/(\w+)\[(\d+)\]{0,1}/g);
        if(!@match)
        {
            @match = ($rule =~ m/(\w+)/g);
        }
        my ($rule, $param);

        if(scalar(@match) > 1)
        {
            $rule = $match[0];
            $param = $match[1];
        }
        elsif(scalar(@match) > 0)
        {
            $rule = $match[0];
        }
        else
        {
            die("Error: No rule");
        }

        # Execute the rules
        # Call a subroutine dynamically
        # my $test = "alpha";
        # *{$test}{CODE}->(); // Calls the subroutine "alpha" i.e. alpha();

        if(!*{$rule}{CODE}->($value, $param))
        {
            push @error_messages, $rule;
        }
    }

    if($required == 0 && $value eq "")
    {
        return 0;
    }
    elsif(scalar(@error_messages))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

sub required{
    my ($value) = @_;
    $required = 1;
    return ($value) ? 1:0;
}

sub alpha{
    my ($value) = @_;
    return (($value =~ /^([a-z])+$/i)) ? 1:0;
}

sub alpha_space{
    my ($value) = @_;
    return (($value =~ /^([a-z\s])+$/i)) ? 1:0;
}

sub alpha_numeric{
    my ($value) = @_;
    return ($value =~ /^([a-z,0-9\s])+$/i) ? 1:0;
}

sub max_length{
    my ($value, $length) = @_;
    return (length($value) <= $length) ? 1:0;
}

sub min_length{
    my ($value, $length) = @_;
    return (length($value) >= $length) ? 1:0;
}

sub integer{
    my ($value) = @_;
    return (($value =~ /^[\-+]?[0-9]+$/)) ? 1:0;
}

sub valid_email{
    my ($value) = @_;
    return (($value =~ /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix)) ? 1:0;
}

sub valid_time{
	my ($time) = @_;
	if(!($time =~ m/([0-9]{2})\:([0-9]{2})/)){ return 0; }

	my ($hour, $min) = split(/\:/, $time);
	if($hour eq "" or $min eq ""){ return 0; }
	if($hour > 23 or $hour < 0){ return 0; }
	if($min > 59 or $min < 0){ return 0; }

	return 1;
}

sub valid_date{
	my ($date) = @_; # receives dd/mm/yyyy

	my ($day, $month, $year) = split(/\//, $date);
	if($day eq ""){ return 0; }
	if($month eq "") { return 0; }
	if($year eq "") { return 0; }

	$date = $month . '/' . $day . '/' . $year;

        # taken from OWASP's regex repository, http://www.owasp.org/index.php/OWASP_Validation_Regex_Repository
	# regex only supports mm/dd/yyyy
	if(!($date =~ m/^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/))
	{ return 0; }

	return 1;
}

1;

Agak panjang, kan?
Ianya mudah digunakan cuma include didalam Perl script anda.

use input_lib;

if(input_validate($foo, 'required|integer')){ die("Sila masukkan integer sahaja"); }

Mungkin ada cara yang lebih baik? Jom sembang di bahagian komen.

Membasmi input-input durjana didalam Perl

Posted by mkhairul

Memandangkan saya banyak menggunakan Perl/CGI sejak kebelakangan ni, post ni adalah berkaitan dengan perl/cgi.

Terdapat pengaturcara yang memandang ringan aspek sekuriti dalam perisian (kebanyakannya tak tahu, ignorance is bliss, no?) dan mengabaikannya sehinggalah suatu hari dimana perisian tersebut perlu menembusi pasaran yang lebih besar dan perlu melalui proses “penetration testing” (singkatan pen test) yang akan merungkaikan segala kelemahan yang telah diabaikan selama ini didalam pembangunan perisian tersebut.

Apabila terjadi begitu, maka bermulalah operasi menampal perisian daripada lubang-lubang sekuriti tersebut. Bagi kebanyakan input daripada pengguna dalam Perl/CGI, menggunakan “placeholder” adalah mencukupi untuk menyimpannya dengan selamat dalam pangkalan data (database) mengelakkan daripada SQL Injection. Rujuk article di perlmonks untuk penerangan lanjut, Preventing SQL injection attacks: Placeholders are enough for MySQL, Postgresql and SQLite.

exploits_of_a_mom

Apa bendakah itu “placeholder”?
Placeholder adalah nilai yang digunakan untuk menggantikan sesuatu nilai yang lain.

Berikut adalah contoh penggunaan placeholder.

$sth = $dbh->prepare( "SELECT name WHERE city = ? AND state = ?" );
$sth->execute( $city, $state );

Dengan menggunakan placeholder, modul DBI akan secara automatik menguruskan isu-isu “quoting” (escape single/double quote, e.g. \”) didalam nilai yang dihantar kepada pangkalan data.

Kekurangan “placeholder”
Walaupun semua jenis input selamat dimasukkan kedalam database dengan menggunakan placeholder tanpa mengakibatkan SQL Injection, ia masih perlu diperiksa kesahihannya. Anda masih perlu untuk mengesahkan (validate) input yang dimasukkan samada ianya integer, numeric, alpha, alphanumeric, dsbnya.
Jika input tersebut adalah berbentuk HTML, tukarkan semua character ke dalam HTML Entities, untuk mengelakkan daripada kes-kes XSS (Cross-site Scripting). Jika tiada HTML dibenarkan, gunakan HTML::Scrubber untuk sental semua html daripada input tersebut.

Berikut adalah contoh untuk menukarkan character-character ke bentuk HTML Entity

use HTML::Entities;
sub html_to_db{
    my ($html) = @_;
	$html = encode_entities($html);
	$html =~ s/\r\n//gs;
	return $html;
}

Marilah kita sama sama belajar mempertahankan diri daripada anasir-anasir yang tak diingini apabila membangunkan perisian.

249141325_4913641b29

Selamat programming!

Menggunakan notepad sebagai diari

Posted by mkhairul

Bagi seseorang yang nak benda paling simple sekali untuk buat diari, takyah install apa apa, anda hanya perlu notepad.

Bagaimana?

  1. Buka notepad (Start->Run->notepad.exe)
  2. Taip “.LOG” pada baris pertama.
  3. Save (namakan apa apa pun tak kisah) dan tutup fail. Bila anda bukanya semula, secara automatik ia akan menulis tarikh dan masa.



Sumber

Membuat penganggaran masa untuk tugasan

Posted by mkhairul

Salah satu daripada aktiviti yang selalu dilakukan pada masa kerja ialah membuat penganggaran masa yang diperlukan untuk menyiapkan tugasan tersebut. Melainkan anda mempunyai pengalaman membuat tugasan yang diberikan, elakkan daripada memberi anggaran secara spontan (kerana ianya akan kembali menyusahkan hidup anda kelak).

Jika berada dalam situasi dimana anda diminta membuat penganggaran spontan, maka anda perlu minta sedikit masa untuk membuat penganggaran tersebut dan anda akan kembali memberikan jawapan setelah anda selesai membuat penganggaran dalam 30 minit ke satu jam. Ini juga bergantung pada situasi, jika bos anda mendesak anda memberi anggaran kerana beliau harus memberi jawapan dalam meeting sebentar lagi (ini silap bos anda juga kerana last minute), maka pada masa itu terpaksalah memberi anggaran yang tidak bersandarkan fakta (dan kemungkinan besar anda tidak dapat memenuhinya).

Tapi jangan pula tugasan macam tukar warna teks dan mengubah saiz ruangan teks mengambil masa. Itu benda remeh, dan dapat diselesaikan dengan cepat. Yang dimaksudkan adalah tugasan yang mempunyai impak terhadap fungsi aplikasi ataupun projek secara keseluruhan.

Contoh yang boleh saya berikan adalah membuat suatu borang web (form) untuk permohonan yang ringkas.

  • Borang web, mempunyai ruangan teks seperti Nama, Alamat, No. Telefon, Email, dsbnya.
  • Mempunyai antaramuka admin yang dapat melihat maklumat-maklumat pengguna daripada penghantaran borang tersebut
  • Menghantar mesej kepada pengguna melalui email bahawa permohonannya telahpun diproses dan jadual ujian percubaan akan diberikan pada mereka. Mesej email mengandungi kata pengguna, laluan, masa dan laman web untuk mengambil ujian tersebut.

Agak mudah? Mungkin ya mungkin tidak. Bergantung pada pengalaman anda. Daripada keperluan pengguna tersebut, saya diminta untuk membuat anggaran. Anggaran yang dimaksudkan adalah borang dan antaramuka admin tersebut siap dan boleh dipakai.

Sebelum anda teruskan membaca, cuba anda membuat anggaran.

*tengok jam*

….. ok, sudah? Anda yakin?
Teruskan membaca untuk mendapat gambaran disebalik tabir membuat anggaran.

schedulereview13

(more…)

Penghasilan kata laluan (password) di dalam perisian

Posted by mkhairul

Bagaimana anda menghasilkan kata laluan pengguna apabila akaunnya dihasilkan? Menggunakan MD5? SHA-1? Ok, bagus kerana encrypt kata laluan kerana kebanyakan orang menggunakan kata laluan yang sama untuk pelbagai perkhidmatan (services).

Apa akan jadi kalau tak encrypt kata laluan?

Tak jadi ape ape pun dari segi fungsi aplikasi, tetapi akibatnya adalah dari segi perundangan (link menerangkan Data Protection Act di UK, tak pasti di Malaysia ada ke tak). Kalau orang dapat masuk server melalui exploit OS ataupun perisian lain kemudian dump database, mereka terpaksa lalui lagi satu halangan, encrypted password. Kalau tak encrypt (istilah ‘tak encrypt’ selalu digunakan sebagai ‘plain-text’)? Larian tanpa halangan la jawabnya.

Ok, dah encrypt? Cukupkah?

Tak cukup! Kena tambah garam (salt) sikit, sebagai penambah perisa. Kenapa? Sebab teks yang telah encrypt tu boleh dipadankan dengan menggunakan pengkalan data seperti GData: An Online MD5 Hash Database. Bahayakan?

Bila tambah garam sikit, agak sukar untuk teks tersebut ditukar kembali (reverse lookup) kerana ia takkan jumpa walaupun anda menggunakan kata laluan generic seperti qwe123.

Jadi, macam mana nak tambah garam?

$salt = substr($password, 1, 3);
$e_password = md5($password . $salt);

Macam tu je. Mudah. Harap maklumat ni dapat membantu sedikit sebanyak.

Edit: Menggunakan $salt pada $e_password = md5($password . $salt)

Cengkerang Interaktif untuk PHP

Posted by mkhairul

Salah satu benda yang pertama sekali seorang pengaturcara jumpa apabila mencuba sesuatu bahasa pengaturcaraan adalah cengkerang interaktif (interactive shell). Kalau python, dia akan terus run shell ini apabila anda menaip python (itupun jika dah register pada System variables pada Windows kalau tidak, harus taip laluan penuhnya mungkin di C:\Python2.5\python.exe),

python_cmd

jika Perl anda perlu menaip arahannya iaitu perl -d -e 1.

perl_cmd

Tetapi, jika untuk PHP, saya menggunakan PHPInteractive (install di local sahaja, jangan install di server, merbahaya :D ). Aplikasi ini digunakan untuk memudahkan anda menguji idea baru dan sebagainya. Boleh ke function ini berbuat sebegini? cuba sahaja di PHPInteractive. Tetapi untuk menguji data didalam database, anda harus menaip semula connectionnya. Agak tidak sesuai (saya tak test database melalui phpinteractive, cuma function dan idea yang kurang pasti seperti menguji snippet yang diambil dari internet, fungsi recursive dan sebagainya).

phpinteractive

Apakah yang anda gunakan sebagai cengkerang interaktif anda?

Mempercepatkan interaksi dengan komputer

Posted by mkhairul

Pada mereka yang menggunakan Windows XP, klik pada start menu anda, pergi ke ‘All Programs’. Berapa banyak software yang terdapat dalam komputer anda? Apabila saya berbuat demikian, ia memaparkan 5 column yang penuh dengan software yang berada dalam komputer saya. Jika saya run perisian melalui start menu, sudah tentu ia memakan masa dan mengganggu produktiviti saya (dengan kata lain, berjanggut la gamaknya).

Jadi bagaimana? Buang perisian yang tidak selalu pakai? (tidak selalu tak bermakna tak pakai)

Jawapannya adalah menggunakan perisian yang dikenali sebagai ‘launchers‘. Launcher adalah perisian yang membolehkan anda menaip sebahagian daripada nama perisian untuk anda melancarkan perisian tersebut.

Walaupun terdapat pelbagai perisian ‘launcher’, berikut adalah yang selalu digunakan:

launchySaya menggunakan Launchy. Agak mudah, ringan dan UI pun ok la (walaupun tak tgk sangat pun UI). Slickrun pun ok juga, tapi ia lebih dari ‘launcher’ ia mempunyai keupayaan untuk diprogram menggunakan bahasa makro nya sendiri yang dipanggil sebagai MagicWords.

Cuba-cubalah menggunakan perisian ‘launcher’, yang mana sesuai untuk anda saya tidak tahu (sebab tulah kena cuba) tetapi yang pasti ia dapat mempercepatkan anda berinteraksi dengan komputer serta meningkatkan produktiviti anda (dan juga mengurangkan sakit jari kena klik banyak sangat).

Selamat Mencuba!