Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rustプロダクトのキャッチアップ
Search
kato manabu
December 07, 2022
0
1.7k
Rustプロダクトのキャッチアップ
kato manabu
December 07, 2022
Tweet
Share
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
332
56k
The Power of CSS Pseudo Elements
geoffreycrofte
64
5.2k
GraphQLとの向き合い方2022年版
quramy
36
13k
Building Your Own Lightsaber
phodgson
101
5.9k
It's Worth the Effort
3n
181
27k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
10 Git Anti Patterns You Should be Aware of
lemiorhan
652
58k
A designer walks into a library…
pauljervisheath
201
24k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
52k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
245
1.2M
Making the Leap to Tech Lead
cromwellryan
127
8.7k
For a Future-Friendly Web
brad_frost
173
9.2k
Transcript
Rustプロダクトのキャッチアップ フェアリーデバイセズ株式会社 プロダクト開発部 加藤学
目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 2
どんな人間? C / C++ / アセンブラ 3 PHP / Go
C++ / Python / Rust 8 年 2 年 2 年 今ココ
入社前のRustへの印象は? - ポストC言語として興味はあった - 長らくCに関わって、その発展形に興味があったから - Golang, Nim, vlang, Rust
など軽く触っていた - 天才以外に使えるの? - 所有権を「完全に理解」しても、「書けるか」という不安があった 4
目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 5
6
加藤の業務(例) 7 speech recognition engine End Point Proxy machine translation
・ ・ ・ Proxy Proxy ・エンジン提供元の会社 ・社内R&Dチーム mimiチーム
加藤の業務(例) 8 speech recognition engine End Point Proxy machine translation
・ ・ ・ Proxy Proxy mimiチーム エンジン提供元の会社 社内R&Dチーム
目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 9
何をしたかった? 10 speech recognition engine Audio stream Text End Point
Proxy Audio stream Message new JSONに
⏬ 辛かった - GitHub で読もうとして、頭がパンクする - 便利な機能を全部ONにして、超重力を味わう - 言語仕様をよく読まないせいで、沼る -
先入観で crate を使おうとして、時間をゴミにする 11
⏬ GitHub で読もうとして、頭がパンクする - コードだけ見ても、状況がよくわからない - 明示的な型宣言を(あまり)しないから - 関数をドットでつなげていくから 12
- エディタに rust-analyzer を入れて読むべし - アサインされると、まず GitHub で読みがちだが、非推奨
⏬ 便利な機能を全部ONにして、超重力を味わう - rust-analyzer - ないと変数の中身がわからない - cargo watch -
コード変更と同時に check できる - ブラウザ - わからない時は検索に頼る - 気づくと数十個のタブ・・・ 13 超重力 ハイスペックPC or 取捨選択
⏬ 言語仕様をよく読まないせいで、沼る 14 - ドキュメントを流し読みしていた - 基本は C++ や Java
ぽいし、読んでるうちにわかるはず - わからない部分を検索しよう - ?の意味がわからなかった - ?は記号なので、「rust」「?」で検索しても答えが出なかった - 言語仕様はちゃんと読もう - 特に Result, Option 周辺
⏬ 先入観で crate を使おうとして、時間をゴミにする - serde で json パースができない -
crate は feature で指定することで機能ONするらしい - serde の feature に json って入れたら動くはず! - 失敗! - serde / serde_json は違う crate だった - ちゃんと公式ドキュメントを読もう - 公式ドキュメントを見れば、ちゃんと serde_json と書いてある 15
⏫ 良かった - 光速で開発環境が整った - 天才じゃなくても使えた - テスト見ながらコードを読めた 16
⏫ 光速で開発環境が整った - Cを使ってた頃 - 現場に伝わるドキュメントを探す - 更新漏れが数か所あったりなかったり - OSのバージョン、gccのバージョン、ライブラリのバージョンを調査
- たまにライブラリのパスが特殊な位置に固定されていたりする - Rustの場合 - rustup.rs でインストール - リポジトリを git clone - cargo build - Cargo.toml がコンパイルを保証してくれる 17
⏫ 天才じゃなくても使えた - Clippyがめちゃくちゃ優秀だった - 静的解析ツール - インストールすると最初から入っている - 天才じゃなくても、事細かに教えてくれる
18
⏫ テスト見ながらコードを読めた - 関数の単体テストが同じファイル内に書ける - 本体は「こうしたい」、テストは「こうなってて欲しい」 - 両方を合わせてコードを読めるので、わかりやすい - テストを書いてくれていたから
- 後から来る人のためにもテストを書こう・・・ 19
目次 - 自己紹介 - 当社プロダクトの説明 - Rust開発①既存サーバの改修 - Rust開発②中間サーバの新規開発 20
何を作ったの? 21 output filter tool Text Text End Point Proxy
Text Text Hello. hello CUIツールを 外部コマンドとして実行
沼ポイント - Tokioの履修を後回しにして、理不尽な気持ちになる - おまじない気分だった標準的 derive、やっと視界に入る - 外部コマンドの crate 探し、手間取る
22
Tokioの履修を後回しにして、理不尽な気持ちになる - AsyncRead で read 関数を使おうとした - ドキュメントの↑を読み落としていた - スタンダードぽい名前だから
read はあるはず・・・ - AsyncRead から AsyncReadExt に行き着く方法が他にない - 「Rust」「AsyncRead」検索しても「AsyncReadExt」出ない - read 指定すると Clippy はエラーをはくが、サジェストはしてくれない - Rust公式の次は、Tokioチュートリアルを読みましょう - (zennの日本語訳した有志に感謝) - 事実上 Ext が標準的 trait なの、なぜ・・・? 23
おまじない気分だった標準的 derive、やっと視界に入る - 既存プロダクトでは、標準的 derive を意識していなかった - Clone, Copy だけ字面からわかった気でいた
- テストで assert_eq すると、怒られる - Clippy もサジェストしてくれなかった - PartialEq を入れないと自作 struct は比較してくれない - ↓のドキュメントでそこまで察するの、無理では・・・? 24 - println! しても変数の中身を出力してくれない - Debug のつけ忘れ - あらゆるものに Debug を継承させたくなる・・・
外部コマンドの crate 探し、手間取る - 非同期の crate が見つからなかった - 標準の std::process::Command
は「同期」処理だった - tokio::process::Command になかなか行き着かなかった - 継続的に標準入出力を操作する方法がわからなかった - サンプルはLinuxコマンドを一発実行するだけのものが多い - サンプルではなく、理解して書いた第一歩 - spawn すると child が取得できる - ChildStdin / ChildStdout は BufWritrer / BufReader に入れると管理しやすい 25
心がけたこと - パーツ交換を前提にした構成 - まれによくある「いつの間にか crate 更新止まってる」問題 - 「止まらない crate
探し」→「更新止まってもすぐ交換できる設計」 - 密結合しないファイル構成 - 再利用しやすく、ライブラリに - (当社)構成の似たサーバを量産する需要 - 共通部分をライブラリに、無理そうでもテンプレ化しやすく 26
We are hiring! • Frontend / Backend developer • Device
Engineer • Product Manager • …and more 27 Please check the job board out!