ISUCON10予選に参加した(落ちた)

ISUCON初参加勢 @moajoと@kyasbalと共にチーム王数件で参加してきました。言語はtypescriptかGoで迷い、並行処理やるならGoっしょとのことでGoになった。

@moajo視点の記事はこちら

ちなみに王数件は、大学学部時代に所属していた部活である応用数学研究部もとい応数研から。変換めんどくさいのよね

役割分担は各々特別この分野に強いというよりは満遍なくどれも触れる感じだったので、ある程度の方針を最初に決めつつあとは流れでみたいな風だった。一応前もって方針みたいなのはメモって残しておいてあった。

f:id:coil398:20200913005518p:plain

大体この感じで、最終的にはmoajoはコードを読みつつ最適化できそうな部分を片っ端から直していき、kyasbalはキャッシュ周りとクエリの最適化を行い、自分はログやCPU使用率などの監視から方針を考えつつnginxやMySQLのミドルウェアの設定を行うといった分担になっていた。コードのコンフリクトの点からも分担は必要みたいな記事を見かけたのでこれは正解だったように思う。

よくisuconの参加者ブログにある?自チームの得点遷移のグラフみたいなのはないので、20:00時点でのリーダーボードを貼っておく。

f:id:coil398:20200913004822p:plain
午後8持時点でのリーダーボード(おや、0という数字は...?)

とりあえず割と決め打ちで二人を誘いつつISUCONに申し込んだ感じ。事前練習は二ヶ月くらい前にISUCON8の予選を一日かけてだらだらとやったのと 一週間くらい前にISUCON9の予選を見た程度で、あとは各々過去の参加者が何をしていたか、どうログを利用していたかを記事読んでた。

当日はなんやかんやで時間が変わり12:20~21:00まで、と言っても途中ベンチマークがサーバーエラーで動かずに方針を立てるだけの時間帯であったりがあったので 実際に手を動かしていた時間はもう少し短い。と言ってもなんだかんだ全員ほぼほぼ休憩取らずにぶっ続けで作業してたなぁ。もちろんトイレ行ったりはあったけど。これがADHD特有の過集中だ!

当日の流れを思い出せる感じで書いていく。

12:20~15:00

時間帯はある程度適当である。 まずは全員でレギュレーションを読みつつ、ログを仕込みながらベンチを回して方針を立てる算段だった。 ただしこの頃はベンチマーカーがロクに動かず、なにか設定を変えようにも検証のしようがないので主にコードを眺めつつひたすら方針を練っていた。 ログ周りを仕込んだのもこのあたり。 alp用にnginxのアクセスログのフォーマット、mysqlのスロークエリの設定、GCPのスタックドライバー用のコードの埋め込み、各種ツールのインストール(alp, myprofiler, lltsv, kataribe, query digestをインストールしたが、結局使ったのはalpくらいだったかな)もついでに行っておく。

f:id:coil398:20200913010341p:plain
alpの出力結果

searchとlow_priced, nazotteあたりが怪しい。

加えてレギュレーションからbotによるアクセス、MySQLのクエリあたりが怪しいそうだなと目処をつけていった。 botによるアクセスはご丁寧にレギュレーションにこういった正規表現で弾けるよと書いてあった。Goの正規表現は遅いという話があるのでGoを狙い撃ちしたのかな?と邪推する。

しかしここで困ったことがあった。今回の題材はisuumoと呼ばれる「椅子に対していい感じの物件を提供する」サービスなのだが、過去のISUCONとは異なりmain.goのファイル自体は1000行程度の非常にシンプルなものだった。 テーブルもchairとestateの2つのみ、クエリも変なものや露骨なN+1などはほとんど見受けられずパット見改善点があまり思い浮かばない。最初数時間ほとんどスコアに開きがなかったので全員同じような状態だろうと推測していた。

ちなみに結果から言うと、今回のISUCONはスコアの上昇というかインフレがかなり抑えられており、割と小手先のテクニックを積み重ねてちょっとずつ点数を伸ばしていく味付けだったと思われる。過去の典型例があまり適用できず、一つ一つ改善点を探してくのは非常に面白かった。ちなみにこの状況は実は予想しようと思えばできた。

employment.en-japan.com

今回の問題、前回優勝チームが一部作っているらしいのだが、その優勝チームに対するインタビュー。要約するととりあえずオンキャッシュすれば点数伸びるよねーみたいな典型例は出したくないと読める。あと競プロのエッセンスも匂わせており、これはまさしくnazotteの最適化である。ISUCONも10回目を迎え(過去のことはほとんど知らないが)あの手この手で問題を出してきてネタが尽きてるみたいな話もある中、個人的にとても良問だったと思う。

この時間帯では細々とした修正をいろいろしたが、ほとんどスコアは動かなかった。

f:id:coil398:20200913011708p:plain

ほとんど動きはしなかったが、結果的に今回のISUCONでは修正に対する点数の伸びはこんなもんだった。

f:id:coil398:20200913012406p:plain
こんな感じの画面でいろいろ見てた(イメージ)
完全に映えを狙っている。

15:00~18:00

この辺りで覚醒をし始める。 ベンチマーク中にCPU使用率を見ていると100%に貼り付いていたので一旦アプリケーションとMySQLを別サーバに分ける。ちなみに今回は3つのインスタンスが与えられていた。

ウェブアプリケーションのCPU使用率が50%程度なのに対して、MySQLの方では100%に貼り付いていた。 ここで、ウェブアプリケーションはLBせず一つのインスタンスで行くことにした。一方インスタンスが一つ余っているが、特に使い道もないので一旦保留にしてしばらくは検証用としていた。 一応3つ目のインスタンスの使い道としてはRedisを考えたが、ウェブアプリケーションの載っているサーバはまだ余力があるしそこに載せてしまえば良さそうだった。

ちなみにここ何回かのISUCONではオプションを変えることで負荷を操作できた。今回もそれらしきものがないか探したが見当たらなく、このへんで今回のISUCONのテーマはデータベースでは?と気付き始める。CPU使用率100%だし。

moajoはこのあたりでnazotteに手を加えるもとい競プロをし、kyasbalはredisにキャッシュを載せてスコアアップを狙っていく。 とはいえ前述したようにMySQLサーバのCPU使用率を見るにここがボトルネックになっている可能性が非常に高い。これは先程目処をつけたエンドポイント群からも明らかだった。 ここでkyasbalよりデータベースの2つのテーブルが分割できそうとの情報を得る。分割ができるのであればシャーディングできるのでは?ここでインスタンス二台にMySQLを置く構成にした。一方がestateテーブル、もう一方がchairテーブルを担当する。 それとスロークエリのログから、適当にインデックスを貼っておく。 これらの試みが実を結び、一気に点数アップして1800ほどまで上がった。ここでようやく25位以内に入ることができた。

続いてGoのMySQLコネクション数を10から20にアップ。(単純計算でDB二台に負荷分散しているので各MySQLインスタンスへのコネクション数を二倍にした) 点数は2000を超え、最高順位5位を達成した。

二台に分散したMySQLだが、ベンチをとってみると両者ともに高いCPU使用率(↑90%)であり、シャーディングは必須だったと思われる。そしてさらなるボトルネックの解消が望まれた。 シャーディングついでにデータベースの初期化処理をgoroutineで並行化したが、あくまで初期化処理なのでスコアへの寄与はなかったはず。

その頃kyasbalが大きな変更点を思いつき、暗雲立ち込めたイケイケだった彼はさらなるスコアアップを狙いに行く。

18:00~21:00

とはいえラストスパートであり、再起動試験やデバッグを考えて1時間のバッファを取ると考えると使える時間は少なく、自分は細かい設定変更を行っていた。 一方でmoajoとkyasbalは前述の変更点に突き進み絶賛実装中だった。俺「絶対にバグらせんなよ!!!!!!」kyasbal「任せろ!!!!!」

まずはGoとMySQLのコネクション数、これについては数値を変えてはベンチを回しを繰り返したが、エラーでスコアダウンを繰り返したために泥沼化を恐れて20固定とした。 nginx.confについては静的ファイルについてキャッシュを入れてみたがスコアが下がってしまった。 MySQLについては設定変更する時間がなく断念、だがしかし思えば今回はミドルウェアの設定についてはもしかして変更する余地がなかったのではと思う。 実際nginx.confは変に設定を弄ってスコアが下がったと述べているチームが他にもあった。実際は知らんが。 ついでにいろいろ埋め込んでいたログ用のコードを取っ払った。

結局kyasbalのデバッグは終わらず、再起動試験もできず(自分は何度もリバート!と叫んでいたのだが) あろうことかkyasbalがinitializeで入れるsqlデータをぶっ壊していることに終盤気付く。しかも悪いことにmasterブランチにマージ済だった。合掌 どの時点で壊れたか検討もつかないので、かろうじて残っていた他のブランチを必死に漁り、なんとか動くものを見つけてcherry-pickしてデプロイした。

ラスト10分にベンチのエラーを確認し、5分でcherry-pickしてなんとか動くブランチを作り、デプロイしてベンチを回す経験をしたことはあるか?俺はある。

f:id:coil398:20200913015114p:plain
心臓に悪い30分間だった。

なんかよくわからなくても何かしらの"ツラミ"が伝わってくれれば幸いである。

最終スコア1832を記録して俺達のISUCON10は終了した。

あ、本戦出場はだめでした。ちゃんちゃん

再起動再試通ったんかなぁ。それだけが気がかりである。

参加者の皆さん、運営の皆さんお疲れ様でした!!! 来年リベンジしますぞ

技術書典7に行ってきた。

イベントから2週間とも経とうとしているこの頃、技術書典に行ってきたのでレポを手短に

初めて技術書典に参加してきた。
本当は前回行こうと思ってたけど、当日twitterで相当の混雑が報告されてあり断念(早起きできなかった)
前売り券買えば流石に行くだろうと言うことで購入しておいたのもありサンシャインシティへ

前売り券には11時からのものと12時からのものがあり、11時のものを購入し11時半ごろ会場着
列が見当たらないので楽に入れるかと思いきや、誘導されて裏まで回ると大行列で結局入場できたのは12時頃だった。

今回から2フロア開催とのことで、自分は上の階から見ることにした。
技術書典と言うだけあってシステムがちゃんとできており、ウェブ上でサークルを事前チェックしておくとどのフロアのどこにお目当てのものがあるのかが確認できた。

f:id:coil398:20191004220511p:plain

とりあえずあいうえお順で若い方から見ていくことにしたので、先に上の階層からの入場だった。
結果的にはこれが功を奏したと思う。詳しくは他の参加者の記事を見ればわかるが、初の2フロア開催ということで
上下の移動にだいぶ混乱があったらしい、上から下は比較的楽だったのに対し(それでもどこから降りるかちょっと迷ったけど)
下から上への移動が大変で上の階層に辿り着けない人がいたとか。

実際上の階が、人が多いと言っても比較的スムーズに動き回れた一方、下の階は混雑が凄まじく移動するのも一苦労だった記憶がある。
なんとなくで分けると
上の階が、フロントエンドやバックエンド(Goとかクラウド)に科学書がメインで
下の階が、機械学習やUnityにハードウェア(IoT、自作キーボード)がメインという印象だった。

個人的な印象だけど、上の階の方が比較的ユーザーが多そうだったので下の階が大混雑と言うのはちょっと意外だった。
少なくとも事前前売り券を買う分には最初に上の階もしくは下の階へ誘導されるので、上の階へ辿り着けないと言うことはない。
とりあえずで技術書典へ赴くにしても上の階の方が五十音で若い方にあたるので、事前予想だと上の階の方が人が多いと思っていた。
一般入場が始まる時点で混雑を嫌がって離脱したので、一般入場後の様子は知らない。

技術書典7での成果物は↓こんな感じである。
f:id:coil398:20191004220519j:plain

欲しい分は一通り買えた。加えていろいろ見て回るうちに欲しくなったものも買った。
参加レポを見るに批判が結構多かったようだ。とはいえ一般参加かつ2フロアきちんと見回れた側としては特に言うことはない。
次回も参加しようと思う。

夢をみる島リメイク所感(※ネタバレあり)

夢をみる島スイッチリメイクが9/20に発売された。
事前ダウンロード済み、日付が変わって即プレイ。さきほどクリアしてハートのかけらと貝殻も集め終わった。
興奮が収まらないうちにある程度文章に残しておこうと思う。

ちなみにGB版は白黒の方をプレイした。発売が1993年で生まれが1994年だから生まれる前のゲームらしい。へぇ...
確か母親が持ってたんだったかな。幼稚園に入るとか入らないとかそれくらいの時期だから3歳とかそこらだったと思う。
当時は母親やらに手伝ってもらいながら7面大鷲の塔あたりまでは行けた覚えがある。ただ亀岩とかまったく記憶がないのでそこらで挫折してるはず。
結局ちゃんとクリアしたのは中学三年〜高校一年の間だった。その頃ちょうど亡きつわはす氏の実況動画を観てたのもあってクリアしたいってなったのを覚えている。

つわはす氏の実況はこちら
www.nicovideo.jp

彼の実況は投稿頻度も高いしラジオ感覚で観られる(聴ける?)ので当時は重宝していた。プレイするゲームも良かったし。

当時クリアできなかったとはいえ、やはり幼少期に繰り返しプレイしたのもあって夢をみる島は思い出深いゲームだった。
かぜのさかなのうたとかタルタル山脈のBGMとか、当時は怖かったゆうれいとかステージとかetc...
いろんなゲームをプレイはしたけど、幼少期の思い出補正は強いなって思った。

それからもちょくちょくゆめしまの実況動画なんかは観て、知らないネタだらけなことに驚いた。特にマリンとのデートイベントとか
それとDX版限定の写真なんかは全く知らなかった。カラー版羨ましい。
ちょうど一年くらい前?夢をみる島のINM実況(濁すw)を観てたらタイムリーにリメイクが発表されて驚いた。偶然と思いたい。

スイッチ版に先立って、ありぽん氏がDXの実況動画を発売日前日まで毎日あげていてそれも全部観た。
今作は原作に忠実なリメイクで、謎解きなんかはそのままだったのでリメイク版の謎解きを楽しみたい場合は止めておいたほうが良いかもしれない。
自分はどうせほぼ全ての謎解き要素を覚えてしまっているので問題なかった。
ありぽん氏の実況はこちら
www.nicovideo.jp


写真ネタ関連で、ゆめしまのオープニングとかエンディングのリンクに対して写真に映るリンク(=劇中のリンク)が等身が低くてデフォルメ風なのは
夢の世界だからという考察を見かけた。なるほどなーってなった。そう考えるとリメイク版のコミカルな作風はまさにぴったりなんだろうな。

思い出話はこの辺にして、スクショをたくさん撮ったのでそれを交えて感想を書く、というか単純に語りたい。
早速話変わるけどスイッチのスクショをパソコンに移すのって面倒なのね。PS4みたいにUSBメモリ対応とかしてくれ!!!

f:id:coil398:20190921070330j:plain

まずはオープニングから、原作の方でもオープニングは嵐が吹き荒れる中リンクの船に雷が落ちるっていうアニメーションだったけど、今作ではフルアニメーションになっていた。
絵柄が古い(90年代とか?)のは発売当初の年代に合わせてるのかな。そういえばアニメの年代は鼻の描き方で分かるらしい。
それで上のスクショは浜辺に打ち上げられたリンクにマリンが駆け寄るシーン。マリンがリンクを揺する回数とテンポ?も原作と同じだった気がする。多分
このへんでメインテーマが流れ始めるんだけど、この時点で涙腺が緩んだ。というか全体的に涙腺がガバガバだった。思い出補正怖い。

f:id:coil398:20190921070333j:plain

せいなるたまごをアップのタイトル。メインテーマも流れてる。1993-2019っていう表記が重い...
記事書こうってなるくらい感極まったのがだいぶ後なので序盤のスクショはまったくない。順番は時系列とは多少どころか結構前後する。

f:id:coil398:20190921070337j:plain

いきなりだけどクリアデータ。ファイルを作るときに名前を入力するんだけど、「ゼルダ」とか「とたけけ」って入れたら例のBGMが流れた。もしかしたら他にもあるのかも。

f:id:coil398:20190921070344j:plain

そういえば、8つの楽器を集めたら聖なるタマゴの前でかぜのさかなのうたを演奏するとタマゴが割れるんだけど、楽器が揃っていなくても現時点で持っている楽器で演奏ができる。
オカリナを手に入れてかぜのさかなのうたを吹けるようになってからは楽器を手に入れるたびに演奏した。(どうぶつむらのマリンにうたを教わるから4面の手前)
だんだん豪華になっていくのが良い。もっと言うとGB時代に頑張ってそれっぽい音を出して同時に出せる音が少ないからずらしてっていう努力をしていたのを、現代のゲーム機で
制限を取っ払って本来想定されていたであろう音色で演奏されるかぜのさかなのうたは筆舌に尽くし難い。30年弱かけてようやく本来の音色が実現されたのだ。(まぁ、当時はGB前提だったから本来の音色ってのは語弊があるけど)
それと個人的にゆめしまを語るにあたってかぜのさかなのうたともう一つ、タルタル山脈のBGMも外せないと思っている。序盤でも聴こうと思えば聴けるし中盤でもちょっとだけ聴くこの曲は
それまでの比較的ゆったりしたBGMとは違って忙しく騒がしい。タルタル山脈がマップ最北にあるのもあってどこか遠くに来た感じがある。実際最後7面と8面のダンジョンまでの道のりを攻略していくに当たってずっと聴くことになるこの曲は、まさに終盤まで来たという気持ちと共に記憶に残る。空飛ぶ鶏とかフックショットで移動する足場とか、鍵を入れたら入り口が開くかと思いきやまさかの回転する塔とか、いわがふってくるマップとか、このBGMを聴くと思い起こされる。

上の画像でも出てる通り、デフォルメ調の3Dっていう作風だけど、グラフィックがとにかく綺麗だった。質感とか陰影とか、綺麗なおもちゃを観ているようだった。

f:id:coil398:20190921070400j:plain
f:id:coil398:20190921070403j:plain

ただ、3Dモデルが故?に虫とかの一部モンスターはちょっときもいw

f:id:coil398:20190921070407j:plain

こいつらとか、かわいいんだけど、かわいいんだけど!!!虫だと思うときもい...w

最初の村(2つしかないけど)のレーベの村には魚釣りとはやりのゲーム(UFOキャッチャー)がある。原作ではあくまでちょっとした必須ミニゲームだったけど
今作では良くも悪くも気合が入っている。

流行りのゲームはこんな感じ。

f:id:coil398:20190921070410j:plain

画像撮りそこねたのでデートイベントのを前借りする。原作と同じでUFOキャッチャーやるんだけど、3Dモデルが故に物理演算のご機嫌(言葉の綾)でたまに変な挙動をする。
掴んだアイテムがするりと抜けてしまったり、だめだと思ったらとれてしまったり。
今作ってかなり原作に忠実なリメイクなんだけど、原作でのテンポの悪さは払拭して欲しかったのが正直なところ。特にUFOキャッチャーなんかは顕著でさっさと試行回数重ねたいのにいちいちアームが動くのを待つのはだるい。そもそものUFOキャッチャーがそんなもんだけど。ヨッシーの人形を取るっていう必須イベントがある以上、さっさとゲームに慣れる意味でもテンポは良くしてほしかった。
テンポという意味では、ダンジョン内での宝箱の演出とか妖精を瓶詰めするのとか、繰り返す動作にいちいち待ちが発生するのは昨今のゲームでは嫌がられる要素なんじゃないかと思う。特に宝箱の演出なんかは、お題ダンジョンを繰り返すに当たって明確に心理障壁となってしまっている。
とはいえ序盤〜中盤の金策はこれで行った。加えてストーリーの進行具合に応じてマリオシリーズの敵キャラのフィギュアが現れる。基本的には他の景品と同じように掴んで持ってくるだけだけど、ものによっては何回かトライアンドエラーをする必要があると思う。パックンフラワーとかワンワンとかは特に。その頃には一回10ルピーは大した額じゃないはず。

話が脱線したけど魚釣りについても幾分力が入っている。

f:id:coil398:20190921070414j:plain

これはぷくぷくを釣ったところ。
ルアーの種類や魚の種類が増えた。(小さい魚、大きい魚、ぬし、プクプク、ゲッソー、ビン)にも関わらず、魚釣りの説明がだいぶ簡素だった。
言われたとおりにすると、釣れるのはせいぜい小さい魚だけで、他の魚にはまず逃げられる。コンプ要素(ルアー、貝殻)のためには他の魚を釣る必要があるけどいかんせんコツが掴みにくい。
大きい魚やぬしに関しては、魚が逃げようとするときは最小限のA連打(魚が逃げすぎないようにする程度)で、こっちを向いているときは全力で連打する。欲張りすぎずにじっくり釣ることでその二種についてはほぼ確実に釣ることができた。が、プクプクとゲッソーについてはついぞ釣り方のコツが掴めなかった。せいぜい陸に近い固体を上記の方法で頑張って釣るくらいか...
ちなみに釣りを始める前、フィールド上で水面が光っている状態で釣り始めるとレア魚が確実に存在する。釣りを始める止めるを繰り返して10ルピーを犠牲にガチャを回すことで効率よく魚釣りができる。ちなみに稼ぎの効率は良くない。

写真を撮り忘れたけど、渓流下りも少し進化していて、いかだでの漂流にプラスしてフックショットの操作が可能になった。基本的にフックショットの方が水流より強いので
フックショットを使いこなせば割と自由自在に動き回れる。というかそれがないと話にならない。フックショットがない状態でも渓流下りはやろうと思えばできるけど全くおいしくないのでやる価値はない。タイムアタックの方は30秒くらいでクリアしていたら貝殻とハートのかけらが手に入った。その後はルピーが貰える。30秒程度で200ルピー稼げる上に、すぐに繰り返せるので稼ぎ効率はこれがいちばんいいんじゃなかろうか。

マリンとのデートは原作そのままだった。ただ、岬でのやり取りではやはり写真屋が欲しかったところ...

f:id:coil398:20190921070418j:plain
f:id:coil398:20190921070422j:plain

ここすき
話聞いてる?って聞かれて「いいえ」って答えるとリンクが首を横に振ってマリンが全く同じ話をするのも面白くて好き。

f:id:coil398:20190921070426j:plain

剣を手に入れたときと同じBGMが流れるの好き。

f:id:coil398:20190921070429j:plain
f:id:coil398:20190921070433j:plain

これも好き。写真屋くれ。

f:id:coil398:20190921070410j:plain
f:id:coil398:20190921070438j:plain
f:id:coil398:20190921070442j:plain
f:id:coil398:20190921070445j:plain

これとても好き。

f:id:coil398:20190921070449j:plain

黒いマリン好き。

f:id:coil398:20190921070453j:plain

蔑まれるの好き。

f:id:coil398:20190921070457j:plain

レアセリフの方出てこなかった...(もっとやれーみたいなやつ)

f:id:coil398:20190921070501j:plain

これもレアセリフあるらしい...けどハードモードでは体力回復が面倒なんや...
ちなみにダンジョンに入るとき、出るときのセリフもあるよ!

f:id:coil398:20190921070505j:plain

マリン好き。

f:id:coil398:20190921070509j:plain

空飛ぶ鶏好き。かわいい。鶏小屋のルイージ許さん。

ゆめしまの謎解きについては正直何回もやった身としてもはや正当な評価はできないと思っている。なにせだいたいの仕掛けを覚えてしまっている。
ではアクション要素についてだが、これについてはそう難しかった記憶はない。というか実際簡単だった。気まぐれトレーシーの薬もあるし
ゲームオーバーなんてせいぜいどろぼーしたときくらいしかならないだろう。と言っても幼少期は死にまくったけど。
今作では難易度が選べる。簡単に言えばイージーモードとハードモード。おそらくイージーモードが従来の難易度と同じくらいなのだろう。
というわけでハードモードにしたのだが、正直とても難しかったし辛かった。
今作のハードモードは敵の攻撃が苛烈な一方道中でハート、妖精などの回復アイテムが一切ない。ダンジョン内での回復は気まぐれトレーシーの薬と追加要素の瓶くらいだった。
そしてそもそもの難易度が高い。ハードモードで敵のAIが強化されているのかは確かめていないが、的確に距離をとって矢を放ってくる。何が辛いって、原作では4方向だったのに今作では方向が増えているのだ!!!というわけでしっかり盾でガードすることが求められた。
このゲーム、かわいい絵柄して実はGB版プレイ勢をターゲットにしているのでは...?そんな気がした。

各種ボスも強化されていて、原作では正直クソザコナメクジだった連中が軒並み強化された。弱体化したのも居た。まぁ、デグテールくん1面のボスの強さじゃないもんね...全体的に調整された。
例えばこいつ

f:id:coil398:20190921070341j:plain

1面の中ボス(名前は忘れた)
原作では投げてくる爆弾を適当に避けて剣を振ったら勝手に死んだが、今作では妙に避けにくいタックルでリンクに掴みかかり投げ飛ばされる。
そこに爆弾の追撃が来たり、穴に落ちれば1面の体力3状態ではすぐ死ぬ。死んだ。
ロック鳥の羽根をうまく使って避けたいけど妙に難しい。序盤の壁かもしれない。

f:id:coil398:20190921070348j:plain
f:id:coil398:20190921070353j:plain

そしてもう一匹がこいつ。球を取り合って相手にぶつけるゲームをするタイプの中ボス。多分今作最強なんじゃなかろうか。
原作ではこいつの投げた球を奪ったら、投げてぶつけて拾ってを繰り返すだけで勝手に死んだが。今作では至近距離に近づくまで投げてこない。
投げられて当たって球を拾われて...と原作での仕返しと言わんばかりにこちらを逆に嵌めてくる。球を取るので精一杯だった。
一回球を取れば嵌めれるけどね!

スクショを撮るの忘れたのでGB版の攻略サイトから画像を借りる。

こいつもかなり強敵だった。理由は明らかで、GB版では回転斬りで胴体にダメージが与えられていたところ、今作では顔付近が無敵なのでそちらの判定に阻まれてしまいうまくダメージが与えられない。速さもあるので矢やブーメランもなかなか当たらず、結局うまい倒し方が思いつかなかった。

以上が中ボス。他にも原作より強くなったなーってボスは多いけど、攻略法そのものはあまり変わってないので舐めてかからなければと言った具合。
ダンジョンのボスについても概ね原作通りの戦い方で問題なかったと思う。

f:id:coil398:20190921070356j:plain

1面ボスのデグテールくん。原作でのキチガイじみた強さはなくなった。赤い服で回転斬り二回すると倒せるのでお題ダンジョンではとりあえずこいつをボスにした。
弱いと評判の亀岩のボスのデグフレムも、結局ロッド振ってたら倒せてしまった。攻撃自体はデグフレムに限らず激しくなっていたと思う。

今作の良かった点として、ワープ機能の強化がある。
原作では少ないワープゾーン同士のみが行き来できるだけだった。しかも行き先選べなくて面倒だった。

f:id:coil398:20190921070513j:plain

今回はワープ先自体が増えた上に、マンボを演奏することでいつでも移動できるようになった。(もう間違ってマンボを演奏してマンボガ池に飛ばされることはないよ!!!)
ただひとつだけ言いたい。頼むからレーベの村にワープゾーン用意してくれ...さすがにこのワープゾーンの分布でレーベの村にワープゾーンがないことはないだろうと調査したけどありませんでした!!!

そしてもう一つ良かった点がこれ

f:id:coil398:20190921070517j:plain
f:id:coil398:20190921070521j:plain
f:id:coil398:20190921070525j:plain

ちゃんとどろぼー要素が残ってた!!!いろいろやかましい昨今なので削除されるかと。
ちなみに泥棒の難易度はめちゃくちゃ高い。なかなかできないので泥棒要素消されたのかと思った。
これは多分コンプ要素の1200ルピーぐらいするパネルのせいだろう。
何回かパネルを泥棒してみたけど、5回盗んだくらいで挫折した。パネル何枚あんねん...あと泥棒難しい...
そういえば人魚の水着はネックレスになっていた。残念。

さっきも述べた通り今作は原作にかなり忠実なリメイクだった。けど追加要素もあるのでそれに触れる。
リメイクにあたってハートのかけらとうつわ、及び秘密の貝殻の個数が大幅に増えた。
どちらもコンプしたけどハートのかけらも秘密の貝殻も最後の一個がクリアまでに見つからなかった。
両者ともマップに取得場所が記録されていたので、攻略情報として置いておく。ネタバレ注意。

f:id:coil398:20190921070529j:plain

最後のかけらはマーレの入り江の水中のもの。分かるか!!!
確かに意味有りげな水路だったけど。

f:id:coil398:20190921070532j:plain

最後のかいがらは、カナレット城北西の滝壺のもの。分かるか!!!
ちょうどセンサーに反応しない位置だった。

ハートのかけらと器自体は体力が増えるだけだけど。秘密の貝殻は個数が増えたので景品も増えた。とはいえパネルばかりだったのでうーん。もうちょっとワクワクするものが欲しかった。特に50個目は、ね。

所持アイテムの最終状態はこんな感じ。

f:id:coil398:20190921070536j:plain

今回新たに増えたのはビン3つとパネルと貝殻センサー的なもの。それと強いて言えばブーメラン。
ビンは妖精を捕まえて回復に利用できる。正直とても助かった。どこで手に入れたのかは忘れてしまった。一つは釣りなのは覚えてる。
貝殻センサーは、50個もの貝殻を集めるのにこれがなかったら無理だったと思う。けど目標に近づいているのかどうかが分かりにくいのが難点。貝殻の館でもらった。
ブーメランは、GB版でもあったけど、ブーメランと引き換えに渡したアイテムを買い戻せるようになった。おかげでスコップが無事手元に戻ってきた。
パネルはいわゆるゼルダの伝説メーカー用のアイテム。ストーリーを進めたり、店で買ったり、貝殻を集めたりすると手に入る。

一応今回の目玉要素としてダンジョンエディット、いわゆるゼルダの伝説メーカーができる。お題のダンジョンを作るのがめんどくさいのは趣旨に反するので仕方ないとして
やはりダンジョン内でのテンポの悪さ。宝箱が出てくる演出。これに尽きると思う。そして店売りのパネルが高すぎる。効率的な金策すればこれについては問題ないのかもしれないけど、ダンジョン内でのテンポの悪さのせいでやる気が起きぬ...
アプデで改善されることを期待したい。

とはいえ上記を抜きにしてもリメイク作品として完成しているのでここで評価を下げる必要はないだろう。写真屋は残念だけど...
結論として、とても良かった。まぁ、神ゲーをリメイクして余計なことをしなければ神ゲーだよね。って単純な道理だ。
さすがにこの辺で締めようと思う。

f:id:coil398:20190921070539j:plain

エンディングも良かったので是非聞いて欲しい。GBを混ぜる演出がにくい。
ノーミス真ENDでした。

f:id:coil398:20190921070543j:plain
f:id:coil398:20190921070548j:plain

こことっっっっっっっっっっても好き...

f:id:coil398:20190921070552j:plain

泥棒はやめようね。

画像アノテーションツールを作った。

例えばある画像を入力とし、それが一体なんの画像なのかを判定するってのは深層学習を使えばそれほど難しくない。データセットさえ用意できればね。
ただ、そんなものは世の中の人間がいくらでもやってていくらでも記事になっている。そうではなくて、ある画像を入力とし、その中のどこに何があるのかを判定したい。まぁ、これもやっている人はやっているのだが...。それはさておき、それにあたって画像のどこに何があるのかをアノテートする必要がある。今回はそれを行うプログラムを作成した。

言語はPython3を使用した。全く代わり映えがない。だって簡単だし。GUI用のライブラリはtkinterを使用した。界隈ではQtだのwxPythonだのKivyだのと一体どれを使えばいいのかがわからない。とりあえず適当なワードで検索して一番上にきたからこれにした。多分前にちょろっとGUI作った時もこれだったと思う。直感的にウィジェットを置いていけるから結構いいんじゃないかな。他のライブラリも似たような感じな気もするけど。

構成としてはウィンドウを出す。そこに画像を表示して、囲いたい領域の頂点二つをクリックすると矩形選択ができる。ある画像について全ての矩形を選択し終えたら実際にそのデータをjson形式で保存する。そしたら次の画像について同様にアノテートをしていくといった感じである。
画像のパスとjsonファイルのパスは同じ名前にしておく。あとで読み込むのを簡単にするためだ。

github.com

プログラム本体貼り付けようかと思ったけど思ったより長かったのでやめた。

と、こんな感じでアノテーションツールを作成した。
あくまでこれは下準備であって、最終的なゴールは最初に示した通りなのだが、より具体的に書き下しておく。

SSD(Single Shot Multibox Detector)をVOCのデータセットで学習させる。
使うプログラムはこちらのものである。
tensorflowで実装しているのでこれにした。`
学習させたデータを使ってファインチューニングを行う。
この手順である画像から自由に好きなものを判別できるかを試してみようと思う。
今回判別に使うのはこちらである。

f:id:coil398:20190118101843j:plain

はい、というわけで適当に本編の映像から一枚画像を入力して、メイン5人が判別できるのかどうかを実験する。
ちなみに画像データはアニメ一期一話本編の動画をffmpegで適当に一秒あたり一枚で作成した。実際にメインキャラが映っているかどうかを考えるとデータが少ない気もするが、あまり同じような画像が続いてもダメでは?という過程の元、足りなかったら二話、三話と使っていこうと思う。つまり、地獄のアノテーション作業が待っているということになる。

ちなみに今回のアノテーションツールは、初期ラベルとしてメイン5人が入っているが、囲った枠の色がキャラに応じて変わる仕様である。もちろん好きなものをラベルに入れることで好きなデータセットが作れるだろう。

実際のアノテーションの様子がこんな感じ↓

f:id:coil398:20190118102543p:plain

当初は体全体でやろうと思っていたが、顔だけでいいかなと思い始めた。というか体全体でうまくいく気がしなくなった。
ここまで書いて大きなミスに気づいた。画像の大きさを選択できるようにしていない。まぁ、コードをちょっと書き換えれば動くが...
それとこのプログラムはArch Linux上で書いて動いていたものをmacOSで動かしてスクショ撮って記事にしている。のだがmacOSだとうまく動かん...何故だ。

就活について

M1の自分は今我ながら早いと思うのだが就活をしている。そこで何社か訪問したり面接をしたりしたのだが
まず、今までの傾向として興味の幅は非常に広いが、一つ一つを掘り下げることは少ない。というか掘り下げる頃には別のことに興味が向いていることが多い。
決してそれまでやっていたことの興味がなくなるわけではないのだが相対的に興味がなくなっている。
これがどう影響するかというと色んな分野の"入り口"は知っているが、専門家と話す、深いところまで行くとと途端にボロが出る。ボロが出ると言うと印象が悪いだろうが
実際のところ専門用語とかそういうのは二の次に楽しい部分を優先してしまうのもあり、ディープな部分の話までついて行けないという傾向に最近自覚した次第である。
ましてや何かしら形にするところまでこぎつけることは少なく、興味の対象によってはうまく言語化できないことも多く、アピールの部分が弱いことを認識した。

具体的にどういうプロセスを踏んで自分が勉強しているかを書き出すと
Qiitaの人気記事、ブログ記事、Twitterでのエンジニアのつぶやき、Kindleの本、などから面白そうだなと思った部分を実行し、調べる程度ではある。
もちろん本であれば一通り実行して読み終えるが、割とそこで満足してしまっている。というのも学生のうちは基礎的な部分を重視して、
応用の部分、つまり形にする部分はまた別の機会、社会人になってからでも遅くはないだろうという考えによるところもある。が、しかし
実際いくつかの面談面接を通してそれではアピールの部分が弱いというのが浮き彫りになった。やはり百聞は一見に如かず。昔の人の言うことは聞くものである。

結論として、今優先すべきことは何かを考えると、とりあえずコードを綺麗に書くとか、Pythonらしいコードは何か?とかそういうのは一旦忘れて
いや、もちろんある程度は考える必要あるとは思うが、何かしら形にして、アウトプットしていこうという考えに至った次第である。
この際分野はおいておいて、興味のあることから形にできそうなものをリストアップしそちらを注力していこうと思う。

とりあえず取り急ぎ一覧にしてみた。↓
SSDによるキャラ判別
WEBサイト(ブログ形式にしてそちらに移転)サーバサイドをgo、フロントエンドをReactあたりで書きたい。
Unityを使った3Dゲーム
スーパーマリオを深層強化学習でプレイする。
2Dで何かしらのシミュレーション

ただ、別件で仕事もあるし、何よりも院生の立場であり研究もしなくてはならないのが辛いところである。
話は変わるが、最近自分はADHDだと思っている。まぁ、ネットでよくあるADHDの特徴に当てはまってるじゃん!俺ADHDだわーってのと同類な可能性も高いが...
何はともあれ興味の移り変わりが激しく、と思ったら過集中してみたり、動画を横で観てたらそっちに集中してしまって数時間潰す、などと言った感じではある。
が、個人的ライフハックかどうかは分からないが、どうも忙しかったりそれなりに危機に陥っているとそれなりに集中して一つのことを成し遂げられるようである。
締切の手前でしかやる気が出ないのであれば、忙しくして締切の数を増やしたり、すぐ近くに締め切りを置けばいくらでもやる気が出るという寸法だ。
今の所それでうまく言っている気がする。油断するとすぐ動画に集中しちゃうけどね!

PyConJP2018メモ

明日明後日のPyConJP2018に参戦予定なので、予め気になるセッションをメモっておく。
とりあえず参加の優先順位を数値で表しておく。
学生参加費2000円とはなかなか優しいものである。


一日目
基調講演と招待講演については興味がないのでスルーして午後から参戦する。


13:30

  • Why you should care about types: Python Typing in the Facebook Backend

気になるところだが(型付きpythonは手を出さなきゃいけないとは思っている)他優先かなぁ 2

  • 実践・競馬データサイエンス

競馬への興味はともかくとして得られるものが多そうなのでそちらに。ただ、人気がありそうなので場合によっては上のにする。1

14:30

  • オンザフライ高速化パッケージの比較:Numba, Tensorflow, Dask, etc 1

高速化の話は割と興味がある、が今の自分含めてこれから必要な知識かと言うと疑問?

  • Pythonを使ったハードウェア開発について 2

興味はあるけど既にやったことが主っぽい。

15:45

  • Pythonで時系列のデータを分析してみよう 2

興味はあるけど、レベルがビギナーなのと詳細を見るにそこまで求めるようなものは無さそう?

  • Jupyterで広がるPythonの可能性 1

Jupyterについての詳細で、わざわざ参加してまで得るほどの知識だとはあまり思えないかも

  • メルカリにおけるAI活用事例

ビジネスより過ぎる感 3

16:30

  • Pythonで解く大学入試数学 1

これくらいしかない


うーーーん、PyConJPは初参加だけどこんなもん?正直びmy(ry

あと日本人がわざわざ英語で紹介文を書くのは百歩譲って良いとして(どうせ日本人ばかりなんだから日本語で書いたほうが合理的だろと個人的には非常に思うところだが)
その英語がガバガバなのはちょっと...内容は良いかもしれんけど大分興味がなくなる。
自分と比べて輝かしい経歴を持つような人にこんなことを言うのもアレだけどw


と、面倒なので二日目の分は明日書こうと思ったけど、思いのほか早く終わったので二日目

二日目

11:15

  • SymPyによる数式処理 3

他がつまらなそうならって感じ

  • niconicoにおけるコンテンツレコメンドの取り組み 2

niconicoのユーザになって久しいが、niconicoに何かレコメンドされた記憶も、それで何か観た記憶もない。が、トピックとして面白そうなら...

  • HomeSecutiry with Python 1

IoTの話は割と興味がある。

13:30

  • Build text classification models

かろうじて興味があるかな程度...苦しい
この時間暇かもしれん

14:30

  • Make Drone using RaspberryPi and Google VoiceKit by Python 1

ドローンを操作してみる系。やっていることには非常に興味があるけど、聴きに行くほどかは微妙

  • Pythonでざっくり学ぶUnixプロセス 2

多分レベル的にそこまででもない。


16:30から研究室で用事があるので、多分ここまで
15:45からのFrom Data to Web Application: Anime Character Image Recognition with Transfer Learningが非常に気になる。
それと同時刻の一次元畳み込みフィルターを利用した音楽データのオートエンコーダも面白そう。
後日スライドが公開されるとは思うけど
というか二日目の内容的にそもそも行くかが微妙かなぁ。
懇親会とか出ないし。

ブログを更新するという意志

はある。意志は

元々自分の思考なりやったことなりを記録だけしていくつもりで始めた訳だが,
投稿する内容は荒唐無稽になるだろうが、少なからず自分という人間を知ってもらうにあたってちょっとした名刺代わり。
ついでのところ文章を書く練習なり、アフィ収入なりと副産物があればいいな程度で、
別にこれで生計を立てていくわけにもあるまいし、特に書かなきゃならない理由もない。

だがしかし、修士1年という時期になって、ちょっとした名刺代わりにするにも情報量が少なすぎるというある種の危機感が芽生えたのは事実である。
少なくとも自分の名前なりハンドルネーム及びID(まぁ全部同時にさらしているからハンネの存在意義とはという部分はあるがw)でググって何も引っかからないのはまずかろう。
何せこれからの時代、自分の名前の検索結果がその人についての重要な情報源となるのは間違いあるまい。というか既になってる。

実際のところ書こうとするネタはそれなりにあるのである。どこぞのいわゆるブログ書きまくってます勢のように日々集めたネタをevernoteに保存しています。とは言わないが
それでもある程度のネタは頭の中に入れている。あまつさえ構成その他もろもろまで考えてはいるのだが、いかんせんアウトプットまでに数か月要して未だ何もなされていないというのは、つまるところ怠惰である。
このままではこのブログの存在意義もただの怠惰記録になってしまうこと請け合いである。
いや、まぁ、別に記事をバズらせたいとか収入得たいとか、そういう気持ちはないし毎日更新してアクセス数上げて収入挙げて不労所得だー!とかそういうのを宣う気持ちはこれっぽっちもない。これぽっちも。うん。

そんなわけで、いわゆる呼び水的なノリで呼び記事というところで、今回の記事を執筆した次第である。ただの思い付きだけど。
今更怠惰なことを治そうとは思わないが、やりたいことであるのは事実なので手を付けていこうという自分自身への戒めとする。

追伸(わずか0分後のできごとである)
そもそも検索して出てこないのは、名前とブログの紐づけをしていないからでは...?