クリア。
1時間程度でクリアできる短編ノベル。
謎のオフィスの一室で数人の訪問者の罪の尋問を行っていく、文学的作品。
訪問者たちは主人公の人生の過去の時点の自分だったという落ち。
Berry Bury Berry
クリア。4エンディング全て。
「穴に果物を投げ入れるとコインが出てきて穴が大きくなる」という、謎のインクリメンタルゲーム。
特徴的な仕組みとしてインクリメンタルゲームとは別にフィールド上に謎のオブジェクトやテキストが置いてあって、それを解いていくことでストーリーらしきものが見えてくるという点がある。
FPS視点の物理エンジンを備えたゲームだが、フルーツオブジェクトが山のように作られてもゲームが重くなったりフリーズせず、果物の海をかき分けて進んだりそれを一気に穴に落としていくのがちゃんと行えるのが素晴らしい。アップグレードのバランスも良く一気に遊びきることができた。
ただインクリメンタルゲームと謎解きストーリーを組み合わせたことは、試みは面白いがあまりうまく行っていない気がする。ランごとの行動を最適化してリソースを全てそちらに吸い取られるインクリメンタルゲームと、時間を取って調査する謎解きは相性が悪いのだ。
1ランを丸々捨てる気でやらないと謎解き行動ができないため、それが拡大再生産サイクルと衝突している。
結局自分も主に謎解きを行ったのはインクリメンタルが上限に達した後だったし、謎解き自体やそこから見えてくるストーリー考察部分はあまり刺さらなかった。
FPSのため結構3D酔いがきつかったものの、インクリメンタルゲーム部分は上質な作品だと思う。
GOOD BOY/グッド・ボーイ
視聴。
霊に取り憑かれた飼い主を守ろうとする犬の奮闘を、全編を犬の視点から描いた異色のホラー。
……という売り文句は忘れてくれ。キャッチコピーで期待されるものと違う作品なので、これを期待して見ると不当に評価を下げることになる。(と言ってもこの売り出し方じゃなければ、ミニシアターで上映される隠れた名作系になってしまったと思うので難しい所だが)
実際には病魔に犯された男が、昔に祖父が暮らしていた家に一人と一匹で引っ越してきて終末を過ごすホラーというよりホラーテイストをまとった悲しい文学。
犬の視点からというのは犬の目線をカメラにしたという意味ではなく、犬を主人公に犬が感じている世界を描くという意味であり、自分の解釈では「霊」なんて居ないけど愛するご主人の死の不安感がイヌの目には怪異として見えていたのが真相だと思う。
ただ、確かに何者か恐ろしいものが居たり、恐怖が襲ってきたと思ったら夢だったという演出が少々くどくて、もっと短したほうが締まりそうというという不満もある。が、既に73分と単体映画としては限界まで短くしてるのでこれ以上は切り詰められんか。いっそのこと30分くらいのショートフィルムにしたほうが評価高かったと予想する。
ちなみにこれがCG犬ならフーンという感じだが、主演犬のインディくんは監督のリアル愛犬であるという情報を知って視聴すると、もう全てのシーンが尊い。エンディくん賢い、いい子すぎる。
本当に「犬は無事です」タグをつけていいのかこの作品。心理的には全然無事じゃないやんけ…。
エンディングで妹の車に載せられて走っていくところ、ご主人の臭いを探してて切なすぎる。
純関数・参照透過性・冪等性(べきとうせい)の違い
純関数、純粋関数
関数の性質。
同じ入力(引数)を与えられたとき,常に同じ出力(戻り値)を返す外部の状態を参照しない。
外部の状態を変更しない。(副作用が無い)
参照透過性
式の性質。式は、複数の純関数、非純関数、値などを含む可能性がある。
(関数を含む)式を、コンパイル時にその「評価結果の値」に置き換えてもプログラムの動作が変わらない、という性質。
純関数のみで構成された式は、必ず参照透過性を満たす。
非純関数を含む式でも参照透過性を満たす場合はある。
n = (true ? 1 : random()); // この式は random() が絶対に評価されないため参照透過性を満たす
冪等性(べきとうせい)
同じ操作を何度実行しても、1回実行した時と同じ状態(プログラムに関わるグローバル変数や外部DBなどの世界全体が同じ)になるという性質。
「同じ操作を何度も実行する」には数学的な意味と、プログラム的な意味の2つの意味がある。
数学的な意味は、`f(f(f(x)))` のように関数結果を同じ関数にかけるという意味である。`f(f(x)) === f(x)`が成立するなら冪等性がある。
プログラム的な意味は、`f(x); f(x); f(x);` のように関数を何度も評価するという意味である。`f(x); f(x); f(x);` を `f(x);` にリファクタリングできるなら冪等性がある。
プログラム的な冪等性が問うのは厳密には「意図された効果(intended effect)」が同じかどうかだけである。関数評価により裏でログが書き込まれたり、dbの更新日時が変わったりするなどの意図と関係ない変化は冪等性に関与しない。
また「getCurrentTime()」のような関数は毎回違う結果を返すが、取得結果の部分を「意図された効果」ではないと『解釈すれば』冪等性を満たす。
純関数と冪等性は直行する概念である。
・冪等性を持たない純関数の例
f = n => n + 1; f(1); f(f(1));
・冪等性を持つ非純関数
updateFirstUserName = (name) => db.users.update({id: FIRST_USER, name: name });
updateFirstUserName('hoge');
updateFirstUserName('hoge');
updateFirstUserName('hoge');
Win+Shift+T でOCRコピペ
https://qiita.com/kaga-yasumitsu/items/e9ce46596969983cdb4e
OCRでテキスト認識してコピペできる。
javascript ES2025 Iterator helpers
https://www.tohoho-web.com/ex/es2025.html#sync-iterator-helpers
javascriptのES2025で実装された、配列に実装されているfilterやmapなどと同様の機能をイテレーターに対して実装したヘルパメソッド群。
これらはIteratorオブジェクトが持つ、Iteratorオブジェクトを返すメソッドである。
また反復可能オブジェクトからイテレーターを作成する Iterator.from が追加された。
ちなみに配列をイテレータに変換するのは、ES2015から存在する Array.prototype.values でもともと可能だった。
ジェネレータもイテレータの一種なので、これらを利用可能。
サンプルコード。
var iter = Iterator.from([1,2,3]).map(n => n * 2); // [1,2,3].values().map(n => n * 2) でも同じ console.log(iter.next().value); // 2 console.log(iter.next().value); // 4 console.log(iter.next().value); // 6 console.log(iter.next().value); // undefined
現在は同期関数版(sync Iterator helpers)しか存在しないが、将来的に非同期版(sync Iterator helpers)の実装も予定されている。
ShellDiver
クリア。
クッキークリッカーを祖とするインクリメンタルゲーム。
海に潜ってクラゲ捕獲と鉱石解体という2種類の資源採取をすることで装備のアップグレードし、さらに効率よい資源採取を行うゲームループの作品。
単純な数値の増加だけでなく、アクションとしての連射速度や、連鎖破壊など操作の爽快感も増えていくのも気持ちがいい。
上限に達するのが4時間程度かつ満足感のある仕上がりになっていてインクリメンタルゲームというジャンルが、(やろうと思えばいくらでも時間を吸い取れるのに)不当に時間を奪わない、かつ満足感を与える方向に進化してくれたことが喜ばしい。
steamで「圧倒的に好評」評価も納得の作品。
この拡大再生産に夢中になれる恐ろしい中毒性は「Forager」を思い出し、そう考えるとForagerはかなり時代を先取りした作品だったんだなあと思う。