久しぶりにmixiアプリの事を調査したよ。

多分日頃からOpenSocial開発をしてる人には当たり前のことなんだろうけど
ぐぐってもわからなかったので。。

iframeで外部ページを埋め込めるか?

mixiアプリはそもそもiframe内にgadget.xmlをキャッシュされた状態で起動する。

つまり、mixi.jp内のページにmixi-platform.comにキャッシュされたコンテンツを表示していて
さらにその中で別ドメインなコンテンツを表示できるのか?

結論としてはできる。 ただ外部ページからではOpenSocialAPIに接触しようがないから、不便は不便。

iframeの中にfacebookアプリを埋め込んだりもできたよ。
でもmixiアプリ上で認証させるのは多分規約違反。

iframeで外部コンテンツを表示するっていう作法も、外部サイトへの遷移の規約に従ってない気がするのでアウトかな?

どうでしょう?

Flashから外部コンテンツとの通信

OpenSocialのFlash埋め込みAPIを使って、配置したSWFから
URLLoaderなんかを使って普通にクロスドメインな通信ができるかチェック。

これもできる。相手のサーバから拒否されてなければ。

JavaScriptはXHRを使えないから(ひょっとして使える?)、makeRequestするわけだけど
Flashは普通に通信できるなら、mixiアプリは開発しやすさで言えばFlashで作るに限るってことかなぁ。

makeRequestはoAuthの署名リクエストが使えるので、通信にセキュリティを保証したい場合は有効だと思う。

Posted in actionscript3.0, javascript at 11月 19th, 2009. No Comments.

ブログパーツのようなFlashで、いろいろなサイトに埋め込まれるSWFの 埋め込まれているページのURLを取得する方法。

  1. import flash.external.*;
  2. var locationHref:String = String(ExternalInterface.call("function(){return location.href}"));


ExternalInterface.callの1番目の引数は、呼び出すJavaScriptのメソッド名という事になっていますが

  1. ExternalInterface.call("myMethod","args1","args2");


は単純に以下のようなJSが実行されているものと考えられるので

  1. eval("myMethod").apply(window,["args1","args2"]);


まぁ、ようするに無名関数をFlash側で引数としてあげればいいと。

Posted in actionscript2.0, actionscript3.0, flash, javascript at 8月 30th, 2008. No Comments.

※2008/01/24に一部加筆しました。 この記事の値のコピーについて誤った記述がありましたので 文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会

しかし、この説明では一つ問題があります。 なぜなら、JavaScriptやActionScript3のString型は、プリミティブ型ではあるものの、変数のコピーは値コピーではなく参照コピーになるからです。それどころか、ActionScript3では全てのプリミティブ型のコピーは参照コピーになるようです

こちらの記事を是非合わせてお読みいただくことをおすすめします!!

コリン・ムック「今から始めるActionScript 3.0」に行ってきました。

http://www.event-web.net/as3/ 今コリン・ムックのレクチャーから帰ってきました。

初心者向けのレクチャーではありましたが、9時間の長丁場。 内容の方は、ビギナー向けということもあり易しめで、難しいところもありませんでした。 コリン節を堪能してきましたよ。

僕はAS2.0の時に、コリン氏のMVC Clockのソースを穴があくほど読んで、初めてMVCという概念を勉強したので師匠を拝むような気持ちでした。

で、基本的には「ActionScript3でどうやってアプリケーションを開発していくか」という課題をひとつのサンプルアプリを通して、疎結合に作っていく大切さを表現していました。

前半はAS3の言語的な部分に多く触れ、後半はMVCやディスプレイオブジェクト、イベントなどの実装寄りな話。

コリン氏は「変数」と「オブジェクト」の関係を正しく理解してもらいたいと何度か言っておりました。

そのわかりやすさに衝撃を受けたので、メモします。

  • 「変数には値そのものが格納されているわけじゃない。変数は値の参照を持っているだけ」
  • 「変数はコンテナではない。参照を持つ事のみ可能。本来のコンテナはシステムメモリ」

と同じことを何度もいっていたので、よほど覚えて帰ってほしかったのでしょう。

例えばプリミティブ型(NumberやString)では

  1. var a = "dog";
  2. var b = a;


としたとき、「dog」というオブジェクトがコピーされています。

object_1.gif

追記: 文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会の記事を参照してください。

  1. a = "cat";
  2. trace(a); // output 'cat'
  3. trace(b); // output 'dog'


この時2つの変数の間でオブジェクトは共有されていません。

では、複合データ型の場合

  1. var a = [0,1,2,3];
  2. var b = a;
  3.  
  4. a[0] = 10;
  5. trace(a); // output '[10,1,2,3]'
  6. trace(b); // output '[10,1,2,3]'


object31.gif

2つの変数は同じオブジェクトを参照しています。 ここまでは問題ないかと。

ではさらに突っ込んで、「参照」とは何かを説明すると

  1. a = null;
  2. trace(b); // output '10,1,2,3'


これはちょっと変だと思う人もいるかも。 nullはオブジェクトを捨てる事ではなく、参照を切るだけ

object3.gif

図を見ると、「変数a」と「配列[10,1,2,3]」を繋ぐ線が消えただけだということが良くわかる。変数が持っているのは、この「線」の部分だけだということ。

では

  1. b = null;


とすると、オブジェクト[10,1,2,3]は消えたのでしょうか? 答えはノーです。

object4.gif

どの変数からも参照されなくなったオブジェクトはやがてメモリから捨てられます。 これをガベッジコレクションといいますが、どの変数からも参照されなくなった時点で削除されるのではなく、捨てる準備。捨ててもいいよというマークがされて適当な時にGCされます。

その適当な時とは? コリン氏がいうには、ロードをやめたり、重い処理をストップさせたりした場合らしいです。

AS3ではビルトインではないけれど、強制的にガベッジコレクションを実行するハックもあるので それを使うのもありですかね。

http://www.gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html

個人的にこのオブジェクトの話は、わかってはいても人に説明しづらい。理解したつもりでも、なんかずれていた。という経験があるので、この参照を矢印で表現する図解はためになりました。

今日のレクチャーの内容は http://moock.org/lectures/groundUpAS3/にあります。

--

追記: コリン・モック氏本人がレクチャーで使っていた図解は http://moock.org/lectures/groundUpAS3/の ・copies and references ・multiple references to the same object にありました。 SWFなのでクリックして紙芝居的に挙動が確認できます。

Posted in actionscript3.0, 日記 at 1月 15th, 2008. 2 Comments.

Flvプレーヤーにシーク機能を付けたいのですが・・

このフォーラムで、シーク機能について質問が投げられていたので作ってみた。

Flex2でFLVプレイヤーを作ろうと思ったら、ボタンなどの標準コンポーネントを使って 簡単に実装できちゃうんですが、シークバーはちょっとポイントが要ります。 でもだからといって、コンポーネントを作らないといけないわけじゃなくて、 HSliderとスクリプトだけでなんとかできちゃいます。

flvplayer_cap.jpg

こんな感じになる。それっぽいでしょ?

コントローラを配置

まずはFLVを表示するためのVideoDisplayクラスと シークするためのHSliderクラスを準備

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  3.   <mx:VBox width="100%" height="100%">
  4.     <mx:VideoDisplay id="myVD" width="100%" height="100%" source="your.flv" />
  5.         <mx:HSlider id="myHS" width="100%" />
  6.   </mx:VBox>
  7. </mx:Application>


FLVの再生位置とシークバーを同期させる

これだけでもFLVは再生されるので、再生されている位置とシークバーを同期させてみます。 ここからは基本的に編集するのはHSliderのみ

  1. <mx:HSlider id="myHS"
  2.   width="100%"
  3.   minimum="0"
  4.   maximum="{myVD.totalTime}"
  5.   value="{myVD.playheadTime}"
  6. />


スライダーの最小値と最大値を決定します。 最大値にビデオの総時間をバインディングされるようにしておき さらにビデオの再生位置に変更があるたびに、スライダーの値とビデオの再生時間が同期するように仕込む。 これで、再生時間 / 総再生時間みたいなことを気にしないでも、スライダーが勝手に計算してくれます。

スライダーからの変更をビデオに反映する

次にスライダーからビデオの再生位置を変更できるようにします。 HSliderに次の行を追加します。

  1. change="{ if(myVD.stateResponsive) myVD.playheadTime = myHS.value }"


VideoDisplay#stateResponsiveはビデオが応答可能かどうかの判定メソッドです。 まだ動画がロードされていなかったり、ビジーな状況を回避しつつ スライダーのvalueをそのままビデオの再生位置時間に代入します。 これはスライダーとビデオの扱う単位を「秒」で揃えているから可能になっています。 Flexでは往々にして、コントロール間で扱う単位を揃えたり 中間に変換するアダプターメソッドを噛ますと、生産性があがりますね。

見た目や精度を向上する

さて、ここまでで一応実装完了しているのですが 使ってみると、ドラッグ中はビデオに再生位置が反映されなかったり 再生位置をスライダーのつまみの位置だけで確認しなければならなかったり ちょっと不親切です。

HSliderにさらに、下の処理を追加。

  1. liveDragging="true"
  2. showTrackHighlight="true"


Slider#liveDraggingは、つまみのドラッグ中にもchangeイベントを発行しつづけるためのフラグです。 Slider#showTrackHighlightは、スライダーの始点からつまみまでを色つけするスタイルプロパティ。

完成

以下は全コードです。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  3.   <mx:VBox width="100%" height="100%">
  4.     <mx:VideoDisplay id="myVD"
  5.       source="your.flv"
  6.       width="100%" height="100%"
  7.     />
  8.     <mx:HSlider id="myHS"
  9.       width="100%"
  10.       maximum="{myVD.totalTime}"
  11.       minimum="0"
  12.       value="{myVD.playheadTime}"
  13.       change="{ if(myVD.stateResponsive) myVD.playheadTime = myHS.value }"
  14.       liveDragging="true"
  15.       showTrackHighlight="true"
  16.     />
  17.   </mx:VBox>
  18. </mx:Application>


Posted in actionscript3.0, flex, 日記 at 12月 27th, 2007. No Comments.

FlexでXMLSocketする必要があったので、テスト用にサーバを書いてみたよ。 自信はないので、1%も保証はないけど一応動く。

sockettest1pnf.png

sockettest2.png

ソースファイル

まずはRubyのソース

Read More...

Posted in actionscript3.0, flex, ruby, 日記 at 10月 30th, 2007. No Comments.
  1. import mx.logging.ILogger;
  2. import mx.logging.Log;
  3.  
  4. var logCategoryName:String = "ConnectionLog"
  5.  
  6. var logger:ILogger = Log.getLogger(logCategoryName);
  7. logger.info('connect..');
  8. logger.error('connect error..');
  9. logger.worn('connect worn');
  10. logger.fatal('connect fatal');


こんな感じ?

ログレベルは fatal < worn < error < info

僕は各クラスごとにログカテゴリを設定してるんで、全エントリーを使って コンストラクタん中で、こんな感じに。

  1. var logger:ILogger = Log.getLogger( describeType(this).@name.toString().match(/::(.*)/)[1] );


あとは、環境によって、TraceとかLocalConnectionとか、ログの出力方法を切り替えたいなと。

mx.logging.targetsあたりを弄るのかな?

Posted in actionscript3.0, flex, 日記 at 10月 24th, 2007. No Comments.

こんな感じ?

  1. import flash.utils.describeType;
  2. String(describeType(this).@name).match(/::(.*)/)[1];


Posted in actionscript3.0, 日記 at 10月 24th, 2007. 1 Comment.

ActionScript3.0 Animation Making Things Move!を読み始めました。 英語よめねー。

で、読んでいるうちに何か作りたくなったので 簡単にこさえてみた。お絵かきツール。 実はFlashでお絵かきツールって作ったこと無かったのよねぇ。

下の灰色四角の中でマウスをクリックすると線が描けます。

概要

  1. マウスを押したら、描画開始
  2. マウスを放すまで、描画しつづける
  3. マウスを放したら、描画終了

と、誰が作ってもこんな感じだと思います。 1時間くらいで作れるように、あまり機能は求めません。

作ったクラスは

paint.Paint お絵かきツールのメインクラス

paint.Background 背景

paint.Canvas 絵を描くカンバス

paint.Brush ブラシ。サイズとか色とか

本当は背景クラスはカンバスを継承した方がいいような気がしますが それは今後追求したくなったら、やろう。

おソース

  1. /**
  2. * お絵かきツールのメインクラス
  3. * @author mitsuru.haga@gmail.com
  4. * @version 0.1
  5. */
  6.  
  7. package paint {
  8.  
  9.     import paint.*;
  10.     import flash.display.Sprite;
  11.     import flash.events.*;
  12.  
  13.     public class Paint extends Sprite{
  14.  
  15.         //  ブラシ
  16.         protected var brush:Brush;
  17.  
  18.         //  ブラシコレクション
  19.         protected var brushCollection:Array = [];
  20.  
  21.         //  カンバス
  22.         protected var canvas:Canvas;
  23.  
  24.         //  背景
  25.         protected var background:Background;
  26.  
  27.         /**
  28.         * コンストラクタ
  29.         */
  30.         public function Paint(){
  31.             initialize();
  32.         }
  33.  
  34.         /**
  35.         * 初期化
  36.         * @return
  37.         */
  38.         protected function initialize():void{
  39.  
  40.             //  ブラシを配列にどんどん追加
  41.             brushCollection.push( new Brush( 'Red', 5, 0xFF0000 ) );
  42.             brushCollection.push( new Brush( 'Blue', 5, 0x0000FF ) );
  43.             brushCollection.push( new Brush( 'Green', 5, 0x00FF00 ) );
  44.  
  45.             //  ランダムにブラシを決定する
  46.             brush = brushCollection[ uint( Math.random()*brushCollection.length ) ];
  47.  
  48.             //  背景を作る
  49.             background = new Background();
  50.             background.buttonMode = true;
  51.             background.width = stage.stageWidth;
  52.             background.height = stage.stageHeight;
  53.             background.addEventListener( MouseEvent.MOUSE_DOWN, onCanvasMouseDownHandler );
  54.             background.addEventListener( MouseEvent.MOUSE_UP, onCanvasMouseUpHandler );
  55.             addChild( background );
  56.  
  57.             //  カンバスを作る
  58.             canvas = new Canvas();
  59.             canvas.addEventListener( MouseEvent.MOUSE_DOWN, onCanvasMouseDownHandler );
  60.             canvas.addEventListener( MouseEvent.MOUSE_UP, onCanvasMouseUpHandler );
  61.             addChild( canvas );
  62.  
  63.         }
  64.  
  65.         /**
  66.         * マウスを押した場合
  67.         * 線を描く準備
  68.         * @param    e
  69.         * @return
  70.         */
  71.         protected function onCanvasMouseDownHandler( e:MouseEvent ):void {
  72.             trace( 'draw start' );
  73.             brush = brushCollection[ uint( Math.random()*brushCollection.length ) ];
  74.             canvas.graphics.lineStyle( brush.thickness, brush.color, 1 );
  75.             canvas.graphics.moveTo( mouseX, mouseY );
  76.             canvas.addEventListener( Event.ENTER_FRAME, drawingHandler );
  77.         }
  78.  
  79.         /**
  80.         * マウスを放した場合
  81.         * 線を描くの終わり
  82.         * @param    e
  83.         * @return
  84.         */
  85.         protected function onCanvasMouseUpHandler( e:MouseEvent ):void {
  86.             trace('draw finish');
  87.             canvas.graphics.endFill();
  88.             canvas.removeEventListener( Event.ENTER_FRAME, drawingHandler );
  89.         }
  90.  
  91.         /**
  92.         * マウスを押している間
  93.         * 線を描き続ける
  94.         * @param    e
  95.         * @return
  96.         */
  97.         protected function drawingHandler( e:Event ):void{
  98.             trace('drawing');
  99.             canvas.graphics.lineTo( mouseX, mouseY );
  100.         }
  101.     }
  102.  
  103. }


感想

ふーん、実に簡単。 気分が乗ったら、Flexのコンポーネントにするくらいの事をしてみたい。 最近Flexばかりだったけど、素のActionScript3ってのも漢らしくていいなと最近思う。

ダウソ

ソースファイル

Posted in actionscript3.0, flash, 日記 at 10月 4th, 2007. 2 Comments.

FlashCS3のIDE上で、フォントシンボルを使った埋め込みフォントが、全く上手く行かなかったので 対処法を探しました。いやーハマった。

まず何も考えずに僕が試した方法は、以下の通り。 Flash8の感覚でやると、こうではなかろうか?

間違った方法

  1. import flash.text.*;
  2.  
  3. //  テキストフォーマットを作成
  4. var format:TextFormat = new TextFormat();
  5. format.size = 30;
  6. //フォントをリンケージ名で指定する
  7. format.font = 'MyFont';
  8.  
  9. //  テキストフィールドを作成
  10. var field:TextField = new TextField();
  11. field.defaultTextFormat = format;
  12. field.embedFonts = true;
  13. field.antiAliasType = AntiAliasType.ADVANCED;
  14. field.text = 'テスト';
  15.  
  16. //  ステージに配置
  17. addChild( field );


そして、ライブラリに「新しいフォント」シンボルを作る、 埋め込むフォントを指定して、リンケージを設定だ。

fontsymbol1.png

fontsymbol2.png

これでコンパイルすると、フォントが表示されません。。

調べた

で、調べてみるとあった。

Font embedding problems in Flash CS3 IDE

ざっくりと呼んでみると Font.enumerateFonts()で埋め込んだフォントを調べてみると フォントの名前がリンケージ名じゃないから TextFormat.fontでリンケージ名を指定しても、フォントが見つからないって寸法だ。

やってみた

それを回避するための方法が以下

  1. //FontクラスのサブクラスMyFontからフォント名を取得
  2. format.font = new MyFont().fontName;


fontsymbol3.png できた!

ライブラリにフォントシンボルを作って、リンケージを指定するときに ベースクラスがflash.text.Fontだった事に気づいていると思う。 CS3では、リンケージ名=クラス名だから、クラスのインスタンスプロパティを使ってあげれば良いという事になる。

Posted in actionscript3.0, flash, 日記 at 10月 3rd, 2007. No Comments.

Ruby on RailsとAdobe AIRでデスクトップアプリを作る 第1回:付箋紙アプリケーションを作ろう! http://www.thinkit.co.jp/free/article/0709/3/1/

はてブで注目エントリーになってた。 僕が登録した時にはまだ1桁だったのだが、RailsとAIRのお手軽な組み合わせに注目している人が多いという事の表れか?

scaffold_resourceなんて知らなかったなぁ。

そろそろAIRとRoRでなんか作っておかないと時代に乗り遅れると思いつつ。 おもしろいもん作ろうと思って、始める前から挫折している自分ガイル。

やっぱ付箋くらいが妥当だよな。

Posted in actionscript3.0, air, ruby on rails, 日記 at 9月 6th, 2007. No Comments.