<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>trace</title>
	
	<link>http://www.mrlittlebig.com/blog</link>
	<description />
	<lastBuildDate>Fri, 20 Apr 2012 09:43:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/mrlittlebig/trace" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="mrlittlebig/trace" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>EaselJSを試してみる</title>
		<link>http://www.mrlittlebig.com/blog/047/</link>
		<comments>http://www.mrlittlebig.com/blog/047/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 09:43:00 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[CreateJS]]></category>
		<category><![CDATA[EaselJS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=614</guid>
		<description><![CDATA[そろそろ、って言ってもすでに遅いですが、HTML5ってことで、 ASライクに書けると噂のEaselJSを試してみた。 お試し、ということで、よくある、ボールをつまんで投げる、というもの。 デモはコチラ ソース ほぼ、これ [...]]]></description>
			<content:encoded><![CDATA[<p>そろそろ、って言ってもすでに遅いですが、HTML5ってことで、<br />
ASライクに書けると噂のEaselJSを試してみた。</p>
<p><span id="more-614"></span></p>
<p>お試し、ということで、よくある、ボールをつまんで投げる、というもの。</p>
<p><a href="http://www.mrlittlebig.com/lab/easelJS/easelJS-test-120420.html" rel="shadowbox">デモはコチラ</a></p>
<p>ソース</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;html&gt;

&lt;head&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;easeljs-0.4.2.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
// &lt;![CDATA[
var canvas;
var stage;
var ball;

var gravity = 0.99; //重力
var ref     = 0.99; //空気抵抗
var friction = 0.9; //反射係数
var pickup = 0;     //ドラッグ中フラグ

/* コンストラクタ */
function init(){
	canvas = document.getElementById('myCanvas');
	stage = new Stage(canvas);

	ball = createCircle(Math.random() * 460 + 20, Math.random() * 100 + 20, Math.random() * 10 + 10,
		Graphics.getRGB(255, 255, 255),
		Graphics.getRGB(0, 0, 0));

	//スコープを限定するための関数を定義
	(function(target){
		//ボールをつまんだ
		ball.onPress = function(e){
			pickup = 1; //enterFrame止める
			var offsetX = target.x - e.stageX;
			var offsetY = target.y - e.stageY;
			var x1 = target.x;
			var y1 = target.y;
			var x2 = x1;
			var y2 = y1;

			e.onMouseMove = function(e){
				target.x = e.stageX + offsetX;
				target.y = e.stageY + offsetY;
				x1 = x2;
				y1 = y2;
				x2 = target.x;
				y2 = target.y;
				target.vx = (x2 - x1);
				target.vy = (y2 - y1);
			}
		}

		//ボールを離した
		ball.onClick  = function(e){
			pickup = 0; //enterFrame再開
		}
	})(ball);

	Ticker.addListener(window);
	Ticker.setFPS(60);
}

/* enterFrame */
function tick(){
	if(pickup == 1){
	}else{
		if(ball.x &gt; 500 - ball.r / 2){
			ball.x = 500 - ball.r / 2;
			ball.vx = ball.vx * -1 * friction;
		}
		if(ball.x &lt; ball.r / 2){
			ball.x = ball.r / 2;
			ball.vx = ball.vx * -1 * friction;
		}

		if(ball.y &gt; 500 - ball.r / 2){
			ball.y = 500 - ball.r / 2;
			ball.vy = ball.vy * -1 * friction;
		}
		if(ball.y &lt; ball.r / 2){
			ball.y = ball.y / 2;
			ball.vy = ball.vy * -1 * friction;
		}

		ball.vx = ball.vx * ref;
		ball.vy = ball.vy * ref + gravity;
		ball.x += ball.vx;
		ball.y += ball.vy;
	}

	stage.update();
}

/*
ボール作る
@params x            x位置
@params y            y位置
@params radius       半径
@params fillColor    塗りの色
@params strokeColor  線の色
*/
function createCircle(x, y, radius, fillColor, strokeColor){
	var circle = new Shape();
	circle.graphics.beginFill(fillColor).setStrokeStyle(3).beginStroke(strokeColor);
	circle.graphics.drawCircle(0,0,radius);
	circle.graphics.endFill();
	circle.x = x;
	circle.y = y;
	circle.vx = 10; //x速度
	circle.vy = 0;  //y速度
	circle.r = radius * 2;
	stage.addChild(circle);
	return circle;
}

// ]]&gt;
&lt;/script&gt;

&lt;/head&gt;

&lt;body onload=&quot;init()&quot; bgColor=&quot;#000&quot;&gt;
&lt;canvas id=&quot;myCanvas&quot; width=&quot;500&quot; height=&quot;500&quot; style=&quot;background-color:white;&quot;&gt;&lt;/canvas&gt;
&lt;/body&gt;

&lt;/html&gt;
</pre>
<p>ほぼ、これの移植版です。<br />
<a href="http://www.procreo.jp/tutorial01.html" target="_blank">初心者のためのフラッシュレベルアップ講座</a></p>
<p>AS2で言う、onEnterFrameは、tick部分で実装されるようです。<br />
これは固定。<br />
後、ドラッグの部分が少しややこしいですが、これは、上条さんの記事をそのまま使わせてもらいました。<br />
<a href="http://cuaoar.jp/2012/03/easeljs.html" title="EaselJS のマウスイベント処理 - akihiro kamijo" target="_blank">EaselJS のマウスイベント処理 &#8211; akihiro kamijo</a></p>
<p>基本はほんとAS2ライクで、スラスラ書けます。<br />
あとは、補完してくれるエディターがあれば、、。</p>
<p>以下、参考サイト<br />
<a href="http://createjs.com/#!/EaselJS" title="EASELJS" target="_blank">EASELJS</a><br />
<a href="http://matsu4512.jp/blog/2012/04/20/easeljs01/" title="CreateJSを試す。 EaselJS編 Shapeクラス &raquo; Every day is Carnival" target="_blank">CreateJSを試す。 EaselJS編 Shapeクラス &raquo; Every day is Carnival</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/047/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickrの写真をダウンロードするAirアプリを作ってみた</title>
		<link>http://www.mrlittlebig.com/blog/046/</link>
		<comments>http://www.mrlittlebig.com/blog/046/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 03:53:09 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flickr]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=596</guid>
		<description><![CDATA[タイトルの通り、Flickrの写真をダウンロードするAirを作ってみました。 なんの面白みもないものですが。 機能としては、自分と自分のコンタクトリストのユーザーの写真のみ、閲覧、ダウンロードが可能、 という、超限定的な [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/12/savefoto_img.jpg" alt="" title="savefoto_img" width="500" height="200" class="alignnone size-full wp-image-610" /></p>
<p>タイトルの通り、Flickrの写真をダウンロードするAirを作ってみました。<br />
なんの面白みもないものですが。<br />
機能としては、自分と自分のコンタクトリストのユーザーの写真のみ、閲覧、ダウンロードが可能、<br />
という、超限定的なものです。</p>
<p><span id="more-596"></span><br />
<script type="text/javascript" src="http://www.mrlittlebig.com/cssjs/swfobject.js"></script></p>
<div id="flashcontent"></div>
<p><script language="JavaScript" type="text/javascript">
var so = new SWFObject("http://www.mrlittlebig.com/air/savefoto/badge.swf","badge", "217", "180", "9","#ffffff");
so.addVariable("appname", "SaveFoto");
so.addVariable("appurl", "http://www.mrlittlebig.com/air/savefoto/SaveFoto.air");
so.addVariable("airversion", "2.5");
so.addVariable("buttoncolor", "333333");
so.addVariable("messagecolor", "000000");
so.addVariable("imageurl", "http://www.mrlittlebig.com/air/savefoto/SaveFoto.jpg");
so.write("flashcontent");
</script></p>
<p>そもそも、このソフトを作った経緯としては、ものすごく私事なのですが、<br />
うちの親が、Flickrにアップされている、姉の子供の写真をダウンロードして印刷しています。<br />
で、今まではプラグインを使ったりなんだかんだとしていたのですが、<br />
ちょくちょくFlickrの仕様が変わったり、プラグインがブラウザに非対応になったり、と、毎回実家に帰る度に質問される次第。<br />
それならば作ってしまえ、ということで、うちの親が使うであろう機能のみ、を実装した、という流れです。<br />
探せば他に同じ事が出来るソフトはいくらでもあるんでしょうが、高機能で使いこなせなかったりするだろうし、<br />
まぁ、勉強がてら、って事で。</p>
<p>一応、処理の流れを書いておきます。</p>
<p><a href="#no1">１．FlickrにOAuth認証をかける</a><br />
<a href="#no2">２．コンタクトリストの情報を取得</a><br />
３．クリックされたユーザーの写真一覧情報を取得<br />
<a href="#no4">４．チェックされた写真のダウンロード</a></p>
<p>FlickrのAPIのドキュメントは以下です。<br />
<a href="http://www.flickr.com/services/api/" target="_blank">Flickr Services</a></p>
<h3 id="no1">１．OAuth認証</h3>
<p>これは、以下のページを参考にさせていただきました。ありがとうございます！<br />
<a href="http://blog.appforandroid.info/?p=436" target="_blank">flickrのOAuth認証について | android application</a></p>
<p>StageWebViewというクラスが見当たらなくて悩んだのですが、<br />
AIR2.5から追加された新しいクラスだそうです。<br />
これは、webページをwebkitを使ってそのままレンダリングしてくれるもののようです。<br />
便利すぎる。<br />
これはwebのFlashにも追加して欲しい…。<br />
<a href="http://blog.appforandroid.info/?p=348" target="_blank">stageWebViewについて | android application</a></p>
<h3 id="no2">２．コンタクトリストの情報を取得</h3>
<p>１．で認証が上手くいけば、FlickrのAPI操作は、as3flickrlibのライブラリで簡単に行えます。<br />
コンタクトリストの取得は、contacts.getList()でいけます。</p>
<p>ただ、このAPIとの通信で一番苦労したことが、情報を取得したあと、の処理です。<br />
取得した情報は、Objectで返って来るのですが、その中身が、何型なのかがリファレンスには載ってない。<br />
コンタクトリストの場合は、以下の容量でArray型に変換できました。<br />
Arrayの中身はUser型になっています。</p>
<pre class="brush: as3; title: ; notranslate">private function onGetContactList(e:FlickrResultEvent):void
{
  var list:Array = e.data.contacts as Array;
  for (var i:int = 0; i &lt; list.length; i++) {
    var info:User = list[i] as User;
    trace(info.nsid); //ユーザーID
    trace(info.username); //ユーザーネーム
}</pre>
<p>このobjectの中身については、以下のサイトでの要領で中身を都度、調べて対応しました。<br />
<a href="http://adalberyo.blog116.fc2.com/blog-entry-96.html" target="_blank">熊の散策路  [ActionScript 3] Objectのデバックの方法②　[デバック用クラス作成]</a></p>
<p>その他の結果では以下のように処理しました。</p>
<pre class="brush: as3; title: ; notranslate">//-------------------
//people.getInfo
var info:User = e.data.user as User;

//-------------------
//写真の検索
//photos.search
var list:PagedPhotoList = e.data.photos as PagedPhotoList;
for (var i:int = 0; i &lt; arr.length; i++) {
  /*
  arr[i].id
  arr[i].secret
  arr[i].server
  arr[i].farm
  arr[i].title
  arr[i].description
  */
}

//-------------------
//写真のサイズ別URL一覧
//photos.getSizes
var arr:Array = e.data.photoSizes as Array;
for (var i:int = 0; i &lt; arr.length; i++) {
  var size:PhotoSize = arr[i];
  /*
  size.source
  size.url
  */
}</pre>
<h3 id="no4">４．チェックされた写真のダウンロード</h3>
<p>データのダウンロードには、FileReferenceクラスを使う、と思っていたのですが、<br />
このクラスを使う場合は、ひとつずつ、しかダウンロードできません。<br />
FileReference.download(); を呼び出すたびに、保存先のフォルダを選ぶダイアログが出て、、、<br />
と、毎回保存先を選ぶことになります。<br />
ですが、今回は、チェックした写真を一括でダウンロードしたかったので、この方法は却下しました。<br />
（毎回ダイアログが出ていたら、うちの親もめんどくさい、とかいいそうだし）</p>
<p>で、調べてみると、FileStreamクラス、というものがありました。<br />
これは、ダウンロードしたバイナリを、ファイルに書き込む、というもの、らしい。<br />
なので流れとしては、バイナリで画像をダウンロード後、FileStreamクラスでファイルに書き込み、となるよう。<br />
これは、ココを参考にさせてもらいました！感謝！<br />
<a href="http://d.hatena.ne.jp/kanz-labs/20091117/1258473332" target="_blank">画像を保存する &#8211; After Effects&#038;Flash＋αテクニック集</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>だいたいこんな流れです。<br />
後は、写真をクリックした際に、新しいウインドウを表示する辺りがちょっとだけ苦労しました。<br />
この辺りを参考にさせていただきました。<br />
<a href="http://www.atmarkit.co.jp/fwcr/rensai/air03/air03_1.html" target="_blank">AIRアプリのウィンドウは自由自在で縦横無尽！ （1/2） ─ ＠IT</a></p>
<p>ざっと思いつきで作ったものではあるので、もしご使用中に挙動がおかしくなったりしたら、そっとAlt+F4で閉じて下さい。<br />
最後に、ご使用は自己責任でお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/046/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlashでFacebookアプリを作ってみる 第4回</title>
		<link>http://www.mrlittlebig.com/blog/045/</link>
		<comments>http://www.mrlittlebig.com/blog/045/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 03:18:41 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=577</guid>
		<description><![CDATA[Flashを使ってFacebookアプリを作ってみます。 ウォールや画像の投稿です。 目次 1.準備 2.初期化 3.アイコン画像の取得 4.ウォールへの投稿 5.画像の投稿 6.まとめ ウォールへの投稿 ウォールに投稿 [...]]]></description>
			<content:encoded><![CDATA[<p>Flashを使ってFacebookアプリを作ってみます。</p>
<p>ウォールや画像の投稿です。<br />
<span id="more-577"></span></p>
<h3>目次</h3>
<p>1.<a href="http://www.mrlittlebig.com/blog/042/#no1">準備</a><br />
2.<a href="http://www.mrlittlebig.com/blog/043/#no2">初期化</a><br />
3.<a href="http://www.mrlittlebig.com/blog/044/#no3">アイコン画像の取得</a><br />
4.<a href="#no4">ウォールへの投稿</a><br />
5.<a href="#no5">画像の投稿</a><br />
6.<a href="#no6">まとめ</a></p>
<h3 id="no4">ウォールへの投稿</h3>
<p>ウォールに投稿してみます。</p>
<p>投稿するには、publish_streamの権限が必要となります。<br />
（「ウォールへの投稿」権限）</p>
<pre class="brush: as3; title: ; notranslate">var opts:Object = { perms:&quot;publish_stream&quot; };
Facebook.login(callback, opts);</pre>
<p>ウォールへの投稿は以下のAPIになります。</p>
<blockquote><p>/me/feed</p></blockquote>
<p>ここでの注意はPOST送信しないといけないところです。<br />
なので、以下のようになります。</p>
<pre class="brush: as3; title: ; notranslate">var params:Object = { messagej:&quot;メッセージ&quot; };
Facebook.api(&quot;/me/feed&quot;, callback, params, &quot;POST&quot;);</pre>
<p>第4引数でPOSTと指定します。（デフォルトはGET）<br />
投稿できるものは、ドキュメントによると、以下になるようです。</p>
<blockquote><p>message, picture, link, name, caption, description, source</p></blockquote>
<p>その他、いいね、や、シェアなど、投稿系のAPIの解説は以下にあります。(英語）<br />
試していませんが、同じようにすれば投稿できるかもしれません。<br />
<a href="http://developers.facebook.com/docs/reference/api/#publishing" target="_blank">Graph API &#8211; Publishing</a></p>
<h3 id="no5">画像の投稿</h3>
<p>画像の投稿です。<br />
Flash内の画像をそのまま保存させたい場合、です。<br />
例えば、お絵かきアプリなどで書いた絵をfacebookに保存したい時、などです。</p>
<p>上記のウォールへの投稿ではなく、アルバムに追加する方法です。<br />
以下のAPIを使用します。</p>
<blockquote><p>/ID/photos</p></blockquote>
<p>画像は、画像のURLを指定するのではなく、保存したい部分のビットマップを指定します。</p>
<pre class="brush: as3; title: ; notranslate">var photoBitmap:Bitmap; //保存したい画像のビットマップ
var opts:Object = { file:photoBitmap, message:&quot;画像の説明とか&quot;, fileName:&quot;画像名&quot;};
Facebook.api(&quot;/me/photos&quot;, callback, opts);</pre>
<p>fileにビットマップ。<br />
messageに画像の説明。<br />
fileNameに画像の名前、を書いておきます。<br />
fileNameは保存される画像のファイル名そのもの、ではないようですので、同じファイル名で複数枚保存したとしても上書きされる心配はありません。</p>
<p>投稿した写真はそのアプリ名のアルバムに保存されます。<br />
アルバムがない場合は作成されます。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/06/110531_7.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/06/110531_7-300x129.jpg" alt="" title="110531_7" width="300" height="129" class="alignnone size-medium wp-image-581" /></a><br />
特定のアルバム内に保存したい場合は、/me/の代わりにアルバムIDを指定します。<br />
アルバムIDは、/me/albums で一覧を取得できるのでその中から任意のIDを抜き出して使います。</p>
<pre class="brush: as3; title: ; notranslate">ar photoBitmap:Bitmap; //保存したい画像のビットマップ
var opts:Object = { file:photoBitmap, message:&quot;画像の説明とか&quot;, fileName:&quot;画像名&quot;};
Facebook.api(&quot;/アルバムID/photos&quot;, callback, opts);</pre>
<p>写真と投稿する際の注意点としては、<br />
このAPIは、ユーザーがなにかアクションをした時に実行させなければならない、という点です。<br />
例えば、ボタンをクリックした時、などです。<br />
（自動でアップロードさせる事は出来ません。）<br />
そうしないと以下のエラーが出てしまいます。</p>
<blockquote><p>SecurityError: Error #2176: ポップアップウィンドウを表示するなどの特定のアクションは、<br />
例えばマウスをクリックしたりボタンを押したりして、ユーザーによる相互作用が発生した場合にのみ呼び出されます。</p></blockquote>
<p>参考：（英語）<br />
<a href="http://www.permadi.com/blog/2011/05/using-facebook-graph-api-in-flash-as3-to-upload-image-and-post-to-photo-album/" target="_blank">Using Facebook Graph API In Flash AS3 To Upload Image And Post To Photo Album</a></p>
<h3 id="no6">まとめ</h3>
<p>最後の方は駆け足で紹介してしまいましたが、以上になります。<br />
基本的に、<a href="http://developers.facebook.com/docs/reference/api/" target="_blank">Graph APIのドキュメント</a>に載っているものは、Flashでもそのまま使用できると思っていいようです。</p>
<blockquote><p>https://graph.facebook.com/me/friends?access_token=&#8230;<br />
↓↓<br />
Facebook.api(&#8220;/me/friends&#8221;, callback);</p></blockquote>
<p>その際、送信したいパラメータはオブジェクトで渡し、アクセストークンの付与は気にしなくてよい、という簡単設計です。<br />
パラメータをどういった形式で渡せばいいかが悩むところがありますが、調べれば大抵出てくるかと思います。</p>
<p>なんらかの理由により、GraphAPIではなく、昔のAPIを使用したい時は、直接URLを指定すれば使用することは出来ます。<br />
その際には、アクセストークンが必要となりますので、事前に取得する必要があります。<br />
しかしながら、これらのAPIはいつ削除されるかわからないものですので、使用はオススメできません。<br />
<a href="http://developers.facebook.com/docs/reference/rest/" target="_balnk">Old REST API (Legacy REST API)</a></p>
<p>Facebookは日々、アップデートが繰り返されており、ここで紹介した内容も最悪、明日には使えなくなる可能性もあります。<br />
その点に注意していただいて、ご利用下さい。</p>
<p>それでは、よいFacebookライフを！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/045/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlashでFacebookアプリを作ってみる 第3回</title>
		<link>http://www.mrlittlebig.com/blog/044/</link>
		<comments>http://www.mrlittlebig.com/blog/044/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 07:42:17 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=558</guid>
		<description><![CDATA[Flashを使ってFacebookアプリを作ってみます。 いよいよAPIを使って情報を取っていきます。 目次 1.準備 2.初期化 3.アイコン画像の取得 4.ウォールへの投稿 5.画像の投稿 6.まとめ アイコン画像の [...]]]></description>
			<content:encoded><![CDATA[<p>Flashを使ってFacebookアプリを作ってみます。</p>
<p>いよいよAPIを使って情報を取っていきます。<br />
<span id="more-558"></span></p>
<h3>目次</h3>
<p>1.<a href="http://www.mrlittlebig.com/blog/042/#no1">準備</a><br />
2.<a href="http://www.mrlittlebig.com/blog/043/#no2">初期化</a><br />
3.<a href="#no3">アイコン画像の取得</a><br />
4.<a href="http://www.mrlittlebig.com/blog/045/#no4">ウォールへの投稿</a><br />
5.<a href="http://www.mrlittlebig.com/blog/045/#no5">画像の投稿</a><br />
6.<a href="http://www.mrlittlebig.com/blog/045/#no6">まとめ</a></p>
<h3 id="no3">アイコン画像の取得</h3>
<p><a href="http://www.mrlittlebig.com/blog/043/#no2">前回</a>まででAPIを使用する準備が整いましたので、いよいよ今回から色々な情報を取得していくことにします。</p>
<p>まず最初は自分と友達のアイコン画像を表示してみます。</p>
<p>アイコン画像は以下のURLで取得できます。</p>
<blockquote><p>https://graph.facebook.com/ユーザーID/picture</p></blockquote>
<p>なので、自分、友達のIDを取得して、このURLから画像をロードすればいいだけ、です。</p>
<p>まず、自分のアイコンです。<br />
自分のアイコンといえども、meではなく、IDを使う必要があります。<br />
ログインした時点で自分のIDは取得できますが、今回は自分のプロフィールを取得し、その中からIDを抜き出してみます。</p>
<pre class="brush: as3; title: ; notranslate">Facebook.api(&quot;/me/&quot;, callback);

private function callback(result:Object, fail:Object):void{
	if (result) {
		//プロフィール情報の取得成功
		/*--------------------------
		 * 取得例
		verified : true
		updated_time : 2011-05-25T03:26:51+0000
		gender : male
		username : mlb.usk
		id : 1075421191
		first_name : Yusuke
		locale : ja_JP
		timezone : 9
		favorite_teams : [object Object]
		link : http://www.facebook.com/mlb.usk
		location : [object Object]
		last_name : Kano
		name : Yusuke Kano
		------------------------------*/
	}else {
		//プロフィール情報の取得に失敗
	}
}</pre>
<p>このように、/me/とするだけで自分の情報は取得できます。<br />
で、取得したIDで画像をロードします。直接アドレスを叩いてもいいのですが、ライブラリに専用の関数があります。</p>
<pre class="brush: as3; title: ; notranslate">Facebook.getImageUrl(&quot;ID&quot;, size)</pre>
<p>IDは取得したIDです。<br />
第二引数はオプションで、画像のサイズを指定できます。<br />
リファレンスによりますと、square, small, large のいずれかを指定するようです。<br />
指定がない場合はオリジナルのサイズだと思います。<br />
Facebook.getImageUrl()は、上記のURLにIDとオプションをくっつけて返してくれるだけ、です。</p>
<p>というわけで、画像の取得は以下のようになります。</p>
<pre class="brush: as3; title: ; notranslate">var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT, loadComplete);
loader.load(new URLRequest(Facebook.getImageUrl(&quot;ID&quot;, size)));</pre>
<p>次に友達のアイコン画像です。</p>
<p>友達の一覧リストは以下で取得することが出来ます。</p>
<pre class="brush: as3; title: ; notranslate">Facebook.api(&quot;/me/friends&quot;, callback);
private function callback(result:Object, fail:Object):void{
	if (result) {
		//リスト取得成功
		var friends:Array = result as Array;
		for (var i:uint = 0; i &lt; friends.length; i++) {
			trace(friends[i].id);
		}
	}else {
		//失敗
	}
}</pre>
<p>リストは配列で返ってきます。<br />
中身は、idとnameのみになります。<br />
もっと詳しく情報を見たければ、自分のプロフィールを見たときと同じように、Facebook.api(&#8220;/&#8221; + 友達のID + &#8220;/&#8221;, callback) として取得します。<br />
今回はIDだけで大丈夫ですのでこれでOKです。</p>
<p>さて、無事IDは取得できましたので、あとは自分の画像を取得した時と同じように<br />
友達のIDを使って画像を取得すれば今回の目的は達成です。</p>
<p>しかし、このままでは問題があります。<br />
それは、セキュリティサンドボックス侵害、です。</p>
<p>別ドメインにある画像をロードすることになりますので、そのまま表示しようとするとエラーが出てしまいます。<br />
しかし、facebookにはきちんとポリシーファイルが用意してありますので、そちらを一番最初にでも読むようにしておきます。<br />
画像が置いてあるサーバのポリシーファイルは以下にあります。</p>
<blockquote><p>https://fbcdn-profile-a.akamaihd.net/crossdomain.xml</p></blockquote>
<p>これを読み込みます。</p>
<pre class="brush: as3; title: ; notranslate">Security.loadPolicyFile(&quot;https://fbcdn-profile-a.akamaihd.net/crossdomain.xml&quot;);</pre>
<p>今回の分をまとめてみます。</p>
<pre class="brush: as3; title: ; notranslate">package
{
	import flash.system.Security;

		// 設定等、割愛-------------

		public function Index() {
			Security.loadPolicyFile(&quot;https://fbcdn-profile-a.akamaihd.net/crossdomain.xml&quot;);

			//割愛 -----------------------
		}

		//割愛 -----------------------
			getProfile();
		}
		private function getProfile():void{
			//自分のプロフィール取得
			Facebook.api(&quot;/me/&quot;, loadProfileHandler);
		}
		private function loadProfileHandler(result:Object, fail:Object):void{
			if (result) {
				//プロフィール情報の取得成功
				var myID:String = result.id;

				//画像のロード開始
				var loader:Loader = new Loader();
				loader.contentLoaderInfo.addEventListener(Event.INIT, myiconLoadComplete);
				loader.load(new URLRequest(Facebook.getImageUrl(myID)));

				//位置とか調整して表示する
				this.addChild(loader);

			}else {
				//プロフィール情報の取得に失敗
			}
		}
		private function myiconLoadComplete(e:Event):void {
			_loader.contentLoaderInfo.removeEventListener(Event.INIT, myiconLoadComplete);

			//友達リストを取得する
			Facebook.api(&quot;/me/friends&quot;, loadFriendsHandler);
		}
		private function loadFriendsHandler(result:Object, fail:Object):void{
			if (result) {
				//リスト取得成功
				var friends:Array = result as Array;
				for (var i:uint = 0; i &lt; friends.length; i++) {
					_friendIconIDs.push(friends[i].id);
				}
				startFriendIconLoad();
			}else {
				//失敗
			}
		}
		///アイコンのロード開始
		private function startFriendIconLoad():void{
			for(var i:int = 0; i &lt; _friendIconIDs.length; i++){
				var loader:Loader = new Loader();
				loader.load(new URLRequest(Facebook.getImageUrl(_friendIconIDs[i])));

				//位置とか調整して表示する
				this.addChild(loader);
			}
		}
	}
}</pre>
<p>以上です。<br />
<a href="http://www.mrlittlebig.com/blog/045/">続きます</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/044/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlashでFacebookアプリを作ってみる 第2回</title>
		<link>http://www.mrlittlebig.com/blog/043/</link>
		<comments>http://www.mrlittlebig.com/blog/043/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 10:29:12 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=532</guid>
		<description><![CDATA[Flashを使ってFacebookアプリを作ってみます。 今回は初期化編です。 目次 1.準備 2.初期化 3.アイコン画像の取得 4.ウォールへの投稿 5.画像の投稿 6.まとめ 初期化 前回まででアプリの設定は完了し [...]]]></description>
			<content:encoded><![CDATA[<p>Flashを使ってFacebookアプリを作ってみます。</p>
<p>今回は初期化編です。<br />
<span id="more-532"></span></p>
<h3>目次</h3>
<p>1.<a href="http://www.mrlittlebig.com/blog/042/#no1">準備</a><br />
2.<a href="#no2">初期化</a><br />
3.<a href="http://www.mrlittlebig.com/blog/044/#no3">アイコン画像の取得</a><br />
4.<a href="http://www.mrlittlebig.com/blog/045/#no4">ウォールへの投稿</a><br />
5.<a href="http://www.mrlittlebig.com/blog/045/#no5">画像の投稿</a><br />
6.<a href="http://www.mrlittlebig.com/blog/045/#no6">まとめ</a></p>
<h3 id="no2">初期化</h3>
<p><a href="http://www.mrlittlebig.com/blog/042/#no1">前回</a>まででアプリの設定は完了しました。<br />
いよいよFlashの作業に入ります。</p>
<p>Flashでの開発は、AdobeがAPIのライブラリを配布しいます。<br />
<a href="http://code.google.com/p/facebook-actionscript-api/" target="_blank">facebook-actionscript-api</a></p>
<p>※2011/05/31時点での最新版は1.6.1でした。<br />
今回はwebで見る事を想定したアプリとなりますので、<br />
「GraphAPI_Web_1_6_1.swc」もしくは「GraphAPI_Source_1_6_1.zip」をダウンロードします。<br />
ドキュメント「GraphAPI_Documentation_1_6.zip」と、サンプル「GraphAPI_Examples_1_6_1.zip」もダウンロードしておくといいでしょう。</p>
<p>ダウンロードした、swcもしくはソースのasファイルにパスを通します。</p>
<p>facebookとの通信のややこしい部分はこちらのライブラリが行ってくれます。</p>
<pre class="brush: as3; title: ; notranslate">import com.facebook.graph.Facebook;</pre>
<p>まずは初期化、facebookとの通信を確立します。<br />
この際、作成したfacebookアプリのアプリIDが必要となります。<br />
こちらの<a href="https://www.facebook.com/developers/apps.php" target="_blank">マイアプリのページ</a>へ行き、IDを控えましょう。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_6.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_6-300x69.jpg" alt="" title="110531_6" width="300" height="69" class="alignnone size-medium wp-image-537" /></a></p>
<p>そのIDを使い、初期化します。</p>
<pre class="brush: as3; title: ; notranslate">Facebook.init(&quot;アプリID&quot;, callback);</pre>
<p>通信が完了すると、callbackに指定した関数にコールバックされます。<br />
コールバックは以下のように書いておきます。</p>
<pre class="brush: as3; title: ; notranslate">private function callback(result:Object, fail:Object):void
{
	if (result) {
		//ログイン済み
	}else {
		//未ログイン
	}
}</pre>
<p>Facebookのコールバック関数は全て、処理が成功したときは、第一引数に、失敗した時には第二引数に値が入って返ってきます。<br />
この場合、ログイン、認証済みの時はresultに値が、未ログインもしくは未認証の時はfailに値が入って返ってきます。</p>
<p>未ログイン、未認証の時には、以下の処理でログイン、認証処理を表示させます。</p>
<pre class="brush: as3; title: ; notranslate">var opts:Object = { perms:&quot;&quot; };
Facebook.login(callback, opts);</pre>
<p>第二引数のオブジェクトはオプションです。<br />
ここには許可させたい権限を入れておきます。作成するアプリに合った権限を指定してください。<br />
どの処理にどの権限が必要かはこちらで確認できます。（英語ですが）<br />
<a href="http://developers.facebook.com/docs/authentication/permissions/" target="_blank">Permissions</a></p>
<p>ログイン時のコールバックは表示されたウインドウ内でユーザーがログイン／認証を終えた後、、、に返ってくれば簡単なのですが、<br />
どうやらウインドウを表示する命令が完了した時点で返ってくるようです。（たぶん）<br />
なので、ログインのコールバック内に次の処理を書いておくと意図しないタイミングで実行される恐れがあります。</p>
<p>なので、ExternalInterfaceを使い、セッションの変更を監視するようにします。<br />
ユーザーがログイン／認証を終えるとセッションが変更されるので、ここを監視しておけばログイン／認証のタイミングを掴む事ができます。</p>
<pre class="brush: as3; title: ; notranslate">ExternalInterface.addCallback('sessionChange', sessionChange);

private function sessionChange(session:String, extendedPermissions:Object = null):void{
	if (session){
		//ログイン・認証完了
		/* セッションの中身
		base_domain : xxx
		uid : xxx
		sig : xxx
		session_key : xxx
		secret : xxx
		expires : xxx
		access_token : xxx
		*/
	}else{
		//ログイン・認証失敗？
	}
}</pre>
<p>コールバックの引数のsessionの中に変更されたセッション情報が入っています。<br />
それがなければログイン・認証が失敗した、ということになります。<br />
ログイン・認証が成功するとsessionに情報が入って返ってくるのですが、<br />
このとき、コールバックが2回呼ばれる事があるようです。ご注意を。（自分の環境ではそうでした）</p>
<p>ここで少しはまってしまったことがあるのですが、<br />
未ログイン、もしくは、未認証の状態からログイン・認証が成功すると、上記のようにセッションが変更され、<br />
次の処理に移ることが出来るのですが、そのままですと、HTMLかJSかは不明ですが、セッションが更新されていないようです。<br />
試しに、Facebook.api(&#8220;/me/&#8221;, callback); という自身の情報を呼び出すAPIを叩いてみると、エラーが返ってきます。<br />
IDで指定するときちんと返って来るので、me、の部分、自分が誰なのかが更新されていないように見えました。<br />
このときはセッション状態を参照することでエラーが出なくなりました。<br />
たぶん、セッション状態を参照することで、セッションを明示的に更新した事になるんじゃないかと思います。たぶん。<br />
セッション状態の参照は以下で出来ます。</p>
<pre class="brush: as3; title: ; notranslate">var se:FacebookSession = Facebook.getSession();
trace(se.uid); //ID
trace(se.accessToken); //アクセストークン</pre>
<p>これでフラッシュ側の初期化は完了です。<br />
あとは、HTMLを作成する際に、JSを読み込ませておきます。<br />
さらに、fb-rootのIDを持ったdivタグをbody直下にひとつ、入れておく必要があるそうです。</p>
<pre class="brush: xml; title: ; notranslate">&lt;script type=&quot;text/javascript&quot; src=&quot;http://connect.facebook.net/en_US/all.js&quot;&gt;&lt;/script&gt;</pre>
<pre class="brush: xml; title: ; notranslate">&lt;body&gt;
&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
～～</pre>
<p>初期化分をまとめておきます。</p>
<p>ドキュメントクラス index.as
<pre class="brush: as3; title: ; notranslate">package
{
	import com.facebook.graph.data.FacebookSession;
	import com.facebook.graph.Facebook;
	import flash.external.ExternalInterface;
	import flash.display.*;
	import flash.events.*;
	public class Index extends MovieClip
	{
		public function Index()
		{
			Facebook.init(&quot;アプリID&quot;, initCallback);
		}
		private function initCallback(result:Object, fail:Object = null):void
			if (result) {
				//ログイン・認証済み
				//次の処理へ
			}else {
				//未ログイン・未認証
				//セッション状態の管理
				ExternalInterface.addCallback('sessionChange', sessionChange);
				//ログイン・認証させる
				//権限の設定
				var opts:Object = { perms:&quot;&quot; };
				Facebook.login(onLogin, opts);
			}
		private function onLogin(result:Object, fail:Object):void
			//ログイン・認証ウインドウが開いた
		}
		private function sessionChange(sessionChange:String, extendedPermissions:Object = null):void
		{
			if (session)
			{
				//ログイン・認証済み
				//セッション状態を取得してセッション変更を伝える
				var se:FacebookSession = Facebook.getSession();
				//次の処理へ
			}
			else
			{
				//ログイン・認証失敗
			}
		}
	}
}</pre>
<p><a href="http://www.mrlittlebig.com/blog/044/">続きます</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/043/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlashでFacebookアプリを作ってみる 第1回</title>
		<link>http://www.mrlittlebig.com/blog/042/</link>
		<comments>http://www.mrlittlebig.com/blog/042/#comments</comments>
		<pubDate>Tue, 31 May 2011 06:13:45 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=499</guid>
		<description><![CDATA[Flashを使ってFacebookアプリを作ってみます。 ちょっと詳しめに書いてみます。 今回は準備編です。 目次 1.準備 2.初期化 3.アイコン画像の取得 4.ウォールへの投稿 5.画像の投稿 6.まとめ 準備 f [...]]]></description>
			<content:encoded><![CDATA[<p>Flashを使ってFacebookアプリを作ってみます。<br />
ちょっと詳しめに書いてみます。<br />
今回は準備編です。<br />
<span id="more-499"></span></p>
<h3>目次</h3>
<p>1.<a href="#no1">準備</a><br />
2.<a href="http://www.mrlittlebig.com/blog/043/#no2">初期化</a><br />
3.<a href="http://www.mrlittlebig.com/blog/044/#no3">アイコン画像の取得</a><br />
4.<a href="http://www.mrlittlebig.com/blog/045/#no4">ウォールへの投稿</a><br />
5.<a href="http://www.mrlittlebig.com/blog/045/#no5">画像の投稿</a><br />
6.<a href="http://www.mrlittlebig.com/blog/045/#no6">まとめ</a></p>
<h3 id="no1">準備</h3>
<p>facebookのアカウントは持っているものとします。<br />
まずは、Facebookアプリの登録をします。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_1.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_1-300x170.jpg" alt="" title="110531_1" width="300" height="170" class="alignleft size-medium wp-image-505" /></a><br />
自分のfacebookのトップページの一番下、フッタの「<a href="http://developers.facebook.com/" target="_blank">開発者</a>」という項目をクリックします。<br />
そのページのヘッダメニューの「マイアプリ」をクリック。<br />
<a href="https://www.facebook.com/developers/" target="_blank">developersのページ</a>へ行きます。<br />
「開発者」からアクセスの許可を求められるので、許可します。</p>
<p>許可すると、「ありがとうございます！」という表示が現れ、その下に、<br />
アプリケーションがありません。作成する<br />
と、出てきますので、「作成する」をクリックし、アプリの作成に移ります。<br />
すると、以下のような警告を受けます。</p>
<blockquote><p>この操作を実行するには、アカウントの認証を完了する必要があります。<u>携帯電話</u>または<u>credit card</u>を追加してアカウント認証を行ってください。</p></blockquote>
<p>登録するのは憚られるのですが、登録しないと次に進めませんので登録します。<br />
今回は、「携帯電話」を登録してみました。</p>
<p>リンク先から、「Facebookテキストに登録」をクリックするとポップアップが表示されるのですが、<br />
その国の中に「日本」がありません…。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_2.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_2-300x132.jpg" alt="" title="110531_2" width="300" height="132" class="alignnone size-medium wp-image-516" /></a><br />
よくわかりませんが、仕方ないので、その下の部分をクリックします。</p>
<blockquote><p>Just need to verify your account? <u>ここに電話番号を追加してください。</u></p></blockquote>
<p>すると、さらにポップアップが開き、今度は携帯のメールアドレスを入力しろ、と言われます。<br />
ドメイン部分は日本の携帯会社が選択できるようになっていますので入力し、送信します。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_3.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_3-300x158.jpg" alt="" title="110531_3" width="300" height="158" class="alignnone size-medium wp-image-518" /></a><br />
送信したアドレスに確認用コードが送られてきますので、そのコードを入力します。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_4.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_4-300x116.jpg" alt="" title="110531_4" width="300" height="116" class="alignnone size-medium wp-image-520" /></a><br />
入力し、認証が終わるとやっとアプリを作成出来るようになります。長い…。<br />
<a href="https://www.facebook.com/developers/" target="_blank">こちら</a>に戻り、「<a href="https://www.facebook.com/developers/createapp.php" target="_blank">Set Up New App</a>」をクリックし、アプリの作成を行います。</p>
<p>アプリケーション名を入力し、規約に同意し、アプリケーションを作成します。<br />
セキュリティチェックを通過し、アプリの編集ページへ移動します。</p>
<p>編集ページ内でポイントとなる項目は以下になります。<br />
・Web Site<br />
　　Site URL  →　アプリで使用するswfが読み込まれているHTMLまでのURLを入力します。<br />
　　Site Domain　→　HTMｌが置かれているサイトのドメインを入力します。<br />
・Facebook Integration<br />
　　キャンバスページ　→　facebook上でのこのアプリのURLです。他人と被ってはいけません。<br />
・詳細設定<br />
　　サンドボックスモード　→　ここを有効にすると管理人のみが閲覧可能になります。<br />
<a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_5.jpg" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/110531_5-300x66.jpg" alt="" title="110531_5" width="300" height="66" class="alignnone size-medium wp-image-522" /></a></p>
<p>準備だけでやけに長くなってしまいました。<br />
<a href="http://www.mrlittlebig.com/blog/043/#no2">次回</a>に続きます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/042/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQueryのマウスオーバーのアクションを触ってみる</title>
		<link>http://www.mrlittlebig.com/blog/041/</link>
		<comments>http://www.mrlittlebig.com/blog/041/#comments</comments>
		<pubDate>Fri, 20 May 2011 02:17:23 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[etc]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=480</guid>
		<description><![CDATA[jQueryを使ったボタンのマウスオーバー時のアニメーションですが、 少し気になっていた事がありました。 それは、素早く、マウスオーバー/アウトを繰り返すと、 マウスオーバーした回数だけアニメーションが後からきっちりと実 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/05/jquery_mouseover.jpg" alt="jquery_mouseover" title="jquery_mouseover" width="500" height="200" class="alignnone size-full wp-image-481" /></p>
<p>jQueryを使ったボタンのマウスオーバー時のアニメーションですが、<br />
少し気になっていた事がありました。<br />
それは、素早く、マウスオーバー/アウトを繰り返すと、<br />
マウスオーバーした回数だけアニメーションが後からきっちりと実行されてしまうもの。<br />
結構よくみかける気がします。</p>
<p><span id="more-480"></span><br />
マウスオーバーしてアウトして再度オーバーしてってした時に<br />
前のアニメーションをキャンセルしてないのでこうなっていると思うのですが、<br />
動き的に気持ち悪かったのでちゃんと出来ないもんかと思って見てみました。<br />
ググってみるともうかなり古い話題のようで書いている方がいました。</p>
<p><a href="http://www.kantenna.com/pg/2010/01/jqueryjquery_stop.php" target="_blank">[jQuery]こんな機能があったんだ。jQuery stop()</a></p>
<p>わかりやすいです。<br />
stop()でアニメーションをキャンセルさせる事ができるようです。<br />
試してみました。</p>
<p>・マウスオーバーした回数だけイベントが発生する<br />
<a href="http://www.mrlittlebig.com/blog/source/110520/jquery_mouseover_sample1.html" target="_blank">デモ</a></p>
<pre class="brush: jscript; title: ; notranslate">$(document).ready(
	function(){
		$(&quot;#over1 li img&quot;).hover(function(){
			$(this).fadeTo(&quot;fast&quot;, 0.1);
		}, function(){
			$(this).fadeTo(&quot;fast&quot;, 1);
		});
	}
);</pre>
<p>・stop()でキャンセルした場合<br />
<a href="http://www.mrlittlebig.com/blog/source/110520/jquery_mouseover_sample2.html" target="_blank">デモ</a></p>
<pre class="brush: jscript; title: ; notranslate">$(document).ready(
	function(){
		$(&quot;#over1 li img&quot;).hover(function(){
			$(this).stop().fadeTo(&quot;fast&quot;, 0.1);
		}, function(){
			$(this).stop().fadeTo(&quot;fast&quot;, 1);
		});
	}
);</pre>
<p>stop()の引数は二つあり、それぞれにtrueかfalseを設定することでキャンセルして次の動作に移るかどうか、などを制御できるようです。<br />
それを見て思い出したのがフラッシュでtrick7さんが昔書いておられた「気持ちよいアニメーションの考察」的な記事です。</p>
<p><a href="http://www.trick7.com/blog/2009/01/16-103955.php" target="_blank">trick7 &#8211; ロールオーバー効果へのこだわり2</a></p>
<p>上記のstop()を使えばこれを実現できるのでは、と思い、試してみました。</p>
<h3>とりあえず幅を伸ばしてみる</h3>
<p><a href="http://www.mrlittlebig.com/blog/source/110520/jquery_mouseover_sample3.html" target="_blank">デモ</a></p>
<pre class="brush: jscript; title: ; notranslate">$(&quot;#over2 li&quot;).each(function(i){
	var color = $(this).attr(&quot;rel&quot;);
	$(this).css({backgroundColor:color});
	$(this).hover(function(){
		$(this).stop(true, false).animate({
			width:300,
			easing:&quot;easeOutCubic&quot;
		}, 300);
	}, function(){
		$(this).animate({
			width:100
		},{
			easing:&quot;easeOutCubic&quot;,
			duration:800
		});
	});
});</pre>
<p>動きにイージングを使用したかったので、jQueryのイージング用のプラグインを入れました。<br />
<a href="http://gsgd.co.uk/sandbox/jquery/easing/" target="_blank">jQuery Easing Plugin (version 1.3)</a></p>
<p>リストタグ li の幅を広げてアニメーションさせています。<br />
背景色はliの属性にrelを持たせて、その中で指定しています。<br />
【HTML】</p>
<pre class="brush: xml; title: ; notranslate">&lt;div id=&quot;over2&quot;&gt;
	&lt;ul&gt;
    	&lt;li rel=&quot;#006699&quot;&gt;リスト1&lt;/li&gt;
    	&lt;li rel=&quot;#cc3333&quot;&gt;リスト2&lt;/li&gt;
    	&lt;li rel=&quot;#66cc66&quot;&gt;リスト3&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt; </pre>
<p>確かに動きとしては出来たのですが、テキストの背景としてこの動きをさせたいです。<br />
しかし幅を0pxから100pxとかにしてしまうと色々おかしくなってしまうためこのままでは出来ません。</p>
<h3>背景画像のアニメーション</h3>
<p>で、色々考えたのですが、表示はほとんどこのままで背景画像を動かせばいいのでは、と思いました。<br />
最初はanimateの中に、backgroundPosition、を書いてみたのですが動きません。<br />
ググってみると、それをそのまま出来る様にするプラグインがあるようです。</p>
<p><a href="http://plugins.jquery.com/project/backgroundPosition-Effect" target="_blank">Background-Position Animations | jQuery Plugins</a></p>
<p>解説はこちらの記事にありました。</p>
<p><a href="http://www.webcreatorbox.com/tech/jquery-text-link-animation/" target="_blank">jQueryでテキストリンクのマウスオーバー時に動きをつける | Webクリエイターボックス</a></p>
<p>背景画像には以下のものを用意しました。<br />
<img src="http://www.mrlittlebig.com/blog/source/110520/images/bg.gif" alt="背景画像" title="背景画像" width="200" height="50" class="alignnone size-full wp-image-481" /><br />
これを右にスライドさせて実現する想定です。<br />
で、上記サイトを参考にさせてもらいつつ、出来上がったものが以下。</p>
<p><a href="http://www.mrlittlebig.com/blog/source/110520/jquery_mouseover_sample4.html" target="_blank">デモ</a></p>
<pre class="brush: jscript; title: ; notranslate">$(&quot;#over3 li a&quot;).each(function(i){
	$(this).hover(function(){
		$(this).stop(true, false).animate({
			backgroundPosition:&quot;(0px 0px)&quot;
		},{
			easing:&quot;easeOutCubic&quot;,
			duration:100
		});
	}, function(){
		$(this).animate({
			backgroundPosition:&quot;(-100px 0px)&quot;
		},{
			easing:&quot;easeInCubic&quot;,
			duration:600
		});
	});
});</pre>
<p>やはりもっと気持ちよくするには微調整がもろもろ必要っぽいですが、<br />
とりあえず、出来ました。</p>
<h3>まとめ</h3>
<p>jQueryを使えばいとも簡単に想定の動きを実現することが出来ました。<br />
JSの書き方も、多少のクセはあれど、ASを書いている感覚とそこまでかけ離れてはおらず、すんなり入れました。</p>
<p>ブラウザチェックなどが大変そうなイメージはありますが、動きの実現自体は比較的簡単に出来るんだな、と感じました。楽しい。<br />
もっとバリバリ使えるように勉強していきたいです。</p>
<p>とりあえず、開発環境を整えるところから始めなければ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/041/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instagram APIを触ってみる</title>
		<link>http://www.mrlittlebig.com/blog/040/</link>
		<comments>http://www.mrlittlebig.com/blog/040/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 08:48:41 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[instagram]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=429</guid>
		<description><![CDATA[InstagramのAPIが公開されましたね。 今のところ、登録して空くティベーとされた人から順次公開、といったプライベートベータ版らしいです。 内容の紹介はここで書いている方がおられます。早い。 公式のデモがここで公開 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/02/instagramapi.jpg" alt="" title="instagramapi" width="500" height="200" class="alignnone size-full wp-image-430" /></p>
<p><a href="http://instagr.am/">Instagram</a>のAPIが公開されましたね。<br />
今のところ、登録して空くティベーとされた人から順次公開、といったプライベートベータ版らしいです。<br />
内容の紹介は<a href="http://watcher.moe-nifty.com/memo/2011/02/instagram-api.html" target="_blank">ここ</a>で書いている方がおられます。早い。</p>
<p><span id="more-429"></span></p>
<p>公式のデモがここで公開されています。<br />
<a href="http://demo.instagram.com/">Instagram &#8211; Real-time updates demo</a><br />
それぞれの都市でアップロードされたものがリアルタイムに反映されます。</p>
<p>そんなわけで、僕もアクティベートされたので軽く触ってみました。<br />
ポピュラーになっている写真をダラダラ表示するだけのものです。</p>
<p><a href="http://www.mrlittlebig.com/instagram/popular_photo_sample/index.html" rel="shadowbox">popular_photo</a></p>
<p>手順は簡単で、同じようなAPIを触ったことがある方ならすぐにわかると思います。</p>
<p>１．APIにリクエストを送る<br />
２．返ってきたJSONを解析<br />
３．画像のURLなどを抜き出して、ロード<br />
４．表示</p>
<p><strong>※以下の内容は、2011/02/25現在のものです。APIの内容が変更になっている可能性がありますのでご注意下さい。</strong></p>
<h3>APIにリクエストを送る</h3>
<p><a href="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/02/instagramapi_img.jpg"  rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/02/instagramapi_img-150x150.jpg" alt="" title="instagramapi_img" width="150" height="150" class="alignleft size-thumbnail wp-image-468" /></a><a href="https://api.instagram.com/developer/">こちらのディベロッパー用のページ</a>にアクセスして、必要な手続きを行います。<br />
メニューのManageから、適当なアプリを作成すると、<br />
アプリのIDが取得できますので、そちらを使用します。</p>
<p>個人の投稿した写真を見る時や、コメントやライクを管理する際には、<br />
Aouth認証が必要となってきますが、<br />
ポピュラーの写真を見るだけの場合は特に認証は必要ありません。<br />
以下のアドレスから取得できます。</p>
<blockquote><p>https://api.instagram.com/v1/media/popular?client_id=CLIENT-ID</p></blockquote>
<p>CLIENT-IDは、先ほど取得たIDを入れてください。</p>
<h3>JSONを解析</h3>
<p>Flashからアクセスする場合、そのまま取得しようとすると、セキュリティサンドボックス侵害が出てしまいます。<br />
やはり、というべきでしょうか、Instagramにはcrossdomain.xmlは設置されていないようです。残念。<br />
なので、PHPなどを介して接続する事になります。<br />
結果のテキストを取得する際には、こちらの方法を使わせていただきました。<br />
<a href="http://blog.swee.jp/proto/2009/03/flashcrossdomainxml.html" target="_blank">Flashでcrossdomain.xmlを使わないでクロスドメインする</a><br />
※2/25 15:30現在、ページに繋がらなくなってしまっています。<br />
この記事ではURLを送るときにURLエンコードしないといけない、と書いてありますが、エンコードしなくても大丈夫でした。<br />
（POSTで送っているからかもしれないです。）</p>
<p>PHPは以下のようなものです。（POSTでの送信に変更しました）</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
    if(isset($_POST[&quot;url&quot;])) readfile($_POST[&quot;url&quot;]);
?&gt;</pre>
<p>AS内での記述は以下のような感じです。</p>
<pre class="brush: as3; title: ; notranslate">
var req:URLRequest = new URLRequest(&quot;proxy.php&quot;);
req.method = URLRequestMethod.POST;
var val:URLVariables = new URLVariables();
val.url = &quot;https://api.instagram.com/v1/media/popular?client_id=&quot; + &quot;CLIENT_ID&quot;;
req.data = val;
new loader = new URLLoader();
loader.load(req);
</pre>
<p>こちらを介することで、データを取得できます。</p>
<p>返って来るデータはJSONになっています。AS3でJSONを扱う場合、<a href="https://github.com/mikechambers/as3corelib" target="_blank">as3corelib</a>のライブラリを使用すると便利です。<br />
返って来るJSONは以下のような形式になっていました。<br />
長いです。</p>
<pre class="brush: plain; title: ; notranslate">
{
	&quot;meta&quot;: {
		&quot;code&quot;: 200
	},
	 &quot;data&quot;:
	[{
		&quot;tags&quot;: [],
		&quot;location&quot;: null,
		&quot;comments&quot;: {
			&quot;count&quot;: 17, &quot;data&quot;: [{
				&quot;created_time&quot;: &quot;1298443170&quot;,
				&quot;text&quot;: &quot;Nice&quot;,
				&quot;from&quot;: {
					&quot;username&quot;: &quot;xxx&quot;,
					&quot;profile_picture&quot;: &quot;xxx&quot;,
					&quot;id&quot;: &quot;xxx&quot;,
					&quot;full_name&quot;: &quot;xxx&quot;
				},
				&quot;id&quot;: &quot;xxx&quot;
			},
			{  ... },
			{  ... }]
		},
		&quot;filter&quot;: &quot;X-Pro II&quot;,
		&quot;created_time&quot;: &quot;1298443449&quot;,
		&quot;link&quot;: &quot;http://instagr.am/p/xxx/&quot;,
		&quot;likes&quot;: {
			&quot;count&quot;: 53,
			&quot;data&quot;: [ {
				&quot;username&quot;: &quot;xxx&quot;,
				&quot;profile_picture&quot;: &quot;xxx&quot;,
				&quot;id&quot;: &quot;xxx&quot;,
				&quot;full_name&quot;: &quot;xxx&quot;
			},
			{  ... },
			{  ... }]
		},
		&quot;images&quot;:
		{
			&quot;low_resolution&quot;: {
				&quot;url&quot;: &quot;http://distillery.s3.amazonaws.com/media/xxx/xxx.jpg&quot;,
				&quot;width&quot;: 306,
				&quot;height&quot;: 306
			},
			&quot;thumbnail&quot;: {
				&quot;url&quot;: &quot;http://distillery.s3.amazonaws.com/media/xxx/xxx.jpg&quot;,
				&quot;width&quot;: 150,
				&quot;height&quot;: 150
			},
			&quot;standard_resolution&quot;:{
				&quot;url&quot;: &quot;http://distillery.s3.amazonaws.com/media/xxx/xxx.jpg&quot;,
				&quot;width&quot;: 612,
				&quot;height&quot;: 612
			}
		},
		&quot;caption&quot;: {
			&quot;created_time&quot;: &quot;1298443492&quot;,
			&quot;text&quot;: &quot;xxx&quot;,
			&quot;from&quot;: {
				&quot;username&quot;: &quot;xxx&quot;,
				&quot;profile_picture&quot;: &quot;xxx.jpg&quot;,
				&quot;id&quot;: &quot;xxx&quot;,
				&quot;full_name&quot;: &quot;xxx&quot;
			},
			&quot;id&quot;: &quot;xxx&quot;
		},
		&quot;type&quot;: &quot;image&quot;,
		&quot;id&quot;: &quot;xxx&quot;,
		&quot;user&quot;: {
			&quot;username&quot;: &quot;xxx&quot;,
			&quot;profile_picture&quot;: &quot;xxx.jpg&quot;,
			&quot;id&quot;: &quot;xxx&quot;,
			&quot;full_name&quot;: &quot;xxx&quot;
		}
	},
	{ ... },
	{ ... }]
}
</pre>
<p>コメントやライク（いいね！）の情報が多く含まれていますので長く見えます。<br />
必要に応じて抽出してください。<br />
今回は、画像のパスとユーザーネーム、フィルタの種類、ライクの数、日付、本サイトへのリンクを使用しました。<br />
as3corelibを使用したパースの仕方は以下のようになります。</p>
<pre class="brush: as3; title: ; notranslate">var obj:Object = JSON.decode(_loader.data);
var arr:Array = obj.data;
for (var i:uint = 0; i &lt; arr.length; i++) {
	var d:Object = new Object();
	d.src = arr[i].images.standard_resolution.url; //画像のパス
	d.filter = arr[i].filter; //フィルタの種類
	d.link = arr[i].link; //インスタグラムのリンク先
	d.username = arr[i].user.username;  //ユーザーネーム
	d.likes = arr[i].likes.count; //いいねの数
	d.date = arr[i].created_time; //日付
	_data.push(d);
}</pre>
<h3>画像のロード</h3>
<p>あとは抽出した内容を元に画像をロードするだけですが、そのまま接続しようとすると、ここでもセキュリティサンドボックス侵害になります。<br />
ですので、テキストを取得したものとはまた別のPHPを使用してロードしました。<br />
<a href="http://quartz.maxar.jp/blog/flash/740.html" target="_blank">FlashでPerlを介した別ドメインのデータ取得方法(mimeType判別付き)  +PHP版 | maxar quartz</a><br />
送信方法をPOSTに変更したものが以下です。</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
if( $_POST[ &quot;file&quot; ] ) {
	header( &quot;Content-Type:image/jpeg;&quot; );
	readfile( $_POST[ &quot;file&quot; ] );
}
?&gt;</pre>
<p>以下のように使用します。</p>
<pre class="brush: as3; title: ; notranslate">new loader = new Loader();
var req:URLRequest = new URLRequest(&quot;proxy.php&quot;);
req.method = URLRequestMethod.POST;
var val:URLVariables = new URLVariables();
val.file = &quot;画像のURL&quot;;
req.data = val;
loader.load(req);</pre>
<h3>表示</h3>
<p>あとは、ユーザーネームなどの情報をテキストと画像を表示させて終わり、です。</p>
<h3>まとめ</h3>
<p>もっと色々利用しよう思うとAouth認証が必要になるのですが、Flash単独での利用は不可能なので、なにかしらのプログラムが必要になります。<br />
公式で、PYTHONとRUBYのライブラリが用意されているようですので、これを利用すれば便利かもしれません。<br />
AIRなどで使用できれば、Instagramの管理用ソフトが作れたりできそうです。<br />
ただし、写真投稿のAPIは公開されておらず、iPhoneの公式アプリからのみ、となるようです。<br />
（それが出来たらアプリが作られてしまうだろうし）<br />
まだまだ公開されたばかりですので、今後もっと面白くなりそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/040/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>パーティクルでトランジション</title>
		<link>http://www.mrlittlebig.com/blog/039/</link>
		<comments>http://www.mrlittlebig.com/blog/039/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 06:14:08 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[as3]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=400</guid>
		<description><![CDATA[なんか作りたくなったので作ってみた。 particle_transition だいたいの流れとしては、 1) 画像の読み込み 2) ビットマップに変換 3) 色情報からドットを打つ 4) それぞれのドットを動かす 5)  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mrlittlebig.com/lab/particle_transition.html" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/01/img2.jpg" alt="パーティクルでトランジション" title="img2" width="163" height="163" class="size-full wp-image-405" /></a></p>
<p>なんか作りたくなったので作ってみた。</p>
<p><a href="http://www.mrlittlebig.com/lab/particle_transition.html" rel="shadowbox">particle_transition</a></p>
<p><span id="more-400"></span></p>
<p>だいたいの流れとしては、</p>
<p>1) 画像の読み込み<br />
2) ビットマップに変換<br />
3) 色情報からドットを打つ<br />
4) それぞれのドットを動かす<br />
5) 1に戻る</p>
<p>サイズは320&#215;320なので、102400パーティクル。<br />
全てを一度に動かしているわけではないので、なんとか動いています。<br />
低スペックだときついかもしれません。<br />
最適化とかはなんもしてません。</p>
<p>パーティクルの動かし方は、基本なのかもしれないけれど、<br />
bitmapDataにsetPixel()して打っています。<br />
さくーしゃさんの雪のやつが参考になります。<br />
<a href="http://wonderfl.net/c/g9s1" target="_blank">Snow &#8211; wonderfl build flash online</a></p>
<p>ドットの位置情報だけ覚えておいて、一旦黒で消したあと情報を更新して、再度、ドットを打つ、という流れです。<br />
ただし、この方法だと、全体を不透明のビットマップで覆ってしまうので、その下のレイヤーを透けさせることが出来ません。<br />
ほんとは、トランジションの際は写真の上から覆いかぶさるようにパーティクルを降らしたかったんだけど、やり方がわかりませんでした。</p>
<p>flickrは以下を参考にしました。<br />
<a href="http://blog.sinap.jp/2009/06/flickr-flash-vol1-api-key.html" target="_blank">Flickr Flash 連携 vol1 〜API Key作成〜</a><br />
<a href="http://blog.sinap.jp/2009/07/flickr-flash-vol2-api.html" target="_blank">Flickr Flash 連携 vol2 〜APIへの接続方法〜</a><br />
<a href="http://blog.sinap.jp/2009/08/flickr-flash-vol3-flash.html" target="_blank">Flickr Flash 連携 vol3 〜Flashへ写真の読み込み〜 &#8211; SINAPlog</a><br />
このまま作っていると、サーバーにアップした時点で、セキュリティサンドボックス侵害で怒られてしまいます。<br />
一瞬、ＰＨＰなどでプロキシを作ってやらないといけないかと思ったのですが、Flickrにはcrossdomain.xmlが設置してありました。<br />
<a href="http://www40.atwiki.jp/spellbound/pages/163.html" target="_blank">ActionScript入門Wiki@rsakane &#8211; Flickrから画像を読み込む</a><br />
<a href="http://www.mousouchiku.net/blog/2009/05/13-014911.php" target="_blank">[AS2]Flickr API経由で取得した画像がFlashで表示されない | モウソウチク日記</a><br />
ＵＲＬを直接叩いてみると、farmは6まであったので全部読み込ませています。</p>
<p>そんな感じです。</p>
<p>別の動きのパターンも作ってみました。<br />
<a href="http://www.mrlittlebig.com/lab/particle_transition2.html" rel="shadowbox">particle_transition2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/039/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flashでブラウザにドロップされた画像を表示</title>
		<link>http://www.mrlittlebig.com/blog/038/</link>
		<comments>http://www.mrlittlebig.com/blog/038/#comments</comments>
		<pubDate>Sun, 16 Jan 2011 07:00:39 +0000</pubDate>
		<dc:creator>USK</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.mrlittlebig.com/blog/?p=394</guid>
		<description><![CDATA[最近はHTML5が盛り上がってますが、なんかの記事で、 HTML5はブラウザにファイルをドロップして認識できる、みたいな事を見ました。 それを使ったら、ブラウザに画像をドロップして、それをFlashに渡して表示、とか出来 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mrlittlebig.com/lab/filedrop.html" rel="shadowbox"><img src="http://www.mrlittlebig.com/wordpress/wp-content/uploads/2011/01/img3.jpg" alt="ファイルをドロップ" title="img3" width="250" height="150" class="alignnone size-full wp-image-413" /></a></p>
<p>最近はHTML5が盛り上がってますが、なんかの記事で、<br />
HTML5はブラウザにファイルをドロップして認識できる、みたいな事を見ました。</p>
<p>それを使ったら、ブラウザに画像をドロップして、それをFlashに渡して表示、とか出来るんじゃね？<br />
と、思い、作ってみました。</p>
<p><span id="more-394"></span></p>
<p>まずはどうやるのかが全くわからなかったので、ググってみました。<br />
すると、KAYACさんの記事に行き当たりました。<br />
<a href="http://level0.kayac.com/2010/05/flasherhtml5flash.php" target="_blank">FlasherがHTML5で遊んだらこうなった（Flashにファイルをドロップ！） | エントリー | _level0.KAYAC | flash ActionScript blog</a><br />
えー、正にそのままやられちゃってる感じですね…。<br />
でもまぁ、勉強って事でやってみよう、と軽い気持ちで。<br />
KAYACさんの記事のサンプルのリンクも切れてるみたいですし。</p>
<h3>完成品</h3>
<p>まずは完成品の紹介から。</p>
<p><a href="http://www.mrlittlebig.com/lab/filedrop.html" target="_blank">file drag-n-drop</a></p>
<p>動作環境</p>
<blockquote><p>Firefox3.6 以上<br />
FlashPlayer 9 以上
</p></blockquote>
<p>画像（jpg,gif,png)をブラウザ内にドラッグ＆ドロップすると画像が表示されます。<br />
複数毎一辺にドロップするとスライドショーになります。<br />
その際、左下にその画像の情報が表示されます。</p>
<h3>基本的な流れ</h3>
<p>ブラウザにドロップされた画像のバイナリデータを取得<br />
↓<br />
JS経由でFlashに渡す<br />
↓<br />
Flash側でbase64形式にデコードする<br />
↓<br />
画像として再現、表示</p>
<h3>HTML5</h3>
<p>（詳しいソースは実際のサイトを見てください。）</p>
<p>まず、ブラウザにドロップされた画像の情報を取るところから始めます。<br />
ドロップされた情報を取得するには、HTML5のFile apiを使用します。<br />
しかしこのFile api、まともに対応しているブラウザがFire Foxの3.6以上しかありません。<br />
このサイトで使用中のブラウザのFile API対応状況がわかります。<br />
<a href="http://www.html5.jp/tutorial/apicheck/FileAPI.html" target="_blank">File API &#8211; HTML5 API チェッカー</a></p>
<p>ドロップの際の処理は以下のサイトを参考にさせて頂きました。<br />
<a href="http://jsdo.it/johnconner/9cId" target="_blank">ファイル読み込み：ブラウザ外からドラッグアンドドロップ &#8211; jsdo.it</a><br />
<a href="http://ayuta.co.jp/html5-samples/file/simple/file.html" target="_blank">File APIのサンプル &#8211; 株式会社あゆた</a><br />
<a href="http://d.hatena.ne.jp/shibason/20100111/1263191021" target="_blank">W3C File APIを使ってJavaScriptでファイル加工 &#8211; しばそんノート</a></p>
<p>しかし、ファイルのバイナリデータを取得する際に、file apiの、FileReaderクラスを使用したところ、<br />
内容が文字化けした上に、フラッシュに渡した瞬間にFlashPlayerが落ちてしまいました…。</p>
<p>そこでさらにググってみると、さらにわかりく書かれた記事を発見。<br />
<a href="http://jumble.at.webry.info/201005/article_1.html" target="_blank">画像アップロード jumble/ウェブリブログ</a><br />
この中ではFireFoxでの方法でも３つのやり方がかかれている。<br />
このうちの三つめが、上記の文字化けした方法。<br />
FireFoxの設定を変えないと使えない、とかはちょっと敷居が高すぎるので却下。<br />
そのうち二つはFireFox独自の方法らしいけれど、ファイルのドロップですでにFireFox限定となっているので、そこは問題なし。<br />
なので、より記述が少ない、「その２」で今回は設定した。<br />
この方法を使ってみると、一発で取得できました。</p>
<p>また、同時にドロップされた画像の情報も取得していますが、これは、まだまだ策定中らしく、<br />
リファレンスにあるのに実装されてなかったり、書き方が違ったり、とまちまち。<br />
<a href="http://www.w3.org/TR/FileAPI/" target="_blank">File APIの策定</a><br />
なので、とりあえず取得するようにしておいて、取得できたものだけ、表示するようにしておいた。<br />
lastModifiedDate や creationDate は、上記リファレンスには載っていたけど、Firefoxがまだ実装してないみたい。<br />
どれが実装されてるかは、前述のチェッカーで。</p>
<p>取得できたら、後はExternalInterface経由でデータをswfに渡すだけ。</p>
<h3>Flash</h3>
<p>Flash側はそんなに難しくないです。<br />
HTML側から受け取った画像のバイナリデータをFlash内で扱えるようにBase64デコードします。<br />
これは、flexのSDKに入っている、mx.utils.Base64Decode、というクラスがやってくれます。<br />
Flashしか入れてない場合はFlexSDKをダウンロードしてやる必要があります。</p>
<p><a href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK" target="_blank">Flex SDK</a></p>
<p>これを使用して、base64にデコードしたら、Loaderクラスで、loadBytes()してやれば、画像にしてくれます。<br />
以下、その部分の抜粋コードです。</p>
<pre class="brush: as3; title: ; notranslate">
var src:String = data; //これをバイナリデータとする
var base64:Base64Decoder = new Base64Decoder();
base64.decode(src);
var byte:ByteArray = base64.toByteArray();

var _loader:Loader = new Loader();
_loader.loadBytes(byte);
_loader.contentLoaderInfo.addEventListener(Event.INIT, loadComplete);

function loadComplete(e:Event):void {
 this.addChild(_loader);
}
</pre>
<p>あとは、複数の画像を処理出来るようにしたり、情報をテキストでパラパラでるように調整したり、<br />
という事をしています。</p>
<h3>まとめ</h3>
<p>HTML5とFlashはライバル視される事が多いですが、<br />
お互いの特徴を生かして補完しあえばもっと面白いことができそうだな、と思いました。<br />
まだまだ一部のブラウザでしか実装がされていないため、実践投入は出来ませんが、今後の展開に期待したいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mrlittlebig.com/blog/038/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

