Cloud Next 2018 MicroServices & APIs

こちらのイベントでの登壇資料です。 Cloud Next 2018 のセッションの中でアプリケーションエンジニアに役立ちそうな内容をまとめています。 mercari.connpass.com MicroServices & APIs from pospome

decorator, presenter, exhibit という3つの実装パターンについて

@a_suenami さんのこのツイートの Decorator, Presenter, Exhibit が気になったので調べてみた。表示に関するデザインパターンは大きくDecoratorパターン、Presenterパターン、Exhibitパターンの3つがあります。で、Exhibitパターンが一番柔軟ですが小さいア…

Go における FunctionalOptionPattern と MethodChaining について考える

きっかけ FunctionalOptionPattern MethodChaining MethodChaining の問題点 Error フィールドによる解決方法 Error フィールドによる解決方法の問題 1. 各メソッドでエラーが発生しないような印象を受ける 2. エラーチェックを忘れそう その1 3. エラーチェ…

書籍「Real World HTTP」の学習効率の高さについて

今更ながら、Real World HTTP を読んでみたので、 学習効率という視点で感想を書いてみようと思う。www.oreilly.co.jp 対象となる読者が広い スラスラ読める 好きなところから読める 一通り目を通すことを推奨 Go言語は関係ない キャッシュの仕様 HTTP2が載…

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…

goddd とは何か?

これは Go Advent Calendar 2017 その2 6日目の記事です。 https://qiita.com/advent-calendar/2017/go2みなさん、こんにちは。 pospome です。 普段は GAE/Go でサーバサイドの開発をしています。twitter では 実装パターン, DDD, golang, GCP についてつぶ…

golang のレイヤ構造において、他のコードに影響なくインフラレイヤのデータソース実装を差し替えることは可能か?

最近、golang のレイヤ構造において、他のコードに影響なくインフラレイヤのデータソース実装を差し替えることは可能か? という質問を受けた。回答時間が限られている中で質問を受けたので、 「現実的には難しい」という雑な回答しかできなかった。さすがに…

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…

Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える

devfest 2017 tokyo の発表資料です。 Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える from pospome 当日は入室できない人もいたらしい & 機材トラブルで10minほど開始が遅れてしまった ということで申し訳なく思っています。また、立…

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…

golang の iota の使い所

自分は iota の使い所が分からなかった。 なんか事故りそうだし、明示的に値を宣言した方が分かりやすいような気がする。で、こんなツイートをしたら・・・#golang の iota 使った定数定義って、定数の並び順によって値が変わるから、なんか事故りやすい印象…

golang の 引数、戻り値、レシーバをポインタにすべきか、値にすべきかの判断基準について迷っている

日頃から引数にポインタを渡した方がいいのか? 値を渡した方がいいのか? 戻り値はどーなの? メソッドのレシーバは?なんて迷っているのでアウトプットしてみる。メソッドのレシーバについては以下に載っていた。 https://github.com/golang/go/wiki/CodeRevie…

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分ごとに起動する」という設定をしたかったので、以下…

どこに何を書くのか?

これのLT資料。 kaizen.connpass.com どこに何を書くのか? from pospome Twitter の反応 「どこに何を書くのか?」設計論の話だ #code_kaizen— masataka arai (@massa142) 2017年6月29日 コードの責務とか疎結合とかそういう実装よりの話っぽい。 #code_kaiz…

アプリケーションコードにおける技術的負債について考える

社内勉強会資料 アプリケーションコードにおける技術的負債について考える from pospome

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

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

Datastore/Go のデータ設計と struct の振る舞いについて

golang tokyo #5 の LT資料です。 golangtokyo.connpass.com Datastore/Go のデータ設計と struct の振る舞いについて from pospome 以下のような感想をいただいたり・・・参考になる #golangtokyo— コキチーズフレンズ (@k2wanko) 2017年4月27日 AppEngine …

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 というエラーが発生する。 *データが…

Goのシンプルさについて

LT資料です。 Goのシンプルさについて from pospome

golang + mysql の ORM を色々調べた感想とおすすめ

普段は GAE で golang を使っているけど、 golang で mysql 使ったことないってのもどうなのかな? と思ったので、 ちょっとしたサンプルアプリを通して mysql を使ってみようと思った。 で、ORM どーしーよーかなと思って、 色々調べた記録です。標準パッケ…

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

Datastoreを使っていて、 ある程度コツとか注意点みたいなものが分かってきたので、 まとめてみました。 継続的に追記していく予定です。間違っているところがあれば コメント or twitter で教えてください。Datastoreの entity, kind などの用語は理解して…

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…