OE_uia Tech Blog

ScalaMatsuri / Scala / Android / Bioinfomatics

Scala関西サミットでAndroid Akkaについて喋ってきた話

| Comments

さて、2016年Scalaアドベントカレンダー@Qiita 3日目です。

何を書こうかと考えていたら、そもそも10/8に開催されたScala関西サミットの話をブログに書いてないことに気づきました。

なので今回はそのことを紹介しつつ、色々補足できたらと思っています。

その前に。

Scala関西サミットの感想

時期を逸した感じがしますが(きの子さんすいません…)、去年にも増して楽しかったです!

(結果的に)タイムテーブルの組み方が非常によくできていて、特にB会場のトラックがActorモデルの解説から、Akka-Stream、と続いていき、最後にAkka Clusterの闇の話が入る、という最高の流れでした。

そして日本各地からだけでなく、台湾からの参加者もいらっしゃるなど、多様性という意味でも大きくグレードアップしていました。

これが無料イベントって… 運営のことが非常に心配になりますので、お金払いますから今後もぜひ続けて下さい、という気持ちです。


ScalaMatsuriも負けてられません!

というわけで、ただいまセッション投票の集計&選考&タイムテーブル準備などの真っ最中でございます。

近々、遅くとも年内にはまとまった情報を出せると思いますので、しばしお待ちくださいませ。

僕の主観ですが、今までにも増して豪華で面白いトークの集まる、素晴らしい2日間になると思います。

さて、本題。

Scala関西サミットのスライド

このトークではActorモデルの解説と、ActorモデルがなぜBONXというVoIPアプリにフィットしたのか、という話をさせていただきました。

ただ、あまりAkkaのカスタマイズ性がVoIPのチューニングにどう役立つのか、という話は出来ずじまいでした。 今回はそこにフォーカスをあてます。

非機能要件の改善

VoIPアプリの場合、機能要件の実装・テストより、非機能要件の改善に時間を使います。 具体的には音質と遅延の改善です。

音質の改善

Actorモデルで設計されたVoIPモジュールにおいて何が一番音質の劣化原因になるかといえば、フレーム間で発生した遅延や、フレームの欠落です。

あるフレームが再生されてから、次のフレームが再生されるまでに間に大きく遅延すると、そこで波形が途切れること(非線形)になりますので聴感上ブツッというノイズに感じます。

同様にして、フレームの欠落が起きると、やはり前後のフレームが非連続になりますのでノイズに感じます。

大雑把に言えば、遅延の改善が音質の改善に繋がります。

遅延の改善

では、遅延をどのように改善したら良いでしょう。

安定している条件では、Akkaというより、個々の計算量を減らすなどモジュールごとのチューニングが必要となることが多いです。

しかし音声ストリーム処理の、しかもグループ通話など負荷が時間とともに変わりうる場合だと、Actorシステムにボトルネックが生じることが往々にしてあります。

まず測定・監視して詰まりやすいhotspotになる場所を探し出し、その後で負荷を分散・解消する方策を考え試行錯誤する必要があります。

解決策は十分にdispatcherの並列度を上げる必要があるときもあれば、局所的にActorを並列化するべきなケース、throughtputなどのパラメーターが重要になるケースなど様々です。

Akkaではこういた実行モデルのチューニングの大部分を、confファイルで簡便に変更出来る点で優れています。

また、Mailboxのサイズを適切に設定することも重要です。

小さすぎて溢れるとフレームの欠落になりますし、かといって大きすぎると遅延の解消に時間がかかります。

音声ストリーム処理の改善、とても難しいけど、チューニングがユーザー体験に直結するのはなかなかレアなので面白いです。

そんなAkkaのチューニングをやりたい方、今Androidエンジニアを絶賛募集中ですので、よかったらこちらからどうぞ。

それでは。

ローカルカンファレンスを無理なく国際化する方法 - ScalaMatsuri 2016を振り返って

| Comments

2016年1月30日及び31日に、アジア最大のScalaカンファレンス「ScalaMatsuri 2016」を開催しました。

550名ほどの来場者と、16万人を超えるニコ生来場者を迎え、大盛況のうちに幕を閉じることが出来ました。

ご参加いただいた皆さん、ご協賛いただいたスポンサーの皆さん、そして準備に尽力してくださったスタッフの皆さん、本当にありがとうございました。

スライド類はだいたい出揃ってきました。また動画は納品後に順次アップロードします。問い合わせの多い翻訳の提供については、現時点で確約はできないですが何らかの形で提供できないか調整しています。

ScalaMatsuri 2016 プログラム

さて、今回は振り返りをするにあたって、「ローカルカンファレンスを無理なく国際化する方法」というタイトルにしました。

なぜか。理由は2つあります。

1つは、そもそもScalaMatsuriの前身となる第一回目のScala Conference in Japan発起の理由として、日本と海外のコミュニティの交流をうたって開催されたからです。

ScalaMatsuriの存在意義はもはやこれだけではありませんが、1つの大きな柱ではあります

もう1つは、今回のScalaMatsuri 2016では、ようやく無理のない国際化の第一歩が踏み出せたからです。

海外のカンファレンスのスピンオフではないローカルな独自カンファレンスで、知名度0からのスタートだったので、当初は招待講演者4名+関係者のみ海外参加者と、今思えばとてもローカルなものでした。ここから改善して今にいたっています。

フィードバックについてはまだ集計中ですが、Twitterハッシュタグを確認する限りにおいて、マジョリティの日本人参加者と、海外からの一般参加者、どちらに寄り過ぎることもなく、楽しんでもらうことができたと感じています。

そのことが、個人的にはちょっとした節目のように感じており、なぜ国際化をしたいのか、無理なく国際化をする上で何をしたのかについて、整理するいい機会なのでしたいと思います。

そこまで怖くないAndroid BLE

| Comments

これはBLE Advent Calendar 2015 7日目の記事です。

AndroidのBluetooth Low Energy(BLE)について、どんなイメージをお持ちでしょうか?

安定してない?わかりにくい?

色々と怖いイメージをもたれがちと思います。確かに怖いところも色々とありますが、今ちょうどAndroid BLEをフルに使ったプロダクトBONX -Wearable Walkie-Talkie-を開発しているので、そこで溜まった知見を共有できればと思います。

Scala標準のPromiseがAndroidで便利だという話

| Comments

この記事は、Scala Advent Calendar 13日目です。

今日はscala.concurrent.Promiseの話をします。

Promise - Scala Standard Library 2.11.7 - scala.concurrent.Promise

そもそもPromiseって使いどころがわかりにくいですよね。他人のコードで使ってるの、ほとんど見たことがありません。

公式ドキュメントではProducer-Consumerパターンでの使い方を解説していますが、現実にこの使い方が必要になるケースってあまり遭遇せず、たいていの場合はFuture同士のflatMapによる合成で事足りてしまうと思います。

Future と Promise - Scala Documentation

ところが、実はAndroidアプリ開発では頻繁に遭遇するあのパターンが、Promiseを使うと非常に取り回しが良くなりますので、紹介したいと思います。

Implicitには型注釈をつけましょう

| Comments

Scalaには(とても今更ですが) Implicit/暗黙 というキーワードがあります。Implicitキーワードを宣言する場所をざっくり分けると、以下の4つ。

1) implicit class …

2) implicit parameter (e.g. (implicit a:A) )

3) implicit def …

4) implicit (var | val) …

この中で1,2は(明示的に)型を書かざるを得ませんが、3のdefの戻り値、及び4については、型注釈を明示的に書かずに型推論を働かせることが(少なくとも最新の2.11.7でも)可能です。

しかし型注釈を書かなかった場合、以下のような(一見理由の分かりにくい)コンパイルエラーに遭遇する可能性が有ることはご存知でしょうか?

ScalaのREPLを拡張するには

| Comments

こちらはScala AdventCalendar 2014の7日目の記事です。 今日はScalaのカスタムREPLの作り方についての話。なお今回は(Scala REPL同様)StandaloneなREPLアプリの作成を目的としているので、:powerモードは主眼ではありません。

モチベーション

ScalaのREPLは手元のローカルマシンでAPIを試してみたいときや、ちょっとした計算をしたいときにはとても便利なのですが、やや凝ったことをしたいときなど、そのまま使うには不便さを感じることがあります。

具体的にはAndroidのAPIをScalaのREPLから叩けるようにしたかったのですが、Android環境をJVMでエミュレートするためにはカスタムClassLoaderを使ってAndroid APIのClassを書き換える必要があって。。。という感じ。

これはちょっと特殊なモチベーションかもしれませんが、クラスター上などの特定の環境で実行させたいとき(e.g.spark-shell)、自作ライブラリのsandbox環境を提供するにあたって特定の場面でよく使うコマンドを追加したい、など思われる方はいるかもしれません。

そんなとき、意外とScala REPLを拡張する記事を書いている人が少なかったので、今回はScalaのソースコードを読みながらカスタムClassLoaderを使用する方法、コマンドを追加する方法について書くことにしました。

参考:Create your custom Scala REPL … 数少ないREPL拡張方法に関する記事。

成果物

taisukeoe/MyCLRepl

MyCLRepl DEMO
1
2
3
4
5
6
7
8
9
10
11
scala> val hello = "hello"

MyClassLoader loads classOf <root>.$line3
<<中略>>
MyClassLoader loads classOf scala.collection.mutable.StringBuilder
MyClassLoader loads classOf scala.runtime.ScalaRunTime$
hello: String = hello

scala> :myCommand hello

This is a custom command example. You can do something from value:"hello" with custom Scala interpreter.

ClassLoaderの差し替え(Classのロード時にクラス名をprint)と、myCommandというコマンドの追加をしています。

ScalaMatsuri 行動規範を掲げた経緯

| Comments

今年から、行動規範をScalaMatsuriとして掲げ始めた。 その目的は「みんな仲良く」。噛み砕いて言えば、性別、国籍などに起因するような少数派が居心地の悪い思い、不快な思いをしないことを目指している。

この行動規範について、突然Webサイトに追加されたので驚かれた方も多いかもしれない。この行動規範は、現実に発生しそうになった問題から、必要要件を考え、準備委員内で長期間に渡り議論を重ねた上で公開したものだ。

既にその目的については@eed3si9n_jaさんがカンファレンスでのユニバーサル・アクセスへ向けてという記事でまとめてくださっているが、来年から本格的に運用するにあたり、この行動規範を掲げた経緯も含めて紹介することが、ご理解とご協力をいただく上では重要ではないかと考えているため、この記事を書くに至った。