私が歌川です

@utgwkk が書いている

技術

ISUCON 14に「ミレニアムサイエンススクール」で参加して22位だった #isucon

はじめに ISUCON 14にチーム「ミレニアムサイエンススクール」で参加しました。メンバーは自分と id:nonylene id:wass80 です。 最終スコアは28875点で、22位でした。やった~ gyazo.com リポジトリはこれです。言語はGoです。なぜなら自分が最速で書けるた…

壊れたRSSフィードを修復するWebアプリケーションを書いた

表題のものを書きました。 github.com 使い方 GET /rss というエンドポイントに、 url というクエリパラメータでRSSフィードのURLを指定してリクエストすることで、修復したRSSを返してくれます。 例: https://patchrss.dt.r.appspot.com/rss?url=https://ad…

AWSのIAMロールに必要な権限が付与されているかシミュレートするCLIツールを書いた

はじめに 表題のようなCLIツール aws-iam-policy-sim を書きました。 github.com 使い方 Statement フィールドに、以下のようなオブジェクトの配列が入っている、というJSONファイルを用意しましょう。 Action フィールドにアクション名もしくはその配列 Res…

utgw.netをCloudFront + AWS Lambda Function URLに移行した

移行しました。ペライチなのでそんなに難しいことはないだろうと思ったけど、細々とハマりどころがありました。 utgw.net 前回の移行はこちら。 blog.utgw.net 前提 Next.js 13.4.9 Static HTML ExportをしたものをNetlifyにデプロイしている リダイレクト設…

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.…