概要
- Canon SELPHY フォトプリンターを偶然入手し、Linux環境で再活用した体験談
- WebUSB と v86エミュレーター を活用したクロスプラットフォーム印刷アプリ開発
- CUPS, Gutenprint, Avahi などのOSS技術によるAirPrint共有
- Claude Code と協働し、プリンター復活のためのネイティブ・Webアプリ開発
- 今後の展望 や課題、オープンソース化への思い
古いCanon SELPHYプリンターの再活用ストーリー
- Canon SELPHY フォトプリンターを友人Markから譲り受けた経緯
- 3Dプリンターと交換で入手
- eBay で消耗品より安価に流通する理由
- MacやWindows ではドライバが未対応
- Markは Linux ユーザーのため問題なし
- 手元の Manjaro Linux マシンで動作確認
- CUPS と Gutenprint で印刷成功
- Avahi で AirPrint 共有を実現
- 家族全員が Mac/iPhone から写真印刷を楽しめる環境構築
- 物理写真の手軽な印刷体験
- CMY分解印刷 の工程観察
プリンターの「非オタク化」への挑戦
- 両親にも同様の体験を提供したい思い
- Raspberry Pi サーバー案はコスト・配線面で断念
- ソフトウェアだけで簡単に使える方法の模索
- Claude Code (AI)と共に開発開始
- Macネイティブアプリ でLinux VMを仮想化しUSB転送
- App Storeの制約やMac限定の課題
Webアプリへの転換と技術的工夫
- ChromeのWebUSB に着目しWebアプリ化を決断
- v86 エミュレーターでx86 Linux仮想環境をブラウザ内で実現
- Alpine Linux, CUPS, Gutenprint を内蔵
- プリンターの型番自動検出とドライバ自動インストール
- ファイルアップロード→仮想Linuxで印刷コマンド発行
- v86 エミュレーターでx86 Linux仮想環境をブラウザ内で実現
- WebUSB 経由でプリンターへ直接バイナリデータ送信
CUPSとWebUSBの橋渡し
- 最初は CUPSバックエンド を自作
- v86のTTY経由でデータ転送
- stty raw 設定でデータ化け解消
- 2回目は v86の9pファイルシステム で大容量転送
- Linux側で ファイル同期 の重要性を学ぶ
- 課題:プリンターからのエラー情報が取得できない一方通行通信
双方向通信への進化とスキャナー応用
- USB/IP と tcpip.js を用いた双方向通信
- v86内のLinuxで USB/IP、JS側で tcpip.js (lwIPをWASM化)
- CUPS がプリンター状態を正確に把握可能
- SANE を使ったスキャナー復活アプリも試作
- yes-we-scan.app として公開予定
実用化への細かな工夫
- JPEG埋め込みPDF 生成で印刷サイズ問題を解決
- EXIF回転・ICCプロファイル 対応
- HEIC→JPEG変換パイプライン もAIで自動生成
- libheif-js, wasm-mozjpeg 連携
- 消耗品アフィリエイトリンクや簡易テレメトリも実装
- Neon Postgres DB でセッション・プリンター情報管理
今後の展望とオープンソース化
- Gutenprint対応機種 なら他モデルでも動作可能性
- 問題があれば連絡を呼びかけ
- PPD追加 (brlaser, splix等)の余地
- オープンソース化は未定
- 商用連携 やホワイトラベル化の希望
- 無料でforkされるよりも企業連携を優先
まとめ
- 古いプリンターの再活用 と Web技術による新たな価値創出
- Claude Code の活用による開発効率化
- プリンター消耗品企業 との連携を模索する今後の展開