Go 1.21 に入る予定の log/slog パッケージの話

ログ出力をどうするかっていうのは、Go 書くときに常にちょっとした悩みの種でした。 標準の log パッケージはあるものの、実用には機能が不足していると見なす人が多いためです。

かくいう私もその一人で、近年は Kubernetes 界隈でよく使われている以下を組み合わせていました。

logr は所謂 structured logging のための共通インタフェースを提供するパッケージで、uber-go/zap のような著名なログライブラリ向けにアダプタも提供してくれます。 debug, info, warn, error といったいわゆるログレベルも備えていますし、context 経由で logger を渡すこともできるので、便利に活用していました。

ただ、logr は結構使われているとはいえ標準パッケージではないため、logr を使わないライブラリ等と組み合わせるのが難しいのが悩みでした。 そんなこんなの声を受けてか、Go 1.21 で log/slog というパッケージが標準で利用できるようになりそうです。 まだリリース前ですが、万一取り除かれたりしない限りは近い将来使えるようになるでしょう。

で、新規にプログラムを作るにあたって、どうせ Go 1.21 以降でプロダクション開発するだろうなと思うと logr + zap よりはこの slog パッケージにしておきたいです。 幸いなことに、Go 本体に取り込まれたのとほぼ同じコードが golang.org/x/exp/slog として今すぐ利用できます。 前置きが長くなりましたが、そんなわけで slog を使ってみたので以下に特徴を紹介します。

  • インタフェースではなく実装なので、他のログライブラリを組み合わせる必要なし
  • structured + leveled logging 可能
    • さらに、ネストした structure も可能
  • slog.SetDefault を呼ぶと標準の log パッケージの出力も slog になる
  • テキスト形式のほか、JSON 形式の出力も手軽にできる
  • APIトークンなどをログに出さないよう型ベースで設定できる ()

最後発だけあり、痒い所に手が届く良い設計だと思います。 context 経由での受け渡しはまだないようですが、実装は簡単なので手元で適当に足して使っています。

以上

PRECIS 知ってますか?

昨今 ID 管理系の業務をやっていて、まあ色々学びがあるんですがそのうちのひとつ、PRECIS について。

PRECIS というのは RFC 8264 で規定される、ユニコード文字列を適正に比較するためのフレームワークです。 PReparation, Enforcement, and Comparison of Internationalized Strings の acronym で PRECIS と呼ばれています。

ユニコードは表示上は同じように見えても UTF-8 のバイト列としては異なる表現になる文字列があったりします。 たとえば「が」は 0xE3 0x81 0x8C もしくは 0xE3 0x81 0x8B 0xE3 0x82 0x99 のどちらかで表現可能です。 当然、単純にバイト列として比較してしまうと同じ文字列なのに異なるという誤判定をしてしまいます。

ここまでは NFC とか NFD といった normalization の話なのですが、PRECIS はそれに加えてユーザー名やパスワードに使えない文字列を除外したりする規則を定めています。 具体的な規則を PRECIS profile と呼んでいて、RFC 8265 では以下の3つが規定されています。

  • UsernameCaseMapped: 大文字小文字を区別しない、ユーザー名用プロファイル。空白文字などは弾かれます。
  • UsernameCasePreserved: 大文字小文字を区別する(以下略)
  • OpaqueString: パスワード用プロファイル。大体の文字は大丈夫だが、コントロールキャラクターとかは弾かれます。

この PRECIS はシステム間でユーザー情報を同期する SCIM などのプロトコルでも採用されているため、新規に ID 管理を実装するならユーザー名やパスワードが PRECIS profile に準拠しているかチェックするようにしておくと、ちょっと相互連携しやすくなるかなと思います。そういうのがなくても、適切に正規化したり不適当な文字を弾いてくれるので使っておくのが安心です。

Go であれば golang.org/x/text/secure/precis パッケージで利用できるようになっています。

以上

アトピーとデュピルマブ

今年は一本も記事書いてなくて、このままだとあれかなということで近況報告がてら。

前の業務は Kubernetes まわりの技術で積極的に情報出していたんですけど、目下の取り組みはまだ世に出せないことが多くてネタに乏しいです。 というわけで生活的な話。

私は物心ついたころからずっとアトピー性皮膚炎を患っていて、一向に軽快する様子がありません。 近年はむしろ悪化の一方で、

  • お酒を飲むと血管が広がって全身猛烈な痒みに襲われ、血だらけになるのでやむなく断酒
  • 頭から足先まで痒くないところがない状態で、ステロイド剤の効果が雀の涙に

というところまできて、今年かかりつけの皮膚科でどうにかならないか相談しました。

そうしたところ、「デュピルマブ」という薬を紹介されたのです。

sugamo-sengoku-hifu.jp

詳しいことは上の記事を読んでいただくとして、「アトピーの特効薬です」と言われたので是非もなく治療開始しました。

この薬はモノクローナル抗体という生物学的製剤で、特異的に免疫を抑制してくれます。 内服ステロイドと違ってアトピー性皮膚炎で問題になる反応だけ抑えるため、長期服用しても安全だそうです。 私は医者ではないので安全性を保障できませんから、お試しになるならご自身でお医者様と相談してくださいね。

治療は二週間ごとに注射を打ちます。最大の問題点はここで、量を減らしたり治療間隔を空けたりはできません。 治療を開始したら基本的には以後ずーっと注射し続けないといけません。

で、以下は私の個人的な治療体験です。

  • Week 1: 最初は二本注射します。直ちに効き目があるわけではなかったです。
  • Week 3: ちょっと全身の炎症が減ったかなと思うものの、まだ全身痒い感じが続いていました。
  • Week 5: この頃からはっきりと炎症も痒みもほぼなくなりました。お風呂に入っても痒くない!
  • Week 12: この頃までには全身の皮膚がきれいになってました。お酒もまた飲めるように!
  • Week 12~: たまに痒みがでることがありました。アトピーの反応を完全に抑えるわけじゃないので、そういう時はステロイド外用薬を併用。
  • 現在: 開始して半年以上経ちますが、上記のような軽い痒み程度で抑えられています。

完治するわけではないけれど、生活の質は歴然と向上しました。お酒もお風呂も大丈夫。

費用ですが、一回 18,000 円前後かかるかと思います。月にすると 4 万円弱ですか。 私の場合健康保険組合の補助のおかげで、月 2 万円以上の支払いは還付されるので助かっています。 (それ以上に健康保険費用を払っているということは目をつぶって)

以上

ダイエット

35を越えたあたりから毎年堅調に体重が増えてきて、40を超えてからは毎年 1 kg 近い体重増加ペースになってました。 さらに去年からは COVID-19 のため在宅勤務が多く、運動が減って明らかにカロリー過剰を感じてました。

そこでここ 2 か月ほど人生初めてのダイエットをやってます。

続きを読む

root 権限がいらない Squid Docker イメージを作った

Squid と言えば Web proxy のド定番なわけでコンテナ化して走らせたいことも多いでしょう。

巷に転がっている Squid 用の Dockerfile は root 権限が必要なものが多く root 権限が不要なものが見当たらなかったので作ってみました。 以下に置いてあるのでご活用ください。

github.com

Kubernetes 専門家として知るべき 47 のこと

この記事は私が過去 3 年ほど Kubernetes に携わる中で学んだ、ちょっと見つけにくい知識をまとめたものです。 特にカスタムコントローラーを開発するような人に必要となる知識群です。

感想とか指摘とかあれば Twitter までお寄せください。

更新履歴

  • 2021-03-05: "コンテナの resources.limits と resources.requests の違いについて" の項を補足しました (thanks to @superbrothers)


  • API
  • コントローラー実装
  • プログラムと連携動作
  • 資源管理
  • ネットワーク
  • モニタリング
  • アクセスコントロール
続きを読む

あけまして Ubuntu 20.04 開発環境

あけましておめでとうございます。年賀状代わりに開発環境の構築記事を差し上げます。

いやわりと真剣に、開発環境にはその開発者の近況が表れていると思うのですよ。
いっちょあなたもどうですか 😀

閑話休題。
以下今日やった Ubuntu 20.04 LTS のインストール作業記録です。語調変わるのはご勘弁。

  • Hyper-V VM の用意
  • Ubuntu のインストール
  • インストール後の作業
    • systemd-networkd の設定
    • 不要なツールを purge
    • build-essential をインストール
    • dotfiles で初期設定
    • Go をインストール
    • Docker をインストール
  • 以上
続きを読む