hsimyu's diary

ゲームなどをします。

9/12 あそびあそばせ

9/12

仕事は微妙。というか SDK の更新してリビルドかけてたら終わっちゃったよ。悲しい。

Fitbit Alta HR バンド

マグネットバンドが欲しい 無段階調節したい 蒸れないかな マグネットの方は若干ハズレ引きそうな雰囲気あるので Xberstar のやつにした

Xberstar Fitbit Alta HR/Fitbit Alta バンド ベルト スポーツバンド シリコン製 汗に強い 6色あり (ブラック+グレー)


Binary Hacks そろそろ読みたい

マチェドニア: イタリア風フルーツポンチ

いい記事

[Game]ガスコイン神父が教えてくれたこと|kamiushi|note

目白押しの語源は?

9/11

仕事はまあまあだったような。

生成文法

良さげな雰囲気

tautochrone (or isochrone) curve: 等時曲線、トートクロンカーブ

Discord の VoiceChat の裏側

How Discord Handles Two and Half Million Concurrent Voice Users using WebRTC

  • 非常に多くの多対多音声通信を可能にするためには、サーバー-クライアントモデルが必要だった
    • P2P はユーザー数に比例して高価になる
    • ユーザー IP が他のユーザーに漏れないので、ユーザーはセキュアになる
  • また、メディアコンテンツをサーバー上に保存するのも moderation できるのでベターだった
  • どのクライアントでも WebRTC を喋っている
  • ブラウザではビルトインの WebRTC implementation に依存した振る舞い
  • ネイティブアプリケーションでは WebRTC ライブラリの上で独自 C++ media Engine が動いている
    • そのため、ネイティブアプリケーションのがブラウザアプリより優れた機能となっている点がある
  • Discord の音声/ビデオ通話は、必ず「ユーザーが VC チャンネルに接続する」アクションから始まる。クライアント側から必ず初期化されるという決まりによって
    • クライアント・バックエンド両方の複雑性を抑えること
    • 可用性を上げること
      • もし接続エラーになっても、ユーザーは単にリトライして別のバックエンドサーバーに繋げばよい。
  • が達成できた。
  • ネイティブ WebRTC ライブラリを自分たちで実装したことで、ブラウザでは難しいチューニングができた
    • WebRTC から Session Description Protocol (?) を喋る low level API を直接叩く。チャンネル参加時にそのセッションを通じて最小限の情報を交換する。
    • WebRTC が最適通信路を決めるために使っている Interactive Connectivity Establishment (ICE) を、使わない。NAT の裏側にユーザーがいる時、ICE を使わないことでより信頼性の高い通信を行える。(ユーザー同士で IP を開示しない)
    • メディア暗号化のための Secure Real-time Transport Protocol (SRTP) / Datagram Transport Layer Security (DTLS) を使わない。
      • 代わりの Transport Layer として Salsa20 encryption を利用
    • 静寂時にはオーディオデータ自体を送らない(!)
  • もちろん、ブラウザ版ではブラウザ WebRTC を使っているが、バックエンドサーバーで差異を吸収している
  • バックエンドサーバーは Elixir で Websocket を喋っている
  • (飽きた)

ネジ山が潰れたネジは、輪ゴムを使って穴を埋めると回る