#87 Go言語のテンプレートエンジン & Auto-Renewable Subscriptions

どうも、esuiです。

だいぶ未更新レポートが溜まっちゃってる気がしなくもないので、
ちょっと駆け足で…




Go言語のテンプレートエンジン


スクリーンショット 2017-07-07 21.35.53.png
以前、弊社ではそろそろGo言語の勉強でもやろうかという時にちょっと話題に出た、
Go言語のテンプレートエンジンについて調べてみた、という発表でした。

デモを挟みながら、どのようなテンプレートエンジンがあるかの紹介をされていました。
以下、ほとんど資料のままになってしまいますが、、

text/template


https://golang.org/pkg/text/template/
まずはここから、ということで、
・標準ライブラリ
・薄くてシンプル
・同じく標準ライブラリで html/template ってのもあります(後で解説)

text/templateの使い方


import "text/template" 	//インポートします 標準ライブラリなのでgo getとかしなくて良い

testText := "hello {{.}}!\n"; // {{.}}と表記されたところに与えられた値が入ります
testWord := "world";

tmpl, _ := template.New("test").Parse(testText); // ふたつ目の返り値はエラー
tmpl.Execute(os.Stdout, testWord); // 第一引数は出力先(標準出力)

tmpl, _ := template.New("test").Parse(testText);
// ↓ template.Must()を使うと,
// ↓ テンプレートの正当性チェックを行ってエラーがあればpanicになってくれる
tmpl := template.Must( template.New("test").Parse(testText) );

// 別ファイルからテンプレート読み込み
tmpl := template.Must(template.ParseFiles("dir/hoge/filename.tmpl"));


- 変数は一つしか与えられない(?)ので,より多くの値を与える場合は構造体を定義する。

entry := Entry {42, "あばばばば"};

type Entry struct {
Number int
Body string
}


番号: {{.Number}} , 本文 : {{.Body}}

番号 : 42 , 本文 : あばばばば

構造体をネストしまくればいろいろ渡せるので、
スライス(可変長な配列のようなもの)やマップ(連想配列・ハッシュ)も渡せるそうです。

- text/template 変数の定義
{{- $a := "aaa" -}}
{{$a}}
{{- $entry := .Entry -}}
{{ $entry.Number }}

aaa
42

- text/template コメント
{{/* これはコメントです */}}

{{/* このように
改行を含むことができます。 */}}


- text/template if
{{ $judge := true }}
{{ if $judge }}
true!
{{else}}
false!
{{end}}

→「true!」と出力されます。

- text/template range (foreachのような)
{{ range $count, $comment := $comments }}
番号:{{$count }} 投稿者:{{$comment.Author}}
本文:{{$comment.Body}}
{{ end }}


- text/template テンプレートの標準関数
・ and, or
・関数として提供されているので{{ or false true }}のようにポーランド記法になる。
・引数はいくらでも {{ or hoge huga piyo }}

・ print, printf, println
・それぞれfmt.Print, fmt.Printf, fmt.Println へのエイリアス

・ html, js, url
・エスケープ(エンコーディング)してくれる。

- text/template パイプライン
「 | 」で結果を次の引数として渡せる。
スクリーンショット 2017-07-07 20.46.10.png

- text/template 自作関数
funcMap := template.FuncMap{
"testFilter": TestFilter,
}

と作って,.Funcsに渡す(Parse前に)。
template.New(“test”).Funcs(funcMap).Parse(templateText);

html/template


text/template の ラッパー。
- 与えられた変数はすべてエスケープ
- template.HTML型の変数のみエスケープしない

return template.HTML(str) なrawっていう関数を作れば…
{{ $hogehoge | raw }}


gin


https://github.com/gin-gonic/gin
- WAF
- はやい らしい
- 薄い っぽい

func testFunc (c *gin.Context) {
c.HTML(http.Status, “test.tmpl”, gin.H{
“key1” : “value”,
“key2” : gin.H{
“key3” : []string{“hoge”, “huga”, “piyo”},
},
});
}


go-xslate


https://github.com/lestrrat/go-xslate
- Perlの Text::Xslate に似た goのテンプレートエンジン
- 現在はTTerseのみ対応
- デモページ
http://play-go-xslate.appspot.com/

tx, _ := xslate.New();
tx.RenderInto(w, “test.tt”, xslate.Vars {
“key1”: “hello world!”
“key2”: []string{“hoge”, “huga”, “piyo”},
};


- go-xslate 文法
[% key1 %]

[% FOREAECH value IN key2 %]
[% value %]
[% END %]

[% IF key3 %]ほげほげ[% ELSE %]ふがふが[% END %]


- go-xslate INCLUDE
他のファイルを読みこみそこに表示させる 「INCLUDE」 もあります。
[% INCLUDE “header.tt” WITH var1 = “ababababa” %]

INCLUDEするファイルに与える変数をWITH以下に記述できるそうです。

- go-xslate filter
- html, uri -> それぞれエスケープします
- mark_raw -> エスケープしません

- go-xslate MACRO
[%- MACRO repeat(text, count) BLOCK %]
[%- FOREACH i IN [1..count] %]
[% i %]: [% text %]
[%- END # FOREACH %]
[%- END -%]

[%- CALL repeat("Hello!", 10) -%]


- go-xslateの現状
GithubのREADME曰く
・パーサーとコンパイラは90%程度の出来
・ユーザーが関数(フィルターとかのこと?)を追加する手段がまだ作れて無い
とのことのようです。

Ego


https://github.com/benbjohnson/ego
Rubyの ERb に似た記法の Go言語のテンプレートエンジン

<% “hello world” %>


pongo2


https://github.com/flosch/pongo2
pythonの有名なwafであるDjangoのテンプレートエンジンに似た記法の goのテンプレートエンジン

{{ “hello world” }}

デモページもあります
https://www.florian-schlachter.de/pongo2/

最後に


・ginとかechoとかのメジャーなWAFを使った解説を読んでると標準のtext/templateを使ってることが多いとのことのようでした。

▼参考文献
年末なのでtext/template周りを歩いて回ってみた | eureka tech blog




Auto-Renewable Subscriptions(自動更新購読)


Auto-Renewable Subscriptionsとは月額課金モデルのこと。
期間を限定したサービスに対して使われます。
この2本目の発表では、iOSの月額課金モデルについての内容を説明されていました。

使えるアプリの種類


- 定期刊行物
• 新聞
• 雑誌

- ビジネス
• エンタープライズ
• 生産的(たぶん仕事効率化的なもの)
• プロ向けクリエイティブツール
• クラウドストレージ

- メディア
• 動画
• 音楽
• 音声

設定できる期間


• 1週間
• 1ヶ月
• 2ヶ月
• 3ヶ月
• 6ヶ月
• 1年

無料トライアルで設定できる期間


• 3日
• 1週間
• 2週間
• 1ヶ月
• 2ヶ月
• 3ヶ月
• 6ヶ月
• 1年

課金モデルの種類


Consumable(消耗型) - ゲームの消耗型アイテム

Non-consumable(非消耗型)

Non-renewable subscriptions(非自動更新購読) - 広告除去など一度購入すれば永続的に適用されるもの

Auto-renewable subscription(自動更新購読) - 雑誌や動画アプリなどの定期購読、月額サービス

収益


売上の70%が収益、ただしすでに1年以上自動継続課金を続けると売上85%が収益となるそうです。

実装


今回は、このAuto-renewable subscription(自動更新購読)について、
実際に案件で行った流れに沿っての実装面、テストについての説明があったのですが、
案件個別の情報となりNDA等もあるかと思いますためここでの公開はご了承を…

この記事へのコメント