2012年6月17日日曜日

DraftPad アシスト ”Away” が、ほかの Dropbox クライアントとは違うところ

Away はディレクトリツリーのビューをたどる逐次的なインタラクションを採用せず、パス表現にマッチしたすべてのアイテムをフラットにリスティングすることに専念しています。

Dropbox 上のリソースにアクセスするUIとして不十分に見えるかもしれませんが、これにより、図書分類法的にいえば、列挙型分類法と分析合成型分類法を必要に応じて自由に組み合わせて使える分類/検索インターフェースを実現しています。

列挙型分類とは、あらかじめカテゴリを定義しておき、オブジェクトをそれにふさわしいカテゴリに仕分けていく分類方法です。カテゴリを特定すれば、当該のカテゴリに所属するオブジェクトが得られます。ふつうファイルシステムといったときにイメージするディレクトリツリーは、列挙型分類法にしたがったUIだといえます。

一方、分析合成型分類とは、あらかじめオブジェクトの属性の種類を定義しておき、各対象の各属性にふさわしい値を与えていく分類方法です。属性の値(の組み合わせ)に関する条件を指定すると、条件にマッチするオブジェクトが得られます。ソーシャルブックマークのタギングは、分析合成型分類法の具体例のひとつだといえます。インフォメーションアーキテクチャの世界ではこれをファセット分類と呼ぶようです。

多くの Dropbox クライアントは、フォルダとファイルのツリー構造をビジュアル化したビューを持ち、いわば列挙型分類法のみにしたがっています。フォルダ名やファイル名でオブジェクトを検索する Away も、基本的に列挙型分類法にしたがっているといえますが、Dropbox の検索仕様と Away のパス記法ベースの UI に基づいて、列挙型分類法に分析合成型分類法を補完的に組み合わせて活用することも可能になっています。

Dropbox では、フォルダ名、ファイル名の部分一致で検索する際、検索範囲を特定のパス以下に限定することができます。

Away で ”/path/to/a” を検索すると、”/path/to/” の直下にあるフォルダやファイルの”/path/to/abc/” や ”/path/to/abc.txt” だけではなく "/path/to/foo/bar/abc" や ”/path/to/x/y/z/abc.txt” などもヒットします。

したがって、次のような規則を作って各種のテキストを保存すれば、ディレクトリ名と文書名とタグを組み合わせて、さまざまな角度から必要なテキストをすばやく取り出せるようになります。

< 規則 >

カテゴリをあらわすディレクトリ ( "/"区切り) + 時間をあらわすディレクトリ ( "/"区切り) + 文書名とタグ (スペース区切り)

< 例 >

/Aプロジェクト/2012/06/Aとはそもそも何なのか? 社内 議事録

など。

すると、プロジェクト名や文書名を直接検索するだけではなく、たとえば、2012年6月に作ったAプロジェクトの社内資料を探したいときは、

/Aプロジェクト/2012/06/社内

と入力して検索することができるようになります。

また、2012年のAプロジェクトの議事録を探したいときは、

/Aプロジェクト/2012/議事録

と入力して検索することができます。

このように、Away でのファイル検索は、ディレクトリツリーベースのファイルシステムを操作しながら目的のファイルを格納した場所にたどり着くというよりも、検索範囲を狭めたり広げたりしながらタギングしたファイルを一挙に取り出すような操作感になります。

実は、Dropbox 社製の iPhone クライアントでも、同じような操作を行うことは可能です。特定のフォルダ以下に範囲を限定してフォルダ名やファイル名で検索することができます。しかし、ディレクトリをたどるUIが中心なので、こうした列挙型+ 分析合成型両分類法を総合した"超整理"の可能性は残念ながら影に隠れてしまっています。

PC向けOSのファイルシステムにも、特定のフォルダを指定し、サブフォルダを検索対象に含めて、部分一致でファイルやフォルダを検索できる機能が備わっているのがふつうです。しかし、やはりこれもある種のレスキュー的な機能として普段は隠されていることが多いようです。

こうしたファイルのファインダビリティに対する Away のアプローチに最も近いのは、コマンドラインでのファイルシステム操作でしょう。CUI のファイル操作では、列挙型と分類合成型の総合がごく自然に行われていました。GUI のディレクトリツリービューは、直感的な操作可能性をもたらした一方で、ユーザー自身がとりうる分類と検索に対する"情報戦略"上の選択肢を極端に限定してしまったともいえます。

そもそも検索とは、どんなものでも、しまった場所、名前、特徴の三次元の情報に着目して行うのが基本です。(分類法でみれば、しまった場所は列挙型、特徴は分析合成型となります。名前は分類項目ではなく個体識別子です。)

Away は、こうした三次元の情報を一行のコンパクトなテキストにまとめ、たとえうろ覚えでも、たいていの場合は一度か二度の部分一致検索で目的のファイルをうまく引き出せるようなインターフェースの実現を目指して設計されました。

あまり目立たない部分ですが、その一環としてたとえば、検索フォームのインタラクションをあえて標準的なマナーとは異なる仕様で実装してみました。クリアボタン(右端のx)をタップすると、つねに入力されているすべての文字列がクリアされるのではなく、パス表現が入力されている場合は、1階層分のパスだけが削除されるようになっています。

その結果、DraftPad + Away は、他の Dropbox クライアントアプリとは一線を画すものとなりました。というよりも、もともと Away は DraftPad を Dropbox クライアントにするためのアシストではありません。あくまでも、Dropbox をバックエンドに使って、DraftPad の"一枚の紙"の機能を、その哲学と美学を損なうことなく、ささやかに拡張するためのアシストなのです。

... 。

なんつって、うそ!
ほんとはディレクトリツリーの実装が面倒で日和った結果なんですけどね!

でも、それで使ってみたら、そういう可能性を感じてしまったわけです。それは、ほんと。

/memo/away/超整理

2012年6月15日金曜日

D箱のアシスト事件 第8夜 ( おまけ )

特集DraftPad/短期集中連載
D箱のアシスト事件
第8夜. 今日からはパブリックベータ!

第7夜でお別れを告げてからはやいものでかれこれ4ヶ月。しょぼくれたぼくのところにも公平に春が来て、そして去っていきました。

その間、DraftPad + アシストまわりでは、iOS5.1 での LocalStorage に関するバグ騒動 (http://manabuueno.tumblr.com/post/20776637086/ios-5-1-localstorage) なんてのがありました。

Away (プライベートベータ版)も認証情報の保持に LocalStorage を使っていたので、 DraftPad を新しいバージョンに更新するたびに動かなくなっていました。しかし、どうせプライベートベータ、まともに使っているのはぼくだけだろうから、上記の URL にある「ウェブ開発者」向けの親切な勧告もどこ吹く風で、そのままほったらかしていました。

DraftPadの更新があったら、いったん削除して新規にインストールし直していました。そうすれば LocalStorage を使っているアシストも動きましたからね。そのたびに溜め込んだアシストやヒストリーが消えてしまうわけですけど、まあ、それも心機一転、ときどきこうしてこざっぱりするのも悪くないかな!なんて余裕をぶっこかせていただいておりましたよ。

ところがつい最近、さるお方(大物)から DraftPad をアップデートしたら Away が動かなくなって困っておる、どうにかならんのかね?アアン?というご連絡をいただきましてビーンとはね起きました。ここはひとつシャンと背筋を伸ばして誠心誠意対応せざるをえない状況というわけで、勧告に従い、localStorageの使用をやめて Cookieを使うように改造したわけです。

そうして4ヶ月ぶりに Away のコードをしみじみと眺め、また、あらためて一連の動作を確認しているうちに、ふと、ひょっとしてこうすれば Dropbox の審査をパスできるんじゃないかな?というアイディアが浮かびました。

いや、もうじつに簡単な話なのですが、あの第1~7夜ではヒートアップしておりましたからね、ああいうときはどうも、自分のやっていることに誇りを持ちたい一心で、つい必要以上に問題を複雑かつ大袈裟に捉えがちです。それに、作業の積み重ねで暗にもったいない精神にも取り付かれていますから視野狭窄になりがちですしね。

それにくらべたら4ヶ月後のシラけた自分は実に自由。そして柔軟。四の五の言わず、OAuth の アクセストークンをアシストの URL のクエリーに入れちゃえばそれでいいんじゃない? で、ユーザー専用のアシストを Dropbox の認証のあとで動的に生成する Web サービスとして審査に出してみたらどうだ?ふつうに Web ブラウザで使うサービスとして。そうすればほら、第7夜で書いた問題なんていっぺんにみんな解決しちゃうわけだし。なんて、いやにカンタンに言い放つわけです。

で、もはやもったいないフリーな心と体でざくざくコードを削ったり書き直したりして、ゆうべ審査に出してみたんです。そうしたらあっさり通っちゃって、なんと数時間後には Dropbox から「おめでとうございます」なんてメールが届いていました。

というわけで、DraftPad に入力したテキストを Dropbox の任意のパスに保存できるアシスト「Away」 は、このたびめでたく年季が明けて、晴れて誰でも使えるようにあいなりました。今後はパブリックベータということでひとつよろしくお願いいたします。

Away アシストメーカー

こちらの URL にアクセスして「Make Assist」ボタンをタップすると DropBox につながります。そこで Away からのアクセスを許可していただければ、Dropbox 上のテキストファイルを開くための「Open」アシストと、Draftpad のテキストを Dropbox に保存するための「Save」アシストをインポートするためのリンクが表示されます。タップしてあなたの DraftPad にインポートしてください。

Away の使用方法は第二夜で画面キャプチャつきでご紹介しています。

D箱のアシスト事件 第2夜

より詳細な使用方法についてはこちらをご覧ください。

ところで、アシストの URL のクエリパラメータに OAuth のアクセストークンを直接書き込んじゃうなんてセキュリティ的に脆すぎないか?ってお思いの方もいらっしゃることでしょう。

アシストの本体はネットの向こうにあるんだから、実行のたびにアクセストークンが素っ裸のまま URL に含まれてネットワークを流れていくんじゃないかって。しかし、ここが DraftPad のアシスト機構のすごいところの1つでもあるんですけど、DraftPad はアシストを内蔵ブラウザに読み込んだ後で、クエリパラメータの値を直接注入してくれるんです。アシストのクエリパラメータはネットには流れないんですね。完全にローカルな、iPhone アプリの内部処理なんです。ついでにいうと、アシストメーカーからアシストをインポートするところもローカルですね。( 内蔵ブラウザに読み込まれた Javascript からサーバーに対してアクセストークンを含めた XMLHttpRequest を投げますが、これは SSL かつ POST でやっています。)

とはいえ、アシストの URL の取り扱いにはくれぐれも注意してください。間違ってお友達に教えてしまったら、お友達はあなたの Dropbox にアクセスし放題です。