Dùng 1 trong 2 cách sau:
- Chép các fonts windows vào thư mục /usr/share/fonts/truetype
sudo apt-get install msttcorefonts
Khởi động lại hoặc dùng lệnh sudo fc-cache -fv
Tích góp kinh nghiệm - Nhặt nhạnh kỹ năng…
Dễ lắm
Ngày xửa ngày xưa thì dùng đoạn Javascript của bên Vnexpress.net. Nhưng giờ ít ai dùng cái đó nữa vì nó quá đơn giản. Thế nên sẽ lấy ở các nguồn khác thôi. Chung quy lại, là nên lấy của thằng Trung tâm khí tượng thủy văn Việt Nam (http://www.nchmf.gov.vn) là chuẩn nhất (chuyện, của Việt Nam mà :p)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * Get weather table * @author Do Nam Khanh * @return string */ function _weather() { $content = file_get_contents('http://www.nchmf.gov.vn/website/vi-VN/43/Default.aspx'); $strBegin = '<!-- Begin Display content -->'; $strEnd = '<TD class="thoitiet_rightbox_ver"></TD>'; $pos1 = strpos($content, $strBegin); if(false === $pos1) { return ''; } else { $pos2 = strpos($content, $strEnd); $content = substr($content, $pos1, ($pos2-$pos1)); return strip_tags($content, '<table><tr><td><img>'); } } |
Demo: http://halongtours.vn/demo
Chỉ đơn giản dùng CSS dạng như sau:
1 | option#AF { background:url(images/flags/vn.png) no-repeat; padding-left:20px; } |
Cái “khó” là phải:
- Có đủ ảnh các quốc gia trên thế giới
- File css cũng phải có từng đó định nghĩa option tương ứng
Để download bộ icon ảnh cờ các nước bạn có thể vào http://www.famfamfam.com/lab/icons/flags để tải, icon khá đẹp 
Continue reading ‘Tạo một Country list (Drop down menu) kèm ảnh quốc kỳ’
Tôi đang phải làm chức năng nén/giải nén trong dự án hiện tại. Giải nén thì đã làm xong rồi, còn nén nữa là xong. Zip library của PHP hỗ trợ chức năng zip hơi bị kém, cái cơ bản nhất là cũng ngại phải viết => search & thấy class này khá nhẹ để nén 1 folder.
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 | <?php require ("zipfile.inc.php"); $zipfile = new zipfile(); rec_listFiles('myFolder'); header("Content-type: application/octet-stream"); header("Content-disposition: attachment; filename=zipfile.zip"); echo $zipfile->file(); function rec_listFiles( $from = '.') { global $zipfile, $filedata; if(! is_dir($from)) return false; if( $dh = opendir($from)) { while( false !== ($file = readdir($dh))) { // Skip '.' and '..' if( $file == '.' || $file == '..') continue; $path = $from . '/' . $file; if( is_dir($path) ) { $zipfile->add_dir($path); rec_listFiles($path); } else { $filedata = implode("", file($path)); $zipfile->add_file($filedata, $path); } } closedir($dh); } } ?> |
Tạm đáp ứng yêu cầu
Source: http://www.devco.net/archives/2005/05/24/creating_zip_files_with_php.php
Hôm nay tôi gặp phải 1 “tình huống” khá là củ chuối. Phần upload file (thật ra là upload file để update lại các store - khá nhiều, hiện tại là 1500 store) có validate file size, file type. Tôi test “khá kỹ ” ở local & mọi thứ đều ổn. Thông số local của tôi như sau:
Khi up 1 file có dung lượng quá 20MB (<100MB) thì hệ thống hiện thông báo rất đẹp với nội dung là bạn đã upload quá dung lượng quy định bla bla…:-@
Thế nhưng sau khi request done trên PMS (project management system), bên test report lại là khi upload 1 file lớn hơn 16MB thì chẳng hiện gì cả, không lỗi & giống như tự F5 lại trang.
Xem phpinfo của môi trường trên testing thì như sau:
Vậy là dung lượng vượt quá post_max_size rồi, và PHP đã làm thế này đối với đoạn code của tôi:
If the size of post data is greater than post_max_size, the $_POST and $_FILES superglobals are empty
Thế cho nên đoạn code:
1 2 3 4 | $postMaxSize = int_get('post_max_size'); if($postMaxSize < $userFile['size']) { //process error } |
chẳng hoạt động gì cả 
Trên php.net có 1 trick để xử lý trường hợp này:
This can be tracked in various ways, e.g. by passing the $_GET variable to the script processing the data, i.e.
Và đây là đoạn code của tôi:
1 2 3 | if(isset($_GET['processed']) && !count($_POST)) { die('Error message here...'); } |
Chạy ngon
Rất cảm ơn anh NBThanh (Nguyễn Bá Thành) đã giúp đỡ em khắc phục vấn đề này
Dự án e-store tôi đang thực hiện đã sang phase II. Do đã tạo một số lượng không nhỏ các shop demo (khoảng 1500 - mặc dù yêu cầu là 5000 cái :() nên chức năng update toàn bộ các shop là chức năng bắt buộc phải có trong phase II này.
Ban đầu cứ nghĩ việc này khó, nhưng đến khi bắt tay vào làm mới thấy chẳng khó tý nào nếu không muốn nói là dễ :p
Với 3 yêu cầu này, không khó để thực hiện. Tuy vậy tôi vẫn bị vướng 1 chỗ & vẫn chưa nghĩ ra cách giải quyết nào triệt để, đó là vấn đề khi lấy toàn bộ các tên shop (shop code = thư mục) để copy file vào. Nếu trên môi trường Windows, chưa có cách nào khả thi hơn ngoài việc đọc dữ liệu trong DB. Cách này đơn giản nhưng khoảng thời gian để đọc từ DB ra cũng chẳng phải ít
Còn trên Linux thì có vẻ dễ chịu hơn nếu như safe_mode = off :-” Tôi dùng command để đọc các thư mục shop hiện có, loại trừ đi mấy thư mục hệ thống. Hàm cụ thể 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 34 35 36 37 38 39 40 41 | /** * get all shop * @author khanhdn * @return array */ function getAllShop() { $shops = array('shop_temp'); if(!isLinuxOS()) { $query = db_query("SELECT shop_code FROM {shop_setting} ORDER BY shop_code"); while($rs = db_fetch_array($query)) { if(is_dir('../'.$rs['shop_code'])) { $shops[] = $rs['shop_code']; } } } else { $systemFolder = array( 'system' ,'sites' ,'scripts' ,'profiles' ,'googlecheckout' ,'themes' ,'tmp' ,'googleerror.log' ,'googlemessage.log' ,'index.php' ,'mysqldumper' ,'phpinfo.php' ); $shopFolder = array(); exec('cd ../; ls;', $shopFolder); $shops = array_diff($shopFolder, $systemFolder); } return $shops; } |
Thật ra thì đây chỉ là cách làm đối phó. Nếu hệ thống lớn chắc chắn vẫn không ổn. Chắc là phải làm việc ở mức thấp hơn nữa :-s
Lý do phải nâng cấp:
- Matbao.net đã thay đổi lại cấu trúc site của họ (thay đổi giao diện) nên phần parse data của mình sẽ không chính xác nữa.
- Dùng nsloop-up chỉ có thể check domain đó có hoạt động hay không, chứ không check được đã được mua hay chưa. Có thể chủ sở hữu đã mua nhưng chưa active domain
Những thay đổi:
Không có nhiều thay đổi trong phiên bản nâng cấp này ngoài:
- Get xml content thay cho html content.
- Chuẩn hóa các function theo camelCase.
- Bỏ php short tag, chuyển về <?php echo …;?> nếu có.
Todo:
Mặc dù kết quả nhận được từ matbao.net là dạng XML nhưng vẫn gặp khó khăn trong khâu parse XML. Dùng các libs có sẵn trong PHP như simpleXML, XMLparse… đều bị lỗi do syntax của file XML này không chuẩn cho lắm. Tạm thời tôi dùng preg_match để parse XML. Khi nào có điều kiện sẽ nghiên cứu cách parse XML mà không biết trước cấu trúc
Có bác nào tốt bụng thì phát triển thêm hộ tôi với :p
Hướng dẫn nâng cấp:
- Download bản upgrade tại http://donamkhanh.com/download/whoisv3.1.php.txt http://donamkhanh.com/download/whoisv3.2.php.txt
- Sau khi download, rename file whoisv3.1.php.txt whoisv3.2.php.txt thành index.php, rồi ghi đè file index.php trong thư mục whoisv3 (nếu chưa có phiên bản 3.0 thì có thể download tại http://donamkhanh.com/download/whoisv3.tar.bz2)
Yêu cầu:
- Chmod quyền hợp lý (cho đọc ghi đối với file checked_domain.txt)
- Thông số allow_url_fopen trên host phải thiết lập bằng On.
Chẳng mấy khi được nghe 2 cao thủ luận bàn, chẳng biết gì nên cứ copy về đây để bao giờ trình độ lên cao thì “nghiệm” vậy :”>
mega2look:
http://www.javavietnam.org/javavn/mvnforum/viewthread_thread,20372_offset,60#87886
Kính thưa các doanh nghiệp Việt Nam,
Hôm nay tôi xin thay mặt công ty SUN Microsystem gởi tới các đồng chí
lời chào thân ái và quyết thắng.
Chắc các đồng chí đều biết công ty chúng tôi là công ty hàng đầu về
bán server đã tối ưu để chạy công nghệ Java, dĩ nhiên công nghệ này
cũng của chúng tôi. Mặc dù tình hình kinh doanh của chúng tôi trong
những năm gần đây không được sáng sủa gì cho lắm, nhưng tôi đảm bảo
rằng chúng tôi vẫn là một trong những công ty hàng đầu trong vài năm
tới miễn là không thua lỗ nhiều quá, và đặc biệt là với sự ủng hộ vô
điều kiện của cộng đồng các nhà phát triển Java đầy tiềm năng tại Việt
Nam thì tương lai của SUN vô cùng sáng lạn.
Công ty chúng tôi chuyên cung cấp các giải pháp cỡ enterprise ở cả
phần mềm lẫn phần cứng. Trước hết tôi xin nói qua về giải pháp phần
mềm. Đây toàn là những phần mềm to vật vã, chức năng vô cùng khủng bố
hoàn toàn hợp với mác Enterprise mà các quí vị đang quan tâm. Để tạo
ra được phần mềm này các quí vị nên xem qua cái chuẩn J2EE (cũng do
chúng tôi định nghĩa ra nốt), nếu các vị chưa chóng mặt vì tầm mức vĩ
đại, kỳ vĩ của nó thì cũng sẽ phải thán phục trước độ phức tạp mà loài
người chưa từng hình dung ra từ trước tới nay.
Continue reading ‘Discuss about Java’
Hồi trước vào blog của cậu Nguyên Vũ thấy cậu ấy “khoe” mới nhận được bản OpenSolaris từ Sun, cũng là 1 dạng request free CD giống Ubuntu nên quyết định đăng ký thử phát (mặc dù không có dùng Linux, nhưng mà đĩa xịn cơ mà, tội gì ).
Đăng ký xong và…quên béng mất thì tự nhiên hôm qua về nhà thấy lù lù 1 cái phong bì rất đẹp Thích thế
Cứ để dành đấy đã, bao giờ có laptop mình cài Linux vào dùng (hoặc hôm nào rảnh thì cài máy ở cty cũng được).
Lang thang được bài viết khá hay của bác Huy
Nếu bạn đã từng làm việc với các PHP framework như symfony, Cake, Zend … có thể bạn đã nhận ra những vấn đề này. Tôi xin nêu ra đây cả cách giải quyết của mình.
Thật vậy, không những làm bạn khó khăn hơn trong việc xoay sở với SQL, nó còn khiến quá trình truy xuất dữ liệu trở nên nặng nề hơn. Các pattern này quy mỗi record trong database thành một object. Việc làm này là cực kỳ không cần thiết. Không phải lúc nào bạn cũng select chúng ra sau đó lại update trở lại database. Những logic nhằm bảo đảm mối quan hệ giữa các object cũng ngốn kha khá tài nguyên. Hơn nữa, các câu SQL được tự động sinh ra sẽ không đạt được mức độ tối ưu như mong muốn. Tối ưu SQL là một công việc quan trọng nhưng các ORM lại cố ngăn bạn khỏi công việc đó.
Sử dụng DAO pattern để thay cho Active Record. Hoặc tốt hơn nữa là sử dụng các tính năng được hỗ trợ sẵn trong hệ quản trị cơ sở dữ liệu mà lâu nay lập trình viên PHP/(nhất là MySQL) thường quên đi mất như View, Trigger, Stored Procedured… Bạn không nên lo ngại việc các lập trình viên của mình phải viết SQL. Suy cho cùng họ là lập trình viên, công việc của họ là viết code.
Các framework thường tự động hoá một số giai đoạn trong workflow để trở nên thân thiện hơn đối với developer. Nếu bạn đã dùng qua CakePHP, bạn sẽ hiểu. Cake cho phép bạn khai báo các model và component bạn cần trong controller và tự động load toàn bộ chúng trong quá trình start-up. Điều này làm cho ứng dụng phải mất rất lâu để start-up. Hơn nữa, với cách phân chia ứng dung thành controller/action, bạn gặp phải một vấn đề là không phải lúc nào bạn cũng cần những model/component giống nhau ở tất cả các action trong cùng một controller. Với cách làm của CakePHP, bạn phải load những thứ mình không cần một cách bất đắc dĩ.
Dẹp sự tự động hoá sang một bên đi! Hiện đại là hại điện. Tôi nhắc lại một lần nữa, bạn tuyển những lập trình viên và trả lương cho họ để họ viết code. Đừng ngại khi bắt họ làm chuyện đó.
Ok, MVC là một mô hình tốt, chẳng ai phủ nhận cả. Nhưng việc phân chia rạch ròi giữa business logic (M) và presentation logic (V) cũng làm cho mọi thứ trở nên rắc rối hơn. Một ví dụ: trong mô hình MVC mà bạn gặp ở các framework mà tôi kể ở trên, Model thường xử lý dữ liệu xong rồi truyền cho View. Giả sử ở đây bạn có một list các bài hát cần in ra. Cách thông thường nhất và gần như duy nhất mà ta thường làm là Model nhận việc select từ database, duyệt qua tập kết quả lần để để tổng hợp nó thành một danh sách (ở PHP thì rất có thể là mảng) rồi sau đó mới truyền cho View. View lại phải duyệt qua mảng đó thêm một lần nữa để in ra.
Tôi không có cách giải quyết nào và chấp nhận vấn đề này ở hiện tại. Thật ra nó cũng không ảnh hưởng quá nhiều đến performance, bù lại ta có được sự tách biệt rạch ròi về kiến trúc.
Lập trình OOP luôn luôn ngốn nhiều tài nguyên hơn so với function-based. Thêm vào đó, với đặc điểm của PHP, việc viết mỗi lớp thành một file riêng sẽ làm phân mảnh code và buộc PHP engine phải làm việc nặng nề hơn (nhất là đối với các framework như Zend).
Sử dụng các opcode caching egine như APC, XCache.
Nguồn: byhuy.com
Phản hồi mới