アーキテクチャ・デザインにとって重要なこと

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
ようやく最後の章です。 Exampleは取り上げた例が特殊すぎたかな、とちょっと反省しています。 が、時間がない。次々いきます。 ※最後の章はほぼ思想論です。そういうのが好きでない人は読み飛ばしてください。 さて改めて考えてみます。 優れたシステム・アーキテクチャとはどのようなものでしょう? 第1章でも取り上げましたが、システムは「データを管理し、それを利活用すること」が目的です。 そして、データとそれを利活用した機能の間をどう繋ぐかはエンジニアの自由です。 すなわち、この自由がどう担保できるか、が、システム・アーキテクチャを考える上で最も重要なことです。 重要なポイントはいくつもありますが、あえて絞るとすれば、以下7つです。
  • Data lake managementは基本中の基本
  • BrushUp Point / Benefit Lineをできるだけ絞り込む
  • 採用するプログラミング言語やライブラリ・IaaS・SaaS・ミドルウェアの哲学や文化背景を知る
  • Abstract roles to build
  • 作るメンバーを知る(社会の中で・チームの中で)
  • 不自由なエンジニアリングを認識する
また、全勝までのArchitecture Exampleでは、ほとんど同じ概念のストラクチャモデルを使って様々なシステムのアーキテクチャーの特徴を解説しました。
そのくらい、システムアーキテクチャの基本的な考え方には共通点が多いのです。
もう少し実装よりのチームだとSLOの明確な定義と共により具体なインフラ・アーキテクチャ・マップとして起こすことになりますが、簡易的なMicroServiceであれば、この粒度の概念と基本的なService Unitがあれば、システムの実装は始めることができます。むしろ、サービスの目的に応じたdata lakeの設計に多くの時間を使うべきです。

Data lakeは基本中の基本

2章の①でも触れました。 1つのデータに対して様々な利活用を模索する現代では、data lakeは基本中の基本です。 データのモデリングはMVCの時代から機械学習全盛の現在に至るまで、プログラミング言語に閉じることなく様々なレイヤーで実現されてきた概念ですが、これをどう実現するのか、は、週末のお酒をやめて一向にふける価値がある、興味尽きないテーマです。

BrushUp Point / Benefit Lineをできるだけ絞り込む

システム・アーキテクチャの中で、本当にブラッシュアップし続けなければならないポイントは限られています。そうしたポイントをいかにAsility高い状態に置くことができるか。これは優れた設計を象徴する最終的な目的とも言えます。ここが様々な制約から解放された形を作り出せたら、アーキテクトの仕事の80%は終わったと言えるでしょう。 ビジネスはまた流動的にその姿を変えますから、システムが追随できなくなったときに、再びアーキテクトの眠れない日々が始まるのですが。 そうしたリファクタリング、リアーキテクチャもまた醍醐味のひとつです。

なぜプログラミング言語やミドルウェアの哲学や文化が重要なのか?

昨今変化の激しいエンジニアリング環境ですから、プログラミング言語やミドルウェアのキャラクターもどんどん変わっていきます。 その変化のエコシステムの中で、多くの言語やミドルウェアを運営する各チームはお互いが行き着く先に迷うことがないよう「こういう方針で開発を継続している」という指針を出しています。また、それはチームごとの独自の哲学により運営されています。 システムアーキテクチャのベストプラクティスは、勝手に変わっていっているのではなく、お互いが相互して変え合っているということを認識すべきです。 あなたのサービスが社会のエンジニアリング資産を再利用しているだけの存在に見えても、それは幻想でしかありません。 データの利活用の立場に立ったとき、ほぼ全てのサービスはその哲学に相互に影響し合っている。 ことWEBサービスにおいては、そのことは断言できます。

Abstract roles to build

「役割を抽象化して設計する」 この過程を省くと、社会にある様々なシステムが持つ哲学の「今」の姿に踊らされて設計することになってしまいます。 すると、社会の流れを見誤った設計を生み出しがちです。 このことからわかるように、抽象化はあなたが運営するシステムの哲学そのものになり得ます。 一見すると自社サービスと捉えがちな手元のサービスも、スクレイパーや検索エンジンからすれば一つのサードパーティツールであり、気付けば人間にとってのdata lakeだったりします。 このようなサードパーティエコシステムの中で社会のツールやミドルウェアの奴隷にならないためには、同じく意見を言い合える芯が必要なのです。 設計を抽象化して理想を生み出し、それを実現する方法を考え、また壁にぶつかって理想をを調整する。これはアーキテクチャが上手くなる唯一の方法といえるでしょう。 USのエンジニアはこのAbstract roles to buildの能力に長けています。 それは、設計が抽象化されていればいるほど、結合が疎になるからです。それを体現した近年の一つの例が、マイクロサービスであるとも言えます。 Reactive Manifestoに代表される様々な抽象概念を経て、今尚「本当に作りやすいアーキテクチャとはなんなのか」を追い求めているのです。 またAbstract roleと前述したunknown(不明)の概念を理解すると、機械学習の挙動を容易にシステム・アーキテクチャに取り入れることができます。 こうして新しいキャラクターを持つ概念やインフラキャラクターが現れても、システム・アーキテクチャのベスト・プラクティスを見出す優れた方法を探し続けることが今のベスト・プラクティスそのものなのではないかと僕は考えています。

作るメンバーを知る(社会の中で・チームの中で)

あなたの管理するシステムがPHPで作られていて、並列分散処理を実装しなければならない程度にサービスが伸びたとしましょう。 優秀なメンバーの中に「実はここはPHPではなくGoを書きたいんだ」という意見を持っているメンバーがいたとしたら、pthreadsではなくてGoを選ぶ価値が十分にあります。 優秀なメンバーであればあるほど「自然な環境」でコードを書きたいと願います。独特のガベージコレクト実装の中でメモリリークに怯えながら書く(最近は違うかもしれない)よりは、それに向いた言語の習得を選ぶ勇気を持つメンバーは、長期的にみてアーキテクトの掛け替えのない友となりえます。 また、逆にそうした勇気を持つメンバーがいない状態での「自然な環境」は、社会とシンクロしていないローカルな存在でありながら、それがそのチームにいとってのベストプラクティスである可能性が十分あります。 システム・アーキテクチャの正解は社会の中にのみ存在するものではありません。 それを共に運営していくメンバーの存在は、その何万倍も規模が大きい社会と同じくらい大きく、尊重すべき存在です。 そして、チームの中でアーキテクチャの話をする際に、上記の「Abstract roles to build」を忘れないようにしてください。 ここからずれなければ、議論はどこまで深めても有用なものになり得ます。

不自由なエンジニアリングを認識する

最後になりました。(やっと書き終わる。笑) 上記のポイントを頭に入れたら、あなたにとって、チームにとって、不自由なエンジニアリングを探しに行きましょう。
  • より良いものを作ろうという活動の自由を奪うものを、不自由と呼ぶ。
  • 自由なエンジニアリングは「より自然に作れる状態」を言う。
その感覚を認識したときには、それはアーキテクチャの問題と捉えるべきです。アーキテクチャを再構築することを厭わないでください。 すでに不自由な状態に陥ったエンジニアリングの中での自由を探し出し、実現する道のりは長いですが、成長し続けているサービスであれば、その価値は十分にあります。 以上、MakuakeのCTO からのメッセージでした。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

Architecture Example ③:自販機公衆WiFi&サイネージ・システム

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
最後に、ちょっと組み込み機器が混ざった、リアルマイクロサービスか?とも言える様なシステム・アーキテクチャを紹介しましょう。 簡単に解説すると、自販機に液晶ディスプレイを組み込み、広告映像を配信するシステムです。 いくつかある主要な機能要件の中でこのアーキテクチャの肝となるのは以下の5つです。
  • 動画配信のための自販機組み込みプレイヤー(自販機のオープンスペース格納でき、余剰電力で稼働できるハードウェア)
  • 配信動画のスケジューリング・配信最適化アルゴリズム(これは後に動画Adとの連携により自動化されました)
  • 4G to WiFi Transform router
  • 閲覧者の判別と log management
  • アップデートと保守(点在した端末の管理)
全体としては以下の様な構造になってます。 ||| 構造図 |||
ハードプェアっぽい生理になっているが、本当はシステム・アーキテクチャとしての整理方針に揃えた方が見やすいかも。後日差し替えるかもしれません。

ポイント1:組み込みプレイヤー

まず、変えられない前提条件から見ていきましょう。 世の中の映像フォーマットのほとんどがh.264の時代でした。これは変更がきかない前提条件です。 また自販機は結構電力を食う上に、外気温に大きく左右されますから、実のところ組み込み前提の平均余剰電力って20W/hくらいしかなく、これで機能できるハードウェアとOSを積むことになります。 そして、最も辛いのは「ダメな時は落ちる」が前提になっていることです。当然プレイヤーもそれに付き合うことになります。 今だとこんな構成になるでしょう。
SBCROCK641080pを無理なく再生できるGPUを積んで10W程度で稼働できる SBCはいくつかありますが、コスパの面でこれになります
エンコーダーなし当時はハードウェアエンコーダを積みましたが、今ではSBCのGPUで十分ですね。
モニターOCB型低温高音・多湿などにも対応できる環境耐性のあるものを選択する必要があります。これは車載用ディスプレイとほぼ同じ機能要件です。ディスプレイ業界の進化は本当にすごい
電源モバイルバッテリー簡易UPSとしてモバイルバッテリーを利用します。これで瞬断どころか1~2時間の停電くらいであれば自販機は死んでもネットワークとサイネージのみが生き残りますし、基本的には自販機は災害でもない限り瞬断と入れ替え停止のみで済むので、停電時計測ノイズは無視できます。できない場合はUPS必須。
DatabaseH2Calculated Algorismをハンドリングするために、SQLiteよりは少し複雑なSQLを叩ける必要があり、PostgreSQL互換のこいつを採用しています。この案件は2011年ころのものですが、今でも組込系なら他に選択肢ないんじゃないかなぁ
Application Lang.jphpH2のせいでJREを積む羽目になる+アプリケーションはシンプルなので、ランタイム分の容量節約の意味も込めてJPHPを利用します。今だったらjrubyでもjythonでも何でもいいですね
記録媒体USBメモリ安価に調達できるものの中ではSDカードに次いでに低電力です。個体差がないのもとても扱いやすい のと、データレート的にも十分です。SDカードはスロットがSBCに採用されるケースが少ないので、必然的にUSBメモリとなります
CameraUSBカメラ動画視聴中の人を判別するためのカメラです。性別・年齢・ライフステージ・存在時間を計測するだけですが、24時間計測になるため、できるだけ暗所に強いものが求められます

ポイント2:配信動画のスケジューリング

端末は1,200台ありました。 それぞれに定常時の再生スケジュールと、来客時の配信アルゴリズムを設定してあげる必要があります。 このスケジューリング・配信最適化アルゴリズムを1台1台入れ替え流のは不可能なので、必然的に遠隔保守を構築する必要があります。 また、SBCにアルゴリズム計算をやらせると当然すぐに電力過多+自己発熱で死んでしまうので、基本的にはSBCの中ではCalculatedなデータとしてパースするだけで済む様に構成してあげる必要があります。こうすることで、アルゴリズム計算をホストサービス上で実装することができ、非力で便利なCircuitRunを使える様になります。 ※独自アルゴリズムは3年目で動画Adネットワークに接続されることで不要になりましたが、Calculatedパターンは組み込み配信では必須で、これは継続となりました。 | 配信アルゴリズム | CircuitRun(Python) | 

ポイント3:4G to WiFi Transform router

お気づきかと思いますが、アーキテクチャのポイントは一貫して低電力環境でいかにしてシステム駆動を実現するかです。 ネットワーク機器はハンドリングをミスると電力マネジメントに致命的な影響を及ぼしますので、非常に重要なポイントになります。 また、routerと映像再生は全く違う性能傾向を持つ(Computing resourceの使い方が違う)ので、まぜるな危険(いざという時にカーネルチューニングができる範囲が少なくなる)です。 端末を別で設計する際の着目点は性能傾向です。これはマイクロサービス設計にも通じる点です。
SBCROCK64WiFiモジュールを積んでいるのが1つの条件です。自販機WiFiは範囲が狭くていいので、SBCのWiFiモジュールで性能的には十分です
RouterOSMikroTikRouterOSはいくつか選択肢がありますが、保守性とSBCへの対応状況を考えると1つの最適解はMikroTik社のものになります。I/Fやコマンド系統にもクセがなく、扱いやすいです
4G今ならLPWA / eDRX4Gは通信規格よりは「その土地の電波状況」に大きく消費電力が左右されるので、幅広めの通信規格に対応しているものを選びます。
また、Router SBC と 動画配信SBCを WiFiでつないでいるのは、動画データのやり取りなどをするHigh MTU環境下では有線 to WiFiのスプリットコストが高いためです。 常時接続の安定性を求めない限りは、消費電力の点でも有利です。 2016年の論文ですが、最適な動画データやり取り時のMTUを算出する上でもかなり有用な考察になるので、参考掲載

ポイント4:閲覧者の判別と log management

LogデータはOpenCVベースに作られたアプリケーションで採取します。
  1. プロファイルデータを現在配信すべき映像の選定に用いる
  2. 閲覧興味度・滞在時間・滞在時刻などをフィードバック
が主な目的です。 ここでのポイントは「リトライ」と「不明」の取り扱いです。
リトライの話
SBCなどがアーキテクチャに入ってくるモデルの場合、SBCの環境がシビアであればあるほどSBC側の責務は疎通までにするのがいいと思います。 SBCから音沙汰があった場合、反応・応答が完了するまでリトライするのはホストサービスの役割にすべきです。 SBCの方が圧倒的に「予期しないエラー」に見舞われる可能性が高いからです。 これはQueueの概念をアーキテクチャに持ち込むときの責務関係の実装方針を決める際にもほとんど同じモデルでの検討になります。
不明の話
「不明」はデータなのか、データではない(エラー)なのか は、OpenCVなどが出てきて「測定がファジーな状態になってしまう」ことが当たり前な時代になって真剣に考えられる様になってきた側面ですが、一昔前は「不明とはできるだけあってはならない」というバイアスがありましたので、この当時のシステムでも、「できるだけ近い傾向に寄せる」という方針で「不明なし」という設計方針で実装されました。 しかし、最近はAIなどもシステムアーキテクチャのキャラクターとして出てくる様になって「どのくらい不明なのか」という指標もセット「不明なものは不明」という、もう少し論理的な「不明」に対する取り扱いが求められる様になってきました。 もう少ししたら、多くのプログラミング言語には、「null = 価値が存在しない」の様に「unknown = 不明」という概念が1つの型として追加されてくるかもしれません。 「不明」はベロシティを持つ概念として今絶賛研究されていて、データストラクチャとして新しい概念なのです。

ポイント5:アップデートと保守(点在した端末の管理)

ネットワークと動画配信を別な機器(別サービス)にした理由の大きな一つが、このアップデートと保守の考え方です。 1,200台のアップデートを4G回線を使って行うとなると、当時の回線試算で1台あたり3.5時間程度はかかる見込みでした。1,200台同時にアップデートも、1台1台アップデートも、ローリングデプロイも、どれも現実的な解になりえませんでした。 その多くはデイリーで行われるログのフィードバックと動画データの入れ替えによるネットワーク通信の待機時間で、Releaseそのものは数秒で済んでしまうという環境でしたので、当時はLocal BitTorrentを用いた波状型のデータトランスファ方式を用いました。 それでも数台はエラーが起きますので、そうした際には当時はリトライしか方法がありませんでしたが、今であれば検証性の検証にTemporary (Forked) blockchainなどの応用も有効かもしれません。

まとめ

ちょっとWEBから外れた話題が多い組み込み系の話なのですが、両方やっている身からすると、マイクロサービスの設計と組み込み系機器の構成の設計は「制約条件の確認」→「性能傾向のアレンジ」という初期の方針策定プロセスが非常によく似ていますので、紹介しました。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

Architecture Example ②:WEB接客システム

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
僕はこのタイプのシステムを人生で2度作るという経験をしました。(3度目の依頼がある) WEBシステムの中でも「大量のアクセスやシビアなシステム間連携からユーザーの属性や行動パターンを元に最適なコンテンツを判別し、出し分ける」というかなりADの配信サーバに似た設計思想になります。 ので、アドテクぽい設計の話は既存の社会資産 に譲るとして、このセクションはアドテクとWEB接客システムの最も違う点にフォーカスします。

CalculatedとProximate、Facedの同居

両者が最も異なる点は、WEB接客は
  • Calculated(大量のデータを元に算出し、サマライズした結果データ。よく混同されますが、BTAやシナリオ配信もこっちに含まれます)
  • Proximate(直近の行動データ)
  • Faced(今、何してる?)
が同居する点です。 最近はネイティブ・アドや動画ADなど、レコメンドの精度を重視するアドテクであればあるほど、訪問してからの感情反応データに着目する様になってきましたが、それを自社でやるというのがWEB接客ですから、Calculatedを来店(WEB訪問)時の前提として取得し、Proximateを観察しながら最終的なFacedに対して施策を出し分けていくというスタイルでのシナリオ設計をします。 この二つのデータは求められる性質が全く異なります。
  • Calculatedへの最重要要求:妥当性
  • Proximateへの最重要要求:正確性
  • Facedへの最重要要求:網羅性
Calculated、Facedへのアプローチはアドテクに習うところがたくさんあります。(というか、そのまま参考になる) が、Proximateへのアプローチは他に例がなく、苦労した点でした。 Proximateへ求められる正確性の例としては「来店者が男性であった場合、2回目の訪問で、初めに見たページがAで、次に見たページがBであった場合に指定したコンテンツを出したい」というものです。 構造は以下のようになっています。
3種類のデータを掛け合わせてActionをFeedbackする。
男性である点、2回目の訪問である点はKVSに保存されたCalculatedで判断できます。 次にページBについて、見たということを「記録する」のと「活用する」のタイミングが一緒に来ます。 なので、data aggregatorを介在して、保存されているProximateとたった今のFacedを統合しないと最終的なユーザーのステータスを判別できません。 Write / Readを使い分ける規模のアプリケーションを組んだことがある人ならばわかると思いますが、AuroraなどのクラウドデータベースはWriterへの書き込みからReaderからの読み取りまで、数ms~数十msのタイムラグがあります。 APIがそのタイムラグを待ってからレスポンスを返していたら、すぐにConnection数がいっぱいになってしまうので、そうならない様にFacedの概念が存在します。
Faced datastoreはbrowser上のcookie等を用います。session storeでも追いつかないからです。
さらに、Proximateが本当に正確かどうかを担保する必要があります。 ユーザーが次のページを見たときに、上記Queueで正確に書かれているかどうかを判別する必要がるのです。 これには二つの確認が必要です。
  • Databaseには既にページAを見たデータが書かれたか(Proximatedに含まれているか)
  • DatabaseにはなぜページAを見たデータが書かれていないか(Proximatedに含まれていない理由)
FacedはProximatedに正常に含まれるまでの揮発性データとしてハンドリングしなければなりません。 この時点で、ユーザーのブラウザはシステムの中のスケーラブル&アンコントローラブルな1アプリケーションとして考える必要があります。

Datastoreが発行するエラーの正確性

ここで着目したいのは、Datastoreが発行するエラーの正確性です。 Memcachedは非常にキャパシティの広いdatastoreですが、アーキテクチャの性質上「書きこめなかったことを正常にエラーで返せなくなる」ことがあります。これは、他のKVSでも同じ傾向が見られます。 対してRDBMSは、書きこめなかったことに対してのエラーバック率が、構造上ほぼ100%です。(落ちた場合も含めて)
2,000万inserts/s を5秒当てた場合のエラードロップ実験
Datastorereqsreceivedwaiterrors
Aurora100,000,00032,343,25563,221,4444,435,301
Memcached100,000,00078,834,12020,556,001609,771
Memcachedの方は数字が合いません。この分はerrorがドロップしているのです。 エラーはリトライすれば良いし、そのリトライが済むまでの間はFacedがProximatedの正確性を補完してくれます。 そのシステムは直前データの可用性担保目標を1,500msに設定していましたから、このデータエラーのドロップゼロは非常に心強く、どんなに書き込みレートが低くとも、そこに最終的に書かれているはず、を期待する先はAurora以外はありえせんでした。 上記は最もシンプルな例ですが、国内で作った方のシステムでは WEBフローティングウィンドウ上でのチャットも機能として実装していましたから、サードパーティのワンライナータグツールでありながら、かなりアプリケーショナブルなFrontendを提供しているサービスでした。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

Architecture Example ①:車のボディへの塗装噴霧コントロール

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
最初にdata lake managementの話をしたいので、ちょっとWEBから外れた話をします。(話題にする箇所のプロトコルはRESTですので許してください) 車のボディにカラーを噴霧塗布する装置がありますが、その噴霧を最適化するための機械学習型コントローラの話です。

ここでしない話

以下は話題が組み込みに寄りすぎるんで割愛します。
  • 噴霧機のコントロールI/Fの話
  • 噴霧状況と、塗布クオリティを確認するセンサーのI/Fの話

塗料のデリケートさに関連するパラメータ

塗料は本当にデリケートで、どんなに均一に塗られた麺を見ても、X-Lay Scannerで見ると少なからずまだら模様になっています。 こうしたマダラの薄いところから錆が浮いてきたり、厚いところの塗装がペラっと剥がれてきたり、ということが経年劣化とともに起こるのですが、均質な塗装は互いが補完しあって長持ちするとされており、そうした状態を目指して自動車の塗装工場では塗布機に様々な工夫が凝らされています。
  • 天気
  • 気温
  • 湿度
  • 定着照度
  • 室内照度
  • ボディの表面温度
  • 直前に塗布した塗料の付着率
など、様々なパラメータを解析しながら最適な噴霧量と噴霧圧を決めています。 こうした噴霧クオリティの最適化を自動化するために、機械学習型を導入するというプロジェクトでした。 サーモセンサー・X-Rayグラフ・Weather API・照度計など、様々なセンサーやpublic APIなど、様々なセンサーと接続し、データを集めます。 昔はどんなセンサーもSerial接続でしたが、今はほぼみんなREST APIを持っています。便利な時代になったもんです。 最終的な性能要件では、10秒単位で噴霧量と噴霧圧をコントロールし続けるとの希望です。
data lakeは要件の違う分起こすことになるが、解析自体はゆっくりでいいため、Proximateの段階で分けたりはしない。

性能要件の実現ジャーニーと切り分け

こうしたシステムの場合、要望として出る性能要件とセンサリングからのインプットを真に受けてストレートに実現しようという形ばかりが正解であるとは限りません。要は
  • 入口:様々なセンサーのデータを取得している
  • 出口:10秒単位で状況に応じた噴霧の最適化ができている
という点さえ克服できればいいわけです。 あとは、エンジニアの自由です。 これを実現するため、また、秒単位でドンドン蓄積していくデータを有効活用するため、という2軸があって、機械学習の導入が決まりました。 具体的には以下の様なステップを設計します。
  1. もれなく)センサーからのデータを収集
  2. 研究対象)データをモデリングしてdata lakeを生成し、raw dataはバックアップへ(バックアップはブラッシュアップが済んだら捨てる想定)
  3. 研究対象)噴霧データへのCalculate
  4. 正確性・回復性)噴霧コントローラ(1のデータも利用)
  5. もれなく)噴霧状況のフィードバック → 1に戻る
こうした角度で設計をあらかじめ済ませておくと、どこを先に固く作って、どこを柔らかく始めれば良いかが見えてきます。 また、1、4、5などの性能傾向が固い箇所は、それに合わせたアーキテクチャを採用し、できうる限り中に閉じた状態でシンプルに作り、他のシステムとの疎結合化を図ります。
黄色い箇所は実装の早い段階でArchitecture freezingし、ほぼ変更を加えない形とした。
||| 構造図 |||

data lake management

data lakeは「データを活用できる状態にすること」です。 どう活用できる状態になっているべきなのかを管理するのがdata lake managementです。 アーキテクチャ上は、溜まっているデータそのものに意味も価値もなくて、data lakeが済んだ状態で初めて価値が出ます。 なので出自が同じデータでも、その活用の方向性や頻度によって、全く違う保存の仕方を複数のdata storeに対して行うことがよくあります。 これは、入れたデータを万能に活用できるデータストアがまだ存在しないからです。 データストアそれぞれが特徴的な性能傾向を有している2018年では、アプリケーションエンジニアにはそれらをうまく使い分ける動きが求められます。 僕はよくdataの用途と傾向に合わせて
  • Faced(今目の前)
  • Proximate(計算しないでそのまま使う)
  • Calculatable(計算前のゴミ箱手前)
  • Calculated(計算後の即戦力)
  • Trash(ゴミ)
の4つのstatusを認識します。 これをセンサーデータに当てはめるとこうなります。
  • Faced
    • 室内照度
    • ボディの表面温度
    • 直前に塗布した塗料の付着率
  • Proximate
    • 定着照度
    • 天気
    • 気温
    • 湿度
  • Calculatable / Calculated
    • 定着照度
    • 天気
    • 気温
    • 湿度
    • 室内照度
    • ボディの表面温度
必ずしもmeceには分かれません。というか、meceには基本なりません。 活用目的が違うと、データは別なものと捉えるべきだからです。 そしてmeceでなければ、当然data to lakeに可逆性もありません。 こうしたdataのライフサイクルがはっきりしているシステムはdata lakeが作りやすい。 逆にいうと、データの活用を前面に押し出していきたいシステムであればあるほど、このデータ収集から活用までのステップを明確にすることが大切です。 そして、ブラッシュアップポイント(変更が著しく性能に影響する箇所)をできるだけ小さく切り出すこと。 これが、層の深いdata lake managementを求められるシステムアーキテクチャ設計のコツです。

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

システム・アーキテクチャのデザインパターン

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
WEBエンジニアにとっての最もシンプルなアーキテクチャ・デザインは前章で紹介したような静的なhtmlで作成され、WEBサーバに乗った例でしょう。 ようやく最後の章です。 本当は網羅的に解説するにはあと5つくらいの例が必要ですが、公開時間の関係で、その中でも最も基礎的な3例を紹介します。 続きは要望があれば、どこかのイベント用の資料にでも起こして解説します。 なお、全体的に一般的と思われるアーキテクチャについては社会資産がたくさんあるので、省きました。Let’s Google!

今回紹介するアーキテクチャ・デザインパターン

①車のボディへの塗装噴霧コントロール(data lake managementを基本的なアーキテクチャ・モデルを通じて考える) ②WEB接客システム(性能傾向の違うデータハンドリングをどう整理するかと、RDBMSの目立たない利点の話) ③自販機公衆WiFi&サイネージ・システム(マイクロサービス構想と組み込み機器中心のアーキテクチャの共通点)

機会があれば紹介する、ちょっと特殊なアーキテクチャ・デザインパターン

④遠隔演奏同期システム(オーケストラ版|音声のデータ化・演奏同期マネジメント・リカバリポイントの設計・ヘルシーさの算定・マシン・コントロールは専門性が高いので省きます) ⑤中型客船(航路フェリー)用のコンテンツマネジメントシステム(社会実装の活用と拠点deploy同期のコツ) ⑥多言語対応型スマホKIOSK(翻訳とコンテンツの切り分け方と、カスタマイズが多くなりがちなCMSの初期設計の留意ポイント) ⑦都道府県に拠点がある団体のための低ITリテラシー担当者向け会員マネジメントシステム(ダイナミックVPC・テクニカルな構造を採用しなければならない際の注意点) ⑧統合認証サービス(本質的な設計と、レガシーなシステムのぶら下がりに対しての対応案)

この記事はシリーズです。

一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

システム・アーキテクチャのベストプラクティス?

本記事はMakuake Product Team Advent Calendar 2018の23日目の記事です。
今日は僕の誕生日です。誕生日の7時間をかけて書きました。笑
こんにちわ。よーへいです。 今日はMakuakeのAdvent Calendar 2018ということで、エンジニアっぽい記事を書いてみようと思います。 あまりみられないシステムアーキテクチャの総論みたいな記事です 全部詳細に書くと書籍規模の話になってしまうので、適度に省いて、世の中にある情報はリンクにバンバン流していきます。

目次

  • 前段として
    • システム・アーキテクチャとは何か
  • システム・アーキテクチャのプラクティス
    • あとがき
      • アーキテクチャ・デザインにとって重要なこと
        • 不自由なエンジニアリング
        • システムアーキテクチャ・デザインの要素と角度
          • 誰が作るのか(社会の中で・会社の中で)
          • 材料の哲学と未来
        • 重要なのは多くのベスト・プラクティスを知ることそのものではない
    こんな感じで書いています。

    システム・アーキテクチャとは何か

    基本的にはどんなシステムも「データを管理し、それを利活用すること」が目的ですから、これを実現する、あるいはある期間実現し続ける機能を提供することが命題です。 システム・アーキテクチャはそのために最も適した構造をデザインすることです。

    WEBエンジニアにとっての最もシンプルな例を考えてみます

    これは、よく言われる「データベースがない静的なWEB」であっても例外ではなく、例えば以下の様なシンプルなhtmlであっても、生内は北海道生まれであることを伝えるための成分を構造化し、データとして完成させた上でhtmlフォーマットに組み込み、webサーバーアプリケーションに乗せてUIとして表現することを目的としています。
    <html>
        <head>
            <title>生内の秘密について</title>
        </head>
        <body>
            <h1>生内には秘密があります</h1>
            <dl>
                <dt>出身地</dt>
                <dd>北海道生まれです</dd>
            </dl>
        </body>
    </html>
    
    この機能を実現するために、例えば以下の様にRDBMSに作成したtableにdataを保存し、それをruby、PHPなどから読み取って表示するという選択肢もあります。

    table name “ikunai_secrets”

    titlebody
    出身地北海道生まれです
    上記例では同じくRedisなどのKVSにkeyとvalueの関係で保存しても構いませんし、csvやjson、xmlファイルなどでももちろん問題がありません。 また、上記の様にストラクチャを変更したとしてもシステムの目的は何ら変わりません。 データと機能の間をどう繋ぐかはエンジニアの自由です。 そして、そのシステムに期待される
    • 機能拡張性(maintenancibility)
    • 変容への俊敏性(Asility)
    • 過酷な利用条件(Hard Enviroment)・利用状況(Scalability)への耐性
    • 間違いやエラーへの回復性(Resilience)
    • 何よりもそのシステムの寿命(Lifecycle)
    など様々な要素を鑑みると、おのずと決定すべき構造が見えてきます。 もし上記の例であなたが何らかのDatabaseの採用を検討していたならば、それは未来の機能拡張性、たとえば
    titlebody
    出身地北海道生まれです
    性別男です
    となる様な未来を思い描いていたからでしょう。 このように「今と未来の姿」を両方考えた時に、アーキテクチャ・デザインのパターンは無限に広がります。 次の章ではWEBに限らず、僕が実際に書いたり構築したり、または関わったほんの一部の特徴的なシステム・アーキテクチャを肝となるポイントの解説を添えた形で実例として紹介していきましょう。

    この記事はシリーズです。

    一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方は、「各種エンジニア募集! クラウドファンディングMakuake」からご連絡ください。

    番外編)Razer Tiamat 7.1 V2でリアルサラウンド7.1chヘッドセットを気軽に導入|プレイユニット|SPLATOON アーキテクチャ・デザインパターン

    Splatoon Architecture番外編。リアルサラウンドヘッドセットの話です。
    こういうコンセプトの製品自体が市場でもかなり希少なのですが、更にアナログ入力インターフェースを持つ機種となると、絶滅危惧種のような存在です。
    今回は現行で存在する数少ないリアル7.1chサラウンドヘッドセットのRazer Tiamat 7.1の話です。

    PCゲーマーの間ではそこそこ有名なこのヘッドセットですが、7.1chをアナログで出力できる環境なんてPC以外だとそこそこ大げさなAVアンプ(しかもプリアウトを装備した機種に限られる)のユーザーでないと用意できません。
    PCですら7.1chサウンド出力に対応したマザーボードやサウンドカードが必要だったりと、PCゲーマーだからと言って誰でも恩恵にあずかれるかと言えばそうではありません。
    そういった導入敷居の高さから、なかなか普及しないのですが、このヘッドセットでTPSはFPSをプレイすると、音から得られる敵の位置や距離感などの情報量が飛躍的にアップします。
    これをなんとかスプラトゥーン2で利用できないかと考えてみました。
    なにせリアルサラウンドヘッドセット界は、ASUSのSTRIX 7.1をはじめとし、USB接続が主流(というかほとんど)なので、CS機にとってのRazer Tiamat 7.1 は最後の望みに近い存在なのです。

    有名なTPSである本ゲームですから、ネット上の先人も数名チャレンジしています。
    かくいう僕も適用に向けて先人の様々な情報を参考にしました。そうした先人の情報も敬意を込めて掲載しておきましょう。

    リアルサラウンドヘッドセットをCS機に適用する際に立ちはだかる2つの問題

    1. 音声信号を取り出す

    スプラトゥーン2はNintendo Switchのソフトですから、一般的なCS機で動作します。
    CS機には一般的にHDMI端子しか存在せず、Tiamat7.1に音声を送るには、HDMI信号から音声を分離する必要があります。
    また、SwitchのサラウンドはリニアPCM 5.1chというちょっと珍しい音質重視の仕様を採用しており、対応機材の調達にちょっと難儀します。(PS4も今やリニアPCMとビットストリームDTSのみとなりました)
    一般的に多く採用されているドルビーデジタルなどの規格はS/PDIFや光デジタル同軸などを通すことができるのですが、リニアPCMは圧縮なしの原音を通している関係で、デジタル規格ではHDMIかDisplayportでしか通すことができず、分離した時点でアナログの7.1chにする必要があり、この分離形式に対応した機材がまあ見つからないのです。

    現行(2018年9月現在)ではこの機種が有望です。
    https://www.amazon.co.jp/dp/B071CKBZJF/
    https://www.amazon.co.jp/dp/B076HMB31L/
    ※最近の中国メーカー系機材に多いAmazon上のOEM展開ですが、上記は同じものと考えられます。


    先人時代の機材はもはやディスコンとなってしまっており、今はこの機種一択です。(リニアPCM 7.1ch用は基本的に5.1chと互換です。残りの2chに音声が流れてこない、というだけです)
    なんかこう書くと先人の選定センスがないみたいな感じになりますがそうではなく、そのくらい需要が小さく、すぐディスコンになるような類の機材なだけです。
    皆さんも気になったらすぐ買いましょう。ここで紹介している機材もいつまで存在するかわかりません。

    また、この機材とTiamat 7.1を接続するには、RCAと3.5mmステレオミニジャックを変換するコネクタが3つ必要ですので、それも紹介しておきます。商品リンクは例で、同仕様のものであればなんでも構いません。
    ※7.1chを実現するには4つ必要ですが、Switchが5.1chのため今回は3つです。
    https://www.amazon.co.jp/gp/B06ZYHJX9S/

    2. サブウーファーチャンネルにバスリダイレクションを実現する

    バスリダイレクションとは、入力された音声信号を内部で周波数ごとに分離して鳴らす場合の主に低音成分のみを抽出するパートのことです。逆をハイリダイレクションと言います。

    例として3wayスピーカーの場合は入力音声をツイーター、ミドル、ウーファーの3つのコーンで最適に慣らすための周波数ごとに分離するチャンネルデバイダーという回路があります。
    チャンネルデバイダーはそれぞれにクロスオーバー周波数を設けて、そのコーンで鳴らす最適な周波数のみを抽出した信号を各コーンに送ります。そうして3wayスピーカーはコーン毎に不得意な周波数成分を取り払い、よどみない音を実現しているのです。

    PCのサウンドカードやマザーボードからの出力であればアプリケーションのイコライザやローパスフィルターで、CS機でもAVアンプであればサブウーファー用の端子に接続することで実現可能ですが、CS機の高価なAVアンプ無しの状態ではバスリダイレクションは実現することができませんでした。

    HDMIからの音声分離において、先人が提案していた機材も今回僕が提案した機材もバスリダイレクションには対応していません。
    これはなぜかというと、バスリダイレクションは再生側の機材の仕様に合わせて最適なクロスオーバー周波数や減衰幅を決定するので、音声ソース出力元や中継器で設定することにあまり意味がないからです。

    実はこのことは長年Tiamat7.1ユーザーの悩みのタネでした。
    わかっていながらサブウーファー端子をあえて刺さずに使っていたり、逆に音が軽くなることを覚悟してそのままさして使っていたり、このためにAVアンプを導入してプリアウトを利用して鳴らしていたりと、様々な環境でCS機へのTiamat適用を実現していたと思います。

    これを解決する機材を発見しました。

    バスリダイレクションのシンプルに実現する

    この機材を使用します。
    https://www.amazon.co.jp/gp/B07BVM276V/
    ※これも同一コンセプトのモジュールがいくつか存在します。レビューの具合などをみながら選定するのが良いかと思います。

    これはカーオーディオ用のサブウーファーの低音成分調節機ですが、我々がAVアンプやPCのイコライザ上で試行錯誤して発見したTiamat 7.1における最適なクロスオーバー周波数帯と減衰幅にほぼ一致しています。
    参考: https://www.4gamer.net/games/023/G002318/20130726110/
    しかもCO周波数・減衰幅共に無段階調節。また減衰のみの適用となるため、理論上も実際の仕様も電源不要。
    これをサブウーファーチャンネルの間に適用するだけで、高価なAVアンプを通した時と同様のバスリダイレクションが実現可能になります。
    ※実際に以前購入したYAMAHA RX-V777を通した音とバランス的にはほぼ同様の音がしました。エンハンス具合などはAVアンプさすがといったところではありますが。。。
    これはすごい。というか、こんな簡単な処理を挟むだけでもなかなかマッチした機材はないものです。

    そういう視点で探してみると、バスリダイレクション用の基盤自体はAmazonにもいくつも売られています。クロスオーバー周波数が固定でいいなら配線を分解して基盤を挟むという解決方法もありですね。

    これでリアルサラウンド5.1chを実現!

    これでリアルサラウンド5.1chを実現しました。Nintendo Switchにはサラウンドのテスト機能があるため、再生ボリュームのバランス調整も容易にできます。
    実際スプラトゥーン2をやってみると音からの情報が飛躍的に増しています。これで少しは強くなるかもしれない。。。!笑

    と、冒頭でも紹介した通り、Tiamatは7.1chです。7.1chと5.1chの違いについても触れておきましょう。
    5.1chと7.1chでは、Rearのサラウンドパートが存在するかどうかの違いがあり、違いという意味ではほぼそれのみです。
    「ほぼそれのみ」という言葉には意味があります。

    https://ja.wikipedia.org/wiki/サラウンド
    が示す通りサラウンドは5.1chのスピーカー配置が基本になっています。
    次が7.1chと5.1chのサラウンドパートの配置比較です。5.1chとよく似ており、サラウンドLRスピーカーの配置角度も調整範囲内に両者の一致部分が存在します。

    http://www.goodtheater.jp/knowledgesplayout.htm
    このことからわかるように、5.1ch再生のポテンシャルは十分に発揮されていると言えます。

    そしてまだRearの2chが残っています。
    これを何に使うか、をTiamatに最後に残された楽しみとして考えてみましょう。

    残されたRearチャンネルをボイスチャット専用として使ってみる。

    上記を配線したところで、Tiamat 7.1にはあとMicとRearの2つのチャンネルが残っています。
    これらを使ってボイスチャットのセットアップをしてみましょう。
    ここではiPhone / Discordを使ったボイスチャットを例にとります。
    といっても他の機材を利用したとしても、仕組みはほとんど変わりません。
    使う配線コネクタはこれです。同仕様のものであればなんでも構いません。
    https://www.amazon.co.jp/dp/B01BV916AQ/

    これを

    上図のように配線します。これでiPhoneでDiscordを立ち上げ、ボイスチャットを始めるだけで、Rearをボイスチャット専用チャンネルとし、5.1chでスプラトゥーンを楽しみながら後ろから仲間の声が聞こえてくるという形でのボイスチャットが可能です。
    ちょっとガンダムのコックピットに入っているような気分になります。

    分離がしっかりしている分、声のボリュームをそこまであげなくても聞こえるため、スプラトゥーンのボイスチャットに最適な形のひとつと言えるのではないかと思います。

    Tiamat 7.1は初期型とV2がありますが、初期型は下手するとmercariで10,000円くらいで買えたりする(し、スペックはV2とほとんど変わりません)ので、全部合わせても20,000〜25,000円程度の投資でスプラトゥーンでの5.1ch+ボイチャ環境が構築可能です。
    環境マニアの方はぜひお試しください。

    ②基本的なプレイユニットを突き詰める|ネットワーク環境|Splatoon アーキテクチャ・デザインパターン

    この回からは、単独プレイヤーに向けたデザインパターンを考えます。
    それはチーム戦においても、チームメンバーひとりひとりが使う基本的なプレイユニットに着目して仕様を突き詰めていくことに他ならず、プレイ環境上では最も大切な要素になります。

    単独プレイヤーに向けたデザインパターン(基本的なプレイユニットを突き詰める)

    1人のプレイヤーがSplatoonをプレイするための環境をプレイユニットと呼びましょう。
    これをどう突き詰めていくか、が今回のテーマです。

    今回のテーマで重要な突き詰め要素は

    • 数ms(ミリ秒)に向き合うために
    • 操作精度と戦う
    • 状況把握精度と戦う
    • 最適な機材の入手方法
    • 振り返りという武器を手に入れる
    • 可能な限りシンプルに(何を捨て、何を得るか)

    です。たくさんありますね。
    ひとつひとつ紐解いていましょう。

    数msに向き合うために

    これは、最もベーシックであり、どのプレイヤーも最初に解決策に目を向けるべき項目です。
    Splatoon、しいてはNintendo Swtichを取り巻く数msのロス原因を探り、解決方針を出していきましょう。

    ホームネットワーク

    これは、最もリーズナブルに解決できる可能性が高いポイントの一つです。
    ネットワークにおいて、気にすべき項目は、優先度順に安定性・応答速度・回線速度です。
    もしあなたの家が以下に示す様な条件下のネットワーク回線を利用してSplatoonをプレイしているならば、あなたが勝てない可能性の10%程度はネットワーク回線が握っているかもしれません。

    • 安定性 :回線落ちしないためには、安定性の高いホームネットワークへの接続方法が必要です
    • 応答速度:あなたが行なった操作を少しでも早くサーバーに届けるために、できるだけ応答速度の速い方法でホームネットワークに接続する必要があります
    • 回線速度:Splatoonに限って言えば、回線自体の通信速度は上り・下りとも1Mbpsも出ていれば十分と言われています。(実測もそのくらい)これを下回る回線を探す方が現代の日本では大変なので、無視していい観点かもしれません。

    応答速度の考え方と、目標性能値

    FPSプレイ時の目安として、 20ms前後 に総合的なタイムラグを押さえておきたい、という一つの目標があります。

    スプラトゥーン2の為にプロバイダをBIGLOBEに変えた


    では、FPSのプレイ時の目安として

    可能なら20ms、許せるのは40ms、70ms以上ならラグがあるって感じだったかな?

    と語っています。

    ラグがあると弾が当たってないのにやられたり、自インクの中から敵が出てきたりする。

    恐ろしいと思いませんか。心当たりはありませんか。
    快適なプレイ環境ができているかの指標として応答速度は大切なのです。
    ※ちなみに20ms付近はインターネット広告システムの一部に使われるデファクト的な目標応答速度としても知られています。このあたり見ると参考になるかな。

    https://books.google.co.jp/books?id=7iD9B10c1A8C&pg=PA530&lpg=PA530&dq=DSP+20ms&source=bl&ots=DCvk6eNhhU&sig=YkUq3sOYQhjoiAO-kDofv_BGslQ&hl=ja&sa=X&ved=2ahUKEwiyotPW6_3cAhWKWrwKHdkJAJ0Q6AEwBnoECAMQAQ#v=onepage&q=DSP%2020ms&f=false

    また、このブログでは、ネットワークに関する視点を以下の3つに捉えています。
    http://kanai6274.blogspot.com/2017/03/splatoon2.html

    • End-to-Endで有線・固定回線であること
    • 回線速度 上り下り 1Mbps が、常にでること
    • 対戦相手とのRTT(*)が常に低いこと(目安は50ミリ秒以下)

    上記は非常に良い整理です。
    また、同じ記事内のRTTとpingの考え方の違いも重要ですのでおさらいしておきましょう。

    (*)RTTとは、Round-Trip Timeのことで、自分が発したパケットが相手に届いて、それがまた自分に帰ってくるまでの時間(ミリ秒)のことです。一部の方は「ping値」と言ったりしていますが、これは誤用ですのでやめましょう。pingとはRTTを測定するツールの名前です。
    RTT = アプリケーション遅延 + 伝送遅延(ルータ処理) + 伝搬遅延(光ファイバ) + キューイング遅延 で表されます。

    この記事ではRTTの優劣を図る身近な基準であるping値を参考に、各セクションでの最適化方針を探っていきましょう。

    有線LAN接続を導入する

    Switchを無線LANに接続していて、さらにその無線LANルータが古めの規格のものである場合、Switch – ルーター間の接続を有線接続に切り替えることで応答速度が改善する場合があります。

    ゲーミングPCは無線と有線どちらで繋ぐべきか


    では、

    一昔前は有線なら100MBで10Pingなのに、無線だと6MBで50Pingみたいな感じだったのですが…無線規格の進化により、少なくともPing応答速度が明らかに遅すぎるという事はありません。

    というコメントを書いています。
    最近の無線規格であればあるほどその差は小さいですが、有意な差があることは明確です。
    また加えて回線の 安定性 が増し「回線落ちが格段に減る」というのが有線の何者にも代えがたいメリットです。

    最近のネットワーク接続規格を見てみると、回線速度は有線よりも速い!みたいな規格がざらにあり、時には有線にした方が数値上遅い、ということもありますが、最初に言った通り、 回線速度 はネットワークFPSにおいてはどの規格も十分に速いので、その違いは無視できることもお伝えしておきます。
    あくまでこのセクションで補強する重要な要素は 応答速度安定性 なのです。

    ★有線LAN接続機器はこれが良さそう
    ギガビット対応USB-LANアダプタ
    https://www.amazon.co.jp/dp/B00VSGJ7BI/

    IPoE系光の固定回線を導入する

    まずはじめに、ネットワーク回線そのものの方式を考えると、答えはひとつ、理想はフレッツに代表されるIPoE系の固定回線です。
    この環境にて、ネットワーク遅延の指標に用いられるping値は
    9〜20ms程度
    です。これが、家庭における目指すべきネットワーク環境のMAXとなります。

    この固定の光回線に比べて、その他の環境がいかに我々を不利にさせているかを見てみましょう。

    この記事をご覧ください。
    スマホのテザリングや、WiMAXなど、無線通信系のping値について触れています。
    https://ワイmax.com/netgame/
    ping値は50〜70ms程度
    です。我々が目指す応答速度の3〜7倍近い差があります。
    相手の操作が反映されるまでの時間が、環境強者の3〜7倍あるということです。

    また、他の通信形式も並べてみますと、概ね次のような感じです。

    IPoE系光回線 > 非IPoE系光回線 > USENなどの集中コントロール型光回線 > ADSL > 大手モバイルルーター系・WiMAX・スマホテザリング
    

    この状況を改善するには、やはりより品質の高い回線方式と、プロバイダを選ぶべきです。

    同じ光回線でも、IPoE系光回線、非IPoE系光回線、USENなどの集中コントロール型光回線 は応答速度の観点から言うと別物です。
    MVNOの回線がネイティブ御三家に比べてワンテンポ分モッサリするのと宿命的理屈は似ていて、通信経路の中継キャラクターが多い分不利なのです。

    ★応答速度で光回線を選ぶなら、やっぱりNTTのお膝元になってしまう。どうしても。
    BIGLOBEの光回線
    https://www.b-hikari.com/

    追記:Gaming+というESports専用を謳っている回線を発見しました。
    これも僕は使って見たことはないですが、IPv4 over IPv6 IPoE方式を利用しています。
    さらなる高みを目指す方は試す価値があるんじゃないでしょうか。
    https://www.gaming-plus.net

    ちなみに我が家の通信環境はこんな感じです。(計測はSPEED TESTが便利です)

    BIGLOBEやソフトバンク光などと同じく、プロバイダを介さない IPv4 ovre IPv6 IPoE のauひかりです。
    これにGoogle WiFiの3台メッシュの構成です。

    マンションタイプで無線接続PCからの計測なので、少し上乗せされている事を鑑みると結構頑張ってると思います。

    さて、いきなり骨の折れる改善案も出てきているかとは思いますが、該当する方は、これらを解決するだけでもかなりストレスが減るかと思います。
    上記を全て満たした同士の対戦であれば、通信経路的にはこのような感じ。

    数msへの向き合い方はまだあります。
    次回はネットワーク以外の数msへの向き合い方を考えます。

    Makuakeで一緒にエンジニアリングしませんか。
    https://www.wantedly.com/companies/makuake?ql=gaJpZM4ATBNM

    Splatoon アーキテクチャ・デザインパターン①Splatoonの基本的な世界観

    これはSplatoonのための記事ですが、Splatoonのプレイが上達するためのヒントを与えるものではありません。
    SplatoonをはじめとしたFPSはゲーム環境を整えていく過程もまた非常にアーキテクティブで楽しい工程なので、そんな点に着目しました。
    このテーマは、事業におけるプロダクト構想や、事業ドメインの観察から見出すアーキテクチャの設計方針などの工程と、非常に良く似ています。
    ちょうど仕事上の役目がそんなですから、頭の体操にと書きはじめたシリーズです。
    とりあえず、飽きるまで書いてみます。

    Splatoonの基本的な世界観

    Splatoon上では「オンラインで世界の誰かと戦う、もしくは協力する。」という非常にわかりやすい世界観が展開されています。
    世界観の基本的な構築要素は以下の通りです。(ストーリーモードは除く)

    • 基本的にチーム行動。4人1チーム。
    • 単独参加の場合は4人のそれぞれ単独の参加者が自動的にマッチングしてチームを結成
    • ペア参加の場合は2ペアがマッチングしてチームを形成
    • チーム対戦は1:1で、複数チームが同じステージで同時に対戦することはない
    • ステージはすべて対面対象

    また、バトル参加者にはタイムアップの概念は存在しても、死んでゲームオーバーという概念は存在しません。
    バトルに参加した場合は不幸にも撃ち抜かれて死んでも何度でも蘇りながら、時間いっぱいその場を楽しむことになります。
    バトルには以下のバリエーションの明確な目的が設定され、チームはその目的の達成のために、それぞれの役割を精一杯こなし、勝利を目指すことになります。

    • ナワバリバトル(3分):時間内により多くの面積を塗ったほうが勝利
    • ガチヤグラ(5分):乗ると進むヤグラを、設定されたゴールまで進めると勝利
    • ガチホコ(5分):メガ粒子砲の様なものを発射できるホコを持ち、相手陣地の奥にあるホコ台まで運べば勝利
    • ガチエリア(5分):指定されたエリアを一定時間、一定面積以上塗りつぶし続けられたら勝利
    • ガチアサリ(5分):アサリを10個集めるとできるデカアサリでゴール膜を破り、一定以上のアサリをゴールに放り込めたら勝利

    シンプルな目的を達成するためのバトルをひたすらループし続けるだけのゲームですが、
    世界のNintendoが何年にもわたって改良し続けてきただけあって、バトルの進行は非常に刹那的かつ戦略的であるにも関わらず、ものの3〜5分で結果が出るという子気味良いサイクルも相まって、非常に中毒性があります。
    うちの妻はほとんど子供の頃にゲームをやってこなかったにも関わらず、Minecraftに次いでこのゲームにどっぷりはまってしまいました。

    この凝縮された世界観をどのくらい濃く楽しむことができるかは、ゲーム環境にかかっています。
    シビアなFPSはどれもそうですが、数msのタイムラグが勝敗を分ける世界です。
    突き詰めれば突き詰めるほど、オンライン越しには見えない有利な環境を作り出すことができます。
    上記の様なテーマ、我々エンジニアの出番だと思いませんか。

    突き詰めの要素は様々ですが、このシリーズでは以下のどれかにフォーカスした様なテーマを取り扱います。
    書きながらやっていますので、こんなテーマに着目してほしい、などあればリクエストもらえたら検討します。

    • 数ms(ミリ秒)に向き合うために
    • 操作精度と戦う
    • 状況把握精度と戦う
    • チーム・コミュニケーション
    • 最適な機材の入手方法
    • 振り返りという武器を手に入れる
    • 可能な限りシンプルに(何を捨て、何を得るか)

    次回からは単独プレイに関する環境を考えます。

    ところで、Makuakeで一緒にエンジニアリングしませんか。
    https://www.wantedly.com/companies/makuake?ql=gaJpZM4ATBNM

    Google I/Oのキーノートを見た感想としては

    Google I/Oのキーノートを見た感想としては、Google自体の潮流は去年に引き続きAR/VR/AIからそんなにずれていない。

    直接的な詳細は各所の記事が語るところですが、AIアプローチ自体はGoogle Assistantsのcontinuous communicationや、Google Newsに回帰してのsuggestion推しに見られように、AIのアウトプットバリエーションを次から次へと試している、というのが印象的で、aiは会話はセルフメイクできるようになったもののそれだけではレスポンスの表現方法として不十分で、今はYoutubeや画像検索で持ってこれる既存の世の中にあるコンテンツをサジェストする形でそれ以外のレスポンスを提供していますが、これがサジェスト同士の組み合わせに進化し、いずれ言語以外のアウトプットレスポンスも自己生成出来るような未来を見据えているんじゃないかというような内容でした。

    Android Pなどもそういったアプローチの一部かなという気がしていて、GoogleはDigital Adsをやってサジェストの基盤を作り、Youtubeで最も集めにくいと言われた動画コンテンツを集め続け、Androidでユーザーに最も近い距離から語りかけて意見を聞くことができるような端末を普及させたわけで、逆三角形組織の中でその辻褄の合わせ方、これまでのアセットのひとつひとつを関連づける形で意味を持たせて組み立てて行くkeynoteの感じはさすが、の一言でした。
    Tech conferenceではやはりFirebaseの進化が見逃せない話題になりそうな感触です。

    Silicon Valley自体は投資家の興味も含めてblockchain側に移行しつつあるようだったのでGoogleはどう出るのか、というのは気になる点だったのですが、今のところ表側は我関せずを決め込んでいました。
    相変わらず、やるなあ、といった印象です。

    全体的に、あくまで表側のキャッチーアプローチのみの話です。
    しかし、呆れるくらい天気が良かった。ほんと大好きだなー。あの土地。

    今回は滞在先のエンジニア達にも感謝と敬意を評して英訳も載せます。

    Share the impression of seeing Google I / O first day.
    The tide of Google itself has not changed from AR / VR / AI as last year.

    Direct commentary will be left to articles in various places.
    The AI ​​approach

    • Google Assistants’ continuous communication
    • Returning to Google News to revive suggestion channel

    It was impressive that I tried output variations of AI from next to next such as.
    AI can now create a conversation by itself, but that alone is insufficient as a way of expressing responses.
    Currently it offers a response other than words by suggesting existing content that is brought up on Youtube videos and image search, but this evolved into a combination of content that was subsequently suggested, and output other than language I felt that I was looking at the future that I could self-generate responses.

    I think that Android P and others are part of such approach.

    • Google did the Digital Ads and made the foundation for the suggestion
    • Continued collecting the most difficult to collect video content on Youtube
    • Spreads devices that can speak from the nearest distance to Android users

    The feeling of keynote, which seems to have assembled with meaning in a way to associate each one of the assets so far in the retrograde trial organization of the product in the retrofitting strategy of the product was one word of truth.

    At the Tech conference, it seems that the evolution of Firebase can be a topic that can not be overlooked again.
    Design Accessibility, and AR, we seemed to be aiming for a dashboard platform that expresses “how technology is becoming more friendly to people” on the basis of keywords.

    Silicon Valley itself seemed to be shifting to blockchain side including investor’s interest.
    Google was wondering what kind of feature it will prepare in this conference.
    For the moment I decided not participating in the front side.

    However, the weather is amazing enough.

    I am poor at English, so I wrote it as sentences.