<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sembang Programming &#187; Tip</title>
	<atom:link href="http://sembangprogramming.com/category/tip/feed/" rel="self" type="application/rss+xml" />
	<link>http://sembangprogramming.com</link>
	<description>Sembangan mengenai pengaturcaraan</description>
	<lastBuildDate>Thu, 29 Jul 2010 03:58:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CamelCase</title>
		<link>http://sembangprogramming.com/2010/07/camelcase/</link>
		<comments>http://sembangprogramming.com/2010/07/camelcase/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 03:58:04 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[pengalaman]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=371</guid>
		<description><![CDATA[Apa itu CamelCase?
Di wikipedia dia tulis, gabungan perkataan dimana setiap element (perkataan) dicantum tanpa menggunakan ruang kosong (space) dan setiap huruf di permulaan perkataan adalah besar (capital letter).
Contohnya jika anda mempunyai fungsi yang dipanggil..
get_items_in_list
Dalam CamelCase, ia ditulis sebegini,
GetItemsInList
Saya lebih menggemari pemisahan perkataan dengan menggunakan underscore ( _ ), dalam penamaan fungsi (function). Senang nak baca, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Apa itu CamelCase?</strong><br />
Di wikipedia dia tulis, gabungan perkataan dimana setiap element (perkataan) dicantum tanpa menggunakan ruang kosong (space) dan setiap huruf di permulaan perkataan adalah besar (capital letter).</p>
<p>Contohnya jika anda mempunyai fungsi yang dipanggil..</p>
<blockquote><p>get_items_in_list</p></blockquote>
<p>Dalam CamelCase, ia ditulis sebegini,</p>
<blockquote><p>GetItemsInList</p></blockquote>
<p>Saya lebih menggemari pemisahan perkataan dengan menggunakan underscore ( _ ), dalam penamaan fungsi (function). Senang nak baca, walaupun agak panjang, tapi senang nak baca tu yang penting.</p>
<p>Tapi yang penting, kena konsisten. Jangan sekejap CamelCase sekejap , sekejap benda lain. Kena ada <a href="http://code.google.com/p/soc/wiki/PythonStyleGuide#Naming">guideline</a> untuk cara penulisan. Kalau setiap programmer ada style masing-masing (ada yang takdak style, ikut sedap hati dan mood.  Sekejap camelcase, sekejap hungarian notation, etc) haru-biru la gamaknya.  Dan kalau kena maintain sistem, programmer sebelum ni dah pakai CamelCase secara konsisten terpaksa la ikut.</p>
<p>Oleh kerana saya telah menulis pelbagai kod sebagai projek sampingan (pet project) yang tidak dapat disiapkan (tiba-tiba banyak pulak kerja) dan dibiarkan terbengkalai selama 3-6 bulan (ada yang sampai bertahun) dan kemudiannya saya sambung balik, ianya secara tidak langsung melatih saya untuk menulis kod dengan lebih teliti supaya  pada masa akan datang saya dapat memahami kod yang ditulis dan sambung menulis kod tersebut.</p>
<p>Ok, setakat tu sahaja untuk hari ni. Nak kena sambung baca kod orang (dan baiki indentation, *sigh*, masih ramai tak reti guna IDE dengan betul).</p>
<p>Selamat Programming!</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/07/camelcase/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apakah itu cheatsheet?</title>
		<link>http://sembangprogramming.com/2010/06/apakah-itu-cheatsheet/</link>
		<comments>http://sembangprogramming.com/2010/06/apakah-itu-cheatsheet/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 04:30:40 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[Umum]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=351</guid>
		<description><![CDATA[Masa peperiksaan atau ujian dibangku sekolah ataupun university, pernahkah anda menggunakan nota kecil yang terselindung sebagai rujukan?
Ha! Itulah cheatsheet. Sekeping kertas yang mempunyai nota ringkas mengenai sesuatu topik. Dalam pembangunan perisian ni, terlalu banyak perkara yang perlu dirujuk (HTML, CSS, Javascript, OOP, Domain Driven Design, dan sebagainya), kalau nak rujuk setiap satu topic pada buku, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sembangprogramming.com/wp-content/uploads/2010/06/800px-Cheating.jpg"><img src="http://sembangprogramming.com/wp-content/uploads/2010/06/800px-Cheating-150x150.jpg" alt="" title="800px-Cheating" width="150" height="150" class="alignright size-thumbnail wp-image-353" /></a>Masa peperiksaan atau ujian dibangku sekolah ataupun university, pernahkah anda menggunakan nota kecil yang terselindung sebagai rujukan?</p>
<p>Ha! Itulah <strong>cheatsheet</strong>. Sekeping kertas yang mempunyai nota ringkas mengenai sesuatu topik. Dalam pembangunan perisian ni, terlalu banyak perkara yang perlu dirujuk (HTML, CSS, Javascript, OOP, Domain Driven Design, dan sebagainya), kalau nak rujuk setiap satu topic pada buku, memang jenuh la nak membelek buku-buku tu.</p>
<p>Sekarang ni, dah banyak cheatsheet yang terdapat di internet, taip je apa kat pakcik Google, mesti ada punya. SVN? Git? Mercurial? CMS kegermaran seperti Drupal? Joomla? Semua ada cheatsheet.</p>
<p>Antara website yang saya selalu pergi untuk mendapatkan cheatsheet adalah <a href="http://www.addedbytes.com/cheat-sheets/">Addedbytes</a> (dulu dikenali sebagai ilovejackdaniels.com tapi lawyer Jack Daniels dok hantar cease and desist letter kat owner suruh tukar nama).<br />
Antara Cheatsheet yang ada kat situ:</p>
<ul>
<li>HTML</li>
<li>CSS</li>
<li>PHP</li>
<li>Python</li>
<li>Subversion</li>
<li>mod_rewrite</li>
<li>Regular Expressions</li>
<li>Ruby on Rails</li>
<li>MySQL</li>
</ul>
<p>Tak cukup? Nak lagi? Haaa ni dia, <a href="http://refcardz.dzone.com/">RefCardz</a> (Free Cheatsheets for developers)<br />
Print dan letak la kat cubicle anda supaya senang untuk dirujuk.</p>
<p>Selamat programming!</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/06/apakah-itu-cheatsheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tor</title>
		<link>http://sembangprogramming.com/2010/06/tor/</link>
		<comments>http://sembangprogramming.com/2010/06/tor/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 03:45:22 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=342</guid>
		<description><![CDATA[Sebelum ni, ada tempat yang tidak membenarkan saya untuk download daripada Sourceforge. Bila saya gunakan Tor, ia tidak dapat menyekat saya daripada download kerana sumber data yang datang dan pergi adalah bukan daripada/kepada sourceforge, ianya datang daripada rangkaian Tor.
Oleh kerana data melalui rangkaian Tor, ianya akan menjadi agak perlahan. Terpaksa berkompromi lah kalau nak akses [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sembangprogramming.com/wp-content/uploads/2010/06/tor-logo.png"><img src="http://sembangprogramming.com/wp-content/uploads/2010/06/tor-logo.png" alt="" title="tor-logo" width="168" height="100" class="alignright size-full wp-image-343" /></a>Sebelum ni, ada tempat yang tidak membenarkan saya untuk download daripada Sourceforge. Bila saya gunakan <a href="https://www.torproject.org/">Tor</a>, ia tidak dapat menyekat saya daripada download kerana sumber data yang datang dan pergi adalah bukan daripada/kepada sourceforge, ianya datang daripada rangkaian Tor.</p>
<p>Oleh kerana data melalui rangkaian Tor, ianya akan menjadi agak perlahan. Terpaksa berkompromi lah kalau nak akses kepada benda-benda yang di halang (youtube, facebook, etc).</p>
<p>Ada beberapa cara untuk menggunakan Tor (apabila anda telah <a href="https://www.torproject.org/easy-download.html.en">install</a>), dan cara yang paling mudah adalah dengan menggunakan plugin firefox, <a href="https://addons.mozilla.org/en-US/firefox/addon/2275/">Torbutton</a>.</p>
<p>Setakat ni tidak berkesempatan untuk mencubanya ditempat-tempat yang menghalang website seperti youtube dan facebook. Kerana bergantung juga pada cara website-website tersebut dihalang. Jika trafik HTTP dihalang secara &#8220;<a href="http://en.wikipedia.org/wiki/Tor_(anonymity_network)#Traffic_analysis">traffic analysis</a>&#8220;, maka tak boleh juga la. </p>
<p>Ada discussion dalam BM kat <a href="http://forums.ubuntu.com.my/viewtopic.php?f=4&#038;t=960">ubuntu malaysia</a>.</p>
<p>Selamat memuat turun!</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/06/tor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reset borang menggunakan jQuery</title>
		<link>http://sembangprogramming.com/2010/04/reset-borang-jquery/</link>
		<comments>http://sembangprogramming.com/2010/04/reset-borang-jquery/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 08:06:43 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=324</guid>
		<description><![CDATA[Post kali ini agak pendek, hanya untuk mencatatkan sesuatu tentang jQuery iaitu cara untuk reset borang. Reset borang adalah antara elemen-elemen yang dimasukkan kedalam borang (selain input validation, input constraint, etc) tetapi ianya bukanlah mandatori, bergantung pada jenis borang. 
Jika tak kena cara, menambakah serabut dan rimas pada pengguna. Dibawah adalah contoh kod javascript yang [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sembangprogramming.com/wp-content/uploads/2010/04/reset.jpg"><img src="http://sembangprogramming.com/wp-content/uploads/2010/04/reset-150x150.jpg" alt="" title="reset" width="150" height="150" class="alignright size-thumbnail wp-image-326" /></a>Post kali ini agak pendek, hanya untuk mencatatkan sesuatu tentang jQuery iaitu cara untuk reset borang. Reset borang adalah antara elemen-elemen yang dimasukkan kedalam borang (selain input validation, input constraint, etc) tetapi ianya bukanlah mandatori, bergantung pada jenis borang. </p>
<p>Jika tak kena cara, menambakah serabut dan rimas pada pengguna. Dibawah adalah contoh kod javascript yang menggunakan library jQuery.</p>
<pre class="javascript" name="code">
$('#reset_button').click(function(){
  $(':input','#myform')
    .not(':button, :submit, :reset, :hidden')
    .val('')
    .removeAttr('checked')
    .removeAttr('selected');
})
</pre>
<p>Tetapi terdapat kelemahan didalam cara diatas dimana jika sesuatu elemen mempunyai <strong>nilai lalai</strong> (default value), ianya akan dipadamkan sekali. Dibawah adalah contoh input yang mempunyai nilai lalai.</p>
<pre class="html" name="code">
<input type="text" name="something" value="W00t!" />
</pre>
<p>Maka cara terbaik adalah menggunakan function reset dimana nilai untuk elemen akan dikembalikan kepada nilai yang berada didalam attribute &#8216;value&#8217;.</p>
<pre class="javascript" name="code">
$('#reset_button').click(function(){
   $('#myform')[0].reset();
})
</pre>
<p><strong>Tips:</strong> Jika anda menggunakan cara yang kedua (iaitu menggunakan function reset()), elakkan daripada mengguna &#8216;reset&#8217; sebagai ID elemen anda. Nanti tak jadi!</p>
<p>Selamat programming!</p>
<p>Sumber:</p>
<ul>
<li><a href="http://stackoverflow.com/questions/680241/reset-form-with-jquery">Reset form with jQuery</a></li>
<li><a href="http://groups.google.com/group/jquery-dev/msg/2e0b7435a864beea?pli=1">Form reset retain default value</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/04/reset-borang-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSS &#8211; Burn CD/DVD</title>
		<link>http://sembangprogramming.com/2010/02/oss-burn-cddvd/</link>
		<comments>http://sembangprogramming.com/2010/02/oss-burn-cddvd/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 02:23:43 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=282</guid>
		<description><![CDATA[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).
]]></description>
			<content:encoded><![CDATA[<p>Bagi mereka yang hanya hendak burn CD, tanpa segala benda lain (CD Label Designer, etc) yang tak diperlukan, saya cadang menggunakan <a href="http://infrarecorder.org/">Infra Recorder</a>. Ianya percuma dan sumber terbuka (open source).</p>
<p><a href="http://sembangprogramming.com/wp-content/uploads/2010/02/screenshot_main.png"><img class="aligncenter size-medium wp-image-283" title="screenshot_main" src="http://sembangprogramming.com/wp-content/uploads/2010/02/screenshot_main-300x214.png" alt="" width="300" height="214" /></a></p>
<p>Saiznya yang kecil (3.27MB) juga membuatkannya senang untuk digunakan di  mana sahaja (download je bila nak guna).</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/02/oss-burn-cddvd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Menghasilkan screenshot lengkap laman web</title>
		<link>http://sembangprogramming.com/2010/01/menghasilkan-screenshot-lengkap-laman-web/</link>
		<comments>http://sembangprogramming.com/2010/01/menghasilkan-screenshot-lengkap-laman-web/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 04:41:05 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=265</guid>
		<description><![CDATA[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, [...]]]></description>
			<content:encoded><![CDATA[<p>Perisian apa yang anda gunakan untuk menghasilkan screenshot? Saya menggunakan <strong><a href="http://www.hoverdesk.net/freeware.htm">hoversnap</a></strong> untuk mengambil screenshot harian, tetapi menggunakan plugin khas untuk membuat screenshot laman web.</p>
<p>Ini kerana hoversnap tidak dapat mengambil keseluruhan isi kandungan laman web tersebut. Setakat yang hujung sahaja, kalau content bawah kena scroll dan ambil semula.</p>
<p>Mungkin anda menggunakan perisian lain, tetapi bagi tugasan sebegini, saya menggunakan <a href="https://addons.mozilla.org/en-US/firefox/addon/1146">Screengrab!</a>, plugin firefox. Kelemahannya, ambil screenshot pada firefox sahaja.</p>
<p>Berikut adalah contoh screenshot yang diambil..<br />
<br/><br />
<a href="http://sembangprogramming.com/wp-content/uploads/2010/01/screengrab1.png"><img src="http://sembangprogramming.com/wp-content/uploads/2010/01/screengrab1-145x300.png" alt="" title="screengrab" width="145" height="300" class="aligncenter size-medium wp-image-267" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/01/menghasilkan-screenshot-lengkap-laman-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Belang pada table (zebra stripe)</title>
		<link>http://sembangprogramming.com/2010/01/belang-pada-table-zebra-stripe/</link>
		<comments>http://sembangprogramming.com/2010/01/belang-pada-table-zebra-stripe/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 04:34:22 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=255</guid>
		<description><![CDATA[Berikut adalah cara untuk format table supaya mempunya &#8216;zebra stripe&#8216;. 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Berikut adalah cara untuk format table supaya mempunya &#8216;<strong>zebra stripe</strong>&#8216;. Sesetengah orang kata, bantuan yang diberikan oleh zebra stripe ni hanyalah mitos dalam meningkatkan keboleh bacaan data dalam bentuk jadual (tabular). Data daripada kajian (<strong><a href="http://www.alistapart.com/articles/zebrastripingdoesithelp/">Zebra Stripes: Does it really help?</a></strong>) yang dijalankan oleh Jessica Enders di A List Apart menyatakan yang ianya membantu. Pada diri saya, ia membantu, entahlah, lain orang lain cara dibantu.</p>
<p>Berikut adalah cara saya menggunakannya dalam bentuk javascript.</p>
<pre class="javascript" name="code">
$(document).ready(function(){
  $("table tbody tr:nth-child(odd)").addClass("odd");
})
</pre>
<p>Dimana ia akan memasukkan class &#8216;odd&#8217; kedalam baris yang ganjil dan formatkan dalam bentuk berikut:</p>
<pre class="css" name="code">
tr.odd{ background-color: #C3D9FF; }
</pre>
<p>Edit: Terlupa nak beritahu, anda memerlukan jquery.</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2010/01/belang-pada-table-zebra-stripe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Memastikan input betul di dalam Perl</title>
		<link>http://sembangprogramming.com/2009/12/memastikan-input-betul-di-dalam-perl/</link>
		<comments>http://sembangprogramming.com/2009/12/memastikan-input-betul-di-dalam-perl/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:15:58 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=219</guid>
		<description><![CDATA[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) = @_;

    [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<pre class="perl" name="code">
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 &#038;&#038; $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;
</pre>
<p>Agak panjang, kan?<br />
Ianya mudah digunakan cuma include didalam Perl script anda.</p>
<pre class="perl" name="code">
use input_lib;

if(input_validate($foo, 'required|integer')){ die("Sila masukkan integer sahaja"); }
</pre>
<p>Mungkin ada cara yang lebih baik? Jom sembang di bahagian komen.</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/12/memastikan-input-betul-di-dalam-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Membasmi input-input durjana didalam Perl</title>
		<link>http://sembangprogramming.com/2009/11/membasmi-input-input-durjana-didalam-perl/</link>
		<comments>http://sembangprogramming.com/2009/11/membasmi-input-input-durjana-didalam-perl/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 04:58:11 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[sekuriti]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=198</guid>
		<description><![CDATA[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 &#8220;penetration testing&#8221; (singkatan pen test) yang akan [...]]]></description>
			<content:encoded><![CDATA[<p>Memandangkan saya banyak menggunakan Perl/CGI sejak kebelakangan ni, post ni adalah berkaitan dengan perl/cgi. </p>
<p>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 &#8220;<a href="http://en.wikipedia.org/wiki/Penetration_test">penetration testing</a>&#8221; (singkatan pen test) yang akan merungkaikan segala kelemahan yang telah diabaikan selama ini didalam pembangunan perisian tersebut.</p>
<p>Apabila terjadi begitu, maka bermulalah operasi menampal perisian daripada lubang-lubang sekuriti tersebut. Bagi kebanyakan input daripada pengguna dalam Perl/CGI, menggunakan &#8220;<strong>placeholder</strong>&#8221; adalah mencukupi untuk menyimpannya dengan selamat dalam pangkalan data (database) mengelakkan daripada SQL Injection. Rujuk article di perlmonks untuk penerangan lanjut, <strong><a href="http://www.perlmonks.org/?node_id=661423">Preventing SQL injection attacks: Placeholders are enough for MySQL, Postgresql and SQLite.</a></strong></p>
<p><a href="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"><img src="http://sembangprogramming.com/wp-content/uploads/2009/11/exploits_of_a_mom-300x92.png" alt="exploits_of_a_mom" title="exploits_of_a_mom" width="300" height="92" class="aligncenter size-medium wp-image-202" /></a></p>
<p><strong>Apa bendakah itu &#8220;placeholder&#8221;?</strong><br />
Placeholder adalah nilai yang digunakan untuk menggantikan sesuatu nilai yang lain. </p>
<p>Berikut adalah contoh penggunaan placeholder.</p>
<pre class="perl" name="code">
$sth = $dbh->prepare( "SELECT name WHERE city = ? AND state = ?" );
$sth->execute( $city, $state );
</pre>
<p>Dengan menggunakan placeholder, modul <a href="http://search.cpan.org/~timb/DBI/DBI.pm">DBI</a> akan secara automatik menguruskan isu-isu &#8220;quoting&#8221; (escape single/double quote, e.g. \&#8221;) didalam nilai yang dihantar kepada pangkalan data.</p>
<p><strong>Kekurangan &#8220;placeholder&#8221;</strong><br />
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.<br />
Jika input tersebut adalah berbentuk HTML, tukarkan semua character ke dalam <a href="http://search.cpan.org/~gaas/HTML-Parser-3.64/lib/HTML/Entities.pm">HTML Entities</a>, untuk mengelakkan daripada kes-kes <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS (Cross-site Scripting)</a>. Jika tiada HTML dibenarkan, gunakan <a href="http://search.cpan.org/~podmaster/HTML-Scrubber-0.08/Scrubber.pm">HTML::Scrubber</a> untuk sental semua html daripada input tersebut.</p>
<p>Berikut adalah contoh untuk menukarkan character-character ke bentuk HTML Entity</p>
<pre class="perl" name="code">
use HTML::Entities;
sub html_to_db{
    my ($html) = @_;
	$html = encode_entities($html);
	$html =~ s/\r\n//gs;
	return $html;
}
</pre>
<p>Marilah kita sama sama <strong>belajar mempertahankan diri</strong> daripada anasir-anasir yang tak diingini apabila membangunkan perisian.</p>
<p><a href="http://sembangprogramming.com/wp-content/uploads/2009/11/249141325_4913641b29.jpg"><img src="http://sembangprogramming.com/wp-content/uploads/2009/11/249141325_4913641b29.jpg" alt="249141325_4913641b29" title="249141325_4913641b29" width="500" height="274" class="aligncenter size-full wp-image-204" /></a></p>
<p>Selamat programming!</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/11/membasmi-input-input-durjana-didalam-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Menggunakan notepad sebagai diari</title>
		<link>http://sembangprogramming.com/2009/09/menggunakan-notepad-sebagai-diari/</link>
		<comments>http://sembangprogramming.com/2009/09/menggunakan-notepad-sebagai-diari/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 18:20:40 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[Tip]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=169</guid>
		<description><![CDATA[Bagi seseorang yang nak benda paling simple sekali untuk buat diari, takyah install apa apa, anda hanya perlu notepad.
Bagaimana?

Buka notepad (Start->Run->notepad.exe)
Taip &#8220;.LOG&#8221; pada baris pertama.
Save (namakan apa apa pun tak kisah) dan tutup fail. Bila anda bukanya semula, secara automatik ia akan menulis tarikh dan masa.


Sumber

Use Windows Notepad as your electronic diary

]]></description>
			<content:encoded><![CDATA[<p>Bagi seseorang yang nak benda paling simple sekali untuk buat diari, takyah install apa apa, anda hanya perlu notepad.</p>
<p><strong>Bagaimana?</strong></p>
<ol>
<li>Buka notepad (Start->Run->notepad.exe)</li>
<li>Taip &#8220;<strong>.LOG</strong>&#8221; pada baris pertama.</li>
<li>Save (namakan apa apa pun tak kisah) dan tutup fail. Bila anda bukanya semula, secara automatik ia akan menulis tarikh dan masa.</li>
</ol>
<p><br/><br />
<strong>Sumber</strong></p>
<ul>
<li><a href="http://geekyninja.com/archives/use-windows-notepad-as-your-electronic-diary-easter-egg/#">Use Windows Notepad as your electronic diary</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/09/menggunakan-notepad-sebagai-diari/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
