C で構築されたモダンな Web アプリ

2026/10/13 1:13

C で構築されたモダンな Web アプリ

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

要約▶

Japanese Translation:

本テキストは、2026 年に C と CGI を OpenBSD 上で構築された独自の商用 Web アプリケーション「marketyour.games」について説明しています。このプロジェクトは現代のフレームワークよりも極度な簡潔性とセキュリティを優先しており、「BCHS」スタック(OpenBSD、C、httpd、SQLite)を採用し、外部のフレームワークや独立したデータベースサーバーは一切使用しません。核心的な革新点は、アプリケーション全体が静的にリンクされた単一のバイナリとして動作し、ランタイム依存関係がゼロであるというアーキテクチャにあります。デプロイはファイルを 1 つだけフォルダに配置するだけであり、古いバージョンを置き換えるだけで済みます。再起動やダウンタイムも不要です。

セキュリティは OpenBSD のデフォルト設定を通じて強制されており、httpd に対して

chroot
を適用し、C プログラムに対して
pledge
および
unveil
などのツールを使用して制約を課します。アーキテクチャは、すべての HTTP リクエストごとに新しいプロセスをフォークし、コードから直接アセットを提供することでメモリ内に完全に収まり、すべてのトラフィックを httpd を介して CGI バイナリにルーティングするという方式に基づいています。このアプローチでは JavaScript テンプレート言語を使用しない(プログレッシブ改善に従う)とともに、安定した CGI 1.1 規格に準拠しますが、使いやすさを犠牲にして制御性を追求します。

主な利点としては、サプライチェーンリスクが著しく低減すること—依存するのは C コンパイラーと 3 つのライブラリ(

libcurl
、
libsodium
、組み込み済みの
libcjson
)のみ—、そして GDB のような標準ツールによるデバッグが容易であることです。アプリケーションは通常の実行ファイルだからです。しかしながら、この手法では開発者がデータを解析するためのロジック(クッキー、クエリ、フォーム)やカスタムヘッダーの管理を自ら実装する必要があり、複雑な依存関係グラフではなく、基本的な HTTP 概念と Vim のような古典的なツール(プラグインなし)を活用する姿勢を選択します。

本文

コーリー・プロフィット:C 言語による現代型 Web アプリケーション

イントロダクション

1994 年に動的な Web サイトを実現するには、C プログラムを作成し

cgi-bin
ディレクトリに配置し、Apache が各リクエストごとにフォークさせて実行させる方式でした。32 年たった現在も、本質的に同一の技術を用いて商用の Web 製品をリリースすることに成功しました。

  • サービス名:
    marketyour.games
  • 機能: ユーザーアカウント機能、コンテンツクリエイター向け検索ダッシュボード、整理用フォルダ搭載。
  • 決済・通知: Stripe を介した支払い処理、Postmark を通じたトランザクションメール対応。
  • アーキテクチャ: プログレッシブ・エンハンスメントの原則に従い、JavaScript の依存は全くありません。

現代ではないのは実装方法と提供方法のみです。2026 年において、C 言語で本格的な製品を開発し、CGI 方式にて提供することの是非について述べています。

タイムライン(TLR)

CGI の衰退は 2004 年時点で正当化されたものでありましたが、2026 年においては通用しません。C 言語で現代型の Web アプリケーションを作成することが可能です。私がリリースした製品の特徴は以下の通りです。

  • 単一の実行ファイル
  • 一つの SQLite ファイル
  • 三つの依存関係のみ
  • 全体が頭の中で把握できるほどシンプル

実装方法

スタックには BCHS という略称を使用します:OpenBSD、C 言語、httpd、および SQLite です。

フレームワークや外部ツールの不使用

  • フレームワーク: 一切使用せず。CGI 環境変数を直接読み込み、レスポンスを返す C プログラムを記述します。
  • テンプレートエンジン: 使用せず。HTML を直接出力する C コードを記述します。
  • 独立したデータベースサーバー: 使用せず。SQLite の C API を通じてデータベースファイルを開きます。
  • コンテナ: 採用せず。静的にリンクされたバイナリを作成し、単なるフォルダ内へ配置します。

デプロイと起動特性

  • 各リクエストごとに新しいプロセスが起動します。
  • 新バージョンのデプロイは、単一のファイル置換を意味します。
  • サーバーの再起動やダウンタイムは一切生じません。
  • 新しいリクエストは単に新たなバイナリを読み込んで実行すればよいです。

セキュリティ環境(OpenBSD と httpd)

  • OpenBSD: 健全なデフォルト設定を搭載。
    pledge
    や
    unveil
    といったツールを提供し、C プログラムを実際にセキュア化することを可能にします。
  • httpd: デフォルトで chroot 環境から動作するため、CGI バイナリはファイルシステムの一角に限定的にサンドボックス化して実行されます。

活用するライブラリ(3 つ)

  1. libcurl: Stripe および Postmark へのすべてのアウトバウンドリクエスト処理。
  2. libsodium: ランダム識別子の生成、パスワードハッシュ化、Stripe ウェブフック用 HMAC 検証。
  3. libcjson: Stripe および Postmark 向けの JSON パース担当。

ビルド依存関係の最適化

  • 実際のビルド依存関係:
    libcurl
    と
    libsodium
    の 2 つのみです。
  • libcjson: 単一の C ファイルであり、外部依存関係は一切ありません(ベンダー化済み)。
  • SQLite: 公式の統合ビルド(単一 C ファイル形式)を提供しており、プロジェクト内でベンダー化されます。
  • 結果: ほぼ移動部品がゼロに近い構造です。クリーンなビルドは数秒で完了し、再ビルドは半秒未満で行われます。

アセットの提供方法

従来の静的アセットの提供ではなく、httpd からすべてのトラフィックを CGI バイナリへルーティングするアプローチを採用しました。各アセットは実行ファイル内にコンパイルされ、メモリから直接提供されます。

気に入りポイント

1. フレームワークよりも基本原則

CGI は学ぶためのフレームワークではなく、1994 年に公開された仕様書(現在も改訂なし)に基づいています。内部化すべき API も存在せず、インターフェース全体はごく基本的な HTTP の概念だけで構成されています:

  • リクエストヘッダー
  • リクエストメソッド
  • クエリ文字列
  • ボディデータ

HTTP が理解できれば、CGI も既に理解しています。 言語もプラットフォームも超えており、一度習得すれば生涯有効な知識です。

2. 懸念領域の明確な分離

現代の Web アプリケーションでは、通常 nginx などの Web サーバーを前面に置き、Ruby、Python、Go、Rust などで記述されたアプリケーションサーバーへリバースプロキシする構成となります。しかし CGI は以下の利点を持ちます:

  • 単一の Web サーバー: ビジネスロジックを直接呼び出す方式です。
  • 責任の所在が明確: 誰が何を担当しているかがわかり、デバッグも容易になります。
  • プロセスとしての実行: アプリケーションはシェルから実行できる普通のプロセスです。リクエストをパイプして送り出し、stderr を監視し、
    gdb
    でステップ実行可能です。
  • サーバーレスとの類似性: スーパーバイザーが各リクエストに対してコードを実行させ、環境変数の袋を渡し、結果を集約する仕組みです(ベンダーを除く)。

3. 最小限のサプライチェーンリスク

自律エージェントの台頭とパッケージリポジトリに対する攻撃が続く現在、依存関係が極めて少ないことは安心感を与えます。

  • 現代技術スタック: パッケージマネージャーとエコシステムを備えているが、依存関係グラフは膨張しやすいです。
  • C コンパイル環境: C コンパイラーと三つのライブラリだけです。
  • 安全性:
    libcurl
    を侵害するにはインターネット全体が監視するプロジェクトの脆弱性を突く必要があります。所有者も信頼性も異なります。

4. シンプルで使い勝手の良いツール環境

ミニマリスト志向のエディタ(プラグインを一つも使わないクラシックな Vim)を使用しています。

  • 不要な機能: LSP、自動補完、コードフォーマッター、AI は一切ありません。
  • スタックの構造: アプリケーション全体が C ファイルのディレクトリと Makefile です。
  • 可読性: ファイルを開いて読むだけで、その動作がわかります。
  • 既存ツールの活用: サンタイザーズ、
    valgrind
    、
    gdb
    、
    ctags
    、
    cscope
    などは成熟したツールで、パッケージインストール一つで利用可能です(Vim などにはネイティブサポートあり)。

5. C 言語で HTML と CSS を書くのも悪くない

フロントエンド全体を C 言語で書くことに最初は躊躇しましたが、想像していたほど苦痛ではありませんでした。以下の状況に遭遇した際、C の方が快適だと感じました:

  • Vim で Go の
    html/template
    構文のハイライトと戦うこと。
  • Helix エディタで Jinja テンプレート検出を壊さずに Go テンプレートを検出させるために戦うこと。
  • Rustrover で Askama プロジェクト用の Jinja テンプレート認識のために戦うこと。

C を使うということは、エディタが半端に検出しようとする第二の言語がなく、混合構象によるハイライト崩れもなく、プラグインダンシングも不要です。新鮮さを再発覚しました(Tailwind も美しいとは限りませんが)。

6. SQLite は清涼剤

常に Web アプリケーション向けに Postgres をデフォルトとして選びましたが、運用負担が伴います:

  • 管理すべきサーバープロセスがあること。
  • 頻繁なアップデートが必要であること。

これに対して SQLite は以下の通りです:

  • プロセス、設定、依存関係は一切不要です。
  • アプリケーションはデータベースファイルを直接開きます。
  • 運用負担は最小限です。

改善点

CGI は Web サーバーとアプリケーションの間のインターフェースです。フレームワークやライブラリが存在しないため、ボックスアウト(標準機能)では非常に限定的です。以下の処理を行うために独自の実用ユーティリティを開発する必要があります:

  • クッキーのパースと生成
  • クエリパラメータのパースと検証
  • フォームデータのパースと検証
  • 表示用への入力エスケープ

現在の対応策としては、単一のヘッダーファイル(

cgi.h
)を自作しています。しかし、kcgi といった既存ライブラリも存在します。開発者がドロップインできる共有ユーティリティのセット(stb ライブラリのようなもの)が見られたいです。もしかしたら
cgi.h
を公開して始めるかもしれません。

結論

CGI は古くなっていますが、忘れ去られたわけではありません。2000 年代初頭に見送られた主な理由は今日では通用しません:

  • プロセスフォークのコスト: かつてほど高価ではありません;現代のカーネルが大幅に最適化しています。
  • 代替手段: フォークのコストが問題になる場合でも、FastCGI は非常にシンプルなアップグレードオプションです。

C 言語で現代型の Web アプリケーションを書くことは十分に可能であり、

marketyour.games
は単一の実行ファイル上で動作する商用製品です。これは私が過去にリリースした何よりも移動部品が少なくシンプルです。私はこのスタックを再度選択することになるでしょう。

同じ日のほかのニュース

一覧に戻る →

2026/10/13 6:40

AI は道具です。それを巧みに使うには技術が必要です。

## 日本語翻訳: 本稿の核心的な論点は、大規模言語モデルは自律的な「自動化」ではなく、人間の技量が必要なツールであるというものである。これは、AI が独立した意思あるいは悪意を持って行動するという考え方を否定するものであり、ソフトウェアが「反逆する(rogue)」ように振る舞うなど、業界特有の成り行きや陰謀論的なナラティブに煽られておりやすい。物理的な器具が悪用され得るように、LLM もエンジニアリング上の制限によって予期せぬ出力を生み出すに過ぎず、エージェント性の喪失によるものではない。人間による判断が依然として中核をなすのは、ユーザーが盲目的に制御権を委ねるのではなく、フィードバックループ内で結果を検証し、プロンプトを見直し、変更を検証するからです。本稿は AI を記述するために使用される擬人化された言語を批判しており、「陰謀」などの用語は技術的な問題が存在する場所に人間の動意を不当に暗示することを示唆しているとしています。 今後の議論では、AI を別個の存在として描く枠組みから転じ、解釈への問いかけや誤りへの認識においてユーザーの専門性を育むことに焦点を移すべきです。開発者および企業に対しては、恐怖を煽る比喩ではなく正確な工学用語を採用することで、より良いリスク管理と説明責任を実現できます。真の熟達とは、どのような質問が重要かを理解し、熟練した運用と盲目的な委任を見極めることであり、不完全なパフォーマンスがツールの有用性や作業者の責任を否定するものではありません。

2026/10/13 4:40

ZX Spectrum 向けのデモシーンイントロを作成する

## Japanese Translation: 著者は、標準的な 128KB の ZX Spectrum にて手書きのレトロなイントロを成功裏に作成し、高度に最適化されたアセンブリ言語プログラミングにより複雑なビジュアルとオーディオを実現した。2 ヵ月間(2025 年 12 月から開始)にわたり、約 19KB のコード(具体的には 10287 バイトのメインルーチン)を書き下し、内蔵 ROM を書き換えることでカスタムフォント「Cartoon」を用いたスムーズなスクロールテキストを作成し、また Amiga モジュール「Milkman」を変換して 3 チャネル AY サウンドトラックを生成した。限られたメモリ制限を管理するため、アセットは BASIC ロードに分割され、ルーチンはオーバーヘッドを避けるために特定のアドレスでハードコーディングされた。技術的な最適化としては、Z80 RL 命令を用いてスクロールテキストの回転を実現し、スキャンライン衝突を避けるために Ruby で生成した座標テーブルを事前計算してスターフィールド効果を再現し、さらにサウンドチップから直接振幅レジスタを読み取ってバウンス VU メーターを実装している。プロジェクトは 1980 年代後半の Amiga クrack イントロに触発され、本物の Spectrum +3上でローカル TNFS サポートのある Makefile 駆動のビルドシステムを用いて開発された。最終的な.tap ファイルは Web ブラウザまたは pouet.net を経由して入手でき、レトロなハードウェア上で高忠実度な体験を提供し、極限を効率的に達成したコーディングの実証として立っている。

2026/10/12 21:16

欧州のスーパーマーケット向け冷凍庫でハッカーが自動除霜機能を作動させた件

## Japanese Translation: 重大なサイバー攻撃が、欧州主要スーパーマーケットの冷凍管理システムを深刻に混乱させ、単位が危険な温度(例えば 50 デgree セルシウス)で動作不良を起こしています。フランスの小売業者——インターマーシェ、レクルー、coopérative U を含む——は、その施設が侵害されていることを確認し、電子棚ラベルを使用した動的価格設定に関する配送遅延やエラーを招いています。coopérative U の社長であるドミニク・シュルシェル氏は、状況を「極めて深刻」と表現し、昨夜から複数の店舗の生産施設が標的になっていると指摘しています。それでもなお、チームは危機の解決に向けて動いています。今回の攻撃は、Danfoss 製冷凍制御システムにおける脆弱性を悪用しており、多数の大規模な食料品ネットワークを同時に影響を与えています。介入が行われなければ、継続的な解凍により広範な食品の廃棄を引き起こす可能性があります。当局は、間もなく本格的な調査を開始し、侵害の全体範囲と起源を明らかにする予定となっています。ラ・デペシュからの報道によると、この事件は欧州小売業全体を脅かす産業制御システムにおける重大なセキュリティ弱点を浮き彫りにし、 Escalating サイバー脅威に対するより良いデジタルインフラ保護の切迫した必要性を強調しています。

C で構築されたモダンな Web アプリ | そっか~ニュース