
2026/08/10 1:26
Show HN: Ember – Redshift 安全なカラーパレット
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
まとめ:
Ember は、極限の暖色系スクリーンフィルタリング下(例:Redshift プロファイル 1200K または 2000K)でも明確で識別可能な色を維持することを目的とした専用ツールキットです。Macbook Nightshift などの一般的なフィルタが広範な日中の読みやすさを最優先するのに対し、Ember は ΔEOK の最小カラー距離(1200K で変換後の最小値≥10.25)、ANSI スロットに対するコントラスト比≥4.5:1、シーケンシャルマップのための正確な float サンプル数といったリリースゲートにより品質を強制します。本プロジェクトは 3 つのパレットを提供しており、一般用途および Macbook Nightshift の互換性のために 3400K Dark/Light が用意され、また天文学者や深赤色シフト環境(1200K で青のゲインがゼロに低下する環境)向けに専門的な 2000K Dark および 1200K Dark パレットが用意されています。重要な点は、Ember がフィルタ自体を適用しないことです。ユーザーは既存の暖色系フィルタ設定を保持したまま、Ember のアートをインポートする必要があります。インストールは
git clone https://github.com/carpdiem/ember.git または pip に対応しており、Alacritty(~/.config/alacritty/themes にコピー)、iTerm2(カラープレセットからのインポート)、Windows Terminal(スキームの追加)それぞれのプラットフォーム固有のセットアップが可能です。Ember は JSON、CSS(data-ember-palette アトリビュート)、および Python API(bg_0–bg_5 の 6 つの背景レベルと fg_0–fg_2 の 3 つのフォアグラウンドテキストロール、チャート色、シーケンシャルマップ、Matplotlib テーマを含む)を介して UI サーフェスの役割を公開します。これらは commanded RGB × [red gain, green gain, blue gain] モデルに基づいて構築されており、激しいカラーシフトにもかかわらず、技術的なディスプレイ上での科学データ可視化における正確な色彩知覚を確保します。本文
Ember: Nightshift / Redshift 対応カラーパレット
Redshift の積極的な暖色フィルタリングを適用した前後でも安定して使用できる、ターミナル、チャート、ヒートマップおよび UI パレットです。Ember は、従来のカラーパレットが Redshift をオンにした際に色が見分けにくくなる問題に特化して設計されています。
概要と目的
- 主な目標: 様々な色温度のフィルタ下でも区別できる独自のカラーを確保することです。
- アプローチ: まず、Redshift の影響を受ける劣化した色情報チャンネルを調整し、昼間(Redshift オフ)における視覚的な区別性を向上させています。
利用可能なパレット
Ember は以下の 4 つのカラーパレットを標準搭載しています。
- 3400K Dark: 汎用的な暖色系テーマ向け(MacBook 最大限の Nightshift 効果に対応)。
- 3400K Light: 明瞭な表面向けの適度な暖色シフト。
- 2000K Dark: 究極的な「深い Redshift」ファンおよび天文学者向け。
- 1200K Dark: 極限の 1200 K ストレスプロファイル向け。
⚠️ 使用上の留意点
- 3400K パレット: 汎用性が高く、Nightshift に対して最適化されています。
- 2000K および 1200K パレット: 「深い Redshift」専用です。
- 区別できる色の数が大幅に減少します(知覚的なカラースペースのサイズが縮小するため)。
- 推奨:あえて極端なフィルタを適用しない限り、
から始めるのが無難です。3400k-dark
📜 技術的メモ
- フォーマット: sRGB で作成され、モデル化されたチャンネルごとの RGB ゲインで検証済み。
- 対応形式: ターミナルテーマ(Alacritty, iTerm2, Windows Terminal)、UI サーフェスロール、カテゴリカルチャートカラー、256 段階連続マップ、Matplotlib/CSS/JSON/Python アーティファクト。
- 注意点: Ember はフィルタ自体を適用しません。既存の Redshift/Nightshift をそのまま使用してください。
パレット選択ガイド
| プロファイル | 推奨される環境 | 区別可能なカテゴリ数 |
|---|---|---|
| 汎用暖色系テーマ(暗め) | 6 |
| 明瞭な表面に適度なシフトを適用する場合 | 6 |
| Redshift を約 2000 K に設定している場合 | 4 |
| 極限の 1200 K を使用している場合 | 3 |
💡 推奨事項:
から始めましょう。2000 K および 1200 K は暗色系専用であり、フィルタリングされた明るいキャンバスが巨大なオレンジ〜赤色のフィールドに変化してしまうためです。3400k-dark
使用方法
1. ファイルの取得
Git クローン:
git clone https://github.com/carpdiem/ember.git cd ember
Python ユーザー向け(直接インストール):
python -m pip install "ember-palettes @ git+https://github.com/carpdiem/ember.git"
2. ターミナルテーマのインポート
Alacritty
設定ディレクトリにファイルをコピーし、
alacritty.toml からインポートします。
mkdir -p ~/.config/alacritty/themes cp themes/terminal/alacritty/2000k-dark.toml ~/.config/alacritty/themes/ # alacritty.toml での設定例 # [general] # import = ["~/.config/alacritty/themes/2000k-dark.toml"]
iTerm2
設定 → プロファイル → カラー → カラープリセット… → インポート… から
themes/terminal/iterm2/ のファイルを選択します。
Windows Terminal
設定 JSON で、
themes/terminal/windows-terminal/ のオブジェクトをルート schemes にコピーし、プロファイルの colorScheme に名称を設定します。
3. UI サーフェスロール(背景・テキスト)の使用
各ファミリーは、JSON、CSS、および Python API (
surfaces()) で同じ順序のロールを提供します。
| ロール | 意図された用途 |
|---|---|
| ベースアプリケーションキャンバス |
| 低強調の隣接領域またはサイドバー |
| 通常のパネルまたはカード |
| ネストされたパネル、アクティブなコントロール、ホバー |
| フローティングパネル、メニュー、ポップオーバー |
| 選択状態(行、範囲、フォーカス領域) |
| 一次テキストおよび主要なラベル |
| より大きな補足テキストまたはグラフィック |
| 弱められた非必須メタデータまたは装飾要素 |
- 背景の仕組み:
は常にベースです。暗色系ファミリーではbg_0
→bg_0
が明るく、明色系では逆に暗くなります。bg_5
4. コードでの利用例
Python (Matplotlib)
import matplotlib.pyplot as plt from ember import categorical, categorical_norm, encode_categories, sequential, surfaces # パレット定義と UI の取得 palette = "2000k-dark" ui = surfaces(palette) # データ準備 labels = ["control", "alpha", "beta", "gamma"] order = ["control", "alpha", "beta", "gamma"] category_ids = encode_categories(labels, order, slug=palette) fig, (points, image) = plt.subplots(1, 2) # UI ロールの適用 fig.patch.set_facecolor(ui["bg_0"]) points.set_facecolor(ui["bg_2"]) image.set_facecolor(ui["bg_3"]) points.scatter( [1, 2, 3, 4], [1.2, 2.4, 1.8, 3.1], c=category_ids, cmap=categorical(palette), norm=categorical_norm(palette), ) image.imshow([[0.0, 0.4], [0.7, 1.0]], cmap=sequential(palette)) plt.show()
CSS の利用
ember.css を読み込み、データ属性でパレットを指定します。
<link rel="stylesheet" href="/path/to/ember.css"> <section data-ember-palette="3400k-dark"> <div class="panel">...</div> </section>
CSS 変数の例:
[data-ember-palette] { color: var(--ember-fg-0); background: var(--ember-bg-0); } .panel:hover { background: var(--ember-bg-3); /* ホバー状態 */ } .selected { background: var(--ember-bg-5); /* 選択状態 */ }
5. Matplotlib 利用時の重要事項
およびcategorical_norm()
にパレットスラグ(例:encode_categories()
)を渡す必要があります。これにより、選択されたファミリーの容量チェックが一致します。"2000k-dark"- 連続マップは常にカテゴリカルカラーの数とは無関係に、256 個の正規化された浮動小数点サンプルを提供します。
技術的背景:その科学とは?
1. ディスプレイ信号のモデル化
Ember は、暖色系ディスプレイ変換を各 sRGB チャンネルにおける独立したゲインとして近似します。
display RGB ≈ commanded RGB × [red gain, green gain, blue gain]
| プロファイル | RGB ゲイン | 基準 |
|---|---|---|
| 3400k | | 暖白工学置換モデル |
| 2000k | | Redshift 2000 K LUT 固定 |
| 1200k | | Redshift 1200 K LUT 固定 |
- 1200 K ではブルーは出力に寄与しません。
- 通常の sRGB 距離は、フィルタリング後に色収束するため、夜間の区別指標としては不適切です。
2. 解決優先:昼間と夜の両立
Ember は昼・夜を別々のビューとして扱い、単一のスコアで平均化しません。優れた昼間の間隔が夜間の衝突を補償できないためです。
- ターゲット設定: コントラスト、明度/彩度ジオメトリ、Oklab での最小知覚分離を設定。
- 色選択: コマンド色がターゲットを再現し、強力な昼間セットを選択。
3. ピクセルと色彩戦略
- 輝度優先: 人間の視覚は輝度チャンネルを通じて空間詳細を保持するため、高密度な飽和グリフや対立する色相は避けます。
- ニュートラル化: 純粋な白はクリーム色、昼間のダークグレーは錆色に近づけることで、暖色系ニュートラルサーフェスを実現。
- アクセントの確保: テーキストではなく意味論的なアクセントのために高彩度を予約します。
4. アイデンティティの維持
- 深いテーマでは ANSI スロット全体でカテゴリ容量を確保。
- アクセントは状態間で色相を変えても、両方で区別可能である必要があります。
- 色だけでは不十分: チャートでは直接ラベル、位置、パターンなどを組み合わせるべきです。
5. 連続マップの設計
- 人間が選んだ土の色(earth-tone)パスから開始し、Oklab で滑らかに処理。
- 変換後の累積距離を測定し、等しい間隔で再サンプリング。
- 単調な明度と等しいモデル化されたステップ数を維持します。
測定プロパティと正確さ
Ember は以下の基準(ΔE_OK)を満たすことを保証しています(ユークリッド Oklab 距離 × 100)。
主要な性能指標
| ファミリー | カテゴリ数 | 昼間最小 ΔE_OK | 変換後最小 ΔE_OK | 最小 ANSI コントラスト |
|---|---|---|---|---|
| 3400K Dark | 6 | 15.00 | 11.45 | 5.29:1 |
| 3400K Light | 6 | 16.73 | 12.41 | 4.65:1 |
| 2000K Dark | 4 | 17.00 | 12.91 | 4.52:1 |
| 1200K Dark | 3 | 20.72 | 10.25 | 4.55:1 |
- 昼間色相ギャップ: 3400K Dark では 20.23°、変換後でも 20°以上を確保。
- 前景コントラスト: テーマベース背景(
)に対してbg_0
は少なくとも 4.5:1 のコントラストをクリア。fg_0
リリースゲートチェック項目
ビルド時に以下の条件がすべて満たされないとリリースできません。
- パレット容量の厳守: 3400K(6)、2000K(4)、1200K(3)。
- ΔE_OK の保証: 生成された変換後のアクセントとターゲットとの差が 0.15 を超えないこと。
- ANSI コントラスト: 前景機能を持つスロットで、変換後背景(
)に対して少なくとも 4.5:1。bg_0 - サーフェス梯子:
→bg_0
までのステップ間で十分な明度変化(ΔE_OK ≥ 6.0)。bg_5 - 連続マップ品質: 256 サンプル、単調明度維持、等距離性確保。
🛠 ビルドと検証:
uv sync --extra dev uv run python tools/build_all.py --check uv run pytest -q uv build
参考文献
- Gruvbox: 暖色系ニュートラルおよび持続使用のための設計思想。
- MIT 6.813, Color: クロマアバレーションおよび疎色(スパースカラー)理論。
- Fan et al. (2024): 暗極性下での視覚疲労への影響に関する研究。
- EU データ可視化ガイド: カテゴリカラーの制限および過度な飽和の回避。
- Datawrapper: 冗長なキュー(手がかり)の追加によるコントラスト保護。
- Redshift: カラーランプ実装と温度テーブル。
- Björn Ottosson: 画像処理のための知覚カラースペース。
- W3C WAI: コントラスト最小限に関する理解。
ライセンス
MIT © 2026 Michael Woods