OSS – Burn CD/DVD
Posted by mkhairulBagi 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 mkhairulPerisian 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.
Belang pada table (zebra stripe)
Posted by mkhairulBerikut 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 mkhairulLibrary 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.
Asas dan Pengenalan C++
Posted by mkhairulE-buku yang disediakan oleh En. Najmi (teruskan usaha!) dan diuploadkan oleh beliau ke Scribd.
Asas dan Pengenalan C++ dalam Bahasa Melayu
Saya pun tak berapa reti C++, maklumlah selama bekerja ni tak berpeluang nak guna.
Membasmi input-input durjana didalam Perl
Posted by mkhairulMemandangkan 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.
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.
Selamat programming!
Contoh wiki yang menarik
Posted by mkhairulBerikut adalah contoh-contoh wiki yang dihasilkan untuk memudahkan pembangunan sesebuah perisian.
Oleh kerana sekarang saya guna perl, saya cuba memperkenalkan Perl Coding Standard pada adik-adik fresh grad di syarikat sekarang ni dengan menulisnya didalam wiki untuk kegunaan semua developer.
Saya juga meluangkan masa untuk mengajar mereka yang ingin belajar memasukkan atau menyunting maklumat didalam wiki.
Code review juga adalah antara proses yang cuba saya perkenalkan tetapi agak terbantut untuk menerangkannya kerana terlalu banyak mindset yang berbeza untuk mengadaptasikan penjelesan saya.
Marilah berkongsi wiki-wiki menarik yang pernah anda gunakan (layari), kecuali wikipedia, harap maklum.
Berhutang didalam pembangunan perisian
Posted by mkhairulDah lama pula tak post. Berikut adalah berkenaan dengan Technical Debt.
Berhutang atau lebih dikenali sebagai “Technical Debt” adalah metafor yang direka oleh Ward Cunningham didalam aktiviti pembangunan perisian.
Terdapat 2 jenis hutang, iaitu ianya dilakukan dengan sengaja atau tidak sengaja. Sila baca pautan-pautan yang diberikan diatas untuk makluman lanjut.
Satu senario yang biasa saya jumpa adalah dimana..
Abu: “Aku rasa kita kena buat SOP atau guideline untuk setup environment development kita ni”
Ahmad: “Kita tak ada masa, kita kena siapkan feature-feature ni dalam bulan ni”
Abu: “Bukan kita kena fokus terus buat SOP atau guideline ni, setiap kali dimana antara kita setup, kita tulis langkah-langkah dia pastu kita try la kalau ada tak betul kita tambah dan perbaiki, bukannya nak kena formal pun. Nanti orang baru masuk kita bagi benda ni terus boleh buat sendiri.”
Ahmad: “Ok, ok takpe, nanti ada masa nanti kita buat”
Kemudian, ada orang baru masuk dan perlukan persekitaran pembangunannya disetup. Ahmad pergi tolong, setup IDE nya dan web server. Apabila nak setup perisian, dia menunjukkan cara pembangunan di tempat kerja itu, dan sampai satu tahap untuk run test (unit testing), ada yang gagal. Sambil menggaru kepala, dia cuba debug. Selepas 1 jam, dia panggil Aiman, rakan sekerja nya.
Ahmad: “Aiman, test ni fail la. Aku tak pasti apa masalah”
Aiman: “Ok, meh aku tengok”
Selepas 1 jam.
Aiman: “Aku pun tak tau. Jap aku gi cari Ali.”
Ali pun datang.
Ali: “Erm, jap aku test… Macam ni takleh.. oh korang lupa nak tukar setting kat config dia nih. Jap aku tukar.”
Ali: “Ok, settle.”
Lalu mereka pun pulang ke tempat masing-masing untuk sambung kerja mereka.
Nampak tak apa masalah kat sini? Macam mana kalau ada orang baru lagi masuk? Takkan sampai 3 orang kena datang untuk menyelesaikan masalah akar sebegini. Takde guideline untuk setup persekitaran pembangunan. Bukan terhad pada isu begini sahaja, macam macam lagi isu seperti tiada piawaian untuk mengkod (coding guideline), nota-nota penyelesaian yang bertulis (dalam word pun ok) yang boleh dikongsi bersama.
Sedar tak sedar, ini semua adalah hutang. Dimana kadar faedahnya bertambah hari demi hari dan jika tiada kesedaran untuk membayar “hutang” ini, akan membawa padah (dari segi mental ataupun kewangan).
Jadi, marilah kita bersama-sama sedari akan hutang-hutang yang mengelilingi pinggang kita dan membuat persiapan untuk membayarnya dengan menjadi lebih peka.
Selamat programming!
Perl 5.11 telah dikeluarkan (release)
Posted by mkhairulBagi sesiapa yang menggunakan perl, keluaran baru Perl, iaitu versi 5.11 kini boleh diperolehi. Ianya adalah ‘development release’ dimana pengguna perl boleh menggunakannya untuk menyesuaikan aplikasi-aplikasi ataupun skrip skrip supaya serasi dengan keluaran 5.12 yang akan datang.
Saya kini bekerja disyarikat yang menggunakan perl sebagai pelantar (platform) pembangunan aplikasi web, jadi perkembangannya harus saya ikuti untuk mengelakkan diri daripada terperangkap didalam jerangkap (pitfalls) didalam pembangunan perisian menggunakan perl.
Sumber:
- CamelCase
- Banding antara skema pangkalan data (compare database schema) dalam MSSQL
- Clean Code Cheatsheet
- Apakah itu cheatsheet?
- Tor
- Rekabentuk dan Kebolehgunaan Antaramuka Pengguna
- Persiapan dalam Pembangunan Perisian
- Peranan Firefox dalam Pembangunan Web
- Kepentingan penggunaan framework didalam pembangunan aplikasi
- Contoh wiki yang menarik
- July 2010 (2)
- June 2010 (3)
- May 2010 (1)
- April 2010 (4)
- March 2010 (1)
- February 2010 (1)
- January 2010 (2)
- December 2009 (1)
- November 2009 (3)
- October 2009 (2)
- September 2009 (8)
- August 2009 (7)
- javascript (3)
- open source (1)
- pengalaman (1)
- perl (4)
- programming (4)
- sekuriti (3)
- Tip (17)
- ui (1)
- Umum (14)
- Web (10)
- mkhairul.com Laman web mkhairul, coretan pengalaman dan tips. Bahasa Inggeris
- Sembang Komputer Membantu anda dalam menyelesaikan permasalahan harian berkaitan dengan komputer.
Pos Terkini
Pos Popular
Archives
Kategori
Blogroll
Search
Langgan
Komen Terkini
- adi on Content-aware fill didalam Photoshop CS5
- peihong on Menghasilkan screenshot lengkap laman web
- ashiena on Menggunakan notepad sebagai diari
- ashiena on Berhutang didalam pembangunan perisian
- ashiena on Belang pada table (zebra stripe)





