私が歌川です

@utgwkk が書いている

技術

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

シェルの履歴をDropboxにバックアップする取り組み

プロローグ 2022年末、人類はWSLのファイルシステムを消し飛ばした*1のであった。かけがえのないシェルの履歴*2の思い出と共に。 シェルの履歴が全部消えると、補完に頼って入力しているコマンドが急に打てなくなって、不便になる。2023年はこういった悲しみ…

自作したpytestプラグインをpytest-dev organizationに移管した

これは KMC Advent Calendar 2022 - Adventar 20日目の記事です。昨日の記事は コンテナ詰め詰め大作戦2022冬 - (。・ω・。)ノ・☆':*;':* でした。 pytest-github-actions-annotate-failuresという、GitHub Actionsで落ちたテストにアノテーションするpytestプラ…

Perl::Critic::Policy::Subroutines::ProhibitBuiltinHomonyms で許可する識別子を設定できるようになった

これは Perl Advent Calendar 2022 13日目の記事です。昨日の記事は Perlで戻り値として呼び出した子サブルーチンのコンテキストは親と同じ - hogashi.* でした。 perlcriticは、Perl向けのlinterです。詳しくは以下の記事などを参照してください。 blog.utg…

Recoilとwebpack.DefinePluginと環境変数の名前

これは React Advent Calendar 2022 7日目の記事です。 Recoilを使っているアプリケーションでWebpackのDefinePluginを使って環境変数の値をビルド時に埋め込むとき、Webpackの設定によっては環境変数の名前がビルドしたコードに含まれてしまう場合がありま…

年末恒例・大sketchリポジトリ棚卸祭

はじめに これは はてなエンジニア Advent Calendar 2022 6日目の記事です。昨日は id:momochi29 さんで「口癖を自動で検出する手法」でした。口癖って自分ではなかなか気づけないですよね。 tjmtmmnk.hatenablog.com アプリケーションエンジニアの id:utgwk…

吉祥寺.pm 31でLTした #kichijojipm

kichijojipm.connpass.com 今回も一句用意してから臨みました。 speakerdeck.com 機能追加やバグ修正以外にも、Pull Requestにはマージされる以外の使い道がある、という話をしました。普段の活動を5分に凝縮してダイジェストする、という意識で発表していま…

Relayのfetch policyは取得したデータをキャッシュするかどうかに影響を与えない

Relay 14.1.0 で確認した。Fetch Policies | Relay を読んでもRelayが取得したデータをキャッシュストレージに格納するかどうかについては言及されておらず、実験して確認した。 fetch policyはあくまでGraphQLクエリを発行するときにキャッシュを使うかどう…

JavaScriptで任意のHTML要素を画像化する取り組みのメモ

表題のことについてちょっと調べていて、だいたい以下のようなアプローチに分類できそう、と思ってきたのでメモです。 SVGの <foreignObject> にHTMLを突っ込む SVGには <foreignObject> という要素があり、SVG以外の要素を描画することができる。ここにHTMLを丸ごと突っ込んだ上でSVGを画</foreignobject></foreignobject>…

RubyKaigi 2022にオフライン参加した #rubykaigi

RubyKaigi 2022にオフライン参加しました。参加するのは2016年の会*1以来で、これで2回目です。 トーク トークを聞いたときのメモはScrapboxに残していました。 scrapbox.io 2016年の会に参加したときは全然理解が伴っていなくて、なんだかすごい話が行われ…

代替テキストが指定されていないimg要素をハイライトするブックマークレット

……というものを書いたので、どうぞご利用ください。 let.hatelabo.jp (() => { const highlight = (element) => { element.querySelectorAll("img").forEach((img) => { // alt属性が指定されていたら緑の線、指定されていないなら赤線で囲まれる img.style.…

TODOコメントを列挙して棚卸しする行い

表題のような活動をやった。今あるTODOコメントを全部抜き出して、Scrapboxのページに並べた上でコメントしていく。すでに解決しているもの・今のうちに対応を考えておくべきもの・まだ前提が揃っていないもの などいろいろあると思うけど、現状どうなってい…

input type="text" にpatternを指定してもrequiredでないなら空のとき検証成功する

CSSで検証成功したときにinputの背景色を変えるようにしています。 .input-20220720:valid { background-color: green; } <form action="#"> <input type="text" class="input-20220720" pattern="[a-zA-Z0-9]{4}" maxlength="4"> </form> <form action="#"> </form>

sqlxで無理やり複数カラムに対するINクエリを書く

小ネタだしプロダクションで試したことはないです。ISUCONの練習をしていたらふと、これで複数カラムのINクエリが書けるのでは?? と思いついたのでメモ。 package main import ( "fmt" "log" "strings" "github.com/jmoiron/sqlx" ) type WhereInArg struct …

社内ISUCONでISUCON11予選問題を解いて840,504点を記録した

こんにちは。社内ISUCONで優勝しました。ネタバレ防止のために「続きを読む」を挟みます。

味玉のレシピをMakefileで記述する

最近よく味玉を作っているのだけど、ジップロックに日付を記入し忘れたり、ボウルに水を入れてから氷を入れようとしたりしていて、手順の依存関係を意識しないとめちゃくちゃになる。 Makefileは依存関係と成果物を記述できるので、レシピをMakefileの形で書…