Kr@z7_&_U3vNtv_$>

Cài đặt jQuery Uploadify với CodeIgniter

Posted in Ubuntu by krazv7rvn9 on 15/12/2009

jQuery Uploadify là một plugin cho phép upload nhiều file lên server cùng một lúc. Bạn có thể tải Uploadify tại đây.
Do Uploadify dựa vào Flash để upload file, kiểu file gửi lên server bao giờ cũng là application/octet-stream, còn CodeIgniter lại chỉ hỗ trợ cơ chế kiểm tra file upload thông qua kiểu mimes để đảm bảo tính bảo mật của website, nên khi nhúng Uploadify vào CodeIgniter, chương trình sẽ không chạy theo ý mình.
Để sửa lỗi này, có 2 cách thường được dùng:
1 – Sửa lại CodeIgniter Upload library để nhận kiểu file thông qua file extension thay vì mime types.
2 – Sửa lại file config/mimes.php trong ứng dụng, thêm vào kiểu “application/octet-stream” vào các kiểu file cho phép upload.
Ngoài ra, ta có thể mở file .fla đi kèm với Uploadify và sửa lại nội dung file này để gửi kiểu file đúng cho CodeIgniter.
Đối với cách 1, nếu người dùng cố tình đổi đuôi file (vd, từ .png thành .exe), chương trình sẽ lập tức từ chối, không cho phép người dùng upload lên (vì sai đuôi). Cách 2 tối ưu hơn cách 1, nhưng giả dụ bạn có 1 trang chỉ cho phép upload văn bản .txt, một trang cho up ảnh .png, vậy bạn phải sửa lại config/mimes.php 2 lần liền. Như vậy khá là mất thời gian ngồi sửa từng dòng của config/mimes.php
Một cách trung gian là vẫn ứng dụng phép kiểm tra mimes của CI, nhưng thêm kiểu file “application/octet-stream” vào cho mỗi kiểu file được phép upload lên.
Ta thực hiện phương pháp này bằng cách viết phần mở rộng application/libraries/MY_Upload.php:

<?php
    class MY_Upload extends CI_Upload
    {
         var $uploadify = FALSE;

                function initialize($config = array()){
                     parent::initialize($config);
                     if (array_key_exists('uploadify', $config)) $this->uploadify = $config['uploadify'];
                }
            /**
         * Verify that the filetype is allowed
         *
         * @access    public
         * @param    allow_flash = FALSE
         * @return    bool
         */   
        function is_allowed_filetype()
        {
            if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
            {
                $this->set_error('upload_no_file_types');
                return FALSE;
            }
   
            $image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');
   
            foreach ($this->allowed_types as $val)
            {               
                $mime = $this->mimes_types(strtolower($val));
                if ($this->uploadify)
                    if (is_array($mime)) $mime[] = 'application/octet-stream';
                    else $mime = array($mime, 'application/octet-stream');                   
               
                // Images get some additional checks
                if (in_array($val, $image_types))
                {
                    if (getimagesize($this->file_temp) === FALSE)
                    {
                        return FALSE;
                    }
                }
   
                if (is_array($mime))
                {
                    if (in_array($this->file_type, $mime, TRUE))
                    {
                        return TRUE;
                    }
                }
                else
                {
                    if ($mime == $this->file_type)
                    {
                        return TRUE;
                    }   
                }       
            }
           
            return FALSE;
        }
    }

/* End of file : application/libraries/MY_Upload.php */
/* Author: Nguyen Dinh Trung <nguyendinhtrung141@gmail.com> */

Giờ ta có thể thực hiện việc upload thông qua Uploadify bằng các Controllers và View sau:

Controller : application/controllers/upload.php

<?php
class Upload extends Controller
{
    function Upload()
    {
        parent::Controller();
        $this->load->helper('form');
        $this->load->helper('url');
    }
     
     
    /*
    *    Display upload form
    */
    function index()
    {
         
        $this->load->view('form');
    }
     
    /*
    *    Handles JSON returned from /js/uploadify/upload.php
    */
    function uploadify()
    {
       
        $config['upload_path'] = APPPATH . 'assets/uploads/';
        $config['uploadify'] = TRUE;
        $config['allowed_types'] = 'csv';
        $config['max_size']    = '100';
        $config['max_width']  = '1024';
        $config['max_height']  = '768';
        $this->load->library('upload', $config);
        if (! $this->upload->do_upload('Filedata')){
            echo ($this->upload->display_errors());                       
        } else {
            foreach($this->upload->data() as $k => $v) echo "<strong>$k</strong> : <em>$v</em><br>";                   
        }         
    }
     
}
/* End of File /application/controllers/upload.php */

View: application/views/form.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jQuery Uploadify Demo</title>
<link rel="stylesheet" type="text/css" href="<?php echo base_url();?>js/uploadify/uploadify.css" />
<script type="text/javascript" language="javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript" language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" language="javascript" src="<?php echo base_url();?>assets/js/uploadify/jquery.uploadify.v2.1.0.min.js"></script>
 
    <script type="text/javascript" language="javascript">
        $(document).ready(function(){
                                         
                    $("#upload").uploadify({
                            uploader: '<?php echo base_url();?>assets/js/uploadify/uploadify.swf',
                            script: '<?php echo base_url();?>upload/test',
                            cancelImg: '<?php echo base_url();?>assets/js/uploadify/cancel.png',                             
                            scriptAccess: 'always',
                            multi: true,
                           'onError' : function (a, b, c, error) {
                                 if (d.status == 404)
                                    alert('Could not find upload script.');
                                 else if (d.type === "HTTP")
                                    alert('error '+d.type+": "+d.status);
                                 else if (d.type ==="File Size")
                                    alert(c.name+' '+d.type+' Limit: '+Math.round(d.sizeLimit/1024)+'KB');
                                 else
                                    alert('error '+error.type+": "+d.text);
                                },
                            'onComplete' : function(a,b,c,response,e) {
                                $("#notify").html(response);
                             }
                    });                                          
                                 
        });
    </script>
</head>
 
<body>
<h1>Uploadify Example</h1>
     
    <?php echo form_open_multipart('upload/index');?>
    <div id="notify"> </div>
    
    <p>
        <label for="Filedata">Choose a File</label><br/>
        <?php echo form_upload(array('name' => 'Filedata', 'id' => 'upload'));?>
        <a href="javascript:$('#upload').uploadifyUpload();">Upload File(s)</a>
    </p>
    
    
    <?php echo form_close();?>
    
</body>
</html>

Blogged with the Flock Browser

UBND phường tôi

Posted in Ubuntu by krazv7rvn9 on 07/12/2009

Thực sự là ức chế! Thị có một khuôn mặt “sát chồng”, với đôi gò má cao, đôi mí mắt trang điểm kiểu “diễm xưa”: đánh mắt tím mộng mơ, cộng với quả môi đỏ thôi rồi. Thị đeo lủng lẳng cái biển tên “Nguyễn Thị Ngọc Điểm” trên áo, ngồi sau quầy tiếp dân với khuôn mặt “bất cần” và “tao là má mì đây”. Đằng trước quầy tiếp dân là những con người, co ro, khúm rúm ngồi bên dãy ghế bên trái. Tiếng đóng dấu cồm cộp, tiếng lật hồ sơ sột soạt… Ấy là cái phòng hành chính và tiếp dân ở UBND phường tôi đấy.
Phường tôi thì nó nổi tiếng rồi. Với địa bàn phức tạp nhưng địa thế đẹp, có cơ phất cờ khởi nghĩa, phường tôi là khu cà phê nổi tiếng chạy dọc ven hồ Xã Đàn, hay còn gọi là Hồ Đắc Di, với trường Kim Liên và trường Lê Quý Đôn ngay bên cạnh, không phải nói, hàng ngày các em đi học tíu tít, mà đi cà phê bia bọt thì cũng nhiều khỏi chê! :) ) Thế nên nhà nhà tầng 1 mở cà phê, người người cho thuê quán để mở cà phê, thiên hạ lũ la lũ lượt xồ ra đường để mời khách vào cà phê, thậm chí, vừa mới đây thôi, người ta còn dự định kinh doanh bar và sàn nhảy để tận dụng địa thế đẹp. Mở quán thì cứ mở quán, chả ai nói gì. Nhưng mà cái vỉa hè đẹp thế, rộng thế, với 2 hàng cây lận, bị lấn chiếm không thương tiếc, thì chả thấy UBND hay CAND nói gì. Ồ, chắc là tại vì mấy cơ quan đó toàn “Của dân, do dân, vì dân” nên vì nhân dân ko nói tới tai họ thì họ chả cần quan tâm. Có ai nói gì đâu??? Ấy thế mà nhân dân toàn phải dùng HTV, VTV và ba bốn mớ phóng sự, báo chí để mà nhắc nhở UBND và CAND. Thôi thì cứ gọi là tưng bừng! :) ) Phóng sự thì cứ phóng sự. Để đó thôi mà. Và các quán cà phê chả những chiếm vỉa hè, mà chiếm luôn cả lòng đường, thì cơ quan của dân vì dân cũng mặc. Mắc mớ gì đến dân đâu???
Quay lại với chị Điểm cái nhỉ? Chiều nay tôi đến gặp chị ấy, trong cái khung cảnh như thế. Tôi cũng nằn nì, năn nỉ chị ấy “chị ơi làm giúp em cái công chứng khai sinh cho thằng em em, mai nó phải nộp rồi”. Chị ấy vạch ra 3 hình thức : “phô tô công chứng”, “mua giấy công chứng” và “nhờ làm hộ công chứng”. Hai cái đầu tôi nghe rõ, cái thứ 3 thì mãi mới nghe ra. Chọn phương án 1 : “sáng mai đến làm em nhé”. Phương án 2 : “em sang bàn bên, mua giấy về khai, sáng mai đem nộp”. Kém thông minh nên mình không chọn phương án 3, vì rõ ràng có cái giấy công chứng khai sinh mà cũng phải nhờ chị làm hộ thì mệt cho chị quá. Ấy nên là chị comment rất khéo sau quầy : “Em ra phường khác mà làm, phường Phương Mai, phường Nam Đồng, phường X, phường Y…”. Vâng, thế mới hiểu là chính quyền cấp cơ sở nó thối đến độ nào! Tôi cũng đến bó tay! Tôi thuộc phường này, có lí do gì mà tôi phải ra phường khác để làm? Mà mấy cái giấy công chứng khai sinh thì tôi làm mãi rồi, biết rồi. Một con tem với một phát đóng dấu là xong. Chị chèo kéo lấy tiền thì cứ nói luôn ra, không thì treo luôn cái biển “50k / lượt” cho nó tiện làm việc. Cứ gì phải nói móc nói máy nhau, nào là “Sếp của chị (ý bảo Chủ tịch phường?) ra ngoài rồi, sáng mai em đến chưa chắc đã làm được đâu, em phải chờ thôi”. Đến cái giấy khai sinh thôi mà phải chính tay chủ tịch phường ký tên đóng dấu, thì tôi đéo hiểu tốn đất xây cái phòng tiếp dân lịch sự, quy mô thế làm cái gì! :-|
Khôn lên, rút ví 50k, kẹp giữa quyển hộ khẩu và đống giấy khai sinh mới phô tô từ bản chính, tôi vào lại phòng tiếp dân, ngồi xuống, nói với cái giọng hết sức dễ thương “Chị ơi, tạo điều kiện làm giúp em một chút, sáng mai thằng em em nó phải nộp rồi”. Chị lại kể ra danh sách các phường có thể làm thủ tục công chứng giấy khai sinh cho tôi, và nói khéo “sáng mai em đến chưa chắc sếp chị có ở đây để làm, em phải chờ thôi”.
Câu chuyện về cái giấy khai sinh mà nó cũng khó khăn đến thế… Thôi thì bó tay toàn tập.
Sáng mai, thằng em mình nghỉ học, về phường Phan Chu Trinh để trình bày, xem có khá khẩm hơn không… Thật là bó tay chấm cơm! :-|

Blogged with the Flock Browser

Đọc tiếng Việt với Asterisk 1.6.2

Posted in Asterisk by krazv7rvn9 on 20/11/2009

Với asterisk 1.6.2, chức năng ngôn ngữ trong say.c được cải thiện đáng kể. Ta có thể cấu hình cách đọc số, đọc chữ, ngày giờ và thời gian thông qua file cấu hình /etc/asterisk/say.conf.
Để cài đặt Asterisk 1.6.2 trên Ubuntu, dùng luôn apt-get install asterisk. Ubuntu thậm chí còn dùng dkms để compile DAHDI module giúp ta luôn! Tuy nhiên với server thì tôi chả bao giờ dùng Ubuntu cả. Nó kém ổn định lắm!!
File config :

[general]
mode=new    ; method for playing numbers and dates
        ; old – using asterisk core function
        ; new – using this configuration file
[digit-base](!)        ; base rule for digit strings
            ; XXX incomplete yet
    _digit:[0-9] => digits/${SAY}
    _digit:[-] => letters/dash
    _digit:[*] => letters/star
    _digit:[@] => letters/at
    _digit:[0-9]. => digit:${SAY:0:1}, digit:${SAY:1}

[date-base](!)        ; base rules for dates and times
    ; the ‘SAY’ variable contains YYYYMMDDHHmm.ss-dow-doy
    ; these rule map the strftime attributes.
    _date:Y:. => num:${SAY:0:4}    ; year, 19xx
    _date:[Bb]:. => digits/mon-$[${SAY:4:2}-1]    ; month name, 0..11
    _date:[Aa]:. => digits/day-${SAY:16:1}    ; day of week
    _date:[de]:. => num:${SAY:6:2}        ; day of month
    _date:[hH]:. => num:${SAY:8:2}        ; hour
    _date:[I]:. => num:$[${SAY:8:2} % 12]    ; hour 0-12
    _date:[M]:. => num:${SAY:10:2}        ; minute
    ; XXX too bad the ‘?’ function does not remove the quotes
    ; _date:[pP]:. => digits/$[ ${SAY:10:2} > 12 ? "p-m" :: "a-m"]    ; am pm
    _date:[pP]:. => digits/p-m    ; am pm
    _date:[S]:. => num:${SAY:13:2}        ; seconds

[en-base](!)
     _[n]um:00 => silence/1
     _[n]um:0. => num:${SAY:1}
    _[n]um:X => digits/${SAY}
    _[n]um:1X => digits/${SAY}
    _[n]um:[2-9]0 =>  digits/${SAY}
    _[n]um:[2-9][1-9] =>  digits/${SAY:0:1}0, num:${SAY:1}
    _[n]um:XXX => num:${SAY:0:1}, digits/hundred, num:${SAY:1}

    _[n]um:XXXX => num:${SAY:0:1}, digits/thousand, num:${SAY:1}
    _[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2}
    _[n]um:XXXXXX => num:${SAY:0:3}, digits/thousand, num:${SAY:3}

    _[n]um:XXXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1}
    _[n]um:XXXXXXXX => num:${SAY:0:2}, digits/million, num:${SAY:2}
    _[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/million, num:${SAY:3}

    _[n]um:XXXXXXXXXX => num:${SAY:0:1}, digits/billion, num:${SAY:1}
    _[n]um:XXXXXXXXXXX => num:${SAY:0:2}, digits/billion, num:${SAY:2}
    _[n]um:XXXXXXXXXXXX => num:${SAY:0:3}, digits/billion, num:${SAY:3}

    ; enumeration
    _e[n]um:X => digits/h-${SAY}
    _e[n]um:1X => digits/h-${SAY}
    _e[n]um:[2-9]0 => digits/h-${SAY}
    _e[n]um:[2-9][1-9] => num:${SAY:0:1}0, digits/h-${SAY:1}
    _e[n]um:[1-9]XX => num:${SAY:0:1}, digits/hundred, enum:${SAY:1}

[vi](digit-base,date-base)
     _[n]um:00 => silence/1
     _[n]um:0. => num:${SAY:1}
    _[n]um:X => digits/${SAY}

    _[n]um:10 => digits/10
    _[n]um:15 => digits/10, digits/5a
    _[n]um:1X => digits/10, num:${SAY:1}
    _[n]um:[2-9][0] => num:${SAY:0:1}, digits/10a
    _[n]um:[2-9][145] => num:${SAY:0:1}0, digits/${SAY:1:1}a
     _[n]um:[2-9]X =>  digits/${SAY:0:1}0, num:${SAY:1}

     _[n]um:X00 => num:${SAY:0:1}, digits/hundred
     _[n]um:X0X => num:${SAY:0:1}, digits/hundred, digits/odd, num:${SAY:2}
    _[n]um:XXX => num:${SAY:0:1}, digits/hundred, num:${SAY:1}

     _[n]um:X000 => num:${SAY:0:1}, digits/thousand
     _[n]um:X00X => num:${SAY:0:1}, digits/thousand, digits/0, digits/hundred, digits/odd, num:${SAY:3}
     _[n]um:X0XX => num:${SAY:0:1}, digits/thousand, digits/0, digits/hundred, num:${SAY:2}
     _[n]um:XXXX => num:${SAY:0:1}, digits/thousand, num:${SAY:1}

     _[n]um:XX000 => num:${SAY:0:2}, digits/thousand
     _[n]um:XX00X => num:${SAY:0:2}, digits/thousand, digits/0, digits/hundred, digits/odd, num:${SAY:4}
     _[n]um:XX0XX => num:${SAY:0:2}, digits/thousand, digits/0, digits/hundred, num:${SAY:3}
    _[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2}

    _[n]um:XXX000 => num:${SAY:0:3}, digits/thousand
     _[n]um:XXX00X => num:${SAY:0:3}, digits/thousand, digits/0, digits/hundred, digits/odd, num:${SAY:5}
     _[n]um:XXX0XX => num:${SAY:0:3}, digits/thousand, digits/0, digits/hundred, num:${SAY:4}
    _[n]um:XXXXXX => num:${SAY:0:3}, digits/thousand, num:${SAY:3}

     _[n]um:X000000 => num:${SAY:0:1}, digits/million
     _[n]um:X00XXXX => num:${SAY:0:1}, digits/million, digits/0, digits/hundred, digits/odd, num:${SAY:3}
     _[n]um:X0XXXXX => num:${SAY:0:1}, digits/million, digits/0, digits/hundred, num:${SAY:2}     
     _[n]um:XXXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1}

     _[n]um:XX000000 => num:${SAY:0:2}, digits/million
     _[n]um:XX00XXXX => num:${SAY:0:2}, digits/million, digits/0, digits/hundred, digits/odd, num:${SAY:4}
     _[n]um:XX0XXXXX => num:${SAY:0:2}, digits/million, digits/0, digits/hundred, num:${SAY:3}
    _[n]um:XXXXXXXX => num:${SAY:0:2}, digits/million, num:${SAY:2}

     _[n]um:XXX000000 => num:${SAY:0:2}, digits/million
     _[n]um:XXX00XXXX => num:${SAY:0:2}, digits/million, digits/0, digits/hundred, digits/odd, num:${SAY:5}
     _[n]um:XXX0XXXXX => num:${SAY:0:2}, digits/million, digits/0, digits/hundred, num:${SAY:4}
    _[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/million, num:${SAY:3}

     _[n]um:X000000000 => num:${SAY:0:1}, digits/billion
     _[n]um:X00XXXXXXX => num:${SAY:0:1}, digits/billion, digits/0, digits/hundred, digits/odd, num:${SAY:3}
     _[n]um:X0XXXXXXXX => num:${SAY:0:1}, digits/billion, digits/0, digits/hundred, num:${SAY:2}     
    _[n]um:XXXXXXXXXX => num:${SAY:0:1}, digits/billion, num:${SAY:1}

    _[n]um:XX000000000 => num:${SAY:0:2}, digits/billion
     _[n]um:XX00XXXXXXX => num:${SAY:0:2}, digits/billion, digits/0, digits/hundred, digits/odd, num:${SAY:4}
     _[n]um:XX0XXXXXXXX => num:${SAY:0:2}, digits/billion, digits/0, digits/hundred, num:${SAY:3}
    _[n]um:XXXXXXXXXXX => num:${SAY:0:2}, digits/billion, num:${SAY:2}

     _[n]um:XXX000000000 => num:${SAY:0:3}, digits/billion
    _[n]um:XXX00XXXXXXX => num:${SAY:0:2}, digits/billion, digits/0, digits/hundred, digits/odd, num:${SAY:5}
     _[n]um:XXX0XXXXXXXX => num:${SAY:0:2}, digits/billion, digits/0, digits/hundred, num:${SAY:4}
    _[n]um:XXXXXXXXXXXX => num:${SAY:0:3}, digits/billion, num:${SAY:3}

   
    ; enumeration
    _e[n]um:X. => digits/thu, num:${SAY}
   
    _datetime::. => date:AdBY ‘digits/at’ IMp:${SAY}
    _date::. => date:AdBY:${SAY}
    _time::. => date:IMp:${SAY}

Blogged with the Flock Browser

Giao diện mới của Dia trên Ubuntu Karmic

Posted in Ubuntu by krazv7rvn9 on 17/11/2009

Chiêm ngưỡng giao diện mới của Dia 0.97-2 trên Ubuntu Karmic :
Khá buồn là bác Google không giúp được gì nhiều, vì các tài liệu của Dia thường thì chậm mất vài bản, và đọc xong đống đó, chắc thành master DIA luôn rồi (:D).
Để chạy giao diện này, thêm tham số –integrated vào lệnh dia.
Ta có thể bấm phải vào trình đơn Ứng dụng, chọn Hiệu chỉnh Trình đơn, chọn mục Đồ họa, bấm đúp vào Dia và sửa lệnh của nó từ dia %F thành dia –integrated %F để truy cập DIA với giao diện mới thông qua trình đơn Ứng dụng.
Khá kool phải không? :)

Blogged with the Flock Browser

Cài đặt jQuery Uploadify với CodeIgniter

Posted in CodeIgniter, Web Dev by krazv7rvn9 on 30/10/2009

jQuery Uploadify là một plugin cho phép upload nhiều file lên server cùng một lúc. Bạn có thể tải Uploadify tại đây.
Do Uploadify dựa vào Flash để upload file, kiểu file gửi lên server bao giờ cũng là application/octet-stream, còn CodeIgniter lại chỉ hỗ trợ cơ chế kiểm tra file upload thông qua kiểu mimes để đảm bảo tính bảo mật của website, nên khi nhúng Uploadify vào CodeIgniter, chương trình sẽ không chạy theo ý mình.
Để sửa lỗi này, có 2 cách thường được dùng:
1 – Sửa lại CodeIgniter Upload library để nhận kiểu file thông qua file extension thay vì mime types.
2 – Sửa lại file config/mimes.php trong ứng dụng, thêm vào kiểu “application/octet-stream” vào các kiểu file cho phép upload.
Ngoài ra, ta có thể mở file .fla đi kèm với Uploadify và sửa lại nội dung file này để gửi kiểu file đúng cho CodeIgniter.
Đối với cách 1, nếu người dùng cố tình đổi đuôi file (vd, từ .png thành .exe), chương trình sẽ lập tức từ chối, không cho phép người dùng upload lên (vì sai đuôi). Cách 2 tối ưu hơn cách 1, nhưng giả dụ bạn có 1 trang chỉ cho phép upload văn bản .txt, một trang cho up ảnh .png, vậy bạn phải sửa lại config/mimes.php 2 lần liền. Như vậy khá là mất thời gian ngồi sửa từng dòng của config/mimes.php
Một cách trung gian là vẫn ứng dụng phép kiểm tra mimes của CI, nhưng thêm kiểu file “application/octet-stream” vào cho mỗi kiểu file được phép upload lên.
Ta thực hiện phương pháp này bằng cách viết phần mở rộng application/libraries/MY_Upload.php:

<?php
    class MY_Upload extends CI_Upload
    {
         var $allow_flash = FALSE;

                function initialize($config = array()){
                     parent::initialize($config);
                     if (array_key_exists('allow_flash', $config)) $this->allow_flash = $config['allow_flash'];
                }
            /**
         * Verify that the filetype is allowed
         *
         * @access    public
         * @param    allow_flash = FALSE
         * @return    bool
         */   
        function is_allowed_filetype()
        {
            if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
            {
                $this->set_error('upload_no_file_types');
                return FALSE;
            }
   
            $image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');
   
            foreach ($this->allowed_types as $val)
            {               
                $mime = $this->mimes_types(strtolower($val));
                if ($this->allow_flash)
                    if (is_array($mime)) $mime[] = 'application/octet-stream'; else $mime = array($mime, 'application/octet-stream');
                   
               
                // Images get some additional checks
                if (in_array($val, $image_types))
                {
                    if (getimagesize($this->file_temp) === FALSE)
                    {
                        return FALSE;
                    }
                }
   
                if (is_array($mime))
                {
                    if (in_array($this->file_type, $mime, TRUE))
                    {
                        return TRUE;
                    }
                }
                else
                {
                    if ($mime == $this->file_type)
                    {
                        return TRUE;
                    }   
                }       
            }
           
            return FALSE;
        }
    }

/* End of file : application/libraries/MY_Upload.php */
/* Author: Nguyen Dinh Trung <nguyendinhtrung141@gmail.com> */

Giờ ta có thể thực hiện việc upload thông qua Uploadify bằng các Controllers và View sau:

Controller : application/controllers/upload.php

<?php
class Upload extends Controller
{
    function Upload()
    {
        parent::Controller();
        $this->load->helper('form');
        $this->load->helper('url');
    }
     
     
    /*
    *    Display upload form
    */
    function index()
    {
         
        $this->load->view('form');
    }
     
    /*
    *    Handles JSON returned from /js/uploadify/upload.php
    */
    function uploadify()
    {
       
        $config['upload_path'] = APPPATH . 'assets/uploads/';
        $config['allow_flash'] = TRUE;
        $config['allowed_types'] = 'csv';
        $config['max_size']    = '100';
        $config['max_width']  = '1024';
        $config['max_height']  = '768';
        $this->load->library('upload', $config);
        if (! $this->upload->do_upload('Filedata')){
            echo ($this->upload->display_errors());                       
        } else {
            echo json_encode($this->upload->data());                   
        }         
    }
     
}
/* End of File /application/controllers/upload.php */

View: application/views/form.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jQuery Uploadify Demo</title>
<link rel="stylesheet" type="text/css" href="<?php echo base_url();?>js/uploadify/uploadify.css" />
<script type="text/javascript" language="javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript" language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" language="javascript" src="<?php echo base_url();?>assets/js/uploadify/jquery.uploadify.v2.1.0.min.js"></script>
 
    <script type="text/javascript" language="javascript">
        $(document).ready(function(){
                                         
                    $("#upload").uploadify({
                            uploader: '<?php echo base_url();?>assets/js/uploadify/uploadify.swf',
                            script: '<?php echo base_url();?>upload/test',
                            cancelImg: '<?php echo base_url();?>assets/js/uploadify/cancel.png',                             
                            scriptAccess: 'always',
                            multi: true,
                           'onError' : function (a, b, c, error) {
                                 if (d.status == 404)
                                    alert('Could not find upload script.');
                                 else if (d.type === "HTTP")
                                    alert('error '+d.type+": "+d.status);
                                 else if (d.type ==="File Size")
                                    alert(c.name+' '+d.type+' Limit: '+Math.round(d.sizeLimit/1024)+'KB');
                                 else
                                    alert('error '+error.type+": "+d.text);
                                }
                            'onComplete' : function(a,b,c,response,e) {
                                $("#notify").html(response);
                             }
                    });                                          
                                 
        });
    </script>
</head>
 
<body>
<h1>Uploadify Example</h1>
     
    <?php echo form_open_multipart('upload/index');?>
    <div id="notify"> </div>
    
    <p>
        <label for="Filedata">Choose a File</label><br/>
        <?php echo form_upload(array('name' => 'Filedata', 'id' => 'upload'));?>
        <a href="javascript:$('#upload').uploadifyUpload();">Upload File(s)</a>
    </p>
    
    
    <?php echo form_close();?>
    
</body>
</html>

Blogged with the Flock Browser

jQuery & CodeIgniter trong form

Posted in CodeIgniter, Web Dev by krazv7rvn9 on 26/10/2009

Làm sao để tạo một form Ajax với jQuery và thư viện Form_validation của CodeIgniter?
Trước hết, ta tạo một controller như sau:

class Devel extends Controllers
{
function index(){
       $this->load->library('form_validation');
      # Đặt các luật kiểm tra cho Form.
       $this->form_validation->set_rules("username", "Tên đăng nhập", "required|trim|xss_clean|max_length(20)");
       $this->form_validation->set_rules("password", "Mật khẩu", "required|trim|xss_clean|max_length(20)");
       $this->form_validation->set_rules("password_again", "Nhập lại Mật khẩu", "required|trim|xss_clean|max_length(20)|match(password)");
      if ($this->form_validation->run()){
            # Form kiểm tra ok!
            echo "<div class='success'>Đã kiểm tra form, không có lỗi gì hết!</div>";           
      } else {
            # Form chưa kiểm tra, hoặc chưa chạy.
            if ($this->input->post('uniqueid')){
                  # Form đã khởi tạo và được chạy ít nhất 1 lần. Trả về mã lỗi kiểm tra form
                  echo "<div class='error'>".$this->form_validation->error_string()."</div>";
            } else {
                  # Chưa khởi tạo form.
                  $default['username'] = 'username';
                  $default['password'] = '';
                  $default['password_again'] = '';
                  $this->load->helper('string');
                  $default['uniqueid'] = random_string('unique');
                  $this->load->view('form', $default);
            }
      }
}
}
/* End of class Devel */
/* Author : Nguyen Dinh Trung <nguyendinhtrung141@gmail.com> */

Tiếp đó tạo view như sau:

<html>
    <head>
        <title>Example Form</title>
        <script type='text/javascript' src='<?= base_url(); ?>assets/js/jquery.js'></script>
    </head>
    <body>
        <form id='myform' method='post'>
            <div id="notify"></div>
            <fieldset><legend>Xác nhận mật khẩu</legend>
                 <input type='hidden' name='uniqueid' value='<?= $uniqueid; ?>'>
                 <label for='username'>Tên đăng nhập</label>
                       <input type='text' name='username' id='username' value='<?= set_value('username', $username); ?>'>
                 <label for='password'>Mật khẩu</label>
                        <input type='password' name='password' id='password' value='<?= set_value('password', $password); ?>'>
                 <label for='password_again'>Mật khẩu</label>
                        <input type='password_again' name='password_again' id='password_again' value='<?= set_value('password_again', $password_again); ?>'>
             </fieldset>
             <fieldset>
                  <button type='button' id='submit'>Gửi</button>
                  <button type='reset' id='reset'>Nhập lại</button>
             </fieldset>
        </form>
        <script type='text/javascript'>
              $(document).ready(function(){
                   $("#submit").click(function(){
                          $.post("<?= current_url(); ?>", $("#myform").serializeArray(), function(response){$("#notify").html(response);});
                    });
               });
        </script>
    </body>
</html>

Với jQuery, ta có thể gửi form dễ dàng với phương thức POST bằng 1 dòng như sau:

$.post("url", {"username":1234, "password":4567}, <callback>});

Trong đó callback là hàm xử lý dữ liệu mà server trả về. Như trong file view ở trên, tôi lấy toàn bộ chuỗi văn bản mà server trả về, đem nhét nó vào trong vùng <div id=”notify”></div>.
- Khi mới truy cập đến trang devel/index, do form chưa được khởi tạo nên không có giá trị gì trong biến $this->input->post(‘uniqueid’). Sự kiện này báo với controller rằng hãy hiển thị form và view với các thông số được chọn. Chuỗi uniqueid là một chuỗi ngẫu nhiên được tạo nhờ string helper của CI.
- Sau khi người dùng bấm vào nút Submit, jQuery sẽ gửi dữ liệu lên Server. Dữ liệu được gửi chính là nội dung Form lấy được nhờ lệnh $(“#myform”).serializeArray().
- Tại server, CI nhận thấy có trường uniqueid, nên thay vì tạo form thông qua View, CI chỉ gửi lại thông báo lỗi (trong trường hợp Form không chạy), hoặc thông báo thành công (trong trường hợp kiểm tra thành công).
- jQuery nhận được bản tin từ server và chèn chuỗi nhận được đó vào trong div id=”notify”.

Blogged with the Flock Browser

Xuất file PDF tiếng Việt với CodeIgniter

Posted in CodeIgniter, Web Dev by krazv7rvn9 on 24/10/2009

Để xuất file PDF hỗ trợ tiếng Việt, ta có thể dùng mPDF (http://mpdf.bpm1.com/) kết hợp với CodeIgniter.
Việc xuất PDF tiếng Việt khá đơn giản với mPDF.
1 – Giải nén mPDF vào thư mục web của mình, ta sẽ có cấu trúc sau:

—–  codeigniter
     —–  system
            —– applications
—–  mpdf

2 – Chép mpdf/mpdf.php vào codeigniter/system/application/libraries.

$> cp mpdf/mpdf.php codeigniter/system/application/libraries/

3 – Sửa lại đường dẫn cho MPDF bằng cách mở file application/libraries/mpdf.php vừa chép và sửa dòng:


if (!defined('_MPDF_PATH')) define('_MPDF_PATH','');



thành


if (!defined('_MPDF_PATH')) define('_MPDF_PATH','/var/www/html/mpdf/');



4 – Trong controllers, ta thực hiện ghi file PDF bằng cách tạo một hàm xuất PDF như sau:

<?php

class Welcome extends Controller {

    function Welcome()
    {
        parent::Controller();   
    }
   
    function index()
    {
        $this->load->view(‘welcome_message’);
    }
   
    function mpdf(){
        $this->load->library(‘mpdf’, array(‘vi’, ‘A4′));
        $this->mpdf->RestrictUnicodeFonts(array(‘dejavusans’, ‘dejavusansB’, ‘dejavusansI’, ‘dejavusansBI’, ‘dejavusanscondensed’, ‘dejavusanscondensedB’, ‘dejavusanscondensedI’, ‘dejavusanscondensedBI’));
        $this->mpdf->WriteHTML(‘<p>Chào mừng bạn đến với CodeIgniter Framework!!!</p>’);
        $this->mpdf->Output();
    }
}

/* End of file welcome.php */
/* Location: ./system/application/controllers/welcome.php */

Gọi URL http://your.hostname/path/index.php/welcome/mpdf, ta sẽ lấy được tập tin PDF với nội dung tương ứng.

Blogged with the Flock Browser

Đặt ảnh nền cho GRUB2

Posted in Ubuntu by krazv7rvn9 on 19/10/2009

Đặt ảnh cho GRUB2:
1 – Cài gói grub2-splashimages:
sudo apt-get install grub2-splashimages
2 – Sửa lại /etc/grub.d/05_debian_theme

#!/bin/bash -e

source /usr/lib/grub/grub-mkconfig_lib

set_mono_theme()
{
  cat << EOF
  set menu_color_normal=white/black
  set menu_color_highlight=black/white
  EOF
}

# check for usable backgrounds
use_bg=false
# Select a random wallpaper
WALLPAPERDIR=/usr/share/images/grub
if [[ -d "${WALLPAPERDIR}" ]]
then
        files=$(ls "${WALLPAPERDIR}")
        file_matrix=($files)
        num_files=${#file_matrix[*]}
        bg=${WALLPAPERDIR}/${file_matrix[$((RANDOM%num_files))]}
fi

if [ "$GRUB_TERMINAL_OUTPUT" = "gfxterm" ] ; then 
    if is_path_readable_by_grub $bg ; then
      case ${bg} in
        *.png)      reader=png ;;
        *.tga)      reader=tga ;;
        *.jpg|*.jpeg)   reader=jpeg ;;
      esac
      if test -e /boot/grub/${reader}.mod ; then
        echo "Found Debian background: `basename ${bg}`" >&2
        use_bg=true
      fi
    fi
fi

# set the background if possible
if ${use_bg} ; then
  prepare_grub_to_access_device `${grub_probe} --target=device ${bg}`
  cat << EOF
insmod ${reader}
if background_image `make_system_path_relative_to_its_root ${bg}` ; then
  set color_normal=black/black
  set color_highlight=magenta/black
else
EOF
fi

# otherwise, set a monochromatic theme for Ubuntu
if ${use_bg} ; then
  set_mono_theme | sed -e "s/^/  /g"
  echo "fi"
else
  set_mono_theme
fi

Để thay đổi ảnh nền cho Grub, chạy lệnh:

sudo update-grub2

Lưu ý là để cài thêm ảnh mới, cứ việc cóp một ảnh PNG, JPG hay TGA vào thư mục WALLPAPERDIR là /usr/share/images/grub nhé.

Blogged with the Flock Browser
Tagged with: , ,

Flock – trình duyệt web dành cho các mạng xã hội.

Posted in Web Dev by krazv7rvn9 on 15/10/2009

Được thiết kế dành riêng cho các mạng xã hội, Flock (http://www.flock.com) có rất nhiều các tính năng hỗ trợ để ta thay đổi status trên facebook và twitter, viết blog trên wordpress, blogger, myopera, upload ảnh và video lên youtube, imageshack, picasa, hay đơn giản chỉ là đọc email trên Gmail hoặc Yahoo Mail.
Các tính năng chính của Flock bao gồm:

People Sidebar
Lấy thông tin trạng thái của bạn bè mình trên Facebook, Twitter, Bebo…
My World
Chương trình tự động thu thập thông tin từ nhiều nguồn khác nhau, bao gồm các RSS feed, thông tin mới của bạn bè mình, các bức ảnh và video mới nhất trên các mạng XH.
Media Bar
Giúp ta nhanh chóng tìm và duyệt ảnh, nhạc, hay video.
Favorites
Thêm các site mình hay vào vào trong Flock. Ngoài khả năng đánh dấu trên máy bạn, chương trình còn cho phép ta đồng bộ các đánh dấu với tài khoản delicious hay foxmark của mình.
Feed Reader
Chương trình tích hợp sẵn công cụ feed reader để đọc tin tự động.
Photo Uploader
Sửa và up ảnh lên trên imageshack, facebook hay wordpress trực tiếp. Không mất công chờ Flash Uploader tải dữ liệu, không phải di chuyển đến đúng URL để upload mà vẫn upload được.
Blog Editor
Viết blog chưa bao giờ dễ hơn thế! Ngay cả khi không có kết nối mạng, bạn có thể viết sẵn blog của mình, để lúc nào online thì cập nhật lại!
Webmail
Thông báo cho bạn ngay khi bạn có thư mới trong GMail, Yahoo Mail.
Web Clipboard
Thu thập liên kết, văn bản hay ảnh để sử dụng về sau này.

Trên Ubuntu, cài Flock bằng cách lên trang chủ http://www.flock.com, điền email vào để tải chương trình về, rồi giải nén tập tin đã tải vào /opt/. Ví dụ, tôi tải về flock-2.5.2.bz2 và giải nén vào /opt bằng lệnh sau:
cd /opt

sudo tar xjpvf ~/Downloads/flock-2.5.2.bz2

Tiếp đó, bấm phải vào menu Ứng dụng, chọn Hiệu chỉnh trình đơn. Trong mục Internet, chọn Tạo mục mới. Bấm vào biểu tượng ứng dụng và duyệt đến thư mục /opt/flock/icons để lấy biểu tượng Flock ra. Trong phần Lệnh: tôi gõ /opt/flock/flock-browser, gõ tên chương trình là Flock và chú thích Trình duyệt mạng Xã hội. Vậy là xong!

Blogged with the Flock Browser

Dùng script để ghi lại nội dung phiên làm việc trên Gnome-terminal

Posted in GNOME Desktop, Ubuntu by krazv7rvn9 on 15/10/2009

script là một lệnh có trong gói util-linux mà hầu hết các bản linux hiện thời đều cài sẵn. Với script, người dùng có thể lưu lại các thao tác đã thực hiện trên gnome-terminal, hay giao diện dòng lệnh để sau này tham khảo lại.
Để chạy chương trình, gõ:

$&gt; script

Chương trình sẽ ghi dữ liệu có trên màn hình gnome-terminal vào file tên là typescript trong thư mục hiện thời. Để chọn một file khác, nhập tên file vào sau câu lệnh, hoặc để ghi tiếp vào một file đã có, ta thêm tùy chọn -a:

$&gt; script -a <filename>

Để kết thúc chương trình, gõ lệnh

$&gt; exit

Chương trình sẽ kết thúc việc ghi log và ghi dữ liệu vào file.
Tuy nhiên, chương trình có một nhược điểm là, ngoài các ký tự thông thường, nó còn ghi lại toàn bộ các ký tự điều khiển, và các ký tự thoát (escape characters), nên nhìn nội dung file ghi lại trông sẽ rất lộn xộn. Để tránh điều này, ta nên gõ lệnh sau thay vì dùng lệnh script trực tiếp:

$ SHELL=/bin/sh PS1=”$ ” script

Một lưu ý nữa là khi dùng script, không nên sử dụng các lệnh tương tác như vi hay top, vì nội dung file in ra trông sẽ rất rối rắm.

Follow

Get every new post delivered to your Inbox.