私が歌川です

@utgwkk が書いている

技術

AWS Step FunctionsのHTTP TaskでMackerelにメトリックを投稿する

やってみた記事ってやつです。 AWS Step Functionsから任意のHTTP APIを叩けるようになった*1ので、これを使ってMackerelに投稿してみましょう。 投稿するメトリックを用意する サービスメトリックを投稿するときのリクエストボディの形式に沿ったJSONを組み…

MySQLの生成カラムをMODIFY (CHANGE COLUMN) できるかどうかはあんまり自明じゃない

この記事のタイトルにあることの理由は MySQL :: MySQL 8.0 リファレンスマニュアル :: 13.1.9.2 ALTER TABLE および生成されるカラム を読んだら分かります。 生成カラムの式を変えてsqldefでマイグレーションを反映したら、DROP COLUMNしてADD COLUMNするD…

gomock (mockgen) v0.5.0がリリースされた & package modeが導入された

はじめに 2024/10/18*1にgomock (mockgen) v0.5.0がリリースされました。 github.com リリースノートを見ていこうと思うのですが、その前にpackage modeという新しいコード生成のモードについて触れましょう。 はじめに reflect modeの限界とpackage modeに…

全部見る

連休中に、golangci-lintに組み込まれているlinterを全部見た。Linters | golangci-lint から見れるので、みなさまも見てください。 世間でも全部見ている事例はありそう。こちらもあわせてどうぞ。 zenn.dev これで記事を終わってもいいけど、もうちょっと…

大吉祥寺.pmに参加し、登壇し、DJをやった #kichijojipm

大吉祥寺.pmに参加しました。この記事の公開をもって吉祥寺からの帰還といたします。 登壇した speakerdeck.com タイトルは「君たちはどう生きるか」をモジりました。 コードレビューの目的は「コードの品質を保つこと」「知見を共有すること」である、とい…

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を定義する…