avatar
tkat0.dev
Published on

Weekly Report 2021/05/17-05/23

今週の振り返り。

Table of Contents

振り返り

続けたいこと

  • Rust を久しぶりに書いた。これは今後も続けたい。
    • 何も見なくても考えていることをアウトプットできるレベルでは覚えていた
    • 最近は TypeScript に慣れてたけど、やっぱり Rust の型システムは好きだと思った
    • FFI 周りの実験をしていて、はまりや学びがあった。一部後述。
    • Bazel で Rust をビルドするのは思ったよりも簡単で、x86 をターゲットにするのであればハマりは少ない
  • 英語、この二週間は達成感のある学び方ができたのでよかった
    • 同じ課題や簡単な課題をじっくりやった
    • 会話を聞いて要約する、というのが非常に学びがある
    • Listening をもっと鍛えたい

改善したいこと

  • プラン B がわかっているのに、プラン A にこだわりすぎて 1 日無駄にした
    • 自分のスキルだと早くプラン B に切り替えて、必要な機能を実現すべきだった
    • なぜプラン B にすぐ切り替えられなかったのか?
      • プラン A がうまく行かない原因がはっきりせず、闇雲に(検証項目をリストアップすることもなく)試行錯誤してしまった
      • プラン B はできるけどめんどくさいので嫌だった
        • これは思い込みで、実際やってみたら 10 分でできた
    • 1 日で済んだのは良かった、が改善したい。どうする?
      • 既知の問題かどうかの調査を早くできるようになる(GitHub)
        • 今回は、最終的に似た issue を見つけたものの、全く同じではなく、その issue も未解決だったため、やっとプラン B にいった
      • プラン A で粘る時間を決める
        • 一日の途中で切り替えられたら理想的なんだけど、まだ私には難しい
        • 散歩でもして気分を切り替えるのが良いかもしれない
          • 在宅だと一日机の前にいるのでよくない
          • 出社してた頃はカフェテリアに行ったりリフレッシュできていた

その他トピック

Rust と Quicktype

こんな実験をしていた。

tkat0/quicktype-rust-poc: A PoC that generates client implementation to handle JSON with Rust and quicktype

例えば Rust でコアを書いて Java, Swift, Python, TypeScript の API を作りたいとする。 このとき、関数の引数や戻り値の型をどう設計実装するかいつも頭を悩ましている。

Rust を C API にするのが単純で好きなのだけど、複雑な型は表現しにくい。

以前はprotobuf でやったりもしてた んだけど、protobuf がそんなに好きじゃない。

個人的に、データモデルの定義は、Rust が一番書きやすい。 そこで、Rust で 定義したデータ型を protobuf のようにシリアライズ/デシリアライズして他の言語とやりとりできたら良いのにと思って考えてみた。

その結果、serde derive したデータ型を JSON にシリアライズ/デシリアライズして扱うのでいいんじゃない?となった。もちろんパフォーマンスは気にしないといけないが、今回は、いかに Rust のほげほげ binding を簡単につくるかにフォーカスしている。

https://twitter.com/_tkato_/status/1395903813358288896

さらに、Rust の外側でも JSON をただの文字列じゃなくて各言語の型(Python の dataclass とか)で扱いたいので、Rust のその型から各言語の client 実装も生成したい。

schemarsを使って Rust から JSON schema を生成し、それを元にQuicktypeでクライアント実装を生成する、というのを試した。

Quicktype で生成されたコードを細かく見ていないが、言語によってはオプションが少ないのでちゃんと使う場合は不自由はあるかもしれない。

Rust の enum の表現方法はまだ試行錯誤中。 schemars は以下のように値を持つ variant とそうでない variant を混ぜて書いておくと、 このように anyOf (enum {B, D} || object A || object B) みたいなスキーマを生成する仕様みたいで、Quicktype はそれに忠実にコードを生成するので、Rust 側で表現したかったことが忠実に他の言語で表現できなかった。

#[derive(Serialize, Deserialize, JsonSchema)]
enum KindA {
    A { value: i32, summary: String },
    B,
    C { id: String },
    D,
}

値を持たない variant を含めなければ良いだけではある。

この JSON のアプローチでなく、ベターなやり方を知っている方がいたら教えて下さい!!

WebContainers

Introducing WebContainers: Run Node.js natively in your browser

WebContainers allow you to create fullstack Node.js environments that boot in milliseconds

ネイティブ並みの開発体験をもつ IDE がブラウザ上に実現しつつあるのがすごい。記事にあるように、環境構築のつらみや、人のコードを安全に動かせるというメリットは確かにと思う。

試してみたが、IDE がさっとつかえて、かつ PWA なのでよりネイティブアプリっぽく扱えてよかった。

この延長に実現されるであろう今後の技術が楽しみ

High Fidelity Pose Tracking with MediaPipe BlazePose and TensorFlow.js — The TensorFlow Blog

High Fidelity Pose Tracking with MediaPipe BlazePose and TensorFlow.js — The TensorFlow Blog

MediaPipe の Runtime が 1.57Mb って小さくないですか?

@mediapipe/pose と tfjs-models/pose-detection のそれぞれの範囲がわかっていないのだけど、MediaPipe には DNN やその後処理の Calculator の実装と Framework(Runtime)の実装、場合によっては OpenCV.js の wasm 部分も組み込まれているのではないかと思っていたのだけど、思ったより小さくてびっくりしている。

ビルド時の最適化オプションや、専用の軽量 Framework などで工夫しているのだろうか?

MediaPipe は iPhone だとまだ動かないのは残念。なんでかはよくわかってない。

https://twitter.com/_tkato_/status/1395898233902096385

とりあえず解析するための環境だけつくった。

tkat0/test-blazepose