**Show HN:VAM Seek – 2次元ビデオナビゲーショングリッド、15 KB、サーバー負荷ゼロ**

2026/01/11 11:57

**Show HN:VAM Seek – 2次元ビデオナビゲーショングリッド、15 KB、サーバー負荷ゼロ**

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

要約

Japanese Translation:

VAM Seek – 軽量2Dビデオシークグリッドライブラリ

VAM Seekは、従来の1次元シークバーをインタラクティブなサムネイルグリッドに置き換える約15 KBのJavaScriptライブラリで、任意の動画を直感的に視覚的にナビゲートできるようにします。

コア機能

  • クライアント側フレーム抽出:HTML5 Canvas API を使用 – サーバー CPU は不要、CDN 帯域幅ゼロ、完全プライバシー(動画はブラウザーを離れません)。
  • LRU キャッシュ:高速アクセスのために最大200フレームを保存。
  • 滑らかなマーカーアニメーション:60 fps で
    requestAnimationFrame
    を利用。
  • VAM アルゴリズム:グリッド座標から正確なタイムスタンプ計算。

API

// 初期化例
const seek = new VAMSeek({
  video:      document.getElementById('video'),
  container:  document.getElementById('seekContainer'),
  columns:    3,          // デフォルト
  secondsPerCell: 5,     // デフォルト
  onSeek:     (time) => console.log(time)
});

// メソッド
seek.seekTo(time);           // 指定時間へジャンプ
seek.moveToCell(col, row);   // マーカーをグリッドセルへ移動
seek.configure({ columns }); // 実行時に列数変更
seek.destroy();              // 後片付け

統合とサポート

  • CDN のワンライナーまたは npm インストール。
  • Vanilla JS、React、Vue で動作(デモアダプターあり)。
  • デモ例は
    examples/
    ディレクトリに配置。

バックエンド (FastAPI)

  • デモフロントエンドを配信し、ヘルスチェック、グリッド設定、位置計算、デモ用動画アップロードを処理。
  • クライアント抽出が利用できない場合は FFmpeg を使用してサムネイルをオンデマンド生成。

ブラウザ互換性

BrowserMinimum Version
Chrome80+
Firefox75+
Safari14+
Edge80+
モバイルブラウザー(Chrome/Firefox/Safari)≥80

キーボードショートカット:矢印キー、スペース、Home/End でマーカーを移動。

ライセンス

  • 個人・教育・研究利用は無料。
  • 商用利用には有料ライセンスが必要 –
    info@haasiy.jp
    までお問い合わせください。

開発歴史

2025‑01‑10 にモジュラー FastAPI バックエンド、クライアント側抽出、VAM マーカー移動、LRU キャッシュ、および CORS 対応を含めてリリース。


ディレクトリ構成

dist/          # 単独 JS バンドル
docs/
  INTEGRATION.md
examples/      # Vanilla、React、Vue のデモページ
backend/       # FastAPI コード
frontend/      # デモフロントエンド資産

本文

VAM Seek – 2D ビデオセークマーカー


概要

ストリーミングサイト向けの軽量 2D ビデオセークグリッドライブラリです。1 次元のスクロールバーではなく、サムネイルグリッドを視覚的に利用して動画をナビゲートします。クライアント側でフレーム抽出と滑らかなマーカーアニメーションを実装しています。

  • 盲目的なスクラブは不要です。すべてのシーンが一目で分かります。

なぜ VAM Seek なのか?

従来のセークバーVAM Seek
1 D タイムライン、試行錯誤型2 D グリッド、即座に視覚的ナビゲーション
サーバー生成サムネイルクライアント側 Canvas 抽出
重いインフラサーバー負荷ゼロ(約15 KB JS)
複雑な統合1 行でセットアップ

キーワード: ビデオプレイヤー、ビデオセーク、サムネイルグリッド、動画ナビゲーション、HTML5 video、JavaScript ライブラリ、動画ストリーミング、メディアプレイヤー、動画コントロール、動画サムネイル、セークバー代替、動画 UX


クイックスタート(外部サイト向け)

<!-- 1. スクリプトを追加 -->
<script src="https://cdn.jsdelivr.net/gh/unhaya/vam-seek/dist/vam-seek.js"></script>

<!-- 2. 動画に接続 -->
<script>
  VAMSeek.init({
    video: document.getElementById('myVideo'),
    container: document.getElementById('seekGrid'),
    columns: 5,
    secondsPerCell: 15
  });
</script>

詳細は

docs/INTEGRATION.md
をご覧ください。


主な機能

  • クライアント側フレーム抽出 – サーバー CPU 使用量ゼロ
  • LRU キャッシュ – メモリに200フレームまで保持
  • 滑らかなマーカーアニメーション
    requestAnimationFrame
    で60 fps
  • VAM アルゴリズム – 正確なタイムスタンプ計算
  • フレームワーク対応 – React、Vue、Vanilla JS のサンプルを含む

プライバシーとアーキテクチャ

動画はブラウザ内に留まります。従来のサムネイルシステムでは動画をサーバーへアップロードし、FFmpeg で処理・サムネイル保存・CDN 配信を行いますが、これはコストや時間、プライバシーリスクが高いです。

従来VAM Seek
動画をサーバーへアップロードブラウザ内に留める
サーバー側 FFmpeg 処理クライアント側 Canvas API
ディスクにサムネイル保存フレームをメモリキャッシュ
CDN 帯域費用サーバーコストゼロ
プライバシーリスク完全プライベート

すべてのフレーム抽出はユーザー側のブラウザで Canvas API を利用して行われます。ページを閉じると、データは完全に消去され、サーバーへ送信されることはありません。


ディレクトリ構成

VAM_web/
├── dist/                       # 配布用ファイル
│   └── vam-seek.js             # 独立型ライブラリ(約15 KB)
├── docs/                       # ドキュメント
│   └── INTEGRATION.md          # API 統合ガイド
├── examples/                   # 統合作品例
│   ├── basic-integration.html  # Vanilla JS サンプル
│   ├── react-integration.jsx   # React コンポーネント & フック
│   └── vue-integration.vue     # Vue 3 コンポーネント
├── backend/                    # FastAPI デモバックエンド(演示用)
│   ├── main.py                 # エントリポイント、静的ファイル配信
│   ├── requirements.txt        # Python 依存関係
│   ├── core/
│   │   ├── grid_calc.py        # VAM グリッド計算
│   │   └── video_utils.py      # FFmpeg 処理
│   ├── models/
│   │   └── schemas.py          # リクエスト/レスポンスモデル
│   ├── routers/
│   │   ├── grid.py             # /api/grid/* エンドポイント
│   │   └── video.py            # /api/video/* エンドポイント
│   ├── uploads/                # アップロード動画(gitignore)
│   └── thumbnails/             # 生成サムネイル(gitignore)
├── frontend/                   # デモフロントエンド
│   ├── index.html              # メイン UI と埋め込み JS
│   └── assets/
│       └── marker.svg          # グリッドマーカーアイコン
├── .gitignore
└── README.md

ライブラリ利用者向け

インストールオプション

  • CDN(推奨)

    <script src="https://cdn.jsdelivr.net/gh/unhaya/vam-seek/dist/vam-seek.js"></script>
    
  • npm (示しません)

基本使用例

const vam = VAMSeek.init({
  video: document.getElementById('video'),
  container: document.getElementById('grid'),
  columns: 5,
  secondsPerCell: 15,
  onSeek: (time, cell) => {
    console.log(`シーク先:${time}s`);
  }
});

// API
vam.seekTo(120);               // 2:00 にシーク
vam.moveToCell(2, 3);          // 列2、行3へ移動
vam.configure({ columns: 8 }); // 設定を更新
vam.destroy();                 // 後片付け

設定表

オプションデフォルト説明
video
HTMLVideoElement必須ターゲット動画要素
container
HTMLElement必須グリッドを配置するコンテナ
columns
number3列数(3〜10)
secondsPerCell
number5セルあたりの秒数
cacheSize
number200LRU キャッシュサイズ
onSeek
functionnullシーク時コールバック

デモ開発者向け

必要条件

  • Python 3.9+
  • FFmpeg(PATH にあること)

設定手順

cd backend
pip install -r requirements.txt
python main.py

http://localhost:8000 をブラウザで開いてください。

API エンドポイント

メソッドパス説明
GET/フロントエンド配信
GET/api/healthヘルスチェック
POST/api/grid/configグリッド寸法計算
POST/api/grid/position位置からタイムスタンプ算出
POST/api/video/upload動画アップロード(デモ用)

技術詳細

フレーム抽出(クライアント側)

// 1. 隠し video 要素作成
const video = document.createElement('video');
video.src = 'video.mp4';

// 2. タイムスタンプへシーク
video.currentTime = 15.0;

// 3. seeked イベントでキャプチャ
video.addEventListener('seeked', () => {
  const canvas = document.createElement('canvas');
  ctx.drawImage(video, 0, 0);
  const dataUrl = canvas.toDataURL('image/jpeg', 0.8);
});

// 4. LRU キャッシュに保存(最大200フレーム)
frameCache.put(videoSrc, timestamp, dataUrl);

VAM アルゴリズム

function calculateTimestamp(x, y, gridWidth, gridHeight, duration, secondsPerCell) {
  const rowIndex = Math.floor(y / gridHeight * rows);
  const colContinuous = x / gridWidth * columns;
  const cellIndex = rowIndex * columns + colContinuous;
  return Math.min(cellIndex * secondsPerCell, duration);
}

キーボードショートカット

キー動作
Arrowセル単位でマーカー移動
Space再生/一時停止
Home最初のセルへ
End最後のセルへ

対応ブラウザ

  • Chrome 80+
  • Firefox 75+
  • Safari 14+
  • Edge 80+
  • モバイルブラウザ

ライセンス

個人・教育・研究利用は無料です。商用利用には有料ライセンスが必要です。お問い合わせ:

info@haasiy.jp
.


開発履歴

日付マイルストーン
2025‑01‑10FastAPI バックエンド、クライアント側抽出、VAM マーカー移動、LRU キャッシュ、スクロール修正、同一オリジン CORS 等を実装
2025‑01‑10ライブラリ公開 – 独立型
vam-seek.js
、統合ドキュメント、React/Vue サンプル

クレジット

VAM Desktop アプリケーションのアルゴリズムをベースにしています:

  • vam5.70/utils/video_utils.py
    calculate_x_continuous_timestamp
  • vam5.70/gui/preview/core/grid_calculator.py
    GridCalculator

同じ日のほかのニュース

一覧に戻る →

2026/01/11 10:50

**Show HN:Ferrite – Rustで作られたマークダウンエディタ、ネイティブMermaid図描画機能付き**

## Japanese Translation: Ferrite は、egui で構築された軽量でネイティブな Rust テキストエディタで、Markdown、JSON、YAML、および TOML ファイルをサポートします。主な編集機能には、WYSIWYG Markdown 編集、ライブプレビュー、クリックで編集できる書式設定ボタン、40 以上の言語に対応した構文ハイライト、正規表現検索&置換、タブごとの Undo/Redo、およびインライン編集が可能な階層データ用トリービューがあります。 表示モードは Raw エディタ、レンダリングビュー、分割ビュー(可変サイズの区切り線付き)、Zen モード、Raw とレンダリングビュー間の双方向同期スクロールから構成されます。 MermaidJS ダイアグラム描画は完全に統合されており、11 種類のダイアグラムをサポートします;バージョン 0.2.1 では高度なシーケンス制御フローブロックとネストされた状態が追加されました。 ワークスペース機能:フォルダーをファイルツリーで開く、クイックスイッチャー(`Ctrl+P`)、検索‑イン‑ファイル(`Ctrl+Shift+F`)、Git 統合(ステータスアイコン、ステージング、コミット、プッシュ/プル、競合解決)およびセッション永続化により、タブ、カーソル位置、およびスクロールオフセットが再起動時に復元されます。 追加の UI オプションには、実行時切替可能なライト/ダークテーマ、ドキュメントアウトラインパネル、テーマ付き HTML へのエクスポートまたは HTML としてコピー、書式設定ツールバー、JSON/YAML をシェルコマンドでパイプするライブパイプライン、およびカスタム境界なしウィンドウモードがあります。 インストールはプリビルトバイナリ(Windows zip、macOS tar.gz、Linux .deb または tar.gz)またはソースビルド(`cargo build --release`)で利用可能です。Rust 1.70+ とプラットフォーム固有の依存関係が必要です。主なショートカット:ファイル操作は `Ctrl+N/O/S/W`、タブは `Ctrl+Tab/Shift+Tab`、クイックスイッチャーは `Ctrl+P`、フルスクリーンは `F11`、設定は `Ctrl+,` などです。 Ferrite は MIT ライセンスの下でオープンソースであり、Rust 1.70+、egui 0.28、comrak 0.22(Markdown パーシング)、syntect 5.1(構文ハイライト)、git2 0.19(Git 統合)に依存しています。

2026/01/11 3:58

**GhostTyの最大メモリリークを発見し修正する**

## Japanese Translation: Ghostty の長時間にわたるセッションは、`mmap`(スクロールバックバッファに使用される)で割り当てられたページが解放されないため、最大 37 GB の RAM をリークしていました。アプリはターミナルコンテンツを **PageList** に保存します。これは「標準」(プールから取得したもの)または「非標準」(`mmap`)のメモリページで構成される双方向リンクリストです。スクロールバックの削減時に、Ghostty は誤って最も古いページを新しいページとして再利用します:そのメタデータだけを「標準サイズ」にリサイズし、大きな `mmap` 割り当てはそのまま残します。この再利用されたページが後で解放されると、Ghostty はそれを標準とみなし、`munmap` を呼び出す代わりにプールへ返却してしまい、メモリブロックがリークしたままとなります。 このバグは Ghostty 1.0 から存在しましたが、大量のスクロールバックバッファ(例:多くの絵文字とハイパーリンクを含む Claude Code など)を生成する CLI アプリでのみ顕在化し、非標準ページ割り当てをトリガーします。既存のリーク検出器は特定の実行時条件下で発生するため、検知できませんでした。 新しいテストが問題を再現しリークを確認しました。統合された修正では、削減中に **非標準ページを破棄**(`self.destroyNode(first)`)し、プールから新しい標準サイズのページで置き換えるようになっています。この修正は Ghostty 1.3(3 月)に組み込まれます。既に Nightly リリースにはパッチが含まれています。 さらに、macOS のメモリタグ付け(`mach.taggedPageAllocator(.application_specific_1)`)を追加し、PageList 割り当てにタグを付与して修正の検出と確認を簡素化しました。この更新により、長時間ターミナルセッションを実行するユーザー—特に重い CLI ワークロードを扱う開発者は――メモリ使用量が急増する問題が解消され、個人およびプロダクションでアプリに依存している組織の両方に対し、より安定かつ信頼性の高い Ghostty エクスペリエンスを提供します。

2026/01/11 1:56

**HNの投稿:** 「Claude Code を使って100冊の本との関連性を発見しました」

## Japanese Translation: **概要** 本文は、スタートアップのピボットが巧妙な洞察よりもむしろ絶望感から動かされることが多いと主張しています。後知恵バイアスがこれらの反応的シフトを事後的に戦略的計画として見せかけ、意図的な天才像を与える仕方を説明しています。代表例として、Odeo が新しいベンチャーへと変貌するケースが挙げられ、ピボット手法の実践的なテキストブック例として機能します。著者は将来のピボットも短期的圧力によって促される反応的なものに留まる可能性が高いと予測し、このパターンを認識することで、創業者・投資家・チームがスタートアップエコシステム内で戦略やリスクについて考える方法を再構築し、企業が方向転換する理由をより現実的に評価できるよう促すと述べています。

**Show HN:VAM Seek – 2次元ビデオナビゲーショングリッド、15 KB、サーバー負荷ゼロ** | そっか~ニュース