PBW プレイバイウェブ

https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AC%E3%82%A4%E3%83%90%E3%82%A4%E3%82%A6%E3%82%A7%E3%83%96
かつてRPGマガジン等に掲載されていた、手紙による多人数参加型RPGのような企画「プレイバイメール(PBM)」のwebサービス版。
プレイバイメールゲームは、有限会社遊演体が主催していた「蓬莱学園」が非常に有名。

参照透過性

参照透過性とはどういう性質か

https://qiita.com/Yametaro/items/1de3c2b76b8a4dc2d30d
https://qiita.com/sasanquaneuf/items/3df1001a027e868e9e0e
式や関数が持ちえる性質で、コードの一部を同等の値に置き換えた場合、プログラム全体の挙動が変わるか、変わらないか、についての性質。
例えば以下のコードの場合「x * 2」という式には参照透過性が無い。
なぜならばxは変数であり、式が評価される時点でどんな値を参照しているか保証できないからである。

var x = 5;
// なにかのコード
console.log(x * 2);

以下のコードの「x * 2」には参照透過性がある。
なぜならばxは定数であり、式が評価される時点でどんな値を参照しているか保証できるからである。
xは透過的に5という値を参照しており、コンパイラがxを5に置き換えてもプログラムの挙動は変わらない。

const x = 5;
// なにかのコード
console.log(x * 2);

メリット

参照透過性が成り立つ言語は、式の値がプログラムのテキストから定まるため、変数の値が実行時点で何であるかということを考えなくてよいというメリットがある。
複数スレッドを動かすプログラムやネットワーク分散処理をするプログラムでは、このメリットは特に大きくなる。
……が、参照透過性を得るために再起やモナドなど複雑な書き方が必要になるため、結局わかりづらいという気がする。

ループの例

参照透過性が無い例。

for (var x=0; x<5; x++) {
  console.log(x * 2);
}

参照透過性がある例……?
確かに再代入はしてないけど、コンパイラがxを特定の値に置き換えてプログラムの動作が変わらないということは、これでは実現できない気がする。コンパイラ再帰処理を実際に実行してみて……みたいなことは出来ないし。

function f(const x, const limit) { // 実際にはこんな構文は無いけど、イメージはこんな感じ
  if (!(x < limit)) return;
  console.log(x * 2);
  f(x + 1, limit);
}
f(0, 5);

純粋関数と参照透過性

いまひとつ純粋関数と参照透過性がごっちゃになるのでまとめた。
純粋関数:副作用が無い、同じ引数で同じ結果を得られるという性質を持つ関数。
参照透過性:式や関数が持ちえる性質で、コードの一部を同等の値に置き換えた場合、プログラム全体の挙動が変わるか、変わらないか、についての性質。

抜き打ちテストのパラドックス

https://ja.wikipedia.org/wiki/%E6%8A%9C%E3%81%8D%E6%89%93%E3%81%A1%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9
別名「死刑囚のパラドックス」。
死刑囚に次のことが言い渡された。
死刑執行は当日の朝に告げられる。
a. 今週のいつかに死刑は執行される。
b. 死刑囚は執行日以前に、刑が執行される日付を予測できない。
死刑が最終日であれば死刑囚は前日の朝に死刑執行が告げられなかった時点でそれを予測できてしまうため、最終日に死刑執行はされない。
おなじ理屈で、最終日の前日にも死刑執行はされない。それを繰り返して考えると死刑執行される日は存在しえないことになる。
しかし、それは「今週のいつかに死刑は執行される」という言葉に矛盾する。
……というパラドックス



パラドックスへの、第1の回答。
死刑を行う可能性のある日を2日だけにして、以下のように言い換えるとわかりやすい。
死刑執行は当日の朝に告げられる。
a.死刑を行う日は、1日後または2日後である。
b.死刑を行う日は、1日後の朝の後でも予測できない日付である。
上を見てわかるように、この2つの命題は同時に満たすことはできない。つまり2つのうちどちらかは必然的に嘘ということになる。
よって、この2つが両方真実であることを前提に導き出した答えは論理的に無意味な答えであり、パラドックスは発生しない。

パラドックスへの、第2の回答。
死刑囚は前述のような論理で、最終日に死刑執行がされないと予測する。
ということは「最終日に死刑が執行される」ことは「予測できない」執行であることになる。
よって最終日に死刑執行することはbの命題に違反せず、パラドックスは発生しない。

reStructuredText記法(rst記法, reST)

https://planset-study-sphinx.readthedocs.io/ja/latest/01.html
markdownのような、プレーンテキストでも自然に読める記法のひとつ。
Sphinxという、reStructuredTextをHTMLやPDFやepubなどの様々な形式へ変換するためのツールが存在する。
SphinxPythonで実装されている。
またPythonの公式ドキュメントはSphinxを使って書かれている テーブル、引用、目次などがの標準記法が存在する点や、厳密な記法が定義がされている点が、Markdownより優れている。
(markdownもRFC7763で標準仕様が決まっているが、そこにはテーブル記法などは定義されていない)
一方、markdownよりマイナーである点が弱点。

Ocean Rift

プレイ。
海中の美しい世界を描くVRの環境ソフト。
海中生物が住む水域を選択し、そこを自分で移動して探索できる。水域は10種類以上あり、それぞれ結構な広さがある。また探索中に生物の解説を行ってくれるポイントがあったりする。
これも十分なクオリティの体験だが、the Bluと比較すると流石に劣ってしまうのは仕方ないところ。