Blog

タグ・月別アーカイブ

「GDM vol.39 エンジニア向け勉強会」の感想

とてつもなく感動したので記録を取っておく。

序

2019/12/20 にヒカリエで DeNA 主宰のエンジニア向け勉強会に出席しました。

サーバー“コード”レスアーキテクチャ、とは

自分の雑な理解では

  • クライアントはサーバーにバイナリデータ(以下DAO)としてデータを保存する、DAOはC#の一定の形式のクラスを便利SDKで保存できる
  • サーバーは基本的にデータの中身は感知しない、1APIを1トランザクションとする Key-Value ストア
  • サーバーは、ガチャ・課金等、重要な要素ではサーバ側マスターデータで定義された抽象的なトークンをルールに基づいて発行するが、トークンのDAOへのマッピングは感知しない
  • クライアントは上のトークンをDAOへと変換するトランザクションをもって消費する、APIとしては冪等性がある
  • 汎用的な改竄対策がクライアント・通信共にある
  • 別途プレイヤのバイナリデータをJSON等でエクスポートしてDWHに流して非同期に分析するパスはある
  • 汎用的なサーバAPI実装と、ゲーム固有のAPI実装の両方があるが、前者だけでも最低限は成立する

シーケンス的なもの

伝統的実装

Traditional

ロジックはサーバー側だけにあり、APIを投げて結果を受け取るという、伝統的な実装です。
常に通信結果を待つので、通信環境次第ではストレスになり得ます。

一部非同期実装

SyncAsync

ロジックはサーバーとクライアントにあり、一部の結果が完全に予測できるAPIのみは同時に実行することで、レスポンスをよくしようとする実装です。
サーバーとクライアントに同じロジックを載せるので辛い。

どこかで、こういう実装をしていた気がします。

サーバー“コード”レスアーキテクチャ

ServerCodeLess

ロジックはクライアントにのみもち、サーバーではロジックを実行しません。ガチャの部分はややこしく見えますが、サーバーではダイスだけを振り、DB(DAO)への反映ロジックは全てクライアントの仕事になります。

一目見て、チート大丈夫?って感想を持つと思いますが、DAOの中身を非同期に監査することが可能です。最終的にチーターがBANされていれば問題は少ない。

DAO は Deserializer を使って変換した上でとることのできる対策として

  • DAOの状態を変更するC#のDLLとしてビルドをしたものでチェックを行う
    これだと監査タイミングが任意になるだけで、理論的には全チェックが可能ですね
  • 機械学習で異常値の検出を行う(多段防御の一つとして)
  • 緩めな判定ロジックをしこむ(1日に可能なバトル実行回数だとか、課金量あたりでのアイテム増加量であるとか)

DAOへの変更LogicをUnity非依存のアセンブリに記述することを徹底していたり、 重要なLogicの前後でのDAOさえ送信されていればどうにでもなる感じがします。

Advent Calender を書いた経緯等の日記

アドベントカレンダーで書いた記事 多脚戦車に乗ろう についての日記です。

11/17(日) 秋葉原

娘がキッザニアに行っている間に、一人で秋葉原行ったわけです。

秋葉原散策中に娘がキッザニアのお土産コーナーでとげまるとフォロを迷っていたと聞いて、自分でもサイトで見てみたら、何これカッコいい、自分も欲しい!
それで、ツクモロボット王国にフォロを買いにいったのでした。

フォロは売っていなくて、売り場にあったVR220カメラをラズパイzeroと合わせて買ってしまったのです。衝動買いってやつです。時雨堂の V (@voluntas) さんのツイートでラズパイで WebRTC 楽勝っていう記憶が勝因でした。

ちなみに娘は、迷った末にとげまるにしていました。家でビックカメラ通販にフォロを発注しました。

11/18(月) 実装1日目

仕事が終わった後の夜中にOSをインストールしたり、ピンヘッダをハンマーで打ち込んだり。
WebRTC/momo は簡単に sample ページを表示できてうひょーってなる。

11/19(火)

スイッチサイエンスに部品を色々発注。作業はなし。

11/20(水) 実装2日目

ビックカメラから在庫ないから取り寄せってメールがきて、カッとなってヨドバシ通販に発注。
夜中に WebGL/three.js を使って球面表示もさっくりと。便利な世の中ね。

11/21(木)

スイッチサイエンスの部品が届いた。

11/22(金)

フォロが届いた。

11/23(土) 組み立て

フォロを組み立てる、かわいい。

11/24(月)

夜中にフォロとモータードライバー、繋ごうとしたらピッチの問題でつながらない。
半田する気合もなく、amazon に発注して放置。

11/26(水) 実装3日目

ビックカメラのフォロが届く。こちらは娘に。

amazon の荷物が届いたので、やはり夜中にヒャッホーってモーター周りを実装。
twitter に動画を投稿したの初めてだよ。

11/28(金)

社内で Advent Calendar の記事書く人を募集していたので、ちょうどやっていたこれを書くことに。
転職したてで、これといって書けることがなかったので助かりました。

12/3(火) 半田付け

半田でケーブルを最小限の長さで作り直した。

12/7(土)

12月1~3日に記事を書きあげて、無事に記事公開。
社内のみなさん力強い記事書いていてスゴイ。

おまけ

調子に乗って RaspberryPi 4B+ と Jetson nano を購入して手元にありますが、12/7 に発注した 4k 球面USB カメラはまだ到着しておりません。

Github Pages + SPA で Google Index をめぐる戦い

SPA化

標題そのものは各所のドキュメントで問題なく行えました。

blog は Markdown を json でまとめて、SPA 側で html にレンダリングしています。しかし、めんどい。

Google Search Index

atom.xml

blog 部分は、md から json 化して index を作っているので、index を作るときについでに atom.xml を作成。

sitemap.xml

面倒なので、SPA を自前 crawler で適当になめて sitemap.xml を作成。puppeteer とても良い。

https://github.com/Bugfire/create_sitemap に自分用の設定で適当に置いてあります。

Hash based router

最初は Hash based router (http://foobar.com/#/hoge/foo みたいなやつ)を使っていましたが、Hash だけ別の場合は Google 様は同じ URL とみなすので、全ページ同じ URL となり index されませんでした。

Push state router

しょうがないので普通の router を使う。

1. 404 に index.html を置く

404.html に index.html をおいたら、全てのアクセスが一個のファイルで動くじゃん俺天才、と思ってやってみましたが、動作は
しましたが、status 404 の場合は一切 index されないという悲しい結果に。

2. 404 から index.html?url 経由で開く

ちょっと調べた感じでは、これでいけるとありましたが、自分は index されませんでした。

3. あらゆる全ての箇所に index.html を置く

大変bakaです。sitemap に存在する全ての URL に index.html をコピー。いいんです、index.html はたったの 2616 バイトなんです。sitemap がとても役に立った、いやっほ!?

4. おまけ

Github Pages は、
http://foobar.com/XXX/YYY => XXX/YYY.html
http://foobar.com/XXX/YYY/ => XXX/YYY/index.html
と区別をしよう!

Container Station API

Container Station (QNAP) に Web API あるのですね。
本当、知らないことだらけです。

http://qnap-dev.github.io/container-station-api/system.html

login して session cookie をもらう形式(かつexpireが短い)なので、admin の ID/pass をシリアライズする必要はありますが、terraform 化できそうな感じですね

Golang の勉強がてら作り始めた Container Station の状態表示 CLI

https://github.com/Bugfire/qnapcc

Golang は初めて書くのでいろいろおかしいかもしれません。

QNAP日記 2019-09-30

家で動かしている QNAP を色々更新していました。

Refactoring

QNAP 屋内サービスのコード・構成のリファクタリング

  • docker-compose を使うように変更
  • docker-compose で syslog に投げる
  • JavaScript で作ったものを TypeScript にリファクタリング
  • npm package の update, http から axios への書き換え
  • Dockerfile で マルチステージビルドを使って image の削減
  • TypeScript で共通処理部分を切り出し

みたいなことをしていました。

Pi2B to Nature Remo

今まで、特に意味もなく Raspberry Pi 2B の USB 温度計で部屋の温度をとって DB に放り込んでいました。それを今回 NAS 側に移しました。

温度取得を QNAP の Docker + Nature Remo の方の API に切り替えた結果、湿度と照度を追加で取得できるようになりました。

地味に unbound が動いていた (dns blacklist を作っていた) のに気が付いていなくて、突然名前が引けなくなって、急遽ルーターの設定を変更。

uptime が 1000 日以上だったので、トラブルもなく安定してよく動いていたな、と思いました。(Security update は置いておいて)

hardware EOL and new device

過去の構成は:

  • TS-259Pro - Surveillance Station & DB & Backup
  • TS-651 - Docker & FileSharing

購入してから6年くらいの TS-269Pro の EOL が近づいて来ていたので、TS-453Be を購入しました。新構成は:

  • TS-651 - Surveillance Station & DB & Backup
  • TS-453Be - Docker & FileSharing

TS-453Be を SSDx2 の構成にしたら、11~13W くらいの電力消費におちつきました。CPU を全然回していないとはいえ、最高ですね?

TS-651 は SSDx2 HDDx2 で 37W くらいです。SSDで電気代が月500円安くなったとして、5年で3万円、過去の書き込みレートだと 60G/day くらいだったので、1年で21TBW、5年なら100TBW、TBW的にはいけそうですが、まだまだ容量単価がつらい。
(TimeMachine 等の Backup も兼ねているので、あまり容量を削れない)

Surveillance Station の課金が別 NAS に移行できないので、QVR Pro を試しているのですが重いねコレ...。

メモリー追加

ついでに、両方ともメモリーを 16G にしました。Container も Surveillance もメモリ喰いですし。

メモリーはだいすきな SanMax の DDR3L-1866 の 8Gx2 です。もちろん QNAP での動作保証はありません。

SanMax (サンマックス)
SMD-N16G28CTP-18ML-D-BK

よくセールになっていますね。

10GbE

去年末に購入した MacMini の 10GbE が一度も使われていないので、Hub 共々買い揃えたいと思いつつもまだ高いし、消費電力凄そうで躊躇してます。