2013年6月30日日曜日

Go の template パッケージで map の key を参照する

GAE + Go では HTML を html/template パッケージで出力することが基本になります。
このとき {{}} 構文によって Go 内の変数を HTML 内に展開することができます。

array や map や slice の中身を順次取り出しながら表示する場合は
{{range}}{{end}} 構文を使って書くことができます。
<ul>
  {{range .}}
    <li>{{.Name}}さんこんにちは</li>
  {{end}}
</ul>

ただ中身を表示するだけならこれでよいのですが、
map を使っている場合、どうしても key を埋め込みたい時があるでしょう。
(クリックした要素の key をサーバへ返したいときなど)

この場合は以下のように for each 文っぽく key とvalue を変数に入れることができます。
<ul id="gamelist">
  {{range $key, $val := .}}
    <li class="game" key="{{$key}}">
      <div class="title">{{$val.Name}}</div>
      <div class="description">{{$val.Description}}</div>
      <div class="thumbnail"><img width="200" src="/client/img/living.png"></div>
      <a href="/editor?game_key={{$key}}"><button class="edit">作る</button></a>
      <button class="copy">コピー</button>
      <button class="delete">消す</button>
    </li>
  {{end}}
</ul>

ちなみに $val は無くても同じように動きます。



地味に 100 本目の投稿です。

2013年6月29日土曜日

Xcode で grep 検索

Xcode でワークスペース内のすべてのファイルから任意の文字列を探す方法です。
Shift + ⌘ + F で grep 検索ができます。
コミットする前にデバッグラインが残ってないか探すときなどに便利です。

検索結果をクリックすると該当箇所へジャンプできる

2013年6月28日金曜日

GAE + Go でログを取る

GAE + Go では appengine パッケージにログを取る命令が入っています。

The appengine package - Google App Engine
https://developers.google.com/appengine/docs/go/reference

import (
    "appengine"
    "net/http"
)
func init() {
    http.HandleFunc("/", debug)
}
func debug(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    c.Debugf("Debug")
    c.Infof("Infomation")
    c.Warningf("Warning")
    c.Criticalf("Critical")
}

c.Infof() や Debugf() でログを取ることができます。
ローカル開発よサーバの場合、コマンドプロンプトにログが出力されます。
本番環境の場合はアプリ管理画面にログが出力されます。
Debug だけ表示、Error だけ表示などのように絞込みも可能です。


2013年6月27日木曜日

Go でバイナリの比較

バイナリとバイナリの比較方法です。
bytes パッケージの Compare() を使います。
a := randomBytes()
b := randomBytes()
if bytes.Compare(a, b) == 0 {
    log.Printf("同じです")
} else {
    log.Printf("違います")
}

bytes package - Go lang
http://golang.org/pkg/bytes/

2013年6月26日水曜日

GAE + Go でメールを送る

Google App Engine ではメールの送信もできます。
ユーザ新規登録時の確認メールなどに使えます。

送信元になるメールアドレスはデフォルトで

  • アプリ管理者のGmailアドレス
  • string@appid.appspotmail.com

が使えます。
string は任意の文字列、appid はアプリURLの ***.appspot.com と同じ文字列です。

メールを使うには app.yaml に以下を追加する必要があります。
inbound_services:
- mail

以下のように送信します。
message := new(mail.Message)
message.Sender = "infomartion@appid.appspotmail.com"
message.To = []string{"who@example.com"}
message.Subject = "タイトル"
message.Body = `

メールの本文です。
複数人にも送ることができます。

`

c := appengine.NewContext(r)
err := mail.Send(c, message)
if err != nil {
    c.Errorf(err.Error())
}

2013年6月25日火曜日

backlog バージョンアップ

backlog がバージョンアップされました。

詳しい情報は backlog 公式ブログ
http://www.backlog.jp/blog/2013/06/release-201306.html

まず、プロジェクトの色が設定できるようになっています。
画面の色が全体的に変えられます。

ピンクの豹柄とか

アラビアンな感じ

黒くしたらこんな感じでシック

そして、課題の親子関係
説明を読んでみたら超便利そうです
課題がツリー構造を取れるようで、
大きなタスクの処理中に出現した小さなタスクをぶら下げて定義できるそうです。
いままで関連タスクとしてURLを貼って参照しあっていたので欲しかった機能。
しかし、さっそくやってみようと思ったら設定項目が見当たらず・・・。



なんと有料プラン専用だそうです・・・。
無料プランなので試せませんでした。


あとは、課題のテキストエリアにボタンが表示されました。
いつもは [] とか {code}{/code} とか打ち込んでいたのがボタンで出せるようになります。
ちょっと便利ですね。

右上にボタンが出現

他にもコメントが折りたためるようになっているなど変わっているらしいです。

2013年6月24日月曜日

datastore の String にバイナリをいれてしまったら

GAE + Go で datastore の String 要素にバイナリデータを入れると、

localhost:8080/_ah/admin

のデータストア管理画面がエラーを吐くようになります。


これでは中身が見れないのでデータストアをクリアしなければなりません。
GAE のローカルサーバを起動するときに -c または --clear_datastore オプションを付けます。
$ dev_appserver.py --clear_datastore myapp

これでデータストアをクリアすることができ、エラーが出なくなります。
バイナリデータを保存するときには必ず []byte を設定するように注意しましょう。