メンテのいらないソフトウェア

ソフトウェアエンジニアとして働き始めて 20 年以上になります。 元々ソフトウェアでいろいろ作りたくて就いた職業なので、結構な数のプロダクトを開発してきました。

私がメインで開発したもので OSS として出ているものでは、

  • [yrmcds]: memcached クローンで、レプリケーション機能などを持つ
  • [usocksd]: SOCKS4/5 サーバー & ライブラリ
  • [transocks]: アプリのネットワーク通信を透過的に SOCKS サーバーにプロキシする透過プロキシ
  • [coil v2][coil]: Kubernetes の CNI ネットワークドライバ
  • [moco]: MySQL を自動運用する Kubernetes オペレーター
  • [accurate][]: Kubernetes 上で namespace ベースのソフトマルチテナンシーを実現するためのソフトウェア

などがあります。これらのソフトウェアの多くは、現役で使われています。

私の主な仕事はこれらのソフトウェアの開発・メンテナンスではありません。 過去の主要な仕事内容としては cybozu.com のローンチプロジェクトの責任者であったり、開発・運用の本部長であったり、今は新規プロダクトのアーキテクトを務めていたりします。

プロフェッショナルなソフトウェアエンジニアの心がけとして、以下のようなことが良く言われます。

コードを書くことが仕事じゃない。問題を解決できるなら、むしろコードは書かなくて済むほうがいい。

なぜなら、「コードを書くとバグがあったりメンテナンスの工数がついてまわったりする」からです。 そうだよなと思うと同時に、「いや俺、コード書きたくてソフトウェアエンジニアになったんですけど」と本音のところで思ったりしています。

で、本題。コード書きまくってソフトウェアプロダクト作りまくっても、そのバグやメンテナンスに時間を取られない方法はないのか。 あります。

続きを読む

OpenTelemetry 良い感じ

最初に断っておきますと、OpenTelemetry を良く知っていたり真面目に調査しようという人が読むべき内容はここにはありません。 公式ドキュメントなりをご参照ください。これは最近 OpenTelemetry を使いだした一般人の感想記事です。

さて、いけてる Web 開発者、特にバックエンド開発者の方はオブザーバビリティという言葉は聞き及んでいるかと思います。 なかでもオブザーバビリティ三種の神器と言われている(?)ログ、メトリクス、分散トレーシングをどう実装するか頭を悩ませているかもしれません。

頭を悩ませてきた、あるいは頭を悩ませている理由の一つは、これらを実装するときに特定の実装向けになりがちであったためです。 メトリクスであれば最近は Prometheus 向けに /metrics エンドポイントとして提供する実装が多いといった話です。しかしながら、 あらゆる人が Prometheus を使うわけでもないので、汎用的なソフトウェアを書く場合に悩ましかったりしたわけです。

OpenTelemetry は、逆説的に特定の実装を排して、SDK とプロトコルだけを規定することでどんなソフトウェアにも組み込んで良い、 一度組み込んだらメトリクスサーバーやトレーシングサーバーをいつでも変更可能になるよという CNCF のプロジェクトです。まだ 一部の機能、例えば Go SDK でログが未実装といったところはありますが、トレーシングやメトリクスは十分インストルメント可能です。

そんな噂を聞いて、新規のサービス開発でこれからやるなら OpenTelemetry でインストルメントしていくのかなと思いつらつらやってました。 以下、調べたり学んだりしたことと、現状できていることです。正確性は全然担保しないので、使うときはちゃんと調べてくださいね。

続きを読む

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