switch len

func main() {
    array := []int{1, 2}
    switch len(array) {
    case 1:
        fmt.Print("1")
    case 2:
        fmt.Print("2!")
    }
}

cloud storage object change notification

Web Master Tool

  1. ocn-reciever バージョンにデプロイ
  2. 静的ファイル
    app.yaml
// app/static_files/認証用.html を配置しておく

application: camera-raspi
version: ocn-reciever
runtime: go
api_version: go1
handlers:
- url: /{認証用ファイル名}\.html
  static_files: static_files/{認証用ファイル名}.html
  upload: static_files/{認証用ファイル名}.html

参考

http://qiita.com/sinmetal/items/0438203034a0cb448448

go google api auth

サービスアカウント作成

  1. GCPにプロジェクト作成
  2. API画面でサービスアカウント作成
  3. JSONダウンロード

ソースコード

package main

import (
    "encoding/base64"
    "io/ioutil"
    "log"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/vision/v1"
)

func main() {
    jsonData, err := ioutil.ReadFile("./auth.json")
    if err != nil {
        panic(err)
    }

    // 前述のJSONファイルを読み込んでJWTのConfigを作成
    cfg, err := google.JWTConfigFromJSON(jsonData, vision.CloudPlatformScope)
    if err != nil {
        panic(err)
    }

    // OAuth2の認可を付与したHTTPクライアントを作る
    client := cfg.Client(context.Background())

    // Vision APIのサービスを作る
    svc, err := vision.New(client)
    if err != nil {
        panic(err)
    }

    // 画像ファイルを読み込んでBASE64エンコード
    imgData, err := ioutil.ReadFile("./cat.jpeg")
    if err != nil {
        panic(err)
    }

    enc := base64.StdEncoding.EncodeToString(imgData)
    img := &vision.Image{Content: enc}

    // 使いたいVisionの機能
    feature := &vision.Feature{
        Type:       "LABEL_DETECTION",
        MaxResults: 10,
    }

    // 1つの画像に対して複数のFeatureを指定できる
    req := &vision.AnnotateImageRequest{
        Image:    img,
        Features: []*vision.Feature{feature},
    }

    // 1回の呼び出しで複数の処理を要求できる
    batch := &vision.BatchAnnotateImagesRequest{
        Requests: []*vision.AnnotateImageRequest{req},
    }

    // 実際のAPIコールを実行
    res, err := svc.Images.Annotate(batch).Do()

    b, err := res.MarshalJSON()
    if err != nil {
        panic(err)
    }
    log.Print(string(b))
}

文字 置換

func main() {
    str := "hello %name%さん"
    name := "yohei"
    str = strings.Replace(str, "%name%", name, -1)
    log.Print(str) // hello yoheiさんと出力される
}

send grid app engine

send grid アカウント作成

https://sendgrid.kke.co.jp/about/

App Engine設定

APIキー作成

配信

func handler(w http.ResponseWriter, r *http.Request) {
    sg := sendgrid.NewSendGridClientWithApiKey("{APIキー}")
        ctx := appengine.NewContext(r)

        // Set http.Client to use the App Engine urlfetch client
        sg.Client = urlfetch.Client(ctx)

        message := sendgrid.NewMail()
        message.AddTo("example@email.com")
        message.SetSubject("Email From SendGrid")
        message.SetHTML("Through AppEngine")
        message.SetFrom("sendgrid@appengine.com")
        sg.Send(message)
}

備考

fromのアドレスには自由に設定することができるが、なりすましの場合は、
スパム判定される。

事前にSPFレコードの登録などが必要
https://mxtoolbox.com/spf.aspx

参考

ドキュメント
https://sendgrid.kke.co.jp/blog/?p=1391