bouzuya.hatenablog.com

ぼうずやのにっき

『プログラミング言語の基礎概念』を読んでいる

斑鳩を終えたことで生まれた時間を『プログラミング言語の基礎概念』にあてている。

2017-03-27 に書いたとおり斑鳩をクリアした。目標を達成した。せっかくなのですべての CHAPTER をランク A 以上にするまでは続けるつもりなのだけど、いままでと同じように続けるつもりはない。かける時間としては週末にすこしだけで十分だと思っている。斑鳩に毎日あてていた時間が浮く。 1 日あたり 45 分の時間が浮くはずだ。

この時間を何にあてるべきか。

ぼくはひとまずその時間を読書にあてることにした。『プログラミング言語の基礎概念』を読んでいる。前にも一度は目を通したはずなのだけど、改めて読んでいる。もちろん、この選択は『型システム入門』からの逃げなのだが、完全に逃げたわけではない。外堀を埋めるような気持ちでいる。ちなみに『プログラミング言語の基礎概念』は『型システム入門』の監訳者序文で紹介されている。

本書の内容に特に関係が深い日本語書籍としては、五十嵐淳氏による『プログラミング言語の基礎概念』(サイエンス社、2011 年、http://www.fos.kuis.kyoto-u.ac.jp/~igarashi/CoPL/) が挙げられるだろう。帰納的定義や操作的意味論、単純型、ML 多相型、型推論およびそれらの実装についてコンパクトにまとまっており、本書のある種のダイジェスト版としても参考になると思われる。

まだ 3 章までしか読んでいない。全 10 章。 1 日 1 章を読めば、来週には終わるだろう。

mr-jums に spa-town / bath を適用した

bouzuya/mr-jumsbouzuya/spa-town (bouzuya/bath) を適用した。

もともと mr-jums は list と detail しかないので、 spa-town の効果が分からないのだけど、とりあえず。

NOTE: mr-jums の server-side

  • client-side のための初期化 (最初の描画とそれに必要な状態の作成) が仕事だ。
  • HTTP method は GET だけを考えていればいい。 HEAD / OPTION あたりはその前後で処理できる。
  • URL および header の情報から状態をつくり、それをもとに描画する。
  • URL および header からルーティングによって適切な初期化処理を選ぶ (ここが今日の spa-town / bath の領域) 。
  • view の root は server-side と client-side で異なる。
  • 描画の際には、client-side の view の root より上でも vdom を使っている。効率を考えると string にはめるほうが良いのだけど、すべて vdom のほうが気持ち良いのでそうしている。
  • 状態をつくる際には、別途 API から JSON を取得している。効率を考えるとティア分割しないほうがいいのだけど、役割ごとに明確に分離しておくほうが気持ち良いのでそうしている。
  • そもそも、将来的にはすべて pre-render して S3 に deploy で終わらせるつもりなので、効率を考えると server-side にこる意味はまったくないのだけど……。

bouzuya/mr-jums で rev-hash を使う

bouzuya/mr-jumsrev-hash を使うようにした。 2017-03-102017-03-22 に関連することを書いている。

rev-hash は 1 行で書けそうな npm package だ。 md5 で hash をとり、その hex の先頭 10 文字をとるだけのものだ。

今回はビルドしたファイルの末尾につけるために使う。キャッシュが更新されないことへの対策だ。これくらいの用途なら、短期間ではおそらく衝突しないし、これで十分だろう。

静的コンテンツを Amazon S3 に配置し CloudFront 経由で配信する。Travis CI で静的コンテンツを build & bundle & deploy する。このときにいつも同じ名前だと CloudFront などでキャッシュが効いて更新されないかもしれない。そこで別の名前で配置する。静的コンテンツを指し示す側の動的コンテンツさえ変更すれば良い。

過去の静的コンテンツも削除しなければ、過去のデプロイに切り戻すことも容易だ。静的コンテンツといっても JavaScriptCSS なら、過去のものをすべて保存しても大した容量にはならない。

問題があるとすれば development (local) と production で環境が違ってしまうことだ。がんばればできそうだが source map などいろいろ問題が出そうなので、妥協している。 webpack への依存もできれば避けたい。環境の違いについては production の前に、同じ構成の別の環境をおいて、そこで検証しておけば大きな問題は避けられるだろう。

……というわけで bouzuya/mr-jums は rev-hash を使って hash をつけている。しばらくこれで様子を見る。

斑鳩をノーコンティニューでクリアした

斑鳩をノーコンティニューでクリアした。 Xbox Live Arcade 版で、難易度はノーマル、残機などは既定値、いわゆる標準設定だ。

斑鳩 IKARUGA NORMAL ALL 11M 4MISS - YouTube

スコアの詳細は次のとおり。

  • A/N/ALL/DEFAULT SCORE 11,211,000 4 MISS
  • GAME MODE: 1 PLAYER ARCADE
  • DIFFICULTY: NORMAL
  • EXTEND: DEFAULT (1ST 3M EVERY 5M)
  • LIVES: 3
  • ALL 11,211,000 4 MISS
  • 1 2,270,960 A 65 CHAIN 0 MISS
  • 2 1,961,730 C++ 42 CHAIN 0 MISS
  • 3 423,240 C 6 CHAIN 0 MISS
  • 4 2,573,820 C++ 18 CHAIN 0 MISS
  • Final 3,934,850 B++ 44 CHAIN 2 MISS

斑鳩のノーマルをノーコンティニュークリアは 2017 年の目標のひとつだった。

具体的には、この攻略では何をどれくらいやったのか。

  • 1 日にだいたい 45 分 (CHAPTER * 2 & ALL * 1) 。
    • 初期は CHAPTER * 1 & ALL * 1 だった。
  • 3 ヶ月間、だいたい毎日 (体感) 。 63 / 85 = 0.74...
    • そこそこ抜けがあった。
  • 斑鳩の総プレイ時間 58h07m32s (ゲーム内表示)
    • 2015-04-19 に書いたイージーのノーコンティニュークリア分のプレイ時間もおそらく含んでいる。
    • 別ストレージでも遊んでいた気がするので、もっと長いかもしれない。

ざっくり見ると、合計で 60 時間で 1 日に 45 分だ。多いと見るか少ないと見るかはひとそれぞれだ。ぼくにはそこそこの時間に思える。

次のように成果報告をしてきた。

あまり伸びている実感はなかったが、最初と最後を見るとその差は歴然だ。そしてノーコンティニューでのクリアという分かりやすい成果を得られた。

攻略のヒント。

ヒントというかコツというか。同様に挑戦する人はあまり居ないかもしれないが、ぼくなりのポイントをメモしておく。イージーをクリアできる前提で、その差分を書く。

  • イージーとノーマルの差で最も大きいのは打ち返しの有無。
  • CHAPTER 1 。打ち返しになれないとミスするが、慣れると色を変える必要もそもそもほとんどないのでまず問題ない。すこし稼ぐ (意識的につなぐ) と、ほかは無理に稼がなくても 3M, 5M の 2 回のエクステンドが安定する。
  • CHAPTER 2 。冒頭からして稼ぐのは難しそうだが、クリアねらいならそもそも稼ぐ必要はない。ボスのバラまきでミスしないように注意する。
  • CHAPTER 3 。中ボス・ボスは勝てないことはないが、事故が多いなら、諦めてスルーも手。ぼくはスルーした。
  • CHAPTER 4 は要練習。色変更を強制されるうえに、倒さないとほぼ抜けられないので、打ち返しによる変化が大きい。外周からの攻撃もくせもの。ボスは短時間での撃破が良い。開幕直後に壁1枚をわずかに残すレベルまでに削りきれば、あとは力の解放と黒で打ち込めば 69 秒で撃破できる。
  • FINAL CHAPTER も要練習。ここで 2 ミス程度でも、運が良ければ、クリアできる。ぼくはいまだにノーミスで抜けたことがない。特に第二形態が難しい。どちらか一方を力の解放込みでパターン化して撃破すると良いかも。
  • 石のような物体。産土神黄輝ノ塊。 ALL でしか登場しないので効率よく練習できない。ぼくは諦めて他のミスを減らすことにした。

感想を。

シューティングゲームの攻略をぼくはちょっとした修行だと思っている。もちろん運もあるが、日々の練習の積み重ねが効く。よく考えて工夫する必要があるし、他人から学ぶこともできる。わりと大げさではなく人生の大切なことが詰まっているように思う。

ぼくはこの斑鳩の攻略を通じて、さきに書いたような成果は抜きにしても、いろいろなものを得た。まずは自信だ。やればできるという自信がわいてきた。次に継続は力という認識だ。最初できなくても継続するとできるようになると再確認できた。最後に諦めない意思だ。伸びなくても投げずに毎日すこしでも続けるほうが良いと分かった。継続も諦めないも似たようなものなので、みっつも書いたけど「自信」と「継続」のふたつでいいや。

何にでも同じように適用できるわけではないが、ひとつ良い結果が得られれば前向きにもなれるというものだ。またゲームはフィードバックを得やすいので取り組みやすい。他で同じような取り組みをやるなら、フィードバックを得る仕組みを考える必要がありそうだ。

2017-W12 ふりかえり

2017-W12 をふりかえる。

2017-03 の目標

  • ☐: 『型システム入門』を読む
  • ☑: 斑鳩を続ける
  • ☑: bath 2.0.0 をつくる
  • ☐: PureScript でなにかつくる

2017-W12 の目標

  • ☑ DefinitelyTyped に PR したことを書く
  • ☑ mr-jums で asset を切り出したことを書く
  • ☐ mr-jums に bath 2.x を適用する
  • 斑鳩の動画を投稿する

斑鳩は動画投稿のほか、そもそもの目標を達成した。まだ記事は書けていない。

今週の記事

つくったもの

2017-03-20/2017-03-26

2017-03-21 で書いた @types/htmlescape をうけて、気まぐれに my-dts の一部の *.d.ts を削除した。このリポジトリはもう使っていなくて、 @types/* や足りない分はそれぞれのリポジトリで管理している。any でいいでしょ、って。

mr-jums は S3 に asset を置くようにしたのと、nav の style が変わったくらい、あとは blog.bouzuya.net の https 化への対応かな。そういえば title を先に表示することで待ちを減らす変更も入れたな……。微速前進。

その他

斑鳩。今年の目標を達成した。また書く。

shinosaka.hs 。 Haskell や PureScript でものをつくっていきたい。『型システム入門』を……。2017-03-17 の神戸 Rust の会を受けて Rust ももうすこしやりたい……。そういう、あれもやらなきゃを思い出させる会だった。

もう今週で 3 月が終わる。 2017 年に入ってから、どこか落ち着きがないというか、地に足がついていないというか、安定して回っている感じがしない。斑鳩の目標達成を機に変わっていければ、うれしいな。

2017-W13 の目標

  • 斑鳩をクリアしたことを書く
  • ☐ 3 月のふりかえりを書く
  • ☐ rev-hash のことを書く
  • ☐ mr-jums に bath 2.x を適用する

『shinosaka.hs #4』に参加した

関数型プログラミング勉強会 shinosaka.hs #4』に参加した。

「ラムダ計算と型システムについて」といういかにもデカすぎるテーマだった。ラムダ計算の基本っぽいのを聞いたり、ワイワイ言いながら問題を解いてみたりした。

主催者が大阪から離れてしまうようなので、当分なさそう。うーん。次に開催するころにはいい感じに Haskell を使えているといいな。

雑記

bouzuya/mr-jums をすこしだけ直す。 https 化にともなって壊れていたのを修正したり、 detail の取得を待って表示が遅れるのを title だけ先に表示するよう修正するなど。

斑鳩は今日を含めて 3 日もできていない。

なんだか調子が悪い。