Saturday, October 10, 2015

jQuery âm lịch (jQuery.amlich)

jQuery Plugin âm lịch


Sử dụng:
$(element).amLich({
  type: 'calendar', // month hoặc year hoặc text
  tableWidth: '200px' // Chiều rộng lịch
});

Download: https://github.com/ichuot/jquery-amlich

Tuesday, September 29, 2015

Hàm PHP đọc số tiền thành chữ

Hàm PHP đọc số thành chữ (tiền)
function convert_number_to_words($number)
{
  $hyphen = ' ';
  $conjunction = '  ';
  $separator = ' ';
  $negative = 'âm ';
  $decimal = ' phẩy ';
  $dictionary = array(
    0 => 'không',
    1 => 'một',
    2 => 'hai',
    3 => 'ba',
    4 => 'bốn',
    5 => 'năm',
    6 => 'sáu',
    7 => 'bảy',
    8 => 'tám',
    9 => 'chín',
    10 => 'mười',
    11 => 'mười một',
    12 => 'mười hai',
    13 => 'mười ba',
    14 => 'mười bốn',
    15 => 'mười năm',
    16 => 'mười sáu',
    17 => 'mười bảy',
    18 => 'mười tám',
    19 => 'mười chín',
    20 => 'hai mươi',
    30 => 'ba mươi',
    40 => 'bốn mươi',
    50 => 'năm mươi',
    60 => 'sáu mươi',
    70 => 'bảy mươi',
    80 => 'tám mươi',
    90 => 'chín mươi',
    100 => 'trăm',
    1000 => 'ngàn',
    1000000 => 'triệu',
    1000000000 => 'tỷ',
    1000000000000 => 'nghìn tỷ',
    1000000000000000 => 'ngàn triệu triệu',
    1000000000000000000 => 'tỷ tỷ'
  );
  if (!is_numeric($number)) {
    return false;
  }

  if (($number >= 0 && (int)$number < 0) || (int)$number < 0 - PHP_INT_MAX) {

    // overflow

    trigger_error('convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, E_USER_WARNING);
    return false;
  }

  if ($number < 0) {
    return $negative . convert_number_to_words(abs($number));
  }

  $string = $fraction = null;
  if (strpos($number, '.') !== false) {
    list($number, $fraction) = explode('.', $number);
  }

  switch (true) {
  case $number < 21:
    $string = $dictionary[$number];
    break;

  case $number < 100:
    $tens = ((int)($number / 10)) * 10;
    $units = $number % 10;
    $string = $dictionary[$tens];
    if ($units) {
      $string.= $hyphen . $dictionary[$units];
    }

    break;

  case $number < 1000:
    $hundreds = $number / 100;
    $remainder = $number % 100;
    $string = $dictionary[$hundreds] . ' ' . $dictionary[100];
    if ($remainder) {
      $string.= $conjunction . convert_number_to_words($remainder);
    }

    break;

  default:
    $baseUnit = pow(1000, floor(log($number, 1000)));
    $numBaseUnits = (int)($number / $baseUnit);
    $remainder = $number % $baseUnit;
    $string = convert_number_to_words($numBaseUnits) . ' ' . $dictionary[$baseUnit];
    if ($remainder) {
      $string.= $remainder < 100 ? $conjunction : $separator;
      $string.= convert_number_to_words($remainder);
    }

    break;
  }

  if (null !== $fraction && is_numeric($fraction)) {
    $string.= $decimal;
    $words = array();
    foreach(str_split((string)$fraction) as $number) {
      $words[] = $dictionary[$number];
    }

    $string.= implode(' ', $words);
  }

  return $string;
}

Monday, September 28, 2015

Hàm javascript đọc số thành chữ

/**
* Đọc số thành chữ (Vietnamese)
* DOCSO.doc( 123 );
*/
var DOCSO=function(){var t=["không","một","hai","ba","bốn","năm","sáu","bảy","tám","chín"],r=function(r,n){var o="",a=Math.floor(r/10),e=r%10;return a>1?(o=" "+t[a]+" mươi",1==e&&(o+=" mốt")):1==a?(o=" mười",1==e&&(o+=" một")):n&&e>0&&(o=" lẻ"),5==e&&a>=1?o+=" lăm":4==e&&a>=1?o+=" tư":(e>1||1==e&&0==a)&&(o+=" "+t[e]),o},n=function(n,o){var a="",e=Math.floor(n/100),n=n%100;return o||e>0?(a=" "+t[e]+" trăm",a+=r(n,!0)):a=r(n,!1),a},o=function(t,r){var o="",a=Math.floor(t/1e6),t=t%1e6;a>0&&(o=n(a,r)+" triệu",r=!0);var e=Math.floor(t/1e3),t=t%1e3;return e>0&&(o+=n(e,r)+" ngàn",r=!0),t>0&&(o+=n(t,r)),o};return{doc:function(r){if(0==r)return t[0];var n="",a="";do ty=r%1e9,r=Math.floor(r/1e9),n=r>0?o(ty,!0)+a+n:o(ty,!1)+a+n,a=" tỷ";while(r>0);return n.trim()}}}();

Cách dùng

alert( DOCSO.doc(123000) );

Friday, September 11, 2015

Vô hiệu Xem trước In (Print review) của chrome

Tạo 1 shortcut của Chrome mới với Target: "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-print-preview

Tham số --disable-print-preview sẽ vô hiệu hóa xem trước khi in. Bấm in sẽ bật ra giao diện chọn máy in để in.

Nếu thay bằng tham số --kiosk-printing sẽ in luôn mà không cần hỏi chọn máy in nào. Máy in mặc định được in sẽ là máy in trước đó bạn chọn. Tham số rất hữu ích để triển khai hệ thống POS bán hàng... k phải mất thời gian xác nhận máy in.

Và tham số --kiosk sẽ cho phép Chrome chạy ở trạnh thái Full Screen.

Chú ý:
- Thoát Chrome hoàn toàn mà mở lại bằng shortcut mới thì tham số mới có hiệu lực.
- Đường dẫn đến ứng dụng Chrome thay đổi tùy theo máy tính của bạn.

Sunday, August 23, 2015

Nâng cấp PHP cho AppServ

Còn rất nhiều người dùng Windows XP và... cũng như là AppServ (appserv-win32-2.5.10.exe). Phiên bản 2.5.10 đã rất lâu rồi không được update và hình như project đã bị loại bỏ cập nhật luôn thì phải. Có một điều tuyệt vời của AppServ là nó rất nhẹ. Nó đã loại bỏ hết những thành phần không cần thiết của 1 LAMPP. Chỉ duy nhất có Apache 2.2 với PHP 5.2.6. Đối với Apache 2.2 có cũ thì cũ nhưng vấn đề không quan trọng lắm với 1 coding vì người ta hay dùng để developing là chính nhưng với PHP 5.2.6 cũ kỹ thì việc coding sẽ là vấn đề khó khăn vì những đặc tính mới của PHP bị thiếu. Vào thời điểm 2015 hiện tại thì hầu hết web hay opensource đều yêu cầu 5.3 trở lên.

Mình sẽ thực hiện việc nâng cấp lên 5.3
- Tải 5.3 ở đây: http://windows.php.net/downloads/releases/archives/ (mình chọn version cuối cùng của 5.3 http://windows.php.net/downloads/releases/archives/php-5.3.9-Win32-VC9-x86.zip)

- Mình tải bản ZIP và thực hiện cài đặt thủ công. Mình giải nén ZIP đó ra thư mục C:/AppServ/php53

- Tiếp mở C:\AppServ\Apache2.2\conf\httpd.conf tìm và thay dòng LoadModule php5_module C:/AppServ\php5\php5apache2_2.dll thành 2 dòng:
LoadModule php5_module C:/AppServ/php53/php5apache2_2.dll
PHPIniDir C:/AppServ/php53/php.ini

- Đổi tên file C:\AppServ\php53\php.ini-development thành C:\AppServ\php53\php.ini

- Mở C:\AppServ\php53\php.ini.
+ Tìm ;extension_dir = "ext" và thay bằng extension_dir = "C:/AppServ/php53/ext"
+ Gở bỏ dấu ; trước các dòng:
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_exif.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_sockets.dll
extension=php_sqlite.dll
extension=php_sqlite3.dll
(đây là những extension cơ bản)
+ Tìm và thay thế ;date.timezone = thành date.timezone = "Asia/Saigon"

- Tiếp theo là restart lại Apache: Ấn tổ hợp phím Windows + R, gõ vào services.msc chạy và tìm Apache2.2, bấm phải chọn Restart. Nếu không có lỗi gì thì ok rồi.

- Bạn mở C:\AppServ\www\phpinfo.php sửa <? thành <?php, lưu lại rồi dùng trình duyệt kiểm tra http://localhost/phpinfo.php xem có phải php 5.3.9 không.

Sunday, July 5, 2015

Thiết lập wildcard subdomain dùng BIND trên Ubuntu

Ví dụ ta code PHP trên ubuntu. Tạo 1 project dev.com (localhost) và muốn mọi subdomain của nó đều trỏ về 127.0.0.1 (Hoặc bất kỳ IP nào). Nhầm mục đích lập trình, test code.

Cài đặt bind
sudo apt-get install bind9

Thiết lập BIND như là 1 caching server. Có nghĩa là card mạng dùng DNS của BIND dùng DNS của public của DNS nào đó nếu muốn internet

Mở:
/etc/bind/named.conf.options

Thiết lập:
forwarders {
  # Phía dưới dùng google DNS. Bạn có thể dùng DNS khác
  8.8.8.8;
  8.8.4.4;
};

Tạo 1 ZONE

Mở:
/etc/bind/named.conf.local

Thêm 1 zone:
zone "dev.com" {
  type master;
  file "/etc/bind/db.dev.com";
};

Tạo:
/etc/bind/db.dev.com

Thêm vào:
;
; BIND data file for local loopback interface
;
$TTL 14400
@ IN  SOA dev.com. root.dev.com. (
            2012091901   ; Serial
                 86400   ; Refresh
                  7200   ; Retry
               3600000   ; Expire
                 86400 ) ; Negative Cache TTL
;
@ IN  NS  dev.com.
@ IN  A 127.0.0.1
* IN  A 127.0.0.1
@ IN  AAAA  ::1

Khởi động lại BIND

sudo service bind9 restart

Bước tiếp theo là thiết lập card mạng chúng ta dùng DNS 127.0.0.1
Please google!

Kết tiếp là thiết lập Apache (tạo virtual host) cho tên miền dev.com
<Virtualhost *:80>
  ServerName dev.com
  ServerAlias *.dev.com
  DocumentRoot /home/user/www/dev.com
  <directory "/home/user/www/dev.com">
    AllowOverride All
    Options All
    Order allow,deny
    Allow from all
  </Directory>
  ErrorLog /var/log/apache2/dev.com.error.log
  CustomLog /var/log/apache2/dev.com.access.log combined
</VirtualHost>

Monday, June 15, 2015

Import file .sql của MySQL trên Windows

C:\xampp\mysql\bin\mysql -u TÀI_KHOẢN -pMẬT_KHẨU TÊN_CSDL < C:\file.sql

Fix vấn đề Tiếng Việt latin1 sang UTF8 của MySQL

Nếu 1 ngày nào đó 1 bạn được 1 file .sql. Sau khi import vào MySQL và bạn xem trong phpMyAdmin thấy tiếng Việt của chúng ta nó biến thành dạng như hình dưới:


Điều này xác định bản này đã DEFAULT CHARSET=utf8 hoặc latin1, cột dữ liệu đã chỉnh COLLATE utf8_general_ci hoặc latin1_general_ci. Nhưng code PHP phía người dùng khi INSERT dữ liệu vào database không có SET NAMES utf8... cho nên dữ liệu chúng ta nó như vậy. MySQL đủ thông minh để hiểu chữ Việt chúng ta insert không phải bản mã ASCII thuần mà nó là ASCII 8bit và nó dùng ASCII 8bit để lưu nhầm không mất dữ liệu chúng ta. ASCII 8bit còn được Unikey hiểu với bản mã là UTF-8 Literal nhưng công cụ chuyển mã của Unikey không hỗ trợ để chuyển về UTF8.

File sql của mình khá lớn (20MB). Mình có dùng thử Notepad++ (Encoding > Convert to ASCI) vì file .sql đang là UTF8 (mặc định khi dump), sau đấy (Encoding > Encode in UTF8) thì tữ liệu hiện đúng chữ Việt như mong muốn. Sau đấy chúng ta Save As... lại. Tiếp đến search and replace các từ khóa "latin1" -> "utf8". Có thể của bạn không phải là latin1, nhưng mục tiêu của chúng ta là là chuyển tất code Tạo bản về DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci và cột COLLATE utf8_general_ci, tùy theo mà có từ khóa tương ứng. Quá trình search and replace nên search từng cái rồi mới replace vì điều kiện từ khóa hơi hẹp. Repace thành utf8 chỉ dành cho những câu lệnh tạo table thôi.

Sau khi sửa .sql hoàn thành. Tạo database để import bạn phải chọn Collation là uft8_general_ci. Khi mở connection bằng PHP để hiện dữ liệu chúng ta nhớ SET NAMES utf8 (có thể tìm hiểu thêm từ google). Sở dĩ chúng ta phải làm việc này vì chữ việt tổ hợp của chúng ta có trong bản mã UTF8.

Sunday, May 17, 2015

Huyền thoại Ruby on Rails đã sụp đổ nhờ PHP

Cách đây 3 năm Ruby on Rails bắt đầu tấn công vào cộng đồng Java nhờ những lời lẽ khoa trương về sức mạnh của nó. Dereck của CDbaby đã bị xao động và quyết định viết lại website của ông ta dựa trên Rails sau khi tuyển mộ một trong các nhân vật chủ chốt của cộng đồng Rails. Hai năm sau đó Dereck đã thấm đòn: Ruby và Rails không phải là viên đạn bạc cho các ứng dụng web.

Ông ta đã tiến hành viết lại site của mình bằng PHP trong 2 tháng và giảm số dòng code từ 90 000 dòng Ruby/Rails xuống còn 12 000 dòng PHP với những bài học rút ra được từ cách tổ chức ứng dụng theo tinh thần của Rails. Những gì ông ta có được đều rất đáng kể: tốc độ, khả năng bảo trì của ứng dụng, không còn ác mộng về Rails.

Trên thực tế Dereck trở về với PHP không phải là ko có lý do. Rails đã cho ông ta bài học khá tốt về lập trình hướng đối tượng theo phong cách mới khi mà năm 2005, cộng đồng PHP chưa đủ chín cho việc đó. Năm này, tôi có bài viết đầu tiên của mình về PHP5 với các tính năng hướng đối tượng trên PCWorld nhưng 2 năm sau đó cộng đồng PHP ở VN vẫn dẫm chân tại chỗ. Nhưng cũng phải mất 2 năm tôi mới thực sự hiểu lập trình hướng đối tượng trong PHP khi đánh vật với framework của riêng mình trong 16 tháng qua. Mọi vấn đề chỉ có thể được đào xới thông qua lao động thực sự. Nhưng những điều tốt đẹp đã hẳn không thể đến sau vài năm ngắn ngủi nếu như đã không có sự chuyển biến rất lớn trong cách tư duy của cộng đồng PHP: đó là mô hình hướng đối tượng ngày càng được hoàn thiện từ bản 5.0 sang 5.1. Hiện tại chúng ta đã có bản 5.2 ổn định hơn rất nhiều. Bản 5.3 sẽ xuất hiện sau 3-4 tháng nữa với Late static binding và name space hứa hẹn sẽ hoàn thiện hơn mô hình OOP của PHP. Cùng lúc đó người dùng không cần chờ đến PHP6 để có được sự hỗ trợ Unicode buit-in trong PHP mà extension intl đã được back port sang PHP5. Và lập trình viên PHP (như tôi) đã có 2 năm để đánh vật với lập trình hướng đối tượng trong PHP5 đủ để hiểu những chi phí ẩn và lợi ích đi kèm. Nhiều người đã phải cần đến một công nghệ khác làm nền tảng (với tôi là Java) khi mà common sense trong cộng đồng PHP còn khá khiêm tốn. Mọi người cũng đã thấy sự hoàn thiện dần của Zend

Framework, SolarPHP, CakePHP, Symfony, sự ra đi của Mojavi, Phrame, Blueshoes ... và vô số các framework khác như là sự kết thúc các thử nghiệm thất bại trong việc tìm ra một mô hình phát triển đúng đắn cho PHP framework. Mặc dù tất cả các web framework đương đại đều có các điểm yếu riêng của nó khiến một ai đó trong chúng ta không hài lòng (trong đó có tôi) thì chúng ta cần thừa nhận rằng sự phát triển đó đã rút ngắn khoảng cách công nghệ giữa Ruby và PHP trên một số phương diện thuần ngôn ngữ. Dereck vốn có quan hệ thân thiết với một số key figure trong cộng đồng PHP và hiển nhiên đã nhận thức được điều này. Thế là cuộc phiêu lưu với Rails chấm dứt.

Bài học của Dereck để lại vài nhận thức:

- Thế giới PHP đã có quá nhiều thay đổi: các lập trình viên PHP nên ngừng code và nghe ngóng đi kẻo tư duy của bạn đã lạc hậu so với phần còn lại của thế giới.

- Đứng cố theo đuổi một công nghệ cho một dự án nếu như với loại dự án đó nó không work. Hãy cân nhắc nó trong tương lai. Hãy nhận thức điều đó sớm hơn nếu muốn tránh hiệu ứng hệ thống thứ 2 trong công nghệ phần mềm.

- Chọn công cụ đúng. Ngôn ngữ là một công cụ nhưng framework cũng là một công cụ theo nghĩa hẹp hơn hơn nhiều. Nó không phải là viên đạn bạc. Ví dụ dùng PHP để lập trình Desktop application vào thời điểm hiện tại là dở hơi. Ví dụ PHP có thể không hiệu quả như Perl trong các ứng dụng system scripting. Và nó chỉ đúng khi nó vừa tay với bạn. Tôi đố bạn trở thành chuyên gia của mọi loại ngôn ngữ nhất là khi đối với bạn, ngôn ngữ lập trình hay công nghệ chỉ là cái tivi, bật nó trong 8 tiếng xem qua ngày rồi tắt nó đi. Một chuyên gia công nghệ không thể chỉ là người thành thạo API (các bạn có các certification cho ngôn ngữ nọ kia dừng xúc động) mà bạn còn cần đến sự hiểu biết ở mức low-level mới mong xây dựng được các hệ thống high traffic kiểu như CDBaby. Đây chính là một trong các lý do khiến dự án Rails thất bại.

- Liên tục theo dõi sự phát triển của công nghệ. Dereck hiển nhiên đã thấy bứt rứt vì thành công của Digg, Facebook, Friendster, Technorati, Flickr, Wikipedia... các ứng dụng PHP khổng lồ về phương diện traffic và sự ngao ngán của những người sáng lập Twitter về sự yếu kém của Rails trong vấn đề tương tự.

- Ngôn ngữ là cái gì đó cố định: Tôi là người thừa nhận "language matters" chứ không như một số em chã khác. Cho dù quảng cáo gì về tính general purpose của 1 language thì rút cục thông qua lao động, người ta luôn thấy một ngôn ngữ đều làm tốt một số vai trò của nó tốt hơn một số ngôn ngữ khác. Đây chính là tiền đề cho DSL của Martin. Nhận thức được điều này đồng nghĩa với việc bạn chọn được công cụ đúng. Tính mềm dẻo của một ngôn ngữ thể hiện ở chỗ nó có hòa hợp được với các chuẩn công nghiệp thường gặp hay không: hỗ trợ XML/JSON/SWX, design pattern, OOP, AOP, SOAP, SOA. Cú pháp của PHP có thể xấu xí nhưng khi đi vào lập trình hướng đối tượng nó không khác gì Java về cả phương diện tổ chức lẫn cú pháp vì Java đẻ ra mô hình hướng đối tượng cho PHP. PHP là đủ mềm dẻo để lập trình viên lựa chọn mô hình lập trình cho mình. Những ai nhìn thấy tính cố định của một mô hình lập trình (ví dụ nhiều người code Java thấy PHP toàn được mix vào HTML và coi đó là cách phát triển PHP duy nhất) chỉ cho thấy là họ có hạn chế nhất định về mặt tư duy công nghệ trên các ngôn ngữ mục đích chung. Trường hợp của Dereck cho thấy ông ta đã thu nhận được kiến thức từ chuẩn công nghiệp của ngành và nhanh chóng áp dụng nó một cách thành công sau 2 tháng với PHP. Nhưng để học được kiến thức đó, ông ta cần đến 2 năm trả giá.

- Tooling: đây là một vấn đề mà Dereck đã mắc phải và phải trả giá cho nó. Không có một tool nào là viên đạn bạc. Rails là một loại cool tool dành cho một lớp các vấn đề. Nó có thể giúp giải quyết 95% vấn đề thường gặp chỉ bằng 5% nỗ lực nhưng khi miền vấn đề của ứng dụng đã vượt ra khỏi 5% đó, chúng ta sẽ phải lấp kín 95% còn lại bằng sự đau đớn. Trường hợp ASP.NET cũng như vậy. Không có gì khiến chúng ta thất vọng hơn là sự phụ thuộc vào một IDE, một thứ kiến trúc trâu chẳng ra trâu ngựa chẳng ra ngựa và một cộng đồng toàn những morons. Hiệu suất của tooling luôn đi kèm với tính độ sâu của abstraction, độ giảm của flexibility và nhiều khi nó làm cho ứng dụng dựa trên tool như là một black hole. Điều này dễ hiểu tại sao lập trình viên Rails là morons và lập trình viên ASP.NET là những morons cấp "cao" hơn.

- Khi bạn lập một dự án hoàn chỉnh để kiếm tiền, bạn chọn một hệ thống, một cộng đồng chứ không phải là một framework, một ngôn ngữ. Dereck sai lầm vì chọn Rails thay vì chọn một hệ thống trong khi cái phục vụ người dùng là hệ thống chứ không phải là Rails. Dereck bị quyến rũ bởi API trong khi ông ta không tính toán kĩ API đó sẽ đem lại user experience như thế nào và chi phí của nó là bao nhiêu. Khi Rails phù hợp với một hệ thống không work theo nhu cầu của ông ta thì dự án thất bại. Dereck sai lầm vì chọn một cộng đồng quá nhỏ, mọi thứ đều rất mới và khi cộng sự của ông ta ra đi, di sản để lại là không thể gánh được. Quay trở lại cộng đồng PHP, ông ta sẽ đối mặt với một thách mức mới: dân cư PHP đông đến mức nếu ông ta để lộ mã nguồn thì tôi tin rằng ngay ngày mai sẽ có CDBaby đánh số từ 1 đến 1000 xuất hiện. Kinh nghiệm triển khai các hệ thống lớn với PHP đã được đăng tải trên web công cộng dày đặc đến mức có lẽ cần lập riêng một nhà xuất bản để in lại. Dereck rời bỏ một cộng đồng đã quá chín muồi và đang nâng cấp level để đến một cộng đồng còn quá trẻ nhưng không đóng bảo hiểm tai nạn. Thế có buồn không?

Dù sao xin chúc mừng đứa con xa quê trở lại.

(Theo pcdinh - phpvietnam/O'reilly)

Tuesday, March 31, 2015

Driver Xerox Phaser 3110 for Windows 7, Windows 8.1, Windows 10

Xerox Phaser 3110 for Windows 7 (32 bit), Windows 8.1 (32 bit), Windows 10 (32 bit)

Download: https://www.dropbox.com/s/sdt0vv6qyqri869/Phaser3110.zip?dl=0

Xerox Phaser 3110 for Windows 7 (64 bit), Windows 8.1 (64 bit), Windows 10 (64 bit)

Download: https://www.dropbox.com/s/gwcs22mqfgsubi9/XeroxPhaser3110-win64bit.zip?dl=0

64bit driver is ported from Samsung ML-1200 driver (a other brand of Xerox 3110) so before install it you must disable driver signature verification (https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=How+to+Disable+Driver+Signature+Verification+on+64-Bit)

Go to Device Manager, right click on Printer and choice Update Driver Software..., browser to folder contain driver (after unzip) to install it.

-------------------------
Xerox Phaser 3110 là dòng Printer khá là cỗ lỗ, thông dụng và bền cực kỳ :-s