カレーうどん界の動向

1/25(土)

同僚と外出。昼に千吉のカレーうどんを食べた。カレーうどんの専門店が存在するとは思っていなかった。

Dota2のプレイ履歴が見られるOpenDotaというサービスにちょっとしたバグがあり、OSSだったのでPRを出しマージされた。intの0が入りうる箇所で !hoge という書き方でvalidationをしているので0がinvalid扱いされていた。生のJSは辛い。

Dota2は調子がいい。7.23の環境にようやく体が慣れてきた。8連勝中。今は大規模な大会も行われていてアツい。

鈍麻

1/18(土)

最近いろいろな刺激が以前ほど新鮮に感じられなくなった。加齢だろうか。あるいは会社員としての生活に慣れつつあるのだろうか。僕が大学で学んだ重要な教訓は「大抵の2択の問いの答えは『両方』である」ということだ。

明日外出の予定があるので今日はほぼ在宅でDota2をしていた。会社員になってプレイ頻度が落ちたので負け続けた。勝率は正直に僕の技術の衰えを示している。

鍋キューブ+鶏もも肉+白菜の自炊は一食180円程度。しかしこの組み合わせだと炭水化物がない(厳密には緑黄色野菜も)。おにぎりを買って足すのもよいが、そうするとおにぎりが1つ110円程度かかってしまう。米を炊くのは手間だ。鍋と組み合わせることを考えると1玉30円程度のラーメンがよいのではないか。

Dota2サポートのアイテムタイミング/はてブ部

11/9(土)

土曜だが体調不良なので外出の予定なし。ランチに近所のジョナサンに初めて行ってみたが特筆すべき点はなし。普通のファミレスだった。

Dota2サポートのアイテムタイミング

Dota2をたくさんして感覚を取り戻した。相変わらずDazzleスパム。最近この動画を見て自分の動きを見直していた。なんとなくでやっていたことを言語化して評価するのは大事。

アイテム選択は難しい。マナ靴か緑靴か。Dazzleはクールダウン減少を持つのでマナ靴の有用性が高い。Guardian Greavesに進化させられると非常に強いが、これに直行するかどうかは稼ぎ次第だ。相手にSkywrath MageやClockwerk, RikiがいるときはForce Staffの方が優先度が高い。稼げなくて厳しかったり早めに有効なアイテムが欲しいときはGlimmer Capeが強い。相手のピックによってはLotus OrbやSpirit Vesselも選択肢に入る。

結局Dota2の本質的な問いである「いつ勝つか」の話になる。長期戦を見越すならGuardian Greavesを目指すべきだが、早めにピークを作りたいなら安くて強いアイテムを買うべきだ。それは味方のピックにも依存する。

はてブ部

これまでニュースサイトとしてYahooジャパンを利用していたが、コメント欄があまりに辛いのではてブに切り替えた。ニュース記事とコメントが分離されているのが辛いがこれは仕組み上仕方ない。

カテゴリやタグの運用について

設定するのが面倒になってろくに活用できていない。辛い。

早く帰った

9/27(金)

前日のぶん早めに帰った。その時間でDota2したが負けまくったのでダメ。Carryが考えなしにMidasを買った挙句、その代金を回収できる前に負けるということが多かった。

中国映画

9/22(日)

午前中から映画館で『羅小黒戦記』を見た。中国のアニメ映画だ。とても良かった。松屋で昼食を取って帰宅。睡眠不足だったのでたっぷり昼寝。

Dota2の新シーズンが始まったので10戦してレートを出した。3784だった。あまり調子は良くない。中盤以降の動き方がわからなくなっている。

サウナでホラー/Dota2覚醒/依存性注入

いつもは日曜日にやることだが、3連休なので今日銭湯に行った。サウナは磨りガラスで仕切られていて、そこに中でタオルを振り回す人間の影が映っていてちょっとしたホラーだった。

この3連休で割と熱心にDota2をプレイした。最近は上達の感覚がある。行動とその効果の関係を以前よりも鋭く捉えられるようになった気がする。ちょっとした移動や位置取りでより貪欲にアドバンテージを取っていけるようになった。現在のMMRは4051だ。

Scalaはなかなか進まない。GETリクエストを受けてDBからデータを取り出して返すメソッドのテストをどう書くべきか思案している。DBという外部システムへの依存はユニットテストには持ち込まないのが原則だ。つまりDBからデータを取り出す部分を別の関数に切り出し、本番とテストで別の関数を呼び出すようにする。逆に言えば2種類の実装を本番とテストでそれぞれ注入するということになり、このテクニックを依存性注入(Dependency Injection)と呼ぶ。たぶん合ってるはず。

ガチで知りたい人はこの辺読んでください。僕も今読んでます。

前倒し勤務

今日は10時に出勤して19時に帰ってみた(帰れてはいない)。

夜に空腹になる前に帰宅できるので間食を削減する効果は確かにありそうだ。午前10時は午前11時に比べて涼しいというのもいい。

逆に世の一般的な通勤時間に近づくので電車は混む。難しいところだ。多数派と違うことをすることでメリットが生じる場合もあるが、それ以前に多数派というのはメリットがあって多数になっているのだ。

帰宅してScalaを書いていた。PlayのFormではmodelのunapplyメソッドが必要になる。フォームのデフォルト値としてmodelの情報を入れておくような機能のためだ。

unapplyはcase classだと勝手に作ってくれるのだが、そうでなければ自分で実装する必要がある。コップ本の26章を読むといろいろわかる。Scalaの武器であるパターンマッチの一種、コンストラクターパターンに使われているとか。

Dota2のSoloMMR(サポート)が4051になり過去最高になった。最近はDazzleスパムをやめてAncient ApparitionやWarlockを使っている。どちらもダメージを出せるサポートヒーローで楽しい。だが両者の操作感は全く違う。前者はスキルのクールダウンが短く、アイテムとのコンボも必要になるアクション要素の高いヒーローだ。一方で後者はスキルのクールダウンが長く、タイミングや立ち回りが求められる。

爆速帰宅無為ゲーム/ScalaのEvolutionsを捨てた

8/29

月末なので労働時間調整のために早く退勤した。時間が出来たのでDota2を3ゲームやったが全部負けた。自分一人の力ではどうしようもないと感じる負け方だったので辛い。

Scala+Play FrameWorkで作っているアプリケーションでDBの初期化のためにEvolutionsを使おうとしていたのだが

Unexpected exception[JdbcSQLSyntaxErrorException: Table "PLAY_EVOLUTIONS" not found;

というエラーがでてどうやっても解決できなかったので諦めた。情報がなさすぎる。

Evolutionsを使わなくても、適当なクラスのコンストラクタでcreate tableすれば済む話だった。ちゃんと公開するときはDBは別で作ればいいし。

Dota2 TI9終幕

Dota2の世界大会TI9はOGの優勝で幕を閉じた。OGはTI史上初の2連覇だ。

第3ゲームのJeraxのRavage回避がえげつなかった。RavageはTideHunterのスキルで、広範囲の敵をスタンさせる。非常に強力なスキルで当て方次第でチームファイトの戦局を大きく変えることができる。

JeraxはRavageがギリギリ当たらない位置で待ち、Ravageを見てからカウンターを仕掛けている。以前もサポートは位置取りが大事と書いたが、これが世界最強のサポートプレイヤーの位置取りの上手さだ。震える。

TI9観戦/ナウいScala開発環境/口内炎の予感

日曜なので意識的に在宅していた。

TI9観戦

Dota2のTI9がアツい。FnaticがVPに勝つ番狂わせが起きるかと思いきや起きなかった。Dota2の試合時間はだいたい30分から40分くらいだ。ヒーローは大まかにスキルで戦うヒーローと通常攻撃で戦うヒーローに分類される。前者の方が早熟だが、金を稼いでアイテムが揃うにつれて後者の方が強くなる(基本的に時間が経てば金は貯まる)。金を横軸・強さを縦軸に取ると当然右上がりのグラフになるが、グラフの形はヒーローごとに様々だ。たとえば特定のアイテムを持つことで格段に強くなるということがある。プロレベルの試合では味方のヒーローに重要アイテムが入り、かつ敵のヒーローがまだ重要アイテムを手に入れていない絶妙なタイミングで戦いを仕掛けに行くということもある。そこで勝てば金が手に入り、また有利になる。

しかしこうして有利を拡大していっても決めきれなければ大器晩成型のヒーローによって逆転されることもある。たとえばMedusaは通常攻撃が4体攻撃になるスキルを持つ。単純に考えて通常攻撃を強化するアイテムのもたらす恩恵は4倍だ。だから強力なアイテムを揃える前に勝ちきらなければならない。

ナウいScala開発環境

以前vscodeでScala開発を試みたときはまともに使える拡張機能がなく補完が効かなかったのだが、今はMetalsを入れるだけでいい。補完があるとプログラミングは楽だ。ミスに気づくのは早ければ早いほどいい。

今はActivityPubの実装に挑戦している。仕様が固まっているものなのでTDDしている。ActivityPubではObjectはTypeという属性を持つことを定めているが、これは予約語なので`type`と表現する必要がありややこしい。ScalaTestの機能と思っていたmatcherが実はPlayの機能だったりして難しい。フレームワーク周りの知識がない。

素人丸出しのアレだが、package hogeはそのファイルの内容をhogeに所属させるために使うことを知った。つまり他のファイルからhoge.fugaという呼び出しができるようになる。ファイルでもオブジェクトでもクラスでもなく「パッケージに所属させる」という操作の感覚が新しかった。

今日はもうひとつ、droneのデプロイもした。droneはCIの一種でgitリポジトリにpushしたときに.drone.ymlを読んで自動でテストやビルドを行う。1回毎にdockerコンテナを作って捨てることでクリーンな環境でテストできるのがdroneの特徴だが、1回毎にsbtの初期化を行うせいで(貧弱なサーバーでは)1時間以上かかってしまい、タイムアウトしてしまった。

口内炎の予感

口内の傷が嫌な感じに痛み出していて口内炎になりそうで嫌だ。口内炎は食事が楽しめないのが辛い。ただ、火曜に右上の親知らずを抜くのでどうせ1週間くらいはろくな食事ができない。