2017年10月4日水曜日

AWS Summit Tokyo 2016 | 【ディライトワークス様登壇】Fate/Grand Order における、ディライトワークス流 AWS 導入&活用術

【ディライトワークス様登壇】Fate/Grand Order における、ディライトワークス流 AWS 導入&活用術 (今井 守生,田村 祐樹)

参加時のメモ

Fate/Grand Order
ディライトワークス
 500万DL

元々はMicroSrvice Azure
2015/07 リリース
2015/10 移行を決定
2015/12 移行を実施

会社の立ち上げ直後 (最初のプロダクト?
クライアントサイドはUnity(C#)
サーバサイドもC# コードの共通化、学習コスト
----
2,000-3000 r/s
10,000 qps (read)
4,000 qps(write

IIS(Game Server)
mysql 5.6
redis 2.8
----
ログイン時に同期
- ユーザアクションをトリガーで差分同期
- フレンド情報に関してのみ一定期間毎に同期

ボトルネックはMysql
- commit時に0.5sec slowquery
  数秒おきにI/O性能が落ちていた
  Premium Storage(P30)を使うことで解決
- レプリ遅延
  salveをRAID 0に変更
  I/Oバリア機能を無効化
  I/Oスケジューラを cfg->noop
  => 参照をmasterに向ける
- DBサーバのメモリ枯渇でswap頻発

前部れのないサーバダウンが1ヶ月に3回(Redis 2回、Mysqlで1回)
 - 冗長構成をとってなかった。。
 - IaaS毎のダウンタイム比較するとAzureは結構長かった
------------------------
windows Server 12 R2
elastic beanstalk

30サーバ
3,000-5000 r/s
20,000 qps (read)
8,000 qps(write

スカイアーチネットワークに移管を助力。今も運用業務を
---------
Z-forward-forヘッダ
Azure依存コードの置き換え
iPhonのproxyでAWS環境に向けてリリーズ済バイナリでテストプレイ
深夜メンテ、Azure->AWSのレプリを逆に張り替える(切り戻し

innod_db_read_thread/write_thread を増やした。
-> ○○○○○(名前忘れた)のパラメータを0に設定したら、スレッド詰まって死亡した。適切に上限設定しておく
公式ドキュメントをよもう! ブログは理由が書かれてないことあるので注意

JJUG CCC 2015 Spring | M-6 MQTTの使いどころ 〜軽量プロトコルで低コストにデータを集めよう〜

M-6 MQTTの使いどころ 〜軽量プロトコルで低コストにデータを集めよう〜 遊佐 浩史 (株式会社アルゴ)

一昨年のJJUG参加時のメモ。


phaho(Eclipse M2M)
- http://m2m.demos.ibm.com/whiteboard/
- https://projects.eclipse.org/projects/technology.paho
- http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mm.tc.doc/tc10100_.htm?lang=ja
MQTT 3.1.1 (OASIS 標準化)
-----------------------------
TCP/IP
Pubsub protocol
ツリー型のトピック
小さなヘッダーサイズ
- 2~4バイト (httpは100byte~1000byte)

QOS:0 到達保証なし
QOS:1 到達保証あり
QOS:2 一度の到達の保証あり(重複なし)
- Brokerががんばる必要がある
http://www.slideshare.net/BryanBoyd/mqtt-austin-api
http://sssslide.com/speakerdeck.com/voluntas/chu-metefalse-mqtt
------------------------------
MQTTの規格上暗号化通信は定められていない
- SSL/TLS上で行う必要がある
- 2段階認証等は遅れている
------------------------------
MQTTライブラリ
- https://eclipse.org/paho/
専用のm2リポジトリ上で公開されている
repoeclipse.org/content/repositorities/paho-release/
------------------------------
http://mqtt-helper.mybluemix.net/
web上のclient
------------------------------
Webサービスへの適用
http://www.slideshare.net/gschmutz/io-t-architekturv10
------------------------------

http://www.itmedia.co.jp/news/articles/1110/31/news023.html
https://www.facebook.com/notes/facebook-engineering/building-facebook-messenger/10150259350998920

マイクロサービスアーキテクチャ(MSA)キャッチアップ

[MSA 概要]
http://martinfowler.com/articles/microservices.html
http://martinfowler.com/bliki/MicroservicePremium.html
http://monkey.org/~marius/funsrv.pdf

[MSA Runtime]
https://www.typesafe.com/products/conductr
https://istio.io/

[MSA Practice]
http://www.slideshare.net/knoldus/finagle-by-twitter-engineer/
https://engineering.riotgames.com/news/chat-service-architecture-persistence
http://monkey.org/~marius/scala2015.pdf
http://monkey.org/~marius/redux.html
http://okapies.hateblo.jp/entry/2014/11/25/010416

[MSA Tools]
https://github.com/Netflix/
https://github.com/openzipkin/
https://twitter.github.io/finagle/

2017年8月20日日曜日

GIFアニメにLGTMロゴを合成する

フレームレート(Delay)を調べる

$ identify -verbose animation.gif | grep "Delay"
 Delay: 20x100

ここで調べたDelay値を再合成時のdelayパラメータに指定する
(この場合は、100分の20秒毎にアニメーション、フレームレート換算すると5fps相当)

GIFファイルをフレーム単位に分割する

$ convert -coalesce animation.gif part%d.png
or 
$ convert +adjoin -coalesce animation.gif conv/%02d.gif
  • +adjoin: 画像分割するためのオプション(無くても分割できるかもしれない)
  • -coalesce: フレーム差分のみの画像が出力されるのを抑制するために指定

LGTMを合成する

LGTMの透過画像を準備しておくこと
$ for i in `seq -w 0 10`; do 
  composite -gravity center -compose over lgtm_320.png  conv/${i}.png tmp/${i}.png ; 
done
  • -gravity center: 位置を指定
  • -compose over image1.png image2.png : image2.pngの上にimage1.pngを重ね合せる

画像からGIFアニメを作成

$ convert -delay 10 -layers optimize tmp/*.png lgtm.gif
  • -delay: 1枚の画像を100分のx秒間表示する. ffmpegコマンド実行時に指定したフレームレートから計算して指定
  • -layers optimize: 最適化オプション.

おまけ: トリミングしたい

convert -crop 285x285+5+15! -resize 300 pngs/*.png  tmp/%d.png
基準座標から5x15pxの位置から285x285pxで画像を切り出し、300x300pxに拡大する

mp4からLGTMを作成する

動画の前処理をしてサイズを落とす

$ ffmpeg -ss 3200 -t 100 -i input.mp4 -an output.mp4
  • ss: 開始位置(sec)
  • t: トリミング期間(sec)
  • an: 音声を出力しない
  • -i: 入力ファイル

動画ファイルからpng画像に変換する

$ ffmpeg -i output.mp4 -an -r 10 -vf crop=406:406:0:157 pngs/%04d.png
 or 
$ ffmpeg -i output.mp4 -an -r 10 -s 320x240 pngs/%04d.png
  • -r : フレームレート(1秒間に何フレーム抽出するか)
  • -vf crop : 動画のフィルタリング
  • -vf crop : 出力結果のトリミング(出力サイズx:y:トリミング開始位置x:y)
  • -s : リサイズ(出力サイズ) : 640x480 等

LGTMを合成する

LGTMの透過画像を準備しておくこと
$ for i in {101..200}; do 
  composite -gravity center -compose over lgtm_320.png  pngs/${i}.png tmp/${i}.png ; 
done
  • -gravity center: 位置を指定
  • -compose over image1.png image2.png : image2.pngの上にimage1.pngを重ね合せる

画像からGIFアニメを作成

$ convert -delay 10 -layers optimize tmp/*.png lgtm.gif
  • -delay: 1枚の画像を100分のx秒間表示する. ffmpegコマンド実行時に指定したフレームレートから計算して指定
  • -layers optimize: 最適化オプション.

(オプション)サイズを調整する

$ convert lgtm.gif -coalesce -colors 64 -geometry 320 opt.gif 
  • -coalesce -colors: 減色処理
  • -geometry: 画像の縦横サイズを変更する. 縦横比は維持されるため長辺のサイズを指定してやる

2017年1月1日日曜日

bitbucketのprivateレポジトリにCIツールからアクセスできない場合

トラブルシューティング

status code:128でエラーが出る場合(jenkins)

ソースコード管理システムでGitを選択して、正しいURIを設定しても以下のようなエラーが表示される場合がある
Failed to connect to repository : Command "git ls-remote -h git@bitbucket.org:accountname/reponame.git HEAD" returned status code 128:
stdout: 
stderr: fatal: The remote end hung up unexpectedly
このエラーが出る場合、known_hostsに登録されていないためにエラーになるケースがある。
その場合は、CIツールの実行ユーザで一度適当なgitコマンドを実行してみる。 (cloneしてきたリポジトリはすぐに消して問題ない
sudo -u jenkins git clone git@bitbucket.org:accountname/reponame.git
Cloning into reponame...
The authenticity of host 'bitbucket.org (131.103.20.168)' can't be established.
RSA key fingerprint is 72:6e:1a:f2:9f:14:10:5c:b4:ec:a8:46:61:74:32:42.
Are you sure you want to continue connecting (yes/no)? *yes*

ポート22が使えない場合

インフラの都合上FW外へのポート22がブロックされている場合、 bitbucketはssh over httpsをサポートしているため、以下のURIを設定することでhttps(ポート443)で接続可能。
ssh://git@altssh.bitbucket.org:443/accountname/reponame/

2016年12月23日金曜日

GAEのOutbound IP address確認方法

概要

GoogleAppEngine(GAE)上に構築したアプリケーションからのアクセスをwhitelist形式で許可したい場合など、接続元IPでアクセス制限を行う際のIPアドレス(の範囲)を調べる方法
ちなみに、公式ドキュメントにも明記されていますが、今のところGAEからの外部へのアクセス時のIPアドレス(Outboud IP addres)を固定化は出来ない(らしい)ため、GAE全体のIPアドレスのレンジとしてしか調べられません。
※ 第三者の悪質なGAEアプリケーションも同じIPアドレス範囲を共有するため、根本的にはIPアドレス以外の方法でアクセス制限が推奨されています。

https://cloud.google.com/appengine/kb/#static-ip


確認方法

公式ドキュメントの内容を雑にスクリトに落としただけですが、 以下のスクリプトを実行してもらえればIP Addressのレンジを取得できます。
#!/bin/bash
includes=`nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8 \
| tr ' ' '\n' | grep include | sed "s/include:\(.*\)/\1/g"`
for include in $includes; do
  nslookup -q=TXT $include 8.8.8.8 | tr ' ' '\n' | grep ip | sed "s/ip[4,6]:\(.*\)/\1/g"
done