「Rust、何もわからない... #2」 イベントレポート

Rust、何もわからない... #2

去る5/19日、弊社estieが主催する #Rust何もわからない の第2回が開催されました!

イベントページはこちら

第1回の模様はこちらからどうぞ!

使うぜ!Cargo workspace by kenkoooo

speakerdeck.com

最初のプレゼンターはkenkooooさんです。oは4個です。最近親知らずを抜いたそうです。痛そう…

Rustで書かれたapiサーバのディレクトリ構成がプロジェクト初期と比べるとかなり変わったとのこと。

Cargo workspaceを利用して、モジュールの「公開範囲」がわかりやすいディレクトリ構成に変えた話です。


workspaceをつかってvisibilityをいい感じにする

Rustのディレクトリ構成では、srcディレクトリの下にモジュールをおくことが一般的です。

しかし、この構成では各モジュールのvisibility(公開範囲)が分かりにくいことが難点でした。

単一のcrateとして運用している場合、pub(crate) は事実上、全公開と同義なので visibility 制御になりません。


アプリを作るときの公開範囲は、「特定のモジュールのなかでは全公開にしたいが、モジュール外からは見えない」という状態がちょうど良いので、それを実現したかったそうです。

そこで、workspace を使ってcrateを切ることで、pub(crate) と pub に違いが出来、管理しやすくなりました。

インターフェースをモジュール内に隠蔽するか、アプリケーショングローバルに公開するか、のような区別ができるようになります。

つまり、ワークスペースが親モジュールのような感覚で使えるので、複雑性を下げるのに役立ちます。


使い方も簡単

[workspace]
members = ["module1"]

のようなシンプルな表記でworkspaceを使い始めることができます。

テストコマンドだけは注意が必要なようです。


dockerでキャッシュをいい感じにするテク

ところがこのディレクトリ構成の欠点として、「Dockerでキャッシュを効かせるのが難しい」ということがあります。moduleごとにCargo.tomlが作られますので、Dockerfileが冗長になってしまいます。

それを解決するのがcargo-chefです。すごい!!

プロジェクト内の依存関係を整理したrecipe.jsonを利用し、管理してくれる優れものです。

GitHub - LukeMathWalker/cargo-chef: A cargo-subcommand to speed up Rust Docker builds using Docker layer caching.


いただいたご質問を抜粋


actix-webのテストどうしてる? by matsu7874

speakerdeck.com

2番手のプレゼンターはmatsu7874さんです。入社されて1ヶ月程度ですがRust関連の開発はもちろんのこと、最近は技術広報面でも色々動いてくださっていて大変心強い…

matsu7874 (@matsu7874) | Twitter

actix-webを用いたプロジェクトでの結合テストを、アプリケーションをテスト DB に接続しておこなっています。

引数でworkspaceを指定してテストを実行できます。

単体テストでは、テスト対象の関数と同じファイルにテストを書いています。

結合テストは別ファイルを作って書き始めています。MySQLをモックせず、本物のMySQLに問い合わせをおこないアサーションしています。

actix-webのドキュメントではテストの関数の戻り値に型つけていませんが、Result型に詰めてあげると便利だそうです。

今後顕在化しそうな課題

現在は問題無く開発をおこなっていますが、近い将来出てきそうな課題についても共有いただきました。

  • 結合テストを並列実行できていない

  • 発行されるSQLクエリが正しいことを確認できていない。MySQLをモックしてMySQLが受け取るクエリをassertするといいかなあと思っている

いただいたご質問を抜粋


RustとCADDi AI LabとML by vaaaaanquish

3番手はvaaaaanquishさんです。aは5個です。

ばんくし (@vaaaaanquish) | Twitter

vaaaaanquishさんはエンジニアが集まるギルドのオーナーもやっているそうです。名前からして、ボルダリングが好きな人があつまるのかな?と思いました。

外向けの発信をいっぱいされているみたいです。すごい。


MLでRust を使う背景

図面データを主に扱っているが、処理する画像のサイズが非常に大きいそうで、速度を重視 Rust を使っているとのこと。

所属するアルゴリズムエンジニアのチームでは暖色コーダーが集まっているそうです。(強い…。)

MLエンジニアのチームは実際のところほとんどPythonを利用しているが、一部ではRustを利用しているという感じだそうです。


利用ケース

実際の利用ケースについて共有いただきました。

  • 図面から矢印を検出する

    • 候補推定して、候補毎に機械学習で判定

    • 学習は Python で行うが、推論は基本全部 Rust でやっている

  • 画像処理アルゴリズム

など

チームには初めて Rust 使うエンジニアもいるので、モブプロなどでフォローもおこなっているそうです。

vaaaaanquishさんの管理している、Rustで書かれたMLライブラリをまとめているリポジトリもあるそうです。

https://github.com/vaaaaanquish/Awesome-Rust-MachineLearning


最近の流行り

CV (コンピュータビジョン)NLP(自然言語処理)検索エンジンの Rust 化が盛り上がっているそうです。

GitHub - lindera-morphology/lindera: A morphological analysis library.

GitHub - meilisearch/meilisearch: Powerful, fast, and an easy to use search engine

などでしょうか?

また、ONNXというのも流行っているとのこと。

Open Neural Network Exchange - Wikipedia

Python で出力した推論モデルを表現するフォーマットを、Rust で扱えるようにしていく、みたいな話…だと思われます…。

大変心苦しいのですが、自分にはML周りの知識が足りず……。

Rust、何もわからなかったです……(タイトル回収)

最後に

estieでは2カ月に1回のペースで実務で得た知見を共有する中級者向けのRustイベントを開催しています。ご興味あるのはぜひconnpassのフォローをお願いします! 登壇者も募集しているそうなので、一緒に盛り上げてくださる方はご連絡ください。

estie.connpass.com

© 2019- estie Inc.