O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
RustでWebSocketな
⾃社APIを使う
Satoshi Yoshikawa
@emergent
⾃⼰紹介
• フェアリーデバイセズ株式会社
• ソフトウェアエンジニア歴9ヶ⽉
• 10年ぶり2回⽬
• Rust歴半年
• ねこ⼤好き
現所属会社について
• ⾳声APIとデバイスの会社
• http://www.fairydevices.jp/
• 使⽤⾔語
• サーバー:C++とPython
• クライアントライブラリ:C++
現所属会社について
• ⾳声APIとデバイスの会社
• http://www.fairydevices.jp/
• 使⽤⾔語
• サーバー:C++とPython
• クライアントライブラリ:C++
Rustにしたらよくない?
⼤義名分
・安全性...
Rust学び始め期
• Rust by Example写経
• Project EulerをRustで解く
• 競プロ過去問をRustで解く
↓
• 途中から数学&アルゴリズム⼒のたたかいに
• Rustの⾔語仕様のうち、触れないままのものも
...
実装チャレンジ
• libmimiioでできることをRustでやってみる
• WebSocketで弊社の⾳声認識APIを利⽤するライブラリ
• ⼤元のC++版はオープンソースで公開
• https://github.com/FairyDevic...
やること
1. WebSocket接続を確⽴し、
2. ⾳声データをチャンクで送信し、
3. ⾳声認識結果(JSON)を五⽉⾬で受け取る
https://mimi.readme.io/docs/mimi-websocket-api-spec
とりあえず動いたもの
• https://github.com/emergent/rust-mimiio
• 決め打ち部分で動かしてる部分は結構多い
• 送受信スレッドの中にいろんな処理を押し込めているので
いろいろださい
ぶつかった壁
•Future
•コールバック 絶賛ぶつかり中
Future
• websocketクレートのサンプルコード抜粋(client.rs=Futureなし版)
https://github.com/websockets-rs/rust-websocket/blob/master/examples...
Future
• websocketクレートのサンプルコード抜粋(async-client.rs=Futureあり版)
…
…
…
runtimeというものが作られている
(わからない)
ユーザーの⼊⼒を受け付けるchannelが作られている
...
Future
• サーバーとの接続がセキュアな(wss://〜)場合
• client は splittable ではない → sender / receiver へ分割不可能
• ⾃社APIは wss://〜 のみしか受け付けない
→ わから...
この辺はサンプルコードのまま
streamが受信したデータは、
filter_map()に流れてくる
→⾳声認識結果の受信時の処理を記述
Noneを返さないと、
sinkに流れていってしまう
送信データは別スレッドから
channel経由で受け...
コールバック
• 今は送信スレッドにファイル読み込み処理を書いているが、
これを外に出したい
mimiio
ライブラリ
サーバー
ファイルから
分割送信
マイクデバイスから
直接データ送信
⼊⼒⽅法は利⽤者次第
コールバック
こんなふうに呼び側から渡して、
コールバック
こんなふうに使いたい
…
コールバック
コンパイラさんから、いろんな怒られが発⽣
Impl_callback ブランチに、試⾏錯誤の途中状況をpush 済み
→わかる⽅アドバイスください!!!
まとめ
• ⾃社WebSocket APIのクライアントプログラムを
Rustで実装してみました
• ⼀応動いたものの、汎⽤的に使えるものにするには、
もっと⾔語仕様・ライブラリへの深い理解が必要…
• 勉強ネタは尽きないのでいいですね
採⽤活動中
• 弊社では⼀緒に働いてくれるエンジニアを募集中です!
• ⾳声の取り扱いに興味がある/得意な⽅
• サーバーアプリケーション開発・クラウド運⽤に興味がある⽅
• クライアントアプリケーションも作るぜという⽅
• ゆくゆくはRust...
ありがとうございました
Próximos SlideShares
Carregando em…5
×

RustでWebSocketな自社APIを使う

Shinjuku.rs #4 の発表資料です。

  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

RustでWebSocketな自社APIを使う

  1. 1. RustでWebSocketな ⾃社APIを使う Satoshi Yoshikawa @emergent
  2. 2. ⾃⼰紹介 • フェアリーデバイセズ株式会社 • ソフトウェアエンジニア歴9ヶ⽉ • 10年ぶり2回⽬ • Rust歴半年 • ねこ⼤好き
  3. 3. 現所属会社について • ⾳声APIとデバイスの会社 • http://www.fairydevices.jp/ • 使⽤⾔語 • サーバー:C++とPython • クライアントライブラリ:C++
  4. 4. 現所属会社について • ⾳声APIとデバイスの会社 • http://www.fairydevices.jp/ • 使⽤⾔語 • サーバー:C++とPython • クライアントライブラリ:C++ Rustにしたらよくない? ⼤義名分 ・安全性 → 品質レベルの底上げ ・わりと速い → まずは⾃分でやってみよう C++ぜんぜんわからない… 既存コードにも結構メモリ系バグある
  5. 5. Rust学び始め期 • Rust by Example写経 • Project EulerをRustで解く • 競プロ過去問をRustで解く ↓ • 途中から数学&アルゴリズム⼒のたたかいに • Rustの⾔語仕様のうち、触れないままのものも • エラー処理とか、並列処理とか、ライフタイムとか…
  6. 6. 実装チャレンジ • libmimiioでできることをRustでやってみる • WebSocketで弊社の⾳声認識APIを利⽤するライブラリ • ⼤元のC++版はオープンソースで公開 • https://github.com/FairyDevicesRD/libmimiio
  7. 7. やること 1. WebSocket接続を確⽴し、 2. ⾳声データをチャンクで送信し、 3. ⾳声認識結果(JSON)を五⽉⾬で受け取る
  8. 8. https://mimi.readme.io/docs/mimi-websocket-api-spec
  9. 9. とりあえず動いたもの • https://github.com/emergent/rust-mimiio • 決め打ち部分で動かしてる部分は結構多い • 送受信スレッドの中にいろんな処理を押し込めているので いろいろださい
  10. 10. ぶつかった壁 •Future •コールバック 絶賛ぶつかり中
  11. 11. Future • websocketクレートのサンプルコード抜粋(client.rs=Futureなし版) https://github.com/websockets-rs/rust-websocket/blob/master/examples/client.rs … … … クライアントを作って接続確⽴(わかる) 接続をsenderとreceiverに分割(わかる) senderとreceiver間の通信⽤channel(わかる) Sender使って送信ループ(わかる) Receiver使って受信ループ(わかる)
  12. 12. Future • websocketクレートのサンプルコード抜粋(async-client.rs=Futureあり版) … … … runtimeというものが作られている (わからない) ユーザーの⼊⼒を受け付けるchannelが作られている (まあわかる) async_connect_insecure()で接続確⽴(まあわかる) Stream?? Sink?? Select?? Forward?? (混乱) https://github.com/websockets-rs/rust-websocket/blob/master/examples/async-client.rs
  13. 13. Future • サーバーとの接続がセキュアな(wss://〜)場合 • client は splittable ではない → sender / receiver へ分割不可能 • ⾃社APIは wss://〜 のみしか受け付けない → わからないなりにFutureを使う必要あり https://github.com/websockets-rs/rust-websocket/blob/master/examples/ssl-client.rs
  14. 14. この辺はサンプルコードのまま streamが受信したデータは、 filter_map()に流れてくる →⾳声認識結果の受信時の処理を記述 Noneを返さないと、 sinkに流れていってしまう 送信データは別スレッドから channel経由で受け取り、 sinkにぶちこむ
  15. 15. コールバック • 今は送信スレッドにファイル読み込み処理を書いているが、 これを外に出したい mimiio ライブラリ サーバー ファイルから 分割送信 マイクデバイスから 直接データ送信 ⼊⼒⽅法は利⽤者次第
  16. 16. コールバック こんなふうに呼び側から渡して、
  17. 17. コールバック こんなふうに使いたい …
  18. 18. コールバック コンパイラさんから、いろんな怒られが発⽣ Impl_callback ブランチに、試⾏錯誤の途中状況をpush 済み →わかる⽅アドバイスください!!!
  19. 19. まとめ • ⾃社WebSocket APIのクライアントプログラムを Rustで実装してみました • ⼀応動いたものの、汎⽤的に使えるものにするには、 もっと⾔語仕様・ライブラリへの深い理解が必要… • 勉強ネタは尽きないのでいいですね
  20. 20. 採⽤活動中 • 弊社では⼀緒に働いてくれるエンジニアを募集中です! • ⾳声の取り扱いに興味がある/得意な⽅ • サーバーアプリケーション開発・クラウド運⽤に興味がある⽅ • クライアントアプリケーションも作るぜという⽅ • ゆくゆくはRustをプロダクトに使うぜという野望のある⽅
  21. 21. ありがとうございました

×