YAMLとは？


<h1>I. 初めに</h1>
:santa::christmas_tree:<b><a href="https://qiita.com/advent-calendar/2022/iret-22">『アイレット株式会社 22新卒 Advent Calendar 2022』</a>24日目の記事</b>:christmas_tree::santa:<br><br>
YAMLは設定ファイルを記述するための最も一般的な言語の一つで、個人的に業務でYAMLを利用する場面が多くなってきたので、この「人間が読めるデータシリアライゼーション言語」の特徴について書きたいと思います。

<br>この記事では、YAMLとJSONとの比較について書いて、YAMLのいくつのルールや特徴に関して基本的な構文と合わせて書いていきたいと思います。

<h1>II. 解説・説明</h1>
<h4>1. YAMLとは？</h4>

現在、YAMLは「YAML Ain't Markup Language」の略ですが、元々は「Yet Another Markup Language」の略でした。YAMLは人間が読める直感的な構文であるため、様々なDevOpsツール、プログラムおよびアプリケーションの設定ファイルを記述するために広く使用されているフォーマットです。

YAMLはJSONと同じように、人間が読めるデータシリアライゼーション言語です。

シリアライゼーションは、異なるデータ構造を持ち、異なる技術のセットで書かれたあるアプリケーションまたはサービスが、標準フォーマットを使って別のアプリケーションにデータを転送するためのプロセスです。つまり、直列化とはデータ構造を別の形式に翻訳し、変換し、包むことです。

新形式のデータは、ファイルに保存したり、ネットワークを介して他のアプリケーションやサービスに転送したりすることができます。
<h4>2. YAML vs JSON - 違いは何？</h4>
YAMLとJSONはいずれも設定ファイルの作成やアプリケーション間のデータ転送に使用されてますが、それぞれの言語にはメリットとデメリットがございます。

- <h5>YAML</h5>

    - YAMLは、元々「Yet Another Markup Language」として知られ、2001年に作成されたが、現在は「YAML Ain't Markup Language」の略です。<br><br>
    - YAMLはJSONと見た目が大きく異なるにもかかわらず、公式にはJSONの厳密なスーパーセットです。YAMLはJSONができることすべてとそれ以上のことを行うことができます。有効なYAMLファイルはJSONを含むことができ、JSONはYAMLに変換することができます。<br><br>
    - YAMLはJSONと比較して、設定を定義するための最も人間にとって読みやすく、直感的で、コンパクトな構文を持っています。Pythonのコードを書くのに使うインデントスタイルに慣れている場合、YAMLはファイルの構造を定義するためにインデントも慣れると思います。とはいえ、インデントとフォーマットが正しくなければ、バリデーションエラーにつながる可能性があり、初心者には不親切な方法です。<br><br>
```YAML:Company.yml
---
会社: Example
ドメイン:
 - 専門: GitOps
 - 専門: DevOps
チュートリアル:
 - 名前: "YAML Ain't Markup Language"
   タイプ: 最高
   生まれた年: 2001
```
- <h5>JSON</h5>

    - JSONは「JavaScript Object Notation」の略で、2000年代初頭から存在しています。JSONは当初、プログラミング言語であるJavaScriptから着想を得ていましたが、1つの言語だけに縛られているわけではありません。<br><br>
    - 最近のほとんどのプログラミング言語には、JSONデータを解析・生成するためのライブラリーが用意されています。JSONはネットワーク上のWebアプリケーションやサーバー間で情報を保存したり転送したりするのに最適なフォーマットです。<br><br>
    - 言語には依存しないフォーマットです。<br><br>
    - しかし、複雑な構成には最適なサポートが得られない場合がございます。<br><br>
```JSON:Company.js
{
    "会社": "Example",
    "ドメイン": [
        {
            "専門": "GitOps"
        },
        {
            "専門": "DevOps"
        }
    ],
    "チュートリアル": [
        {
            "名前": "YAML Ain't Markup Language",
            "タイプ": "最高",
            "生まれた年": 2001
        }
    ]
}
```
<h4>3. YAMLの特徴と基本ルール</h4>

- <h5>YAMLファイルの作成方法</h5>

    - YAMLファイルを作成するには、【.yaml】または【.yml】のいずれかのファイル拡張子を使用できます。
- <h5>マルチドキュメントのサポート</h5>

> YAML のコードを書く前に、ファイルの先頭に3つのダッシュ (---) を追加できます。

```YAML:Company.yml
<これ> 
--- 
</これ>
会社: Example
ドメイン:
 - 専門: GitOps
 - 専門: DevOps
```

> YAMLでは1つのYAMLファイルに複数のYAMLドキュメントを含めることができるので、ファイルの整理がとても簡単になります。各文書は3本のダッシュ(---)で区切ります。


```YAML:Company.yml
--- 
会社: Example
ドメイン:
 - 専門: GitOps
 - 専門: DevOps
---
シーフード:
 - 魚
 - かき
```
>3つの点（...）を使って、文書の終わりを示すこともできます。
```YAML:Company.yml
---
会社: Example
ドメイン:
 - 専門: GitOps
 - 専門: DevOps
...
```
- <h5>インデント</h5>

    -YAMLでは、データのレベルと構造を示すために、インデントと行の分離に重点を置いています。インデントシステムはPythonが使っているものに非常に似ています。YAML は中括弧、角括弧、開始タグ、終了タグなどの記号を使いません - インデントだけです。
- <h5>タブ</h5>

    - YAMLでは、インデントを作成する際にタブを使用することはできません - 代わりにスペースを使用します。
- <h5>空白</h5>

    - 子要素が親要素の内側でインデントされている限り、空白は問題ではありません。
- <h5>YAMLでのコメントの書き方</h5>

> コード行をコメントアウトするコメントを追加するには、(#)文字を使用します。
```YAML:Company.yml
---
#こんな感じです
会社: Example
ドメイン:
 - 専門: GitOps
 - 専門: DevOps
...
```

- <h5>明示的なデータ型</h5>

>データ型を明示的に指定する場合は、値の前に（!!）記号とデータ型名で指定します。
```YAML:Explicit.yml
---
#この値を float としてパースする(10.0)
数字: !!float 10
#この値をブール値としてパースする(True||False)
ブール: !!bool true
...
```
<h4>4. YAML構文</h4>

- <h5>スカーラ</h5>

    - スカラーとは、ページ上のデータを構成する文字列や数値のことです。スカラーは、ブーリアン特性（true & false）、5などの整数（数値）、または文章やウェブサイトのタイトルなどの文字列です。<br><br>
    - ほとんどのスカラーは引用符で囲まれていませんが、句読点やYAML構文と混同する可能性のある他の要素 (ダッシュ、コロンなど) を使用する文字列を入力する場合、シングル (') またはダブル (") 引用符を使用してこのデータを引用符で囲むことがお勧めです。<br><br>
    - 二重引用符を使用すると、ASCII および Unicode 文字を表すエスケープを使用できます。
```YAML:Example.yml
---
整数: 25
文字列: "25"（又は'25')
フロート: 25.0
ブール: true
指数的: 4.5e+13
...
```
>複数行にまたがる文字列で、改行を維持したい場合は、（｜）記号を使用します。代わりに、YAMLファイルの文字列が読みやすくするために複数行にまたがっているが、パーサーは1行の文字列として解釈したい場合、（>）文字を使用することで各改行がスペースに置き換えられます。<インデント忘れずに>
```YAML:MultipleLines.yml
---
#複数行
|
 複数
 複数複数
 複数複数複数
 複数複数複数複数
---
#1行
>
 珍しい
 です
 ね！
```
- <h5>シーケンス</h5>

    - シーケンスは、マッピングやスカラーなどの他のデータ構造タイプに追加できます。
```YAML:Sequence.yml
---
#簡単
- 猫
- 犬
- 魚
---
#項目とサブ項目がある
-動物:
 - 猫
 - 犬
-言語:
 - Python
 - Elixir
 - Javascript
...
```
- <h5>マッピング</h5>

    - マッピングを使うと、キーと値をリストアップすることができます。<br><br>
    - 特定の要素に名前やプロパティを割り当てるような場合に有効です。<br><br>
    -  シーケンスと併用することで、リストが作れます。
```YAML:Mapping.yml
---
#一対一
動物: ペット
---
#一対多 <シーケンスと併用>
ペット:
 - 猫
 - 犬
 - ハムスター
...
```
<h1>III. 結論</h1>
この記事がYAMLとは何か、言語の構文はどのようなものか、そしてJSONとどう違うのかについての洞察を得るのに役立てば幸いです。<br><br>

:relaxed:お読みいただき、ありがとうございました。:relaxed: