将棋の手に「筋が良い」「筋が悪い」という評価があるように、電子 file 書式にも「筋が良い」「筋が悪い」があります。

電子 files は大きく2種類に分類できます。text 形式と binary 形式です。音声や動画などは binary 形式で良い (無理に text 形式で表現すると無駄に量が多くなる) ものです。一方、text としての性質が強いものはなるべく text 形式にする方が良いです。

昔、MS-Word file は binary 形式でした (拡張子が「.doc」でした) が、2007年頃から text 形式 + binary 形式 になりました (拡張子が「.docx」になりました)。前者は MS-Word (またはその viewer) を持っていないと中身を確認できず (例外あり)、後者は拡張子を手動で「.zip」に書き換えると文章や埋め込み画像などは確認できます。簡潔に言うと、筋が悪い形式から筋が良い形式になりました。

Ordo が扱う PGN も text 形式に分類されます。「じゃあ筋が良い形式じゃないか」と評価したくなりますが、それだけではなくて…text 形式の中にも、「text 形式であることを保持した上で更に別の決まりにも従っている」形式がいくつかあります。有名な形式を3点挙げておきます。

  • YAML 形式 : 人間にとって可読性が高い形式。構造をもつ data が記述できる。
  • JSON 形式 : 人間にとっての可読性はまあまあ、機械にとっての 形式保証性が高い形式。構造をもつ data が記述できる。
  • XML 形式 : 人間にとっての可読性は低め、機械にとっての 形式保証性が高い形式。構造をもつ data が記述できる。

この他、TOML や HCL など yj や dasel で相互変換できる形式は筋が良い形式と言って良いと思います。最初にどの形式で書いても後から相互変換すればよいのです。

で、PGN 形式はこれらに含まれません。まあ、1993年に制定された形式なので仕方なくはあります。

YAML 形式や JSON 形式を満たした上で PGN 形式が制定されていれば、扱いが楽だったのですけどね。


一応追記しておくと、PGN 形式の仕様書を読めば私自身が変換 program を書くことができます。でもそれって世界的に見れば車輪の再発明と同じことにあたります。

誰かがチョロッと変換 program を書いて、gem なり pnpm なり pip なりで install できるようにしてくれれば皆助かるのですが、なさそうな気がします。


うーん、PSN を元に、1行項目は key:value 形式、それ以外は複数文字列形式へ単純変換で YAML や JSON にするだけのものを作ろうかなあ。やねうら王の作者さんが提案する PSN2 形式も一応対応、でも詳細までは作りこまない、くらいの完成度で。個人的には、対局結果を Glicko2 計算 program あたりに食わせることができればまあまあ満足です。

将棋の対局結果を記述できる何らかの形式が世の中に広まっていればこんなに悩まないのですけどね。


後日談。Glicko2 計算 program は私にとってはかなり意味不明な代物でした。説明書は説明が不充分だし、計算対象期間を定義するのになぜか rating の配列を指定するし、しかもその定義 method の名前が from_objs だし (Ruby の世界では object はほぼあらゆるものを指す)、この rating というものはある時点ごとに作られるものなのかそれとも永続的な存在 (である代わりに値がどんどん変化していくもの) なのか、理解に苦しみました。

Python 実装を利用したこちらの記事と比べると、難解さが段違いです。


更なる後日談。結局、Python で書かれたものを元に Ruby で書き直しました。書き直しの際に読んだ参考文献は以下の通り。