New FAMILUG

The PyMiers

Monday 24 June 2013

YAML là gì?

YAML (http://www.yaml.org/) là 1 định dạng dũ liệu được thiết kế nhằm mục đích để người và máy (các ngôn ngữ lập trình) cùng đọc được.

YAML được dùng vào mục đích tương tự JSON, XML nhưng ngắn gọn xúc tích hơn.
Ví dụ về 1 đoạn YAML được biểu diễn như sau:
-
  name: HVN
  mail:   hvn@familug.org
-
  name: SAM
  mail:   hai.lt@familug.org
http://yaml-online-parser.appspot.com/ Là 1 trang chuyển đổi YAML sang JSON. Bạn nên dùng trang này trong lúc đọc, vừa học vừa hành lúc nào cũng tốt hơn.


YAML để làm gì?

Tương tự JSON hay XML, YAML có thể dùng để chứa đựng thông tin ở dạng text. Dùng cho các file config, lưu giá trị hằng...

YAML và JSON
- JSON là YAML, nói cách khác JSON có thể đọc được bởi các trình đọc YAML, điều ngược lại không đúng.
- JSON đáp ứng tốt hơn mục đích trao đổi dữ liệu ( thông qua AJAX...), YAML để xử lý các dữ liệu offline (file config...). Chắc vì JSON thường được xử lý nhanh hơn (http://stackoverflow.com/questions/2451732/how-is-it-that-json-serialization-is-so-much-faster-than-yaml-serialization-in-p)


YAML và XML
- YAML không có các thẻ thuộc tính như XML nhưng thay vào đó nó hỗ trợ các kiểu khai báo để xử lý dữ liệu.

Ví dụ cho dễ hiểu
1 đoạn XML
<user id="babooey" on="cpu1">
    <firstname>Bob</firstname>
    <lastname>Abooey</lastname>
    <department>adv</department>
    <cell>555-1212</cell>
    <address password="xxxx">ahunter@example1.com</address>
    <address password="xxxx">babooey@example2.com</address>
</user>

1 đoạn YAML
        babooey:
            computer : cpu1
            firstname: Bob
            lastname: Abooey
            cell: 555-1212
            addresses:
                - address: babooey@example1.com
                  password: xxxx
                - address: babooey@example2.com
                  password: xxxx
Muốn lấy thông tin của 1 user: với XML bạn tìm đến thẻ user có id="babooey", với YAML bạn tìm đến key: babooey.

- ở 2 ví dụ trên, bạn thích cách viết của thằng nào hơn :D

Ưu điểm YAML
- Hỗ trợ comment trong file
- Tính linh hoạt trong biểu diễn dữ liệu cao nhờ có hỗ trợ kiểu dữ liệu: float, array, list...
- Hỗ trợ phép gán (anchor)...
- YAML dễ đọc-hiểu-viết, cú pháp ngắn gọn làm đoạn code YAML trong khá thoáng đãng.- Hiện tại YAML có rất nhiều thư viện cho các ngôn ngữ khác nhau: Chi tiết xem ở đây http://yaml.org/

Cú pháp 

- Giống cú pháp của Python, YAML yêu cầu thụt đầu dòng trước mỗi câu. Thụt đầu dòng bởi các dấu cách (tùy cấu trúc (khối lệnh - block) mà dùng 1 hay 2,4... dấu cách), không dùng tab.

- Dùng dấu # để bắt đầu comment.

- dấu "-" để bắt đầu cho 1 list các phần tử

Ví dụ:
# start YAML
- a
- b
-
  - c1
  - c2
-
  -
    - d1
    - d2
 Kết quả: Do link dài nên rút gọn - Click vào đây


- "---" để bắt đầu cho 1 đoạn YAML, và ... để kết thúc đoạn đó ( ... có thể có hoặc không ) Ví dụ: Link

- Với các giá trị lặp lại hoặc dùng nhiều lần,dùng "&" để gán và "*" để lấy giá trị ra:
Ví dụ: Link
Ở đây pink được gán nhãn cl bằng "&cl" ở đầu. Để lấy lại giá trị pink dùng "*cl".
Cái này có vẻ giống con trỏ trong C :D & để ghi địa chỉ, * để lấy giá trị.

Còn nhiều lắm....
Tham khảo thêm về cú pháp khác ở đây: http://www.yaml.org/refcard.html

Chốt lại cho 1 bài "nâng bi":  YAML là ngôn ngữ được thiết kế cho các scriptting languages như python, ruby, perl, php... nên rất dễ để chuyển đổi sang các kiểu dữ liệu của các ngôn ngữ này (như list, dict, array...).
Các Pythonista và Rubyist có thích điều này không :3

6 comments:

  1. cái ví dụ đầu tiên sao có cái - là gì hả anh thồn?
    Em dân thường còn thích :3

    ReplyDelete
  2. bổ sung:
    giải thích thuật ngữ YAML
    YAML là viết tắt của YAML Ain't Markup Language

    Cái tên nói rõ rằng YAML không phải là một ngôn ngữ markup như HTML, XML

    Kiểu chơi chữ này cũng đã từng xuất hiện với LAME
    "LAME Ain't an MP3 Encoder"

    ReplyDelete
  3. In yaml backslash is not a valid escape character in single quoted strings, the only allowed escape-sequence is '' (two single quotes) resulting in one single quote in the string.

    ReplyDelete
    Replies
    1. http://yaml.org/spec/current.html#id2534365

      Delete
    2. Ví dụ sau giải quyết việc 1 yaml value có chứ cả dấu :, " , '

      ejabberd_proc_check:
      description: ejabberd Process
      command: '/usr/lib/nagios/plugins/check_procs -c 1:1 -a ''-ejabberd config "/etc/ejabberd/ejabberd.cfg"'' -u ejabberd'

      copy-paste cẩn thận để biết đâu là dấu " đâu là 2 dấu '

      Delete