時雨堂で採用している技術スタック (2026-02)
雑に書いて行く。主力製品関連のみで、SDK やツールなどは含めていない。
Erlang/OTP
依存ライブラリを徹底的に減らす戦略を取っている。できるだけ標準ライブラリを使い、よほどの理由がなければ自作。
主力商用製品の外部ライブラリ依存は 11 個だけ。
https://sora-doc.shiguredo.jp/OSS_LICENSE
- ビルド
- 暗号
- aws/aws-lc
- Erlang/OTP にパッチを当てて使っている
- Raft
- HTTP や WebSocket
- LSP
- Formetter
- Linter
テスト
テストは EUnit を最小限にしてメインは E2E テスト。E2E テストは pytest を利用採用している。GitHub Actions で 3 時間程度のテストを並列実行できるようにして 5 分で終わるようにしている。また pyroute2 を使って GitHub Actions 上でネットワーク障害テストを実現している。
Rust
できるだけ依存を減らす戦略。
- JSON
- sile/nojson
- 依存 0 の JSON ライブラリ
- コマンドライン引数パーサー
- sile/noargs
- 依存 0 の args ライブラリ
- 非同期ランタイム
- tokio-rs/tokio
- 暗号
- aws/aws-lc-rs
- TLS / 証明書
- rustls/rustls
- rustls/tokio-rustls
- rustls/rustls-platform-verifier
- rustls/rcgen
- QUIC
- テスト / ファジング / カバレッジ
基本的に使うライブラリは自分たちで shiguredo_ という prefix を付けて自作。依存をできるだけ減らしたいというのがモチベーション。
Python
C/C++ バインディング実装がメインで、少し Rust バインディングも試している。PyPI は組織アカウントを契約して利用している。
公開しているライブラリは 直近 3 バージョンへの対応かつ no-GIL (Free Threading) へ対応。
- astral-sh/uv
- numpy/numpy
- ビルド
- Rust
- HTTP / WebSocket ライブラリ
- aiohttp
- httpx
- テストツール
- pytest
- pytest-repeat
- pytest-timeout
- pytest-xdist
- hypothesis
- pyroute2
- formatter / linter
- ruff
- type checker
- ty
PyPI の CMake を利用してビルドしている。CMakeList.txt がある意味本体と言っても近い使い方。
ウェブアプリ
フロントエンドは Node.js による SPA または SSG で、バックエンドは Go という構成。依存ライブラリは減らしつつ、自作を積極的に避ける方針。
クラウド
商用環境は Akamai Cloud を採用している。あとは基本的に落ちても影響が少ない部分でのみ Cloudflare を採用。
フロントエンド
できるだけ悩まない構成。
- microsoft/TypeScript
- ビルド
- Vite
- preactjs/preact
- React から preact へ切り替えた
- ルーター
- 状態管理
- DuckDB-Wasm
- OFPS 連携
- Web Locks と組み合わせて利用している
- グラフツール
- leeoniya/uPlot
- Grafana が利用している
- Formatter / Linter
- oxc-project/oxc
- Biome から切り替え
- CSS フレームワーク
- テスト
- Vitest
- コンポーネントテストに利用
- vitest/browser-playwright
- Vitest
- Playwright
- fast-check
基本的に VoidZero が提供しているツールに揃えている。ウェブアプリが強い会社ではないので小さなフレームワークということで Preact を採用している。
バックエンド
できるだけ依存ライブラリを減らす戦略。Web フレームワークは使わず net/http を利用。
ログは slog 、ログローテーションは logroate 、バッチは Systemd Timer を利用している。できるだけ既にある仕組みを使う戦略。
- データベース
- sqlc
- pgx/v5
- 設定ファイル
- go-ini/ini
- 今後は JSONC でいいかなと思っている
- duckdb/duckdb-go
- テスト
- stretchr/testify
- testcontainers/testcontainers-go
あとは必要に応じて既にあるライブラリで枯れているものを採用して使っている。バックエンドのメインタスクはログを書き出す、データベースへアクセスするになるので、Go がとても相性が良いと思っている。