2015年3月30日月曜日

アプリ開発に失敗した話

こんなの出来たよ!もいいけど、たまには失敗についても語ろうぜという企画です。

どんなアプリ(のつもり)だったか


WiFiSD カード上にインストールするWeb アプリケーションです。
 (※Windows Store Appでは無いです)

一般に、WiFiSD カード上の写真をブラウズする際、Exif情報を取得するには一度画像をホスト(PC・スマートフォン等)に転送する必要があります。1枚のサイズが数MB~数十MBになる最近のカメラではそれなりに時間が掛かります。

そこで、WiFiSD カード上でLua スクリプトによりExif 情報を抽出し、ファイルとして保存しておけば便利だろうと考えました。
画像1枚あたりのExif情報はせいぜい1KB程度ですから、カード内の画像全ての情報を取得し、Exif 情報…露出補正のEV値、シャッタースピード、焦点距離、使ったレンズ等でカテゴリ分け・並べ替えも現実的な話になります。

実際、自分が外でカメラ+WiFiSD カード+スマートフォン・タブレット で使う場合、「あの時EV すこし弄って撮ったあの写真を原寸で確認したい!」と思っても、それを「探す」には結局何枚も時間をかけて転送するか、又はカメラの小さい液晶で探すかしなければならず…これはあるべき姿では無いだろうという問題意識がありました。

なお、WiFiSD カード上にインストールし、基本インターネットには接続していないという形式上、所謂ストアのような支払や、広告表示等による収益化は困難です。
このため、このアプリについては…DLページにPaypalのリンクでも貼り、便利に感じてくれたら少し払ってください、くらいが現実的な所かな…程度に考えていました。

開発計画


開発に当たっては、大ざっぱに3段階で進めようかなという計画でした(このあたりMSCC の効果が見られる)。


  • Phase 0 Jpeg 画像からExif 情報を抽出しJsonファイルで書きだすLua スクリプトの製作(PC上のLua 環境で)
  • Phase 1 WiFiSD カード実機での動作確認、摺合せ
  • Phase 2 WinJS を使ったWebインターフェースの作成


0・1については合わせて2週ほど、2は各OS上のWebブラウザ動作確認が手間なので1か月程度、全体では2か月くらいで出来るかなという目算でした。なので、もし継続していれば3、4か月は掛かったかもしれません。

Phase 0

少しググったところ、「Luaだけ」で書かれたExif 抽出コードはどうも存在しないようなので自前で書くことにしました。
Lua スクリプトを触るのは初めてで、そもそもバイナリファイル読めるの?というレベルでした。が、Lua はシンプル故理解しやすく、Exif の仕様書を横に見ながら進める事でIFD0、Exif・GPS・Interoperability IFD をデコードしてファイルに落とすコードが出来ました。

なお、JPEG・Exif構造の理解にはこちらのページが大変、大変参考になりました。
JpegAnalyzer Plus オンラインヘルプ
http://hp.vector.co.jp/authors/VA032610/contents.htm

Phase 1

WiFiSD カード上のLua 実行環境でのExif 情報抽出自体は成功しました。

が、
原因は判りませんが、WiFiSD カード上でスクリプトを動かすとWiFiSD カードがPC・カメラからアクセス出来なくなる、という現象が頻発しました。最初はファイル書き込みアクセスが宜しくないのかな?と、ファイルサイズを減らす・頻度を減らす等試していたのですが、一度試行する毎にアクセス不可→カード再フォーマットという状況に陥っていました。
最後はファイルの読み込み・Exif デコードのみを行い書き出しはしない、というスクリプトを試しましたが、それでも状況は変わりませんでした。十数回のトライ&エラーの後、遂に再フォーマットすら出来なくなってしまいました。

後で気づいたのですが、
Segmentation Fault 氏が遭遇した現象に近いものであったようです。
出たばかりという事もあり、なかなか気難しいカードでした。

新たにWiFiSD カードを買ってくる、という手もあるにはありますが…

  • 4000円の追加出費は痛い
  • 同じFirmware なら新しいカードで試しても結局同じでは?

という事もあり、ここで諦める事にしました。
無念。

Phase 2

Microsoft のJavaScript Framework WinJS を使い、Webブラウザ上にStore App のようなフラットなUIを出せたら面白いだろうなータッチでも使いやすいしAndroid やiOS でも動くし~~~でもWinJS 実際使ってる人見たことねえな~ホワワワーンと考えていたのですが、妄想だけで終わってしまいました。

教訓

ハードウェアは壊れることがある

余談

最初はWiFiSD カード についての記事として書いてたのですがどうも違和感があり…よくよく考えてみると、WiFiSD カード飛ばしてしまった事よりも、それでアプリを作られなくなった事が自分は残念だったのだと気づいて書き直したのでした。



2015年3月14日土曜日

FlashAir W-03 の WebDAV 対応について

東芝さんのWiFi SDカード FlashAir、第三世代の「W-03」が発売になりました。
SDカード「自身が」Lua スクリプトを実行できるという大変趣味的な(でも某高音質カードよりは真っ当な)製品です。

FlashAir W-03
ちなみにパッケ・説明書に日本語が無いチャイナ仕様?は
日本語の正規品より安いです

本稿は、FlashAir W-03のもう一つの新機能「WebDAV 対応」について、使い方を考えてみようぜという趣旨の記事です。

注意


この記事、クライアント側のWebDAV 実装については、Windows 8.1のみの話です。他のVersion・他のOSでは話が違う可能性が大いにあります(例えば、昔のWindowsではWebDAV でサムネイル表示出来なかったような記憶があります)。

FlashAirとは?WiFiSDカードとは?


WiFi アクセスポイント と、HTTPサーバ を内蔵したSDカードです。これをカメラに入れ、PC・タブレットやスマートフォンからこのアクセスポイントにWiFi接続することで、内蔵HTTPサーバから今撮った写真を転送できるという便利な製品です。

WebDAV とは?


HTTP 経由でディレクトリのブラウズ・ファイルの転送を行うプロトコルです。
物凄く雑に言うと、HTTPで流せるFTP的な感じです。

  • サーバー側 Apache やIIS の様な有名どころではほぼサポートされています。今回、FlashAir W-03 がこのサーバー機能をサポートしました。(※1)
  • クライアント側 Windows ではかなり前から対応しており、エクスプローラーからネットワークドライブの様にWebDAV サーバに接続すると、UI上ではローカル フォルダのファイルと同じような操作が可能になります。(※2)(※3)


※1) FlashAir 第一・第二世代でWebDAV 対応の予定は無いとの事です。

※2) FlashAir のWebDAVでは、PC から FlashAir へのファイルコピー、並びにファイル削除は出来ません。FlashAir の場合、カメラに挿したまま使うのが前提なのですが…カメラ側からのアクセスとバッティングしてしまい、最悪ファイル破損に至る可能性があるためこういう設計になっている、という説明がされています。

※3)ネットワーク接続後は、WinRT API の Storage Class でもローカルフォルダ同様のアクセスが可能です。

Webホスティングサービスにファイルをアップロードする場合など、知らず知らずの内に使っていた人は多いのではと思います。

ですが、「本当の」NASの様なネットワークドライブ…SMB接続 に比べると結局はHTTPなので、それほどサクサク動くという訳ではないです。FlashAir 自体それほど速いサーバーという訳でもないので、同じWiFi 接続のNAS に比べると若干のんびりした感じにはなります。

エクスプローラー上での表示


Windows 8.1 から FlashAir にWebDAV で接続すると「サムネイル付き」でカード内のファイルをブラウズすることが可能です。

が、ちょっと遅い。
下の画像は、実際にFlashAir にWebDAV 接続してサムネイル表示をしている様子です。
画像ファイルは1枚3MB~6MBで、下のように24枚分のサムネイル表示には1分程かかります。

WebDAV で FlashAir 内のファイルをサムネイル付き表示している様子
この枚数表示で約一分かかります


パケットモニタ等で確認した訳では無いのですが、画像のファイルサイズとサムネイル表示に掛かる時間をみると、「おそらく」…OSは画像ファイルを一度丸ごと転送し、そのあとでサムネイルを生成・表示しているように見えます。

他方、ファイル名・生成日時については(HTTPで文字列情報飛ばすだけなので)すぐに表示されます。


WebDAV にマッチする使用シーンとは


A) 選択転送:外出先でFlashAir に タブレット・スマートフォン等で接続し、画像を転送する場合


この場合、転送する画像をサムネイルで選択する形が多いと思います。
ですが、上で述べたように WebDAV ではサムネイル表示のために画像の全転送が発生してしまいます。
サムネイル表示で転送するファイルを選ぶためにファイル丸ごと転送していたのでは本末転倒な話で、この使い方は馴染みません。

今まで通り、FlashAir 独自の Command.cgi / Thumbnail.cgi を使ったHTTP 転送、つまりはWebブラウザや、FlashAir 用アプリを使うのが適切であろうと思います。

B)一括転送:撮影した画像をまとめて転送したい場合


例えば、撮影後に帰宅し、撮ってきた画像をPCに転送する場合です。ここではファイルをサムネイルで一々選んだりはせず、「今日撮った写真全部」を一度に転送することが多いでしょう。

この場合、エクスプローラ(WebDAV) 上でファイルを日時順に整理し、一括でPC上にドラッグ&ドロップでコピーすれば済む事になります。とても簡単。

ただ、ここでもサムネイルを表示していると余計な転送が発生してしまうので、エクスプローラー上で表示を「詳細」に変更するのがお勧めです。

先程と同じフォルダを「詳細」表示にしている様子

(注意)PC から FlashAir の WebDAV にWiFiで接続する場合、PCが有線LAN 等別のネットワークに繋ぎっぱなしだとうまくいかない場合があるようです。
メトリック調整すればいいのかもですが、LANケーブルを引っこ抜き、ネットワークをFlashAirとの無線LANだけにするのが一番簡単。