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.8k
Rustプロダクトのキャッチアップ
kato manabu
December 07, 2022
Tweet
Share
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
The Cult of Friendly URLs
andyhume
78
6.1k
The Invisible Side of Design
smashingmag
298
50k
How STYLIGHT went responsive
nonsquared
95
5.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Being A Developer After 40
akosma
87
590k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Practical Orchestrator
shlominoach
186
10k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
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!