Project Fx 2.0

怪文書と備忘録を書きます

エレラボDiscordの運用とこれから

この記事は、上智大学エレラボ Advent Calendar 2021 第1日目の記事です。

adventar.org

おはようございます。エレラボ部長のstepney141です。

エレラボでは、基本的にDiscord(およびLINE)を使って連絡を取り合っています。 この記事では、エレラボDiscordの管理に関してポエムを書き連ねていきます。

私とDiscordとの馴れ初め

私が初めてDiscordを使い始めたのは2017年1月(当時高校一年生)のことでした。
私は当時、通っていた中高のクラブ活動で「コンピュータ部」なる異常独身男性予備軍互助組織に所属しており、そこの先輩が部のDiscordサーバを作ったのがきっかけでした(ちなみにそれまでは、Skypeのグループチャットのテキストメッセージ機能を使っていました)。

今までに経験のないDiscordの多機能さに私が慣れていなかったことも大きいでしょうが、当時のAndroid版DiscordアプリのUIはあまり使いやすいものではなく、
当時の私は「操作性ではskypeやLINEに劣っていると思う、少なくともスマホ版では」などと考えていました。

ですが、Discordで他の部員と駄弁る日を過ごすうちに段々と操作にも慣れて、複雑なUIもDiscordのアップデートに伴って徐々に整理されていきました。
そのうちLINEやSkypeにはないチャンネル機能やロール機能などの便利さに気づいた私は、すっかりDiscordを便利なアプリだと感じるようになっていきました。

Discordに日本リージョンがなく、日本に最も近いのがシンガポールリージョンだった、そんな頃の話です。

時が経つにつれてコンピュータ部のサーバのチャンネル数や会話量はどんどん増えていき、それに従ってチャンネル構成や管理体系もより洗練されたものになっていきました。
Pythonをやっている部員が管理用のbotを作ったり、なぜかサーバに居座り続けているOBが自作のゲームbotを追加したりしたことで、色々と便利にもなりました。
今では10カテゴリにまたがって70以上のチャンネルが作られ、79人ものメンバーが参加しているという、中高の部活のチャットとしてはそれなりの規模と思われるサーバになりました。
こんな感じで、私は「Discordサーバの居心地の良さ・使い勝手の良さは、コミュニティにとって重要な要素である」という考えを持つようになりました。

はじめに混沌があった

やがて私は高校を卒業し、色々あって大学に入学すると、オンライン授業のせいで体重が単調増加を続ける日々の真っ最中にエレラボに入部し、エレラボのDiscordサーバに参加しました。

ですが、当時のエレラボDiscordサーバは非常に使いづらく、改善の余地という概念を50kgほど集めて凝り固めたような姿をしていました。

当時の私が書いたメモがこちらです:

・雑談チャンネルと真面目な事務関係のチャンネルが同じカテゴリにある
・学年権限がぐちゃぐちゃ
・管理者が誰なのかすぐに分からない(少なくとも新しく参加した人間にとっては)
・自己紹介チャンネルがなかった(私が提案して初めてできた)
・説明書チャンネルがなかった(同上)
・お知らせチャンネルがない

カテゴリ分け、
・テキストチャット
・ボイスチャット
・ハッカソン
・学園祭関係
・ハードウェア関係(?)
・オンラインハッカソン
・その他カテゴリに入ってないチャンネルが、テキストチャット・ボイスチャット含めて複数あり

f:id:stepney141:20211201232735j:plain

補正をかけまくっているのでかなり見づらくなってしまっているのですが、当時のロールの構成です(私が2年生になってある程度の管理権限をもらった時に撮ったものです)。 「新入生」と「1年」が同時に存在している他、ロールの順序も全く整理されていない状態になっています。

ロールやチャンネルの情報は、コミュニティに新しく参加した人間にとって、そのサーバにおいて社会的な立ち振舞いをするにはどうすれば良いのかを把握するために重要でもあります。 また、様々なチャンネルを整備して「この話題にはこのチャンネルを使ってください」と促すことで、人間関係の構築やコミュニケーションがスムーズになりやすくなる面もあるかと思います。

ですが、ただの新入生の私にとって、これらの使いにくさを逐一指摘するのは非常にためらわれることでした。 Covid-19の蔓延で対面でのサークル活動ができない中、Discordでは雑談すらほとんどされることがない状況でした。 お互いに人となりを知る手段が全くない中で、新入生が色々と要望を出すことで上回生の心証を損ねない自信がなかったのです。

心証の問題については後に、上回生と個人的なやりとりをして人間関係を構築したり、Advent Calendar 2020の開催を提案して自分でも色々と記事を書いたり、立候補してエレラボの副部長になったりしたことによって、ある程度は解決したと思います。

サーバの整理とbotの開発

B2になって副部長に就任した私は、Discordサーバの整備に着手しました。

  • 話題ごとにチャンネルをカテゴリ分け
  • 使われていない廃墟チャンネルをメインのカテゴリから追放、アーカイブ
  • ロール設定を整備し、一般部員が操作できる内容を増やす

などの作業を実行し、それなりに使いやすいと思われるDiscordサーバの構築に勤しみました。

また、管理を補助するためのDiscord Botを自作しました。

github.com

上回生のご協力も頂き、色々と面白い機能(エレラボ内製の部費会計用Webサービスとの連携、エレラボGoogleアカウントへのログインを円滑にするための二段階認証コード自動生成機能など)も実装することができました。 以前からDiscord Botを作ってみたいと思っていた私にとっては、趣味と実益を兼ねた面白い体験になりました。

今後の課題

現在残っている課題は、主に2つあります。

  1. DiscordとLINEとの併用体制の使いにくさ
  2. 雑談の少なさ

まず 1. についてです。
現在エレラボでは、部内の連絡手段としてLINEグループチャットとDiscordサーバを併用する体制を取っています。
しかし、コロナ禍で緊急の連絡をせざるを得ないこともあるこのご時世、連絡手段が2つに分散しているという現状は何かと不便なのです。
加えて会話をする場所が分かれていると、部員同士の雑談や部員が提供してくれる有益な情報もまた分散してしまい、コミュニケーションが取りづらくなるという無視できない弊害もあります。
Discordは

  • LINEよりも機能が多く
    • ロール機能とチャンネル機能による柔軟な権限管理とチャットシステム
    • Zoomのような画面共有機
  • 複数端末でのログインが円滑で
  • 機種変更時にチャットの履歴が飛んだりしない

など、LINEにはないメリットが多数ある素晴らしいサービスであり、個人的にはできればDiscordに統一したいと考えています。
しかし同時に、

  • Discordに慣れていない人には操作がとっつきにくい
  • LINEを常用している人の方が多い

という点から、Discord一本に切り替えるというのも無理があります。

基本的にはDiscordをメインとしてLINEには書き込みをせず、サーバ障害などの不測の事態によってDiscordが使えなくなったときのための予備として、LINEも残していくのが無難な選択肢なのではないかと考えている今日この頃です。

次は2.についてです。
ワクチンの接種が進んで感染者数も落ち着きを見せ始めたことによって、弊学では11月から対面での課外活動が解禁されました(12月1日からは飲食・宿泊を伴う活動も解禁されます)。これに合わせて、エレラボも久しぶりに11月中旬から対面活動を再開しました。
いくらDiscordを使いやすいように整備したからと言っても、それに先立つものとして顔を合わせた対面活動ができなければ、良いコミュニティを作ることは難しいです(DiscordやTwitterを介した顔の見えないコミュニケーションだけで親密な人間関係を構築できるタイプの人も世の中にはいますが、世間の多くの人々は顔の見えるコミュニケーションを重視します)。

エレラボは2018年にできたばかりのごく新しいサークルです。 活動の基礎すら定まっていない状況下でコロナ禍に直面し、非常に難しい局面に立たされています。 対面活動とオンラインでのやり取りの両立によって、多くの部員にとってエレラボが少しでも居心地が良くて楽しい場所であれるように、態勢を整えていきたいと考えています。

グラフ電卓TI-Nspireのネイティブ開発環境「Ndless SDK」をDockerで導入する

stepney141.hatenablog.com

以前、このような記事を書きました。
あれから数年が経ち、Dockerという大変便利なものをちょくちょく触る機会が訪れるようになりました。 そこで趣味(Ndless SDKを簡単に導入したい)と実益(Dockerの練習をしたい)を兼ねて、Ndlessの開発環境をDocker Composeで手軽に構築できるようにしてみました。

Dockerfileやdocker-compose.yml一式を収めたGitHubリポジトリはこちらです。

github.com

使い方に関しては全てREADME.mdに書いてあるので特に触れることはないです。

大変だったこと

主にNdless SDKのドキュメントが不親切すぎることから来るトラブルに何度も見舞われたのがしんどかったです。

最初、Ndlessのドキュメントに書かれている導入ガイドをそのままDockerfileに落とし込んでいたのですが、 いざコンテナを構築してみると途中でシェルが異常終了し、起動に失敗するという事態に見舞われました。

twitter.com

twitter.com

デバッグしていくうちに、環境構築の際に実行されるシェルスクリプトの特定の行でエラーが発生していることが分かりました。 最初は原因としてbashとshの互換性の問題を疑っていたのですが、 結局のところ「必要なものとしてPythonを明記していないにも関わらず、シェルスクリプト内でPython3の存在を前提とした動作をしていたせい」だと分かりました。つらい。 まあ一ヶ月近くも原因に思い足らなかった私もどうかと思いますが。

その後も色々なビルドエラーに見舞われましたが、いずれもドキュメントをあてにせずエラーログを参照し、すべてドキュメントに明記されていない依存パッケージが入っていなかったせいであることを突き止めました。つらい。

ともあれ開発環境も整ったことですし、Nspireでのネイティブ開発を進めていきたいと思います。

QiitaのLGTMをエクスポートするツールを作った

Qiita離れの動きが加速している昨今[要出典]、LGTM・ストックしていた良記事が作者のQiita退会に伴い見れなくなってしまうということが増えてきました。

「自分が面白いと思った情報が自分の与り知らない所で自分の視界からフェードアウトしてしまう」というのは私にとってとても腹立たしい事なので、 今のうちに自分が面白いと思った記事を全てアーカイブする準備を進めています。 その一環として、Qiitaで自分がLGTMした記事の情報を取得してCSVに出力するツールを書きました。

最初こそ「ストックがAPIで取れるんだからLGTMも簡単に行けるっしょー」と思っていたのですが、 よく調べたところQiita APIでは自分がLGTMした記事を取得することができないことが判明したため、 puppeteerを使ってスクレイピングしました。

コードはこちらに置いてあります。yarnを叩けば動くはずです。
実行すると「記事タイトル・記事URL・記事著者名・LGTM数・記事の投稿日時」を取得し、CSVに吐き出してくれます。

github.com

なぜpuppeteerなのか

手順

大したことはしていません。
各ユーザのLGTM一覧ページ (https://qiita.com/ユーザー名/lgtms?page=数字) 内の要素を抜き出し、CSVにまとめているだけです。
ユーザー名の部分を変更すれば任意のユーザーのLGTMを取得できるはずです。 記事タイトルや記事作成日時などといった情報の正確な値は記事のURLさえ分かればQiita APIで取得できますが、今回はそこまで正確な情報は不要だったためLGTM一覧ページから直接スクレイピングすることにしました。

なお、ツール内にTwitter連携でQiitaにログインするコードが含まれていますが、 これは「同じクライアントから未ログイン状態で立て続けに10回以上Qiitaにアクセスした場合、Qiitaへのアカウント登録を促すプロンプトが出現する」という仕様を回避するために付けたものです。 その後、プロンプトが出ていても目的のスクレイピングの実行に支障は出ないことが判明し、このログイン機構の存在意義は端から無かったことが分かりました。
もしかしたら、このログイン機構も実は限定公開記事の情報を取得するのに便利だったりするのかもしれません。 限定公開記事を見たことがないので知りませんが。

CSVの出力が地味に一番の難関でした。 自前での実装が厳しかったので、結局papaparseという専用のライブラリを使っています。

www.papaparse.com

所感

  • スクレイピング楽しかったです。欲しい情報を適切に切り出すことに成功した時のエクスタシーは何物にも代えがたいですね。
  • puppeteerは色々と自由度が高いですが、それゆえに適切な調整の仕方を見つけ出すのが中々難しいという事が分かりました。
  • この記事をQiitaに投稿してLGTMが欲しい

追記

2021年2月26日に行われたQiitaの大規模アップデートにより、LGTM一覧ページが改修されました。

qiita.com

これに伴い、puppeteer_qiita.jsに以下の変更を施しました:

  • コード内で使用していたXPathをすべて書き換える
  • 記事の作者・記事の更新日時の情報がLGTM一覧ページに表示されなくなったため、これらを出力する機能を削除

あるいはボドゲでいっぱいの星~ボードゲーム開発・対局用フレームワーク「Dagaz Project」の紹介~

この文章は、Board Gamed Design Advent Calendar 2020の第20日目の記事です(投稿は25日目)。遅刻申し訳ありません。 adventar.org

この記事の目的は、私が開発に携っている(携わろうとしている)ボードゲーム制作ツール「Dagaz Project」を皆さんに布教し、その開発メンバーを可能な限り増やすことです。
私自身はいわゆる「ボドゲ界隈」とは全く無縁の人間であり、ボドゲにおける一般的な用語・概念をほとんど何も知りません。 このため、界隈では良く知られていることの説明に過剰に文字数を割いている箇所があるかもしれません。 また、扱っているネタが一般的なボドゲとややかけ離れているきらいがありますが、これは私が他にちょうど良いアドカレを見つけることができなかったためです。

Dagazについて説明する前に、まずその前提となる概念をいくつか紹介する必要があります。

ゲームAIとGeneral Game Playing

ご存じの方も多いでしょうが、コンピュータ関連の科学技術が発展するにつれて、その応用分野の一つとして人工知能の研究も盛んに行われるようになっていきました。 その中でも、「コンピュータにゲームをプレイさせる」という方面への応用は古くから盛んであり、これまでに数多くのゲームについてそれを上手にプレイするAIが開発されています。 1990年代以降、チェス、オセロ、将棋、囲碁などの数々のアブストラクボードゲームにおいて、AIは人類最強クラスのプレイヤーを破るまでの強さを誇るようになってきています。 そして2010年代にDeepMind社のAlphaGoが、ゲームAIの最後の難関とされた囲碁で人類を完全に上回って以降、ゲームAI開発の潮流はポーカーや麻雀などの不完全(不完備)情報ゲームに移り始めています。
しかし、これらのAIは総じて「特定のゲームのプレイのみに特化しているAI」です。 これに対し、「どんなゲームでも上手にプレイできる汎用的なAI」を作ろうという動きもあります。 それこそが「General Game Playing」(GGP)と呼ばれる分野です。

Zillions of Gamesの誕生

英語版Wikipediaの記述によれば、GGPは1992年頃に誕生した比較的新しい研究分野です。
1998年、「Zillions of Games」(ZoG)という商用GGPソフトウェアが発売されました。 これは「Zillions Rules Files」という独自のDSLを用いてゲームのルールを形式的に記述し、それをソフトウェアに読み込ませると、 内蔵された汎用のゲームAIが自分でルールを解釈してCPU対戦をしてくれるという代物でした。 どうやらこのソフトウェアの反響は、少なくとも海外のボードゲームマニアの間ではかなり物凄いものであったらしく、 多くのユーザーが様々なゲームのルールのZRFファイルを作成し、競って公開しました(発売から20年以上が経った現在でも、ZRF作成をしているユーザーはそこそこいます)。 ZoGは現在でも販売が続けられており、この記事を書いている2020年12月下旬の時点で3055種類ものZRFファイルが公開されています。

しかし、Zillions of Gamesには致命的な欠点がいくつか存在しました。
細かいことを挙げて行けばキリがありませんが、概ね次の2つに集約されます:
1つ目:「ソフトウェア自体の仕様やZRFの機能的な制約により、ZoGでは実装することが難しいボードゲームがある」こと。
2つ目:「商用ソフトである関係上、ソースコードが公開されていない」こと。

1つ目の欠点が重大であることは誰の目にも明らかでしょう。 これについては色々な指摘がされていますが、日本語の情報としてはzillionsofgames @ ウィキに詳しくまとまっているのでそちらを参照してください。
とりあえず具体例を挙げると、ZoGは不完全情報(不完備情報)ゲーム、つまり麻雀などのような対戦相手の手の内が分からないゲームを遊ぶことは基本的にできません。 無理やりそれっぽく実装できないこともないのですが、ディスプレイ上の表示をどうにか隠すことはできても、内部処理の都合でZoGのAIには相手の手の内が丸見えになっているので、実質的にゲームとして成立しなくなってしまいます。
また、「一つの位置に複数の駒が存在する」という状態を考慮していないので、例えばマンカラなどのようなゲームは基本的に実装できません。 ZoGユーザーでボードゲーム愛好家のヴァレンティン・チェルノコフ氏は、「ZoGは基本的にチェッカーやチェスに似たゲームでなければ実装することができない」「それ以外のゲームも実装できないことはないのだが、それには巧妙なハックが必要になるし、よしんば実装できたとしても動作が不安定になる」と総括しています。

2つ目の欠点も、実は割と重大なものなのです。 上で説明した1つ目の問題点を誰かが完璧に解決できたとしても、ZoGがソースコードを公開していない商用ソフトである以上、自分でソースをいじくって再配布するという訳にはいきません。 またZoGはWindows環境にしか対応していないので、MacLinuxといったその他の環境では基本的に動きませんし、スマートフォンタブレットのアプリもありません。 自前で他の環境に移植するというのは至難の業です。 (一応、MacLinuxで動かす方法がないという訳ではないのですが、パソコンに不慣れなユーザーが容易く行えるようなものではありません。)

Dagazの誕生

先ほど発言を紹介したボードゲーム愛好家のヴァレンティン・チェルノコフ氏は、ZoGの欠点の解決を試みたボードゲーム制作・対戦ツール「Dagaz」を開発しました。言語は JavaScript であり、HTMLのcanvas要素に盤駒の画像を表示して動作する仕組みです。

Dagazで実装できるゲームの例については、Dagazの公式サイトを開いて、実際に遊んで体験してみてください。 glukkazan.github.io

Dagazの開発コンセプトについては、チェルノコフ氏本人による文章を翻訳した以下のエントリをぜひご覧ください。

stepney141.hatenablog.com

Dagazのメリット

拡張性の高さ

Dagazのソースコードはモジュール形式になっており、「ゲームのルールを記述するモジュール」「対戦用AIのモジュール」「描画処理のモジュール」といった各コンポーネントを組み合わせて1つのゲームを作る仕組みになっています。 このため、モジュールの追加・削除・書き換え・変更が簡単にできるようになっており、高い拡張性を持っています。

クロスプラットフォーム対応

先にも述べたように、Zillions of GamesはWindows専用に作られていたため、Macなどの環境で実行するのは難しくスマホで使うこともできませんでした。

しかし。DagazはJavaScriptとHTMLのcanvas要素を使って動くように設計されているため、 スマホだろうとパソコンだろうと、インターネットブラウザ1さえ使える環境ならどこでも動きます。 サーバとの通信もしないので例えスマホ機内モードにしていても使えます。

オープンソースである

Zillions of Gamesが完全クローズドソースであったことの反省を踏まえて、Dagazは全てのソースコードがMITライセンスで公開されています。
さらにGitHub上でOSSとして開発されているため、誰でも簡単に開発に参加できます。

こちらは周辺ツールも含めたソースコード本体のリポジトリgithub.com

そしてこちらは色々なゲームが実装されているDagaz公式サイトのレポジトリです。 github.com

Dagazの欠点と問題点

(拡張性が高いとはいえ)万能ではない

Dagazは元々、チェス・囲碁バックギャモンのような戦略的ボードゲームを実装するために作られたものです。 そのためあらゆるメカニクスボードゲームに適している訳ではありません。 より多くのメカニクスに対応できるよう改造することは十分に可能ではあるすが、とりあえず現時点での仕様では、実装できないボードゲームが存在するかもしれません。

パフォーマンスが低い

Dagazは完全なJavaScript製で、ブラウザ上のJavaScriptエンジンによって実行されます。 このためどうしてもパフォーマンスが低くなってしまい、組み込まれている対戦用AIも弱くなってしまっています(思考ルーチンを改良することである程度改善する可能性はあります)。

ドキュメントがない

開発者向けドキュメントはおろか、一般ユーザー向けの使い方説明も全くできていません。 DagazはZillions of Gamesの後継を目指して開発されているので、当然自分でゲームのルールを書いて読み込ませる仕組みがあります。 しかし現在この機構に関してリファクタリング作業をしている真っ最中であり、正直ドキュメントどころではないというのが現状です。

ソースコードが汚い

現在のDagazのソースコードは全てES5で書かれており、モジュールとかいう便利なものは一切使われていません。 ファイル間での変数のやり取りは全てグローバルスコープを介して行われており、当然ながら変数定義も全てvarなので処理を追うのも一苦労です。 ファイル名の命名規則もかなりめちゃくちゃで、ドキュメントはおろかソースのコメントすらほとんどありません。 さらに、ユニットテストやグラフィック部分のE2Eテストも満足に書かれていません。 コードの全容を全て把握しているのは、元開発者のチェルノコフ氏しかいません。

開発者がいない

現在開発に携わっているのは、プロジェクトを立ち上げたチェルノコフ氏と最近参加した私のたった2名のみです。 圧倒的に人手が足りません。 チェルノコフ氏も私もフロントエンド開発に詳しい訳ではないため、ぜひとも人手が欲しいと考えています。

まとめ

Dagazは本当に素晴らしいソフトウェアなのですが、とにかく開発者が足りません。 現在、私とチェルノコフ氏は現在のDagazの欠点を解消したアップデート版の開発を進めています。

github.com

フロントエンド開発に詳しいボードゲーマーの皆さん、ぜひDagazをより良いものとするためにご協力いただけないでしょうか。


  1. ブラウザ側の機能の関係で、Google ChromeFirefox・Edgeでの利用をオススメします。Internet ExplorerSafariは非推奨です。

関数電卓プログラミングの世界:闇の魔術編

この記事は、闇の魔術に対する防衛術Advent Calendar 2020の第23日目の記事です(投稿は24日目)。遅刻本当にすみませんでした。 qiita.com

また、本記事は以下の別記事を読んでいることを前提に書かれています。そんなに長くないのでぜひ併せてご覧ください。 stepney141.hatenablog.com


今年も盛り上がっている闇の魔術に対する防衛術アドカレですが、私には闇の魔術を自ら操ってその成果を解説できるような能力はありません。 なので代わりに、関数電卓(高機能電卓)でのプログラミングの世界で、私が闇の魔術が使われていると感じた技術・出来事をいくつか紹介してみます。

RSA署名鍵リバースエンジニアリング事件

高機能電卓に関する(色んな意味での)闇のレベルを知るにはこの事件について解説するのが一番でしょう。

きっかけは2009年7月、とあるマニアがTexas Instruments (TI) 社製の高機能電卓「TI-83 Plus」のファームウェア(OS)に付けられていたRSA暗号電子署名鍵を素因数分解し、秘密鍵の値をインターネットフォーラムで公開したこと。 当時、TI電卓のOSにはRSA-155による認証鍵が付与されており、これによってOSが確かにTI社公式のものであることを保証し、同時に署名されていないOSの実行を弾いていました。 しかしこれは、電卓に自前のファームウェアを入れて遊びたいマニアにとっては厄介な存在でした。 ところが、秘密鍵さえ分かってしまえば、自前のファームウェアだろうと公式の鍵で署名をしてしまうことが可能になり、「これは正規のファームウェアである」と認識されて何も特別なハックをしなくても電卓にインストールできるようになるのです。 そしてとあるマニアがこの鍵の値を突き止めてしまったという訳です。 ちなみにこのマニア本人が語るところによれば、素因数の特定には「一般数体ふるい法」(GNFS)というアルゴリズムを用い1Athlon 64 (1.9GHz) というCPUを搭載したPCで1745時間(=73日弱)を費やしたとのことです。
さらにこの投稿から約2カ月後、フォーラムのメンバーの共同作業により、OSをアップグレードする機能がある全てのTI電卓について認証鍵が特定されました。 これらの情報はマニアの間で広く知れ渡り、一部のマニアはバックアップ代わりに自身のWebサイトにこれを転載しました。

高機能電卓に自前のファームウェアを入れて何が嬉しいのかというと、公式のOSには搭載されていないがマニアからしたらぜひ欲しいという機能が使えるようになります。 高機能電卓マニアのコミュニティ上では、ゲームや便利系ツールや科学技術計算パッケージなど、電卓上で動く様々な種類のソフトウェアが大量に公開・やり取りされています。例えばticalc.orgはそうしたパッケージの交換プラットフォームの一つです。 こうしたソフトウェアをいくつも電卓に導入して用いる人やその開発者にとっては、多くのパッケージを管理できるファイルマネージャや、プログラムを簡単に書ける便利なエディタなどの機能が必要不可欠です (PCでコードを書く時もターミナルやらエディタやらの使い勝手って大事ですよね?それと似たような感覚だと思えばだいたい合っています)。 しかしメーカーは当然そんなハードコアな使い方を想定していませんから、そういう機能はメーカー公式のOSには搭載されていないのです。

これに対してメーカー側には、ユーザーによる不正な改造を積極的に防がなければならないそれ相応の理由があります。 欧米圏では、高機能電卓は中等教育・高等教育における理数系科目の学習に用いるためのものであり、高機能電卓を使って計算することを前提としているテストも多くあります(アメリカのSATなども確か部分的に電卓を使うらしいですね)。
このため、高機能電卓をハックする技術が下手に出回ると、それを利用してカンニングをする学生が出てくる恐れもあり、メーカーからしたらまあ非常に面倒くさいことになる訳です。 こういう事態を防ぐため、メーカー各社は電卓を不正にハックするような試みを排除しようとする傾向があります(会社ごとにかなりの温度差がありますが、その中でもTIはマニアに対し当たりが強いです)。

さて、フォーラムで公開された例の認証鍵ですが、この事実はほどなくしてTI社の知るところとなります。 当然のことながらTI社はこれを問題視し、認証鍵の情報を掲載しているフォーラムや個人サイトの運営者に対してDMCA通知を送付しました。 そして多くの人がこれを受理し、認証鍵の情報は削除されました。 DMCA通知。最近で言うとyoutube-dlで話題になったアレですね。
しかしこの措置のせいでかえって認証鍵の情報に注目が集まり、マニアの内外から「リバースエンジニアリングの権利を妨げる不法行為だ」という非難も出ました。 この結果、まさかのWikiLeaksにまで認証鍵の情報が掲載されるに至ります。 wikileaks.org

そして9月に入り、電子フロンティア財団(EFF)がこの問題に関与。 EFFはDMCA通知を受け取ったマニア3名を支援し、「TI社は無意味な法的脅しをかけている」などと批判する声明を出しました。 www.eff.org

EFFはTIに対し「このDMCA通知は不当なので削除された投稿を2009年10月26日に復帰する」という通告をしましたが、TIはこれを無視。 このため10月26日に、削除されていた投稿のうち2つが復活しました。 ですがTIはEFFに対して無視を決め込み、なおも他のサイトへ通知を出し続けたため、EFFはこれを非難する追加の声明を出すに至ります。 www.eff.org

結局TIはEFFの声明に終始反応しないまま通知の送付を止め、認証鍵の情報は2020年現在でもインターネット上でそのまま公開され続けています。

この事件については、英語版Wikipediaからの翻訳記事を書いたのでそちらも参照してください。 ja.wikipedia.org

余談ですが、ファームウェア改造の応用として「ある機種Aにうまく調整したファームウェアを書き込むことで、機種Aの筐体に機種BのOSを書き込む」なんてことも可能です。 また、インストールした複数のOSを適宜切り替えて使うためのツールなんてものも存在します。 さらにこの方面の改造の別パターンとして、関数電卓の機種Aの基盤に刺さっている抵抗のうち、特定のものを取り除くことでファームウェアを機種Bに変更できるというものがあります。

さて、この事件を通じて、高機能電卓のユーザーコミュニティには色々と闇でカオスでハードコアな側面がある事がお分かりいただけたことかと思います。

高機能電卓でMathematicaに勝てるのか

高機能電卓と一口に言っても色々な種類がありますが、数式処理システム(CAS)というものを搭載しているか否かによって大雑把に上位機種か下位機種かを分けることができます。 CASというのは、要はMathematicaとかWolfram Alphaとかああいう類のソフトウェアのことです。 CASを積んでいる高機能電卓は、例えば2100みたいな長大な整数の絡む演算を正確に行えたり(多倍長計算)、記号を含む数式を処理したり、方程式を解いたり、不定積分ができたり、グレブナー基底を求めたり、とにかく色々な計算ができます。 要は、高級な高機能電卓は肩にちっちゃいWolfram Alphaを載せているのだと理解していただければそれでだいたい合っています。

いくらちっちゃいWolfram Alphaかて大したことできひんのやろ?と思われるかもしれませんが、実はそうでもないのです。

1997年、数式処理分野の学会が開いたカンファレンス「ISSAC '97」において、一つのベンチマークコンペのようなものが開かれました。 各数式処理ソフトごとに複数の参加チームに分かれて、各チームは自分たちの数式処理ソフトを駆使して計算問題を解き、正答した数と解答の正しさを競うというものです。 参加した数式処理ソフトウェアはMacsyma、Reduce、MuPAD、Mathematica、そしてTexas Instruments社のCAS搭載高機能電卓「TI-92」の5つ。 そして出された問題は以下のようなものでした。

gist.github.com

この10問が現代の数式処理システムや数値計算パッケージで簡単に処理できるかどうかは私には分かりませんが、少なくとも1997年当時のコンピュータには非常に荷の重い問題であっただろうということは想像がつくと思います。


2021-01-04追記:矢吹太朗先生が検証をしてくださり、Mathematica v12.1にて少なくとも8つが処理できる*1ことが判明しました。有難うございました。


最終的に最も正答数を稼いだチームはどこだったのかというと、なんとMathematicaとTI-92が1位タイでした2。 また、カンファレンス出席者の投票により、TI-92チームの解答が最も"interesting"であったとして最優秀賞を獲得しました。

コンペ終了後、各チームは自分たちの解答とその手順を公開しました。

Mathematicaチームによる報告がこれ。 Mathematica solutions to the ISSAC system challenge 1997 | ACM SIGSAM Bulletin

そしてTI-92チームによる報告がこれです。 A TI-92 solution to the ISSAC '97 challenge problem 1 | ACM SIGSAM Bulletin

私は解析学線形代数を中途半端にかじっている程度の数学知識しかない非理工系のB1なので、ここで解説されている解法がいったいどういうものなのか完璧には理解できていないのですが、 しかしそれはそれとしてこの結果は、スペックがものすごくチャチであったTI-92であっても3、数学的能力に長けた人がうまく扱えばMathematica並みのことが可能になるということをこれ以上なく表しています。 筐体は極めてチャチではありますが、その潜在的能力は単なる教育用用途に留まるものではないことが示されていると言っても良いでしょう。

オーバークロック

高機能電卓は、当然ですがCPUを搭載しています。 しかし高機能電卓にいくらスペックの高いCPUを積んだところで使い道がありませんし、また消費電力も多くなってしまいますよね。 そのため特に昔の機種においては、やや性能が低めの組み込み向けチップを採用した上でクロック周波数を下げて販売されていることがあったそうです(昔のポケコンもこういうパターンが多かったらしいですね)。 しかしどこの世界にもオーバークロッカーという人種は存在するもので、彼らは高機能電卓の持つCPUのポテンシャルを最大限に引き上げることを楽しんでいます。 制約が大きい分、普通のパソコンでオーバークロックするよりも面白いところがあるのかもしれませんね。

そうしたオーバークロッカーが開発したオーバークロック用ツールはインターネット上で一般に配布され、誰でも使えるようになっています。 高機能電卓は基本的に動作がかなりトロいので、重い処理をさせたい人にとってはある種必須のツールと言えるかもしれません。 私も以前、高機能電卓でちょっとした数値計算をした際に計算時間短縮のためオーバークロックツールを使ったことがあります。

高機能電卓に積まれているCPUはメーカーによってかなり多種多様なのですが、 大きく分けてHP Saturnのようなメーカー独自の製品とMC68000Z80SuperH・ARMなどのメジャーな製品とに二分されます。 最近の機種ではeZ80とARMが主流ですね。 当然CPUや機種の仕様ごとにオーバークロックのメカニズムは全く異なるので一般的な手順については説明できないのですが、一例として最近出たこちらのエントリを見てみましょう。

www.zephray.me

この記事の作者の方は、TI社の最新機種「TI-Nspire CX II」シリーズのオーバークロックをいち早く成し遂げておられます。

リバースエンジニアリングに厳しいTI社はこの機種についても、認証されていないバイナリの実行が不可能なようにしているのですが、 ユーザーコミュニティではこの機種のOSに存在する脆弱性を突き(一種のゼロデイ攻撃のようなもの)、権限昇格攻撃を仕掛けてTI-Nspireシリーズでバイナリを実行するためのツール「Ndless」が開発されています。

github.com

stepney141.hatenablog.com

上で紹介した記事の作者の方は、オーバークロックを行うにあたってこのツールを利用することで、TI社のセキュリティをかいくぐって高機能電卓でC言語をビルドしたバイナリを実行しています。

高機能電卓でWin10 IoTを動かす

高機能電卓に自前のファームウェアを入れて動かそうという話は上で既に説明しましたが、高機能電卓に「既存のOSを入れてしまおう」というとんでもないことを考える人もそこそこいます。

高機能電卓にLinuxを導入している人がいることは前回の記事で説明しましたが、高機能電卓にWindows 10 IoTを導入してしまった人もいます。

www.imbushuo.net

この人がWin10を入れたのはHewlett Packard社製の「HP Prime」というモデルなのですが、この機種は競合他社のTexas Instruments社製電卓に比べてあまりハックが進んでおらず、これは色々な意味でとても興味深い偉業であると私は思っています。 巨人の肩に乗らずに何かを成し遂げるのって、特にこういう分野ではものすごく大変なことですよね。

まとめ

ここまで、関数電卓の闇の魔術というかマイナーでディープな世界の話をしてみました。 具体的な闇の魔術の話が出てこず興ざめだったかもしれませんがどうかご寛恕ください。 来年の闇の魔術アドカレではもっとディープな関数電卓の技術の話が出来るように、一年間精進しようと思います。


  1. GGNFS及びMsieveの2つの実装を併用したそうです。10年経った現在のCPUなら、73日どころか数時間で素因数分解できてしまいそうな気もします

  2. 参考文献:梅野善雄(2000)『グラフ電卓が切り開く数学教育の新世界』』6ページ、“TI-92 Wins System Challenge at Math Software Conference”

  3. CPU:10MHz の MC68000 / RAM容量:70KB ~ 100KB程度 (モデルごとに差がある)

*1:10問のうち2問はコンペ開始後に別の問題へ差し替えられており、矢吹先生が検証して下さった問題は差し替え前の問題。上で紹介した問題は差し替え後のもの

【WIP】フェアリーチェスのための駒表記ガイド 〜Betza's Funny Notation事始め〜:Part 2

※この記事は、以下の記事の続編であり、書きかけです。 stepney141.hatenablog.com

前回のPart1では、Betza's Funny Notationの基本となる事項を解説した。 今回のPart2では、BFNの拡張記法を解説していく。

Betza's Funny Notationの拡張

Part 1のラストでも述べたように、ここまで説明してきたBFNは、決してあらゆる駒の動きを表せる訳ではない。 また、別格に複雑な動きをする駒はBFNだと記述が過剰に長くなってしまい、読み解くのが大変になるという欠点もある。
BFNが広く使われるようになるにつれてこれらの欠点は徐々に無視できないものとなっていき、 そのうちに「既存のBFNでは不十分だから新しく記号を加えて拡張しよう」という動きが多く見られるようになった。
以下では、そうしたBFNの拡張記法を紹介していく。

留意点として、下で紹介する拡張記法類は原則としてお互いに互換性がなく、 同じアルファベットをお互いに異なる意味で利用しているものもある。 また、Betza氏によるオリジナルの記法と互換性を持つものと、BFNの仕様を独自に進化させて互換性を捨てたものがある。

Ralph Betza本人による拡張記法

これはBetza氏が"Chess on a Really Big Board"というフェアリーチェスを創作した際に導入した記法である。
原作者本人による拡張ということもあって、特に「q」修飾子については拡張ではなくオリジナルのBFNからあったものとして扱われることも少なくない。

円環ライダー

修飾子「q」を追加する。これは「円環ライダー(circular riders)」と呼ばれる種類の駒の動き方を表す。

この「円環ライダー」の概念は、実例を使わなければ説明が難しい。
qK というBFN表記は、フェアリーチェスやチェスプロブレムで用いられる「ローズ(rose)」という駒の動きを表す。

ローズの動き方は筆者の手に余る複雑なものなので、 詳しくはPiececlopediaあーかさか氏の解説記事といった、既存の分かりやすい図解を参照されたい。

go修飾子

修飾子「g」を「強制的に進む(go)」の意味で導入(上書き)する。

Betza氏は、シャンチーの「馬」の駒を例にしてこの記法を解説している。 下の図は馬の動き方を表したものである(XXXが馬の現在位置)。

+---+---+---+---+---+
|   | * |   | * |   |
+---+---+---+---+---+
| * |   | ^ |   | * |
+---+---+---+---+---+
|   | ^ |XXX| ^ |   |
+---+---+---+---+---+
| * |   | ^ |   | * |
+---+---+---+---+---+
|   | * |   | * |   |
+---+---+---+---+---+

馬はチェスのナイトと同じ動き方をする(*印のついたマス目に跳ぶ)が、 大きな相違点として「他の駒を飛び越えることが出来ない」。 より厳密に言うと、図中の^の位置が他の駒でふさがれている場合、 その方向の先にある*印に跳ぶことは出来ない。このルールを「絆馬脚」という。 「まず隣に1マスの^の位置に移動し、そこからさらに斜め1マス先の*の位置に移動する」と考えると理解しやすいかもしれない。

Betza氏は、このような馬の動きを「まず駒を取らずにW(ワズィール)の動きをした後、 さらにその位置から見てF(フェルズ)の動きを行うことが強制される」と解釈した。 そして氏はこれを、'go'の頭文字から取った修飾子「g」を用いて、
g[mWF]
と表記した。

Betza氏は拡張記法の説明で「gは使われていないので'go'の意味を割り振る」としているが、 実際にはオリジナルの記法で既に「グラスホッパー」の意味が割り振られている。 単にBetza氏が勘違いしていたのか、 あるいはグラスホッパーとしてのgが他の人にあまり使われていなかったので意味を変えたということなのかは、全く不明である。 紛らわしいためか、このgo修飾子が実際に使われている事例はあまり見られない。gはグラスホッパー修飾子として使われることが一般的のようだ。

then修飾子

修飾子「t」を追加する。これは「then」から取られたものである。

中世スペインに存在した古チェスに「グランド・アセドレフ(Grand Acedrex)」というものがある。 このチェスには現代にない動きの駒が多数あり、Betza氏はこれを表すためにthen修飾子を導入している。 例えば、「グリフォン(Griffon)」と英語では訳されている駒を見てみよう。 この駒についてはPiececlopediaに詳細な図解があるのでそちらをご覧頂きたいが、 ともかくその動きは
t[FR]
という表記で表せる。 これがどういう意味かと言うと、「最初に駒の現在位置から見てF(フェルズ)の動き方をし、そこからさらに続けて(then)、(盤の外側に向かって)R(ルーク)の動きをする」ということである。

XBetza

XBetzaは、コンピュータチェスエンジンと接続して利用するGUIソフトの一つ「GNU XBoard」(コンピュータ将棋で言うところの将棋所やShogiGUIに相当するソフト)で独自に用いられている記法である。 このソフトウェアは普通のチェスだけでなくフェアリーチェス類にも対応しており、入力されたXBetza表記を参照することで、 駒が利いているマスのハイライト表示や合法手生成などを実現している(らしい)。 そうした都合もあって、このソフトウェアにとってXBetzaはかなり重要な存在であり、色々な将棋・チェス類のルールに包括的に対応しなければならないため、 XBetza独自の色々な拡張記法が導入されている。
英語版Wikipediaでもちょくちょく使われているなど、見かける機会はそれなりに多い。

基本原子の上書きなど

基本原子「J」を「C」に、「Z」を「L」に、それぞれ変更する。
また、XBetzaでは角カッコ [ ] は廃止されている

アンパッサン

修飾子「e」および「i」を追加する。この両方を組み合わせて、チェスのアンパッサン(en passant)に準ずる駒の取り方を表す。

キャスリング

基本原子「O」を追加する。これはチェスのキャスリングに準ずる動き方を表す。

万能リーパー

基本原子「U」を追加する。これは「万能リーパー(Universal leapers)」に準ずる動き方を表す。

この「万能リーパー」というのは、「どんなマス目にでも一手でテレポートできる」という小学生がノリで考えたみたいな動き方をする駒である。 確かに万能というか、もはやチート級である。 しかし驚くべきことにこの分類に該当する駒はちゃんと実在しており、 例としては摩訶大大将棋泰将棋といった一部の古将棋に見られる「自在天王」の駒が挙げられる。

持ち駒

基本原子「@」を追加する。これは「その駒を持ち駒として盤上に打つことができる」という意味を表す。

方向を表す修飾子はこの基本原子につけても無意味なため、代わりにそれぞれ以下の意味でオーバーロードされる。

  • f:同じ種類の駒が既に存在している筋には、持ち駒として打てない(※例:二歩)
  • s:同じ種類の駒が既に存在している斜めのラインの上には、持ち駒として打てない(※二歩の斜めバージョンと考えるとわかりやすい)
  • b:同じ種類の駒が盤上のどこかに一つでも存在していたら、持ち駒として打てない

@の後に自然数nをつけた場合、その数字は「盤上の(自陣から見て)n段目から先には打てない」という意味になる。

上の記法を元に将棋の駒を表すと、二歩・行き所のない駒のルールにより、歩兵はfWf@8香車fR@8、桂馬はfN@7となる。他の駒は全て@9が付く。

again修飾子

修飾子「a」を追加する。これは「一つの手番の中で、一度ある動きをした後、さらにそれに加えて別の動き方をする」という意味を表す。
「a」は'again'から取られている。このagain修飾子があれば、上で述べたBetza氏による拡張記法のうち、go修飾子とthen修飾子は全くの無用の長物になる。
again修飾子とその応用は極めて重要かつ強力な記法なので、特に丁寧に解説する。

基本的な使い方

最初の例として、camKという表記を見てみる。
これは「一つの手番の中で、まず最初にcK(Kと同じ駒の取り方をするが、その方向には動かない)として振る舞った後、さらにmK(Kと同じ動き方をするが、駒は取らない)として振る舞う」という駒を表す。
この例では、aの前にある修飾子cを「最初の振る舞い方を表す引数」として取り、aの後ろにある修飾子mを「二番目の振る舞い方を表す引数」として取っている。 この駒は、例えば「隣にいる敵の駒を現在位置から動かないまま取った後、追加で1マス動く」みたいな振る舞いが可能になる。 しかし、ここで指定している「二番目の振る舞い方」はmK、即ち「キングとして動けるが駒を取ることはできない」ということなので、この駒は立て続けに二つの駒を取ることはできない。

XBetzaのオリジナルの解説では、again修飾子の説明にあたり「多脚(legs)」という概念を導入している。
ある駒がこのように複数の動き方を順々に行う場合において、一連の動き方を構成するひとつひとつの動き方のことを「脚(a leg)」という。
上のcamKの例で言うなら、最初の振る舞い方であるところのcKが「一本目の脚」にあたり、 二番目の振る舞い方であるところのmKが「二本目の脚」ということになる。
again修飾子は、要するにこの「脚」の概念を端的に表すための記法なのだ。

ここで、以降の説明を円滑にするため、XBetzaのオリジナルの解説を元に以下のような用語を導入する。

  • 開始脚(initial legs):n本の脚からなる一連の駒の動きの中における、1本目の"脚"のこと
  • 終端脚(final legs):n本の脚からなる一連の駒の動きの中における、n本目の"脚"のこと
  • 非終端脚(non-final legs):n本の脚からなる一連の駒の動きの中における、1本目からn-1本目までの全ての"脚"のこと
again修飾子の性質

このagain修飾子については、注意しておかなくてはならない性質(ルール)がいくつかある。

  1. again修飾子で指定された「一本目の脚」と「二本目の脚」は、必ず両方とも実行されなければならない(どっちか一方の振る舞い方のみをするという事はできない)。その手番でその駒を動かすことにしたら最後、両方の振る舞い方を完遂させなければならない。
  2. 「二番目の脚」の中で指定される進行方向の修飾子は、「一本目の脚」の動きを完遂した時点にその駒がいる位置が基準となる。駒の初期位置は基準にはならない。
  3. ルークやビショップのような限られた方向にしか進めない基本原子についても、その基本原子では本来進めないはずの方向を表す修飾子を適用できる。
  4. again修飾子は、同時に複数個利用できる。これにより、三本以上の脚がある動きも表現できる。
  5. 非終端脚はデフォルトで m を、終端脚は デフォルトでmc を、暗黙的な修飾子として持っているものとみなす。

これらのルールについて理解を深めるため、別の例をいくつか見てみよう。

masRは、「一本目の脚がmR、二本目の脚がsR」という動き方である。
これを噛み砕いて言うと、「一つの手番の中で二つの異なる振る舞い方をし(a)、一回目の振る舞い方においては駒を取ることはできず(mR)、二回目の振る舞い方においては一回目とは垂直な動き方をせねばならない(sR)が、二回目においては駒を取っても取らなくてもよい」という条件を持つルークを表している。
2.のルールにより、まずルークとして一回動いて止まった後、さらにそのマス目からスタートして、「今までの進路と垂直な方向にしか進めないルーク」としてもう一回振る舞うのである。

mafsRは、「一本目の脚がmR、二本目の脚がfsR」という動き方である。
これを噛み砕いて言うと、「一つの手番の中で二つの異なる振る舞い方をする(a)。駒を取らないルークとして敵の駒のないマスへ一旦動いた後(mR)、斜め45度方向に向きを変えてもう一度動く(fsR)」という動きを表している。
本来、ルークは斜め方向に進むことができない。しかし3.のルールにより、まずルークとして一回動いて止まった後、さらにそのマス目からスタートして、「斜め方向に薦めるルーク」としてもう一回振る舞うのである。

mamaKは、「一本目の脚がmK、二本目の脚がmK、三本目の脚がK」という動き方である。
これを噛み砕いて言うと、「任意の方向へキングの動きを三回行うことができる。三回目の動きの時には相手の駒を取ることができるが、 一回目と二回目の動きにおいては空のマス目にしか行くことができない」ということになる。

3.のルールを用いているのが、上の例のうちのmafsRだ。 このようにagain修飾子と方向修飾子をうまく使うことで、「R(ルーク)とB(ビショップ)」「W(ワズィール)とF(フェルズ)」「D(ダッバーダ)とA(アルフィル)」など、 縦横方向と斜め方向で動きが対になっている基本原子の組を『相互変換』することができる。
一見単にややこしいだけのように思われるかもしれないが、この『相互変換』を使えば、 例えば「一本目の脚が(駒を取れない)ルーク、二本目の脚がビショップ」といった二つの基本原子が絡むようなややこしい動きであっても、 mavRと簡潔に表すことができるようになるのだ。

5.のルールは、Part1で説明した「特殊ルールを表す修飾子」に関連する。
要するに、駒の動き方や取り方について特別に指定しない限りは、非終端脚はmという修飾子を、終端脚はmcという修飾子を、それぞれ暗黙的に持っているものとみなすということだ。
このルールは、例えばpシャンチーの砲のように、進行方向上にある駒を一個だけ飛び越えて着地する)のような修飾子を考える際に重要になってくる。
非終端脚についてmpという修飾子を付けた場合、
これを踏まえた上で、mc以外の特殊ルールを表す修飾子を使った例を見てみよう。

  • pasRは、「一本目の脚がpR、二本目の脚がsR」という動き方である。 これを噛み砕いて言うと、「他の駒を一個飛び越えて着地してからでなければ、直角に方向転換することができないルーク」ということになる。
  • cpasRは、「一本目の脚がcpR、二本目の脚がsR」という動き方である。 これを噛み砕いて言うと、「他の駒を、直角に方向転換することができないルーク」ということになる。
  • mpafsKは、チェスのナイトを基本原子を使わず表したものである。
性質と応用

このため、非終端脚におけるm修飾子・終端脚におけるc修飾子は、これを省略することができる。
この規則に従うと、maK(一本目の脚がmK、二本目の脚がK)という記述は、aKと略記することができる。
同様に、先程のmamaKaaKと省略することが可能である。
しかし、可読性を損ねるのでこの略記を実際に使うのはやめておいたほうがいいだろう。

Betza 2.0

Betza 2.0は、XBetzaをさらに拡張することで既存のBFNの持つ問題点を可能な限り解決しようとしたものである(らしい)。

丸カッコ記法

半角丸括弧 ( )を導入する。これは、特に何か新しい意味を追加するものではなく、 Betza's Funny Notationの「長くなると可読性が極端に下がる」という欠点を解決するためのものである。

連鎖(Chaining)記法

XBetzaでは、一手のうちに複数の異なる動きをする駒を記述するために「脚」の概念が導入されていた。
Betza 2.0では、これをさらに拡張して「連鎖(Chaining)」という概念を導入している。

XBetzaの「脚」の概念に基づいたagain修飾子は、ルールがややこしい上に、2つ以上の基本原子の動きを順番に行うような動きに弱かった。
Betza 2.0では、複数の脚からなる動きのことを「連鎖」と定義し、これを記述するための記法として半角ダッシュ記号 - を導入した。

例として、シャンチーの「象」の駒を見てみよう。 この駒は「斜め方向に2マス進むが、自分の斜め1マス隣に他の駒があればその先に進むことはできない」という動き方をする。 このルールを脚の概念を用いて再解釈すると「一本目の脚はmF、二本目の脚はF」と見ることができる。 Betza 2.0では、これを連鎖記法を用いて mF-F と表す。
同様にシャンチーの「馬」も、同じようにして mW-F と表すことができる。 BFNやXBetzaではnAと表していたものが、連鎖記法を使うことで、脚の概念に基づいて表すことができるようになるのだ。

別の例として、(チェスではないが)チェッカーにおける駒の取り方・動き方を見てみる。 これは連鎖記法と丸カッコ記法を用いることで、fmF(fcF-mF) と表される。 XBetzaでは、同じ動きを fcafmF と表す。Betza 2.0の方が記述は長いが、より分かりやすいものになったと言えるのではないだろうか。

XBetzaのagain修飾子と同じく、Betza 2.0の連鎖記法においても、駒の動き方や取り方について特別に指定しない限り非終端脚はmという修飾子を暗黙的に持っているものとみなされる。

したがって、先ほど例に挙げたシャンチーの馬 mW-F の場合は、m修飾子を省略して W-F と略記できる。

destroy修飾子

修飾子「d」を追加する。これは敵味方関係なく駒を取ることを表す。

test修飾子

修飾子「t」を追加する。これは自分の駒の上しか飛び越えることができないことを表す。

stray-off修飾子

修飾子「o」を追加する。これは盤の左右両端が繋がっている

変則将棋の「反射角」、またはフェアリーチェスのReflecting Bishop

unload修飾子

修飾子「u」を追加する。これは自分の駒を自分で取ることを表す。

変梃記法

「変梃記法(Quirky stuff)」

(W-F)0 は、シャンチーの馬を走り駒化させた「マオライダー」である。
※走り駒化のイメージについては、あーかさか氏の解説記事が分かりやすいと思われる。
これはオリジナルのBFNで言うところの nN0 と全く等価なのだが、Betza 2.0の「変梃記法」を用いた場合、駒が動けなくなる条件がより分かりやすくなるというメリットがある。

Bex Notation

これはフェアリーチェス創作家のDavid Howe氏が2012年に発表したもので、正式には"Proposed Betza Extended Notation"という。 これを略して「Bex Notation」と称しているというわけだ。 XBetzaやBetza 2.0よりも後に考案されたため、両者の記法を部分的に取り込んでいる。

この拡張では、アルファベット・数字・角カッコ以外の特殊記号を、「操作子(operator)」として多量に導入しているのが特徴である。
また、Howe氏自身が考案した特殊な駒の動きを表すための記法が多く用意されている。

グルーピング記法

丸括弧 ( )を導入する。これはBetza 2.0の丸括弧と全く同じ役割をし、意味上の区切りを明示するためのものとして使われる。

  • (A)は、普通の基本原子Aと全く同じ意味である。
  • (imfW2)(mfW)(cfF)は、imfW2mfWcfFと全く同じ意味である。※「i」は同じBex Notationのinitial修飾子(後述)

このように、丸括弧で「修飾子+基本原子」の組を一つ一つ囲っていくことで、意味上の区切りをはっきりさせて可読性を上げる働きがある。

継続操作子

半角ダッシュ記号 - を導入する。
これは、XとYを任意の基本原子として、X-Yとすることで「XとYの動きを繋げて実行する。途中で進行方向を変えられない」ことを表す。

これを用いると、上でも説明したシャンチーの「馬」の動きはmW-Fと表される。

Betza 2.0の連鎖記法と同じものである。

連続操作子

半角ダッシュ記号を2つ繋げたもの -- を導入する。
これは、XとYを任意の基本原子として、X--Yとすることで「XとYの動きを繋げて実行する。途中で進行方向を変えられる」ことを表す。

フェアリーチェス類の駒で、「ダブルナイト」というものがある。これは「まず駒を取らずにナイトの動きをし、続けてもう一回ナイトの動きをする(このときは駒を取れる)」という動き方をするものだ。
XBetzaのagain修飾子を使えばmaNとなるが、Bex Notationでは連続操作子を使うことでmN--Nと表す。

XBetzaのagain修飾子が形を変え、先程の継続操作子と役割を分割したものだと考えればよい。

合成操作子

半角プラス記号 + を導入する。
これは、XとYを任意の基本原子として、X+Yとすることで、普通のBFNにおける XY と全く同じ意味を表す。
これも丸括弧と同様、長いBFNの記述に合成操作子を挟むことで可読性を挙げることを目的としている。

imfW2+mfW+cfFは、合成操作子を使わずに書いたimfW2mfWcfFと完全に等価である。
また、これは上で説明したグルーピング記法(丸括弧)と併用でき、この例で言えば(imfW2)+(mfW)+(cfF)とも表すことができる(グルーピング記法の定義上、意味は変わらない)。

ライダー操作子

半角アスタリスク記号 * を導入する。
これは、Xを任意の基本原子として、X* とすることで、普通のBFNにおける XX と全く同じ意味を表す。

フェアリーチェスの中でもメジャーな駒として「ナイトライダー」というものがある。 これは、チェスのナイトの動きを拡張して、ルークやビショップのような「走り駒(ライダー)」に昇華させたものだ。 この駒の動きは文章よりも図で見た方が分かりやすいので、詳しくは丁寧な図解が載っているあーかさか氏の解説記事を参照されたい。
このナイトライダーの動きは、ライダー操作子を用いて N* と表される。

ナイトライダーと同じ要領で他にも色々な駒を走り駒へ拡張することが出来る。 シャンチーの馬を走り駒化させた「マオライダー」は、ライダー操作子を用いることで (mW-F)* と表される。

限定ライダー操作子

「修飾子+基本原子」の組の後ろに、2以上の数字を指定することで、 「最大で指定した数字の回数まで同じ動きを繰り返すライダーになる」という意味になる。

「最大で前に2マスまで進む(1マスだけでも良い)」という動きは mfW2 と表される。

厳密限定ライダー操作子

「修飾子+基本原子」の組の後ろに、2以上の数字を指定して、その数字の前に0を付けることで、 「指定した数字の回数だけ同じ動きを繰り返すライダーになる」という意味になる。

「前に2マス進む」という動きは mfW02 と表される。

Null-Move原子

基本原子「O」を導入する。これは(0,0)-Leaperを表す。

繰り返すが、これは(0,0)-Leaperである。つまり「その場から移動しない(Null-move)」駒である。
その場から動けないことに何の意味があるんだ?と思うかもしれないが、これは「手待ち」に使えるのである。
チェスはルール上パスが出来ず、その上「パスが最善手となる局面」、つまりどう駒を動かしても自分が不利になってしまう局面(これをチェス用語でツークツワンクという)の出現がたまによくある。
ゼロはこれを解消し、合法的にパスをするための手段として、チェスプロブレムやフェアリーチェスで導入されることがあるという。 日本の将棋類でも、ゼロ駒とは本質的に異なるものではあるが、古将棋類の「獅子」などの駒は同じような事が出来る(中将棋ではこの動き方を「じっと」という)。

royalty修飾子

修飾子「y」を導入する。これは「その駒がロイヤル駒である」ということを表す。

ロイヤル駒とは、王将やキングのように「これを詰まされる/取られると負ける」という駒のことである。 古将棋類に見られる「太子」という駒は、ロイヤル駒の一種である。 太子の駒がある古将棋では、王将と太子を両方とも取られたり詰まされたりしない限り負けにはならない。

initial修飾子

修飾子「i」を導入する。これを用いることで、最初にその駒を動かす時のみに適用される特殊な動き方を指定する。

チェスのポーンの「駒を取ることはできないが前に1マス進み、駒を取るときは斜め前に1マス進む。最初に動かすときのみ前に2マス進む」という動きは、
imfW2+mfW+cfF として記述することが出来る。

e修飾子

修飾子「e」を導入する。これは、本来なら駒を飛び越さない動きに付けることで、駒を飛び越える動きをすることを表す。
オリジナルのBFNであれば、同じようなことを「j」修飾子で表す。

将棋の桂馬は、e(mfW-F)と表される。

jump修飾子

修飾子「j」を、オリジナルのBFNで言うところの「p」修飾子の意味で上書きする。
Bex notationでは、「j」修飾子はリーパーに付けるものという前提が定められており、「j」修飾子をリーパーに付けることによってホッパーに変更する仕組みになっている。

Leaper記法

m, nを任意の自然数として、 (m, n) という記法を導入する。これは(m, n)-Leaperを意味し、これ単体で基本原子として扱われる。

成り駒記法

Bex Notationの後ろに「半角イコール記号と成り駒の動き」を付け加えることで、 「イコールの前にある動きの駒が、イコールの後ろにある動きの駒に成る(プロモーションする)」ということを表す。 成り駒が複数ある場合、半角カンマ記号で各成り駒を区切る。

例えばチェスのポーンの場合、クイーン・ルーク・ビショップ・ナイトのどれかに成ることができる。
これは imfW2+mfW+cfF=Q,R,B,N と表される。

なお、この記法は「この駒はこういう駒に成る」という変化の仕方のみを表すものであり、成るための条件を表す記法は用意されていない。
例えばチェスの場合、ポーンは自分から見て一番奥の段まで進まなければ成ることができない。 また摩訶大大将棋などの一部の古将棋では、本将棋などのように「敵陣に入ったら成る(不成も可能)」というルールはなく、代わりに「敵の駒を取ったら強制的に成る」というルールになっている。
Bex Notationでは、このような成りに関しての規定を表す記法は用意されていない。

エキゾチック操作子

フェアリーチェスの世界には、リーパー・ライダー・ホッパーの基本三分類に収まらないトリッキーな駒...Howe氏の言葉を借りれば"異風(Exotic)"な駒が頻出する。 そうした駒の動きは、基本原子と修飾子の枠に縛られるBFNでは表現することが難しい。 またBFNで使われていた角カッコ[ ]は、Bex Notationにおいてはここまで紹介してきた多様な操作子を使えば全くの無用の長物になる。 そこで、Bex Notationでは、基本原子と修飾子では表せないトリッキーな動き方を角カッコを用いて出来る限り表そうと試みている。

以下の説明において、大文字アルファベット M は任意の基本原子を表す。

  • [ca] = アドバンサー(Advancer)のような駒の取り方をする。すなわち、着地したマス目に隣接する位置にある駒を取る。
  • [cw] = ウィズドローワー(Withdrawer)のような駒の取り方をする。すなわち、着地したマス目から見て進行方向と逆側にある駒を取る。
  • [cj] = 駒を飛び越えて、その駒を取る。一手で飛び越えられる/取れる駒は一個だけ。
  • [cl] = 駒を飛び越えて、その駒を取る。一手で飛び越えられる/取れる駒は何個でもよい。
  • [ci] = カメレオン(Chameleon)。すなわち、自分に利きがある全ての駒の動きを模倣する。このタイプの動き方の例については、英語版Wikipediaによるカメレオンの解説が詳しい。
  • [ccM] = 敵の駒を挟み撃ち(custodial capture)する。すなわち、基本原子 M の動き方をし、はさみ将棋の要領で敵の駒一個を他の自分の駒とで挟んで取る。この取り方にはいくつか条件があるが、これについてはPiececlopediaの解説を参照。
  • [cu] = 自分自身を道連れにして、隣接するマスにいる敵の駒を取る。
  • [crM]= 自分から見て基本原子 M の利きに入っている駒を全て取る。
  • [xiM] = イモビライザー(Immobilizer)の効果を持つ。すなわち、自分から見て基本原子 M の利きに入っている敵の駒を全て「凍結(イモビライゼーション)」させ、その場から動けなくする。凍結させられた駒は、イモビライザーが別の場所に行くか取られるかするまで動くことができない。
  • [x!iM] = 自分から見て基本原子 M の利きに入っている敵の駒のうち、イモビライザーによって動けなくなっている駒を全て「解凍(アンイモビライゼーション)」させ、イモビライザーの効果を解除する。
  • [xwM] = 自分から見て基本原子 M の利きに入っている任意の駒(自分の駒も含む)の位置と、自分が現在いる位置を入れ替える。
  • [xo] = 自分が一手前にいたマス目へまた戻る。

エキゾチック操作子を用いて実際の駒の動き方を表したものとして、Howe氏は以下のような例を紹介している。

Modified Betza Notation

結局どれを使えばいいのか

どの拡張記法も一長一短なのだが、個人的には「広く使われている」 「オリジナルのBFNとの互換性をある程度保っており、覚えることが少ない」という理由からXBetzaを推奨したい。 しかし「汎用性が高い」「可読性に配慮している」 という点では、Bex Notationに軍配が上がる。 Betza 2.0も色々と便利な記法は多いのだが、どうも仕様自体が未完成っぽいので推奨はしない。

Bex Notationでは、操作子をいくつも追加するなどの大規模な変更を行うことで、 可読性を上げる・XBetzaのagain修飾子の難解な仕様を分解する・オリジナルのBFNの曖昧な仕様を厳密にするなどの改良を行っている。
しかし、オリジナルとのBFNとの互換性が壊れてしまっている箇所や、改良しようとするあまり仕様がかえって分かりにくくなってしまっている箇所が見られる。

はっきり言ってどの記法も一長一短であり、全てのメリットを取り込んで互いのデメリットを打ち消し合っているような、統合された記法が必要かもしれない。
しかし、マニアの間でのデファクトスタンダードはXBetzaであると断言しても問題はないだろう。

参考文献

BFNの総合的な解説

拡張記法の解説

フェアリー駒の事典や解説など

フェアリーチェスのための駒表記ガイド 〜Betza's Funny Notation事始め〜:Part 1

はじめに

世界には、将棋やチェスの他、インドのチャトランガ・中国のシャンチー・ペルシアのシャトランジ・朝鮮半島チャンギなど、 将棋やチェスに類似したボードゲームが大量に存在する。 また、既存のボードゲームのルールをマニアが独自にアレンジした「変則ルール」とか「フェアリールール」と呼称されるものもある。 さらには、そうした変則ルールを採用した詰将棋チェスプロブレム(※詰将棋のチェス版みたいなもの)も存在する。

これらの将棋系ボードゲームの中には、一般的なボードゲームには登場しないマイナーな駒も多く存在する。 そしてその中には、簡単には理解しにくいトリッキーな動き方をするものも少なくない。 自然言語でそうした複雑の動きを記述しようとすると、当然の帰結として説明自体も長く複雑になってしまいがちであり、 ひいては誤解や誤記が生じることにもつながりかねない。 この問題を解決するため、決まった記号の組み合わせで可能な限り多くの駒の動きを表現しよう!という欲張ったことを考えた人物が歴史上には複数存在した。 現在では、その中の一人であるRalph Bezta氏が考案した記法「Betza's Funny Notation」が、マニアの間で最も広く利用されていると断言してよい。 この記事は、この「Betza's Funny Notation」とその拡張記法の詳細を駒の実例を挙げつつ紹介するものである。

Betza's Funny Notation

1. 概要

Betza's Funny Notationは、世界の将棋類の駒の動きを体系的に表記するための記法である。
チェスのFIDEマスターにしてフェアリーチェス創作家でもある、アメリカのRalph Betza氏によって考案された。

Betza's Funny Notationの特徴は「駒の動き方を細かく分解して、基本的な駒の動きの組み合わせとして表現する」という原則に基づいていることにある。 例えば、将棋をすでに知っている人がチェスの駒の動きを覚える時、その人は「クイーンは飛車と角行を合わせた動きをする」という風に認識するだろうし、 逆にチェスをすでに知っている人が将棋の駒の動きを覚える時は、「香車は前方向にしか進めないルークだ」と認識するかもしれない。 Betza's Funny Notationでは、これと似た表し方をする。 つまり、「この駒はナイトとキングを合わせた動き」「この駒は2マスまでしか動けないルーク」という要領で、 あらゆる駒の動きを一般的な駒の動きの組み合わせに分解して表記していくのである。

知識がなければ一見して分かりにくい表記となるのが欠点ではあるが、 汎用性・柔軟性・拡張性に富んでおり、チェスプロブレムを中心に広く用いられている。 例えば、英語版Wikipediaで古将棋関係のページを開くと、駒の動きを解説するパートにはほぼ必ずその駒のBetza's Funny Notation(の拡張記法)による表記が付されている。
以下、特記しない限り「Betza's Funny Notation」を「BFN」と省略して書く。

BFNは、例えば以下のような英数字の列として記述される:

  • 例1) fhNfrlRK
  • 例2) fsLloRgBK

BFNは決められた規則に従って記述されるものであり、その法則から逸脱することはない。

2. 基本ルール

BFNの基本となる要素は、次の2つのみである。

  • 大文字アルファベット:「基本原子(atoms)」
    • 駒のベースとなる動きを表す。
  • 小文字アルファベット:「修飾子(modifiers)」
    • 大文字の基本原子を修飾して、基本原子だけでは表せない様々な動きやルールを補足する。

大文字X, Yと小文字a, bを用いて、BFNの基本的なルールを簡単に示す。
なお、これらのアルファベットはあくまで説明のために便宜上使用しているものであり、以下の例がそのまま実際のBFNの表記というわけではない。

例1: aX
この例では、Xという基本原子の動きをベースとして、その動きをaという修飾子で補足している。
やや乱暴な例えだが、英語の形容詞と名詞の関係に近いかもしれない。形容詞が修飾子、名詞が基本原子にそれぞれ相当すると考えればいいだろう。

修飾子が一つの基本原子に複数付くことも出来る。
例2: abX
この例では、Xに当たる基本原子の動きに基づき、その動きをaとbの2つの修飾子で補足している。
先の比喩で言うと、英語でも2個以上の形容詞で1つの名詞を修飾することがあるが、それと似ている。

異なる基本原子が複数並ぶ場合もある。
例3: XY
この「XY」という表記は、「ひとつの手番でXまたはYの動きが出来る」ということを表す。
「XYZ」であれば、「XまたはYまたはZの動きが出来る」という意味である。
異なる基本原子が複数並んでいる時は、本来なら基本原子の間にあるはずの「or(または)」が省略されていると考えるといい。
例えばXYX or Yを略したものとみなせる。すなわち、「XまたはYの動きをすることが出来る」という意味だ。
ルークの動きを表す基本原子をR、ビショップの動きを表す基本原子をBとすると、 クイーンの動きはRBというBFNで表現できる。
これは「ルークまたはビショップのどちらかの動きを選んで、その動きに従って駒を動かす」という意味である。

同じ基本原子が2つ並ぶ場合もある。
例4 : XX
基本原子Xを2つ連続させた場合、その駒はXの動きを無限にすることが出来ることを表す。

基本原子の後ろに数字を付けた場合、基本原子の動きがその数字の分に制限されることを意味する。
例5 : X5
この例の場合、Xという動きを出来る範囲が5マスであるということを表している。

複数の基本原子を[](角カッコ)で囲んだ場合、それらを基本原子をまとめてひとつの基本原子とみなす。
例6 : [XY]
この例の場合、「まずXの動きに従って駒を動かし、次にYの動きに従って駒を動かす、という操作を1回の手番で行う」という意味になる。
例7 : a[XY]
角カッコで囲んだ基本原子の組にも修飾子を適用できる。

3. 基本原子

まず、実際のBFNで用いられる基本原子(atoms)の一覧を見てみよう。

Fig.01
(Oが駒の現在位置。
基本原子が書いてあるマスが、その基本原子が表す動き)
+---+---+---+---+---+---+---+
| G |   |   | H |   |   | G |
+---+---+---+---+---+---+---+
|   | A |   | D |   | A |   |
+---+---+---+---+---+---+---+
|   |   | F | W | F |   |   |
+---+---+---+---+---+---+---+
| H | D | W | O | W | D | H |
+---+---+---+---+---+---+---+
|   |   | F | W | F |   |   |
+---+---+---+---+---+---+---+
|   | A |   | D |   | A |   |
+---+---+---+---+---+---+---+
| G |   |   | H |   |   | G |
+---+---+---+---+---+---+---+
Fig.02
(Oが駒の現在位置。
基本原子が書いてあるマスが、その基本原子が表す動き)
+---+---+---+---+---+---+---+
|   | J | L |   | L | J |   |
+---+---+---+---+---+---+---+
| J |   | N |   | N |   | J |
+---+---+---+---+---+---+---+
| L | N |   |   |   | N | L |
+---+---+---+---+---+---+---+
|   |   |   | O |   |   |   |
+---+---+---+---+---+---+---+
| L | N |   |   |   | N | L |
+---+---+---+---+---+---+---+
| J |   | N |   | N |   | J |
+---+---+---+---+---+---+---+
|   | J | L |   | L | J |   |
+---+---+---+---+---+---+---+
  • A:シャトランジの「アルフィル」(Alfil, 象)。間にある駒を飛び越えつつナナメ方向の2マス先へ進む。
  • D:タメルラン=チェスの「ダッバーダ」(Dabbaba, 攻城兵器)。間にある駒を飛び越えつつタテかヨコの2マス先へ進む。
  • F:タメルラン=チェスの「フェルズ」(Ferz, 将)。ナナメに1マス進む。
  • G:「トリッパー」。間にある駒を飛び越えつつナナメ方向の3マス先へ進む。
  • H:「スリーリーパー」。間にある駒を飛び越えつつタテかヨコの3マス先へ進む。
  • J:「シマウマ」。間にある駒を飛び越えつつ、3マス直進して、さらに左右のどちらかに2マス進んだ位置に進む。
  • L:「ラクダ」。タメルラン=チェスのズラーファ(Zurafa, キリン)と同じ。間にある駒を飛び越えつつ、3マス直進して、さらに左右のどちらかに1マス進んだ位置に進む。
  • N:チェスのナイト。間にある駒を飛び越えつつ、2マス直進して、さらに左右のどちらかに1マス進んだ位置に進む。
  • W:タメルラン=チェスの「ワズィール」(Wazir, 宰相)。タテヨコに1マス進む。

WとFの2つは言うなれば「単位原子」とでも言うべきもので、この2つさえあればR(ルーク)・B(ビショップ)・Q(クイーン)・K(キング)を全て表すことが出来る。 まずキングは「8方向全てに1マス進める」駒なので、WFというBFNで表すことが出来る。 Wを2つ重ねてWWとすれば、「Wの動きを無限に出来る」という意味になり、これはすなわちルークの動きである。 同様に、FFはビショップの動きを表す。 そしてクイーンはルークとビショップを合わせた動きをするから、WWFFまたはRBと表せる。

糖衣構文

  • R:チェスのルーク。タテヨコ方向にどこまでも動く。WWと同じ。
  • B:チェスのビショップ。ナナメ方向にどこまでも動く。FFと同じ。
  • Q:チェスのクイーン。タテヨコ・ナナメ方向にどこまでも動く。RBまたはWWFFと同じ。
  • K:チェスのキング。全方向に1マス動く。WFと同じ。

4. 修飾子

修飾子(Modifiers)は基本原子を修飾し、基本原子だけでは表現できない動き方や駒の取り方などを補足する。 実際のBFNで用いられる修飾子の一覧を見てみよう。

方向を表す修飾子

  • b:後ろ方向(backwards)
  • bb:後ろ側の中の後ろ(backward-backward)
  • bs:後ろ側の中の横(backward-sideways)
  • bh:後ろ半分(backward-half)
  • f:前方向(forwards)
  • ff:前側の中の前(forward-forward)
  • fs:前側の中の横(forward-sideways)
  • fh:前半分(forward-half)
  • h:半分(half) ※基本的に「f」や「b」とセットで使う
  • l:左方向(left)
  • r:右方向(right)
  • rl:右方向または左方向(right-left) ※「s」と同じ
  • s:右と左(sideways) ※「rl」と同じ
  • v:前と後ろ(vertical) ※「fb」と同じ

特殊ルールを表す修飾子

  • c:その方向に進んで駒を取る。基本的に「m」とセットで用いる
  • g:グラスホッパー(grasshopper)と同じ駒の動き方をする。すなわち、進行方向にある他の駒を1個だけ飛び越えて、その1マス先に着地する
  • j:他の駒を飛び越える(jumping)
  • m:その方向に進むが駒は取らない。基本的に「c」とセットで用いる
  • n:他の駒を飛び越えることができない(non-jumping)
  • o:円筒盤(cylindrical)の動きをする。すなわち、まるで盤が円筒状になっていて両端が繋がっているかのようにして、盤の端っこから反対側の端っこへ1手で動くことが出来る
  • p:シャンチーの炮(pao)と同じ駒の取り方をする。すなわち、進行方向にある別の駒を1つ飛び越えて、その先にある駒を取る
  • z:ジグザグに動く(zig-zag, crooked)

5. Betza's Funny Notationの実例

Betza's Funny Notationを用いると、実に多くの種類の駒の動きが体系的・客観的に表記できる。
以下では様々な駒の動きを例として挙げつつ、BFNの基本原子・修飾子についてより詳しく掘り下げていく。

世界の将棋類の駒の分類

世界の将棋類の駒は、原則としてこれら3つに大別される(例外もある)。

  1. リーパー(Leapers, 飛び駒)
  2. ライダー(Riders, 走り駒)
  3. ホッパー(Hoppers, 跳ね駒)

BFNがこの分類に従って作られているという訳ではないのだが、この分類をイメージすると分かりやすい。

また説明の都合上、次のように将棋/チェスのマスを座標として表したものを導入する。駒の現在位置が原点(0,0)である。

+---------+---------+--------+--------+--------+
| (-2, 2) | (-1, 2) | (0, 2) | (1, 2) | (2, 2) |
+---------+---------+--------+--------+--------+
| (-2, 1) | (-1, 1) | (0, 1) | (1, 1) | (2, 1) |
+---------+---------+--------+--------+--------+
| (-2, 0) | (-1, 0) | (0, 0) | (1, 0) | (2, 0) |
+---------+---------+--------+--------+--------+
| (-2,-1) | (-1,-1) | (0,-1) | (1,-1) | (2,-1) |
+---------+---------+--------+--------+--------+
| (-2,-2) | (-1,-2) | (0,-2) | (1,-2) | (2,-2) |
+---------+---------+--------+--------+--------+
ライダー(Riders)

一つの方向にどこまでも行けるタイプの駒を指す。将棋の飛車や角行や香車、あるいはチェスのルークやビショップやクイーンなどが該当する。

ライダーに該当する基本原子を列挙する。

  • R:チェスのルーク。タテヨコ方向にどこまでも動く。将棋の飛車と同じ。
  • B:チェスのビショップ。ナナメ方向にどこまでも動く。将棋の角行と同じ。
  • Q:チェスのクイーン。この動き自体は「RB」というBFNで表すことが出来る(「Q」は一種の糖衣構文)。
  • K:チェスのキング。前後左右またはナナメ方向に1マス動く。

「1マスずつ進む動きを表す基本原子」も、「1マスしか動かないライダー」と見なすことが出来る。

  • W:タメルラン=チェスのワズィール(Wazir, 宰相)。タテヨコに1マス進む。
  • F:タメルラン=チェスのフェルズ(Ferz, 将)。ナナメに1マス進む。
リーパー(Leapers)

簡単に言うと「桂馬/ナイトのように、他の駒を飛び越して動く駒」を指す。
例えば桂馬は「2マス前に進んで1マス横に動く」ような動きをする訳だが、先述の座標表記を使うとこのような動きを一般化して表せる。

リーパーの動きは、任意の自然数m,nを用いて「(m,n)-Leaper」と一般化して表記される。 「(m,n)-Leaper」というのがどういう意味なのか、チェスのナイトを例にして説明する。
座標の原点(0,0)が今ナイトのいる場所だとすると、ナイトの行けるマスは
(1,2), (-1,2), (-2,1), (-2,-1), (-1,-2), (1,-2), (2,-1), (2,1) の合計8つである。
これを簡略化して、「前方向への動き方、つまり(1,2)と(2,1)の情報だけを記述して、後は(特別な指定がない限り)左右と後ろにも同じ動き方をする」という決まりにしておくのである。 したがって、ナイトは「(1,2)-Leaper」または「(2,1)-Leaper」と表記される。
なお、普通はx座標の数字がより小さい方を採用して「(1,2)-Leaper」と表すようである。

改めて一般化しよう。
(m,n)-Leaperとは、その駒の現在位置を原点(0,0)とした時に、 (m,n), (n,m), (n,-m), (m,-n), (-m,-n), (-n,-m), (-n,m), (-m,n) の8マスに動けるような駒である。

0≦m,n≦3 の場合は特によく出てくるので、BFNでは基本原子として割り振られている。
以下の表は、(m,n)の値ごとにフェアリーチェス界での一般的な名称とBFNの基本原子を示したものである。

m=0 m=1 m=2 m=3
n=0 - Wazir (W) Dabbaba (D) Threeleaper (H)
n=1 Wazir (W) Ferz (F) Knight (N) Camel (L)
n=2 Dabbaba (D) Knight (N) Alfil (A) Zebra (J)
n=3 Threeleaper (H) Camel (L) Zebra (J) Tripper (G)

(m,n)の座標表記を基に、上で紹介した基本原子を改めておさらいしてみよう。

  • A:「アルフィル」。(2,2)-Leaper。
  • D:「ダッバーダ」。(0,2)-Leaper。
  • G:「トリッパー」。(3,3)-Leaper。
  • H:「スリーリーパー」。(0,3)-Leaper。
  • J:「シマウマ」。(2,3)-Leaper。
  • L:「ラクダ」。(1,3)-Leaper。
  • N:チェスのナイト。(1,2)-Leaper。

ライダーの項で紹介した「W(ワズィール)」と「F(フェルズ)」が上の表に含まれていることから分かるように、歩兵や王将のような「1マスだけ進む駒」は広義のリーパーとみなすことが出来る。
また、ルーク・ビショップ・クイーンなどのライダーもWとFの組み合わせで表現出来る。すなわち、任意のライダーは広義においてリーパーとみなすことが出来るのである。

ホッパー(Hoppers)

「進行方向に別の駒(ハードル)がある時のみその駒を飛び越えて、その先に着地する」駒を指す。着地先に敵の駒があれば取れる。 代表例として、中国のシャンチーの「炮」がある。 BFNにおいては、基本原子だけでホッパーを表すことは出来ない。必ず修飾子を用いる必要がある。

BFNの実例

チェスの「ポーン」

まず、チェスのポーンの動きをBFNで表すと次のようになる。
fcFfmW
これはどのようにして読み解けばいいのだろうか。
大前提として、BFNでは「修飾子+基本原子」の組をいくつも繋げていくことで1つの駒の動きを表現する。 つまり、fcFfmWという動きはfcFという動きとfmWという動きを組み合わせたものだ。

では、まずfcFとはどのような意味なのだろうか。 各記号を分解すると、fcは小文字アルファベットなので修飾子、そしてFは大文字なので基本原子であることがそれぞれ分かる。 fは「forward(前方に)」、cは「capture(取る)」、Fは「Ferz(フェルズ)」(=ナナメ方向に1マス進む)を表している。 つまりfcFとは「前方にフェルズの動きで駒を取る」という意味となる。 「前方にフェルズの動き」とは、すなわちナナメ前方に1マス進むということだ。 それに修飾子「c」が加わる訳だから、 まとめると「ナナメ前方1マスの範囲にある駒を取る(が、その方向には進まない)」ということを表現しているということになる。

次はfmWを分解してみよう。 fは「forward(前方に)」、mは「move(動く)」、Wは「Wazir(ワズィール)」(=タテヨコ方向に1マス進む)の意味である。 つまりfmWとは「前方にワズィールの動きで移動する」という意味だ。 「前方にワズィールの動き」とは、すなわち前方向に1マス直進するということ。 それに修飾子「m」が加わる訳だから、 まとめると「前方向に1マス直進する(が、その方向には駒を取らない)」ということを表現している。

すなわち、fcFfmWというBFNは「ナナメ前方1マスの範囲にある駒を取り、前方向に1マス直進する駒」ということだ。 これはまさしくチェスのポーンである。

禽将棋の「鵰(くまたか)」

変則将棋の1つに「禽将棋(とりしょうぎ)」というものがある。名前の通り、駒の名前が全て鳥の名前なのが特徴である。
その中に「鵰(くまたか)」という駒があり、その動きは次のようになる。
fBfsWbB2bR
次は、このBFN表記を読み解いてみよう。

上でも述べたが、大前提としてBFNでは「修飾子+基本原子」の組み合わせをいくつも繋げることで、1つの駒の動きを表現する。 すなわち、上のBFN表記はfB or fsW or bB2 or bRを略したものと解釈できる。これら4つの「修飾子+基本原子」の意味を個別に見てみよう。

  • fB:「f(前方に)」と「B(ビショップ)」の組。つまり「前方にビショップの動き」=「ナナメ前方向にどこまでも進む」。
  • fsW:「f(前方に)」と「s(横方向に)」と「W(ワズィール)」の組。つまり「前方と横方向にワズィールの動き」=「前方か左右方向に1マス進む」。
  • bB2:「b(後ろに)」と「B(ビショップ)」と「2(2マス)」の組。つまり「後方2マスにビショップの動き」=「ナナメ後方に最大2マスまで下がる」。
  • bR:「b(後ろに)」と「R(ルーク)」の組。つまり「後方にルークの動き」=「後方にどこまでも直進する」。

これを可視化すると、次のようになる。

+---+---+---+---+---+---+---+
| * |   |   |   |   |   | * |
+---+---+---+---+---+---+---+
|   | * |   |   |   | * |   |
+---+---+---+---+---+---+---+
|   |   | * | * | * |   |   |
+---+---+---+---+---+---+---+
|   |   | * |XXX| * |   |   |
+---+---+---+---+---+---+---+
|   |   | * | * | * |   |   |
+---+---+---+---+---+---+---+
|   | * |   | * |   | * |   |
+---+---+---+---+---+---+---+
|   |   |   | * |   |   |   |
+---+---+---+---+---+---+---+

記事冒頭で挙げたfhNfrlRKfsLloRgBKも、BFN表記として正しい文字列である。 ここではその解答は載せないが、ここまで述べてきたBFNの解説を見れば、いずれも完璧に読み解けるはずである。

さて、鋭い方なら既にお気付きかもしれないが、ここまで説明してきたBFNは、決してあらゆる駒の動きを表せる訳ではない。 また、別格に複雑な動きをする駒はBFNだと記述が過剰に長くなってしまい、読み解くのが大変になるという欠点もある。
BFNが広く使われるようになるにつれてこれらの欠点は徐々に無視できないものとなっていき、 そのうちに「既存のBFNでは不十分だから新しく記号を加えて拡張しよう」という動きが多く見られるようになった。
次回となるPart2では、そうしたBFNの拡張記法を見ていく。

参考文献

BFNの総合的な解説