ArchivePage 4 of 5

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

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

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 <> "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

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]

Shortcut keys

On FF, using:

Ctrl + Shift + T for restore tab just closed.

Ctrl + Tab for jump between opening tab

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

Refer URL

Một kinh nghiệm khá hay khi khần view có liên quan đến permission (login required).

Bình thường tôi code phần này khá ẩu, nếu user truy cập vào 1 page đòi hỏi xác thực (authorized) thì tôi chỉ làm đơn giản là redirect nó sang login form. Nếu nhập đúng user & pass thì lại redirect nó về trang home. Vấn đề là ở đây. Khách hàng yêu cầu là khi login xong, phải trở lại đúng trang trước đó.

Dùng session để giải quyết. Okie, nhưng một số chỗ session chết sặc tiết. Vậy tại sao không đẩy nó lên URL nhỉ? Và nữa, viết thêm 1 cái hàm chuyên kiểm tra đã login hay chưa như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function check_login($uid)
 
{
    global $user,$base_url;
    if(!$user->uid) {
        $preURL = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header('Location: '.$base_url.'/member/login?target='.$preURL);
    }
}
 
function loginProcess() {
   //if login successful
      header('Location: '.$_GET['target']);
   //else set error message or redirect to login
   // code here...
}
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Show Desktop.scf

Khi bị mất biểu tượng Show Desktop, dùng đoạn mã sau:

[Shell]

Command=2

IconFile=explorer.exe,3

[Taskbar]

Command=ToggleDesktop

Save as Show Desktop.scf & move it into C:\Documents and Settings\khanhdn\Application Data\Microsoft\Internet Explorer\Quick Launch
Phần in nghiêng tùy thuộc vào từng máy, thay đường dẫn thích hợp là okie.

p/s: cách hay làm là…sang 1 máy khác còn biểu tượng Show Desktop rồi copy về máy mình, paste vào theo đường dẫn như trên :D

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

Rename script

Đôi khi cần phải đổi tên file hàng loạt trên server. Ngoài cách “đơn giản” nhất, nhanh nhất (túm lại cái gì cũng nhất :D) là dùng shell script, thì còn cách nữa đó là dùng PHP script để đổi. Không yêu cầu nhiều về permission. Tất nhiên, cái giá phải trả ở đây là tốc độ thực thi ;) Với những thư mục có cỡ vài trăm nghìn file thì….thôi, đừng nên dùng cách này :))

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
34
35
36
/*
 * Created on Mar 28, 2008
 * Author: Do Nam Khanh
 * Email: donamkhanh@gmail.com
 * File name: rename.php
 *
 */
 
    error_reporting(E_ALL);
    @set_time_limit(0); // No time limit
 
    $f="data.txt";
    $ft=fopen($f,"r");
    if(!$ft) {
        echo "File is empty now.";
        exit;
    }
    else {
       $directory = dir('p');
        while (!feof($ft)) {
            $list=fgets($ft,1000);
            if($list!='') {
                $filename = trim(substr($list,11));
                while (false !== ($temp = $directory->read())) {
                    if ($temp{0}!='.' && $temp{0}!='..') {
                       $temp = trim($temp);
                        if($temp == $filename) {
                            if(!rename("p/$temp", "p/new/$list")) {
                                echo 'Error';
                            }
                        }
                    }
                }
            }
        }
    }
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

jWYSIWYG

 

Một trình editor tý hon cho web :yes:

Có lẽ mình nên chuyển sang dùng thằng này chăng? Cái mà thằng này đang thiếu là gì? Chắc chỉ cần thêm chức năng upload ảnh nữa là đủ rồi. Người dùng cần gì? Cũng chỉ là format đoạn văn bản, chèn ảnh, chèn link (riêng 2 cái chèn ảnh chèn link lại tuỳ vào đối tượng khách hàng mà có nhu cầu sử dụng khác nhau. Người thì chỉ cần lấy link ảnh ở chỗ khác paste vào là okie, người thì thích tự upload lên, rồi link điền vào luôn, nguời thì thích upload riêng rồi browse chọn file để lấy link….) đủ kiểu.

Dù thế nào thì tôi cũng rất khoái thằng editor này, nhỏ gọn. Ít ra có thể áp dụng cho phần guest form :yes:

Hứng thú với editor này? Mời bạn vào link này để biết thêm: http://code.google.com/p/jwysiwyg/

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

Whois domain version 3.0

Nâng cấp bản 1.0 lên thành 3.0, cho phép quick check theo phần mở rộng của domain.

Một số tính năng mới:

  1. Phần mở rộng có thể tùy biến bằng cách thêm vào trong file list_ext.txt (phân cách nhau bằng ký tự Enter: \n).
  2. Lưu lại các domain đã được check vào file checked_domain.txt.
  3. Tốc độ quick check nhanh (chỉ sử dụng nslookup).

Hàm chính của version lần này chính là hàm quick_checklist_extension

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
function quick_check($domain,$ext) {if(empty($domain))
 
echo 'You must enter domain name to check.';
 
else
 
{
 
if(!eregi("^([[:alnum:]-])+$",$domain))
 
echo 'Domain name contain alphabet, number & dash character only.';
 
else
 
{
 
$data = popen("(nslookup -timeout=5 -query=ANY -nodef $domain$ext)2>&1","r");
 
$result = '';
 
while (!feof($data))
 
{
 
$result.= fgets($data, 1000);
 
}
 
$find = stripos($result, "can't find");
 
if($find=== false) {
 
echo "<span class="\">$domain$ext</span>  This domain has taken. (<a href="\">whois</a>)";
 
}
 
else
 
echo "<span class="\">$domain$ext</span>  This domain has available."; 		}
 
$fp=fopen("checked_domain.txt","a");
 
fwrite($fp, $domain.$ext."t".date("H:i:s - d/m/Y")."n");
 
fclose($fp);
 
}
 
}
 
function list_extension()
 
{
 
$filename = 'list_ext.txt';
 
$handle = fopen($filename,"r");
 
$data = fread($handle,filesize($filename));
 
$ext = explode("n",$data);
 
$list_ext = '';
 
if(count($ext)!=0) {
 
for($i=0;$i &lt; count($ext);$i++)  {
 
if($i%3==0)
 
      $list_ext.='
 
<input name="ext" type="checkbox" value="'.$ext[$i].'" />'.$ext[$i].'';
 
else
 
       $list_ext.='
 
<input name="ext" type="checkbox" value="'.$ext[$i].'" />'.$ext[$i].'';
 
}
 
return $list_ext.'
 
 
 
Check all ';
 
}
 
else {
 
return '
 
List extension not available. ';
 
}
 
}

Demo: http://donamkhanh.info/lab/ajax/whoisv3

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

Drag n Drop Islands

Kéo và thả nào :D

Giờ chưa có thời gian viết code cụ thể được, cứ để link demo đã, khi nào rảnh quay lại viết sau :p

http://donamkhanh.com/lab/ajax/drag_n_drop_island

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