
2026/05/22 20:11
# ShadowCat:ブラウザ上での QR コードによる高速ファイル転送 ShadowCat は、**QR コードのみ**を用いた直感的なファイルを共有するための軽量ツールです。特別なアプリのインストールなく、Web ブラウザ上で動作します。 ## 主な特徴 - **不要な設定**: USB ケーブルや Wi-Fi の接続確認、IP アドレスの設定は不要です。 - **セキュリティ**: データ転送中は**暗号化通信**が自動で実装されています。 - **プラットフォーム非依存**: 送信元と受信元の OS(Windows, macOS, Linux, Android, iOS)に制限はありません。 - **簡素さ**: コマンドラインインターフェース(CLI)のみですぐに動作します。 ## 使用方法 ShadowCat は `shadowsocat` というコマンドを実行することで起動します。 ### 1. 基本的な構文 ```bash shadowsocat <ファイル名> <QR コード URL> ``` - **ファイル名**: 転送したい対象のパスを指定します(例: `test.txt`)。 - **QR コード URL**: 相手のデバイスをスキャンする URL です。 - スカンナー側が準備できる場合は、`+` シグネチャ付きの QR コードを発行します。 - リスト型転送の場合は、`:` で区切られたファイルを指定できます(例: `file1, file2: +`)。 ### 2. 具体的なコマンド例 #### 単一ファイル転送 送信元(サーバー側)からの転送です。相手の端末に表示された QR コードをスキャンして受信します。 ```bash ./shadowsocat test.txt + ``` #### マルチファイル転送 複数のファイルを一度に転送する場合は、カンマ区切りのリストを使用します。 ```bash ./shadowsocat "report.pdf, image.jpg, log.txt" + ``` #### リスト型受信準備(クライアント側) 受信端末(QR コードを表示させる側)では、以下のように入力を待ち受けモードで起動し、送信側の QR コードをスキャンします。 ```bash ./shadowsocat -t + ``` ## 動作原理の概要 ShadowCat は **WebSocket** プロトコルを HTTP のプロキシとして利用しています。これにより、通常の Web サーバー環境からでも簡易的なファイル転送サーバーとして機能させることができます。 - **接続フロー**: 1. 受信端末が `+` を指定して待ち受け状態となる。 2. 送信端末が QR コードをスキャンし、WebSocket セッションを開始する。 3. データが暗号化されてリアルタイムで転送される。 ## メリットと注意点 ### メリット - **即座に始まる**: 複雑なセットアップ不要です。 - **低リソース**: システムのリソースを最小限しか消費しません。 - **セキュリティ重視**: TLS/SSL による暗号化がデフォルトで有効になります。 ### 注意点 - インターネット回線が必要ですが、**Wi-Fi 接続の確認プロセス自体は不要**です(ローカルネットワーク上で暗号トンネル経由で通信)。 - コマンドライン操作を想定しているため、GUI の設定画面などは存在しません。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
サマリー:
このシングルファイル HTML ツールは、QR コードを活用してデバイス間の完全オフラインファイル転送を可能にします。特に、BLE や NFC の無線機能は破損しているがカメラとブラウザは動作する古いスマートフォンを復活させることを目的として設計されています。本アプリケーションには、テキストから QR コードを生成する、カメラで QR コードをスキャンする、そしてファイルの送信・受信のための独立したタブが提供されています。
送信ワークフローでは、ユーザーはファイルを選択し、チャンクサイズ、FPS、ECC レベルを設定した後、ヘッダー(
QRX1|H|...)およびデータ(QRX1|D|...)のフレームを循環する転送ループを開始できます。受信側は自動的にプロトコルを検出し、インデックスグリッドに基づいて不足したチャンクを埋め合わせ、ダウンロードを有効にする前に CRC チェックサムを使用して完全性を検証します。主な特徴として、「特定のフレームから再開(Start from)」と、「不足したチャンクを静的に表示して手動での再送を行う(Show frame)」の機能を備えています。
ブラウザは単純なファイルリンク(
file://)に対してカメラへのアクセスをブロックするため、このツールにはクロスデバイス互換性(特に iOS Safari 向け)を保証するためにローカルサーバー(Python または Caddy など)、localhost または HTTPS の上での動作が必須となります。転送速度は base64 エンコードを適用した場合に約 1.1 KB/s であり、100 KB のファイルの場合に約 2 分ほどで完了する(ループ単位)ため、受信側は通常 1〜2 つのループが必要となります。オーバーフローエラーのトラブルシューティングには、チャンクサイズの縮小または ECC レベルの上昇が有効です。このローテクな解決策は、従来の無線オプションが機能しない際のデータ復旧方法として信頼性の高い手段を提供します。本文
完全オフライン QR コードデータ転送ガイド
このページは、Bluetooth や NFC が利用できない環境において、古いスマートフォン間でのデータ転送を実現するための単一 HTML ファイルです。無線機能が停止しており、カメラとウェブブラウザのみが動作する場合に適しています。
機能概要
ページは以下のタブ別機能で構成されています。
🧬 Generate(生成)
- テキストデータを単一の QR コードとして符号化します。
- これにより、小さなテキストを転送できます。
🔍 Scan(スキャン)
- カメラを使用して、単一の QR コードを読み取り復号化します。
- 送信されたテキストを表示します。
📤 Send file(ファイル送信)
- ファイルを選択し、転送設定を行います。
- チャンクサイズ: データを分割するサイズ。
- FPS: QR コードの表示レート(画像更新速度)。
- ECC: 誤り訂正レベル。
- [開始] ボタンをクリックすると、無限ループで
のシーケンスを生成・表示します。[ヘッダー, チャンク 1…チャンク N]- [一時停止]/[再開]/[終了]: ループ制御が可能です。
- 開始位置: 指定したフレームインデックスからループを開始します(順次進行し、正常にヘッダーに戻る仕組み)。
- Show frame / Show −/+:
- 欠落している特定のチャンクを再送信するために、該当フレームのみを表示できます。
- 表示される数字は、受信側の「未到着チャンクグリッド」に表示されているインデックスと一致します(0 はヘッダーを表します)。
📥 Receive file(ファイル受信)
- カメラを起動し、送信側のデバイスを狙います。
- 自動処理:
- ヘッダーを自動検出。
- 進行状況バーの表示。
- 未到着のチャンクを示すグリッドの表示。
- 完了後:
- ファイルの CRC32 検証 が実行されます。
- 検証が成功すると「ダウンロード」ボタンが表示されます。
プロトコル仕様
通信データの形式は以下の通りです。Base64 アルファベットには
| が含まれていないため、パース処理は単純な文字列分割で可能です。
データ構造
- ヘッダー (Header)
- 構成:
QRX1|H|<総数>|<ファイル名>|<サイズ (バイト)|<CRC32 ハッシュ>
- 構成:
- データ (Data)
- 構成:
QRX1|D|<インデックス>|<Base64 変換後のチャンク> - インデックスは 1 から始まることに注意してください。
- 構成:
重複排除ロジック
- 受信側: チャンクをインデックスごとに追跡し、重複を受信しても無視します。
- ヘッダー: ヘッダー自体も CRC を基準に重複分を除外(去重)します。
古いデバイスを利用するための注意点
利用環境によっては以下の制限や調整が必要です。
🔌 接続環境の制限
- カメラ機能 (
) は、HTTPS またはgetUserMedia
のみで許可されます。localhost
スキームでは権限が付与されず、カメラが起動しない場合があります。file://- ローカルネットワークでの運用方法:
- サーバーを起動:
python3 -m http.server 8000 - ブラウザにアクセス:
http://<あなたの IP アドレス>:8000/qrcode.html
- サーバーを起動:
🍎 iOS Safari の注意点
- クロスデバイス(異なる機器間)アクセスには HTTPS が必須です。
- LAN 環境で利用する場合は、Caddy サーバーや自己署名証明書の使用をお勧めします。
⚙️ エラー対応
- 「コード長超過」などのレンダリング失敗時:
- チャンクサイズを削減する。
- ECC レベルを下げる。
📉 速度と設定の調整例
- 理論速度: Base64 変換後
×500 キャラ
≈3 FPS
(生データ約1.1 KB/s
に相当)。0.83 KB/s- 例:100 KB のファイルは、1 ループあたり約 2 分 かかります。
- 受信側では通常、1〜2 ループ を要します。
- 復号化が困難な場合の対策:
- FPS を下げる。
- ECC レベルを
に上げる。Q - チャンクサイズを約 300 キャラ に縮小して、より小さく密度の低い QR コードを作成する。