GCP

SpannerでSHOW CREATE TABLEのようにテーブル定義とインデックスの定義を取得する

GCP

取得方法は2つある。1つ目1つ目の方法はGCPのConsoleから確認する方法。 ConsoleでSpannerを表示して、instance -> database を選択するとテーブル一覧画面が表示される。 その一覧の一番下に"Show equivalent DDL"というリンクがあり、 そこからDB内の全テ…

golang の「埋め込み」を利用した実装アンチパターン

最近、time.Time を独自の struct で埋め込んだ実装をみかけたので書いておこうと思った。結論から言うと、 標準パッケージやライブラリで定義されている型に対して「埋め込み」を使うと、 コードが正常に動かなくなる可能性があるので、 注意した方がいいと…

GAE の TaskQueue(PushQueue) で、delay パッケージと HTTP の受け口(handler)を定義するのは何が違うのか?

GCP

TQ を利用するとき、 いつもはタスクを受ける HTTP の受け口(handler)を定義して、 taskqueue パッケージで実装を完結させていただけど、 「今回は delay パッケージ使ってみようかなー」 と思ったので違いを調べてみた。それぞれの使い方とかはネットに転…

GAE/Go の urlfetch のタイムアウトを設定する

ググると、旧 appgneine パッケージに対する設定方法しか引っかからないので、 google.golang.org/appengine に対する設定方法をメモとして残しておく。結論から言うと、 context.WithTimeout() or context.WithDeadline() を利用して設定する。以下は conte…

GAE の SocketAPI とは何か?

GCP

存在は知っていたが、 普段 GAE を利用する上で特に利用する機会がなかったので、 SocketAPI について調べてみた。 SocketAPI クオータ GCPサービスとSocketAPI 課金してないとエラー まとめ SocketAPIドキュメントは以下。 https://cloud.google.com/appeng…

Datastore へのキャッシュに Memcache を利用している場合、Memcache が落ちると Datastore のパフォーマンスが劣化することがある

GCP

Datastore へのキャッシュに Memcache を利用している場合、 Memcache が落ちると Datastore のパフォーマンスが劣化することがある。当たり前と言えば、当たり前だが、 こういったケースを想定できていなかったので、 書いておく。 パフォーマンス劣化につ…

datastore のバックアップが失敗する際のエラー

GCP

Datastore のバックアップが失敗すると以下のようなエラーが出る。 Transaction collision. Retrying... (/base/data/home/runtimes/python27_experiment/python27_lib/versions/1/google/appengine/api/datastore.py:2688)Contention on slice xxxxxxxxx ex…

goon で goon: Failed to decode field createdAt - gob: decoding into local type time.Time, received remote type []int のエラー

struct のフィールドを1つ削除してから goon で Get() したら以下のエラーが出た。 goon: Failed to decode field createdAt - gob: decoding into local type time.Time, received remote type []int craetedAt が decode できなかったらしい。 で、根本原…

cloud console から datastore に任意の int の key を指定した entity を作成できない

GCP

datastore 上に 特定の int の ID を key とするマスターデータを作りたいと思った。 例えば、以下のように key に既存の商品IDをセットするようなケース。 -------------------------- key | name | createdAt -----|------|------------- 1001 | 醤油 | 20…

Datastore/Go の cannot load field xxxx into a xxx: no such struct field は Goon で回避できる

以下のブログに書いてある通り、 pospome.hatenablog.comDatastore は kind の property が struct の field に存在しないと ErrFieldMismatch というエラーが発生する。「datastore: cannot load field xxxx into a xxx: no such struct field」のエラーと…

GAE/Go TaskQueue の max_doublings について

GCP

なんかググってもあんまり出てこなかったので、自分用メモ。TaskQueue のリトライは queue.yaml で設定する。以下のように設定すると、 task_retry_limit: 5 min_backoff_seconds: 10 max_backoff_seconds: 40リトライ間隔は 10s -> 20s -> 30s -> 40s -> 40…

GAE/Go の cron を毎時同じ時刻に起動させるための synchronized の設定

GCP

ちょっとハマったので書いておく。 結論から言うと、synchronized を設定すればいい。GAE の cron は yaml で設定する。 https://cloud.google.com/appengine/docs/standard/go/config/cronref今回は「30分ごとに起動する」という設定をしたかったので、以下…

GAE/Go の goon が出力するエラーを止める

goonの内部で以下のようなエラーが出力されていた。 ERROR: goon - goon.go:194 - pospome error エラーメッセージの「pospome error」は以下のように自分が用意した error なので、 このエラーを返しているどこかで goon がエラーログを出力しているみたい…

Datastore/Go で datastore: unsupported struct field type: xxx のエラー

GCP

以下の struct を Datastore に put しようとしたら・・・ type User struct { _kind string `goon:"kind,User"` ID string Tasks []*Tasks } type Task struct { Title string } 以下のエラーが発生した。 datastore: unsupported struct field type: *Task…

Datastore/Go の Get(), GetMulti() で指定した key が存在しない場合はエラーになる

GCP

ちょっとまとめておこうかと。間違っているところがあったらブログのコメント or twitter で教えてください。 (´・ω・`)Datastore では Get() に指定した key の entity が存在しない場合、 datastore.ErrNoSuchEntity というエラーが発生する。 *データが…

(2018/2/26 追記)Datastore/Go のデータ設計のコツ

僕の Datastore の記事は Cloud Datastore/AppEngine Datastore 時代のものなので、現在の Firestore の Datastore mode だと一部の内容が正しくないと思うので注意してください。(´・ω・`)— pospome (@pospome) March 24, 2021 Datastoreを使っていて、 あ…

Datastore/GO で datastore: flattening nested structs leads to a slice of slices: field xxx

以下のエラーが出た。 datastore: flattening nested structs leads to a slice of slices: field xxx Datastore は以下のように struct をネストすることができるが、 type A struct { B []B } type B struct { Name string } 以下のようにネストした struc…

goonで生成されるmemcacheのキー

goonで生成されるmemcacheのキーってどーやって作ってんのかな? と思って調べてみました。以下で生成している。 https://github.com/mjibson/goon/blob/master/goon.go#L71-L74Entityのkeyをエンコードして、「g2:」というプレフィクスを付けている。 ローカ…

DataStore で Only ancestor queries are allowed inside transactions. のエラー

GCP

DataStore で以下のエラーが出た。 Only ancestor queries are allowed inside transactions. のエラーググると以下がヒット。 http://stackoverflow.com/questions/14397207/why-do-i-get-only-ancestor-queries-are-allowed-inside-transactions-error結論…

DatastoreのParentKey(AncestorQuery)の特徴と使い所(datastore when to use parentkey)

GCP

とはいえ、ちょっと自信ないので、 間違っている箇所があれば指摘してもらえると嬉しい。 ParentKeyはEntity同士を関連付けるキーのことで、 RDBでいう外部キーのようなイメージを持つかもしれないが、全然違う。 何も考えずにParentKeyでリレーションを貼る…

BlobStoreAPI で Error: Server Error

BlobStoreAPIで以下のエラーが発生した。 Error: Server Error The server encountered an error and could not complete your request. If the problem persists, please report your problem and mention this error message and the query that caused it…

golang + BlobStoreAPI で ERROR: blobstore: error reading next mime part with boundary "===============xxxxx==" (len=xx): multipart: NextPart: EOF のエラー

ERROR: blobstore: error reading next mime part with boundary "===============xxxxx==" (len=xx): multipart: NextPart: EOF GAEのBlobStoreAPIにファイルをアップロードした後にリダイレクトされるエンドポイントで 以下のように blobstore.ParseUpload…

golangでGCSにzipファイルをアップロードする

zipだからといって、特別なことは必要ない。 普通に書き込めばいいだけなので、 zipファイルを読み込んで、 以下のGCSのサンプルにあるように wc.Wtite() に []byte を渡してやればいい。 https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master…

Google Cloud Storage のバケット直下にフォルダを作成する

GCP

結論から言うと、 ファイル名をスラッシュ区切りにすれば自動的にフォルダが作成される。GCSのサンプルコードでいうと、 以下の fileName という引数を 「my_dir/test.txt」のように指定すれば、my_dir の下に test.txt が生成される。 https://github.com/G…

GAE で Error: Request Entity Too Large のエラー

GCP

以下のエラーが出た。 Error: Request Entity Too Large Your client issued a request that was too large.これは GEA に送信するデータが制限を超えている場合に出る。 自分は 45MB くらいのファイルを form から POST したら発生。 このファイルをGCSに保…

Google Coud Storage はローカルの開発サーバでエミュレートできない

GCP

エミュレートできないので、 GCPにデプロイして確認する必要がある。https://cloud.google.com/sdk/gcloud/reference/beta/emulators/対応しているのは以下のみ。bigtable https://cloud.google.com/sdk/gcloud/reference/beta/emulators/bigtable/datastore…