Form validation

May 28th, 2008

Ngày trước tôi chỉ cần check cái input form (hữu hạn) để nó khác rỗng.

Ngày nay tôi phải:

  1. Check cả kiểu dữ liệu
  2. Check cả format (số điện thoại, số thẻ tín dụng…)
  3. Check các field mà không biết nó có thể tạo ra được bao nhiêu.
  4. Check các field & các field này ràng buộc với nhau. Từ trên xuống, có. Từ trái qua phải, có. Check chéo cũng có…
  5. … và nhiều cái phải check nữa sau này, qua quá trình làm việc sẽ dần dần đúc kết được thôi mà :)

Basic concept của 1 web developer khi validate form đó là…phải luôn focus dữ liệu. Thông báo được lỗi là tốt, nhưng chỉ ra lỗi vì đâu, lỗi ở chỗ nào, càng cụ thể thì càng tốt…cho người dùng (chứ dev thì mệt bỏ cha :D)

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

How to select the first option in a combo box?

May 13th, 2008

Simply in jQuery (a Javascript framework - Write less, do more):

View CodeJAVASCRIPT
1
$("#div_id option:first).attr("selected","selected"); 

Example: 

View CodeJAVASCRIPT
1
2
3
4
5
6
7
8
$('#myCombo').load(
                              'my_combo.php?foo=bar',                              
                               function() {                                 
                                     $('#myCombo option:first).attr("selected","selected");                               
                               }                      
                      );
html:
<select id="myCombo"></select>
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Installed Simple Captcha system

May 8th, 2008

Installed Simple Captcha system to hinder spammer :|

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

DirectoryIndex vs RewriteEngine

May 6th, 2008

Tôi dùng modRewrite cho site hanhnguyenhotel.com. Mọi chuyện đều ổn nếu như thằng Kid không yêu cầu có cái trang intro (index.html). Mặc dù tôi đã để default file là index.html nhưng vẫn không ăn thua:

1
2
3
4
5
Options -Indexes
DirectoryIndex index.html index.php
RewriteEngine on
RewriteCond $1 !^(index\.html|modules|robots\.txt)
RewriteRule ^(.*)$ index.php?mod=$1 [L,QSA]

Chính xác thì phải thế này:

1
2
3
4
5
6
7
8
9
10
11
Options -Indexes
<IfModule mod_rewrite.c>
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</ifmodule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(index\.html|modules|robots\.txt)
RewriteRule ^(.*)$ index.php?mod=$1 [L,QSA]
</ifmodule>

Okie, work fine!!!

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Export to CSV file

April 28th, 2008
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$row[] = 'Column 1'; 
$row[] = 'Column 2'; 
$row[] = 'Column 3'; 
$data .= implode(',', $row)."n"; // Join all values without any trailing commas and add a new line 
 
$row = ''; // We must clear the previous values 
$row[] = 'Value of column 1'; 
$row[] = 'Value of column 2'; 
$row[] = 'Value of column 3'; 
$data .= implode(',', $row)."n"; 
 
// Output the headers to download the file 
header("Content-type: application/x-msdownload"); 
header("Content-Disposition: attachment; filename=file.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
echo $data;

Đại khái cú pháp để có thể export ra file csv là:
- Dòng đầu tiên là tên các cột, đặt trong dấu “…” và phân cách nhau bởi dấu phẩy.
- Các dòng còn lại là các giá trị của cột tương ứng, khi gặp ký tự kết thúc hàng thì sẽ tự động (?) tạo hàng mới.
- Cuối cùng gọi header tương ứng.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

6 giai đoạn của một người học lập trình (*)

April 28th, 2008

Để học bất cứ một ngôn ngữ lập trình nào những người mới bao giờ cũng phải trải qua 6 giai đoạn.

1. Quan niệm
2. Thử nghiệm
3. Trải nghiệm
4. Kiểm nghiệm
5. Chiêm nghiệm
6. Sáng tạo

Quan niệm
Hãy xác định nhiệm vụ học cho các bạn. Không có định hướng, không còn tầm nhìn bao quát về thế giới phần mềm và không có cá tính, bạn chắc rồi cũng rời bỏ sớm ngành phần mềm nếu không thì cũng chỉ là một coder hay tester ba phải, người mà lúc nào cũng chỉ được coi là một nhân vật bình thường về mọi mặt, không có sự nổi bật và luôn đứng đầu trong đề cử danh sách về hưu non.

Tiêu chuẩn số 1 của một nhà phát triển phần mềm giỏi là sự đề cao tự học. Trường lớp hay trung tâm không phải là nơi đáng tin cậy để học vì người giỏi ko bao giờ chịu mài đũng quần trên ghế bục giảng để giảng đi giảng lại một thứ kiến thức liên tục cũ đi sau vài tháng. Nếu người giỏi thích nói chuyện thì conference là chỗ của họ vì họ thích trao đổi với các industry expert chứ không phải là dọa dẫm học viên.

Diễn đàn này cũng có thể là nơi để học hỏi nhưng đừng nghĩ là người có hiểu biết sẽ trả lời bạn một cách tường tận và chi tiết như thể họ là ông nội của bạn vậy. Muốn họ trả lời hãy học cách hỏi, trước khi hỏi hãy search. Sau khi nhận được câu trả lời hãy search.

Thử nghiệm
PHP là một công nghệ bao gồm có 6 bộ phận:
+ Bộ thông dịch
+ Ngôn ngữ
+ Cấu trúc dữ liệu
+ Các thuật toán trên dữ liệu hay còn gọi là các API
+ Các công nghệ đi kèm hoặc có thể giao tiếp được với PHP.
+ Các best practice đặc thù của riêng công nghệ đó.

Hãy tập cài đặt bộ thông dịch PHP, Apache, MySQL và chạy triển khai các ứng dụng PHP có sẵn.
Hãy thử nghiệm ngôn ngữ PHP với các vòng lặp, điều kiện, in, nhúng HTML, làm quen function, method, class
Cấu trúc dữ liệu là một phần khác của PHP. Ở công nghệ này Hash, Array và Map đều được gộp vào kiểu array. Rất dễ chịu cho bạn khi bạn đã từng làm quen với các cấu trúc dữ liệu của C# hay Java.
Cấu trúc dữ liệu không phải là một cấu trúc chết. PHP cung cấp khoảng hơn 1000 function (API) xử lý nó. Array là một kiểu như vậy. DOM là một kiểu khác. Làm bài tập trên các API dạng này là một cách tốt để làm quen với ngôn ngữ và bộ thông dịch. Các bài tập có thể chỉ là in ra một cái resume, tạo một cái layout đơn giản nhất từ việc sử dụng include, tạo một form nhập liệu đơn giản, tạo một form upload đơn giản…

Tài liệu sách vở thì có rất nhiều. Bạn nên đọc các chương trong PHP Manual. Đọc các tutorial trên mạng và luyện tiếng Anh. Các ebook đáng chú ý:

++ Apress Beginning PHP and MySQL 5 From Novice to Professional 2nd Edition (2006)
++ Apress Beginning PHP and PostgreSQL E.Commerce (2006)
++ Prentice Hall PHP 5 Power Programming (2004)
++ O’reilly Programming PHP 2nd Edition (2006)

Các công nghệ đi kèm với PHP là một thế giới cực kì phức tạp. Bạn có thể sẽ làm quen với các công nghệ opcode hay biên dịch mã PHP ra mã nhị phân để chạy thay vì nhìn nó dưới dạng text. Nó là một extension nguồn mở của công nghệ PHP. Bạn cũng có thể quan tâm đến việc sử dụng PHP để giao tiếp với các hệ thống con trong Linux như shared memory, gettext, socket, stream… Socket và stream là các công cụ vạn năng để PHP giao tiếp với các hệ thống phần cứng và phần mềm. Bạn cũng có thể quan tâm đến sử dụng PHP và C trên cùng một file PHP thông thường hay nhúng mã dll của các thư viện trên Windows vào PHP và sử dụng lại. PHP làm việc này thông qua việc sử dụng một ext. mã nguồn mở do Wez viết có thể tải về PECL. Bạn cũng có thể quan tâm đến việc sử dụng PHP để viết các ứng dụng desktop mà bạn có lẽ vẫn dùng VB để viết bằng cách sử dụng thư viện GTK.

Tuy nhiên điều bạn có thể sẽ quan tâm hơn cả là liệu PHP được hỗ trợ như thế nào để giao tiếp với các hệ thống khác. PHP có thư viện để giao tiếp với Active Directory, LDAP, các hệ thống hỗ trợ SMTP/POP3/IMAP/FTP/SSL, SMS Gateway, GIS server, Router… PHP được Java hỗ trợ tốt để trở thành một công nghệ trên Java platform và nhờ đó bạn có thể gọi các gói Java để sử dụng lại hay sử dụng các application server của Java như Sun One Webserver, Glassfish application server thay cho Apache server hoặc sử dụng các dịch vụ Java khác như OpenSSO. JSON và XML được hỗ trợ buit-in trong PHP cũng là phần rất đáng tìm hiểu vì các nhà công nghiệp phần mềm ở các tổ chức chuẩn công nghiệp như OASIS, ECMA hay W3C sử dụng các gọi này để giúp PHP hỗ trợ kiến trúc Webservice/SOA, SDA, MDA (phần này do IBM đóng góp cho cộng đồng PHP)…..

Phần PHP giao tốt tốt nhất có lẽ là database. OCI do Oracle đóng góp, DB2 do IBM đóng góp, libmysql do MySQL AB đóng góp và pgsql do cộng đồng PostgreSQL đóng góp và luôn hỗ trợ các bản database mới nhất. Ngoài ra PHP có sẵn một database server SQLite nhúng đi kèm với mọi bản PHP 5.0+ có thể giúp bạn tiện trong việc xử lý các nhóm data nhỏ nhưng đủ mạnh mẽ như Access.

PHP là một công nghệ đặc biệt và nó có các đặc trưng riêng như share nothing. Điều này làm cho PHP có tính scalability rất tốt và được các mạng xã hội rất chuộng. Không phải ngẫu nhiên mà Tim Bray, giám đốc các công nghệ Web của Sun lại cho là PHP có tính scalable hơn Java trên tầng presentation (http://www.tbray.org/talks/php.de.pdf) trong khi từ trước đến nay họ vẫn tự hào là công nghệ Java cho họ thống trị thế giới web doanh nghiệp, các phần mềm ngân hàng và thị trường viễn thông, vượt trội cho với công nghệ .NET của Microsoft. Đặc điểm này của PHP cũng là tâm điểm tạo ra các best practice mà bạn cần khai thác khi lập trình với PHP.

Trải nghiệm
Là giai đoạn bạn bắt đầu quan tâm đến việc dùng PHP để code các ứng dụng sản xuất bằng việc tự tin sử dụng các API. Giai đoạn này hoàn toàn phù hợp với việc lấy một chứng chỉ Zend nếu bạn muốn. Tuy nhiên Zend chỉ chứng nhận bạn là có kĩ năng để nhớ API, một điều khá cần để code API với notepad Đặc trưng của giai đoạn này là thực hành để có các cảm nhận chung về kĩ năng code. Giai đoạn này sẽ đem lại cho bạn một niềm tự hào trẻ con nhưng rất cần thiết. Giai đoạn này bạn sẽ phải kết hợp PHP với CSS/XHTML, graphic design, SQL, web authoring, Javascript, web hosting, system scripting… Là một lập trình PHP, bạn tự biết mình phải đa tài hơn các lập trình viên ASP.NET, nơi tooling thống trị kĩ năng handcode, hơn Java, nơi mà kĩ năng viết business logic được chú trọng hơn

Kiểm nghiệm
Nếu như giai đoạn trải nghiệm là giai doạn code bung bét, bug tùm lum, bảo mật bằng không thì đây chính là lúc bạn quan tâm đến việc refactor lại code. Bạn có thể tạo ra nhiều function và class hơn trong một nỗ lực cố gắng làm cho chúng modular hơn. Bạn sẽ cố áp dụng các thư viện như PEAR hay Smarty, PHPSavant vào ứng dụng của bạn để làm cho cách code của bạn đi vào chiều hướng ổn định. Lúc này bạn đã thấy được sự cần thiết phải có một coding convention nhất quán ([url=http://pcdinh.googlepages.com/phpvietnamcodingstandards]Reference[/url). Bạn sẽ quan tâm đến bảo mật hơn. Giai đoạn này sẽ giúp bạn có một lối tư duy chín chắn hơn nhưng nhiều lo ngại hơn vì bạn cho rằng bạn vẫn chưa thực sự hiểu PHP.

Chiêm nghiệm
Đây là giai đoạn bạn đã tiến đến mức cao. Bạn đã nắm được bản chất của PHP. Bạn quan tâm đến cơ chế PHP vận hành ở mức compiler hơn. Bạn bắt đầu học UML, design pattern, tìm hiểu về các hệ thống lớn. Bạn đã vững vàng trong việc tạo ra các lớp và muốn tổ chức các lớp đó cho khoa học hơn. Bạn quan tâm đến các software engineering processes và tự hỏi làm sao để áp dụng XP, Scrum hay các agile methodology khác. Bạn sẽ quan tâm đến performance, object oriented engineering, database design, system architect, code review. Bạn sẽ bắt đầu chán Pear và ghét Smarty. Việc tương tác giữa PHP và các hệ thống khác như Python, Ruby, Jaav, Erlang .. trở nên quan trọng hơn với bạn lúc này vì cuối cùng thì bạn đã nhận ra PHP có nhiều điểm yếu nhưng không tới mức phải thay thế PHP bằng 1 giải pháp khác. Các công nghệ mã nguồn mở và tự do sử dụng phân phối như Java, Perl, Python, Ruby, JRuby, Groovy, Erlang, Lua… cho phép chúng tận dụng các thư viện của nhau cũng như các điểm mạnh riêng của nhau. Đó là thời gian bạn thấy sung sướng vì đã chọn 1 công nghệ nguồn mở như Java hay PHP hay Python.

Sáng tạo
Là giai đoạn cao nhất và cũng phức tạp nhất vì lúc này bạn đã hiểu công nghệ đến mức có thể triển khai các hệ thống lớn, customize và migrate các ứng dụng phức tạp. Có đủ tư duy và kiến trúc cũng như độ trải nghiệm thực tế để thiết kế hệ thống . Lúc này bạn đã có thể tự đặt cho mình mục tiêu làm các ứng dụng lớn với PHP kiểu như
+ Flickr: 60 000 LOC
+ Digg: 200 000 LOC
Bạn cũng có thể hoàn toàn tự tin dùng PHP để tạo ra các ứng dụng ERP, CRM, Forecast System vốn thường được code bằng Java, ASP.NET hay Delphi có truyền thống đắt đỏ, kén server, đòi hỏi nhiều tài nguyên. Lúc đó, PHP trong tay bạn đã vượt ra khỏi phạm vi của một công nghệ web vì bạn đã biết đủ PHP và mối quan hệ với các công nghệ bổ sung cũng như kinh nghiệm triển khai các công nghệ đó.

Bạn đột nhiên quan tâm nhiều đến các cuộc hội thảo. Bạn thấy kinh nghiệm của các industry expert thật cần thiết và gần gũi với khả năng của bạn. Có thể một lúc nào đó, bạn thấy mình gần như là một thought leader. Một lúc khác, bạn lại muốn nhập vai một C hacker.

Lúc này bạn đã lớn rồi. Ai dám khuyên bạn nữa chứ Cẩn thận, bạn có thể là một PHP Dictator đấy.

Tác giả: Phạm Công Định  

 (*) Tên bài viết do tôi tự đặt, vì bài viết này pcdinh reply 1 topic trên ddth.com nên không có title :)

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Working with checkbox

April 26th, 2008

Tôi thường hay dùng checkbox trong trường hợp list các record ra & cho phép chọn record tương ứng để xóa. Ngày trước, khi muốn lấy giá trị của các checkbox được chọn, tôi làm như sau:

1
2
3
4
5
6
7
8
9
if(is_array($_POST['checkbox_name'])) {
    $list_selected_id = '';
    foreach($_POST['checkbox_name'] as $key =&gt; $val) {
        $list_selected_id .= ','.$val;
    }
 
    $list_selected_id = substr($list_selected_id,1);
    //output will be: 1,2,3,...,n
}

Còn ngày nay, chỉ với 1 dòng đơn giản như sau:

1
$list_selected_id = implode(',', $_POST['checkbox_name']);

Hix, quá ngắn gọn, quá sáng sủa :(

Và thêm 1 điều nữa, tôi thấy Drupal (và các framework khác) thường dùng cách implode mảng để build các câu SQL. Quả thực khi áp dụng đúng lúc đúng chỗ thì phát huy tác dụng khỏi phải bàn cãi :D

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Sắp xếp quỹ thời gian

April 18th, 2008

Dạo này tôi khá là bận rộn. Dự án ở cty thì chưa căng nhưng dự án riêng thì khá căng. Do làm fulltime nên chỉ có thể tranh thủ được buổi tối & ngày CN. Thật sự là với quỹ thời gian như vậy, khó mà đảm bảo được (tiến độ, sức khỏe…) cho nên tôi cũng chỉ dám nhận những dự án nhỏ xíu, rồi “ốp” con tagCMS vào chứ không đủ can đảm nhận cái to (mặc dù có thể làm được).

Vậy làm thế nào để có thể bố trí, tổ chức được quỹ thời gian của mình? Tôi chẳng tham công tiếc việc gì cho cam. Gì chứ riêng có người yêu bên cạnh thì code vứt sang 1 bên, deadline 1 bên nhá hehe…

Tạm thời là giờ cứ phải lên lịch sẵn những công việc cần phải làm & hoàn thành. Mặt khác phải nhanh chóng nâng cấp cái tagCMS cho nó uyển chuyển hơn nữa thì sẽ tiết kiệm được nhiều thời gian hơn. Nhưng để ra được phiên bản tagCMS ưng ý thì sẽ phải trả giá bằng kinh nghiệm, bằng các dự án web khác.

Cố gắng, cố gắng, cố gắng en nờ (n) lần.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Getting Started with Zend Framework

April 14th, 2008

Nghe nói về Zend Framework (ZF) rất nhiều nhưng không hề muốn động vào nó tý nào :p Cũng chẳng biết tại sao lại thế? Do nó “cồng kềnh” quá chăng? Tôi vẫn khoái dùng CodeIgniter hơn (đã viết xong 1 blog & chạy khá ngon - tuy nhiên giờ thì lại dùng…WP ).

Nhưng sáng nay “bác” PM bắt đầu assign tôi vào dự án của ZF team. Vậy là download ngay latest version, install & ngâm kíu thôi

Bước đầu tra manual + tutorial thì thấy dùng cũng không quá khó (tất nhiên là ko 100% APIs của ZF). “Moi” lại code của dự án thấy vấn đề đầu tiên & khá nổi cộm là việc dùng Smarty kết hợp với ZF. Sẽ không có gì đáng nói nếu như “ai đó” parse template theo kiểu mỗi action ứng với 1 template (html), và mỗi template này lại bê nguyên xi những cái không thay đổi (hoặc rất ít) vào

Cách sửa đơn giản nhất là viết lại template kiểu như:

1
{include file='header.tpl'}

vào đầu mỗi template của action.
Nhưng nếu làm như vậy thì vẫn chưa tiện vì mỗi trang template tôi vẫn phải viết thêm các dòng code ở trên ứng với header, footer, sidebar (những cái luôn xuất hiện). Mà tính tôi thì lười. Đã quen với kiểu nhiều script 1 trang, chứ ko quen kiểu mỗi script một trang.

Đằng nào cũng là ngồi “tự sướng”, vậy là tôi quyết định viết 1 cái class nhỏ xíu, để parse template giống như thằng CodeIgniter (cả Drupal) nữa. Mất cũng hơn nửa tiếng loay hoay vì cứ nghĩ cái method bên dưới là của Smarty:

1
$this->view->render('templateDir/templateFile.html');

hoá ra method render là của thằng Zend_View.

Và class tôi viết lại đơn giản như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * Created on Apr 14, 2008
 *
 * @author: Do Nam Khanh
 * @email: donamkhanh@gmail.com
 */ 
 
class dnkTemplate extends Smarty_View {
 
    function __contructor() {}
 
    function parseTpl($tplFile,$data) {
        $templates = array('header','content','footer');
        $output = "";
       if(is_array($data)) {
           foreach($data as $dataKey => $dataVal) {
                $this->assign($dataKey,$dataVal);
            }
           foreach ($templates as $file) {
                if ($file &lt;> "content") {
                    $output .= $this->fetch($file . '.html',null,null,false);
                }
                else {
                     $output .= $this->fetch($tplFile. '.html',null,null,false);
                }
             }
             echo $output;
 	}
         else {
             die('Could not parse template');
         }
    }
 }

Thật ra thì ý tưởng này tôi lấy của InkType, giờ chỉ modify lại cho nó tương thích với framework này mà thôi :p
Cách dùng thì rất đơn giản:

1
2
3
4
5
6
7
8
9
10
11
$this->view = new dnkTemplate();
...
$dataRow = array(
                 'title'                 => 'List CDs',
                 'base_url'           => $this->base_url,
                 'list_cd_link'       => $this->list_cd_link,
                 'add_cd_link'      => $this->add_cd_link,
                 'data'                => $data
            );
 
$this->view->parseTpl('list',$dataRow);

Tuy nhiên, muốn áp dụng vào project hiện tại không phải đơn giản, vì các thành viên khác sẽ phải viết lại toàn bộ template & sửa lại PHP code. Một khối lượng không nhỏ

Ngoài lề: Trong Ubuntu, mỗi lần tôi sửa file bằng Gedit thì sau khi save lại thấy xuất hiện 1 file backup kiểu như file_name.txt~. Cứ nghĩ là hệ điều hành có tính năng đó. Hoá ra là tính năng của thằng Gedit => disable ngay, ngứa mắt lắm:

It’s in the preferences. In Gedit, go to to Edit > Preferences and uncheck the option about automatically creating a backup file.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Buddy pouncer

April 12th, 2008

Một tính năng rất hay trong Pidgin. Bên Yahoo Messenger muốn dùng chức năng alert khi 1 nick đưọc chỉ định online, offline…thì thông báo, phải dùng thêm tiện ích thứ 3 thì mới được. Còn Pidgin đã có sẵn chức năng này. Nhìn ở ảnh bên dưới chắc hẳn bạn thấy nó nhiều tuỳ chọn như thế nào: hiện cửa sổ thông báo, send luôn message cho buddy…

Và chú em Nam $ là “vật thí nghiệm” đầu tiên hehe

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]