Diary

Diary

日々学んだことをアウトプットする場として初めてみました

go で init 関数などが初期化される順番の整理

go で初期化処理を書くために init 関数を使っている方もいるかと思うのですが、呼び出される順番を 1 回正しく整理しておきたいと思います。

[目次]

続きを読む

terminal で alias の定義場所を探す

ターミナルで作業をする時、alias 等を使い極力文字数を減らして打ち間違いを防ぐ事が多いかと思います。

しかし oh-my-zsh などのツールによって設定された値など、たまに「あれ?これどこで定義された alias だっけ?」ってなる事があります。

そんな時は以下のようなパワープレイが有効かもしれません。

Bash

bash -ixlc : 2>&1 | grep alias_name

Zsh

zsh -ixc : 2>&1 | grep alias_name

なんとなくやってることの説明

alias はシェルの様々なプロセスで設定されうるため、シェルを新規で立ち上げています。

  • -i インタラクティブモードで
  • -x デバッグ情報の出力を ON にする
    • XTRACE mode
  • -c 続くコマンドを実行
  • 何もしないコマンド : を実行
    • シェルの初期化時に読み込まれる設定や alias のみを与える
  • 2>&1 標準エラー出力の内容を標準出力に繋げる
# オプションはこの辺が参考になるかも
man zshoptions | grep '\-x' -A5

実行結果

# 環境
$ zsh --version
zsh 5.8.1 (x86_64-apple-darwin22.0)

# gf は ~/.oh-my-zsh/plugins/git/git.plugin.zsh:215 で定義されてる事がわかる
$ zsh -ixc : 2>&1 | grep gf=
+/Users/kokoichi/.oh-my-zsh/plugins/git/git.plugin.zsh:215> alias 'gf=git fetch'
+/Users/kokoichi/.oh-my-zsh/plugins/git/git.plugin.zsh:292> compdef _git 'ggf=git-checkout'
+compdef:132> [[ 'ggf=git-checkout' = -N ]]
+compdef:134> [[ 'ggf=git-checkout' = -p ]]
+compdef:136> [[ 'ggf=git-checkout' = -P ]]
+compdef:155> [[ 'ggf=git-checkout' = *=* ]]

bash でシェルオプションを確認・変更する

『現在のシェルセッションにおける変数と関数の一覧を表示』するには set コマンドに何もつけずに叩きます。

# 240 行もあり。
$ set | wc -l
242

# PATH だけを出力。
set | grep PATH

シェルオプションの現在の状態を表示するには o オプションをつけて叩きます。

$ set -o
noaliases             off
aliasfuncdef          off
allexport             off
noalwayslastprompt    off
alwaystoend           on
appendcreate          off
noappendhistory       off
...

オプションを変更する方法

-o で off に、+o で on にすることができます。

$ set -o | grep errexit
errexit               off

# on にする。
$ set -o errexit
$ set -o | grep errexit
errexit               on

# off にする。
$ set +o errexit      
$ set -o | grep errexit
errexit               off

また、ショートオプションとして用意されてるものもあります。

# set -o errexit と同じ。
$ set -e
$ set -o | grep errexit
errexit               on

# set +o errexit と同じ。
$ set +e
$ set -o | grep errexit
errexit               off

詳しくは man bash 4.3.1 The Set Builtin をご覧ください。

bash で標準エラー出力のリダイレクト・パイプラインを扱う

今更感ですが、標準エラー出力をリダイレクトやパイプに渡す方法をメモしておきます。

[目次]

続きを読む

openapi-generator の作る Go の構造体を使ったら json.Marshal が 10 倍遅くなった

この記事は Go 言語 Advent Calendar 2023 シリーズ 2 の 10 日目の記事です。

openapi から Go のコードを生成するツールとしては、oapi-codegen, ogen などが勢いありますが、今回は openapi generator にまつわる話をします。

このライブラリで生成されたコードに起因して、json の Marshal が極端に遅くなってしまう事件が発生しました。

[目次]

続きを読む

Golang で Multi-stage builds すると『version `GLIBC_2.34' not found』のエラー

Golang で Dockerfile を Multi-stage builds で作成した際に、
docker run すると『version `GLIBC_2.34' not found』のエラーが出ることがありました。

今回はその原因と解決策について共有します。

事象

環境

  • Host
  • Docker
    • v24.0.7
  • Dockerfile
    • build 用 base image: golang:1.21
    • deploy 用 base image: gcr.io/distroless/static
続きを読む