Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mj-hd/bbfa3c567fb2cec6df33050c7d4029cf to your computer and use it in GitHub Desktop.
Save mj-hd/bbfa3c567fb2cec6df33050c7d4029cf to your computer and use it in GitHub Desktop.
20210326_observable-hooks_ネットワーク帯域推定

observable-hooks

以前の記事でRxJSに入門したとき、一緒に使ってみたライブラリ observable-hooks の使い心地に感銘を受けた。
RxJSのObservableによる世界とReactとの境界をhooksとして取り持つライブラリなのだが、これがConcurrent Mode Safeと謳っている。
実際、Observable Resourceというオブジェクトを経由してストリームの状態、例えば値が流れていない初期状態はPromiseをthrowで表現したり、エラー時は流れてきたerrorをthrowしたり、内部で流れてきた値をキャッシュしてrender時に値を提供することでObervableからReact Concurrent Modeの世界へ状態を変換してくれる。
使い心地としてはReact側からもデータフロー側からもConcurrent Modeのアレやコレをライブラリが全て隠蔽しており、ハハーンこれが来るべき未来なのかーと感心した。

ネットワーク帯域推定

とある事情によりネットワークの帯域を大まかに推定する必要に迫られたのだが、似たようなことをしているライブラリを参考に、指数平滑移動平均(EWMA)という方法を使うと良さそうなことを学んだ。
定期的にネットワーク帯域をサンプルしたとして、全体の平均をとってしまえば分母がどんどん大きくなり、急激な変化に反応できなくなる。そこで時系列順に指数関数的な重み付けを与え、新しいデータほど平均値に与える割合を多くしたものが指数平滑移動平均らしい。外れ値の影響を省きつつ機敏にネットワーク状況に追従できるので、hls.jsshaka-playerの帯域推定に使われていた。(hls.jsはfast, slowの二種類の平均を取ってるように見える。この辺りもう少し深掘りたい)
ライブラリとしては pgte/moving-average: Moving Average が更新もされていて型定義もあるので良さそう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment