私が歌川です

@utgwkk が書いている

技術

Go Conference 2024 登壇した #gocon

Go Conference 2024に参加し、登壇してきました。 登壇しました Dive into gomockというタイトルで発表しました。2トラックのどちらかで40分トークかな? と思っていたら2部屋ぶち抜きでトークだったのでビビっていました。 発表資料はこちらです。 speakerde…

Kansai.go #1 に参加してLTした #kansaigo

参加しました。サイボウズさんの大阪オフィスには初めて行きました。 umedago.connpass.com LTのスライドはこちらです。リフレクションしたくなっても早まるな!! という話です。 speakerdeck.com 個人的にはリーンコーヒーがおもしろかったです。Goにまつわ…

Kyoto.go #50 に参加した&LTした #kyotogo

kyotogo.connpass.com 参加して、LTしました。 speakerdeck.com Webアプリケーションを運用する立場からは、多少パフォーマンスが犠牲になるよりもエラーの発生元を容易に特定できるほうがよいに決まっているだろう、となるとやっぱりスタックトレースが欲し…

reflectパッケージでstructのunexportedなフィールドにアクセスするイディオムの正当性を (一部) 確かめる

生きてるといろいろなことがあり、リフレクションでstructのunexportedなフィールドに値を書き込みたくて調べていたら、以下のStackoverflowの回答が見つかった。 stackoverflow.com 以下のようなイディオムでstructのunexportedなフィールドにアクセスでき…

Go Conference 2024でgomockの話をします #GoCon

Well done! Your session Dive into gomock has been accepted for Go Conference 2024! ということなので、よろしくお願いします。「Dive into gomock」というタイトルで、gomockの内部実装に深入りする話をします。 gocon.jp 6/8に渋谷で会いましょう。今…

選択しなかった技術判断に気を払う

技術選択の場面において、ある技術を選ぶということは選ばれなかった技術があるということである。なぜその選択にしたのか、に目が向きがちだけど、選ばなかった技術についても述べるべきだろう。 今回の企画・要件に対して、この技術はこういう制約が見合わ…

ログ

ログ*1、油断すると絶妙に情報量が足りなかったり、欲しいものがdebugレベルでしか出ていなくて本番環境で見れなかったりしがち。ここでこういうログが欲しくなるだろう、という感覚を鍛えるには、実際にログが足りなくて困る経験をするしかないのか、もうち…

GraphQL Cursor Connectionにおけるedgeのnodeフィールドの型は必ずしもNode interfaceを実装していなくてもよい

タイトルが全てです。 GraphQL Cursor Connectionの仕様の3.1.1節には以下のような注意書きがあります。 The naming echoes that of the “Node” interface and “node” root field as described in a later section of this spec. Spec-compliant clients can…

アイコンのステッカーを支える技術

以下のツイートが全てです。 ラクスル シール・ステッカー・ラベル / バラ四角カット / 40x40mm / 光沢紙(アート) / 光沢ラミネート(PP) / 普通のり / カットパス作成: 四角形 50部 受付から7営業日後出荷 2,805円— うたがわきき (@utgwkk) 2024年2月27日 こ…

Goの特定のパッケージだけGitHub Actionsのジョブを分けてテストする

生きてると、テストがどんどん遅くなりがちです。実際にDBに接続するタイプのテストとか……。そしてそういう種類のテストに限って並列化しやすいように実装されていないこともありがちですよね。 GitHub Actionsを使っている場合*1、そのようなテストが複数フ…

aws-sdk-go S3 PutObject MaxMessageLengthExceededエラー 何

tl;dr PutObject のオプションの Bucket フィールドに空文字列を渡していませんか? 環境変数経由で設定する値がうまく渡っていない、などありませんか? もう一度点検してみましょう。 この記事はこれでおしまいです。検索しても全く情報が出てこなくてしばら…

YAPC::Hiroshima 2024に参加した #yapcjapan

参加しました。前日祭や懇親会・アフターイベント・YAYAPCも含めて全て出席していました。 yapcjapan.org どの発表もおもしろく、全てについて詳細に取り上げるには紙面 (紙じゃなくない??) が足りないので、ピックアップ形式にさせていただきます。 とほほ…

ToKyoto.js #02 に参加した #kyotojs

kyotojs.connpass.com 登壇もしました。発表資料は以下です。「発表枠(Kyoto)」という枠がなかなか埋まっていなかったので、自分に話せることがないか、を2日前の夜に絞り出しました。 speakerdeck.com create-react-appの現状と自分との関わりについて話し…

Go Conference mini 2023 Winter IN KYOTOに参加した #kyotogo

参加しました。本当はプロポーザルを提出しようかと思っていたのですが、忙殺されていたら〆切を過ぎていました。そして参加記を書くのも忙殺されていて遅くなったのであった……。 kyotogo.connpass.com 聞いたトークのメモは以下のScrapboxにあります。 scra…

mockgenのreflect modeで型引数を取る型を返すメソッドのあるinterfaceのモックを生成できない

表題が全てです。たとえば以下のように定義されている I interfaceのモックをmockgenのreflect modeで生成するとエラーになる。 package generic import ( "go.uber.org/mock/sample/imp1" ) type V[T any] map[string]T type I interface { X() V[imp1.Imp1…

MySQLのデータベース内の全テーブルの名前を列挙する

database_name をデータベース名に変えてください。 SELECT `table_name` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'database_name'; dev.mysql.com

go-sql-driver/mysqlのプレースホルダ置換を有効にしつつJSONカラムを使うときは[]byte型を経由しない

tl;dr JSONカラムをマッピングするときは []byte 型を使わない string 型や json.RawMessage 型を使う 起こっていたこと Goのwebアプリケーションで、go-sql-driver/mysqlの interpolateParams=true オプションを有効にしてテストを回したら、以下のようなエ…

go-sql-driver/mysqlを使ってMySQLの疎通確認を行うコマンドラインツールを書いた

絶対もうあるでしょう、と思いつつも書きました。go-sql-driver/mysql を使っているのでlibmysqlclientが入っていなくても動くと思います。 github.com mysql コマンドでホスト名・ポート番号を指定して接続するのと同じコマンドライン引数が使えます。ほか…

utgw.netをNext.js App Routerに移行した

移行しました。といっても元々ペライチのページだし、とくに自明じゃないことはやっていないと思います。 前提 Next.js 12.1.6 Static HTML ExportをしたものをNetlifyにデプロイしている リダイレクト設定がある https://utgw.net/labs/tatsuya.htm → https…

mockgenのコード生成を1回にまとめて高速化するツールbulkmockgenを作った

tl;dr 表題のようなツールを作りました。go install コマンドでただちにインストールできます。 $ go install github.com/utgwkk/bulkmockgen/cmd/bulkmockgen@latest 従来の //go:generate コメントから移行するツールもあります。 $ go install github.com…

Goのstructを別のstructに変換する関数を自動生成するツールを書いた

すでに世の中にありそうな気がするけど作りました。もうあったらそっちを使いたいので教えてください。READMEがぜんぜん整備されていないので手があいたときになんとかしたい。 github.com 2023/6/19 11:53 追記 社内でcopierを教えてもらいました。 github.…

Goのテスト結果をtparseで整形する・GitHub ActionsのJob Summaryと組み合わせる

あらすじ go test が出力するログはシンプルです。シンプルなのはいいんですがテストサマリ的な情報が乏しくて、ログを全部見返さないとどのテストが落ちたのか分からなくなりがちという問題があります。 tparseというツールを使うと、go test を使いつつテ…

rowstructgenにテーブル名を表す定数を出力する機能を追加しました

rowstructgenについては以下の記事を参照してください。 blog.utgw.net 以下のように -table-name-const という引数付きでrowstructgenを実行することで、テーブル名を表す定数を含めてコード生成できます。 $ rowstructgen -schema schema.sql -table users…

linterを導入していなかったプロジェクトにlinterを導入しようとするときにまずやること

今どきlinterを使っていないプロジェクトなんて、と思われるあるかもしれませんが、歴史の長いプロジェクトだとそういうこともあるでしょうし、あるいは一部のDSLやスキーマ*1に対してのみlinterを走らせたいということもあるでしょう。 そういったプロジェ…

DBスキーマからGoのstruct定義を生成するグッズを書いた

GoでSQLを書いて実行するとき、素のdatabase/sqlだけだとさすがに心もとないのでsqlxなどのライブラリを使ってDBの行をstructにマッピングすると思います。db struct tagでマッピング元のカラム名を指定できるのが便利ですね。 一方で、このstructを定義する…

URLにデータを載せつつ、できるだけ短いURLにしたい

sugarheart.utgw.net イベント支出記録君は、同人誌即売会などでの支出をすぐに記録するためのツール。プリセットに金額を登録しておけば、ワンボタンで支出を記録することができる。CSVダウンロード、TSV形式でのコピー、URLシェアなど、いろいろな方法でデ…

github.com/caarlos0/env を使った設定値に必要な環境変数名を列挙する

アプリケーションの設定値を環境変数から注入していますか? Goの場合、structに設定値を集約するのには GitHub - caarlos0/env: A simple and zero-dependencies library to parse environment variables into structs. などのライブラリが使えると思います…

有効期限を過ぎても消えないインメモリキャッシュの謎

tl;dr キーワードは「monotonic clock」です。 あらすじ Goで以下のようなコードを書いていた*1*2。あるAPIを叩くクライアントで、APIコールに必要なアクセストークンを4時間キャッシュしている。c.getToken() で得られたトークンを使ってAPIコールを行えば…

YAPC::Kyoto 2023でトークします、直ちにチケットを買ってください

blog.yapcjapan.org ということで、3/19に開催されるYAPC::Kyoto 2023でトークをします。タイトルは「prototype大全」です。 prototypeは、Perlのサブルーチンの引数の振る舞いを変える機能です。一見するとただの記号の並びに見えるprototypeですが、実は身…

Go Modulesを使いつつgo runで依存モジュールのCLIを実行したときに使われるバージョンは?

Go Modules Reference - The Go Programming Language を流し読みつつ手元でちょっと実験した感じだと、go.modに指定したバージョンになるようだった。 Module-aware commandsの節を見るとそのように読める。 In module-aware mode, the go command uses go.…