Hatena::ブログ(Diary)

merom686の日記 このページをアンテナに追加 RSSフィード

2016-12-31

年末恒例、アニメBEST3

時代が少しずつ進んでいる感覚がある。のんびり楽しんでいけたらと思う。

作品

  1. ヒミツのここたま
  2. 灼熱の卓球娘
  3. この美術部には問題がある!

ここたまは、評判を聞いて7話から保存はしていたのだが、見始めたのは2月頃。どんどん引き込まれて行った。以前(2000年頃)は子供向けアニメがメインだったのに、最近は好きなタイプのアニメがなくなって、もう子供向けアニメを楽しむことはないのかと思い始めるくらいだったので、ここたまとの出会いは嬉しかった。

灼熱の卓球娘は音楽がいい。表情を丁寧に描いてくれるし、負けられない戦いで追い詰められたときの心理描写もいい。こよりがあがりちゃんの服の裾をつかんでいるのがかわいい。

この美はですね、最初は内巻くんのキャラがわからなかったし、中学生で等身が高いデザインも好きではなかった。でもそのよさがだんだんわかってきて、うーん「優しい世界」っていうのかな。先生も頼りないけど全体としては上手く行くというか。

サブタイトル

  1. NARUTO #698「和解の印」
  2. ヒミツのここたま #40「つくろう!ここたまランド」
  3. 灼熱の卓球娘 #10(こよりとくるりの試合)

NARUTOの実質最終回はほんと最高だった。少し前から数億年ぶりの本来の作画が続いていて、そして最後に和解の印を結ぶ見事な演出。この作品らしいわざとらしいやり方だが、素晴らしすぎてぐうの音も出ない。

ここたまは4クール目初回。クールの境目に(俺の中で)定評があるこのアニメだが、ここは一つの最終回と言ってもいいと思う。こころとのぞみが出会って1クール、ついに名前で呼び合う仲になった瞬間。耐えられないレベルで幸せだった。

卓球娘10話は今年一番涙を出させたサブタイトル。Bパートのくるりの表情が好き。

キャラ

  1. オビト(NARUTO)
  2. 伊万莉ちゃん(この美術部には問題がある!)
  3. 角谷杏(ガールズ&パンツァー

オビトは共感できるキャラ。NARUTOの作者にはこれを描く力があるんだよねえ。

伊万莉ちゃんは稀に見る完成度の高い中二病。他人とコミュニケーションをとるための常識を持っていながら、中二病に対して真摯。美少女だし性格もいいしなにこれ。

角谷杏(CV福圓美里)に踏まれたい。

  1. この美術部には問題がある! 挿入歌 ココロ*パレット(MIZUKI ver.)
  2. 灼熱の卓球娘 OP
  3. ヒミツのここたま ED1

ボカロP作曲っていうのはいくつか知ってたけど、今年はボカロ曲のカバーが目立っていた。「ココロ*パレット」は予め聴いておいたのだが、いいアレンジがされていて作中で輝いていた。

「灼熱スイッチ」は好きなタイプの曲。ゲーム音楽みたいなところがある。

メロリーの歌う最初のED曲は、「ここたま」を好きになっていった当時の感動が詰まっている。

声優

  1. 高橋李依
  2. 潘めぐみ
  3. 上田麗奈

高橋李依は一ノ瀬双葉で知っていたが、今年はエミリアめぐみん(めぐみんを知ったほうがあと)。ベタだけど、リゼロ18話への予告はすごいと思った。

潘めぐみはNARUTOのヨメとオビト、そしてラキたま。以前から月影ちありや猪熊空太で知ってはいたが、ヨメがいい声でラキたまの男の子声もかわいくて好きになった。

上田麗奈は、園田萌舞子で知っていた名前ではあるが、小野屋杏でかわいい声がドはまりしていた。紅真深の声も誰かと思ったらこの人だったし。

2016-12-30

2016年、その他のアニメ

1話切りまたは0話切り(アニメを全く見ずに事前情報だけで切ること)したアニメも、一挙放送とか保存はしてあったとかで後から面白さに気づき全話見てしまうことがある。

最近は、頑張ってアニメを試すことはせず、見たいときに見るようになった。

これは、いつもの「よかった順」ではなく、見た時期の順(放送順でもない)。

ガールズ&パンツァー

2012年の放送当時は1話切り。ガルパンはいいぞって言われだしてしばらくしたころ、今年の3月に少しずつ全12話を見ていた。劇場版は見てない。

戦車道囲碁将棋アナロジーでも楽しめる。西住みほの強さがしっかり描写されていた。冷静に仲間を気遣うところが好き。時間が経ってるのであまり覚えてないんだけど、全体的に声がよかったと思う。

ReLIFE

ニコニコ動画配信されてなかったのも影響したかもしれないが、0話切り。意外と最近(今年の7月開始)のアニメ。11月7日に一挙放送のタイムシフトを見た。

女子の制服のデザインが好き。頭なですぎ。EDの選曲センスがやばい。Webで読める原作もすごいし、アニメもすごい。

なんでタイムシフト予約したかさえわからずに見ていた。途中からコメントをオフにして、1日で一気に見てしまった。幸せなアニメだったらしい(よく思い出せない)。アニメというよりは、幸せな経験というような存在。

この素晴らしい世界に祝福を!

普通に0話切り。放送が始まって、評判がいいのは知っていたが、面白さがイメージできないのでスルー。11月の終わりに、めぐみん・テンペラードっていう音MADを見て、12月13日からの数日で全10話を見た。

このゆるさは想像できない。想像できないアニメを視聴開始することはできない。めぐみんのかわいさというきっかけがない限りは。

異世界だからファンタジーなのではなく、日常系アニメの一部に見られるような「ゆるさがファンタジー」というタイプだ。ファンタジーであることを異世界に頼っていない。来年1月からの2期が楽しみ。

2016-12-29

秋アニメ総括

こんなクソ寒い時期に終わるアニメを秋アニメと呼んでいいのだろうか。

灼熱の卓球娘

作画もいいし、キャラデザも好みだし、音楽もいいし、展開も燃える。これほど全方位高水準なアニメは他にない。キネマシトラスは信頼できる。

キャラデザで特に好きなのが、こよりの目、こよりとあがりの体。服もよかった。練習するときの服、試合のときのユニフォーム、学校の制服、どれも似合っている。今どきブルマを出してかわいく見えるのは作品に力がある証拠。

卓球の描写もいい。卓球知らないけど。特によかったのが8話で、ダブルスのラリーをアニメで見られるのが感動的だ。そのあとのシーンでムネムネ先輩のムネがちゃんと揺れているのもすごい。ムネも体の一部だから、その揺れが卓球描写を邪魔するどころか描写に寄与している。

卓球の基本的な説明を入れてくれるので、回が進むとEDであがりがループドライブを打っていたことがわかったりする。

最終回は、露骨に未完アニメの悪さが出ていた。

かみさまみならい ヒミツのここたま

5クール目。さすがに飽きてきた感はある(2回以上見ることが大きく減った)が、ぽつぽつ面白い話もある。EDがそろそろ変わらないかなーと思う。いい話のあとにパンツEDじゃぶち壊しだ。内容的に3月で終わりそうだからそこまで引っ張るのかな。似た内容を繰り返してもいいと思うけど。子供向けアニメだから、視聴者が入れ替わりながら長く続くのが理想だと思う。

てーきゅう 8期

最初から飛ばしてんなあと思っていたら、最後まで飛ばしっぱなしだった。勢いを1クール保ったのはすごい。一方で、1クールという短い放送だったので、いつもそこに「てーきゅう」があるというかつての安心感はなかった。

信長の忍び

こういうので歴史の勉強したかったと思うよね。最近思うけど、中学生のときとかは覚えるだけで全然楽しくなかった。中学校で勉強する内容ってどの科目も相当な力がないと楽しめないと思う。そのくらい難しい。

作者は少なくとも楽しんで勉強できるレベルの人なのだろう。楽しめなくて何のための勉強だという気もするが、自分も中学の歴史のテストで平均点を取れるくらいの勉強は(嫌々ながら)していたから、今こうして「信長の忍び」というアニメを楽しめているとも言える。

バーナード嬢曰く。

面白さがわかるのにかなり時間がかかったが、予想外にいい作品だった。自分はあまり本を読まないが、なるほどこの人たちは本が好きなんだなと。そういう、自分の知らない世界を見せてくれる作品だ。

町田さわ子と神林が仲良くしてる描写が後半増えてよかったというのもあるのだが、これは名前が付いてるのだろうか。百合とは違うよね。自分は「ゆるゆり」であかりとちなつが仲良くしてるところが好きなのだが、それと似たイメージ。あれもゆるいゆりだということなのか。

魔法少女なんてもういいですから。セカンドシーズン

面白いしかわいいしOPもいい曲だけど、やはり短い。1話あたりの時間を2倍にしてほしい。話数が半分になるから都合は悪いだろうけど。

NARUTO

最終回後は微妙だったが、サスケ真伝は面白い。

3月のライオン

まだ追いついてないけど時間があるときに見てる。回が進むとシャフトっぽさがわかりやすくなり見やすい。声は、少しは慣れた気もするがまだまだだ。しかしプロ棋士から将棋教わるのほんとうらやましい。ニャー将棋は見てらんないけど、これがきっかけで将棋に出会う人も多いだろうからもっとやれ。

あにトレ!!XX

酷い内容だが、ニコニコ動画のコメント付きで何とか見られる(基本的にアニメはコメントオフで見てる)。やっぱりあさみが好き。1期のEDは最後に必ずあさみが出てきたので、その寂しさはあった。1期と比べて設定の不自然さが鼻についたが、そんな中で最終回の夢オチはかなりきれいだと思った。

2016-12-24

shogi686における手駒の優劣判定

はじめに

これは、手駒の優劣判定を現在のshogi686がどう処理しているかをありのまま説明するための記事。優れた判定方法について解説した記事ではない。最近、数学で証明をするようなカッチリした思考が苦手になってきたので、なんか間違ってたら教えてください。

持ち駒のデータ構造

持ち駒は先後64bitずつ計128bitで持っている。将棋の持ち駒は7種類なので、各駒の数をuint8_tで表しても1byte余る。32bitに収めるには各持ち駒のビット位置をテーブル引きするコストがかかるが、64bitあれば駒番号でアクセスできるため簡単高速である。

局面のハッシュ

局面のハッシュ値は、盤面のハッシュ値と手番側の持ち駒の和(xorではなくadd)としている。つまり、持ち駒のハッシュための乱数は使わない(少し高速化)。手番に関しては、持ち駒のデータ構造で余っていた1byteで後手側だけ特定のビットを立てればよい。手番側の持ち駒を足す操作は、手番がコンパイル時定数の状況(doMove内)で行うためコストが低い(先手番の持ち駒に固定しなかったのはこのため)(誤差レベルでしかないうえにCPUを選びそう)。

将棋の局面は盤面と手番と片方の手番側の持ち駒から一意に定まるため、この方法が成立する。ただし、このハッシュを駒落ちも含んだ定跡に使う場合、落とした駒なのか相手の持ち駒なのか判別できなくなる。よって、落とした駒に応じた乱数を加えるなどする必要がある(今どきそんなことする人いないだろうけど)。

盤面のハッシュはxorを使っているが、盤面のハッシュ値と持ち駒の更新は別々にやって最後に足すので、xorとaddの順番で値が違ってくるような心配はない。

足す相手が乱数なので、持ち駒の数そのものを使ってもハッシュ値の衝突は増えない(よね?)。

置換表でのデメリット

持ち駒を64bit全体に足しているため、ハッシュ値の一部のビットだけを使うときにデメリットがある。

局面のデータを置換表のどこに保存するかは、局面のハッシュ値の下位ビットで決める。しかし、持ち駒は64bit全体に散らばっているため、一部の持ち駒しか置換表エントリの位置に影響を及ぼさないということになってしまう。別にハッシュ値が被るわけではないが、持ち駒だけが違う局面の置換表での保存場所が被りやすくなり、有用な局面のデータが保存できなくなるケースが少しだけ増えそうなのだ。メリットとなるわずかな高速化は完全に吹き飛んでいると考えるが、実際のところはわからない。駒番号を変えたりPEXTを使ったりして緩和できるとも思うが、PEXTのコストが見合うかどうかもわからない。

ちなみに、手番は最下位ビットに入るようになっているので問題ない。大抵のソフトで、玉を除く成っていない駒の駒番号は1から7に割り当てられている。つまり、余るのは駒番号0の持ち駒に相当する部分(最下位バイト)になる。

千日手判定

千日手判定は、局面のハッシュ値同士の差が0かどうかで行っている。普通に==で比較してもいいのだが、上述したハッシュを採用しているため、差を求めれば同時に手駒の優劣判定もできるのだ。

手駒の優劣判定

さて、やっと本題。このハッシュを使うと、手番と盤面が同じであるような2局面のハッシュ値の差が、その2局面の持ち駒の差になる。盤面が同じなら盤面のハッシュ値も同じ(逆は必ずしも成り立たない)であり、引き算すれば相殺されて持ち駒の差だけが残るという寸法。

各持ち駒の数がuint8_tで7個並んでいるので、「4手前の局面と比べて先手の持ち歩が1枚増えただけ」という後手が絶対に避けるべき局面の場合、現在の先手の持ち駒から4手前の先手の持ち駒を引けば、「持ち駒に歩が1枚」を表す1bitだけが立った数値が得られる。手番のビットについては、千日手等の判定が手番が同じ局面同士でしか行わないので引き算すれば消える。

普通はこの判定を、持ち駒の数を格納するビットたち(例えば飛車なら0枚から2枚なので2bitぶん)の一つ上のビットを集めたマスクとのandで行う。これで繰り下がりがあったかどうかが判定できて、繰り下がりがあったなら減っている持ち駒があるから優越局面ではないとわかり、千日手でないうえに繰り下がりがないなら優越局面だとわかる。

しかし、この2局面のハッシュ値の差をとる方法では、同時に盤面のハッシュ値が一致するかどうかも判定しなくてはならない。よって、使用するマスクのゼロになっているビットを必要最小限まで減らす。駒が2枚増えることは検出したいので、各駒1bitでは足りない。各駒2bitと持ち駒7種で14bit。64bitのハッシュ値の差から14bitを除いた50bitに、立っているビットが一つもなければ盤面が同じであり優越局面であると判断する。

普通の方法と比べて、ハッシュが衝突する確率は16384倍くらいに上がったけど、元々(2の64乗分の1)が低い確率なのでそれほど問題ないと思う。以前は緩和策として、b & (b - 1)で立っているビット数が1以下であることを確認していたが、これだと「銀打ち同玉金打ち同玉で同一盤面」というビットが2か所立っているケースが漏れてしまう。金打ち2回なら、金2枚は0b10だから1bitしか立ってないのだけど。もっとも、ここは最後の確認であり速度はあまり必要ないので、単にpopcntして2より大きいものをはじけばいい気もする。

置換表でハッシュ衝突が頻繁に起こるのは、誕生日のパラドックスだから。千日手等の判定は16手遡っても7つの局面としか比較しないが、置換表を引くときは登録されている全局面から一致するハッシュ値を100%発見できる。コンピュータは1分で何億局面も読むので、64bitのハッシュを使っても長考すればどこかでは衝突する(最近は衝突する前提でもう少し短いハッシュを使う人が多いけど)。余談だが、保存場所を決める下位ビットを置換表に保存する必要はないので、技巧が32bitで浮かむ瀬が16bitだけどこれは25bit増とかで動いているのだ(置換表のサイズを2倍にすると1bit増える)。

ここは、特に大きなメリットはない。祖先ノードの、局面のハッシュ値だけを保存しておけば、盤面のハッシュ値や持ち駒が不要だというくらい。やねうら王のように、まず盤面のハッシュ値が同じかどうかで分岐してから千日手や手駒の優劣を判定したほうが速そうだ。

まとめ

ここに書いた中で役に立ちそうなアイデアは、持ち駒のデータ構造(手駒の優劣判定関係ないんかい!)。x64かつ持ち駒を置換表に入れない前提。

他は微妙。メリットが(あったとして)「わずかな高速化」しかないというのがいかにも味が悪い。自分はコードが簡単になるのでこういうのが好きなんだけど。

ソースコード抜粋

「各駒1枚ずつの値」は「3枚」の間違い。こういう、ソースを変えたのにコメントがそのままというコメントバグが多い。「先手の持ち駒が増えた」ってのも「手番側の」だよねえ。これはなぜそう書いたのか想像できない。手番側の持ち駒をハッシュに入れる手法なのに。

//千日手とか検出
const int k = Quiescence ? 4 : (depth < PlyToDepth(3)) ? 8 : 20;//遡る手数
for (int i = 4; i <= k; i += 2) {
    if (pos.forward(-i).key_ == 0) break;

    //(board_key_1 == board_key_2 を仮定すると) key1 - key2 == hand64_2 - hand64_1;
    const int64_t diff = pos.key_ - pos.forward(-i).key_;
    if (diff == 0) {
        //千日手
        if (pos.continuous_check_[C] >= i) return -ScoreMate0Ply;
        if (pos.continuous_check_[OppositeColor(C)] >= i) return ScoreMate0Ply;
        return RespectFactor[1] * ColorToSign(C);
    }

    //board_key_が同じとは保証できないのでリスクがある(無視できるリスクだと思う)
    constexpr int64_t Mask = 0x0101010101010100 * 3;//Position::hand64_で各駒1枚ずつの値
    const int64_t neg_diff = -diff;
    //-b == ~b + 1; ~b == -b - 1; popcnt(b) <= 1 ⇔ (b & (b - 1)) == 0
    //if ((diff & ~Mask) == 0 && (diff & ~neg_diff) == 0) {
    if ((diff & ~Mask) == 0) {
        return ScoreMate0Ply;//先手の持ち駒が増えた
    }
    //if ((neg_diff & ~Mask) == 0 && (neg_diff & ~diff) == 0) {
    if ((neg_diff & ~Mask) == 0) {
        return -ScoreMate0Ply;//先手の持ち駒が減った
    }
}

2016-12-13

電王戦の予想書いとくね2

プロ棋士もコンピュータも最強が出てきたのはいいことだと思う。羽生が今回も出てこなかったのは残念な面もあるが、佐藤天彦のほうが強いと思っている人がたくさんいる現状はとっくに手遅れなので、そこまで残念でもない。

今回は1日制。電王戦のルールは、電王トーナメントのルールのページにある。持ち時間はチェスクロック5時間。個人的にはもう少し短くてもいいと思うが、叡王戦決勝と同じなので妥当なところだろう。

第2期叡王戦本戦組み合わせ抽選会 - 2016/09/07 17:30開始 - ニコニコ生放送
「すべてのパターンをやる」と言いつつ貸し出しだけは絶対にやめない。今度羽生さんと戦うから羽生さんを貸し出してくださいとかあり得ないのに。コンピュータ側は、評価関数乱数を入れるなどの弱くする変更を強いられる。事前に手の内が知られているから、将棋の内容もつまらなくなる。ハンデを付けたいなら、コンピュータの持ち時間を減らせばいいのに。なんでこんなにデメリットしかないハンデの付け方をするんだ。プロ棋士とコンピュータが戦うという貴重な機会なのに。ハンデとわからないようにするためだろうけど。

書くまでもないが、予想はPONANZAの2勝。絶対というわけではないけど、こうなる可能性が非常に高い。