設定ファイルフォーマットまとめ

そもそも「設定ファイルフォーマット」という表現が正しいのかどうかもあれですが、いろいろあるようなので観測できた限りを並べてみようと思いました。
それぞれ詳細は書かないのでどんなのがあるか眺めるぐらいの用途でしか使えません。

# [JSON](https://www.json.org/) (JavaScript Object Notation)

直訳: JavaScriptオブジェクト表記

[IETF STD 90](https://tools.ietf.org/html/std90)、[RFC 8259](https://tools.ietf.org/html/rfc8259)と[ECMA-404 2nd edition](https://www.ecma-international.org/publications-and-standards/standards/ecma-404/)で国際標準が定められている。
コメントが書けないということもあり、人間には嫌われている。
多くのプログラミング言語実装（ライブラリ含む）で、同じ結果を出してくれることが多いので安心感はある。

```json
{
  "Comment": "こんな感じ",
  "key1": "value",
  "key2": "value"
}
```

# [YAML](https://yaml.org/) (YAML Ain't Markup Language)

直訳: YAMLはマークアップ言語ではありません

インデントによるデータの記述（ブロックスタイル）とJSONっぽい記述（フロースタイル）で表現される。
実装による結果の違いとYAMLのバージョン違いでハマることがある。[ノルウェー問題](https://www.google.com/search?q=norway+problem+yaml)とかには気をつける必要がある。

```yaml
# こんな感じ
root:
  key1: value
  key2: value
```

# [TOML](https://toml.io/) (Tom's Obvious Minimal Language)

直訳: トムの明白な最小言語

INIっぽい記述方法。INIよりは多くのデータ型を表現できる。しっかりと仕様が決められている。
最近TOML仕様のバージョン1.0がリリースされた。

```toml
# こんな感じ
[section]
key1 = "value"
key2 = "value"
```

---

ここからはJSONっぽい何かをいくつか書きます。

# [JSON5](https://json5.org/)

ES5.1の仕様を取り入れたJSON。シングルクォートOKとか、キーはクォートなしでもアリとか。コメントも書ける。

```js
{
  // こんな感じ
  key: 'value',
}
```

# [JSONC](https://github.com/microsoft/node-jsonc-parser) (JSON with comments)

コメントが書けるJSON。ケツカンマもOK。

```jsonc
{
  // こんな感じ
  "key": "value",
}
```

# [Hjson](https://hjson.github.io/)

人間が書きやすい読みやすいJSONを目指しているらしい。現時点では、いくつかの言語実装のメンテナがいなくて困っているようだ。

```yaml
{
  # こんな感じ
  key: value
}
```

# [CSON](https://github.com/bevry/cson) (CoffeeScript-Object-Notation)

直訳: CoffeeScriptオブジェクト表記

CoffeeScriptなフォーマットのJSON。

```coffeescript
# こんな感じ
key: [
  'value1'
  'value2'
  'value3'
]
```

---

以上でJSONっぽい何かは終了です。

# [XML](https://www.w3.org/XML/) (Extensible Markup Language)

直訳: 拡張マークアップ言語

タグで表現されるあれ。設定ファイル的に使われることもあるけど、タグ名、属性、コンテンツが何をどう示すのか読み込む側次第なので、設定ファイルとしては人間には書けない読めない印象がある。

```xml
<!-- こんな感じ -->
<key>value</key>
```


# [INI](https://ja.wikipedia.org/wiki/INIファイル)

INIは Initialization の略らしい。
Windowsによくいる。仕様は定められていないらしく方言が多いらしい。

```ini
; こんな感じ
[section]
key = value
```

# [PLIST](https://ja.wikipedia.org/wiki/プロパティリスト) (property list)

Macにいる。

```plist
// こんな感じ
{
    "key" = "value";
}
```

XML形式のもあるそう。

# [yarn.lock](https://www.npmjs.com/package/@yarnpkg/lockfile)

[Yarn](https://yarnpkg.com/)のlockファイルに使われる独自フォーマット。
このフォーマットの名前なんて言うんだろうと思って頑張って調べたのに、[名前なんて無いただの野良フォーマットだった](https://github.com/yarnpkg/yarn/issues/5629#issuecomment-417919746)。

# [.properties](https://en.wikipedia.org/wiki/.properties)

Javaといえば`.properties`。エンプラ界隈ではJava以外で使うこともあるとかないとか。文字コードの問題で悪名高い。

```properties
# こんな感じ
key1 = value
key2 : value
```

# [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) (Human-Optimized Config Object Notation)

直訳: 人間に最適化された構成オブジェクト表記

[Play Framework](https://www.playframework.com/documentation/2.8.x/ConfigFile) 以外で使っているところはあるのでしょうか？
→ あるらしい。コメント参照。

# [Amazon Ion](https://amzn.github.io/ion-docs/)

AmazonのOSSでたまに現れる形式だとかの噂はあるが真偽は不明。

# [HCL](https://github.com/hashicorp/hcl) (HashiCorp Configuration Language)

[Terraform](https://www.terraform.io/)にいるそう。

# [UCL](https://github.com/vstakhov/libucl) (Universal Configuration Language)

HCLもそうだけど、[nginx](https://www.nginx.com/)の設定を参考にしているらしい。[nginx](https://www.nginx.com/)のフォーマットを標準化してくれたらいいのに。。。

# [CUE](https://cuelang.org/) (Configure Unify Execute)

Goの実装しかないのかな？

# [CSV](https://tools.ietf.org/html/rfc4180)

これが設定ファイルとして使われてたら僕は逃げ出す準備をする。