Goでprotobufの定義をimportせずにフィールドの値を使う

Go

以下のようなコードでreqにあるフィールドを使いたい場合、 opt := grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { // …

gopls(v0.4.0)の機能

Go

goplsは更新頻度が高く、何ができるのかをちゃんと把握できていなかったので、LSPのメソッドベースで今の時点(v0.4.0)の機能をざっと調べてみることにしました。 補完(textDocument/completion) ジャンプ系 textDocument/definition textDocument/typeDefini…

GoでREST APIを呼ぶテストにhttp.FileServerを使う

Go

例えばGET /users/:idのようなAPIの場合、 testdata └── users └── 1 のように、testdata配下のusersディレクトリにidをファイル名としたJSONファイルを配置しておきます。 そうすると、 http.FileServer(http.Dir("testdata")) で、testdata配下のパスとリ…

packagestestのExported.Expectを使ってGoのソースからマーカーを収集する

Go

golang.org/x/tools/go/packages/packagestestパッケージは静的解析など、Goのソースを読み込んで何かしらの処理を行うようなツールのテスト用にダミープロジェクトを作るためのパッケージです。 そういったツールを作る際、テストで期待する結果を完全に決…

goplsでworkspace/symbolが使いたい

現状の最新版(gopls/v0.2.2-pre2)では未実装。 daisuzu.hatenablog.com を書いていたら欲しくなったので第1回 ゴリラ合宿で実装したのがコチラ。 github.com symbolの探索はServerのsessionのViews()から Snapshotを取ってきて、 KnownPackages()のCompiledG…

VimのtagfuncでLSPを使う

vim

この記事はVim Advent Calendar 2019の6日目の記事です。 今年の4月にv8.1.1228でtagfuncという機能が追加されました。 こちらは:tagや:tselectなどのタグ系コマンド*1を実行した時、tagsファイルを検索する代わりに呼ばれる関数を設定するためのオプション…

VimConf 2019に行ってきた

vim

今年もVimConf 2019に行ってきました。 今回はテーマが “how to be more productive with Vim?” ということもあったのか、比較的Vim暦が浅い人の登壇が多かったような気もしますが、その割には発表内容が素晴らしいものばかりだったので、やっぱりVimを使う…

Cloud Datastore用キャッシュパッケージの検討

現在App Engine(Standard Environment) + Go1.11環境*1でgoonというパッケージを利用し、Datastoreのデータをキャッシュしています。 goonはバックエンドとしてApp Engineのmemcache*2を使用しており、こちらがGo1.12から使えなくなってしまうので他のパッケ…

Stackdriverの設定をterraformで管理する

今までアラートポリシーやカスタム指標などのStackdriverの設定をyamlやテキストで保存し、自作ツールで適用するようにしていましたが、自作ツールのメンテナンスが面倒になってきたのでterraformに移行することにしました。 移行にあたって、既存の設定ファ…

Datastore Emulatorのエンドポイント

GCP

Cloud Datastore エミュレータは起動した後、gcloudコマンドではなくREST APIを使って操作するらしい。 が、そのあたりの情報が全然まとまっていなかったので本体の中をチラ見して必要そうなところを調べてみた。 cloud-datastore-emulator 2.1.0 Method Pat…

素のVimでGoを書く時のテクニック

gorillavim.connpass.com にて、 外部ネットワークに繋がらない環境でvimとgoしか使えない という縛りでライブコーディングをしてきました。 実際にそういう環境があるのか?という話はさておき、そのような状況でも以下を駆使してそこそこコードが書けます。…

App Engineのgo111用ディレクトリ構成

App Engine Standard EnvironmentでGo1.9を使う時は以下のように、リポジトリのルートをGOPATHとして設定し、appcfg.pyを使ってデプロイをしていました。 . ├── app.yaml └── src └── app ├── glide.lock ├── glide.yaml ├── app.go ├── handler ├── ... └──…

MojaveでGDB 8.3を使う

1. インストール brew install gdb --HEAD 2019/04/13時点でインストールされるバージョンは8.3.50。 2019/05/14以降は--HEAD不要。 echo "set startup-with-shell off" >> ~/.gdbinit を実行するようにと表示されるが、ファイルの場所は$HOME/.config/gdb/i…

goonのクエリをチューニングした時のメモ

App Engine(Go 1.9)でDatastoreからデータを取得するのにgoonのGoon.Runを使っていたが、プロパティを追加する改修*1をした後、 latencyが遅くなり、DatastoreでDeadline exceededが頻繁に発生するようになってしまった。 とりあえず該当するリクエストをSta…

第1回 ゴリラ.vimが開催されました

vim

2/18(月)にゴリラ.vim #1が開催され、スタッフ兼発表者として参加してきました。 gorillavim.connpass.com スタッフになったのはvim-jpのslackでゴリラさんこと@gorilla0513さんがVimの勉強会をやろうとしているのを見かけ、これは前々から思っていた渋谷でV…

Vimの折畳に対応したtreeコマンド

golang.tokyo #21のDevQuizはGoでtreeコマンドを作成するというものでした。 treeコマンドといえば、以前Vimでファイル一覧をツリー表示するためのtree.vimというプラグインを作る時に使いました。 github.com このプラグインはディレクトリにマーカーをつけ…

Vimのexecute()と組み合わせて便利なコマンド

vim

この記事はVim Advent Calendar 2018の13日目の記事です。 先月に開催されたVimConf 2018で、Migrating plugins to standard featuresというタイトルで発表してコマンドの結果をバッファに表示する方法を紹介しました。 その中で解説しきれなかったテクニッ…

golang.tokyo 静的解析Dayでgolang.org/x/tools/go/analysisを使ってみた

Go

golang.org/x/tools/go/analysis 面白そうだなー。 けど触る時間がなかなか取れないなー。 と思っていたらちょうどタイムリーなツイートがあり、 12/8とかにGoで静的解析を一緒にモクモクやるかいをどこかでやりたいけど、会場がないので、一緒にモクモクし…

VimConf 2018に行ってきた

vim

VimConf 2018に行ってきました。 今年は@mattn_jpさんだけじゃなく、Vim作者のBramさんも発表するという超豪華Keynoteでした。 また、今年は去年以上に国際色高まるカンファレンスだったんじゃないかなと思います。 運営のみなさま、とても大変だったと思い…

grpc-gatewayでProtocol Buffers over HTTP

grpc-gatewayを使うとgRPCサーバをRESTfulなインターフェースで叩けるようになります。 APIクライアントはswaggerから生成しても良いのですが、Goだとprotocで生成したstructをPOSTする方が依存も少なく、楽なこともあるでしょう。 ということで軽く試してみ…

Goの標準パッケージだけでRESTfulなHandlerを作る

Go

Goのnet/httpパッケージだけではパスパラメータを扱うことができないため、/users/:id のようなエンドポイントを作ろうとしたら自分で処理を書かなければいけない。 適当なフレームワークや3rd-partyのパッケージを使えば簡単ではあるんだけど、時々標準パッ…

Google Codelabs の執筆者用ツールの使い方

Go

今週の GCP 7/2 – google-cloud-jp – Mediumでclaat(Codelabs as a Thing)が紹介されていました。 github.com これを使うとGoogle DocsやMarkdownからGoogle Codelabsのコンテンツを生成することができます。 Markdownでとりあえず試してみる 1. ツールをイ…

リポジトリごとにGOPATHを切る環境でのvim-go

↓のようなリポジトリごとにその直下をGOPATHにする環境でGoを書く時、 . ├── github.com/daisuzu/bar │ ├── bin │ ├── pkg │ └── src │ └── bar │ └── main.go └── github.com/daisuzu/foo ├── bin ├── pkg └── src └── foo └── main.go 両方のリポジトリの…

図のライブプレビュー環境を改善した

Go

PlantUMLで図を書く時もblockdiagと同じようにやろうかなと思ったけど、markdown作ったりpandocのテンプレートを準備するの面倒になったのでその部分をやってくれるサーバを作ってみた。 github.com go get github.com/daisuzu/liveimgしてから goemon livei…

Goで時刻が絡む単体テストをどうするか考える

Go

Goにはtimeパッケージをmockする仕組みが用意されていない。 そのため、time.Nowを以下のようにして使っているコードを見かけることがある。 var Now = func() time.Time { return time.Now() } たしかにこうすることでNow()が返す値を自由に設定でき、単体…

Meguro.vim #8 に行ってきた

vim

Meguro.vim #8 で久しぶりにvimrcを整理し、不要なプラグインや設定なんかを削ったら300行くらい短くすることができた。 ついでにリファクタリングをして、次のような任意のEXコマンドの結果を新しいバッファに表示するコマンド*1を作ってみた。 (今までは特…

gRPCでFirestoreをListenする

昨年の10月にBetaリリースされたCloud Firestoreですが、公式ライブラリによるデータのリアルタイム更新は Web(Javascript) Node.js iOS(Swift or Objective-C) Android しかサポートされていないようです。*1 GAまで待てば良いのでしょうが、今でもgRPCのLi…

2017年の振り返り

年末にやったこと無かったけど、たまには振り返ってみる。 今年は転職活動から始まった年だった。 それから初めて勉強会で発表してきたけど、転職したことがきっかけだったと思う。 ちょっと上手く説明できないけど... 喋ってきたのは Fablic.vim #2 tree.vi…

Vimのカバレッジを見る

vim

この記事はVim Advent Calendar 2017の2日目の記事です。 Vimのカバレッジはcoveralls.ioやcodecov.io上で見ることができますが、手元で見たくなることもあると思います。 そんな時はMakefileに書いてある通り、次のようにしてカバレッジを計測し、生成され…

VimConf 2017でコントリビューターになる話をしてきた

vim

VimConf 2017 - An international Vim Conferenceで speakerdeck.com という発表をしてきました。 最初は25分も話すことなんてあるかな?なんて思ってたら意外と良い感じの時間になりました。 少し足りなかったところを少し補足しておくと、 gitコマンド v8.0…