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

社内勉強会資料 アプリケーションコードにおける技術的負債について考える 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 どーしーよーかなと思って、 色々調べた記録です。標準パッケ…

(継続的に追記)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…

Go で cannot assign to xxx のエラー

ググると色々情報があるが、 日本語の情報がないので書いておく。https://play.golang.org/p/atdCt2Mken ↑ これを実行すると「cannot assign to struct field users[0].Connected in map」のエラーが出る。結論から言うと map が問題らしい。go - Why do I g…

Go のブランク識別子を利用した import による pakcage への副作用

ORMを調べていると以下のような import を見かけた。 import _ "github.com/go-sql-driver/mysql" 調べてみると、 これはブランク識別子を利用した import で、 import 対象のパッケージを初期化するためのものらしい。つまり、 init() や package value と…

Go の init() が呼ばれる順番

結論から言うと、import される順番に依存する。以下のような main での import を例にすると、 first の init() が呼ばれた後に second の init() が呼ばれる。 package main import ( myapp/first //最初に呼ばれる myapp/second //次にこれが呼ばれる ) f…

struct に static method は必要か?

golang を触りたての頃、struct に static method を実装したいと思った。なぜかというと、 1つの package に function をずらーっと定義すると、 なんだか冗長な命名になってしまうから。 util.UserXxx() util.TeamXxx() util.EventXxx() package を切って…

struct に依存しない処理は function に切り出すのか、method に切り出すのか

以前少し考えて自己解決して終わったんだけど、 ちょっとしたきっかけがあったのでアウトプットしてみる。以下のような Person があって、 Hello(), Goodbye() には全く同じ「複雑な処理」がある場合・・・ type Person struct { name string } func (p *Per…

golang の WAF のオートリロード

https://github.com/codegangsta/gin ↑ この gin ってやつを使うと ソースコードの変更検知 + オートリロード が可能になる。 ちなみに、以下の WAF とは別物です。 https://github.com/gin-gonic/gin https://github.com/codegangsta/gin#supporting-gin-in…

vagrant の SSH auth method: password で Authentication failure

vagrant up したら Authentication failure で先に進まなくなった。 default: SSH username: root default: SSH auth method: password default: Warning: Remote connection disconnect. Retrying... default: Warning: Remote connection disconnect. Retr…

golang のメソッド名の Must について

https://golang.org/pkg/regexp/#MustCompile ↑ こんな感じで Must が付いているものがある。 Must が付いているものは error を返す代わりに panic を発生させる。で上記の MustCompile() の説明文の一部が以下。 It simplifies safe initialization of glo…

golang の embedding について思ったこと

この記事は Go (その2) Advent Calendar 2016 の20日目の記事です。どーもpospomeです。(´・ω・`) GAE/GO の環境でサーバサイドエンジニアとして働いています。twitter では 実装パターン, DDD, golang, GCP についてつぶやくことが多いです。 同じような分…

fatal: could not read Username for 'https://github.com': terminal prompts disabled

プライベートリポジトリをgo getする方法 - lnrvrs ↑ これだった。 token を生成して、url instead of して終わり

パッケージの循環参照

循環参照についてです。 パッケージの循環参照 from pospome

goonで生成されるmemcacheのキー

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

golang + IntelliJ の import パス補完に _vendor, src が含まれる

気になったので調べてみたプロジェクトルートの指定方法が間違っている可能性が高い。以下のようなディレクトリ構成の場合 Myapp _vendor src myapp hanlder handler.goIntelliJ のプロジェクトルートを Myapp に指定すると、 _vendor とか src が含まれる。…

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結論…

CQRSのコマンドでユーザーの入力エラーを返したい

結論から言うと、 DDDの.NET本の実装だとC#の async/await でイベント送信を非同期にしながらも、 同期的に戻り値返してたから、 これが正解なのかね・・・って感じです。 以下は色々調べた結果です。 過去にも似たような記事を書いたけど・・・・ http://d.…

.NETのエンタープライズアプリケーションアーキテクチャ

読みやすいDDD本ってイメージかな・・・。DDDの概念や用語について触れているので、 DDD本のような「DDDとは?」というのも学べるし、 具体的にどう実装するのか? っていうのも載っているので、実践DDD本のようでもある。自分はDDD本、実践DDD本、どちらも読…

DDDにおいて、なぜ複数の集約にまたがってトランザクションをかけてはいけないのか(multiple aggregates in one transaction)

DDD

DDDでは 集約 = トランザクション境界 でなければならないので、 複数の集約をまたがるデータの永続化処理は結果整合性になる。なぜ集約をまたいでトランザクションをかけてはいけないのかというと、 集約で「データの一貫性の境界」を表現するため。 なので…

golang の http request の panic を捕捉する

panic の画面が表示されてしまうので、 どうすればいいのかを調べてみた。echo の middleware ではリクエストを defer して recover してるみたい。 https://github.com/labstack/echo/blob/master/middleware/recover.go#L65-L81 /net/http にもそれっぽい…

プログラマが知るべき97のこと

読みました。「知るべきこと」は1つが2ページほどで、 それぞれが独立している。気になったところだけパッと読めばいいかと。勉強に疲れた時の息抜き用に読んでみるといいかもしれない。

CQRSのコマンドで戻り値を取りたい場合はどうするのか(cqrs command return value)

----- 2016/10/23 追記 --------- コマンド操作が実行されると、 controller で アプリケーションサービスを呼び出す実装ではなく、 controller でコマンドを発行し、 bus で受信し、 saga で処理していくような実装を想定しています。詳しくは .NET本 を見…

golangの正規表現は遅いのか?

golangの正規表現は遅いって聞くけど、実際どーなんだろ? って思ったよっていう記事です。 おそらく、この記事を読んでも何も得られないと思います。 -----追記 2016/11/26 ------- 書籍「みんなのGO言語」で少し言及されていました。 golang の正規表現は場…

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

GCP

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

golang の 名前付き結果パラメータ(Named Result Parameters)の利点とか欠点とか使い所について

以下にある。 https://github.com/golang/go/wiki/CodeReviewComments#named-result-parameters日本語でまとめてあるのが以下。 ページ内を「名前付き結果パラメーター」で検索すると出てきます。 http://aial.shiroyagi.co.jp/2016/07/golang-api-server-de…

golang で {"key1":"value1", "key2":"value2"} のJSON字列を map[string]string に変換する(golang json to map)

なぜか苦戦したのでメモしておく。https://gobyexample.com/json ↑ ここに書いてある。上記から抜粋したのが以下。 json.Unmarshal() の第一引数が []byte になっているので、string の場合は変換してあげる必要がある。 var dat map[string]interface{} if …

git で fatal: reference isn’t a tree: xxxxxxx

以下のエラーが出た。 $ git submodule update fatal: reference isn’t a tree: 6c5e70b984a60b3cecd395edd5b48a7575bf58e0ググると以下を発見。 http://blog.machacks.net/2013/10/25/reference_is_not_a_tree/基本上記の記事で解決すると思うが、 自分の場…

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に保…

マイクロサービスアーキテクチャ

https://www.oreilly.co.jp/books/9784873117607/読みました。やっぱりマイクロサービスは面倒。 大規模なサービスとか大規模な組織に適している印象。個人で何か作ろうと思っても、マイクロサービスは採用しない。 後から小さく切り出せるようにはしたいけ…

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…

なぜあなたはJavaでオブジェクト指向開発ができないのか

読みました。オブジェクト指向の入門書的な感じなので、 分かりやすく基礎が学べる気がする。言語が Java なので、 当然ながら interface, abstract が存在しない言語だと その通り作れないんだけど、 それでも考え方自体は役に立つと思う。

オブジェクト指向をきちんと使いたいあなたへ

読みました。ActiveRecordのように機械的にテーブルに紐づくモデルを作って、 それに対してメソッドを生やしていく実装をしていると、 「仕様を反映した本来あるべき姿のモデル」を見失う可能性があるなと感じた。「本来あるべき姿」とフレームワーク、ライ…

golang で type XXX has both field and method named YYY

golang で以下のエラーが出た。 type XXX has both field and method named YYY「XXX はYYYというフィールドとメソッド両方を持ってます」つまり、struct に同名のフィールドとメソッドは定義できない。理由は以下にある。 https://groups.google.com/d/msg/…

コンストラクタで例外を投げていいのか?

コンストラクタで例外を投げていいのか?自分はコンストラクタで例外を投げる派。これはオブジェクトを生成する条件を満たしていないのであれば、 そもそも生成させないようにしたいから。golang で書くとこんな感じ。 golang は例外ないから error を返して…

golang の 正規表現で error parsing regexp: invalid or unsupported Perl syntax: `(?=`

golfing の 正規表現で以下のエラーが出た。 error parsing regexp: invalid or unsupported Perl syntax: `(?=`これは正規表現の「(?= 」(肯定先読み)をサポートしていないってことらしい。 使えないのか・・・。対応しているライブラリはあるみたい。 ht…

DDDと高負荷サービス(というか I/Oアクセス)は相性が悪いのか?

DDD

DDDはActiveRecordパターンのように1つのモデルが1つのテーブルと紐づくとは限らない。具体例を出すと、 DBにUserテーブルがあるからといってUserモデルを作るとは限らない。ログインユーザーを表現するLoginUserモデルと ユーザーのプロフィールを表現するU…

DDD における不要な getter/setter を実装するべきではないという件についての挫折と感想

DDD

別にDDDにかぎらず、 不要な getter/setter を実装しない方がいいというのはその通りなんだけど、 DBに紐づくモデルの getter に関してはそれができないケースがある。利用するORMによって、DBに紐づくモデルに規約が定められている場合は無理。 例えば、ク…

railsのControllerのbefore_actionにおける インスタンス変数セット(データ読み込み)について

Controllerのbefore_actionにおける インスタンス変数セットについて from pospome

vagrant + docker + mysql で mysql を起動したら Check that your OS and file system support files of this size のエラーが出た

発生したエラーは以下。 2016-05-05T10:22:59.842109-00:00 0 [ERROR] InnoDB: Write to file /var/lib/mysql/ibdata1failed at offset 8388608, 1048576 bytes should have been written, only 0 were written. Operating system error number 28. Check th…