2019-01-20

Tìm hiểu về domain name system

Tìm hiểu về domain name system

Tổng quan

DNS - Domain Name System hay hệ thống tên miền là một cơ sở dữ liệu phân tán nằm trên các server khác nhau lưu thông tin ánh xạ giữa domain name và địa chỉ IP. DNS thực hiện dịch domain name tới một địa chỉ IP và ngược lại.
Sau đây là sơ đồ hoạt động của DNS.

Một số khái niệm trong DNS

Domain name space

Là một cấu trúc dạng cây chứa toàn bộ không gian domain như hình ảnh sau đây:

Domain

Là một nhánh của domain name space. Sau đây ví dụ về domain "purdue.edu".

Domain name

Mỗi node trong cây có một nhãn. Một domain name của bất kỳ một node nào trong cây là thứ tự các nhãn trong đường dẫn từ node đó đến root, tên mỗi node được phân cách bằng dấu chấm .

Resource Record

Thông tin về domain name được lưu trong các resource record. Mỗi resource record đặc tả thông tin về một đối tượng cụ thể. DNS server sử dụng các record này để trả lời các DNS query. Dưới đây là một vài resource record phổ biến:
  • SOA - Start of authority: Record lưu thông tin quản trị zone và mỗi zone chỉ có duy nhất một SOA.
  • NS - Name server: Record lưu ánh xạ domain name tới một danh sách các name server.
  • A: Record lưu ánh xạ domain name tới một địa chỉ IP.
  • PTR - Reverse-lookup pointer: Record lưu ánh xạ địa chỉ IP tới một domain name.
  • MX - Mail exchange: Record lưu ánh xạ domain name tới một danh sách các mail server. Ví dụ khi bạn gửi mail tới contact@example.com thì mail sẽ được chuyển tới mail server được đặc tả trong MX Record.
  • CNAME: Record lưu ánh xạ một domain name tới một domain name khác.

Top level domain

Là domain ở cấp cao nhất ngay bên dưới root domain trong hệ thống phân cấp của DNS. Top level domain được chia ra làm 2 loại chính:
  1. Generic TLD (gTLD)
  2. Country Code TLD (ccTLD)
Ví dụ một vài gTLD:
  • .com: Cho các website thương mại
  • .org: Cho các tổ chức phi lợi nhuận
  • .edu: Giới hạn trong các trường học và tổ chức
  • .net: Ban đầu giới hạn trong các tổ chức hạ tầng mạng nhưng bây giờ thì không hạn chế
Ví dụ một vài ccTLD:
  • .us: United States
  • .in: India
  • .uk: United Kingdom
  • .vn: Vietnam
Hình ảnh cấu trúc cây DNS:

Delegation và Authority

Một trong những mục tiêu chính của thiết kế hệ thống DNS là phân cấp quản trị. Nó đạt được thông qua delegation - uỷ thác.
Cơ quan quản lý domain gọi là Authority. Cơ quan quản lý root domain và gTLD thuộc về ICANN - Internet Corporation for Assigned Names and Numbers. Tên miền ccTLD thì được quản lý bởi các quốc gia.
Một tổ chức quản lý domain có thể chia nó thành các sub-domain. Mỗi sub-domain có thể ủy quyền quản trị cho các tổ chức khác. Ví dụ domain "standford.edu" được uỷ quyền quản trị tới trường đại học Standard.

Name server và Zone

Name server: Là server lưu trữ các resource record về domain và thông tin name server của các sub-domain của nó. Các name server thường chỉ chứa thông tin đầy đủ về một phần của domain name space được gọi là zone.
Lưu ý: Root name server là name server của root domain hay name server gốc của toàn bộ hệ thống DNS.
Sau đây là ví dụ domain edu được chia thành các zone như: zone berkeley.edu, zone purdue.edu và zone nwu.edu zone. Và bản thân edu cũng là một zone.

DNS Resolver

Phía client của DNS gọi là DNS Resolver. DNS Resolver chịu trách nhiệm thực hiện các DNS query.

DNS Query

Có 3 loại DNS query:
  • Recursive query: Truy vấn đệ quy
  • Iterative query: Truy vấn lặp đi lặp lại
  • Inverse query: Truy vấn domain name cho địa chỉ IP chỉ định



Sau đây là các bước khi thực hiện phân giải tên miền chẳng hạn rutgers.edu.
  • Resolver sẽ gửi một query tới DNS local
  • DNS local sẽ tìm kiếm rutgers.edu trong cơ sở liệu của nó. Nếu có trả về địa chỉ IP cho Resolver. Nếu không thực hiện bước tiếp theo.
  • Resolver sẽ gửi query tới root name server
  • Root name server sẽ uỷ thác trả lời query đến name server của domain .edu
  • Name server của domain .edu tiếp tục uỷ thác trả lời query đến name server của domain rutgers.edu
  • Trả về thông tin IP được lấy từ A record cho Resolver.

Một vài mẹo khi sử dụng DNS

Cấu hình DNS local sử dụng hosts file

Tôi gặp một tình huống như sau: Khách hàng sẽ migration server sang một server mới mà không stop service trên server cũ + một số rule sercurity mà khách hàng config 2 server vs thông tin kiểu như sau:
  • Domain name example.com được gắn với IP của server A.
  • Cả server A và server B đều có cùng config server_name = example.com trên web server.
Vậy làm thế nào để access vào website example.com của server B?
Tôi thêm config sau vào file hosts với path là /etc/hosts ở các máy hệ linux hay mac.
SERVER-B_IP_ADDRESS example.com
Lưu ý: Host file được sử dụng giống như một resource record để phân giải domain name tới địa chỉ IP.
Khi đó nếu bạn gõ example.com lên browser nó sẽ chạy đến website example.com của server B thay vì server A. Để xác nhận xem config đã hoạt động ổn chưa bạn bật Develop Tools của browser rồi kiểm tra thông tin Headers của request có dạng như sau:
Request URL: http://example.com/
Request Method: GET
Status Code: 200 OK
Remote Address: SERVER_ADDRESS
Referrer Policy: no-referrer-when-downgrade

Cấu hình DNS cho domain name

Để một website hoạt động thì ta phải thực hiện thao tác trỏ domain name về website đó. Và có 2 cách để làm việc này đó là:
  • Trỏ thẳng domain name tới địa chỉ IP của server chứa website đó.
    hoặc
  • Thêm thông tin name server của nhà cung cấp server vào domain name.
Sau khi config xong bạn có thể sử dụng tool sau để kiểm tra thông tin cấu hình domain name:
https://ipinfo.info/html/ip_checker.php/

Sử dụng CNAME record

Giả sử bạn có 2 website là example.com và example.vn trên cùng một server. Khi đó bạn có thể config 2 domain name trỏ đến cùng một địa chỉ IP nhưng nếu bạn có ý định đổi địa chỉ IP của server thì bạn phải config IP lại cho cả 2 domain name trên.
Tuy nhiên nếu sử dụng CNAME record chẳng hạn trỏ domain name example.vn tới domain name example.com như ví dụ bên dưới thì khi đó bạn cần config IP lại chỉ ở domain main example.com mà thôi.
NAME               TYPE    VALUE
---------------------------------------
example.vn.        CNAME   example.com.
example.com.        A      192.0.2.23

Tài liệu tham khảo

Làm sao để convert String sang Number trong JavaScript?

Làm sao để convert String sang Number trong JavaScript?

JavaScript cung cấp nhiều cách khác nhau để convert String sang Number. Và trong bài viết này, mình sẽ tổng hợp lại một số cách mà mình đã biết.

Sử dụng Number() function

Đúng vậy, đó là Number() function chứ không phải Number() constructor.
Vì Number() constructor (là khi bạn sử dụng với từ khoá new) sẽ tạo mới một Number Object với rất nhiều thứ kèm theo. Còn Number() function sẽ tạo ra một số thông thường (primitive).
const x = new Number("6666");
console.log(x); // => Number {6666}

const y = Number("6666");
console.log(y); // => 6666
Một số ví dụ khác:
const x = Number('66,66');
console.log(x); // => NaN

const y = Number('66.66');
console.log(y); // => 66.66

const z = Number('66666');
console.log(z); // => 66666
Qua ví dụ trên, bạn thấy rằng: nếu String truyền vào không phải Number thì kết quả thu được là NaN; nếu tham số truyền vào không phải số nguyên thì kết quả không bị làm tròn.

Sử dụng parseInt() và parseFloat()

Phương thức parseInt()

Phương thức parseInt() là một giải pháp thường hay được sử dụng. Phương thức này sẽ parse String tuỳ theo hệ cơ số xác định. Vì vậy, mình đã thường xuyên sử dụng cách này để convert String sang Number trong JavaScript.
Ví dụ:
const x = parseInt('1000.12', 10);
console.log(x); // => 1000

const y = parseInt('1000', 16);
console.log(y); // => 4096

const z = parseInt('1000', 8);
console.log(z); // => 512

const t = parseInt('1000', 2);
console.log(t); // => 8 
Với giá trị của hệ cơ số hợp lệ là từ 2 đến 36. Trong trường hợp bạn không truyền giá trị của hệ cơ số vào thì JavaScript sẽ tự parse theo nguyên tắc:
  • String bắt đầu bằng "0x" hoặc "0X" => hệ cơ số 16 (hexadecimal)
  • String bắt đầu bằng "0" => hệ cơ số 8 (octal) hoặc 10 (decimal) tuỳ thuộc vào trình duyệt
  • String bắt đầu bằng các số khác thì => hệ cơ số 10 (decimal)
  • String bắt đầu không phải là số => NaN
Ví dụ:
const x = parseInt('1000.12');
console.log(x); // => 1000

const y = parseInt('0x1000');
console.log(y); // => 4096

const z = parseInt('01000');
console.log(z); // => 1000

const t = parseInt('b1000');
console.log(t); // => NaN
Kết quả có vẻ hơi khó đoán nhỉ?
Theo mình, tốt nhất là luôn truyền vào giá trị của hệ cơ số muốn parse để luôn thu được giá trị như mong muốn.

Phương thức parseFloat()

Nếu như phương thức parseInt() luôn trả về kết quả là một số nguyên thì phương thức parseFloat() sẽ trả về kết quả là một số float.
Ví dụ:
const x = parseFloat('1000,12', 10);
console.log(x); // => 1000

const y = parseFloat('1000.12', 10);
console.log(y); // => 1000.12

const z = parseFloat('1000.120', 10);
console.log(z); // => 1000.12

const t = parseFloat('1000', 10);
console.log(t); // => 1000

Sử dụng toán tử +

Ví dụ:
const x = +'1000,12';
console.log(x); // => NaN

const y = +'1000.12';
console.log(y); // => 1000.12

const z = +'1000.120';
console.log(z); // => 1000.12

const t = +'1000';
console.log(t); // => 1000

Sử dụng Math.floor()

Phương thức Math.floor() khá giống với phương thức parseInt() phía trên.
Ví dụ:
const x = Math.floor('1000.12');
console.log(x); // => 1000

const y = Math.floor('0x1000');
console.log(y); // => 4096

const z = Math.floor('01000');
console.log(z); // => 1000

const t = Math.floor('b1000');
console.log(t); // => NaN

Sử dụng toán tử *

Ví dụ:
const x = '1000,12' * 1;
console.log(x); // => NaN

const y = '1000.12' * 1;
console.log(y); // => 1000.12

const z = '1000.120' * 1;
console.log(z); // => 1000.12

const t = '1000' * 1;
console.log(t); // => 1000

Sử dụng toán tử /

Ví dụ:
const x = '1000,12' / 1;
console.log(x); // => NaN

const y = '1000.12' / 1;
console.log(y); // => 1000.12

const z = '1000.120' / 1;
console.log(z); // => 1000.12

const t = '1000' / 1;
console.log(t); // => 1000

Sử dụng toán tử -

Ví dụ:
const x = '1000,12' - 0;
console.log(x); // => NaN

const y = '1000.12' - 0;
console.log(y); // => 1000.12

const z = '1000.120' - 0;
console.log(z); // => 1000.12

const t = '1000' - 0;
console.log(t); // => 1000

Sử dụng Bitwise not ~~

Ví dụ:
const x = ~~'1000,12';
console.log(x); // => 0

const y = ~~'1000.12';
console.log(y); // => 1000

const z = ~~'1000.120';
console.log(z); // => 1000

const t = ~~'1000';
console.log(t); // => 1000

Sử dụng toán tử dịch >>>

Ví dụ:
const x = '1000,12' >>> 0;
console.log(x); // => 0

const y = '1000.12' >>> 0;
console.log(y); // => 1000

const z = '1000.120' >>> 0;
console.log(z); // => 1000

const t = '1000' >>> 0;
console.log(t); // => 1000

Lời kết

Trên đây là một số cách để convert String sang Number trong JavaScript. Để so sánh tốc độ giữa các cách này, bạn có thể tham khảo và viết thêm testcase để so sánh tại Convert a string to a number using JavaScript.

Ngoài ra, bạn thường hay sử dụng cách nào để convert String sang Number trong JavaScript? Mình hy vọng được biết thêm nhiều cách khác nữa của bạn trong phần bình luận phía dưới!
Xin chào và hẹn gặp lại, thân ái!

Thử sử dụng tool convert PHP code theo chuẩn PSR-1 và PSR-2

Thử sử dụng tool convert PHP code theo chuẩn PSR-1 và PSR-2

1. Đặt vấn đề

Khi review code của từng thành viên, bạn nhóm trưởng (team lead) thường yêu cầu định dạng lại phần code đã viết sao cho thuận mắt một tí. Cái đó dân gian gọi là Reformat code.
Đối với ngôn ngữ PHP thì PSR là một trong các chuẩn viết code cơ bản, nó không hề cao siêu gì mà dành cho tất cả mọi người. Nó có nhiều chuẩn, 18 gì gì đấy, bạn nào tay trâu thì ghé qua https://www.php-fig.org/psr/), nói chung khá khó nhớ, tuy nhiên việc gì khó thì ta đều có công cụ support tận răng.
Hôm nay mình sẽ dùng thử tool PHP-CS-Fixer, chữ CS là viết tắt của Coding Standards. Tool này hỗ trợ reformat nhiều file cùng một lúc (theo folder), với chuẩn mặc định là PSR-1 và PSR-2.

2. Cài đặt

Theo hướng dẫn tại trang chủ https://github.com/FriendsOfPHP/PHP-CS-Fixer thì ta có 20 giây để làm tất cả các bước sau.
2.1 Mở terminal lên và tải về
wget https://cs.symfony.com/download/php-cs-fixer-v2.phar -O php-cs-fixer
2.2 Cung cấp quyền, cho phép thực thi
sudo chmod a+x php-cs-fixer
2.3 Chuyển về /usr/local/bin để có thể chạy ở bất kì terminal nào
sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer

3. Dùng thử

Nếu đang ở trong project của bạn, và muốn thử với tất cả các file trong thư mục app/Http/Controllers thì đơn giản chạy lệnh sau và tận hưởng thành quả.
php-cs-fixer fix app/Http/Controllers

4. Gỡ cài đặt

sudo rm -rf /usr/local/bin/php-cs-fixer 
rm -rf .php_cs.cache
Là bài kipalog đầu năm, gửi gắm luôn nhiều thứ

Imagick trong PHP

Imagick trong PHP

1. Tản mạn ngoài lề.


Mình có làm việc với Imagick để chuyển PDF sang Image. Sau quá trình tìm hiểu thì note việc setting Imgick với xampp windows lại đây.
Imagick: Wiki và nhiều nguồn.
ImageMagick có khả năng đọc, ghi, và chuyển đổi nhiều dạng file ảnh như JPEG, GIF, PNG, TIFF, PDF, PostScript, SVG... (tổng cộng hơn 100 định dạng).
Có thể dùng ImageMagick thực hiện các thao tác đơn giản với hình ảnh như: dịch chuyển, xoay hình, lật hình, thu phóng, kéo xiên hình; cũng như hiệu chỉnh màu sắc, thêm các hiệu ứng, hoặc vẽ thêm chữ và các khối hình vào file hình ảnh sẵn có.
Cách dùng ImageMagick hiệu quả nhất là thông qua các câu lệnh được thực hiện trong các ngôn ngữ lập trình. ImageMagick hỗ trợ giao diện lập trình ứng dụng API cho nhiều ngôn ngữ lập trình khác nhau.

2. Install the Imagick extension in XAMPP for Windows.

a. Cài XAMPP.
https://www.apachefriends.org/index.html
Khá đơn giản, chắc mọi người biết cài cả rồi.
b. Kiểm tra phiên bản PHP.
Mở Command prompt (Lúc đầu mình mở git bash và không được :v) ra và kiểm tra những phần sau:
  • php -i|find "PHP Version" : Kiểm tra PHP version.
  • php -i|find "Thread Safety" : Kiểm tra thread safety. Nếu là enabled tương ứng với Yes và disable tương ứng với No.
  • php -i|find "Architecture" : Kiểm tra architecture. x86 là 32-bit và x64 là 64-bit Lưu ý nó không phải là System type của máy tính. Máy tính mình là 64-bit nhưng architecture là 32-bit.

Ví dụ của mình là: PHP 7.0.33; Thread Safety enabled và Architecture 32-bit.
Vào https://mlocati.github.io/articles/php-windows-imagick.html
Chọn dòng tương ứng và download 2 file php_imagick-….zip và ImageMagick-….zip

c. Extra file
  • Lấy file php_imagick.dll từ php_imagick-….zip để vào ext của xampp/php.
    alt text
  • Lấy file CORE_RL or IM_MOD_RL từ ImageMagick-….zip để vào xampp/apache/bin.
    alt text
  • Thêm C:\xampp\apache\bin vào environment variable.
    alt text
  • Restart lại Apache/NGINX Windows service.