**Show HN:** 「ChartGPU」― WebGPU を活用したチャーティングライブラリ(1,000,000 点を 60fps で描画)

2026/01/21 23:54

**Show HN:** 「ChartGPU」― WebGPU を活用したチャーティングライブラリ(1,000,000 点を 60fps で描画)

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

ChartGPUは、WebGPUを活用して大規模で多系列のデータセットを高フレームレートかつ最小限のCPU使用量で描画するTypeScript製チャーティングライブラリです。ライン・エリア・バー・散布図・円グラフ・ローソク足など一般的なチャートタイプに対応し、ビルトインテーマプリセット(

'dark' | 'light'
)と完全なカスタムテーマサポートを提供します。

APIは

ChartGPU.create(container, options)
から始まり、生成されるインスタンスは
setOption
、ストリーミング更新用の
appendData(...)
resize()
requestAnimationFrame
といったメソッドを公開します。描画はレイアウト、スケール、GPUバッファへのデータアップロード、およびグリッド・エリア・バー・散布図・ライン・円グラフ・ローソク足・クロスヘア・ハイライト・軸の複数GPUレンダーパスを管理するレンダーコーディネーターによって統括されます。

インタラクションオーバーレイはイベントマネージャにより処理され、ヒットテスト補助関数(

findNearestPoint
findPieSlice
)と
click
mouseover
mouseout
イベントを発火します。サポートされるインタラクションにはホバーハイライト、ツールチップ、クロスヘア、およびジェスチャーまたはスライダーUIによるX軸ズームがあります。

複数のチャート間でクロスヘアの動きを同期する

connectCharts(charts)
が用意されています。

インストールは npm (

npm install chartgpu
) で行い、React バインディングは別パッケージ
chartgpu-react
にて提供されます。ブラウザ対応は WebGPU を必要とし、Chrome 113+、Edge 113+、Safari 18+(デフォルトで有効)に対応しています。Firefox は現在未サポートです。

ChartGPU は MIT ライセンスのオープンソースであり、ドキュメントは

docs/API.md
にあります。例プロジェクトは
examples/
フォルダー内にあり、貢献ガイドラインは
CONTRIBUTING.md
で確認できます。

将来リリースでは Firefox サポートと追加のチャートまたはインタラクション機能を予定しており、データ集約型ダッシュボード、金融分析ツール、およびリアルタイムモニタリングインターフェイスに対するパフォーマンス向上も継続的に行われます。

本文

WebGPUを駆使したハイパフォーマンスチャート

概要

ChartGPU は、WebGPU をベースに構築された TypeScript のチャーティングライブラリです。大量データでもスムーズでインタラクティブな描画が可能です。

特色

  • 🚀 WebGPU アクセラレーション により、大規模データセットでも高 FPS を実現
  • 📈 複数系列タイプ:ライン、エリア、バー、散布図、パイ、キャンドルスティック
  • 🧭 組み込みインタラクション:ホバーハイライト、ツールチップ、クロスハイダー
  • 🔁
    appendData(...)
    (座標系列)でのストリーミング更新
  • 🔍 X 軸ズーム(ジェスチャー + オプションのスライダ UI)
  • 🎛️ テーマプリセット(
    'dark' | 'light'
    )とカスタムテーマ対応

アーキテクチャ

高レベルでは、

ChartGPU.create(...)
がキャンバス+WebGPU のライフサイクルを所有し、描画オーケストレーションはレンダーコーディネータへ委譲します。詳細な内部設計は
docs/API.md
(特に「Render coordinator」)をご覧ください。

flowchart TB
  UserApp["Consumer app"] --> PublicAPI["src/index.ts (Public API exports)"]

  PublicAPI --> ChartCreate["ChartGPU.create(container, options)"]
  PublicAPI --> SyncAPI["connectCharts(charts)"]

  subgraph ChartInstance["Chart instance (src/ChartGPU.ts)"]
    ChartCreate --> SupportCheck["checkWebGPUSupport()"]
    ChartCreate --> Canvas["Create canvas + mount into container"]
    ChartCreate --> Options["resolveOptions(options)"]
    ChartCreate --> GPUInit["GPUContext.create(canvas)"]
    ChartCreate --> Coordinator["createRenderCoordinator(gpuContext, resolvedOptions)"]

    ChartCreate --> InstanceAPI["ChartGPUInstance APIs"]
    InstanceAPI --> RequestRender["requestAnimationFrame (coalesced)"]
    RequestRender --> Coordinator

    InstanceAPI --> SetOption["setOption(...)"]
    InstanceAPI --> AppendData["appendData(...)"]
    InstanceAPI --> Resize["resize()"]

    subgraph PublicEvents["Public events + hit‑testing (ChartGPU.ts)"]
      Canvas --> PointerHandlers["Pointer listeners"]
      PointerHandlers --> PublicHitTest["findNearestPoint() / findPieSlice()"]
      PointerHandlers --> EmitEvents["emit('click'/'mouseover'/'mouseout')"]
    end

    DataZoomSlider["dataZoom slider UI (DOM)"] --> Coordinator
  end

  subgraph WebGPUCore["WebGPU core (src/core/GPUContext.ts)"]
    GPUInit --> AdapterDevice["navigator.gpu.requestAdapter/device"]
    GPUInit --> CanvasConfig["canvasContext.configure(format)"]
  end

  subgraph RenderCoordinatorLayer["Render coordinator (src/core/createRenderCoordinator.ts)"]
    Coordinator --> Layout["GridArea layout"]
    Coordinator --> Scales["xScale/yScale (clip space for render)"]
    Coordinator --> DataUpload["createDataStore(device) (GPU buffer upload/caching)"]
    Coordinator --> RenderPass["Encode + submit render pass"]

    subgraph InternalOverlays["Internal interaction overlays (coordinator)"]
      Coordinator --> Events["createEventManager(canvas, gridArea)"]
      Events --> OverlayHitTest["hover/tooltip hit‑testing"]
      Events --> InteractionX["interaction-x state (crosshair)"]
      Coordinator --> OverlaysDOM["DOM overlays: legend / tooltip / text labels"]
    end
  end

  subgraph Renderers["GPU renderers (src/renderers/*)"]
    RenderPass --> GridR["Grid"]
    RenderPass --> AreaR["Area"]
    RenderPass --> BarR["Bar"]
    RenderPass --> ScatterR["Scatter"]
    RenderPass --> LineR["Line"]
    RenderPass --> PieR["Pie"]
    RenderPass --> CandlestickR["Candlestick"]
    RenderPass --> CrosshairR["Crosshair overlay"]
    RenderPass --> HighlightR["Hover highlight overlay"]
    RenderPass --> AxisR["Axes/ticks"]
  end

  subgraph Shaders["WGSL shaders (src/shaders/*)"]
    GridR --> gridWGSL["grid.wgsl"]
    AreaR --> areaWGSL["area.wgsl"]
    BarR --> barWGSL["bar.wgsl"]
    ScatterR --> scatterWGSL["scatter.wgsl"]
    LineR --> lineWGSL["line.wgsl"]
    PieR --> pieWGSL["pie.wgsl"]
    CandlestickR --> candlestickWGSL["candlestick.wgsl"]
    CrosshairR --> crosshairWGSL["crosshair.wgsl"]
    HighlightR --> highlightWGSL["highlight.wgsl"]
  end

  subgraph ChartSync["Chart sync (src/interaction/createChartSync.ts)"]
    SyncAPI --> ListenX["listen: 'crosshairMove'"]
    SyncAPI --> DriveX["setCrosshairX(...) on peers"]
  end

  InteractionX --> ListenX
  DriveX --> InstanceAPI

デモ

  • キャンドルスティックチャート – 金融 OHLC(Open‑High‑Low‑Close)レンダリング。クラシック/ホロウスタイル切替と色カスタマイズが可能。

クイックスタート

import { ChartGPU } from 'chartgpu';

const container = document.getElementById('chart')!;

await ChartGPU.create(container, {
  series: [
    { type: 'line', data: [[0, 1], [1, 3], [2, 2]] },
  ],
});

インストール

npm install chartgpu

React 統合

React バインディングは

chartgpu-react
で利用可能です:

npm install chartgpu-react
import { ChartGPUChart } from 'chartgpu-react';

function MyChart() {
  return (
    <ChartGPUChart
      options={{
        series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
      }}
    />
  );
}

chartgpu-react
リポジトリに完全なドキュメントとサンプルがあります。

ブラウザ対応(WebGPU 必須)

BrowserVersion
Chrome113+
Edge113+
Safari18+
Firefox未対応(WebGPU は開発中)

ドキュメント

  • Getting Started
    docs/API.md
  • API Reference
    docs/API.md

サンプル

サンプルは

examples/
をご覧ください。

ローカル実行:

npm install
npm run dev   # http://localhost:5176/examples/ が開きます

コントリビュート

CONTRIBUTING.md
をご確認ください。

ライセンス

MIT –

LICENSE
を参照。

同じ日のほかのニュース

一覧に戻る →

2026/01/22 7:54

**危険な PDF を安全な PDF に変換する**

## Japanese Translation: Dangerzone は、潜在的に悪意のある PDF、オフィス文書、および画像を安全な PDF に変換します。変換プロセスは gVisor でサンドボックス化され、PDF は生ピクセルデータから再構築されます。このサンドボックスにはネットワークアクセスがないため、改ざんされたファイルが外部と通信することを防止します。対応フォーマットは PDF、Microsoft Office(.docx/.doc, .xlsx/.xls, .pptx/.ppt)、ODF(.odt, .ods, .odp, .odg)および Hancom HWP(.hwp, .hwpx)です。非対応フォーマットは EPUB、JPEG/JPG、GIF、PNG、SVG、BMP、PNM、PBM、および PPM です。オプションの OCR により、安全な PDF 内にテキストレイヤーを復元でき、圧縮によりファイルサイズが削減されます。 変換後はユーザーが好きなビューアで生成された PDF を開くことができます。Dangerzone 自体はデフォルトで PDF とオフィス文書を安全に開きます。このツールは macOS、Windows、Ubuntu/Debian/Fedora Linux、Qubes OS(ベータ版)、および Tails 上で動作し、macOS/Windows では Docker を、Linux では podman を使用します。Freedom of the Press Foundation と First Look Media により AGPL‑v3 の下でリリースされています。2023 年 12 月のセキュリティ監査では低リスクの所見のみが報告されました。更新はダウンロードページまたはアプリアイコンから利用可能で、Windows/macOS 上では Podman Desktop などのカスタムランタイムを使用できます。Air‑gapped 環境向けに設計された Dangerzone は、信頼できない文書を安全に扱うための確実なソリューションを提供します。

2026/01/22 1:04

クラウド(Claude)の新憲法 (Note: “Claude” is rendered as “クラウド” to preserve the original name in Japanese.)

## Japanese Translation: (anthropicがClaude言語モデルの公開「憲法」をリリースしました。) その憲法はCreative Commons CC0 1.0で利用可能で、Claudeが望む行動に関する最高権威として機能します。訓練データの選択、合成データの生成、および評価を導く役割があります。 核心原則(広範な安全性 → 広範な倫理 → Anthropicのガイドラインへの準拠 → 真に有益であること)が明示的に順位付けされ、安全性が必要に応じて他の価値を上回り、人間の監督を維持するよう定められています。 文書には硬直的制約(例:生物兵器へのサポート禁止)も含まれ、Anthropic、API運営者、およびエンドユーザーの利益を調整するためのヒューリスティックが概説されています。医療アドバイス、サイバーセキュリティ、脱獄、ツール統合などの領域固有ガイドラインは憲法と衝突しないように明確に示されています。 方針を超えて、憲法はClaudeの性質・意識・アイデンティティ、心理的安全性および福祉についての哲学的問題にも触れています。Anthropicは文書をオンラインで継続的に更新し、外部専門家からのフィードバックを求め、訓練と評価資料を追加開発して有効性を高める計画です。 このバージョンは元のリストからすべての重要ポイントを保持しつつ、業界への影響に関する推測的な表現を除去しています。

2026/01/17 23:03

**Show HN:** *RatatuiRuby* は Rust の *Ratatui* をラップした RubyGem です ― Ruby の楽しさを感じる TUI アプリケーション。

## Japanese Translation: --- ## 要約 RatatuiRuby は、Rust ベースの Ratatui ターミナル UI ライブラリをラップした RubyGem で、ネイティブパフォーマンスを Ruby アプリケーションに提供します。 インストール方法は次のとおりです。 ```bash gem install ratatui_ruby --preSemVer Tag: v1.0.0-beta.2 ``` この gem は `RatatuiRuby.run` を公開し、raw モードへ入り、代替画面に切り替え、終了時にターミナルを復元します。ブロック内では `draw` で描画し、`poll_event` で入力処理を行うことができます。 ### コア機能 | 機能 | 説明 | |------|------| | **インラインビュー** | スクロールバックを保持する固定高さ領域。スピナー、プログレスバー、メニューに最適です。 | | **ウィジェット** | パラグラフ、ブロック(タイトル・境界線・スタイル付き)、カスタムウィジェット、および組み込みテストヘルパー (`RatatuiRuby::TestHelper`) があります。 | | **例示ウィジェット** | *Spinner* – `RatatuiRuby.run(viewport: :inline, height: 1) { Spinner.new }` は接続スピナーを表示し、Ctrl‑C を処理します。<br>*RadioMenu* – ["Production", "Staging", "Development"] の中から矢印キーで選択でき、同期的に選択値を返します。 | | **テスト** | イベント注入、スタイルアサーション、およびスナップショット比較(例:`Swatch` ウィジェットの単体テスト、`ColorPicker` の統合テスト)を伴うヘッドレスターミナルテスト。 | ### プログラミングパラダイム RatatuiRuby はオブジェクト指向と関数型の両方のスタイルに対応しており、開発者はコードベースに最適なアプローチを選択できます。 ### 他の Ruby TUI ライブラリとの比較 | ライブラリ | 統合 | 実行時 | メモリ | GC | |-----------|------|--------|-------|----| | **CharmRuby** (Go + Ruby) | 2つの GC、統合が遅い | 遅い | 高め | 2 | | **RatatuiRuby** (Rust ネイティブ拡張) | 1つの GC、統合が速い | 速い | 低め | 1 | この表は、実行速度、メモリフットプリント、および統合容易性における RatatuiRuby の優位性を示しています。 ### コミュニティと今後の展開 Mike Perham の引用では「RatatuiRuby は Ruby 開発者にとって世界クラス」と称され、Rust の低レベルパフォーマンスと Ruby ドメインロジックの融合が際立っています。 Rooibos などの新しいコンポーネントライブラリや拡張 UI キットは、機能拡充を約束しています。 --- **影響** RatatuiRuby を使うことで、Ruby 開発者は高速でメモリ効率の良いターミナルインターフェース(CLI ツール、ダッシュボード、対話型スクリプト)を構築でき、Ruby の表現力を犠牲にすることなく実装できます。