Previous Post | Top | Next Post |
TOC
設定データーや設定に使うデーターベース等は、規則的な構造で可読化(エディターで閲覧編集)すると、既存ツールが使えて便利です。
可読データー表現法のリスト
振り返って見たら、 可読化されたデーターは結構色々使ってます。
- 表データーの表現にはCSVやTSV (JA) TSV (EN)
- UNIXパスワードファイル(
/etc/passwd
)等には「:」を使うDSV - E-メールデーターで用いるRFC 822
- Debianのパッケージ設定で用いるDEB 822
- 文書やデーターベース等の複雑な構造のデーターの記述にはXML (JA) XML (EN)
- Gitの設定ファイルはINI (JA) INI (EN)
- Pythonのパッケージ設定の
pyproject.toml
にはTOML (JA) TOML (EN) - QMKのファームウエアーのビルド条件記述ではJSON (JA) JSON (EN)
- intercept (キーボード入力の差替えツール)ではYAML (JA) YAML (EN)
ちょっと混乱してしまいそうです。XMLよりは読みやすく複雑なデーター記述ができながらコンピューター処理にも向いたフォーマットということで、「INI」, 「JSON」, 「TOML」, 「YAML」の4つのデーターシリアル化 (EN) (データーシリアル化 (JA)) 手法を見ていきます。
これらは、人間がエディターで触るのに比較的ハードルが低く、さらに多くのコンピューター言語で読み込み書き出しをするライブラリー化されサポートされているので、非常に使いやすいです。
可読データー表現例
INI
昔のWindowsの設定ファイルのデファクトスタンダード。2レベルまでのサポートという問題や、方言が多い問題がある。 Python標準ライブラリーでサポートれる。
; last modified 1 April 2001 by John Doe
[owner]
name = John Doe
organization = Acme Widgets Inc.
[database]
; use IP address in case network name resolution is not working
server = 192.0.2.62
port = 143
file = "payroll.dat"
- About Cross-platform C++ library providing a simple API to read and write INI-style configuration files (687 stars)
- Python3 standard lib: configparser — Configuration file parser
TOML
TOMLは、INIに似ている。String, Integer, Float, Boolean, Datetime, Array, Table等の書式のスペシフィケーションが明示規定されている。 普通のINIより少し冗長。まもなく(Python 3.11~)Python標準ライブラリーでサポートれる。
# This is a TOML document.
title = "TOML Example"
[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates
[database]
server = "192.168.1.1"
ports = [ 8000, 8001, 8002 ]
connection_max = 5000
enabled = true
[servers]
# Indentation (tabs and/or spaces) is allowed but not required
[servers.alpha]
ip = "10.0.0.1"
dc = "eqdc10"
[servers.beta]
ip = "10.0.0.2"
dc = "eqdc10"
[clients]
data = [ ["gamma", "delta"], [1, 2] ]
# Line breaks are OK when inside arrays
hosts = [
"alpha",
"omega"
]
-
https://github.com/marzer/tomlplusplus (783 stars)
- Header-only TOML config file parser and serializer for C++17.
-
https://github.com/ToruNiina/toml11 (588 stars)
- toml11 is a C++11 (or later) header-only toml parser/encoder depending only on C++ standard library.
JSON
ウエッブ関連でよく使われる書式。 冗長で人間がタイプし読むには少々難がある。(XMLやLispのS式(Symbolic expressions, S-expressions)ほどコンピューター側にに寄せていない) コンピューターが解釈するオーバヘッドは少ない。 Python標準ライブラリーでサポートれる。
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 27,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"children": [],
"spouse": null
}
- https://github.com/nlohmann/json (30.3k stars)
- JSON for Modern C++
- Python Stadard Lib.: json - JSON encoder and decoder
YAML
YAML version 1.2 は、JSONに対して、上位互換。かなり読みやすい。 Python標準ライブラリーにはないが、PYPIにPyYAML(YAML 1.1 parser)やruamel.yaml(YAML 1.2 parser)がある。
receipt: Oz-Ware Purchase Invoice
date: 2012-08-06
customer:
first_name: Dorothy
family_name: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
size: 8
price: 133.7
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Centerville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
分かりにくいのは、ブロックスカラーの開始が「|」だと改行保持、「>」だと改行は1スペースに変換。
また、繰り返されるノードは、「&
」を使いマークし、「*
」を使い参照再利用できる。
- https://github.com/jbeder/yaml-cpp (3.3k stars)
- A YAML parser and emitter in C++
- PYPI: PyYAML 6.0
- github: PyYAML (1.8k stars)
- YAML 1.2 Core Schema support #486
- PYPI: ruamel.yaml
- Tutorials/Reviews
Previous Post | Top | Next Post |