2019年1月27日日曜日

[Go][CloudFunctions][FireStore] Could FunctionsからCloud FirestoreをGoで呼び出す

Go言語でCloud FunctionsからFirestoreを呼び出すにはどうすればいい?

結論を書くと、チュートリアルに書かれている通りです。

ただ、Initialize Cloud Firestoreにあるサンプルコードのclient, err := firestore.NewClient(ctx, projectID)にあるContextに何を入れれば良いかが書かれていない


Cloud Firestoreを有効にする

GCPのコントロールパネル項目からCloud Firestoreを選択し、有効かします。

※Cloud Datastoreを一度でも有効にしてしまうと、Cloud Firestoreは有効に出来ません


Cloud Functionsを記述する

ライブラリを取得する

手元の環境でいつも通りgo getを行います

go get "cloud.google.com/go"


go modを使用する

手元の開発フォルダでgo mod initと行いgo.modを生成する事により、functions環境で上記ライブラリを使えるようにする


Cloud Functionsのコードを書く

package hello

import (
 "net/http"
 "cloud.google.com/go/firestore"
 "log"
)

func Hello(w http.ResponseWriter, r *http.Request) {
   projectID := "GCP-PROJECT-ID"
   
   // Get a Firestore client.
   client, err := firestore.NewClient(r.Context(), projectID)
   if err != nil {
           log.Fatalf("Failed to create client: %v", err)
   }
   
   // Close client when done.
   defer client.Close()

   _, _, err = client.Collection("users").Add(r.Context(), map[string]interface{}{
           "first": "Ada",
           "last":  "Lovelace",
           "born":  1915,
   })
   if err != nil {
           log.Fatalf("Failed adding alovelace: %v", err)
   }

    msg := "Hello World"
    w.Write([]byte((msg)))
}

go.modの更新としてgo buildを行います

サーバーの方にアップロードします

gcloud functions deploy helloWorld --entry-point Hello --runtime go111 --trigger-http


実行してみる

deployしたURLにアクセスし、その結果をFirestoreのコントロールパネルで確認し、ユーザーが追加されていれば成功です


Firebaseとの連携

おまけですが、GCPとFirebaseを連携するには、Firebaseのコントロールパネルを開き、プロジェクトを追加する際に上記GCPのプロジェクトIDを選択してあげます

出来上がったFirebase ProjectのDatabaseをみると、上記でいれたUserデータが見えると思います

2019年1月24日木曜日

[GCP][Go][PubSub] Google Cloud FunctionsにGo言語を用いてPubSubからのメッセージをペイロードありで受信

Google Cloud FunctionsにGo言語がきた

公式リリース

上記の公式リリースの通り、Go言語がまだbeta対応であるが、Google Cloud Functionsにやってきた

Cloud functionsはサーバーレスで簡単な関数を実行してくれる仕組みで大変便利です

公式サンプル@githubには、pubsubとGoogle Cloud Functionsを組み合わせた例は無いです

公式チュートリアルには、組み合わせはあるがペイロードを受信する方法が無いです


Google PubSubにTopicを作成

gcloudからコマンドでも実行できるが、今回はAPIを有効化するために、コントロールパネルから実行

有効化したらトピック名を指定して作成

projects/{プロジェクト名}/topics/{トピック名}というトピックが出来上がるので、ここで放置


FunctionsのコードをGo言語で用意する

今回のコードは以下のようなコード

package hello

import (
    "encoding/json"
    "context"
    "log"
)

type PubSubMessage struct {
    Data []byte `json:"data"`
    Attributes map[string]string `json:"attributes"`
}
type Info struct {
    Test1  string `json:"test1"`
    Test2 string `json:"test2"`
}
func HelloPubSub(ctx context.Context, m PubSubMessage) error {
    var i Info

    err := json.Unmarshal(m.Data, &i)

    if err != nil {
        log.Printf("Error:%T message: %v", err, err)
        return nil
    }
    log.Printf("Data: %s:%s", i.Test1, i.Test2)
    log.Printf("Attributes %v", m.Attributes)

    return nil
}

gcloudコマンドでFunctionをアップロード

今回のトピック名はsample_pubsubとしています

gcloud functions deploy HelloPubSub --runtime go111 --trigger-topic sample_pubsub

実行とログ確認

実行コマンド

gcloud pubsub topics publish sample_pubsub --message '{"test1":"Test1" ,"test2":"Test2"}' --attribute name=wrench,name1=name

attributeの設定がわかりづらかったです。キーネームペアで=で結び、カンマで複数設定ができました

ログ確認

gcloud functions logs read --limit 50

ログにDataとAttributeの値が出たら終わりです

2019年1月17日木曜日

急性前骨髄性白血病 地固め二回目まで

地固め二回目

大晦日に地固め一回目が終了し、一時退院
地固め二回目として2019/1/7に再入院

地固め二回目

何を行うか?
私の場合は標準治療のため、
抗がん剤としてはダウノマイシンとキロサイドを使いました。
ダウノマイシンを3日連続30分
キロサイドは5日連続24時間

点滴中の副作用

初日は何故か大丈夫でしたが、二日目の朝から酷い吐き気が出た
いろんな種類の吐き気どめを打たれるが、たいして効果が無いので、
諦めて容器に向かって吐いていたが、胃の中が空なのか特に何も出なかった
とりあえず部屋の電気を決して時間が経つのを待った
四日目辺りからダウノマイシンが外れたことによりだんだんと回復
キロサイドが終わった日の夜からご飯が食べれるようになった

抗がん剤終了後からすぐに血液データ上では好中球や白血球、赤血球などが減少
インフルエンザが流行っていると言うことでお見舞いなども全部禁止となり、お部屋に軟禁

分子遺伝学的完全寛解

地固め二回目の初日に行ったマルクの最終結果が2019/1/17に出たようで、分子遺伝学的完全寛解とのことでした。
これでとりあえず地固め二回目で現状の技術では見える範囲から白血病細胞が全部消えた模様