2021年1月第2週レポート
インプット
📝 HTML5 input要素のtype=“number”の仕様を調べた
input要素のtype属性にnumberを指定したときのブラウザの振る舞いに知らないことがあったのでメモ。
step属性を指定することによって、フォームの数値の上下の矢印での操作やスクロールさせたときの刻み値を指定することができる。たとえばstep=1を指定すると、矢印の上/下を押すと数値が1ずつ増減する。知らなかったのはこのstep属性がブラウザによる入力フォームのバリデーションチェックにも使われるという点。
この刻み値の粒度と入力値が合っていない場合は入力フォームをマウスオーバーしたときにエラーメッセージがポップアップする(エラーメッセージの振る舞いはブラウザによって異なる)。たとえばsize=1を指定したのにフォームに「1.5」と入力した場合はエラーメッセージが表示される。
入力フォームに小数を入力してもエラーメッセージが表示されないようにするには、stepに指定する値を小数にすればよい。たとえばstepに0.1を指定すれば小数第一位まで、0.001を指定すれば小数第三位までの小数を入力できる。小数の有効桁数を指定したくないときは、stepに”any”を指定すればよい。
📝 Status vs State
何かしらの状態を表す変数が欲しいとき、その変数名に「Status」を使うのか「State」を使うのかよく悩まされます。
「status vs state」論争に終止符を打つ - Qiita
上記の記事の内容を自分なりに解釈してみると
- Statusは時間経過で順々に変化するもの
- Stateは何かしらのアクションによって変化するもの
ということなのかなと。これが英語ネィティブから見ても正しいのかどうかはわかりませんが、何らかの判断基準を
📝 Rust Search Extension
とても便利なブラウザ拡張です。アドレスバーにプレフィックスとして「rs」と入力すると、それ以降に入力した内容の検索結果を、doc.rust-lang.org上のドキュメントに絞って候補を出してくれます。公開されているクレートも検索の対象に入っています。
Chrome、Edge、FireFoxで利用可能です。
📝 Rustの言語仕様を調べた
今週調べた内容は以下の通り
- 型強制
- 文字列
- enum
型強制は変数束縛や関数の引数に束縛するときに暗黙的に行われる型変換のこと。Derefトレイトを実装することによって開発者側でコントロールすることができる。強い型付け言語なのに暗黙的な型変換とはどういうことなの?という疑問はあるのですが、ここらへんは型システムの勉強をちゃんとしないと理解できなさそうですね。
文字列についてはString型と文字列スライス型の特徴や使い分けがよくわかっていなかったのを調査しました。
enumについては代数的データ型として使えると聞いたのでバリアントにデータや関数を持たせる方法を中心に調査しました。
TypeScriptで代数的データ型作るとまあ記述量が多くなって大変なんだけど、Rustのenumはシンプルに書けていいね。
— d_yama (@dy_karous) January 10, 2021
TypeScriptだと、判別共用体を用意して、作成した一連の型をUnionして、と結構な手間をかけて代数的データ型を作るのですが、Rustだと簡単にかけてパターンマッチからのデータ取り出しも容易と言語側でいろいろサポートしてくれるのは楽でいいですね。
📝 ScrapBox情報整理術を読んだ
Obsidianでメモ管理を始めたところ、セルフナレッジマネジメントに興味が出てきたので、どこかのブログでおすすめされていたこの本を読んでみました。タイトルにScrapboxとある通り半分くらいはScrapboxの使い方になるので、ちゃんと読んだのは第2章にある情報整理の考え方の箇所くらいです。
本の内容について自分の解釈をざっくり言うと - 情報の「整理」という観点では、情報の階層化に必要以上に注力するのは得策ではない - 知識はナマモノでどんどんアップデートされる - 知識がアップデートされると階層構造もアップデートされる - ファイルシステムベースでこの階層構造を表現しようとすると変更コストが大きい - なので階層化よりも知識間の「つながり」を作ることに注力したほうがいい - 知識のネットワーク化は整理と検索において都合がよい - いってしまえばWikipedia - 知識というのは連想されていくもの、関連するワードの詳細にすぐにアクセスできる=つながりがあるというのが蓄積した知識の「活用」に大きく貢献する - 知識はまず書く、WIPでもいいからカジュアルに書いていく - 定期的に見返してリライトして育てていく
こういった分野はPKMとして概念化されいろいろ研究されていたり、LYTといった具体的な方法論が提案されたりと近年ホットなトピックのようなので、自分でも追いかけながら実践していきたいですね。
アウトプット
🛠️ RustでNESエミュレータを作っている
仕事以外でのアウトプットとなると相変わらずこればっかりですね。
ゲームパッドの読み込み入れてみたけど、スプライトの移動量がおかしい…。#NES pic.twitter.com/w4yO76Y4Ey
— d_yama (@dy_karous) January 9, 2021
超高速移動
PPUのステータスレジスタを読み込むとVBlankがクリアされるという仕様を見落としていたのが原因だった。#NES pic.twitter.com/1pcHNPOhBo
— d_yama (@dy_karous) January 9, 2021
今週は入力デバイス周りを実装しました。仕様の見落としがあってちょっと詰まったりもしましたが何とか前には進んでいます。
目に見えない内容としてはCPUの命令のフェッチ、デコード、実行のフローを修正しました。これまではオペコードとアドレッシングモードの組み合わせ一つ一つに対してメソッドを作っていたのですが、あまりにもコードの重複が多くアドレッシングモードの認識が間違っていた場合の変更コストが大きかったので、オペコードとアドレシングモードの処理を分離しました。とはいえデバッグのことを考えると命令はオペコードとアドレッシングモードを強く関連付けしたオブジェクトとして管理したいという気持ちがあったので、列挙型を使って命令を表現することにしました。Rustでは列挙型のバリアントにデータを持たせることができるので、オペコード(LDAとかINXとか)をバリアントとし、そのバリアントにアドレッシングモードを表す列挙型を持たせる(アドレッシングモードが一種類のオペコードは持たせない)ようにしました。これによって関数の凝集度をあげることができ、また命令のデコードもパターンマッチによって宣言的に書けるようになったのでコードの見通しもよくなったと思います。
その他
🎮 Touhou Luna Nightsをプレイした
東方Project二次創作2D探索型アクションゲーム『Touhou Luna Nights』、Xbox One と Microsoft Storeで配信開始しました!Xbox Game Passにも対応。冗談抜きで面白すぎるので、圧倒的なクオリティをぜひその目でお確かめください。ファン待望のチルノ戦も追加。是非楽しんで!https://t.co/41LaO4sbLW pic.twitter.com/fLk70W4mms
— PLAYISM (@playismJP) September 3, 2020
自分はSteam版を購入しました。Switchをはじめとしてほとんどのプラットフォームでプレイできるんじゃないでしょうか。
ヌルヌル動く2Dドット絵がカワイイ&美しいのですが、ゲームそのものも完成度が高いと思いました。もともと東方Projectプレイヤーでもあったので弾幕要素とメトロイドバニラゲームの融合がうまくできているなあと思いました。ボス戦は初見はまあまあ辛いのですがどれもパターンを作りやすい、時間操作能力によるパターン作りそのものが面白くのめりこみました(パターン弾幕好き)。
8時間ほどで全ステージクリア、洞窟物語よりはボリューム少なめかなという印象です。