SlideShare a Scribd company logo
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にしたらよくない?
⼤義名分
・安全性 → 品質レベルの底上げ
・わりと速い
→ まずは⾃分でやってみよう
C++ぜんぜんわからない…
既存コードにも結構メモリ系バグある
Rust学び始め期
• Rust by Example写経
• Project EulerをRustで解く
• 競プロ過去問をRustで解く
↓
• 途中から数学&アルゴリズム⼒のたたかいに
• Rustの⾔語仕様のうち、触れないままのものも
• エラー処理とか、並列処理とか、ライフタイムとか…
実装チャレンジ
• libmimiioでできることをRustでやってみる
• WebSocketで弊社の⾳声認識APIを利⽤するライブラリ
• ⼤元のC++版はオープンソースで公開
• https://github.com/FairyDevicesRD/libmimiio
やること
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/client.rs
…
…
…
クライアントを作って接続確⽴(わかる)
接続をsenderとreceiverに分割(わかる)
senderとreceiver間の通信⽤channel(わかる)
Sender使って送信ループ(わかる)
Receiver使って受信ループ(わかる)
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
Future
• サーバーとの接続がセキュアな(wss://〜)場合
• client は splittable ではない → sender / receiver へ分割不可能
• ⾃社APIは wss://〜 のみしか受け付けない
→ わからないなりにFutureを使う必要あり
https://github.com/websockets-rs/rust-websocket/blob/master/examples/ssl-client.rs
この辺はサンプルコードのまま
streamが受信したデータは、
filter_map()に流れてくる
→⾳声認識結果の受信時の処理を記述
Noneを返さないと、
sinkに流れていってしまう
送信データは別スレッドから
channel経由で受け取り、
sinkにぶちこむ
コールバック
• 今は送信スレッドにファイル読み込み処理を書いているが、
これを外に出したい
mimiio
ライブラリ
サーバー
ファイルから
分割送信
マイクデバイスから
直接データ送信
⼊⼒⽅法は利⽤者次第
コールバック
こんなふうに呼び側から渡して、
コールバック
こんなふうに使いたい
…
コールバック
コンパイラさんから、いろんな怒られが発⽣
Impl_callback ブランチに、試⾏錯誤の途中状況をpush 済み
→わかる⽅アドバイスください!!!
まとめ
• ⾃社WebSocket APIのクライアントプログラムを
Rustで実装してみました
• ⼀応動いたものの、汎⽤的に使えるものにするには、
もっと⾔語仕様・ライブラリへの深い理解が必要…
• 勉強ネタは尽きないのでいいですね
採⽤活動中
• 弊社では⼀緒に働いてくれるエンジニアを募集中です!
• ⾳声の取り扱いに興味がある/得意な⽅
• サーバーアプリケーション開発・クラウド運⽤に興味がある⽅
• クライアントアプリケーションも作るぜという⽅
• ゆくゆくはRustをプロダクトに使うぜという野望のある⽅
ありがとうございました

More Related Content

ODT
Interception de signal avec dump de la pile d'appel
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
PDF
دورة تعلم بسهوله PHP
PDF
DockerとPodmanの比較
PDF
BYOP: Custom Processor Development with Apache NiFi
PDF
OpenFOAMのDEM解析のpatchInteractionModelクラスの解読
PPTX
エンジニアライクにドキュメントを作成してみた件
PDF
Introduction to the Qt Quick Scene Graph
 
Interception de signal avec dump de la pile d'appel
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
دورة تعلم بسهوله PHP
DockerとPodmanの比較
BYOP: Custom Processor Development with Apache NiFi
OpenFOAMのDEM解析のpatchInteractionModelクラスの解読
エンジニアライクにドキュメントを作成してみた件
Introduction to the Qt Quick Scene Graph
 

What's hot (20)

KEY
Web application development with Django framework
PPTX
Wpfと非同期
PPTX
Apache BookKeeper State Store: A Durable Key-Value Store - Pulsar Summit NA 2021
PDF
Integrating Applications: the Reactive Way
PDF
RNAscope® アッセイ概要
PDF
How to create a real time chat application using socket.io, golang, and vue js-
PPTX
Pycairo を使ってみる その1
PDF
Turbulence Models in OpenFOAM
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
PPTX
Gaucheでマクロを書こう
PDF
morris Compression couplings dealer vardhman bearings
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
PDF
OpenFOAMの壁関数
PDF
HBase at LINE
PPTX
Excel でパケット分析 - グラフ化
KEY
Vyatta 改造入門
PDF
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
PDF
PyKinect: Body Iteration Application Development Using Python
PDF
サーバPUSHざっくりまとめ
PDF
Physical Plans in Spark SQL
Web application development with Django framework
Wpfと非同期
Apache BookKeeper State Store: A Durable Key-Value Store - Pulsar Summit NA 2021
Integrating Applications: the Reactive Way
RNAscope® アッセイ概要
How to create a real time chat application using socket.io, golang, and vue js-
Pycairo を使ってみる その1
Turbulence Models in OpenFOAM
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Gaucheでマクロを書こう
morris Compression couplings dealer vardhman bearings
ARM CPUにおけるSIMDを用いた高速計算入門
OpenFOAMの壁関数
HBase at LINE
Excel でパケット分析 - グラフ化
Vyatta 改造入門
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
PyKinect: Body Iteration Application Development Using Python
サーバPUSHざっくりまとめ
Physical Plans in Spark SQL
Ad

Similar to RustでWebSocketな自社APIを使う (20)

PPTX
JavaプログラマのためのWebSocket概要
PDF
HTML5-pronama-study
PDF
Html5, Web Applications 2
PDF
UnicastWS vol.1
PDF
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
PDF
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
PPTX
WebSocketでリアルタイム通信 (第13回学生LT資料)
PDF
HttpとTelnetをつなぐ何か
PDF
Rails と Rack と HTTP と通信の話
PDF
WebSocket + Node.jsでつくるチャットアプリ
PDF
AndroidでWebSocket
PDF
RustでWebAssembly
PDF
Firefox os勉強会 2nd WEB屋さんがWEBアプリを作ってみた
PPTX
Ratchetでweb socketを使ってみたよ.d0131.pub
PDF
20130216
PDF
WebSocket Protocol と Plack::Middleware::WebSocket
PDF
C言語なWebSocketの遊び方。
PDF
PythonによるOPC-UAの利用
PDF
ネットワークAPI のあれこれ (ENOG37)
PPTX
JavaOne2014報告会資料
JavaプログラマのためのWebSocket概要
HTML5-pronama-study
Html5, Web Applications 2
UnicastWS vol.1
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
WebSocketでリアルタイム通信 (第13回学生LT資料)
HttpとTelnetをつなぐ何か
Rails と Rack と HTTP と通信の話
WebSocket + Node.jsでつくるチャットアプリ
AndroidでWebSocket
RustでWebAssembly
Firefox os勉強会 2nd WEB屋さんがWEBアプリを作ってみた
Ratchetでweb socketを使ってみたよ.d0131.pub
20130216
WebSocket Protocol と Plack::Middleware::WebSocket
C言語なWebSocketの遊び方。
PythonによるOPC-UAの利用
ネットワークAPI のあれこれ (ENOG37)
JavaOne2014報告会資料
Ad

RustでWebSocketな自社APIを使う