**Show HN: TTF‑DOOM – TrueType フォントヒンティング内で実行されるレイキャスター**

2026/04/07 4:25

**Show HN: TTF‑DOOM – TrueType フォントヒンティング内で実行されるレイキャスター**

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

要約

Japanese Translation:

プロジェクトは、ほんの小さなTrueTypeフォントファイル(約6.5 KB)が完全なDoomスタイルのレイキャスティングエンジンを埋め込み、3DグラフィックスをブラウザまたはPygameで直接レンダリングできることを示しています。

グリフ「A」には16本の縦棒輪郭が含まれており、その位置はSCFS命令によって各フレームごとにシフトされ、16×16タイルマップの遠近法ビューを生成します。JavaScriptは

font-variation-settings
(軸 MOVX、MOVY、TURN)を通じてプレイヤーの移動・敵・射撃を提供し、ブラウザは毎フレームグリフを再ヒントして壁描画を行います。

カスタムDSLコンパイラは、簡略化されたCライク言語をTrueTypeヒントアセンブリ(FDEF、CALL、RS、WS、SCFS など)に変換し、正弦/余弦ルックアップテーブルとマップデータを .ttf ファイルに注入します。TrueType の

MUL
(a*b)/64
を実行するため、コードは
DIV(a,1)
後に
MUL
を使用して真の乗算を達成します。ループは再帰的な FDEF 呼び出しとしてコンパイルされ(WHILE 命令は存在せず)、FreeType の約64フレーム呼び出しスタック制限に依存しています;レイキャスターの16列 × 14ステップはこの境界内に収まります。

SCFS はピクセル座標で動作し、フォント単位ではありません。また、Chrome はヒント付けされたグリフをキャッシュする場合があり、変化軸の変更時に再ヒントがスキップされることがあります;毎フレーム揺れ(ジャイター)を追加して新鮮なヒント付けを強制します。

デモはローカルで実行できます (

git clone https://github.com/4RH1T3CT0R7/ttf-doom.git
)、フォントをビルドし、ブラウザまたはPygameホストのいずれかを起動します。操作は WASD が移動、矢印キーが回転、Space が射撃です;Tab を押すと実時間変化軸(MOVX、MOVY、TURN)のデバッグオーバーレイが表示されます。

コードベースは

compiler/
fontgen/
game/
に整理され、ブラウザおよび Python ホスト、テスト、および最終フォント
doom.ttf
が含まれています。Apple の1991年版 TrueType ヒントバイトコードを使用し、Harfbuzz の WASM シェイパー(
llama.ttf
でのような)ではなくしています。プロジェクトは Apache 2.0 ライセンスで公開されています。

この作品は、非常に小さなフォントファイル内で複雑な3Dレンダリングを実現できることを示し、パフォーマンスクリティカルなグラフィックスや難読化の可能性を開き、TrueType エンジン間の差異が将来のウェブレンダリング戦略に影響を与える可能性があることを強調しています。

本文

TrueType フォントのヒンティングプログラム内で動作する DOOM‑スタイルのレイキャスター


これは何か?

TrueType フォントにはグリッドフィッティング(文字をピクセルに合わせる)用の仮想マシンが組み込まれています。
スタック、ストレージスロット、算術演算、条件分岐、関数呼び出しなどを備えており、実際にはチューリング完全です。私はこの VM を使って 3D グラフィックスを描画できるか試してみました。

フォントファイルに TrueType バイトコードで書かれた DDA レイキャスティングエンジンが埋め込まれています。
文字「A」は 16 本の垂直棒(縦線)を持ち、ヒンティングプログラムは 16 × 16 のタイルマップに対してレイキャストし、SCFS 命令でそれらの棒を再配置して 3‑D パースペクティブビューを作ります。全体は 6.5 KB に収まっています。

JavaScript が移動・敵・射撃を制御し、座標情報を

font-variation-settings
経由でフォントに渡します。
フォントがレイキャストと壁描画を行い、Canvas 上に敵や武器、HUD を重ねて表示します。


動作原理

私はカスタム DSL(ドメイン固有言語)から TrueType ヒンティングアセンブリを出力する小さなコンパイラを書きました。
DSL は簡易 C のように見えます:

func raycast(col: int) -> int {
    var ra: int = player_angle + col * 3 - FOV_HALF;
    var dx: int = get_cos(ra);
    var dy: int = get_sin(ra);
    …
}

コンパイラは TT バイトコード(

FDEF
,
CALL
,
RS
,
WS
,
SCFS
等)を生成し、sin/cos ルックアップテーブルとマップデータと共に
.ttf
ファイルへ挿入します。
変数割り当ては TT ストレージスロット全てで行い、関数定義は
FDEF/ENDF
として出力されます。また固定小数点(fixed‑point)演算もコンパイラが処理します。

パイプライン

doom.doom → lexer → parser → codegen → doom.ttf

TrueType の算術

  • MUL
    (a*b)/64
    を計算します。
    内部では F26Dot6 固定小数点が使われるため、
    1 * 4 = 0
    となります。
    私は 2 日かけて
    DIV(a, 1)
    a*64
    を返すことを突き止め、その後
    MUL(a*64, b) = (a*64*b)/64 = a*b
    と解決しました。

  • WHILE
    命令はありません。ループは再帰的な
    FDEF
    にコンパイルされ、FreeType は呼び出しスタックを約 64 フレームに制限します。
    16 列 × 14 ステップのレイはぎりぎり収まります。

  • 再帰ループ内で

    return
    を使っても即座に抜けるわけではなく、値をプッシュして再帰が続くため、ヒットフラグで制御し直しました。

  • SCFS
    は F26Dot6 ピクセル座標(フォント単位ではなく)を受け取ります。これが原因で棒が極端に小さくなる問題を解決できました。
    Chrome はヒンティングされたグリフをキャッシュし、軸が変わった際に再ヒンティングをスキップすることがあります。各フレームで少しずつ座標を揺らすことで回避しました。
    SVTCA[0]
    が Y を選択し、
    SVTCA[1]
    が X を選択します。


アーキテクチャ

  • フォントが壁(レイキャスト結果)を描画します。
  • JavaScript はそれ以外すべてを担当:プレイヤー位置/角度 → 3 つのフォント変動軸 (
    MOVX
    ,
    MOVY
    ,
    TURN
    ) を更新し、フレームごとにブラウザがグリフを再ヒンティングして形状を変更します。

デモで Tab キーを押すと、リアルタイムでフォント変動軸が表示されるデバッグオーバーレイが出ます。


使い方

git clone https://github.com/4RH1T3CT0R7/ttf-doom.git
cd ttf-doom
pip install fonttools freetype-py pygame pytest
python game/build.py
python -m http.server 8765

Chrome または Edge で

http://localhost:8765/hosts/browser/index.html
を開きます。
WASD で移動、矢印キーで向きを変え、Space で発射します。デバッグオーバーレイは Tab キー。


プロジェクト構成

ディレクトリ用途
compiler/
DSL → TrueType アセンブリ(字句解析・構文解析・コード生成)
fontgen/
フォントビルダー、グリフ生成、sin/cos テーブル
game/
Raycaster ソース (
doom.doom
) とビルドスクリプト
hosts/browser/
ブラウザデモ
hosts/python/
Pygame ホスト(開発用)
tests/
451 のテストケース
doom.ttf
実際にプレイできるフォント (6,580 バイト)

比較

  • llama.ttf はフォント内で計算を行いますが、HarfBuzz の WASM シェイパー(WebAssembly ランタイム)と連携しています。
  • TTF‑DOOM は 1991 年に Apple が配布した TrueType ヒンティングバイトコード(グリッドフィッティング用 VM)をそのまま使用しており、全く別の仮想マシンです。

ライセンス

Apache 2.0


同じ日のほかのニュース

一覧に戻る →

2026/04/07 4:50

**Show HN: Ghost Pepper – Mac 用ローカル「ホールド・トゥー・トーク」音声認識アプリ** - **概要** シングルキー(デフォルトは⌘)を押し続けるだけで、Mac 上で話す内容をテキスト化できる軽量かつプライバシー重視のアプリです。クラウド処理は一切行わず、全てローカルで完結します。 - **主な機能** • 即時文字起こし(遅延がほぼゼロ) • 複数言語・方言に対応 • ショートカットやホットキーのカスタマイズ可能 • 内蔵文法校正と句読点自動挿入 • オープンソース(GitHub) - **重要性** • 第三者 API に依存しないため、コスト削減とデータ共有に関する懸念が軽減されます • 開発者・作家・サブスクリプション不要で高速な文字起こしを求める人に最適です - **入手方法** 1. GitHub のリリースページから最新版をダウンロード 2. `GhostPepper.app` を `/Applications` フォルダーへドラッグ&ドロップ 3. アプリを起動し、好みのキー割り当てを設定して話し始める - **フィードバック & サポート** GitHub 上で不具合報告や機能リクエストが受け付けられています。小規模な貢献者コミュニティによって積極的にメンテナンスされています。 *macOS でクラウドを使わず低遅延の音声認識ツールを探しているなら、Ghost Pepper が最適かもしれません。*

## Japanese Translation: **概要** Ghost PepperはmacOS専用の完全ローカル音声認識アプリで、macOS 14+ Apple Silicon上で動作します。 - **プライバシー優先設計:** クラウドAPIを使用せず、データはマシンから外部へ出ることがなく、転写結果はメモリ内にのみ保持されます(デバッグログは終了時に消失)。 - **動作方法:** Controlキーを押し続けて録音し、離すと自動的に任意のテキストフィールドへ転写結果が貼り付けられます。 - **モデルオプション:** - *音声認識モデル:* Whisper tiny.en (~75 MB)、Whisper small.en(デフォルト、~466 MB)、Whisper small multilingual (~466 MB)、Parakeet v3 (~1.4 GB)。 - *クリーンアップモデル:* Qwen 3.5 0.8B (~535 MB, ~1–2 s)、Qwen 3.5 2B (~1.3 GB, ~4–5 s)、Qwen 3.5 4B (~2.8 GB, ~5–7 s)。 - **ユーザーインターフェース:** メニューバーに表示され、Dockアイコンはありません。ログイン時に自動起動しますが、設定で無効化可能です。 - **権限:** マイクロフォンとアクセシビリティの許可が必要です(音声取得およびキーストロークの擬似入力)。 - **インストール & ライセンス:** DMGからインストールするか、Xcodeでソースをビルドします。アプリはMITライセンスで配布され、WhisperKit、LLM.swift、Hugging Face、Sparkle を使用しています。 - **エンタープライズサポート:** 管理デバイス上ではMDM PPPCペイロード(Bundle ID `com.github.matthartman.ghostpepper`、Team ID `BBVMGXR9AY`)を通じてアクセシビリティ許可を事前承認できます。 Ghost Pepperはクラウドサービスに依存せず、資金調達も大きくなく、完全ローカルで利用できる無料の音声転写代替手段です。

2026/04/07 1:32

**Launch HN: フリースタイル – コーディングエージェント用サンドボックス**

## Japanese Translation: **概要:** プラットフォームは、サンドボックスと呼ばれる完全に管理されたLinux仮想マシンを提供し、ユーザーがコードの保存・デプロイ・ネットワーキングを正確に制御した状態で数万ものコーディングエージェントを実行できるようにします。各サンドボックスはコンテナではなく完全なVMであり、本当のrootアクセス、ネストされた仮想化サポート、ユーザーアカウントのシール、systemdサービス、グループ分離、およびフルLinuxネットワークスタックを提供します。エージェントコードはプラットフォーム上のGitリポジトリに格納され、FreestyleやGitHubなどの外部リポジトリと双方向で同期できます。ユーザーはブランチ、パス、イベントタイプでフィルタリングされた各リポジトリごとの細かなWebhooksを設定し、`ci.internal/webhook`、Slack(`hooks.slack.com/trigger`)またはFreestyleデプロイトリガーなどのエンドポイントに接続できます。デプロイメントはgitプッシュで自動化するか、Freestyle Deployments機能を使用してVMに直接クローンすることも可能です。Agent Scale Infrastructureインターフェースは多数のサンドボックス間でスケーリングを実現し、無料ティアはクレジットカード不要で実験を促進します。このソリューションは組織に対して、安全かつ拡張性のあるエージェント環境を提供し、インフラストラクチャとネットワーキングのニーズを満たします。

2026/04/06 19:36

サム・オルトマンは私たちの未来を支配できるか――彼を信頼してよいのでしょうか?

**Show HN: TTF‑DOOM – TrueType フォントヒンティング内で実行されるレイキャスター** | そっか~ニュース