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
4 Signs Your Business is Dying
shpigford
175
21k
Faster Mobile Websites
deanohume
297
30k
How to Ace a Technical Interview
jacobian
272
22k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
Why Our Code Smells
bkeepers
PRO
331
56k
Six Lessons from altMBA
skipperchong
20
3k
KATA
mclloyd
14
12k
GraphQLの誤解/rethinking-graphql
sonatard
50
9.2k
Designing the Hi-DPI Web
ddemaree
276
33k
What's in a price? How to price your products and services
michaelherold
237
11k
Music & Morning Musume
bryan
41
5.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
220
21k
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!