SlideShare a Scribd company logo
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
GoCon 2015 Winter
FINAL FANTASY Record Keeperを支えた
Golang
2015/12/06
GDI 渋川よしき
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
お前だれよ?
 前職
⁃ 自動車会社の社内SE
 現職
⁃ 社内ゲームエンジン用のフレームワーク
(クライアント用もサーバ用も)作ったり、
開発支援ツール作ったりいわゆる社内SE
⁃ たまにゲーム開発を手伝ったりもします。
渋川 よしき
 プログラミング
 C++とかPythonとかGolangとかJavaScriptとか
 本
 つまみぐい勉強法、アート・オブ・コミュニティ(翻訳)、
Mobageを支える技術、オブジェクト指向JavaScript(翻訳)、
ポモドーロ・テクニック入門(翻訳)、etc
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
©SQUARE ENIX CO., LTD. ©DeNA Co., Ltd.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
前回までのあらすじ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
FFRKマスターデータ運用改善
http://www.slideshare.net/dena_study/final-fantasy-record-keeper
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
まとめ: どういうところで使ったか?
 ゲームのマスターデータ
⁃ マスターデータというのはプログラムでも絵でも音でもない要素
⁃ キャラクタや敵や技のパラメータ、ダンジョンの難易度、
シナリオの文言、チュートリアル設計etc
⁃ 3Dの世界になると、レベルデザイナーなどさらに分業化している
が、DeNAでは3つの役割に分担している
• エンジニア: プログラム
• アーティスト: 絵とかアニメーションとかUIデザイン
• プランナー: マスターデータ
 Google Drive上にあるスプレッドシートに入ったマスターデータの元
データからゲームサーバが使えるフォーマットに変換するツールを
Golangで書いたら、Google Apps Scriptよりも100倍早くなったよ
今日は実装部分の話をします
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ラフな全体像
ファイル一覧
のシート取得
ファイル一覧で指定
された名前のファイル
のキーのリストを作成フォルダの全子要素の
キーと名前を取得
ファイルをダウンロード
ファイルをロードし、
JSONSheet /
JSONFormatを分析
•RefListTemplateを元に
値の置き換え
•CSV出力
 Jenkins上で実行されるコマンドラインプログラム
⁃ 開発者の手元でも実行できる
 他にもいくつかサポートのプログラムが何本かいる(差分レポート作成
とか)
同名のシートで
グループ化
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
今日のレシピ
 使っている開発環境・ライブラリ
 並列処理の実装と並列処理のログ出力
 Google APIのアクセス頻度を制御する
 diff(文字単位、行単位、blameの実装)
 xlsxファイルの読み込みと高速化
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
使っている開発環境・ライブラリ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
使っている環境・ライブラリ
 IntelliJ IDEA + golang-idea-plugin
⁃ https://github.com/go-lang-plugin-org/go-lang-idea-plugin
⁃ VimはなるべくデフォルトにしておきたいのでIDE
⁃ pluginはどんどん改善されたりしている(が不安定な部分も)
⁃ 英語のスペルチェッカーが地味便利
 Sphinx
⁃ ドキュメントツール (http://sphinx-users.jp)
⁃ 使い方を説明する4択クイズも作れる!(作った)
 github.com/jessevdk/go-flags (MIT)
⁃ コマンドライン引数のパース
⁃ short/long、同じ引数を複数回指定、きれいなヘルプテキスト出力
あたりが良かった
⁃ 構造体のタグで指定する
• 多言語化しにくいという欠点があるので言語ごとに構造体を作って切り替
えという苦肉の策
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 github.com/google/google-api-go-client (MIT)
⁃ Google APIにアクセスするためのライブラリ
 github.com/tealeg/xlsx (BSD style)
⁃ xlsxを読み書きできるPure Goライブラリ
 github.com/sergi/go-diff (MIT/オリジナルはAPL v2)
⁃ Googleの Diff, Match and PatchライブラリのGolang移植
 github.com/bkaradzic/go-lz4 (BSD)
⁃ 高速なファイル圧縮・展開ライブラリのPure Go版
 github.com/OneOfOne/xxhash (APL v2)
⁃ lz4内でも使われている高速ハッシュアルゴリズムのPure Go実装。
 github.com/ugorji/go/codec (MIT)
⁃ msgpack/jsonとかいろいろなシリアライズのライブラリ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 github.com/mattn/go-colorable (MIT)
⁃ 信頼と安心のmattnプロダクツ
⁃ Windowsでも他の環境でもコンソール出力に色が付く!
 github.com/mgutz/ansi (MIT)
⁃ mattnプロダクツと一緒に使える色付け用の便利関数
 github.com/jteeuwen/go-bindata (Public Domain)
⁃ バイナリの中にファイルを入れちゃうツール
⁃ HTMLテンプレートとgoogle APIアクセストークン、デフォルト値
のJSONあたりを連結してます
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 golang.org/x/oauth2
⁃ OAuth2
 golang.org/x/text/unicode/norm
⁃ ユニコードの正規化(NFDからNFC)関連
⁃ Mac OS Xを嫌いになる前に
 github.com/xeipuuv/gojsonschema (APL v2)
⁃ JSONスキーマのバリデーションライブラリ
⁃ ツールが戦魂チームで魔改造されたときに追加されてた
 github.com/nicksnyder/go-i18n (MIT)
⁃ 国際化するためのライブラリ
⁃ JSONで翻訳を指定する。単数・複数で訳文の使い分けもできる
⁃ http://qiita.com/shibukawa/items/f0e4df597e62372fe7d5
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
並列処理の実装とログ出力
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
並列処理
 汎用のスレッドプールを作ってみて、大量アクセス時はそれだけを使っ
ている
⁃ Google Driveでフォルダの中の情報のアクセス
⁃ xlsxのダウンロード
⁃ xlsxの読み込み
⁃ 同名のシートごとにデータ分析・変換
⁃ 同名のシートごとにCSV/JSON/TSV/HTML等で出力
 ジョブを途中から追加できるようにして貪欲的に処理を行えるようにし
たがその機能は使わず
⁃ OOMキラーに殺されまくったので、メモリ使用量の削減のために
処理を適度の中断してそれぞれの段階で枝刈りを積極的に行う方向
に方針転換
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 使っているところのイメージ
この中の処理を全タスクに対して適当にスレッドプールを使って
並列で処理する
これがジョブ一覧の入ったキュー
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
並列処理のログ出力
 そのまま出力しても順序が混ざってしまって読みにくくなってしまう
 グループ情報付きのエラー出力関数を作って、一旦メモリに貯めておい
てグループごとに分類して出力するようにした。
 APIアクセスエラーとか、入力ファイル名間違いなどの致命的な問題は
log.Fatal()するが、読み込んだ後は基本的に最後まで完走する設計にし
ている。
 コンソールに出力したらJenkinsがそのまま表示してくれるので出しっ
ぱなし。JenkinsのText FinderプラグインでWARNINGの文字を見つけ
たら不安定(Unstable)扱いにしている。
グループ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Google APIのアクセス制御
 ユーザごとの秒間アクセス数をGoogle Developer Consoleで設定して
も、それより大分下のアクセス頻度で403 User Rate Limit Exceeded
が出る件
⁃ 昔は数千でも設定できたけど、最近10回/秒までしか増やせなく
なったっぽい。ちなみに10億/日なのでフルにアクセスしても
0.1%しか行かない!
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 time.Tickerを使って、アクセス頻度の制御を行うようにした
 APIアクセスする関数(スレッドプールで並列で動いていても)の中で、
下記のAPIThrottling()関数を呼び出すと、呼び出しが適当に間引かれ
て実行されるようになった
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
diffの実装(文字単位/blameの実装)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Diff, Match, Patch
 Google製のライブラリ。基本的にはこれを使っておけば間違いない
⁃ https://neil.fraser.name/software/diff_match_patch/svn/trun
k/demos/demo_diff.html
 このライブラリの基本設計としては、まずできるだけ細かい文字単位
diffを計算して、その後適度な粒度になるようにパラメータをチューニ
ングしながらクリーンナップするという2段階で実行する方式のAPIに
なっている
 なんというかクセがあるからサンプルに従うのが良さそう
今日私は朝ごはんを食べました。
明日私はお酒を飲みに行きます。
今明日私は朝ごはんお酒を
食べ飲みに行きましたす。
今明日私は朝ごはんを食べまし
たお酒を飲みに行きます。
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
使い方
 文字単位diff
 セマンティックに従ってdiffをマージ
 行単位diff
⁃ http://qiita.com/shibukawa/items/dd75ad01e623c4c1166b
before := “今日私は朝ごはんを食べました。”
after := “明日私はお酒を飲みに行きます。”
dmp := diffmatchpatch.New()
result := dmp.DiffMain(before, after, true)
dmp := diffmatchpatch.New()
tmp := dmp.DiffMain(before, after, true)
result := dmp.DiffCleanupEfficiency(tmp)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 最終的な出力はdiffmatchpatch.Diff構造体の配列
⁃ テキストと、操作(そのまま、追加、削除)の情報を持つ
 Diff構造体配列を抜き出して見やすい出力にする
⁃ ↓変化しない項目と、削除された項目だけを表示。削除された項目
には text-decoration: line-through; と赤色を付ける。
⁃ ↑変化しない項目と、追加された項目だけを表示。追加された項目
には緑色を付ける
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
diffの応用: blameコマンド
 スプレッドシートでもgit blameしたくなるってことあるよね!
 シートの行ごとに、最終編集者と変更日時を表示させることも可能です
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
blameの実装
1. まずはGoogle Driveにアクセスして落とせるだけの全リビジョンのス
プレッドシートをxlsx形式で落とします。
2. 新・旧ファイルをCSV化して、行区切りの文字列配列を作ります
⁃ (実際はオンメモリ処理です, 説明のため1シートだけ扱います)
1000, “たたかう”, “敵1体を通常攻撃”
1001, “ケアルガ”, “対象のHPを回復”
1003, “ファイラ”, “炎属性魔法攻撃(効果: 小)
1000, “たたかう”, “敵1体を通常攻撃”
1001, “ケアルガ”, “対象のHPを回復”
1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
1000, “たたかう”, “敵1体を通常攻撃”
1001, “ケアルガ”, “対象のHPを回復”
1002, “ファイア”, “炎属性魔法攻撃(効果: 小)
1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
3. 古い方からの2つ取り出して行単位差分を取ります
3. 追加されていればその行は新(index: 1)で追加された、維持であれば旧
(index: 0)で更新されたとみなし(削除は無視)、その行がどのファイル
由来のものかを記憶していく
4. 新しいファイルと、その次のファイルを取り出し、同じように行のイ
ンデックスを更新していく。これを最後のファイルまで続けていく
1000, “たたかう”, “敵1体を通常攻撃”
1001, “ケアルガ”, “対象のHPを回復”
1003, “ファイラ”, “炎属性魔法攻撃(効果: 小)
1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
0: 1000, “たたかう”, “敵1体を通常攻撃”
0: 1001, “ケアルガ”, “対象のHPを回復”
1003, “ファイラ”, “炎属性魔法攻撃(効果: 小)
1: 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
0: 1000, “たたかう”, “敵1体を通常攻撃”
0: 1001, “ケアルガ”, “対象のHPを回復”
2: 1002, “ファイア”, “炎属性魔法攻撃(効果: 小)
1: 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
xlsxの読み込みと高速化
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
xlsxのロード
 github.com/tealeg/xlsxがオンリーワンの選択肢。これでOK?
⁃ ではなかった。
• ポインタで持つべき所を実体で大量に持ってメモリを食っていたり、構造
体のメンバーが初期化されてないところがあったり、先頭の空行が勝手に
省略されて行がずれてたり、生成されたxlsxファイルがExcelで読み込めな
かったり・・・
⁃ バグ修正のPull Requestを送り、ついでにセルのタイプ(数値型や
Boolean型など)を取得できるように機能拡張もした。
⁃ 今もたくさんユーザがいて、スタイルなども扱えるように修正され
続けているし、基本的に良いライブラリです
⁃ xlsxのライブラリで困ったらPythonのopenpyxlを参照すると良い
です。MS製のXMLスキーマを使ったユニットテストもしていて、
困ったときのリファレンス実装として役立ちます。
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 しかし、xlsxのパースは重い
⁃ xlsxのロードがツールのボトルネックに(90%以上の時間)
⁃ プロファイラで計測しても、標準ライブラリの中ばかり・・・
• zipの展開は重い
• XMLのパースは重い
• XMLタグ構造体のインスタンス作成が重い
• golangの構造体にマッピングするencoding/xmlは遅い?
⁃ タグのパースなどを事前にやることで高速だよ!というJSONパーサも
あるぐらい
• ついでにxlsxライブラリがセルごとに構造体を作っちゃうのも遅い
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
軽量xlsx的なモジュールを作成
 APIはtealeg/xlsxとは少し違うけどなるべく同じに
⁃ セルは構造体を作らず行のオブジェクトに配列でデータを持たせる
 github.com/ugorji/go/codecを使ってファイルとの読み書きをする
⁃ これだけでmsgpack, binc, cbor, jsonの読み書きができる
⁃ サイズを減らすためにlz4で圧縮もかけた
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
処理時間の推移
 オリジナルのxlsxのまま読み書き
⁃ ダウンロードをキャッシュ済みの場合でも40秒ほど
 JSON + lz4で圧縮のキャッシュ化
⁃ スタイル情報とかもなくなるのでファイルサイズも1/2〜1/5
⁃ メモリ使用量も1/3ぐらいに
⁃ 処理時間は15秒ぐらいに
 MessagePack + lz4で圧縮のキャッシュ化
⁃ ファイルサイズはJSON+lz4とほぼ同じ
⁃ 処理時間は6秒ぐらいに
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
まとめ
 Excel/Google Spreadsheetを中心としたテキストの分析・加工のコー
ドならGoでガンガン書ける
⁃ 表計算は非プログラマとのコミュニケーションツール
• 読み書きソロバンExcelの時代
⁃ 使える人は多いし、Excelの読み書きができれば最速ではないかも
しれないけど90%のビジネスは回る
⁃ Goは速いので業務上のボトルネックを全力で叩き潰すのに便利
⁃ 文字列中心の処理でもC++ほどやる気が消耗しない
 Pure Goのライブラリも数多くでてきて、言語の後方互換性も高いので、
使える資産がどんどん増えている
⁃ リファレンスしかなくて使い方が良くわからないライブラリも多い
ので、Qiitaとかでどんどん発信しましょう
⁃ まだまだ成熟してないライブラリも多いので、いっぱいPR出そう

More Related Content

What's hot

FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
dena_study
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
 
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム SakashoについてDeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
Makoto Haruyama
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
CloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようCloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しよう
Eiji KOMINAMI
 
AWS CognitoからAuth0への移行パターン4つ
AWS CognitoからAuth0への移行パターン4つAWS CognitoからAuth0への移行パターン4つ
AWS CognitoからAuth0への移行パターン4つ
株式会社スタジオメッシュ
 
App013 ここはあえて紙と
App013 ここはあえて紙とApp013 ここはあえて紙と
App013 ここはあえて紙と
Tech Summit 2016
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
Yusuke Suzuki
 
Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法
Takeshi Fukuhara
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
ファイルシステム比較
ファイルシステム比較ファイルシステム比較
ファイルシステム比較
NaoyaFukuda
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
FIDO2導入してみたを考えてみた
FIDO2導入してみたを考えてみたFIDO2導入してみたを考えてみた
FIDO2導入してみたを考えてみた
FIDO Alliance
 
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディングオタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
虎の穴 開発室
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
A AOKI
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
Amazon Web Services Japan
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
Naoya Nakazawa
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
Yuki Tamura
 

What's hot (20)

FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム SakashoについてDeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
 
CloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようCloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しよう
 
AWS CognitoからAuth0への移行パターン4つ
AWS CognitoからAuth0への移行パターン4つAWS CognitoからAuth0への移行パターン4つ
AWS CognitoからAuth0への移行パターン4つ
 
App013 ここはあえて紙と
App013 ここはあえて紙とApp013 ここはあえて紙と
App013 ここはあえて紙と
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
 
Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法Azure Monitor Logで実現するモダンな管理手法
Azure Monitor Logで実現するモダンな管理手法
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
ファイルシステム比較
ファイルシステム比較ファイルシステム比較
ファイルシステム比較
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
FIDO2導入してみたを考えてみた
FIDO2導入してみたを考えてみたFIDO2導入してみたを考えてみた
FIDO2導入してみたを考えてみた
 
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディングオタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
オタクエンジニアを熱くさせる!モチベーションをあげるチームビルディング
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
 

Viewers also liked

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
Yuji Otani
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
 
GopherFest 2017 - Adding Context to NATS
GopherFest 2017 -  Adding Context to NATSGopherFest 2017 -  Adding Context to NATS
GopherFest 2017 - Adding Context to NATS
wallyqs
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Yuji Otani
 
Golang
GolangGolang
Introduction to Go programming
Introduction to Go programmingIntroduction to Go programming
Introduction to Go programming
Exotel
 
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
Yusei Yamanaka
 
Database sql
Database sqlDatabase sql
Database sql
明 高橋
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座Yusei Yamanaka
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
Go入門
Go入門Go入門
Go入門
Takuya Ueda
 
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Corporation
 

Viewers also liked (12)

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
 
GopherFest 2017 - Adding Context to NATS
GopherFest 2017 -  Adding Context to NATSGopherFest 2017 -  Adding Context to NATS
GopherFest 2017 - Adding Context to NATS
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
 
Golang
GolangGolang
Golang
 
Introduction to Go programming
Introduction to Go programmingIntroduction to Go programming
Introduction to Go programming
 
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
 
Database sql
Database sqlDatabase sql
Database sql
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Go入門
Go入門Go入門
Go入門
 
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法
 

Similar to FINAL FANTASY Record Keeperを支えたGolang

Mithril
MithrilMithril
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題IGDA Japan
 
L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"
det coder
 
Golang tokyo #7 qtpm
Golang tokyo #7 qtpmGolang tokyo #7 qtpm
Golang tokyo #7 qtpm
Yoshiki Shibukawa
 
Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。
Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。
Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。
ひさし App
 
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
Web Technology Corp.
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechconUnityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
DeNA
 
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
Satoshi Yamafuji
 
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
Web Technology Corp.
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンスKaoru NAKAMURA
 
会議室を現場にする! リアルタイム共同編集によるプロトタイピング
会議室を現場にする! リアルタイム共同編集によるプロトタイピング会議室を現場にする! リアルタイム共同編集によるプロトタイピング
会議室を現場にする! リアルタイム共同編集によるプロトタイピング
Masaru Nagaku
 
DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)
denatech2016
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
Takahito Tejima
 
FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術
dena_study
 
Firefox DevTools
Firefox DevToolsFirefox DevTools
Firefox DevTools
dynamis
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術
Toru Yamaguchi
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
Drecom Co., Ltd.
 
Cerebro for VFX / Animation Japan
Cerebro for VFX / Animation JapanCerebro for VFX / Animation Japan
Cerebro for VFX / Animation Japan
CineSoft
 
Cocos2d-xハンズオンセミナー
Cocos2d-xハンズオンセミナーCocos2d-xハンズオンセミナー
Cocos2d-xハンズオンセミナー
Chukong Technologies Japan
 
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
Nobutaka Takushima
 

Similar to FINAL FANTASY Record Keeperを支えたGolang (20)

Mithril
MithrilMithril
Mithril
 
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
 
L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"
 
Golang tokyo #7 qtpm
Golang tokyo #7 qtpmGolang tokyo #7 qtpm
Golang tokyo #7 qtpm
 
Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。
Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。
Html5conference2012 yota hisamichi_世界に向けたスマートフォンゲームを支える、 greeのテクニカルアーティストについて。
 
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechconUnityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
 
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
 
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
改めて注目される2D アニメーションツール SpriteStudio ~国産2Dツールが(舶来ゲームエンジンの力を借りながら)世界へ~
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンス
 
会議室を現場にする! リアルタイム共同編集によるプロトタイピング
会議室を現場にする! リアルタイム共同編集によるプロトタイピング会議室を現場にする! リアルタイム共同編集によるプロトタイピング
会議室を現場にする! リアルタイム共同編集によるプロトタイピング
 
DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)DeNAのゲーム開発を支える技術 (クライアントサイド編)
DeNAのゲーム開発を支える技術 (クライアントサイド編)
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術
 
Firefox DevTools
Firefox DevToolsFirefox DevTools
Firefox DevTools
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
Cerebro for VFX / Animation Japan
Cerebro for VFX / Animation JapanCerebro for VFX / Animation Japan
Cerebro for VFX / Animation Japan
 
Cocos2d-xハンズオンセミナー
Cocos2d-xハンズオンセミナーCocos2d-xハンズオンセミナー
Cocos2d-xハンズオンセミナー
 
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
 

More from Yoshiki Shibukawa

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
Yoshiki Shibukawa
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
Yoshiki Shibukawa
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
Yoshiki Shibukawa
 
Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and Errors
Yoshiki Shibukawa
 
Excelの話
Excelの話Excelの話
Excelの話
Yoshiki Shibukawa
 
アンラーニング
アンラーニングアンラーニング
アンラーニング
Yoshiki Shibukawa
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
Yoshiki Shibukawa
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
Yoshiki Shibukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Yoshiki Shibukawa
 
大規模JavaScript開発
大規模JavaScript開発大規模JavaScript開発
大規模JavaScript開発
Yoshiki Shibukawa
 
Xpjug基調lt2011
Xpjug基調lt2011Xpjug基調lt2011
Xpjug基調lt2011
Yoshiki Shibukawa
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript Programming
Yoshiki Shibukawa
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会Yoshiki Shibukawa
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」Yoshiki Shibukawa
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。Yoshiki Shibukawa
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30
Yoshiki Shibukawa
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Yoshiki Shibukawa
 

More from Yoshiki Shibukawa (20)

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
 
Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and Errors
 
Excelの話
Excelの話Excelの話
Excelの話
 
アンラーニング
アンラーニングアンラーニング
アンラーニング
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
 
大規模JavaScript開発
大規模JavaScript開発大規模JavaScript開発
大規模JavaScript開発
 
Xpjug基調lt2011
Xpjug基調lt2011Xpjug基調lt2011
Xpjug基調lt2011
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript Programming
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会
 
Pomodoro technique
Pomodoro techniquePomodoro technique
Pomodoro technique
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
 
Bitbucket&mercurial
Bitbucket&mercurialBitbucket&mercurial
Bitbucket&mercurial
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。
 
Erlang and I and Sphinx.
Erlang and I and Sphinx.Erlang and I and Sphinx.
Erlang and I and Sphinx.
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?
 

Recently uploaded

論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 

Recently uploaded (16)

論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 

FINAL FANTASY Record Keeperを支えたGolang

  • 1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. GoCon 2015 Winter FINAL FANTASY Record Keeperを支えた Golang 2015/12/06 GDI 渋川よしき
  • 2. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. お前だれよ?  前職 ⁃ 自動車会社の社内SE  現職 ⁃ 社内ゲームエンジン用のフレームワーク (クライアント用もサーバ用も)作ったり、 開発支援ツール作ったりいわゆる社内SE ⁃ たまにゲーム開発を手伝ったりもします。 渋川 よしき  プログラミング  C++とかPythonとかGolangとかJavaScriptとか  本  つまみぐい勉強法、アート・オブ・コミュニティ(翻訳)、 Mobageを支える技術、オブジェクト指向JavaScript(翻訳)、 ポモドーロ・テクニック入門(翻訳)、etc
  • 3. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ©SQUARE ENIX CO., LTD. ©DeNA Co., Ltd.
  • 4. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 前回までのあらすじ
  • 5. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. FFRKマスターデータ運用改善 http://www.slideshare.net/dena_study/final-fantasy-record-keeper
  • 6. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. まとめ: どういうところで使ったか?  ゲームのマスターデータ ⁃ マスターデータというのはプログラムでも絵でも音でもない要素 ⁃ キャラクタや敵や技のパラメータ、ダンジョンの難易度、 シナリオの文言、チュートリアル設計etc ⁃ 3Dの世界になると、レベルデザイナーなどさらに分業化している が、DeNAでは3つの役割に分担している • エンジニア: プログラム • アーティスト: 絵とかアニメーションとかUIデザイン • プランナー: マスターデータ  Google Drive上にあるスプレッドシートに入ったマスターデータの元 データからゲームサーバが使えるフォーマットに変換するツールを Golangで書いたら、Google Apps Scriptよりも100倍早くなったよ 今日は実装部分の話をします
  • 7. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ラフな全体像 ファイル一覧 のシート取得 ファイル一覧で指定 された名前のファイル のキーのリストを作成フォルダの全子要素の キーと名前を取得 ファイルをダウンロード ファイルをロードし、 JSONSheet / JSONFormatを分析 •RefListTemplateを元に 値の置き換え •CSV出力  Jenkins上で実行されるコマンドラインプログラム ⁃ 開発者の手元でも実行できる  他にもいくつかサポートのプログラムが何本かいる(差分レポート作成 とか) 同名のシートで グループ化
  • 8. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 今日のレシピ  使っている開発環境・ライブラリ  並列処理の実装と並列処理のログ出力  Google APIのアクセス頻度を制御する  diff(文字単位、行単位、blameの実装)  xlsxファイルの読み込みと高速化
  • 9. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 使っている開発環境・ライブラリ
  • 10. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 使っている環境・ライブラリ  IntelliJ IDEA + golang-idea-plugin ⁃ https://github.com/go-lang-plugin-org/go-lang-idea-plugin ⁃ VimはなるべくデフォルトにしておきたいのでIDE ⁃ pluginはどんどん改善されたりしている(が不安定な部分も) ⁃ 英語のスペルチェッカーが地味便利  Sphinx ⁃ ドキュメントツール (http://sphinx-users.jp) ⁃ 使い方を説明する4択クイズも作れる!(作った)  github.com/jessevdk/go-flags (MIT) ⁃ コマンドライン引数のパース ⁃ short/long、同じ引数を複数回指定、きれいなヘルプテキスト出力 あたりが良かった ⁃ 構造体のタグで指定する • 多言語化しにくいという欠点があるので言語ごとに構造体を作って切り替 えという苦肉の策
  • 11. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  github.com/google/google-api-go-client (MIT) ⁃ Google APIにアクセスするためのライブラリ  github.com/tealeg/xlsx (BSD style) ⁃ xlsxを読み書きできるPure Goライブラリ  github.com/sergi/go-diff (MIT/オリジナルはAPL v2) ⁃ Googleの Diff, Match and PatchライブラリのGolang移植  github.com/bkaradzic/go-lz4 (BSD) ⁃ 高速なファイル圧縮・展開ライブラリのPure Go版  github.com/OneOfOne/xxhash (APL v2) ⁃ lz4内でも使われている高速ハッシュアルゴリズムのPure Go実装。  github.com/ugorji/go/codec (MIT) ⁃ msgpack/jsonとかいろいろなシリアライズのライブラリ
  • 13. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  github.com/mattn/go-colorable (MIT) ⁃ 信頼と安心のmattnプロダクツ ⁃ Windowsでも他の環境でもコンソール出力に色が付く!  github.com/mgutz/ansi (MIT) ⁃ mattnプロダクツと一緒に使える色付け用の便利関数  github.com/jteeuwen/go-bindata (Public Domain) ⁃ バイナリの中にファイルを入れちゃうツール ⁃ HTMLテンプレートとgoogle APIアクセストークン、デフォルト値 のJSONあたりを連結してます
  • 14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  golang.org/x/oauth2 ⁃ OAuth2  golang.org/x/text/unicode/norm ⁃ ユニコードの正規化(NFDからNFC)関連 ⁃ Mac OS Xを嫌いになる前に  github.com/xeipuuv/gojsonschema (APL v2) ⁃ JSONスキーマのバリデーションライブラリ ⁃ ツールが戦魂チームで魔改造されたときに追加されてた  github.com/nicksnyder/go-i18n (MIT) ⁃ 国際化するためのライブラリ ⁃ JSONで翻訳を指定する。単数・複数で訳文の使い分けもできる ⁃ http://qiita.com/shibukawa/items/f0e4df597e62372fe7d5
  • 15. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 並列処理の実装とログ出力
  • 16. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 並列処理  汎用のスレッドプールを作ってみて、大量アクセス時はそれだけを使っ ている ⁃ Google Driveでフォルダの中の情報のアクセス ⁃ xlsxのダウンロード ⁃ xlsxの読み込み ⁃ 同名のシートごとにデータ分析・変換 ⁃ 同名のシートごとにCSV/JSON/TSV/HTML等で出力  ジョブを途中から追加できるようにして貪欲的に処理を行えるようにし たがその機能は使わず ⁃ OOMキラーに殺されまくったので、メモリ使用量の削減のために 処理を適度の中断してそれぞれの段階で枝刈りを積極的に行う方向 に方針転換
  • 17. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  使っているところのイメージ この中の処理を全タスクに対して適当にスレッドプールを使って 並列で処理する これがジョブ一覧の入ったキュー
  • 18. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 19. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 並列処理のログ出力  そのまま出力しても順序が混ざってしまって読みにくくなってしまう  グループ情報付きのエラー出力関数を作って、一旦メモリに貯めておい てグループごとに分類して出力するようにした。  APIアクセスエラーとか、入力ファイル名間違いなどの致命的な問題は log.Fatal()するが、読み込んだ後は基本的に最後まで完走する設計にし ている。  コンソールに出力したらJenkinsがそのまま表示してくれるので出しっ ぱなし。JenkinsのText FinderプラグインでWARNINGの文字を見つけ たら不安定(Unstable)扱いにしている。 グループ
  • 21. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Google APIのアクセス制御  ユーザごとの秒間アクセス数をGoogle Developer Consoleで設定して も、それより大分下のアクセス頻度で403 User Rate Limit Exceeded が出る件 ⁃ 昔は数千でも設定できたけど、最近10回/秒までしか増やせなく なったっぽい。ちなみに10億/日なのでフルにアクセスしても 0.1%しか行かない!
  • 22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  time.Tickerを使って、アクセス頻度の制御を行うようにした  APIアクセスする関数(スレッドプールで並列で動いていても)の中で、 下記のAPIThrottling()関数を呼び出すと、呼び出しが適当に間引かれ て実行されるようになった
  • 23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. diffの実装(文字単位/blameの実装)
  • 24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Diff, Match, Patch  Google製のライブラリ。基本的にはこれを使っておけば間違いない ⁃ https://neil.fraser.name/software/diff_match_patch/svn/trun k/demos/demo_diff.html  このライブラリの基本設計としては、まずできるだけ細かい文字単位 diffを計算して、その後適度な粒度になるようにパラメータをチューニ ングしながらクリーンナップするという2段階で実行する方式のAPIに なっている  なんというかクセがあるからサンプルに従うのが良さそう 今日私は朝ごはんを食べました。 明日私はお酒を飲みに行きます。 今明日私は朝ごはんお酒を 食べ飲みに行きましたす。 今明日私は朝ごはんを食べまし たお酒を飲みに行きます。
  • 25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 使い方  文字単位diff  セマンティックに従ってdiffをマージ  行単位diff ⁃ http://qiita.com/shibukawa/items/dd75ad01e623c4c1166b before := “今日私は朝ごはんを食べました。” after := “明日私はお酒を飲みに行きます。” dmp := diffmatchpatch.New() result := dmp.DiffMain(before, after, true) dmp := diffmatchpatch.New() tmp := dmp.DiffMain(before, after, true) result := dmp.DiffCleanupEfficiency(tmp)
  • 26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  最終的な出力はdiffmatchpatch.Diff構造体の配列 ⁃ テキストと、操作(そのまま、追加、削除)の情報を持つ  Diff構造体配列を抜き出して見やすい出力にする ⁃ ↓変化しない項目と、削除された項目だけを表示。削除された項目 には text-decoration: line-through; と赤色を付ける。 ⁃ ↑変化しない項目と、追加された項目だけを表示。追加された項目 には緑色を付ける
  • 27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. diffの応用: blameコマンド  スプレッドシートでもgit blameしたくなるってことあるよね!  シートの行ごとに、最終編集者と変更日時を表示させることも可能です
  • 28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. blameの実装 1. まずはGoogle Driveにアクセスして落とせるだけの全リビジョンのス プレッドシートをxlsx形式で落とします。 2. 新・旧ファイルをCSV化して、行区切りの文字列配列を作ります ⁃ (実際はオンメモリ処理です, 説明のため1シートだけ扱います) 1000, “たたかう”, “敵1体を通常攻撃” 1001, “ケアルガ”, “対象のHPを回復” 1003, “ファイラ”, “炎属性魔法攻撃(効果: 小) 1000, “たたかう”, “敵1体を通常攻撃” 1001, “ケアルガ”, “対象のHPを回復” 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中) 1000, “たたかう”, “敵1体を通常攻撃” 1001, “ケアルガ”, “対象のHPを回復” 1002, “ファイア”, “炎属性魔法攻撃(効果: 小) 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
  • 29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 3. 古い方からの2つ取り出して行単位差分を取ります 3. 追加されていればその行は新(index: 1)で追加された、維持であれば旧 (index: 0)で更新されたとみなし(削除は無視)、その行がどのファイル 由来のものかを記憶していく 4. 新しいファイルと、その次のファイルを取り出し、同じように行のイ ンデックスを更新していく。これを最後のファイルまで続けていく 1000, “たたかう”, “敵1体を通常攻撃” 1001, “ケアルガ”, “対象のHPを回復” 1003, “ファイラ”, “炎属性魔法攻撃(効果: 小) 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中) 0: 1000, “たたかう”, “敵1体を通常攻撃” 0: 1001, “ケアルガ”, “対象のHPを回復” 1003, “ファイラ”, “炎属性魔法攻撃(効果: 小) 1: 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中) 0: 1000, “たたかう”, “敵1体を通常攻撃” 0: 1001, “ケアルガ”, “対象のHPを回復” 2: 1002, “ファイア”, “炎属性魔法攻撃(効果: 小) 1: 1003, “ファイラ”, “炎属性魔法攻撃(効果: 中)
  • 30. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. xlsxの読み込みと高速化
  • 31. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. xlsxのロード  github.com/tealeg/xlsxがオンリーワンの選択肢。これでOK? ⁃ ではなかった。 • ポインタで持つべき所を実体で大量に持ってメモリを食っていたり、構造 体のメンバーが初期化されてないところがあったり、先頭の空行が勝手に 省略されて行がずれてたり、生成されたxlsxファイルがExcelで読み込めな かったり・・・ ⁃ バグ修正のPull Requestを送り、ついでにセルのタイプ(数値型や Boolean型など)を取得できるように機能拡張もした。 ⁃ 今もたくさんユーザがいて、スタイルなども扱えるように修正され 続けているし、基本的に良いライブラリです ⁃ xlsxのライブラリで困ったらPythonのopenpyxlを参照すると良い です。MS製のXMLスキーマを使ったユニットテストもしていて、 困ったときのリファレンス実装として役立ちます。
  • 32. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  しかし、xlsxのパースは重い ⁃ xlsxのロードがツールのボトルネックに(90%以上の時間) ⁃ プロファイラで計測しても、標準ライブラリの中ばかり・・・ • zipの展開は重い • XMLのパースは重い • XMLタグ構造体のインスタンス作成が重い • golangの構造体にマッピングするencoding/xmlは遅い? ⁃ タグのパースなどを事前にやることで高速だよ!というJSONパーサも あるぐらい • ついでにxlsxライブラリがセルごとに構造体を作っちゃうのも遅い
  • 33. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 軽量xlsx的なモジュールを作成  APIはtealeg/xlsxとは少し違うけどなるべく同じに ⁃ セルは構造体を作らず行のオブジェクトに配列でデータを持たせる  github.com/ugorji/go/codecを使ってファイルとの読み書きをする ⁃ これだけでmsgpack, binc, cbor, jsonの読み書きができる ⁃ サイズを減らすためにlz4で圧縮もかけた
  • 34. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 処理時間の推移  オリジナルのxlsxのまま読み書き ⁃ ダウンロードをキャッシュ済みの場合でも40秒ほど  JSON + lz4で圧縮のキャッシュ化 ⁃ スタイル情報とかもなくなるのでファイルサイズも1/2〜1/5 ⁃ メモリ使用量も1/3ぐらいに ⁃ 処理時間は15秒ぐらいに  MessagePack + lz4で圧縮のキャッシュ化 ⁃ ファイルサイズはJSON+lz4とほぼ同じ ⁃ 処理時間は6秒ぐらいに
  • 35. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. まとめ  Excel/Google Spreadsheetを中心としたテキストの分析・加工のコー ドならGoでガンガン書ける ⁃ 表計算は非プログラマとのコミュニケーションツール • 読み書きソロバンExcelの時代 ⁃ 使える人は多いし、Excelの読み書きができれば最速ではないかも しれないけど90%のビジネスは回る ⁃ Goは速いので業務上のボトルネックを全力で叩き潰すのに便利 ⁃ 文字列中心の処理でもC++ほどやる気が消耗しない  Pure Goのライブラリも数多くでてきて、言語の後方互換性も高いので、 使える資産がどんどん増えている ⁃ リファレンスしかなくて使い方が良くわからないライブラリも多い ので、Qiitaとかでどんどん発信しましょう ⁃ まだまだ成熟してないライブラリも多いので、いっぱいPR出そう