React Select を使ったコンポーネントのテストをする

react-select という複数選択やoptionにサムネイルを追加したりできる高機能なselectを提供するライブラリがある。 OptionSelector.tsx: import { useCallback } from 'react'; import Select from 'react-select'; export type Option = { value: string; l…

Docker 25.0 でヘルスチェックに start-interval オプションが追加された

Docker にはヘルスチェック機能があるが、25.0 で start-interval オプションが追加された。 The options that can appear before CMD are: --interval=DURATION (default: 30s) --timeout=DURATION (default: 30s) --start-period=DURATION (default: 0s) -…

RubyのENV.fetch()で空文字列の時もデフォルト値を使うようにする

Rubyには、指定された環境変数の値を読み込み、存在しなければデフォルト値を返すENV.fetch()というメソッドがある。Railsなどでは設定ファイルで環境変数から値を読み込むのによく使う。 config/database.yml: default: &default pool: <%= ENV.fetch("RAIL…

年齢の算出

年齢の算出は簡単にできるかと思いきや、少々面倒臭い。これは、閏年というものが存在するためである。そのため以下のような単純な時間のdiffで算出しようとすると年を重ねる日時が1日ほどズレる場合がある。 const today = new Date(2010, 2, 10); // 2010-…

Minecraft Java Edition 1.20 + PaperMC + Multiverse-Core 環境での砂無限増殖装置(Sand Duper)

エンドポータルとチャンクローダーを利用した砂無限増殖装置というのがある(通称: Sand Duper)。以下の動画を参考に作ったが、PaperMC + Multiverse-Core という環境だと動作しなかった。 問題と解決方法 問題点は以下のとおりでこれらを解決する必要がある…

overscroll-behavior を使ってダイアログを開いている時はページのスクロールをしないようにする

css

まず以下のダイアログを考える。このダイアログはダイアログ内のコンテンツが一定の高さに到達するとスクロールバーが出るようになっている。 <div class="content"> <button class="open-button" type="button">open modal</button> <p>メッセージ1</p> <p>メッセージ2</p> ... <div class="modal"> <div class="modal-content"> <div class="modal-header"> <h2>Modal Header</h2> </div> </div></div></div>

Rails + PostgreSQL でデータベースを作り直す

PostgreSQLでは、他のセッションが同じdatabaseに接続しているときは DROP DATABASE できないようになっている。 my_database=# DROP DATABASE my_database; ERROR: database "my_database" is being accessed by other users DETAIL: There is 1 other sess…

Docker container で sleep infinity を使う時は init プロセスを有効にする

Docker container で sleep infinity を使う時は init プロセスを有効にしないとSIGINTなどのシグナルの処理がうまくできずにハングするので、これを使う時は有効にする必要がある。docker compose の compose.yaml ではinit: true の指定が init プロセスを…

axios でリクエストログを出力する

JavaScriptでXHRやFetchなどで通信するとブラウザの開発コンソールのネットワークなどにログが出力されますが、Next.js のSSRなど、Node.js で実行する場合はログはでないです。そのため、通信ログが欲しい場合は、なんらかの方法でログを出力する必要があり…

TypeScript の definite assignment assertion operator の話

TypeScript の class では、プロパティは初期化指定子かコンストラクタで初期化していないとエラーになります。そのため、以下のように記述する必要があります。 class Hoge { value1: string = 'a'; value2: number; // value3: boolean; // ERROR: Propert…

bashで複数の子プロセスを並行で実行して終了を待つ方法(Ctrl+cでの終了に対応)

bashで複数の子プロセスを並行で実行して終了を待つには & でバックグラウンド処理しつつ wait で待つことで実現できるのですが、この方法だと Ctrl+c したときに子プロセスが残ってしまいます。 ( command1 & command2 & wait ) ここで、jobs -p を使えば、…

GitHub Actions でローカルの composite を使う場合

GitHub Actions でローカルにある composite を使う場合は、あらかじめチェックアウトしていないと、ファイルが見つからないとエラーが出てしまうので注意する。 NG: name: hoge on: push: jobs: hoge: name: Hoge runs-on: ubuntu-latest steps: - uses: ./…

CIでGCPのServiceAccountを使って認証する方法

GCP

GCPでServiceAccountで認証するときはGOOGLE_APPLICATION_CREDENTIALS環境変数に鍵ファイルのパスを設定するが、CI実行時にはどうするんだろうと考えた結果、鍵ファイルをbase64でエンコードしたものをCIの環境変数に設定して、CI実行時にデコードしてGOOGLE…

Docker で Compose V2 などをキャッチアップした

docker-compose up ではなく docker compose up を使うように推奨されていることは知っていたが、ちゃんとキャッチアップしてなかったのでした。また、その過程で Compose V2 以外にも新たに知ったことがあったのでここに記す。 docker-compose との違い 大…

gomockのMatcherで構造体を再帰的に比較する

gomockの引数のMatcherでgomock.Eq()を使うときに、構造体がポインタ型だったりするとうまく比較できない。 type Hoge struct { ID string } m.EXPECT().Hoge(gomock.Eq(&Hoge{ID: "1"})).Return(nil).AnyTimes() // マッチしない m.Hoge(&Hoge{ID: "1"}) そ…

go-cmp の cmp.Diff() でJSON文字列を比較できるようにする

go-cmp を使うと2つの構造体のDiffを取ることができるが、プロパティにJSON文字列([]byte や json.RawMessage など)があると、内容は同じでもインデント等が異なるとdiffが出てしまい、うまく比較できない。 type Hoge struct { ID string JSON json.RawMess…

Docker container からホストでListenしているポートにアクセスする

Docker Desktop ではコンテナから host.docker.internal を使って、ホストにアクセスすることができる。 index.js: const express = require("express"); const app = express(); const port = 3000; app.get("/", (req, res) => { res.send("OK\n"); }); ap…

github.com/go-sql-driver/mysql で date型のカラムをtime.Time型で扱うと日付がズレるのを回避する

以下の記事で示したように、github.com/go-sql-driver/mysql で parseTime、loc オプションを適切に設定することで、Go の time.Time型とMySQLの datetime 型をタイムゾーンを考慮して適切に相互変換できる。 mrk21.hatenablog.com しかし、同様にMySQLのdat…

github.com/go-sql-driver/mysql で datetime型のカラムのタイムゾーンを適切に扱う

MySQLのdatetime型はタイムゾーンを保持しないため、MySQL側でJSTで取り扱うと決めたら、クライアント側で都度適切にタイムゾーンを変換する必要がある。 Go言語でこれを適切に行うためには、DB接続時に github.com/go-sql-driver/mysql のDSNで以下のように…

Nuxt app で AWS SDK for JavaScript v3 を使えるようにする

AWS SDK for JavaScript v3 (@aws-sdk/***) では optional chaining operator ?. が使われており、Chrome や Node.js などでも割と最近になって使えるようになったので(2020年ごろ)、Nuxt app で使おうとすると設定にもよるがおそらく以下のようなエラーが出…

xargs -P と export -f を使ってシェルスクリプトで並列処理を実現する

xargsの-Pオプションを使うとパイプで渡された値を任意の並列数で並列処理することができます。以下では、普通に実行すると10秒かかる処理が、5並列で並列処理することによって2秒で実行することができます。 f.sh: #!/bin/bash echo $*; sleep 1; $ seq 10 …

PowerShell で sudo 的なことをしたい

Windows Terminal 1.13 から管理者権限に昇格できるプロファイルを定義できるとはいえ、いちいち管理者権限が付与されたウィンドウを立ち上げたくはない。POSIXのように sudo <command> で同一ウィンドウ(タブ)で実行したい。 これには gsudo というそのまんまなこと</command>…

WSL2でcodeコマンドやexplorer.exeがハングする

WSL2上でcodeコマンドを使ってVSCodeを開こうとしたらハングしてしまった。WSL2の再起動や高速スタートアップを無効にしてもWindowsの再起動をしても治らないし、codeコマンドだけではなくexplorer.exeもハングしてしまう。 調査していると、Windows上のパス…

PowerShell で .bashrc 的なことがしたい

PowerShell にも .bashrc 的なファイルがあって、それを編集すればシェルを起動するときに任意の設定を読み込める。 $profile 変数にプロファイルファイルのパスが入っているので、これを編集する。なお、存在しない場合があるので、その場合は $profile の…

WSL2 の localhost forwarding を代替する PowerShell Script を作った

以前、自分の環境では localhost forwarding で頻繁にハングすることがあるので、netsh interface portproxy add コマンドを使って手動で port forwarding するようにした。 mrk21.hatenablog.com 別に都度このコマンドを叩いてもいいのだが、WSL2 が listen…

Terser で minify するときに ascii_only オプションを true にしないと Unicode Escape Sequence が展開されてしまう

Webpack + Babel + core-js な環境でビルドしたJavaScriptをPerlサーバーで配信するプロジェクトで、あるときPerlサーバーで配信しようとしたときに Internal Server Error がでてしまった。 ログを確認すると、Wide character in subroutine entry at /path…

WSL2 の localhostForwarding 機能がうまくうごかない

WSL2 の localhostForwarding 機能を使うと、WSL2側で listen したポートを自動的にWindows側で port forwarding してくれるので、Windows側からは localhost でWSL2側で listen しているポートにアクセスすることができる。 しかし、自分の環境ではアクセス…

WSL2 上の Docker container で名前解決が異常に遅い

個人PCでは Windows で WSL2 と WSL2 backend な Docker Desktop を使って開発しているが、Docker container 上での名前解決が異常に遅い。 調査していると、どうも Hyper-V のネットワークまわりに問題がありそうだが、具体的にどこがおかしいのかはわから…

X-Forwarded-For の正しい取り扱い方とCloudFrontを通したときのクライアントIPの取得方法

X-Forwarded-For ってなに? プロキシやロードバランサーを通してサーバーにアクセスすると、サーバーから見たクライアントIPはプロキシのものになってしまいます。それを解決するために、プロキシで X-Forwarded-For HTTP Header にクライアントの Remote I…

PROXY protocol を使ってNLB配下のサーバーでクライアントの Remote IP を得る

背景 goproxy を使って HTTP Proxy server を作った その Proxy server は AWS Fargate で動作していてNLBでロードバランシングされている NLBはターゲットタイプがインスタンス以外だとRemote IPがNLBのものになってしまう Proxy server でクライアントのRe…