Skip to content

Instantly share code, notes, and snippets.

@kentac55
Created August 17, 2017 11:46
Show Gist options
  • Save kentac55/dc470330f1a097ebfe1a92beac22c5ec to your computer and use it in GitHub Desktop.
Save kentac55/dc470330f1a097ebfe1a92beac22c5ec to your computer and use it in GitHub Desktop.
scala

2017/07/06

麻植さん

VoIPクライアント

  • client
    • Android: Scala
    • iOS: obc, swift
  • Server
    • rails
    • go

VoIPの特徴

  • Upstream
  • Downstream 音声をDSPを通しエンコしsocketへ 全てのコンポーネントは状態があり、更にスレッドセーフではない

アウトドアの厄介さ

  • 不安定なネットワーク
  • 県外⇔圏内間の度重なる移動
  • ハードウェアIOerror
  • Bluetooth切断 特にアウトドアで遊んでいる最中は画面操作できないので自動復旧が必須

更に

  • エラーは必ずしも問題のコンポーネントで補足されない
    • 下流で気づくことがある
    • すなわちエラーを逆方向に伝搬させたい
  • 問題のあるコンポーネントは壊れた音声データを生むかもしれない
    • ノイズの原因になりうる
    • すなわちエラーの種類に寄っては、キューに溜まった音声データを消さなければいけない(逆もまた然り)

akka

ステートフルな並行プログラミングのためのライブラリ メッセージ駆動なアクターモデル アクターは、状態を内部に閉じ込めたまま、平行プログラミングができる

Akkaの障害耐性

  • 例外のハンドリング
  • Actorヒエラルキー
    • 子アクターをsupervisorStrategyに基づいてRestart, Stop Resume
      • これによるRestartはメッセージボックスにメッセージを貯める
  • モニタリング
    • 監視対象のアクターがstopすると監視側のアクターはTerminated(actorRef)メッセージを受け取るので、そこで再生成する
      • これによるアクター再生性はメッセージボックス内のメッセージを破棄する

akkaがうまく働いた理由

  • ステートフルな並行プログラミング
  • メッセージとして管理できる

良くないところ

  • ものyいおっては例外として検知しにくい問題がある
    • オーディオドライバが場合に寄っては(ブロックしたまま)沈黙し、何も返さないことがある
  • 銀の弾丸はない
    • AskでAckがTimeout内に帰ってくるかチェック
      • もしAskがタイムアウトしたらstopし再生成

ScalaがAndroidで使える理由

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が必要
    • Java8 supportなし
      • Android SDK toolchainはいまだJava6+環境が対象
    • メモリ管理もある程度きにしたい
    • GoogleもLightbendも未サポート

疲れた。。。

androidにjava8

いつかね

でも対応したら?

  • Scala2.12以上動くよ
  • Scala標準ライブラリが小さく
  • Dotty(Scala3.0)がうんたら

メモリ管理

狭いスコープでmutableはあり・・・ なんかよくわからなかった

まとめ

akkaの耐障害性はアウトドアでよく使われるAndroid開発にとって良い

scalaコレクション

正格

すぐに実行→中間コレクションが生成されてしまう

解決策

  1. 高度なメソッドを使う
  2. viewメソッドを使う→非正格になる

非正格

  1. viewで非正格にしてメソッドチェーンをした後forceで正格にする

注意

小さすぎるコレクションは非正格コストのほうが大きくなるケースあり

中間コレクション作る前に

  1. 高級関数を使う
  2. 関数合成
  3. view
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment