WebUSB を通じて USB/IP にブリッジしたブラウザ内 Linux VM で、古いプリンターを救出する

2026/04/08 1:33

WebUSB を通じて USB/IP にブリッジしたブラウザ内 Linux VM で、古いプリンターを救出する

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

要約

Japanese Translation:

著者は、3Dプリンターと交換して古いCanon SELPHY写真プリンターを入手し、その紙やインクの価値よりも低価格で購入しました。macOS と Windows がデバイスのサポートを終了したため、彼はブラウザ上で Alpine Linux エミュレーター(v86)を実行し、WebUSB/USB‑IP を使用して CUPS/Gutenprint コマンドを物理プリンターに転送するウェブアプリを構築しました。初期の試作ではカスタム CUPS バックエンドが必要でしたが、後続バージョンでは tcpip.js(WebAssembly にコンパイルされた lwIP)を使用して双方向ブリッジを作成し、印刷および SANE を介したスキャンの両方向通信を可能にしました。
画像は JPEG を 6 × 4 インチ用紙サイズに合わせた PDF にラップし、EXIF の向きと ICC プロファイルを保持するように処理されます。HEIC 写真は libheif-js と wasm‑mozjpeg を使用して変換されます。基本的なテレメトリ(プリンターの詳細、印刷ジョブ)は、アフィリエイトリンク経由で Neon Postgres データベースへ送信されます。
アプリは printerface.app および printervention.app でホストされ、スキャンプロトタイプは yes‑we‑scan.app にあります。著者は他の Gutenprint 対応モデルもサポートする予定ですが、コードをオープンソース化せず、消耗品ベンダーとのホワイトラベル取引を好みます。レガシーハードウェアを復活させることで、プロジェクトは電子廃棄物の削減を目指し、SELPHY プリンターの転売価格に影響を与える可能性があります。

このバージョンではすべての主要なポイントが保持され、未検証の推測を避け、明確で簡潔な物語を提示しています。

本文

ホーム

私が手に入れた古い写真プリンター

物語は、思わぬ形でカノン SELPHY 写真プリンターを手にしたことから始まります。
私は新しい3Dプリンターを購入し、友人マークに古いものを渡さないかと尋ねました。彼は喜んで受け取ってくれ、代わりにこの写真プリンターを差し出しました。実際には eBay で余剰品を拾い、紙とインク付きで紙・インクだけの価値以下で手に入れていたのでした。

私は新しいガジェットにワクワクして「家族全員が喜べるだろう」と思い、同意しました。すると、なぜこの古いプリンターはこんなにも安く売れるのか分かった―Mac も Windows も長らくサポートを止めていたからです。マークは Linux を使っているので、その問題に直面したことがありませんでした。

幸運なことに、デスクには既にテスト用として使用している小型の Lenovo ThinkCentre(Manjaro が動いています)があります。実際、このような機種も eBay で安価で手に入ります。


Linux なら AirPrint 経由で共有できる

Manjaro マシンに CUPS と Gutenprint をインストールし、SELPHY に美しく印刷しました。Avahi を設定して AirPrint で共有すれば、家族全員が Mac や iPhone から印刷できます。

1999 年のように写真をプリントしていた気分です――触れられる本物の写真!ただし、1999 年とは違い、簡単・即時・必要な部分だけを切り取って露出調整後に印刷できるという利点があります。CMY 印刷の魔法も目の前で体験できます。プリンターは紙を三回通過させます――黄→マゼンタ→シアンです。

ハッピーエンド!しかし、これは物語の途中にすぎません。次に考えたのは「親御さんにも一台欲しい」と思い、孫の写真を印刷できるよう Raspberry Pi をプリントサーバーとして設置する案でした。しかし、それだと余計な配線が増えてしまうので、やめました。


すべての人が Linux を使っているわけではない

私は「ソフトウェアだけで非エンジニア向けにできるはず」と考え、思い切って Claude Code に £18 を投資してコーディングを始めました。現代の LLM は驚くべきものです――コンピュータが心の自転車なら、Claude Code はプライベートジェットに相当します。

Claude と私はネイティブ Mac アプリを作ることにしました。このアプリは「Linux VM をさりげなく起動し、Virtualization.framework で USB 通信を転送し、mDNS でプリンターを宣言する」仕組みです。しかし、App Store に許可されない可能性が高く、Mac ユーザーしか恩恵を受けられません。


ほぼすべての人が使える Web アプリ

そこで思い出しました――Chrome は WebUSB をサポートしています。もしこれを Web アプリにすれば、インストール不要でどこでも動くはずです。さらに JavaScript でクールなことができるので楽しみました。

Xcode の代わりに VS Code に切り替えて再挑戦。数時間後、これが実現可能だと確信し、printerface.appprintervention.app を登録しました(Claude が前者を、妻が後者を好み、最終的には妻の選択が採用されました)。


仕組みは?

アプリの核

驚くべきことに v86 はブラウザ上で x86 CPU と周辺機器全体をエミュレートします。実行時にマシンコードを WebAssembly モジュールへコンパイルし、十分高速に動作させています。この v86 マシンには Alpine Linux を稼働させ、CUPS・Gutenprint などの必要パッケージをインストールしています。

  1. ブラウザが WebUSB 経由でプリンターに接続し、メーカーとモデル情報を取得します。
  2. trigrams(3文字列)で最も近い Gutenprint ドライバ名を検索し、エミュレートしたキーボード経由で
    lpadmin
    コマンドを送信してインストールします。
  3. ファイルをアップロードし、
    lp
    コマンドで印刷指示を出します。エミュレーション環境内で生成される生のバイナリ印刷データがプリンターへ届きます。

CUPS と WebUSB の橋渡し

初回実装:
カスタム CUPS バックエンド(シェルスクリプト)を作り、受け取った生データを v86 TTY 経由でブラウザにバイト単位で送信。ブラウザ側は再構築し、USB の

transferOut
呼び出しでプリンターへ渡します。これで印刷が可能になりました――ワンウェイのデータストリームを送るだけです。

二回目実装:
より効率的に v86 の 9p ファイルシステムを利用して大きなチャンクで転送しました。ただし、最初の写真は「縞模様」に見える奇妙な歪みが生じました。教訓として、JavaScript 側から Linux 側へ読み戻す前に必ずファイルを書き込み完了させる必要があります。

主な欠点: 両方ともワンウェイであり、紙詰まりやインク切れなどのエラーを即座に検知できませんでした。

双方向通信へ

印刷とスキャン双方で双方向データフローが欲しかったので Claude が提案した方法:

  1. USB/IP(Linux 側): USB データを TCP パケットにパッキングし、逆に受信時には TCP から USB にアンパック。
  2. tcpip.js(JavaScript 側): lwIP を WebAssembly 化し、v86 の仮想ネットカードが送る生 Ethernet フレームを L4 TCP/IP トラフィックへ変換。

これで Claude は約 400 行の USB/IP → WebUSB ブリッジを構築。印刷はスムーズに機能し、CUPS が各段階で何が起きているか把握できるようになりました。また SANE を使ったスキャンアプリもプロトタイプ化し、小さな tcpip.js の修正で動作させました(yes-we-scan.app 近日公開予定)。

さらに調整

  1. 紙サイズ問題: CUPS が SELPHY の 6×4" ポストカード用紙に合うよう画像を縮小していました。現在は任意の JPEG を手作り PDF に埋め込み、プリンター用紙サイズと向きを保ちつつ ICC プロファイルも渡します。
  2. HEIC 対応: 多くの写真は HEIC 形式(Apple Photos, AirDrop)です。
    libheif-js
    wasm-mozjpeg
    を組み合わせた変換パイプラインを作り、ICC プロファイルを保持しつつメモリに全データを読み込まないようにしました。

さらに、消耗品へのアフィリエイトリンクと基本的なテレメトリー(セッション・プリンター・印刷ジョブ情報)を Neon PostgreSQL データベースへ送信する機能も追加しています。


今後の展望

現在は数台の写真プリンターでしかテストしていませんが、Gutenprint 対応モデルなら幅広く動作すると期待しています。ただし、大きすぎる一度に印刷した場合は非対応になる可能性があります。もしプリンターが機能しないときは教えてください。

brlaser
splix
などの PPD パッケージを追加することで改善できます。

公開コードの一部はオープンソース化していません。これは、印刷消耗品企業にとって魅力的な Web プロパティとして活用できるためです。リポジトリをフォークせず、ホワイトラベルで使用していただく方から報酬を頂ければと思います。

George MacKerron
2026 年 4 月

ホーム

同じ日のほかのニュース

一覧に戻る →

2026/04/08 3:09

**プロジェクト・グラスウィング:AI時代における重要ソフトウェアの保護**

## Japanese Translation: Project Glasswingは、AWS、Microsoft、Google、Cisco、Apple、Broadcom、JPMorgan Chase、NVIDIA、Palo Alto Networks、およびLinux Foundationを含む主要なクラウド・ソフトウェア・金融企業を結集し、Anthropicの未公開Claude Mythos Preview AIを用いて高重大性のソフトウェア脆弱性を発見・修正することを目的としています。Mythos PreviewはすでにOpenBSD、FFmpeg、およびLinuxカーネルで重要なバグを検出し、その後メンテナがパッチを適用しました。Anthropicはパートナー向けに最大1億ドルの使用クレジットと、オープンソースセキュリティグループへの追加400万ドルの寄付を提供しており、40社以上の組織もモデルアクセスを受け取ります。参加者は90日以内に調査結果を公開し、ベストプラクティスを共有し、脆弱性開示、自動パッチング、安全な開発ライフサイクル、およびサプライチェーンセキュリティに関する推奨事項を策定する予定です。このイニシアチブは米国政府担当者と協力してツールの攻撃および防御機能を評価し、最終的には独立した組織が業界・公共部門全体で継続的な大規模サイバーセキュリティ作業を調整する可能性があります。研究プレビュー後、AnthropicはMythos PreviewをClaude API、Amazon Bedrock、Google Vertex AI、およびMicrosoft Foundry経由で参加者に対し1百万トークンあたり25ドル/125ドルで提供する予定です。

2026/04/08 0:03

「月のフライバイ」

## Japanese Translation: オリオン宇宙船は、NASA のアーテミス II ミッションに乗組みされ、2026年4月6日に月を周回しながら一連の写真を撮影しました。クルー(パイロット・ビクター・グローバー、指揮官リード・ウィスメン、ミッションスペシャリストジェレミー・ハーネスとクリスティーナ・コック(さらにカナダ宇宙機関のアストロノート・ハーネス))はオリオンの窓から、EDT 18:41に地球沈没、ET 19:22に地球昇起、および月面の詳細な映像を記録しました。1枚の画像ではオリオンの前景から月と地球の両方が同時に写っており、別のクローズアップは周回の終盤(約3:41)に撮影されました。ハーネスは観測期間中に窓2にカメラシャードを装着し、いくつかのショットでは日食時に太陽が月面を背光し、左端で太陽が昇り、ほぼ1時間続いたシーケンスの終わりまで撮影されました。午後2:19には画像の左半分が月表面で満たされました。オリオン自体は複数の写真で日光を浴び、その輪郭が宇宙空間に浮かぶ姿が際立っています。 この改訂された要約は、将来の設計への影響について推測的な結論を避けつつ、すべての主要ポイントを網羅しています。

2026/04/08 4:44

S3ファイル

## Japanese Translation: Andy Warfield のチームは **S3 Files** を構築しました。これは、ユーザーが Amazon S3 バケットまたはプレフィックスを EC2、コンテナ、または Lambda 上の NFS スタイルネットワークファイルシステムとしてマウントできるシステムです。この設計では EFS がステージングに使用されます。ファイル変更はローカルで書き込まれ、その後約 60 秒ごとに自動的に S3 に *コミット* されます(起動時には手動コミット制御はありません)。複数のクライアントが同じオブジェクトを修正した場合、conflict‑resolved コピーが lost+found ディレクトリに保持されます。メタデータは遅延でハイドレーションされ、小さなファイルは即時ロードされ、大きなファイルは読み込み時にストリーミングされるため、数百万オブジェクトを持つバケットでも迅速にマウントできます。大規模な連続読み取りはローカルキャッシュをバイパスし、並列 GET を介して直接 S3 にアクセスすることで、クライアントあたり約 3 GB/s の速度を実現し、多数のクライアントにわたって拡張可能です。システムは S3 の IAM ポリシー、オブジェクトの不可変性、および命名セマンティクスを保持しつつ、完全な NFS スタイルファイル操作(パーミッション、原子リネーム、ディレクトリトラバーサル)を公開します。ただし、S3 にはネイティブなリネームがないため、リネーム操作は高コストであり、有効な POSIX ファイル名にマッピングできないキーはマウントから除外されます。 Warfield の以前の **S3 Tables** と **S3 Vectors** に関する研究は、構造化データ・ベクトル・ファイルを S3 で一等のプリミティブとして扱うというより広範な戦略を示しています。UBC でのゲノム研究では、大規模データセットをローカルファイルシステムとオブジェクトストア間で移動する際の苦労が明らかになり、この統一アクセスレイヤーへの動機付けとなりました。ベータ版からの早期フィードバックは、パフォーマンス制限(例:5,000 万オブジェクトを超えるマウントに対する警告)、コミットウィンドウ、および問題キーの処理方法を形作っています。目標は Amazon のデータレイクポートフォリオを拡張し、開発者が配管よりもドメインロジックに集中できるようにすることであり、エンタープライズ向けにはデータサイエンス、機械学習、メディア処理などで、コストの高いマイグレーションや新しいツールを必要とせずにローカルとオブジェクトストアへのアクセスを統一することで恩恵をもたらします。

WebUSB を通じて USB/IP にブリッジしたブラウザ内 Linux VM で、古いプリンターを救出する | そっか~ニュース