備忘録2018 (その2)

R18な話。なんとなく記事を分ける。 (一応URLは載せないでおく。)

ノクターン

なろうだけでは飽き足らず、ノクターンに手をだすようになった。気に入ったのをいくつか。

  • 悪魔召喚アプリを手に入れたのでデリヘル扱いしてみた
    • 4~6話で一人ずつヒロインを召喚してアレする。短編集というか、エロソシャゲのごほうびシーン集のような感じ。
    • 非常に多様なヒロインがでてくるので、誰かしらは刺さると思われる。
    • 召喚する「悪魔」の基準は、悪魔召喚アプリと聞いて思い浮かぶ例のゲームシリーズくらいに広い。
    • だいたいは人型をしているが、一部人外成分がある。初心者にもやさしいくらいのレベル。
  • 俺の妹が最高のオカズだった
    • 妹がミステリアスでなにを考えているか、分かるような、分からないような。感性がおかしいような、意外と常識的なような。少なくとも地雷はあるようだ。どうも過去に何かあったらしい。兄には好意があるのかないのか。とりあえず、エロいことはさせてくれる。
    • ...気付けば、妹の虜でした。
  • 天使のパスポート ~天使ちゃんの消しゴム拾ってあげたら、あらゆる欲望が許された件について。~
    • 頭のおかしいシチュエーションがたくさん出てくる。良い。

同人音声

DLSiteでいろいろ買っている。気に入ったのをいくつか。

  • うたかたの宿 春の出会い
    • 耳舐めに弱い。
    • ゆったりとした話し方で癒し力が高い。ぼーっとしてくる。
    • 夜のシーンは、直接的な表現を避けており、具体的になにをどうするとは言ってない。ハイコンテクスト。
  • ジト目を崩さない武器屋の娘に拝み倒して素股してもらう
    • キス音にめっちゃ弱い。
    • 最初から最後まで、セリフのテキストとしてはずっとなじられているんだけど、演技によりデレが分かるようになっている。すさまじいツンデレ

...なんというか、文字列のみとか、音声のみとかでいけるようになり、「ビジュアルはいらないんじゃないか」という思いを持つようになってきた。

備忘録2018

今年私が触れて楽しかったコンテンツを振り返る。公開が今年のものに限らない。

なろう

今年読んだ本のうち1/4以上がなろう原作のノベル・コミックスだった。かなり偏っている。

読書メーター https://bookmeter.com/users/463730/books/read

アニメ化の決まった「痛いのは嫌なので防御力に極振りしたいと思います。」にハマり、同様に美少女が楽しくネトゲする作品を読み漁っていた。 美少女がエンジョイしているのを観察するのは単純に幸せになれる。VRゲームジャンル特有の掲示板回も好き。

(「VRゲーム」「女主人公」で検索 https://yomou.syosetu.com/search.php?word=%E5%A5%B3%E4%B8%BB%E4%BA%BA%E5%85%AC&genre=401&order=favnovelcnt )

今年読み始めた中で気に入ったものを名前だけ列挙

  • 陰の実力者になりたくて!
  • 世界の闇と戦う秘密結社が無いから作った(半ギレ)
  • 全肯定奴隷少女:1回10分1000リン
  • Free Life Fantasy Online ~人外姫様、始めました~
  • ジェノサイド・オンライン ?極悪令嬢のプレイ日記?
  • 刻印術師とダブルエルフの山奥引きこもりライフ
  • 底辺だけど、異世界であがき抜く

この中でも、年間ランキング1位の「陰の実力者になりたくて!」がとんでもなく面白い。 文字数が少なく、最小限の記述量でシナリオとキャラとギャグの描写がされる。

漫画

フェティシズムとノスタルジーとちょっとした雑学で攻めてくる、どことなく「だがしかし」を彷彿とさせる作品がマイブームだった。

他にいくつか気に入ったもの

JRPG

去年に引き続き「萌豚向けのライトなオフラインJRPG」をやりたいという欲求が湧いていた。 ひととおりクリアまでできたのが7本。

オメガクインテット / Death end re;Quest / 限界凸記 モエロクロニクル / 神獄塔 メアリスケルター2 / 竜星のヴァルニール / CRYSTAR / シャイニング・レゾナンス リフレイン

...実に5/7をコンパイルハートが占める。 違うんだ、別に熱狂的ファンというわけではなくて、「萌豚向けのライトなオフラインJRPG」という条件で探すと必然的にこうなってしまっただけなんだ。

以下ちょっとした感想。

  • オメガクインテット
    • トゥルールートのラスボスまで倒した
    • ラスボスに専用対策が必要な程度の適度な難易度
    • 意外にシリアスなシナリオはまずまず好印象
  • Death end re;Quest
    • トロコン済
    • 7割方ノベルゲー(ADV)という印象。
    • バグとオカルトが密接に絡み合うシナリオは楽しめた。
    • デスエンドも割と好き。
    • このゲームに限っては、コンセプト上「ゲームバランスが壊れているのが正しい」。
      • 開発が中断してバランス未調整・バグだらけのゲームを遊ぶ、というコンセプトを満たした、見方によっては野心的な企画。
      • 意図的に壊しているのか天然で壊れているのかいまいち分からないあたりが魅力。
    • たくさんの見慣れない戦闘システムの中から、バランスが壊れているものを探す、というゲームになる。まともにRPGをやってはいけない。
    • ...やっぱり9割くらいADVかも。
  • 限界凸記 モエロクロニクル
    • クリア後ダンジョンまでコンプリート
    • 某所で「EASYに変更したときの楽さは特筆もの」と書かれていたのでEASYでクリアまでやってみた。ほぼ全部の戦闘がオートでよく、本当に楽だった。
    • クリア後ダンジョンはHARDでやったが、なかなかに手応えがあった。一部のモン娘は本当に強くて、複数回挑んでなんとか倒せた。(そのあとの胸キュンスクラッチは非常に緊張する)
    • シナリオは無いに等しい。まあモン娘とイチャコラできればそれでなにひとつ問題はないけど。コボルトちゃんが好きデス。
  • 神獄塔メアリスケルター2
    • 2はトロコン、1はクイズによるショートカットから最後まで
    • 相変わらず、キャラと世界観は非常に好み。
    • 戦闘バランス(2)は、全体魔法ゲーだった前作よりはいい感じだと思う。あとダンジョンが狭くなったのがとてもありがたい。
    • シナリオはやや中だるみ感がある。中盤の話が、うまくいかないことの繰り返しでフラストレーションがたまる。
    • 終盤は演出シナリオともに好印象。
      • このために中盤の話があるのは分かる。にしてももう少しどうにかできなかったものか...
  • 竜星のヴァルニール
    • トロコン済み
    • 低予算感を強く感じる作りで、CG枚数や演出が物足りない。
    • シナリオに関しては、ゼフィの物語としては割と好き。ノーマルエンドが本筋。
    • いくらなんでも、サブキャラが存在意義がなさすぎませんか...
  • CRYSTAR
    • トロコン済
    • BGMとビジュアルが非常に良い。マップに立っているだけで絵になる。
    • もともとは割ともっさりだったが、アップデートにより爽快感は増した
    • 難易度「難しい」でも敵の攻撃力が低めだったため、防具を禁止するなど自主的に難易度調整を行った
  • シャイニング・レゾナンス リフレイン
    • オリジナルモードをクリア
    • 全体的に普通で、安心できるシナリオ。
    • リアルタイム戦闘のゲームで、アイテムを使う際にポーズメニューからウェイトなしで使うのが適切かどうか分からない。プレイヤーに有利すぎる気がする。
    • とはいえ、そのおかげで強制で2人になるところもなんとか低いレベルでクリアできたわけだから、投げ出さないためにはこれくらいでいいのかもしれない。

総合的には、メアリ2が一番楽しめたと思う。

同人音声

ASMRに入門し、DLSiteで音声作品を買いあさっていた。 かなり市場が整備されていて、商品ページ→視聴→レコメンド作品の商品ページ→視聴→...と回遊しながら、気に入ったものをカートにいれていくことができる。

毎週、週末の夜にアルコールを摂取して新しく買った同人音声を聞くのが、一時期の習慣になっていた。 作業用BGMとして流しながらUnityで遊ぶなどもしていた。

気に入った作品をいくつか挙げる。

  • 苦い貴方にお砂糖を https://www.dlsite.com/maniax/work/=/product_id/RJ194374.html
    • 初めて買った耳かき音声。当時衝撃を受けた。たしか、なろうでDLSiteの広告が出ていたのをクリックしたんだと思う。
    • 耳かきの音の「耳に棒が入っている感」が、自分が聞いた中では今でもトップクラス。
  • りりふれ https://www.dlsite.com/maniax/work/=/product_id/RJ199488.html
    • 多彩な癒しシチュエーション、いたずらっぽい演技などが好み。
    • 足音が特に好き。妹の軽やかな足音と兄の重苦しい足音の差異がとてもよい。
  • 音無奏の音フェチ研究室 https://www.dlsite.com/maniax/work/=/product_id/RJ150001.html
    • 「音フェチの研究をするために音を聞かせる」というド直球なシチュエーションで、とにかくいろんな音を聞かせてくれる。
    • これのせいで、日常生活の中で気持ちいい音に気づくようになってしまった (ペットボトルをちゃぽちゃぽする音、ビニール袋をがさがさする音、MacBookの表面をこする音など)。

演算誤差と戦う

浮動小数点を使ったときの誤差についてはよく話題になる。 https://togetter.com/li/1289806

「0.01を10000回足したら100.003になる」といわれているが、実際にそうなるのか試してみよう。python3で0.01を10000回足す処理を書いてみる。

sum = 0
for i in range(10000):
    sum += 0.01
print(sum)
print(sum == 100)

結果はこうなった。

100.00000000001425
False

100.003とは違うが、とにかく誤差は発生している。誤差が違うのは、python浮動小数点がdouble型だからであろう。

計算機で整数以外を扱うときには数値表現の誤差・演算誤差に気をつけないといけない。 演算誤差を避けるための工夫について、pythonモジュールを使いながら見ていきたい。

decimal型

decimal型はいわゆる10進数の小数型である。 decimal型を用いれば、先ほどの計算で誤差が発生しない。 実際にやってみる。

pythonでは標準モジュールにdecimalが入っているのでそれを使う。 https://docs.python.org/3.6/library/decimal.html

from decimal import Decimal
sum = Decimal(0)
for i in range(10000):
    sum += Decimal("0.01")
print(sum)
print(sum == 100)
100.00
True

0.01を10000回足すと、100と一致することが確認できた。

decimalを使えばあらゆる誤差をさけられるかというと、そうでもない。 例えば以下のような例を考えてみる。

a = Decimal("1") / Decimal("3")
b = Decimal("3")
c = a * b
print(a)
print(c)
print(c == 1)
0.3333333333333333333333333333
0.9999999999999999999999999999
False

(1/3)*3 を計算すると 0.9999999999999999999999999999 になってしまった。 有限桁の10進小数で 1/3 を正確に表現することは不可能なのである。 「3進法ライブラリ」のようなものを使えばたぶんいけるだろうが、もう少し汎用的にやりたい。

有理数

https://ja.wikipedia.org/wiki/%E6%9C%89%E7%90%86%E6%95%B0

有理数(ゆうりすう、英: rational number) とは、二つの整数 a, b (ただし b は 0 でない)をもちいて a/b という分数で表せる数のことをいう。

整数の分数は有理数である。 分母と分子を別々の整数として持っておけば、有理数の+-×÷の演算を整数の+-×で実行でき、誤差なく演算ができる(通分や約分の処理が厄介だが)。 (1/3)*3も正確に1としてくれるであろう。

pythonでは、有理数計算を行うfractionsが標準ライブラリに含まれる。 https://docs.python.org/3.6/library/fractions.html 実際に使ってみよう。

from fractions import Fraction
a = Fraction(1, 3)  # 2つの引数は (分子,分母)を表す
b = Fraction(3)     # 引数を1つだけ入力すると、自動で整数になる
c = a * b
print(a)
print(c)
print(c == 1)
1/3
1
True

(1/3)*3 が正確に 1 と一致することが確かめられた。また、print(a)が "1/3" という表示になっており、分子と分母を分けて保持していることが推察される。

ちなみに、Fractionは約分機能も持っている。

a = Fraction(4, 6)
b = Fraction(2, 3)
print(a)
print(a == b)
2/3
True

4/6を2/3に約分してくれている。

さて、有理数が正確に計算できた。次はもちろん無理数へと進んでいく。

代数的数

無理数の中でも比較的扱いやすい、代数的数が誤差なく計算できるかどうか検証する。なお、この記事では実数のみを扱う。

https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E7%9A%84%E6%95%B0

代数的数(だいすうてきすう、英: algebraic number)とは、 複素数であって、有理数係数(あるいは同じことだが、分母を払って、 整数係数)の 0 でない一変数多項式の根 (すなわち多項式の値が 0 になるような値)となるものをいう。 すべての整数や有理数は代数的数であり、またすべての整数の冪根も代数的数である。

まずは、Fractionでは \sqrt{2}^2 = 2 が成り立たないことを確認する。

import math
a = math.sqrt(Fraction(2))
b = a * a
print(a)
print(b)
print(b == 2)
1.4142135623730951
2.0000000000000004
False

当然、有理数の範囲では√2は扱えない。そもそも math.sqrt() は平方根を近似値で求める関数であろう。

python無理数を含めた代数計算を行うライブラリとして SymPy がある。 https://www.sympy.org/en/index.html

$ pip install sympy

さて、sympyでは \sqrt{2}^2 = 2 が計算できるだろうか。

import sympy
a = sympy.sqrt(2)
b = a * a
print(a)
print(b)
print(b == 2)
sqrt(2)
2
True

正しく計算できた。 print(a)が "sqrt(2)" という表示になっていることから「平方根として持っている」のだと思われる。

sympyの代数的数で遊んでみる。

  • x=\sqrt{2} + \sqrt{3}としたとき、x^{4} - 10x^{2} + 1 = 0が成り立つことを確認。
x = sympy.sqrt(2) + sympy.sqrt(3)
y = x * x * x * x - 10 * x * x + 1
print(x)
print(y)
print(y.equals(0)) # 複雑な式のときは .equals()メソッドで等値判定をする
sqrt(2) + sqrt(3)
-(sqrt(2) + sqrt(3))*(10*sqrt(2) + 10*sqrt(3)) + 1 + (sqrt(2) + sqrt(3))**4
True
  • x=2^{\frac{2}{3}}としたとき、x^{3} = 4が成り立つことを確認。
x = sympy.AlgebraicNumber("2**(2/3)")
y = x * x * x
print(float(x))
print(y)
print(y.equals(4))
1.5874010519681994
2**(2/3)**3
True

楽しい。

超越数

https://ja.wikipedia.org/wiki/%E8%B6%85%E8%B6%8A%E6%95%B0

超越数(ちょうえつすう、英: transcendental number)とは、代数的数でない数、すなわちどんな有理係数の代数方程式 x^{n}+a_{n-1}x^{n-1} + ... + a_0 = 0 (n ≥ 1 かつ、各 ai は有理数)の解にもならないような複素数のことである。...よく知られた超越数ネイピア数自然対数の底)や円周率がある。

さて最後は超越数である。超越数の計算誤差を実用上問題にする人はいるのか...? とは思うものの、興味本位で検証してみる。

高校数学で出てくる sin(\frac{\pi}{6}) = \frac{1}{2} という超越数πを含む等式がある。 まずは浮動小数では上手くいかないことを確認する。

a = math.pi / 6
b = math.sin(a)
print(a)
print(b)
print(b == 0.5)  # 0.5は浮動小数の範囲で誤差なく表現できる
0.5235987755982988
0.49999999999999994
False

0.49999999999999994になってしまった。

sympyはこの等式を上手く扱えるだろうか。

a = sympy.pi / 6
b = sympy.sin(a)
print(a)
print(b)
print(b.equals(0.5))
pi/6
1/2
True

すごい!計算機は無限精度の計算が可能だった!

(実際のところ、わけがわからない。特殊処理を入れているんだろうか?)

結論

sympyを使えば誤差で困ることはまずないと思われる(ただし、パフォーマンスは考えないものとする)

神獄塔 メアリスケルター2感想

とりあえず一通り終わった、と思えるところまでやった。感想を書いてみる。
ネタバレは気にせず書いているので注意。







進捗とか

  • 2はトロフィーコンプ. 初回エンディングまではfearでやった.
  • 1を途中から初めて、余章を終わらせた

雑感

  • 全体魔法ゲーだった前作と違い、今回はジェイルボーナスをフル活用するジェイルゲー
    • 独自システムを使いこなしている感があってよい
  • 異常に広いダンジョン・アイテム携行数の少なさといったストレス要素は改善されている
  • 世界観は相変わらずよい
  • ゲーム2本分収録したソフトならではの構成は割と面白いと思う
  • 2のシナリオ中盤で中だるみが激しい
  • どことなく、2のイベントが全体的に真面目で萌豚向け要素が弱まってる気がする
    • そこは恋獄塔で補えということか

システム・ゲームバランスとか

  • 今回はパッシブスキルとジェイルボーナスが非常に強い
  • パッシブスキルは職業を変えても引き継げるので、基本的に全職業で強いものを全部つけるようになる。
    • 「ジェイルボーナス人数UP+強化」「アイテムを効果120%で使う」「敵の残りHPを表示」「100%食いしばり」「自動防御」「最速行動」あたりの効果がやばい
  • ジェイルボーナスが今回のメイン
    • つうと白雪とグレーテルの3人でジェイルボーナス人数増加をつけると、全回復2人=全回復5人となったりする
    • これにジェイルマネージを組み合わせる
    • 全回復2人のジェイルボーナスを戦闘中に5個くらい設定すると、ジェイルボーナスごとにほぼ確実に全回復ができる
    • 他に有力なのはATK Downのジェイルボーナスで、ボス含めほぼ全ての敵が無力化する
    • 味方バフの性能も高く、「2人ATK UP」が「5人複数ステータスUP」になる。わけがわからない
  • ということで、とにかく高速でジェイルボーナスを回すことが基本的な戦術となる
    • 弱点をついたりブラッド系スキルで出血させ、血が溜まったら即舐める、を延々繰り返す
    • 中盤以降、ジェノサイド化することがまったくなくなる
    • ルーレット目押し力が超重要
  • 根本的に白雪とグレーテルが強い
    • 今回、全体回復魔法が詠唱スキルなせいで産廃になっており、有効なHP回復手段が「ジェイルボーナスの全回復」「アイテム」「グレーテルを舐める」になる。全部グレーテルやんけ
      • アイテムがあらゆる回復スキルの上位互換なのはさすがにどうなの...
    • リビングディクショナリは、バフデバフが撒けるし、対ボスで強力な猛毒を与えることができる
    • つまりヒーラーであり、バッファーデバッファーであり、猛毒により対ボスの有力なアタッカーとなり、戦闘の根本であるジェイルボーナス強化をこなす。超万能。
  • 敵は基本的に全体物理の攻撃をしてくる雑魚が強い。
    • 水族館跡1層のザリガニで何度もhageた。2章開始直後が一番むずかしいのは伝統。
    • 元街道沿いのウサギのディクラインバースト連発が地獄だった
    • 魔法が強かったのがラスボスくらいしか覚えがない。敵の魔法詠唱、ほぼ確実に止められるんだもん、、、

シナリオとか

  • シナリオの重要な点が語られるのが序盤と終盤に固まっており、中だるみ感が強い
    • 主要なイベントが起こるのが [序章・1章・2章]〜ラスボス前後〜メアリ1の余章 あたり.
    • 特に5章〜9章あたりは「それぞれの血式少女の境遇が悪くて、なんかこの世界は上手くいってない」ことを示すことを繰り返して、展開が似通ってくる
  • 中盤を除けば、割とシナリオは楽しめたと思う。都庁での演出は気に入った。
  • あと、実質的にメアリ2が終わるのがメアリ1の余章であるという構成が端的に言って超長い
    • 前作やってない人はゲーム2本分である。無理では。
    • メアリ1を途中から始めるオプションがあったのは良かった。あれなかったらたぶん投げ出してる。
  • メアリ2を終わらせたあとメアリ1のイベントをみると、すごい明るく楽しくアホなノリだったので、「ああ確かに、こっちの世界は上手くいってるなあ」などと感慨は得られた
    • ...が、それは2の部分がギスギスしてて真面目でカタルシスが得にくいことの裏返しでもある
    • 作中でも2の世界は悪い夢扱いされているので、2がそんな感じなのは構想通りな可能性がある
    • 悪い言い方をすれば、メアリ2はメアリ1の引き立て役みたいな感じになる。新作に厳しい
    • なんというか、救いがない世界ならそれはそれで、デスリクみたいに派手にしてほしかったという思いがある

恋獄塔

  • こっちでもグレーテルが強い(萌豚)
  • 割とまっとうにギャルゲ的なものを作っていてやや意外だった。なんかトラップがあるだろうなと予想していたが
  • ジェイルさんやナイトメアさんの絵的インパクトが強くて変な笑い声が出た。
  • ここに全員分のイラストを用意するくらいならもっと2本編の演出を強化してほしかったみたいな思いがなくはない

ぜんぜんわからない。俺は雰囲気でtensorflowをやっている。

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

この本を読みながらtensorflow分からんとうなっていた。
ダウンロードした書籍のサンプルコードを雰囲気でいろいろ書き換えてみると、とにかく全然動かない。例外が大量に出る。


まずtensorflowのことを知らなかったのでいくつか実験をして動作を検証していた。
https://github.com/mob-a/study/tree/master/tensorflow-sample

使いながら思ったことをつらつらと書いてみる。

雑感
  • 計算ノードの概念を知らなかったのでいろいろと混乱した。
    • 例えば"c=a+b"という行は足し算をやっているのではなく、「aとbを足す演算ノードを作り、その演算ノードをcに持たせる」ことをやっていると理解するのに苦労した。
  • feed_dictの記法がシンタックスエラーにならないのが不思議だったけど、単にplaceholderが辞書のキーになってるだけだった。
  • 自動微分という謎の技術便利だけど何やってるかわからない。こわい。
  • einsum最強すぎる。なんでもできる万能感が得られる。

RPG的対戦のプロトコル

ポケモンでアリスとボブが対戦するとき、サーバなしで、できるだけチートができないようにすることを考える。

各ターンの行動前

各ターン開始時に、アリスは2048bitの乱数を生成する。その乱数を行動鍵Aとする。
行動鍵Aのハッシュ値(行動鍵ハッシュA)をボブに送る。
ボブも同様。

各ターンの行動決定

アリスが行動を決定する。行動には誰もが検証可能な一意な行動名Aがつく。"waza_hakaikousen"とか。
アリスは行動名Aと行動鍵AのHMAC(行動名HMAC_A)値をボブに送る。
ボブも同様

行動の確認

アリスは行動鍵Aをボブに送る。また、行動鍵Bをボブから受け取る。
行動鍵ハッシュBを用いて行動鍵Bが正しいことを確認する。

アリスは行動名Aをボブに送る。また、行動名Bをボブから受け取る。
行動名HMAC_Bと行動鍵Bを用いて行動名Bが正しいことを確認する。
ここで、互いに何の行動をしたか判明する。

技の乱数を決定

行動鍵Aと行動鍵Bのxorをとり、乱数シードを生成する。
ボブも同じ乱数シードを生成できる。
その乱数シードをアリスの技の乱数値として合意する。
また、乱数シードのハッシュ値をボブの技の乱数値として合意する。

ステータスや持ち物について

行動と同じような方法で1ターン目に交換する。