Slide 1

Slide 1 text

Rustプロダクトのキャッチアップ フェアリーデバイセズ株式会社 プロダクト開発部 加藤学

Slide 2

Slide 2 text

目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 2

Slide 3

Slide 3 text

どんな人間? C / C++ / アセンブラ 3 PHP / Go C++ / Python / Rust 8 年 2 年 2 年 今ココ

Slide 4

Slide 4 text

入社前のRustへの印象は? - ポストC言語として興味はあった - 長らくCに関わって、その発展形に興味があったから - Golang, Nim, vlang, Rust など軽く触っていた - 天才以外に使えるの? - 所有権を「完全に理解」しても、「書けるか」という不安があった 4

Slide 5

Slide 5 text

目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

加藤の業務(例) 7 speech recognition engine End Point Proxy machine translation ・ ・ ・ Proxy Proxy ・エンジン提供元の会社 ・社内R&Dチーム mimiチーム

Slide 8

Slide 8 text

加藤の業務(例) 8 speech recognition engine End Point Proxy machine translation ・ ・ ・ Proxy Proxy mimiチーム エンジン提供元の会社 社内R&Dチーム

Slide 9

Slide 9 text

目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 9

Slide 10

Slide 10 text

何をしたかった? 10 speech recognition engine Audio stream Text
 End Point Proxy Audio stream Message
 new  JSONに

Slide 11

Slide 11 text

⏬ 辛かった - GitHub で読もうとして、頭がパンクする - 便利な機能を全部ONにして、超重力を味わう - 言語仕様をよく読まないせいで、沼る - 先入観で crate を使おうとして、時間をゴミにする 11

Slide 12

Slide 12 text

⏬ GitHub で読もうとして、頭がパンクする - コードだけ見ても、状況がよくわからない - 明示的な型宣言を(あまり)しないから - 関数をドットでつなげていくから 12 - エディタに rust-analyzer を入れて読むべし - アサインされると、まず GitHub で読みがちだが、非推奨

Slide 13

Slide 13 text

⏬ 便利な機能を全部ONにして、超重力を味わう - rust-analyzer - ないと変数の中身がわからない - cargo watch - コード変更と同時に check できる - ブラウザ - わからない時は検索に頼る - 気づくと数十個のタブ・・・ 13 超重力 ハイスペックPC or 取捨選択

Slide 14

Slide 14 text

⏬ 言語仕様をよく読まないせいで、沼る 14 - ドキュメントを流し読みしていた - 基本は C++ や Java ぽいし、読んでるうちにわかるはず - わからない部分を検索しよう - ?の意味がわからなかった - ?は記号なので、「rust」「?」で検索しても答えが出なかった - 言語仕様はちゃんと読もう - 特に Result, Option 周辺

Slide 15

Slide 15 text

⏬ 先入観で crate を使おうとして、時間をゴミにする - serde で json パースができない - crate は feature で指定することで機能ONするらしい - serde の feature に json って入れたら動くはず! - 失敗! - serde / serde_json は違う crate だった - ちゃんと公式ドキュメントを読もう - 公式ドキュメントを見れば、ちゃんと serde_json と書いてある 15

Slide 16

Slide 16 text

⏫ 良かった - 光速で開発環境が整った - 天才じゃなくても使えた - テスト見ながらコードを読めた 16

Slide 17

Slide 17 text

⏫ 光速で開発環境が整った - Cを使ってた頃 - 現場に伝わるドキュメントを探す - 更新漏れが数か所あったりなかったり - OSのバージョン、gccのバージョン、ライブラリのバージョンを調査 - たまにライブラリのパスが特殊な位置に固定されていたりする - Rustの場合 - rustup.rs でインストール - リポジトリを git clone - cargo build - Cargo.toml がコンパイルを保証してくれる 17

Slide 18

Slide 18 text

⏫ 天才じゃなくても使えた - Clippyがめちゃくちゃ優秀だった - 静的解析ツール - インストールすると最初から入っている - 天才じゃなくても、事細かに教えてくれる 18

Slide 19

Slide 19 text

⏫ テスト見ながらコードを読めた - 関数の単体テストが同じファイル内に書ける - 本体は「こうしたい」、テストは「こうなってて欲しい」 - 両方を合わせてコードを読めるので、わかりやすい - テストを書いてくれていたから - 後から来る人のためにもテストを書こう・・・ 19

Slide 20

Slide 20 text

目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 20

Slide 21

Slide 21 text

何を作ったの? 21 output filter tool Text Text
 End Point Proxy Text Text
 Hello. hello CUIツールを 外部コマンドとして実行

Slide 22

Slide 22 text

沼ポイント - Tokioの履修を後回しにして、理不尽な気持ちになる - おまじない気分だった標準的 derive、やっと視界に入る - 外部コマンドの crate 探し、手間取る 22

Slide 23

Slide 23 text

Tokioの履修を後回しにして、理不尽な気持ちになる - AsyncRead で read 関数を使おうとした - ドキュメントの↑を読み落としていた - スタンダードぽい名前だから read はあるはず・・・ - AsyncRead から AsyncReadExt に行き着く方法が他にない - 「Rust」「AsyncRead」検索しても「AsyncReadExt」出ない - read 指定すると Clippy はエラーをはくが、サジェストはしてくれない - Rust公式の次は、Tokioチュートリアルを読みましょう - (zennの日本語訳した有志に感謝) - 事実上 Ext が標準的 trait なの、なぜ・・・? 23

Slide 24

Slide 24 text

おまじない気分だった標準的 derive、やっと視界に入る - 既存プロダクトでは、標準的 derive を意識していなかった - Clone, Copy だけ字面からわかった気でいた - テストで assert_eq すると、怒られる - Clippy もサジェストしてくれなかった - PartialEq を入れないと自作 struct は比較してくれない - ↓のドキュメントでそこまで察するの、無理では・・・? 24 - println! しても変数の中身を出力してくれない - Debug のつけ忘れ - あらゆるものに Debug を継承させたくなる・・・

Slide 25

Slide 25 text

外部コマンドの crate 探し、手間取る - 非同期の crate が見つからなかった - 標準の std::process::Command は「同期」処理だった - tokio::process::Command になかなか行き着かなかった - 継続的に標準入出力を操作する方法がわからなかった - サンプルはLinuxコマンドを一発実行するだけのものが多い - サンプルではなく、理解して書いた第一歩 - spawn すると child が取得できる - ChildStdin / ChildStdout は BufWritrer / BufReader に入れると管理しやすい 25

Slide 26

Slide 26 text

心がけたこと - パーツ交換を前提にした構成 - まれによくある「いつの間にか crate 更新止まってる」問題 - 「止まらない crate 探し」→「更新止まってもすぐ交換できる設計」 - 密結合しないファイル構成 - 再利用しやすく、ライブラリに - (当社)構成の似たサーバを量産する需要 - 共通部分をライブラリに、無理そうでもテンプレ化しやすく 26

Slide 27

Slide 27 text

We are hiring! ● Frontend / Backend developer ● Device Engineer ● Product Manager ● …and more 27 Please check the job board out!