YAML
2টি টুল
ডেটা সিরিয়ালাইজেশন ফরম্যাট
ডেটা সিরিয়ালাইজেশন হলো কাঠামোগত ডেটাকে এমন একটি ফরম্যাটে রূপান্তর করার প্রক্রিয়া যা সংরক্ষণ বা প্রেরণ করা যায় এবং পরে পুনর্গঠন করা যায়। বিভিন্ন ফরম্যাট মানুষের পাঠযোগ্যতা, মেশিনের পার্সিং সুবিধা, অভিব্যক্তিশীলতা এবং ফাইলের আকারের মধ্যে বিভিন্ন ট্রেডঅফ রয়েছে।
JSON, YAML, TOML এবং XML হলো সফটওয়্যার ডেভেলপমেন্টে চারটি প্রধান টেক্সট-ভিত্তিক সিরিয়ালাইজেশন ফরম্যাট। প্রতিটির নিজস্ব শক্তি আছে যা নির্দিষ্ট পরিস্থিতিতে এটিকে সেরা পছন্দ করে — সেই আপোসগুলো বোঝা আপনাকে প্রতিটি কাজের জন্য সঠিক ফরম্যাট বেছে নিতে সাহায্য করে।
JSON এবং YAML পাশাপাশি
JSON এবং YAML একই ডেটা মডেল উপস্থাপন করে। YAML হলো JSON-এর একটি কঠোর সুপারসেট — যেকোনো বৈধ JSON ডকুমেন্ট একই সাথে বৈধ YAML। নিচে একই কনফিগারেশন উভয় ফরম্যাটে প্রকাশ করা হয়েছে:
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
},
"database": {
"url": "postgres://localhost/mydb",
"pool": 10
}
}server: host: localhost port: 8080 debug: true database: url: postgres://localhost/mydb pool: 10
YAML ব্রেস ও বন্ধনীর পরিবর্তে ইন্ডেন্টেশন ব্যবহার করে এবং বেশিরভাগ স্ট্রিং মান থেকে উদ্ধৃতি চিহ্ন বাদ দেয়। এটি ম্যানুয়ালি লেখা ফাইলগুলোর জন্য আরও সংক্ষিপ্ত ও পাঠযোগ্য, তবে ইন্ডেন্টেশনের ব্যাপারে সতর্ক থাকতে হয়।
ফরম্যাট তুলনা
| ফরম্যাট | পাঠযোগ্যতা | মন্তব্য | অ্যারে | সেরা ব্যবহার |
|---|---|---|---|---|
| JSON | ★★★☆☆ | মন্তব্য নেই | নেটিভ | API, ডেটা বিনিময় |
| YAML | ★★★★★ | হ্যাঁ (#) | নেটিভ | কনফিগ ফাইল, IaC |
| TOML | ★★★★☆ | হ্যাঁ (#) | নেটিভ | অ্যাপ কনফিগ (Rust, Python) |
| XML | ★★☆☆☆ | হ্যাঁ (<!-- -->) | পুনরাবৃত্ত উপাদান | ডকুমেন্ট, SOAP, SVG |
YAML-এর সাধারণ ফাঁদ
YAML শক্তিশালী, তবে এর কিছু পরিচিত edge case আছে যা ডেভেলপারদের অবাক করে দেয়। এগুলো সবচেয়ে সাধারণ:
YAML 1.1-এ 'NO' মানটি বুলিয়ান false হিসেবে ব্যাখ্যা করা হয়। NO, OFF, FALSE, N-এর মতো মানগুলো সবই false হিসেবে পার্স করা হয়। YAML 1.2-এ এটি সংশোধন করা হয়েছে, তবে অনেক পার্সার এখনও 1.1 নিয়ম ব্যবহার করে। সবসময় অস্পষ্ট স্ট্রিং উদ্ধৃতিতে রাখুন।
YAML কাঠামো সংজ্ঞায়িত করতে ইন্ডেন্টেশন ব্যবহার করে। একটি অতিরিক্ত স্পেস বা ট্যাব অক্ষর একটি ডকুমেন্টের অর্থ সম্পূর্ণরূপে পরিবর্তন করতে পারে। YAML-এ ইন্ডেন্টেশনের জন্য ট্যাব নিষিদ্ধ — শুধুমাত্র স্পেস।
যে মানগুলো সংখ্যা, বুলিয়ান বা null-এর মতো দেখায় সেগুলো স্বয়ংক্রিয়ভাবে রূপান্তরিত হয়। '1.0' একটি ফ্লোট হয়ে যায়, কিছু পার্সারে '2024-01-01' একটি তারিখ অবজেক্ট হয়ে যায়। যে মানগুলো স্ট্রিং হিসেবে রাখতে চান সেগুলো উদ্ধৃতিতে রাখুন।
YAML স্পেসিফিকেশন ইন্ডেন্টেশনের জন্য ট্যাব অক্ষর স্পষ্টভাবে নিষিদ্ধ করে। যে এডিটরগুলো স্বয়ংক্রিয়ভাবে স্পেসকে ট্যাবে রূপান্তর করে সেগুলো নীরবে আপনার YAML ফাইল ভেঙে দেবে। আপনার এডিটর YAML ফাইলে স্পেস ব্যবহার করতে কনফিগার করুন।
YAML-এ দুটি বহু-লাইন স্ট্রিং নির্দেশক আছে: | (আক্ষরিক ব্লক, নতুন লাইন সংরক্ষণ করে) এবং > (ভাঁজ করা ব্লক, নতুন লাইনকে স্পেসে রূপান্তর করে)। এগুলো মিশিয়ে ফেললে নীরবে ভুল আউটপুট আসে।
YAML অ্যাঙ্কর (&) এবং অ্যালিয়াস (*) নোড পুনরায় ব্যবহারের সুযোগ দেয়, যা শক্তিশালী কিন্তু বৃত্তাকার রেফারেন্স তৈরি করতে পারে যা সরল পার্সারে অসীম লুপ বা মেমোরি সংকট ঘটায়। অবিশ্বস্ত উৎস থেকে অ্যাঙ্করযুক্ত YAML যাচাই করুন।
YAML-এর স্বতন্ত্র বৈশিষ্ট্য
মন্তব্য
YAML # অক্ষর দিয়ে মন্তব্য সমর্থন করে। কনফিগারেশন ফাইলের জন্য JSON-এর তুলনায় এটি একটি সবচেয়ে বড় ব্যবহারিক সুবিধা — আপনি আপনার সেটিংস সরাসরি ইনলাইনে নথিভুক্ত করতে পারেন। মন্তব্য তার নিজস্ব লাইনে বা একটি মানের পরে আসতে পারে।
অ্যাঙ্কর এবং অ্যালিয়াস
YAML আপনাকে &anchor-name দিয়ে একটি নোড একবার সংজ্ঞায়িত করতে এবং *anchor-name দিয়ে যেকোনো জায়গায় পুনরায় ব্যবহার করতে দেয়। এটি জটিল কনফিগারেশনে পুনরাবৃত্তি দূর করে। Kubernetes এবং Docker Compose ভাগ করা সার্ভিস সংজ্ঞার জন্য ব্যাপকভাবে অ্যাঙ্কর ব্যবহার করে।
বহু-লাইন স্ট্রিং
YAML দুটি মোড সহ ব্লক স্কেলার সমর্থন করে: আক্ষরিক ব্লক (|) ঠিক যেভাবে লেখা হয়েছে সেভাবে নতুন লাইন সংরক্ষণ করে, স্ক্রিপ্ট ও টেমপ্লেটের জন্য উপকারী। ভাঁজ করা ব্লক (>) দীর্ঘ স্ট্রিংকে একটি লাইনে মুড়িয়ে দেয়, দীর্ঘ গদ্য বিবরণের জন্য উপকারী।
যখন রূপান্তর প্রয়োজন
GitHub Actions, GitLab CI এবং CircleCI নেটিভভাবে YAML ব্যবহার করে। প্রোগ্রামগতভাবে পাইপলাইন কনফিগ তৈরি করার সময়, একটি JSON অবজেক্ট তৈরি করে চূড়ান্ত আউটপুটের জন্য YAML-এ রূপান্তর করা প্রায়শই সহজ।
Kubernetes রিসোর্স YAML-এ সংজ্ঞায়িত, কিন্তু Helm চার্ট টেমপ্লেটিং এবং কিছু টুল JSON আউটপুট করে। ফরম্যাটের মধ্যে রূপান্তর করলে API রেসপন্স পরীক্ষা করতে এবং মানক JSON টুলিং ব্যবহার করতে পারবেন।
REST API JSON রিটার্ন করে। সেই ডেটা YAML-ভিত্তিক কনফিগ সিস্টেমে (Ansible, Salt, Kubernetes) প্রবেশ করানোর সময়, একটি কনভার্টার ম্যানুয়াল পুনর্বিন্যাস ছাড়াই ব্যবধান পূরণ করে।
এক টুল থেকে অন্য টুলে স্থানান্তর করার অর্থ প্রায়শই কনফিগ ফরম্যাট রূপান্তর করা। JSON এবং YAML-এর মধ্যে রূপান্তর করলে ইকোসিস্টেম পরিবর্তন (Node.js → Python, Docker → Kubernetes) দ্রুত করা যায়।
JSON Schema টুলিং YAML Schema-এর চেয়ে বেশি পরিপক্ক। একটি সাধারণ প্যাটার্ন হলো পাঠযোগ্যতার জন্য YAML-এ কনফিগ লেখা, স্কিমার বিপরীতে যাচাইয়ের জন্য JSON-এ রূপান্তর করা, তারপর ডিপ্লয়মেন্টের জন্য আবার রূপান্তর করা।
অভ্যন্তরীণ টুলিং YAML কনফিগ ব্যবহার করতে পারে যেখানে বাহ্যিক API-গুলো JSON প্রয়োজন করে। বিল্ড পাইপলাইনে একটি কনভার্টার ডুপ্লিকেট ফাইল না রেখেই উভয় উপস্থাপনা সামঞ্জস্যপূর্ণ রাখে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
হ্যাঁ। YAML 1.2 হলো JSON-এর একটি কঠোর সুপারসেট — যেকোনো বৈধ JSON ডকুমেন্ট একই সাথে বৈধ YAML। তবে YAML 1.1 (এখনও অনেক পার্সার ব্যবহার করে) এর কিছু প্রান্তিক পরিস্থিতি আছে যেখানে বৈধ JSON, বৈধ YAML 1.1 নয়।
YAML মন্তব্য সমর্থন করে, যা JSON করে না। গভীরভাবে নেস্টেড কাঠামোর জন্য YAML আরও সংক্ষিপ্ত। এই দুটি বৈশিষ্ট্য এটিকে ম্যানুয়ালি লেখা কনফিগারেশন ফাইলের (Docker, Kubernetes, GitHub Actions) জন্য পছন্দের বিকল্প করে তোলে।
TOML (Tom's Obvious Minimal Language) কনফিগ ফাইলের জন্য ডিজাইন করা হয়েছে। এটির একটি স্পষ্ট, INI-সদৃশ সিনট্যাক্স আছে স্পষ্ট টাইপ এবং কোনো অস্পষ্টতা নেই। এটি Rust (Cargo.toml) এবং Python (pyproject.toml) প্রকল্পের মানক।
কদাচিৎ, কিন্তু সম্ভব। JSON বেশিরভাগ পার্সারে কী ক্রম সংরক্ষণ করে (যদিও স্পেসিফিকেশন বলে এটি অনির্ধারিত)। YAML এমন অ্যাঙ্কর ও ট্যাগ সমর্থন করে যার JSON সমতুল্য নেই। রাউন্ড-ট্রিপ বিশ্বস্ততার জন্য সাধারণ সাবসেটে থাকুন।
JSON.stringify অ্যারেতে undefined মানগুলোকে null-এ রূপান্তর করে এবং অবজেক্ট থেকে বাদ দেয়। JSON আউটপুটে অপ্রত্যাশিত null বা অনুপস্থিত কী দেখলে, উৎস JavaScript অবজেক্টে সম্ভবত undefined প্রপার্টি ছিল।
হ্যাঁ। যেহেতু YAML হলো JSON-এর সুপারসেট, আপনি সরাসরি একটি YAML ডকুমেন্টের ভেতরে JSON সিনট্যাক্স এম্বেড করতে পারেন। এটি কখনো কখনো জটিল নেস্টেড কাঠামোর জন্য করা হয় যেখানে YAML-এর ইন্ডেন্টেশন বিভ্রান্তিকর হতো।