- client
- Android: Scala
- iOS: obc, swift
- Server
- rails
- go
- Upstream
- Downstream 音声をDSPを通しエンコしsocketへ 全てのコンポーネントは状態があり、更にスレッドセーフではない
- 不安定なネットワーク
- 県外⇔圏内間の度重なる移動
- ハードウェアIOerror
- Bluetooth切断 特にアウトドアで遊んでいる最中は画面操作できないので自動復旧が必須
- エラーは必ずしも問題のコンポーネントで補足されない
- 下流で気づくことがある
- すなわちエラーを逆方向に伝搬させたい
- 問題のあるコンポーネントは壊れた音声データを生むかもしれない
- ノイズの原因になりうる
- すなわちエラーの種類に寄っては、キューに溜まった音声データを消さなければいけない(逆もまた然り)
ステートフルな並行プログラミングのためのライブラリ メッセージ駆動なアクターモデル アクターは、状態を内部に閉じ込めたまま、平行プログラミングができる
- 例外のハンドリング
- Actorヒエラルキー
- 子アクターをsupervisorStrategyに基づいてRestart, Stop Resume
- これによるRestartはメッセージボックスにメッセージを貯める
- 子アクターをsupervisorStrategyに基づいてRestart, Stop Resume
- モニタリング
- 監視対象のアクターがstopすると監視側のアクターはTerminated(actorRef)メッセージを受け取るので、そこで再生成する
- これによるアクター再生性はメッセージボックス内のメッセージを破棄する
- 監視対象のアクターがstopすると監視側のアクターはTerminated(actorRef)メッセージを受け取るので、そこで再生成する
- ステートフルな並行プログラミング
- メッセージとして管理できる
- ものyいおっては例外として検知しにくい問題がある
- オーディオドライバが場合に寄っては(ブロックしたまま)沈黙し、何も返さないことがある
- 銀の弾丸はない
- AskでAckがTimeout内に帰ってくるかチェック
- もしAskがタイムアウトしたらstopし再生成
- AskでAckがTimeout内に帰ってくるかチェック
java bytecodeから生成できる scala-android 万人に勧めることはできない scaloid
- pros
- 豊富な言語機能とエコシステム
- 並行プログラミング
- コレクションAPI
- 代数的データ型とパターンマッチ
- トレイト
- 生産性
- 0.5-1.2人で2年間新機能開発と運用を回す
- サーバーサイドと同じ言語
- (UI以外)ステートレスな並行プログラミング
- UIThreadで実行するためのExecutionContextを定義してonComplete, andThen等に明示的に渡せる
- akka使えるよ
- 豊富な言語機能とエコシステム
- cons
- dexファイルあたり、メソッド数64kの上限がある
- Scala標準ライブラリのjarは大きすぎる
- ProguardかMultiDexが必要
- Scala標準ライブラリのjarは大きすぎる
- Java8 supportなし
- Android SDK toolchainはいまだJava6+環境が対象
- メモリ管理もある程度きにしたい
- GoogleもLightbendも未サポート
- dexファイルあたり、メソッド数64kの上限がある
疲れた。。。
いつかね
- Scala2.12以上動くよ
- Scala標準ライブラリが小さく
- Dotty(Scala3.0)がうんたら
狭いスコープでmutableはあり・・・ なんかよくわからなかった
akkaの耐障害性はアウトドアでよく使われるAndroid開発にとって良い
すぐに実行→中間コレクションが生成されてしまう
- 高度なメソッドを使う
- viewメソッドを使う→非正格になる
- viewで非正格にしてメソッドチェーンをした後forceで正格にする
小さすぎるコレクションは非正格コストのほうが大きくなるケースあり
- 高級関数を使う
- 関数合成
- view