Quantcast
Channel: daisuzu's notes
Browsing latest articles
Browse All 45 View Live

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

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

View Article


gopls(v0.4.0)の機能

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

View Article


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

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

View Article

goplsのSymbolMatcherとSymbolStyleオプション

以下の記事で、workspace/symbolのオプションは補完と同じmatcherと紹介したが、現在のv0.4.4ではsymbolMatcherとsymbolStyleになっている。...

View Article

ISUCON10に初参戦してみた

ゴリラさんと出てみようと話していたものの、申し込みのタイミングを逃してオワタと思っていたら@inductorさんに拾ってもらい、カンガルーと犬とゴリラとしてなんとかISUCON10に参加することができました。当日は開始ちょっと前*1にDiscordとGoogleドキュメントでコミュニケーションすることを決め、...

View Article


GoでDBのテストにgithub.com/cockroachdb/copyistを使う

久しぶりにMySQLを使ったシステムを触ることになったものの、現状のテストが遅すぎたので高速化に取り組むことにした。遅い原因としては、テストでDBを使うパッケージが多いので接続時間がそれなりになってしまうテストケースごとにTRUNCATE→INSERTでデータを入れ直しているといったところ。なので今回はDBにアクセスしないでテストができるようになるcopyistを試してみようと思う。github.c...

View Article

編集を加速するVimのquickfix機能

この記事はVim Advent Calendar 2020の3日目の記事です。昨日は@mira010さんのvim...

View Article

go-cmpでmap[string]interface{}のJSONを比較する

GoでJSONを扱う際、型を定義せずに map[string]interface{}を使いたくなることがあります。var ( a = map[string]interface{}{ "data": map[string]interface{}{ "value": int64(1), }, } b = map[string]interface{}{ "data":...

View Article


Image may be NSFW.
Clik here to view.

go/analysisのSuggestedFixでコードを修正する

Goの既存コードを修正するツールを作る時、既存コードをどう書き換えて出力してテストするかを考えなければいけないのが少し面倒だと思っていました。が、golang.org/x/tools/go/analysisのSuggestedFixを使えばすごく簡単にできてしまいます。golang.org/x/tools/go/analysisは...

View Article


Image may be NSFW.
Clik here to view.

vim-lspのCallHierarchyをツリーっぽく表示する

リファクタリングしたりコードを調べたりする時、呼び出し元を探すのにLspReferencesやLspCallHierarchyIncomingを使っていた。ただ、どちらも1階層分しか表示してくれず、呼び出し元が遠いと影響範囲が把握しにくかったのでquickfixに結果をマージして表示するコマンドを作ってみた。command! AppendCallTree call...

View Article

GoのWebアプリで見かけたツラいコード

構造体のフィールドにContextを持たせるContextの中に参照を入れておいて任意の場所で更新する似ている処理を匿名の構造体でまとめる構造体のフィールドにContextを持たせるほとんどの場合、各メソッドの引数にいちいちctxを渡すのが面倒だという理由だけで以下のようにしている印象がある。type S struct { ctx context.Context } func (s *S) A()...

View Article

みんなで書くGoのエンドポイントテスト

Webアプリケーションサーバーに何か大きな変更をしたいけど、既存のテストだと心許なかったので各エンドポイントにHandlerからのテストを追加することにした。ただ全部のテストを自分1人で作っていくのはボリューム的に現実的ではなかったので、どうしたらチーム全員が書きやすいテストになるか考えて色々と整備してみた。テストの書き方がある程度決まっている期待する結果(want)を全て書かなくても良いテストの前...

View Article

xorm更新用のテストを静的解析で生成した時のメモ

前に書いた↓を使ってxormのバージョンを上げようと思っていたけど、生成されるSQLがおかしくなることがあると聞いたのでさらにテストを拡充することにした。daisuzu.hatenablog.comといってもまだ完成していないので、ここまでやったことを備忘録*1として残しておいて続きは連休明けにやる予定。方針としてはxormがDBのドライバーを呼んだ際のクエリを記録・比較できるようにし、それを実行す...

View Article


goplsのdaemonモードを使う

goplsはgopls -listen=<addr>で実行するとdaemonモードで起動し、指定した<addr>でTCP接続できるようになる。github.comクライアントはgoplsを使っても良いし、独自に実装することも可能。その場合、TCP上で以下のような形式のJSON-RPCを送受信すれば良い。 (改行は\r\n)リクエストContent-Length:...

View Article

goplsと静的解析を活用して変更の影響範囲を調べたい

1000パッケージ弱あるような巨大なリポジトリだと、関数1つの修正でどこまで影響があるのかを調べるのが結構大変*1だったりする。Vimプラグインを作ったり、goplsを魔改造してみたりしてみたものの、使う人や環境を選ぶし、実行速度もイマイチだったのでもっと使い勝手の良いものが欲しかった。そこでPull...

View Article


xorm.EngineGroupで複数のDBをまとめる

データベースをWriterとReaderで分けている時、xorm.ioのEngineGroupを使うことでどちらのDBを使うのかを任せられるようになります。使い方は通常のNewEngineと似ていて、NewEngineGroupの第2引数に接続先をスライスで渡します。接続先のスライスは1番目がWriter、2番目以降がReaderになります。xorm.NewEngineGroup(driverNam...

View Article

Image may be NSFW.
Clik here to view.

aws-sdk-go-v2をモックせずにテストする

テストでaws-sdk-go-v2を使う場合はドキュメントにある通り、Clientのモックを用意するのが一般的な手法かと思います。ただテストのためだけにinterfaceを書きたくないので、aws-sdk-go-v2が提供するClientをそのまま使える形にしたいです。幸いaws-sdk-go-v2はClientをカスタマイズするためのオプションがあるため、大別して以下の2つの方法で実現可能です。1...

View Article


Goのモジュールを個別に更新する

特に問題なければ go get -u ./...で全て更新してしまうのが楽ですが、更新できないモジュールがある場合は個別に更新する必要があります。go list -m -u allで全モジュールとその更新有無を確認できるため、 -fでgo getコマンドを出力するようにし、必要なものだけ実行すると楽です。例えばgoplsはそのまま実行すると以下のようになりますが、$ go list -m-u all...

View Article

Vimのterminalでパイプを使う

この記事はVim Advent Calendar...

View Article

go-cmpでmap内の時間文字列を近似比較する

以下のような関数をテストする際、期待する値もtime.Now()で生成して概ね問題ない。func f() map[string]interface{} { returnmap[string]interface{}{ "time": time.Now().Format("2006-01-02 15:04:05"), } }...

View Article

golang.org/x/exp/jsonrpc2を使ってgoplsに接続する

最近golang.org/x/expにjsonrpc2が追加されていることを知ったので試してみた。 pkg.go.dev基本的な使い方としてはDialでConnectionを作成し、レスポンスが返ってくるメソッドはCall +...

View Article


QNAPをTS-233に移行した

今までTS-231を使っていたけど、たまに落ちることがあったり去年ついにサポートが切れてしまったのでTS-233に移行した。手順はTS-231の電源を落として、HDDを入れ替えて、TS-233を起動するだけ。起動後は固定IPにしていたのがDHCPになっていた*1のでQfinderで探し、一応IP設定を戻しておいた。それ以外はデータもアカウントもそのまま引き継がれていたので特に何もしなくて良かった。*...

View Article


goplsに独自Analyzerを組み込む

internal/lsp/source/options.goのdefaultAnalyzers()が返すmapに自作のAnalyzerを追加してgo...

View Article

Vimの極意

この記事はVim Advent Calendar...

View Article

Goの外部パッケージに独自の変更を加える

外部パッケージを使っていて、ちょっとした修正を試したい時は以下のような方法があります。1. 外部パッケージをForkしてgo.modで置き換える2. 外部パッケージのコピーをリポジトリに追加してgo.modで置き換える3. 変更したファイルをリポジトリに追加してoverlayで書き換える1....

View Article


macvimをビルドする(2023/08)

だいぶ前にも書いていた。daisuzu.hatenablog.comここ最近は毎朝UpdateMacVimを実行している。*1UpdateMacVim() {cd$HOME/go/src/github.com/macvim-dev/macvim git fetch origin master if [-z"`git diff FETCH_HEAD --shortstat`"];thencd -...

View Article

github.com/swaggest/openapi-goを使ってOpenAPIを生成する

github.com/swaggest/openapi-goを使うとGoのコードからOpenAPIの定義(json/yaml)を生成できる。pkg.go.dev例:package main import ( "encoding/json""fmt""log" openapi...

View Article

gnosticでOpenAPIをProtocol Buffersに変換する

gnosticとgnostic-grpcを使えばOpenAPIの.yaml(.json)を.protoに変換できる。github.comgithub.com1. gnosticをインストールする2. gnostic-grpcをインストールする3. 変換する1. gnosticをインストールするgo install github.com/google/gnostic@latest 2....

View Article

VimConf 2023 Tiny に行ってきた

昨日(11/18)はVimConfに行ってきました。前回が2019年だったので実に4年ぶりの開催でした。vimconf.org2017年から2019年は3回ともスピーカーでしたが、今回は久しぶりの一聴衆でした。なので当日は全く緊張する必要がなく、とても穏やかな気持ちで参加することができました。また、休憩時間や懇親会などで久しぶりに会えた人と話をすることができ、とても懐かしい気持ちになりました。そして...

View Article



VimConf 2024に行ってきた

前回はTinyでしたが、今回はNormal...

View Article
Browsing latest articles
Browse All 45 View Live


Latest Images