Skip to content

Go

proto

proto定義何もわからない。。

REST用のパスを定義するために

    option (google.api.http) = {
      get : "/example-messages/{id}"
    };

といった定義が必要で、これを使うには

import "google/api/annotations.proto";

が必要らしいという理解なのだけど、これをビルドしようとすると

event.proto:6:1: Import "google/api/annotations.proto" was not found or had errors.

というエラーが出てしまう。

こういうところで躓くの嫌すぎる。

protoをマスターにする

protoをAPIスキーマのマスターにしようとした場合、既存のOpenAPIで用意していたUIとかどうしよう、ということになるけれど、OpenAPI->gRPCとは違って逆の変換はたくさんツールがあることは調査済み。

全体の作りとしてはgrpc-gatewayでgRPCとREST両対応のサーバを作る | フューチャー技術ブログこんな感じにするのが良さそう。

ということでまずはマネするところからやっていきたい。

Read more

OpenAPIからgRPCへの移行

今あるOpenAPI用の定義yamlファイルからgRPC用のprotoファイルが生成できないかなと思い、検索したら良さそうなものが見つかった。

https://github.com/umemak/eventsite_go/blob/main/openapi.yml でやってみた。

$ go install github.com/NYTimes/openapi2proto/cmd/openapi2proto
$ openapi2proto -spec openapi.yml -annotate
syntax = "proto3";

package eventsite;

import "google/api/annotations.proto";
import "google/protobuf/empty.proto";

service EventsiteService {
    // Get all events.
    rpc GetEvents(google.protobuf.Empty) returns (google.protobuf.Empty) {
        option (google.api.http) = {
            get: "/events"
        };
    }

    // Create event.
    rpc PostEvents(google.protobuf.Empty) returns (google.protobuf.Empty) {
        option (google.api.http) = {
            post: "/events"
        };
    }
}

serviceは作られているけど、messageは作ってくれてないっぽい。

Read more

gRPCを触ってみる

gRPCを触ってみたくなったので、gRPCがフロントエンド通信の第一の選択肢になる時代がやってきたかも? | フューチャー技術ブログをやってみる。

frontendでnpm installするところでgitエラーになってしまう。

$ npm install --save-dev bufbuild/protoc-gen-connect-web bufbuild/protoc-gen-es
npm ERR! code 128
npm ERR! An unknown git error occurred
npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/bufbuild/protoc-gen-connect-web.git
npm ERR! git@github.com: Permission denied (publickey).
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

とりあえず置いておいて先に進めるが、結局buf generateするところで出力先がないのでエラーになってしまった。

Read more

Goで設定を良い感じに処理する方法

コマンドラインで引数を処理する順番は以前調べたことがあるのだけど、これをいい感じに処理してくれるGoのライブラリが欲しい気がする。

まず設定ファイルを読み、環境変数が設定されていれば上書き、コマンドラインで指定されていればさらに上書き

ざっと検索してこんな感じでいろいろありそうだけど、環境変数を扱うものが多い気がする。

Read more

MLTファイルを読む

MLTをgoのstructに読み込もうとして、やっぱりよくわからない。

MLT自体の仕様はmltframework/mlt: MLT Multimedia Frameworkにある。

xsdファイルがあればdroyo/go-xml: utility and code-generation libraries for XMLとか使ってgoで使えるようにできそうなんだけど、dtdしかない。

っていうかdtdをstructに書き換えれば良いのか?

と思ったけど良さそうなものが見つかった。miku/zek: Generate a Go struct from XML.

Read more

MLTファイル生成

機能追加していたら、ダメなコードの見本みたいになり始めてきた。

機能ごとに分けるとかし始める必要がありそう。

あと、XMLの出力をベタに文字列結合でやっているので、ちゃんとライブラリ使って生成するようにしたい。

Goだとxml package - encoding/xml - Go PackagesのMarshalを使えば良さそうだけど、構造体の定義面倒だな。。

Ginkgoやめた

普通にGoのテストとして書いたほうが融通が利くので、そのようにすることにした。

たぶん使いどころが間違っていたのだと思う。

適所であればGinkgoも有効なはず。