ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iOSでSDカード上の任意のファイルを有線で取り込む脱法的ユーティリティ群「OrangeMint」

   

Orangemint 00000

iPhoneなどのiOS搭載機は、SDカードカメラリーダーやCamera Connection Kitなどの周辺機器を使ってメモリカードから画像を取り込むことができます。

以前はiPadのみの特権でしたが、近年はiPhoneにも対応機種が拡大。

Orangemint 00007

  • Camera Connection Kitとその後継製品群
    • Apple iPad Camera Connection Kit
    • Lightning ー SDカードカメラリーダー
    • Lightning – USBカメラアダプタ
    • Lightning – USB 3カメラアダプタ
    • USB-C – SDカードリーダー

この方法での取り込みはWiFiストレージと違って転送スピードが高く、WiFi接続までにかかる手間がない上、挿せば読み込み画面が勝手に立ち上がってきて大変便利。

Orangemint 00009

しかし、SDカードカメラリーダーで取り込めるのは画像や動画などに限られ、それ以外のファイル、例えばテキストファイルなどは対象外です。

Orangemint 00001

画像、動画以外のファイルでもWiFiストレージ機器を使えば無線でやりとりが可能ですが、iOSは接続先SSIDの優先順位を設定できず、また接続先SSIDを指定してのWiFi接続が一部のアプリにしか許されていないため、WiFi接続の使い勝手が今一つなところがあります。

そこで、画像に任意のファイルを埋め込んで、無理やりSDカードカメラリーダーで取り込ませようと考え、それを実現するユーティリティ群を作成しました。

名付けて「OrangeMint」。

なぜその名前。

基本的な仕組み

OrangeMintはダミー画像の後ろにメタデータやファイルの中身を連結し、偽装ファイル化。任意のファイルをiOSからは画像として取り扱わせることによって、SDカードカメラリーダーなどによる取り込みを可能とします。

Orangemint 00011

取り込んだ後はOrangeMintが提供するiOS用のユーティリティによって冒頭のダミー画像を読み飛ばし、本命ファイルを取り出すわけです。

Orangemint 00012

この至って単純なる仕組みは基本的に大変うまく行きます。

デモンストレーション

下掲はMS-DOS版Mobile Gearでテキストファイルを作成し、偽装ファイル化。Camera Connection Kitを使ってiPhone 7 Plusに取り込んでいる場面を撮影した動画です。

VZ Editor 1.6とATOK8で文書作成。VZ Editor 1.6からOrangeMint形式偽装ファイル作成コマンドOMINT.EXE実行マクロを「Ctrl+I、O」で起動し、編集中のファイルを偽装ファイル化。このワンアクションで取り込み準備が完了するので、即座にSDカードをCamera Connection Kitに挿し込み、iOS側でOrangeMint.pyを実行。ファイルが埋め込まれたオレンジとミントのツートン画像を選択して、中に隠されたテキストファイルを取り出しています。

ファイルを埋め込んで掘り返してと迂遠うえんなことをやっていて「無理しないでWiFiストレージ経由で十分じゃないか」と呆れ顔で見る人が多いかもしれませんが、取り込みは圧倒的にスピーディーに完了します。

文書作成環境としては現在に至るも卓越したパフォーマンスを発揮しながらも、WiFi内蔵SDカードが使えないhp 200LX、MS-DOS版Mobile Gearにおいては感動的な瞬間ではないでしょうか。

Orangemint 00003

偽装ファイルからのファイル復元に開発環境Pythonista 3を利用しているため、ファイルを取り出してからの処理はおおよそ考え付く限りのことが可能で、その柔軟性もOrangeMintの魅力といえましょう。

OrangeMintのダウンロード

ダウンロード: OrangeMint-v0.1.zip
  • 内容物:
    • OrangeMint形式偽装ファイル作成コマンド OMINT.EXE(DOS汎用)
    • OMINT.EXE 起動支援VZ Editor 1.6用マクロ OMINT.DEF(DOS汎用)
    • OrangeMint形式偽装ファイル作成スクリプト OrangeMint.lua.txt (Lua on FlashAir用)
    • OrangeMint形式偽装ファイル復元スクリプト OrangeMint.py(Pythonista 3 on iOS用)

※DOS汎用2画面ファイラー

テキスト打ちマシンに福音

このユーティリティー群により、以下のような代表的な組み合わせでSDカードカメラリーダーを経由したiOS側への迅速な(テキスト)ファイル取り込みが実現します。

  • iOS搭載機 ← hp 200LX
  • iOS搭載機 ← MS-DOS版Mobile Gear
  • iOS搭載機 ← ポメラDM30 + FlashAir第三世代以降
  • iOS搭載機 ← ポメラDM100 + FlashAir第三世代以降
  • iOS搭載機 ← ポメラDM200 + FlashAir第三世代以降

ポメラは第三世代以降のFlashAirと組み合わせると、Lua実行機能でテキスト保存毎にOrangeMint形式の偽装ファイルを自動作成させられるので手間なしです。FlashAirなのにWiFiは使わないわけです。

Orangemint 00005

Pocket WZ EditorとPocket ATOKが使えるWindows CE(Handheld PC)もテキスト作成環境としては捨てがたいものがあるので、OrangeMint形式の偽装ファイル作成手段をいずれ用意したいところです。

iOS側の設定

  1. Pythonista 3をApp Storeからダウンロード
  2. Pythonista 3を一度実行
  3. iCloud Drive上にPythonista 3フォルダが出現するので、macOS / Windows(※)側からそこにOrangeMint.pyをコピー
  4. iOS上でPythonista 3を起動。iCloudフォルダ内に同期されたOrangeMint.pyを開く
  5. 画面右上にあるレンチアイコンをタップ
  6. Home Screenアイコンをタップ
  7. 後は画面の案内に従いOrangeMint.py起動アイコンをHome画面上に設置

同じ手順をこちらの記事でも解説しているので、文字だけではピンと来ない人は参考にしてください。

※Windows用のiCloudをインストールのこと

iOS用OrangeMint.pyの使い方

OrangeMint形式の偽装ファイルの入ったSDカード等をSDカードカメラリーダー等でiOS搭載機に接続し、OrangeMint形式の偽装ファイルをiOS搭載機側に取り込んだら、Home画面に設置したOrangeMint.pyの起動アイコンをタップ。

画像選択画面が開くので、オレンジとミントグリーンのツートン画像をタップ。

デフォルトでは偽装ファイルに格納していたのがテキストファイルなら(※)……。

※とりあえず拡張子txtを持つファイルのみをテキストファイルと判定しています

  1. クリップボードに内容がコピーされる
  2. エンコーディングUTF-8、改行CRに変換されたテキストファイルがPythonistaのiCloud領域に保存される。従って、iCloud同期も行なわれる
  3. テキスト共有画面が開く
  4. (テキスト共有画面を閉じると)Open In…(ファイル共有画面)が開く

といった感じで満艦飾的活用が可能です。不要な処理はOrangeMint.py冒頭の設定部分を書き換えるとオフにできます。

# ------------------設定部---------------------

# テキストファイル時のみ後処理(True or False)
copyToClipboard = True
shareText = True

# 後処理 (True or False)
saveAsFile = True
openIn = True # saveAsFileをTrueに設定する必要あり

# ファイル保存先ディレクトリ
destinationDirectory = "OrangeMint"

# --------------------------------------------

偽装ファイルに格納していたのがテキストファイルでなければ、無論1と3はなしで、ファイル保存時の変換もなしとなります。

もちろん、URL Scheme経由で自分で好みのアプリと直接連携する処理も書けます。

以下は取り出したテキストをTwitterの投稿画面にセットする例

#!python2
#coding: utf-8

import photos
import os
import clipboard
import dialogs
import console
import urllib #←追加
import webbrowser #←追加
#(割愛)
# 末尾に追加↓
webbrowser.open("twitter://post?message=" + urllib.quote(txt))

DOS環境での設定

hp 200LXやMS-DOS版Mobile Gearでの利用を想定。

Orangemint 00006

最低限の準備はOMINT.EXEをパスの通った場所にコピーするだけです。

  1. OMINT.EXEをパスの通った場所にコピー。

DOS汎用コマンドOMINT.EXEの使い方

基本の使い方は以下のようになります。

OMINT <ドライブレター> <処理対象ファイルのパス>

具体的には以下のようになります。

OMINT A: A:\TEXT\TARGET.TXT

hp 200LXでも、MS-DOS版Mobile GearでもSDカードはA:になるので、ドライブレターはA:でしょう。

この場合、「A:\DCIM\100ORANG」というディレクトリが作成され、その中に「OM000001.PNG」といった感じでOrangeMint形式の偽装ファイルが保存されます。

複数回実行すると「OM000001.PNG」がカウントアップしながら複数出来ていきます。

2画面ファイラーK-Launcherのメニューへの登録

恐らく今DOSを使っている人は2画面ファイラーK-Launcherを使っているのではないでしょうか。

Orangemint 00013

その起動メニューへの登録は、KL.CFGの起動メニューのパートを下記のように書き換え、KLCUST.EXEを実行します。具体的には、一番末尾に「偽装ファイル化」という行を加えています。

KF.CFGを書き換えても、KFCUST.EXEを実行するまでは変更内容が反映されませんのでご注意ください。

;-------------------------------------- [,]起動メニュー
M_exec = {
	K,KmTermX	,,KTX
	L,KL cust	,,%j%0 VZ KL.CFG%:KLCUST
	D,		,,DUMP %C
	U,		,,UNDELETE
	F,Whereis	,S,%" Find file "dir /s /b /a %P>%'TMP'$%v1%'TMP'$ %J
	R,HSB reset	,,%M4
	E,Delete LFN	,,%K4
	O,偽装ファイル化	,,OMINT A: "%C"
	,,,
}

起動メニューの起動は「,」キーです。偽装ファイル化したいファイルにカーソルを合わせたら「,」でメニューを表示し、「O」(オー)キーでOMINTによる処理が実施されます。

VZ Editor 1.6への起動マクロの登録

Orangemint 00015

文章作成にVZ Editor 1.6を使っているなら、VZ EditorからもOMINT.EXEで編集中のファイルを素早く偽装ファイル化が可能です。

.
├── AX/
│   ├── AX.DEF
│   ├── VZAX.COM
│   └── VZAX.DOC
(割愛)
├── VZFL.DEF
├── VZIBMJ.COM
├── VZIBMJ.DEF
(割愛)
└── OMINT.DEF

OrangeMint付属のOMINT.DEFをVZ Editorの実行ファイルがあるディレクトリにコピーし、VZIBMJ.DEF(環境によって異なるので、自分が使っている初期化ファイル)を次に示すように書き換えます。

まずは、VZIBMJ.DEF冒頭にある2ストロークキーの設定部分に^Oを追加。これでCtrl+Oが2ストロークキーの1段階目に指定できます。

初期状態では以下のようになっているのを……。

* C コマンドキー
00	^Q ^K [ESC]	;2ストロークキー(最大6個)

このように書き換えます。

* C コマンドキー
00	^Q ^K ^O [ESC]	;2ストロークキー(最大6個)

さらに、VZIBMJ.DEFの703行目辺りにある以下の部分。

* E その他

1	vzfl
2	editfile
3	.doc .txt .bat .def .H .C .CPP .inc .asm .nif .mix

この1の行の末尾に+omintを加えます。

* E その他

1	vzfl+omint
2	editfile
3	.doc .txt .bat .def .H .C .CPP .inc .asm .nif .mix

これでVZ Editorを再起動すると「Ctrl+O、O」でOMINTによる編集中のファイルの偽装ファイル化が素早く実行されます。

次の瞬間、書き出し先に指定したSDカードを引き抜き、SDカードカメラリーダー等に差し込んでiOS搭載機で読み込み可能となります。

ディスク上のファイルが使われるので、先に文章をセーブしてください。

ポメラ+FlashAir環境での設定

OrangeMint付属のOrangeMint.lua.txt(※)は、Luaが実行できるFlashAirのW-03もしくはW-04で使用可能です。

※なぜluaファイルに拡張子txtを付加しているかというと、こうしても動作に支障はないばかりか、こうしておけばポメラ自身で編集することが可能だからです。

.
├──OrangeMint/ ①
├──SD_WLAN/ ③
│   └── CONFIG
└──lua/ ②
    ├── OMINT.PNG
    └── OrangeMint.lua.txt

① FlashAirのルートにOrangeMintディレクトリを作成。

② FlashAirのルートにluaディレクトリを作成。luaディレクトリの下にOMINT.PNGとOrangeMint.lua.txtをコピー。

③ ルートディレクトリ下にある不可視ディレクトリSD_WLAN内のファイルCONFIGをテキストエディタで編集。「LUA_SD_EVENT=/lua/OrangeMint.lua.txt」という行を追記して保存します。

[Vendor]

(割愛)
PRODUCT=FlashAir
VENDOR=TOSHIBA
UPLOAD=1
WEBDAV=1
LUA_SD_EVENT=/lua/OrangeMint.lua.txt

これで準備はOK。

不可視ディレクトリへの対処方法

  • macOS:
    • FinderにてCommand + Shift + Gで移動先パス入力画面を表示し、「/Volumes/NO NAME/SD_WLAN/」などとFlashAirのマウントされたパス下のSD_WLANディレクトリを直接指定する
  • Windows:
    • エクスプローラーの「表示>隠しファイル」のチェックボックスをオンにする

ポメラ+FlashAir環境での使い方

Orangemint 00002

ポメラでファイル操作をするたびに監視対象であるOrangeMintディレクトリ内のテキストファイルが調査され、その中で最新のファイルが偽装ファイル化されて「/DCIM/100ORANG」に書き出されます。

.
├── DCIM
│   └── 100ORANG
│       └── OR000001.PNG ←ここに偽装ファイルが書き出される
├── OrangeMint ←このディレクトリ下が監視されている
│   ├── foo.txt
│   └── bar.txt
├── SD_WLAN
│   └── CONFIG
└── lua
    ├── OMINT.PNG
    └── OrangeMint.lua.txt

従って、OrangeMintディレクトリ以下で作業をする限り、テキストを保存したらすぐFlashAirをポメラから引き抜いて、SDカードカメラリーダー等を使いiOS搭載機で取り込めます。

Orangemint 00008

偽装ファイルOR000001.PNGは常に上書きされ、/DCIM/100ORANGディレクトリ内にはOR000001.PNG一つしかない状態が正常です。ファイル操作をするたびに処理が走るので、そのたびに別の画像として書き出していたら大変なことになってしまいます。

最新のファイルとは別のテキストファイルを書き出したければ、そのファイルを開いてスペース挿入、スペース削除、保存といった感じでタイムスタンプを更新し、最新のファイルにします。

ちなみに、ポメラDM100はテキストファイル以外のものもファイラーから存在が確認できたのに対し、DM200はファイラーからテキストファイル以外のものが全く見えないばかりか、実際にはファイルがあっても「(空フォルダ)」と表示されるため、OrangeMint.lua.txtが動いているかどうか判断しづらいのは注意点です。DM30は所有していませんが、DM200と同様の状況かもしれません。

注意点

たまに、SDカードカメラリーダー等をiOS搭載機に差し込んでも読み込み画面が立ち上がってこなくなることがあります。

筆者の手元ではiOS 12のiPhone、iPadで発生したので、恐らくそこそこの頻度で発生する不具合のはず。

その場合は、iOS搭載機を再起動すると直ると思います。

注意点その2

iCloud同期をオンにしていると、SDカードカメラリーダーから読み込んだ画像はiCloudを経由して別のデバイスから見られるようになりますが、同期の条件によってはダミー画像の後ろにある埋め込んだパートが削除されます。

「読み込んだiOS搭載機→iCloud→macOS機」では大丈夫だが、「読み込んだiOS搭載機→iCloud→iOS搭載機」だとダメな模様。

参考: 偽装ファイルの構造

ダミーの64×64 png(1352バイト) ファイル名(256バイト) 任意のサイズのファイル

MS-DOS系にあるCOPYコマンド、Unix系で使えるcatコマンドでファイル結合しても偽装ファイルはできます。

 - ガジェット