More Related Content Similar to 静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話 (20) 静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話11. これまでのバナー管理の問題点
■ PHPやTOMLファイルで管理されていた
● 実装は簡単だが運用が大変
● バナーを設定する度にエンジニアが必要
● どの設定が使われているのか分からない
11
[[banners]]
tab_id=2
url=https://example.com/campaign?id=10
image_url="https://example.com/campaing10.png
start_time=2016-10-27T08:00:00Z
end_time=2016-11-07T06:00:00Z
os="ios"
バナー設定ファイルの例
35. 一括アップロードの実現
■ どう実現するのか
● CSVは1行で1件を表す
● JSONはオブジェクトの入れ子もあり得る
● 案件ごとにレスポンスの形式は違う
● JSON Schemaを元にCSVをパースする
35
url image.background image.main
http://example.com http://example.com/b.png http://example.com/m.png
{
"url": "http://example.com",
"image": {
"background": "http://example.com/b.png",
"main": "http://example.com/m.png"
}
}
39. goパッケージ
■ 標準パッケージとして静的解析の機能を提供
go/ast 抽象構文木(AST)を提供
go/build パッケージに関する情報を集める
go/constant 定数に関する型を提供
go/doc ドキュメントをASTから取り出す
go/format コードフォーマッタの機能を提供
go/importer コンパイラに適したImporterを提供
go/parser 構文解析の機能を提供
go/printer ASTの表示機能を提供
go/scanner 字句解析の機能を提供
go/token トークンに関する型を提供
go/types 型チェックに関する機能を提供
39
43. 型をバリデーションに利用する
■ バリデーションを行う
● JSON Schemaを使えばJSONがスキーマを
満たしているかチェックできる
● 変数に型を導入することで、型情報を基にス
キーマを定義できる
● 型に沿ったバリデーションができる
■ オリジナル型を作る
● 組込み型としてオリジナルの型を作れる
○ URL, IntRange など
● バリデーションも行える
43
45. 関数の実現
■ 関数を使えるようにする
● 小文字から始まる関数呼び出しを対象
● 引数は任意の式
● オリジナルの組込み関数のみ使用できる
○ cond, until, hours, days,...
■ 関数呼び出しを評価する
● const.Valueを引数と戻り値に取る関数
● reflect.MakeFuncの思想と似ている
● 関数呼び出しごとにスコープを作る
○ 別の式を呼び出すcond関数のため
45
47. 条件式を保存して呼び出す
■ cond関数
● よく使う式をDBに保存しておける
● cond関数を使って呼び出せる
● 呼び出し時に変数に値を束縛できる
47
String(os) == Enum(__os, "0,1", "iOS,Android")
保存された式 (id:1)
cond(1,"__os=1")
呼び出す式
列挙型の変数
変数の値
呼び出す式のID
String(os) == "1"
展開した式
51. 条件式からUIを自動生成する
■ 保存された式を組み合わせる
● __で始まる変数をUIで設定する
● UIで設定した変数を束縛する形で
cond関数を用いてバナーの条件式とする
51
String(os) == Enum(__os, "0,1", "iOS,Android")
os: iOS ▼
Android
保存された式 (id:1)
cond(1,"__os=1")JSON Schema
バナーに設定される式
作業者は保存された条件を
ANDやORで組み合わせるだけで済む
UIが生成される 選んだ値を設定する
54. Namespace APIとは?
54
■ Namespace API
● Namespaceを分けることのできるAPI
● 利用可能なAPI
○ Datastore, Memcache, Task Queue, Search
■ Namespaceを分ける理由
● Namespace間でデータの干渉を防ぐ
● マルチテナント型のWebアプリを作れる
55. URLとルーティングルール
■ GAEのURLは以下のようにアクセスできる
● Inst: インスタンス(数値)
● Ver: バージョン
● Serv: サービス
● AppID: アプリケーションID
■ ゆるいルーティング
● インスタンス、バージョン、サービスが存在しないとデ
フォルトのものにルーティングされる
● インスタンスorバージョンの代わりにNamespaceを書く
55
<Inst>-dot-<Ver>-dot-<Serv>-dot-<AppID>.appspot.com
<NS>-dot-<Ver>-dot-<Serv>-dot-<AppID>.appspot.com