メイン

2007年06月15日

AIRのドラッグ&ドロップ起動について調べてみた

任意のファイルをAIRアプリのアイコン上にドラッグ&ドロップして起動した時に、そのドロップされたファイル情報を取得する方法について調べてみました。


AIRアプリの起動情報に関しては flash.system.Shell クラスが把握していますが、プロパティとして直接参照はできません。
その代わりに flash.events.InvokeEvent から参照することができます。

どのタイミングでもいいようですが、起動時に必要になることが多いため applicationComplete に設定したメソッド内に以下のように記述しておくことにします。

Shell.shell.addEventListener( InvokeEvent.INVOKE, onInvoke );


そしてイベントハンドラを以下のように記述します。

private function onInvoke( e:InvokeEvent ):void {
for ( var i:uint = 0; i < e.arguments.length; ++i ){
var file:File = new File( e.arguments[ i ] );
}
var currentDir:File = e.currentDirectory;
}


InvokeEvent の arguments プロパティは、起動時に渡されたファイルのフルパスを格納した配列引数の配列です。
コマンドラインからの実行により任意の引数を渡すことができますが、デフォルトでは何も指定されていないためファイルをドロップした場合はファイルのフルパスのみが格納されます。

たとえばショートカットの設定に /a というコマンドを自前でつけてしまうと、arguments の先頭要素が /a という文字列になり、その後にドラッグ&ドロップ起動時のドロップしたファイルのフルパスが続くことになります。

このフルパスはあくまで文字列なので、実際にファイルを読むためには File インスタンスをパス情報から自前で生成する必要がありますが、コマンドラインから実行された時のことを考慮して有効なパスかどうか念のため確認した方がよさそうです。
ディレクトリをドロップした場合はディレクトリのフルパスのみが渡され、ディレクトリ内の全ファイルが配列に格納されるわけではありません。


currentDirectory プロパティは、起動パス情報を持つ File インスタンスです。
設定ファイルなど AIR アプリの格納ディレクトリ下に置く場合には、ここから参照すればよさそうですが、たまに正確な情報を返さないことがあるようなのでもう少し探ってみます。


ドロップ起動に対応するアプリが作れるなら、やれることが大幅に増えますね。

----追記----
arguments プロパティの説明について若干誤りがあったので書き直しました。
ドラッグ&ドロップ起動だけでなく、隠しコマンド起動をつけられるということですね。

2007年06月13日

AIRにドラッグ&ドロップできるものについて調べてみた

AIRアプリにドラッグ&ドロップするためには、NativeDragEvent.NATIVE_DRAG_DROP についてイベントリスナ登録する必要があります。
そこで登録したイベントハンドラが呼ばれる際に引数として渡される NativeDragEvent インスタンスに transferable というプロパティ(TransferableDataインスタンス)があり、そこにドラッグしたデータの情報が全て格納されています。


せっかくなのでどういったものをドラッグすると、どういったデータが AIR に渡されるか調べてみました。

■Firefoxで表示した Web ページのリンクテキストをドラッグした場合

1.TransferableFormats.URL_FORMAT
 リンク先URL

2.TransferableFormats.TEXT_FORMAT
 リンク先URL+テキスト


■Firefoxで表示した Web ページの画像(リンクなし)をドラッグした場合

1.TransferableFormats.URL_FORMAT
 画像URL

2.TransferableFormats.BITMAP_FORMAT
 画像をビットマップデータ化したもの

3.TransferableFormats.FILE_LIST_FORMAT
 おそらくビットマップ化する際に格納したらしき画像ファイル
 格納先 C:\Documents and Settings\{username}\Local Settings\Temp

4.TransferableFormats.TEXT_FORMAT
 画像URL+代替テキスト


■Firefoxで表示した Web ページの画像(リンクあり)をドラッグした場合

1.TransferableFormats.URL_FORMAT
 リンク先URL

2.TransferableFormats.BITMAP_FORMAT
 画像をビットマップデータ化したもの

3.TransferableFormats.FILE_LIST_FORMAT
 おそらくビットマップ化する際に格納したらしき画像ファイル
 格納先 C:\Documents and Settings\{username}\Local Settings\Temp

4.TransferableFormats.TEXT_FORMAT
 リンク先URL+代替テキスト


■PC上のファイルとディレクトリをまとめてドラッグした場合

1.TransferableFormats.FILE_LIST_FORMAT
 ファイルとディレクトリそれぞれのFileインスタンスを格納した配列


■Flashオーサリング環境のステージに配置されているムービークリップをドラッグした場合

1.TransferableFormats.BITMAP_FORMAT
 ムービークリップをビットマップデータ化したもの


■Flashオーサリング環境のステージに配置されているテキストをドラッグした場合

1.TransferableFormats.BITMAP_FORMAT
 テキストをビットマップデータ化したもの


WebページについてはFirefoxで確認しましたが、IEではリンクをドラッグできなかったため割愛しました。
Win版Safariでも若干挙動が異なるようです。

Flashオーサリング環境の配置シンボルについては複数まとめてドラッグすると多少縮小されてしまうのがよく分からない仕様ですが、ビットマップ化された状態とはいえ何か面白いものが作れそうです。

2007年06月12日

PrintScreenした画像をAIRで表示させてみる

前回のエントリではクリップボードの文字列データを問題なく拾えることが分かったので、次は PrintScreen でキャプチャしたデスクトップの画像を AIR アプリ内に表示できるかどうか試してみました。

前回言及したクリップボードアクセス用クロージャ内に以下のように記述することでビットマップデータが拾えます。
サンプルなのでエラーチェックとかそういうのは省略。

var data:TransferableData = ClipboardManager.data;

if ( data.formats[0] == TransferableFormats.BITMAP_FORMAT ){
var bd:BitmapData = data.dataForFormat( TransferableFormats.BITMAP_FORMAT ) as BitmapData;
}

で、実行したら

air_printscreen.png

あれ?
.icoしか拾ってなかったりする?
どういう構造になってんだろ。。。某ウイルスもどきが作られないように対策でもしたのかなと勘ぐってみました。
キャプチャ画像をクリップボードから直接あれこれするアプリは今のところは作れないようです、残念!

2007年06月11日

クリップボードのデータを拾ってみる

Adobe Apollo が正式名称 AIR として公開されました。
同時に FlexBuilder3 のパブリックベータ版も公開されたので、追加された機能をふんだんに使った AIR アプリが続々と出てくると思います。


今回新たに追加された機能の中で特に注目すべきはデータベースモジュールでしょう。
flash.data パッケージ以下に SQL 関連クラスがごっそり入っていますが、ざっと目を通しただけでもかなり充実している模様。
このタイミングで入ってくるとは思っていなかったのですが、先日公開された Google Gears でローカルデータベースの機運が高まりつつあるので、それに合わせてきた感じがしないでもありません。

とにかく弄ってみたい機能が目白押し。
前々から気になっていたドラッグアンドドロップやクリップボード管理のドキュメントを真っ先にチェックしてみました。
たとえばクリップボードのデータを拾うには以下のように書きます。


ClipboardManager.accessClipboard( onAccessClipboard );


private function onAccessClipboard():void {
var data:TransferableData = ClipboardManager.data;
var text:String = data.dataForFormat( TransferableFormats.TEXT_FORMAT ) as String;
}

いつでもクリップボードのデータにアクセスできるわけではなく、処理を記述したクロージャメソッドを引数として ClipboardManager.accessClipboard メソッドを実行することで初めてアクセスできるようになります。

データは TransferableData 型としてClipboardManager.data に格納されていますが、中身がテキストだったり画像データだったりするので dataForFormat メソッドによってフォーマット指定する必要があります。


また、逆にクリップボードに文字列データをペーストする場合は上記のクロージャ内に


var data:TransferableData = new TransferableData();
data.addData("hoge", TransferableFormats.TEXT_FORMAT );
ClipboardManager.data = data;

といった処理を記述します。


ヘルプにわざわざクロージャと書かれているのが気になったのですが、任意の文字列をクリップボードにペーストしようとする際に ClipboardManager.accessClipboard の引数に直接指定ができないので、下記のようなクロージャ生成メソッドを用意してねという意味なんだと思います。

ClipboardManager.accessClipboard( pasteString("hoge") );
private function pasteString( str:String ):Function {
	return function():void {
		var data:TransferableData = new TransferableData();
		data.addData( str, TransferableFormats.TEXT_FORMAT );
		ClipboardManager.data = data;
	}
}

2007年05月29日

TwitterClockバージョンアップ

TwitterClockをバージョンアップしました。

ダウンロード(AIRになって互換性がなくなったので一旦公開終了)

[変更点]
・読み込むデータをXMLからJSONに(アクセスがめちゃくちゃ早くなった)
・メアドを通すためにわざわざスクレイピングしてたのをやめた(API仕様書ちゃんと読んでなかった)
・タイムラインを消すタイミングを、読み込み前ではなく読み込み後に変更。


前回のエントリでソース公開するとか書きましたが、微妙に直したいところがあるのでもう少し待ってください。


ところで、airファイルを直接ダウンロードしようとすると何故か勝手にzip形式でダウンロードしてたことがあったんだけど、あれは何だったんだろう。
詳しいことは知らないけど、swcみたいに中身はただのzipなのかな。
となると、Apolloランタイム入れてない人にはちょっと不親切な気がする。

2007年05月13日

TwitterClock 其の弐

公開時のエントリの追記でちょろっと書いた、ランダムジャンプ機能を付けました。
特定のタイムラインを右クリックして Random Jump 項目を選ぶと、そのユーザの友達の中からランダムに選ばれたユーザのタイムラインを表示します。
それから、アカウント入力フォームにメールアドレスも通るようにしておきました。


ダウンロード(AIRになって互換性がなくなったので一旦公開終了)


以下、駄文&補足。
Twitter検索TwitterPodなど、便利なツール群はほぼ出揃っている感じでそんなところで勝負をかけるのはあまり意味がありません。

TwitterでのFlash談義でも「Flashらしさを心がけておけばなんとかなると思う。同じ土壌で勝負は避けるってことで。」と発言したのですが、ばりばりのFlasherはサーバサイド技術をはじめとしてコアな技術周りは不得手であったりすることが多いです。
その分、インタラクティブで刺激的な表現には普段から着目していることが多いので、そういったアイデアやノウハウを前面に押し出してやっていくのがFlasherとしての使命なのではと考えています。


ということで、ちょっと言い訳くさいですが利便性には劣っているのは作った本人が一番自覚しています。
アナログ時計ライクにタイムラインを配置する時点で重なって読めないなんてのは自明なので、ひとりひとりのタイムライン配置パターンから何か読み取れたら面白いかな、程度のアプリってことでひとつよろしくお願いします。
ちなみに60秒ごとにオートリロードに設定してありますが、ランダムジャンプで飛んでいた場合はオートランダムジャンプが発動するので、一度ジャンプした後は放置しておくとどんどん渡り歩いていきます。


--今後の予定--
ソース公開する
・午前と午後の区別くらいは色か何かで識別できるようにしたい
・友達を登録していないユーザに飛んだらそこで終わってしまうのをどうにかする

2007年05月08日

TwitterClock

Apolloの習作がてら、Twitterのタイムライン一覧をグラフィカルに表示するためのクライアントアプリ TwitterClock を作ってみました。(AIRになって互換性がなくなったので一旦公開終了)

友達のタイムラインをアナログ時計ライクに並べて表示します。

twitterclock.jpg


表示エリアのリサイズ・移動には Tweener を使いました。
最新20件という仕様上、友達が多いとほとんど一箇所に固まって表示されてしまいますが、拡大表示したいエリアをマウスで範囲選択することができます。
あまり拡大しすぎるとレイアウトが崩れるのでご注意をば。
また、シフトキー押しながらドラッグすることで画面全体をスクロールすることができます。

その他の機能として、各ユーザのタイムライン上で右クリックメニューからそのユーザのタイムライン一覧またはそのユーザの友達のタイムライン一覧に飛ぶことができます。
ユーザタイムラインを眺めていると、出社時間とか更新頻度とかその人の一日が見えてきて楽しいですが、負荷対策とはいえ20件しか拾えないのが惜しい。

最初に友達リストだけ拾ってきて、全員のユーザタイムライン拾ってくれば賑やかになるんだけどさすがにやばそうだから自粛中。


[関連エントリ]
TwitterClock其の弐
TwitterClockバージョンアップ

--追記--
自分も含めほとんどのユーザは友達のタイムラインがほとんど一箇所に固まってしまうため、いっそ思い切ってユーザ単位のタイムラインに絞った方がいいかも。
そして、そのユーザの友達からランダムに飛んでいくボタンをつける、と。
むしろ一定時間でランダムにユーザを渡り歩いていく機能をつければ、スクリーンセーバーっぽくなるし悪くないですね。

2007年03月21日

いろんな意味でしゃれにならないApollo

Apolloを触ってみました。
こうまで簡単にアプリが作れてしまうと近い将来、モラルに欠けたアプリが大量出現することに危惧を覚えます。

アプリを開発する人の多くは人のために何か役に立ちたいとかそういった動機を持って開発に取り組む中でモラルを育んでいく、あるいは自然と育まれるものだと思います。

しかし、Apolloはそういった過程を吹っ飛ばしてPCクリティカルなアプリを作ることが可能です。
それも1分とか超短時間で!

// デスクトップのファイルおよびディレクトリの一覧を入手
var files:Array = File.desktopDirectory().listDirectory();
// ゴミ箱に左遷
file.moveToTrash();
// ゴミ箱スルーして抹殺
file.deleteFile();


あえて断片的に書きましたが、上書きにしろ削除にしろ一切警告ダイアログが出ません。
即実行されます。
ゴミ箱介さずに削除する命令まであるし・・・というか、ありえなくね?

ちょっと触ってみてスクリプトちょっとミスって大事なファイルがちょっと消えましたー!?
うっわ、しゃれにならない。

出自不明のApolloアプリはインストールしないようにとかありますが、そんな生ぬるいレベルじゃなくて絶対にダメ!
せめて警告ダイアログとか、そういった環境が整うまでは迂闊に実行しない方がいいです。
むしろAdobeに言いたい、一刻も早く環境整えろと。

興味本位で簡単にウイルスソフトもどき作れちゃうのって・・・うーん。
おまけにSDKだけなら無償配布だし。
敷居が高いからこその安全性っていうのもあったんですが、こりゃパラダイムシフトかな。


ちなみに Apollo Extension for Flex Builder 2.0.1 を実行するにあたって、対象バージョンが2.0.1であることに注意。
2.0.0の状態でもアップデートできてしまいますが、新規 → Apollo Project で「ウィザードを開始できません」なエラーダイアログが出ます。
そこから2.0.1にアップデートしたらエラー出なくなったし、たぶんバージョンのせい。
アップデートかける順序が逆でもちゃんと動いてちょっと安心したw


[追記]
Javaでも簡単に作れるよという意見も出そうですが、これだけ注目を集めている中なので悪意を持った人には絶好の機会なのですよーと。
なので、しばらくはソースコード添付がスタンダードになるのではないでしょうか。
むしろそうして欲しいし、そうしていきたい。

[2007/03/28 13:00 追記]
てっく煮 あまり語られていない Apollo のセキュリティについてまとめてみたで言及されました。
ファイル削除などはぶっちゃけ煽りで、目的としては華々しい部分だけじゃなく危険な面にも注目して欲しいということです。
実際、信頼できるほどはよく知らない人が公開しているApolloアプリを何の警戒もなくインストールして実行した人はたくさんいるのではないでしょうか?
クラッシュさせるためだけにブログを立てて、YouTubeやiTunesみたいな興味を引きそうなキーワードを説明文に入れておいて、とどめにapolloタグをつけてはてブ自演登録。
とにかく色んなサンプルを拝みたい時期なので、これだけで何人も釣れたと思います。
啓蒙といえば大げさですが、そういうことする人がそういうことを容易に達成する環境が整ってしまっている昨今、たとえ開発者であっても注意を怠ってはいけないなと。
そんな感じです。