Revel埋立:Revel のページと静的 HTML を共存させる。
go言語のチュートリアルを一通り終えることができたならば
Revel のチュートリアルは楽勝だと思います。
また、Revel のチュートリアルだけを日本語化したよーなサイトはたくさんあるので
そーゆーのを見ながら進めても問題ないと思います。

問題は、Revel のチュートリアルと、自分のやりたいことの溝
どーやって埋めていくかってことだと思います。
#なので、タイトルに「埋立」と入れました。

自分がえぶアプリを作っていく上で「ここは溝だなー」と
思ったところを取り留めなく書いていきたいと思います。

▼ Revel のページと静的 HTML を共存させる。

URL の root 配下が静的 html で、
/rv 配下に Revel の動的ページを配置するイメージです。

ディレクトリ構成は
→ 静的 html 系:/usr/share/nginx/deploy
→ Revel 配下系:/var/golang/src

です。なんか取り留めが無いな...

まずは nginx の config を変更。
location をこんな感じに修正する。

    location /rv {
proxy_pass http://127.0.0.1:9000;
}

location / {
root /usr/share/nginx/deploy;
index index.html index.htm;
}


次に Revel 側の設定も変更します。

conf/route ファイルをこんな感じで修正する。

#GET     /                                       App.Index
GET /rv App.Index

# Ignore favicon requests
GET /favicon.ico 404

# Map static resources from the /app/public folder to the /public path
GET /rv/public/*filepath Static.Serve("public")

# Catch all
#* /:controller/:action :controller.:action
* /rv/:controller/:action :controller.:action


つまり、何がどこに配置されているかは、この設定に書かれているようだ。
ちなみに、この設定は Revel を再起動しないと反映されない。

controllers 配下の go のソースは変更する必要がありませんが
views/App 配下の html は下記のように変更する必要があります。

<form action="/rv/App/Hello" method="GET">
<input type="text" name="myName" /><br/>
<input type="submit" value="Say hello!" />
</form>

【2017/05/04】 golang / Revel | トラックバック(0) | コメント(0) | page top↑
Revel埋立:CSRF 対策でちょっとハマる
ちょっと話は前後するのですが、えぶアプリのブレークスルーが概ね進んできたので、
ここいらで CSRF 対策~ と思ったわけです。

Revel は素晴らしいことに、CSRF 対策用のパッケージとかよゆーで存在するわけです。
revel-csrf

リンク先のギハブに使い方が書いてありますが、
日本語訳も簡単にみつかるのでここでは割愛します。

問題はこっから先。

ひでのふの使っている go言語のバージョンはこんな感じなんですが

# go version
go version go1.7.4 linux/amd64


この環境で revel-csrf のインスコ用コマンドを叩くと...

# go get github.com/cbonello/revel-csrf
# github.com/cbonello/revel-csrf
/var/golang/src/github.com/cbonello/revel-csrf/csrf.go:50:
c.RenderArgs undefined
(type *revel.Controller has no field or method RenderArgs)


こんな感じで怒られちゃうわけです。
実際、使い方に従い revel-csrf を導入しても、同じように怒られますw
ちなみにエラーが出ても、$GOPATH/src/github.com/cbonello 配下には
ちゃんとパッケージがインスコされているよーです。

結局どうやって対処したかとゆーと、直接エディタで csrf.go を書き換えましたw

csrf.go : Line 50
旧:    c.RenderArgs[fieldName] = realToken

新: c.ViewArgs[fieldName] = realToken


実際 http のヘッダを見ると、POST のリクエストに csrf_token が
含まれるようになったので大成功なんじゃないかとw

簡単に機能をテストするなら、revel-csrf のマニュアルに書いてある
下記のタグが存在しないページから
別の Revel 配下のページに POST で遷移してやればエラーが出ます。

<input type="hidden" name="csrf_token" value="{{ .csrf_token }}" />

【2017/05/05】 golang / Revel | トラックバック(0) | コメント(0) | page top↑
Revel埋立:dev モードと prod モードの違い
▼ dev モードと prod モードの違い

重要:デフォルトは dev(開発用)モードです。
エラー発生時に色々と見せちゃイケない情報がブラウザ上にだだもれになるので
商用環境では必ず prod(商用)モードを指定することを推奨します。

Revel は、オプション無しで起動すると、dev モードで起動します。

# revel run myapp


下記のように dev オプションを付けて明示的に dev モードでも起動できます。

# revel run myapp dev


prod モードで起動する場合は、下記のようにオプションの指定が必要です。

# revel run myapp prod


この dev モードと prod モードには色々と違いがあって
端的なのは、エラー時のブラウザの表示が替わることです。

これは、conf/app.conf でまるっきり dev と prod の設定を入れ替えても
変わらなかったので、設定でどーこーできるものではなく、
dev と prod は根本的に動きが異なるようです。

ちなみに、dev モードでもデフォルトの設定では後述する
TRACE レベルのログは出力されないので、conf/app.conf の設定を変更しています。

# Where to log the various Revel logs
#log.trace.output = off
log.trace.output = stderr

# 23 => log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile
log.trace.flags = 0


上記の変更は、TRACE レベルのログを stderr に出力するように設定してます。
log.trace.flags = 0 は、
こんな感じでヘッダとメッセージだけを出力するようにします。

TRACE adding template:  errors/500.xml
TRACE adding template: TestRunner/FailureDetail.html
TRACE adding template: TestRunner/Index.html


ちなみにアフォみたいに沢山出ますw

続きを読む
【2017/05/07】 golang / Revel | トラックバック(0) | コメント(0) | page top↑
今月の密林 2017/5
今月はアフタヌーンと単行本が1冊です。

続きを読む
【2017/05/20】 アフィリエイト | トラックバック(0) | コメント(0) | page top↑
我が家の家計 2017/5
今月の増加分:-135821
今までの増加:170333
車の減価償却引当て:2280000
レジャー費シーリング:379000/360000

今月は
・定期代を含むカード払い 190K
・車税金&保険 80K
・今年分の未計上家電費用 50K
とまあ、色々出費が重なったので割と大きめのマイナスです。

来月のカード払いは6万とかなり少な目です。
やっぱりレジャー費用の抑制が効いている感じです。

続きを読む
【2017/05/25】 家計 | トラックバック(0) | コメント(0) | page top↑
Go言語で daemon を作ってみる その1
結局、Revel に関しては、あれ以降特に新たな発見は無く
わざわざエントリにするにはびみょーな状況のまま、
モノは完成してしまったわけです。

ただ、Linux の daemon プロセスの作り方に関しては、
どこも断片的&英語な情報しかなかったので
ちょっとまとめてみようかなと思いました。

とりあえず全3回。GitHub に上げたソースコード類の解説が中心です。

続きを読む
【2017/05/28】 golang / Revel | トラックバック(0) | コメント(0) | page top↑
Go言語で daemon を作ってみる その2
▼ daemon 起動設定(CentOS 6)

まずは起動スクリプト。

起動用スクリプト

これを /etc/init.d 配下にコピーして、権限 755 root:root を与えておきます。
go言語以外を対象としたものならどこにでもおいてありますが
それとほぼ同一のものです。

唯一異なるのは、この後に出てくる
「daemon プロセスを起動するためのgo言語のプログラム」が
daemon プロセスとして起動した子プロセスの PID を、標準出力に出力するところ
です。
戻り値として 子プロセスの PID を戻す場合は、少し変更が必要です。

あとはこれを chkconfig --add で daemon としてやればOKです。

▼ daemon プロセス起動用の go言語のプログラム(CentOS 6)

daemon 起動設定(CentOS 6)で起動できるのは
init を親プロセスとして、root権限 の daemon 起動用のプロセスです。
他の UID を持つユーザでプロセスを起こす場合は、ワンクッション必要です。
また、daemon 本体のプロセスを起こした後は、
直ちにプロセスを終了する必要があります。

上記の文章の説明ではわかりづらいので簡単な絵を描くと

init → daemon 起動設定 → daemon 起動用プロセス → daemon 本体プロセス

と、流れていく感じになります。

そこで登場するのが「daemon プロセス起動用の go言語のプログラム」です。

上記の daemon 起動設定では、このプログラムを実行しています。
実際これを実行すると、「daemon プロセス起動用の go言語のプログラム」自体の
プロセスは消滅し、代わりに init を親とする daemon 本体のプロセスが残ります。

具体的に何を行っているのかは、サンプルソールのコメントを参照。

daemon プロセス起動用の go言語のプログラム

【2017/05/29】 golang / Revel | トラックバック(0) | コメント(0) | page top↑
Go言語で daemon を作ってみる その3
▼ Daemon のプログラム

Daemon として動くプログラムには、
ふつーのプログラムには必須でない機能が必須になります。それは...

・シグナルの取扱い
・タスクスケジューリング


です。どっちもなんか小難しい感じがしますが「シグナルの取扱い」に関しては
定型処理と言って差し支えないでしょう。

よって、サンプルソースそのまんまの実装で問題ないと思います。
何をやっているかは、ソースのコメントを参照すると良いでしょう。

go言語 daemon サンプルソースコード

「タスクスケジューリング」に関しては色々と戦略があるのですが
ここでは一番安直な「一定時間休む」パターンを例に取っています。

サンプルでは 10秒に1回の処理を行うのに、
休む間隔を 10秒ではなく 100ミリ秒にしているのは、
SIGTERM を受け取った際に、プロセスが止まるまで0.1秒にするためです。

また、time.Sleep() を削除すると、無駄に CPU のコアを丸々一つ使い切りますw
意図もなく time.Sleep() の値を 10ミリ秒以下にするのはお勧めしません。
一方で、このサンプルでは「最繁時は休む時間を少なくしたい」とゆー
daemon に求められる割と基本的な要件は満たしていません。

このように、タスクスケジューリングにはちょっとコツが必要なのですが
これ以上は go言語とはあまり関係無い話になってくるので割愛します。

処理間隔が1分に1回でよければ、大人しく cron 使えと言ったところでしょうか。

【2017/05/31】 golang / Revel | トラックバック(0) | コメント(0) | page top↑
| ホーム |