Archive for the ‘Flex’ Category

9月
23

久々にFlexネタです。いまさらですが、SDK 3.4がリリースされたのでアップグレードしようと思います。やり方は今までと同じだろうと、過去の記事を探したのですが、書いてなかったのであらためてメモしておきます。

ダウンロード

まずは、SDKのダウンロードです。Download Flex 3 – Flex SDK – Confluenceよりダウンロードします。ダウンロードしたファイルはflex_sdk_3.4.0.9271.zipです(2009/9/23時点)。

ダウンロードしたzipファイルを任意の場所に解凍します
以降、<sdkインストールルート>とします。

Flex Builderの設定

次に、Flex Builderに開発に利用するSDKの設定をします。EclipseプラグインのFlex Builder 3.0を利用していますので、Eclipseメニューから「Preferences…」を選択します。

menu

以下のような画面が表示されますので、左ペインより、「インストールされている Flex SDK」を選択します。

Preferences画面(追加前)

Preferences画面(追加前)

インストール済のSDKの一覧が表示されます。「追加」ボタンをクリックすると、「Flex SDK を追加」画面が表示されます。

add

「Flex SDK の場所」に<sdkインストールルート>を設定すると、「Flex SDK 名」は自動的にセットされるので、そのまま使いました。「OK」ボタンをクリックすると追加したSDKが一覧に表示されるようになります。

Preferences画面(追加後)

Preferences画面(追加後)

追加したSDKにチェックを付け、デフォルトで使用するSDKとして設定すれば完了です。

補足

今回のSDKのバージョンアップには、重要なアップデートが含まれています。

Adobe、『Flex』を更新し XSS 脆弱性に対応 – japan.internet.com Webテクノロジーなどで取り上げられているように、SDKに同梱されている「index.template.html」XSSの脆弱性対応が含まれています。

「index.template.html」はprojectをビルドした時に作成される、swfファイルを呼び出すためのhtml(ラッパーhtml)のテンプレートとなるファイルです。

作業内容は、下記の 2 つのファイルを見つけて、

* %Flex SDK%\templates\express-installation\index.template.html
* %Flex SDK%\templates\express-installation-with-history\index.template.html

以下の作業を行う、というものです。

1. var MMredirectURL = window.location; と書かれた行を探す
2. それを var MMredirectURL = encodeURI(window.location); と書き換える
3. index.template.html ファイルを保管する

Flex SDK 3.4 公開 – akihiro kamijoより引用。

古いバージョンのSDKを利用している場合には、この対応をしないと脆弱性が残ったままになってしまうので要注意です。URLエンコードがされてなかったといった、非常に単純な内容ですが、重要な更新となっています。

SDK 3.3以前のバージョンで作成されたラッパーhtmlを既に公開、ご利用されいてるかたは、脆弱性が残ったままですので、大至急、本対応を実施することをオススメします!

2月
24

1年ぶりぐらいにFlex User Groupの勉強会に参加させていただきました。

内容は、Adobe MAX Japan 2009での講演のおさらいと、持ち時間を10分切り上げられMAXではできなかったデモの続きでした。MAXには参加できなかったので、こういったイベントは非常にありがたいです。

あと感じたのは、以前よりもずっとAdobeさんのサポート体制が確立されてきたように思いました。Flex User Groupを盛り上げている1つの要因だと思います。

Adobe Flash CatalystとFlex Builder4(コードネームGumbo)のPreview版のDVDをいただきました。

Mac版しかないって話でしたが、Flex Builder4はWindows版も入ってました。

勉強会で使用された資料とデモアプリのソースが講演者でもあるtaigaさんのブログにアップされていました。
Flex 3 勉強会 第 64 回@東京 発表資料 – blog.taiga.jp

■Flex User Groupのサイト
– Flex User Group
■Catalystのサイト
Adobe Labs – Adobe Flash Catalyst
■Gumboのサイト
Adobe Labs – Gumbo MAX Preview

2月
17

Cocomo ベータのコードネームがAdobe Flash Collaboration Service ベータに変更になりました。

As we get closer to offering the service commercially, we knew it was time to adopt a corporate name. We believe the Platform as a Service we’re making should be in the toolbox of any Flash/Flex developer, so we wanted “Flash” in the name. From there, it was a matter of describing what the offering is : Adobe Flash Collaboration Service.

Collaborative Methods: Cocomo is now Adobe Flash Collaboration Service. Let’s Talk Roadmaps.より引用。

Adobe labのURLも変更になっています。
Flex, RIA | Adobe Labs – Adobe Flash Collaboration Service

SDKも変更されていました。

設定手順は前回と同様ですが、ライブラリ名がcocomo.swcからafcs.swcに変わってました。

・「ライブラリパス」にafcs.swcを追加します。

・「ソースパス」にSDKのソースフォルダを設定します。

後はサンプルプロジェクトが3つほど増えてました。

  • MultipleSessions
  • PeerToPeerRtmfp
  • zoomlayout

さらっと見て、気づいたのはそんなところですね。Adobeのクラウド戦略がいよいよ本格化していきそうで今後の動向が楽しみです!

2月
05

2008年12月に公開されたLinux版AIRランタイムをopenSUSE 10.3にインストールして自作AIRアプリを実行してみました。

これで AIR がサポートするプラットフォームに Fedora 8, Ubuntu 7.10, Open Suse 10.3 が追加されたことになります。他の Linux ディストリビューションでも rpm か Debian パッケージマネージャをサポートするものでは動作させることは可能だと思います。

akihiro kamijo: Linux 用 AIR 1.5 公開より引用。

openSUSEはMac上でVMware Fusion2.0を使って稼動させています。デスクトップインターフェイスはGNOMEにしています。

まずは、Linux版AIRランタイムのインストールです。いつものように、Adobe – Adobe AIRからインストーラをダウンロードします。

デスクトップにダウンロードしました。

このアイコンをダブルクリックしても、以下のようなエラーが出て実行できません。

コマンドラインからインストーラを起動します。
実行可能になっていないので、

mojamoja@suse:~/Desktop> ls -lv
合計 13284
-rw-r–r– 1 mojamoja users 13553300 2009-02-05 22:50 AdobeAIRInstaller.bin
-rw-r–r– 1 mojamoja users 664 2009-02-05 20:51 GnomeOnlineHelp.desktop
-rw-r–r– 1 mojamoja users 161 2009-02-05 20:51 SuSE.desktop

実行権限をつけて、実行します。

mojamoja@suse:~/Desktop> chmod +x AdobeAIRInstaller.bin
mojamoja@suse:~/Desktop> ls -lv
合計 13284
-rwxr-xr-x 1 mojamoja users 13553300 2009-02-05 22:50 AdobeAIRInstaller.bin
-rw-r–r– 1 mojamoja users 664 2009-02-05 20:51 GnomeOnlineHelp.desktop
-rw-r–r– 1 mojamoja users 161 2009-02-05 20:51 SuSE.desktop
mojamoja@suse:~/Desktop> ./AdobeAIRInstaller.bin

インストーラが起動しました。

後はウィザードに従ってインストールしますが、root権限が必要になりますので途中でパスワードを要求されます。

AIRランタイムのインストールが完了したら、今度は自作のAIRアプリをインストールします。
インストールしたのはflashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法のサンプルアプリです。

さあ、動くかな?

動いた!

GNOMEといえば、一般的にはMac OSX風のデスクトップインターフェイスと言われているのですが、見た目はタスクトレイっぽいです。

if (NativeApplication.supportsDockIcon) {
Alert.show("DockIcon!");
}
else if (NativeApplication.supportsSystemTrayIcon) {
Alert.show("TaskTray!");
}

試しに判定してみたところ、Dockアイコンではなくタスクトレイとして認識されました。これならWindowsの場合と同じロジックで動作しますね。

KDE環境で試しても、きっとタスクトレイのような気がします。どなたか試された方がいらっしゃいましたら、是非、教えていただきたいです!

2月
04

flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜実装編〜の続きです。今回はDockアイコンを縮小/拡大させるアニメーションです。画像の横幅を徐々に縮小していき、サイズが0になった時点で元となる画像を左右反転させ、徐々に拡大していきます。今回は縦幅は変更しません。

サンプルソースはこちら。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
 xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="horizontal"
 horizontalAlign="center"
 verticalAlign="middle"
 creationComplete="onInit()">
 <mx:Script>
  <![CDATA[
   import mx.core.BitmapAsset;
   [Embed(source="assets/AIRApp_icon128.png")]
   private var icon128:Class;

   [Embed(source="assets/AIRApp_icon16.png")]
   private var icon16:Class;

   private var isAnimation:Boolean = false;
   private var isDecrement:Boolean = false;
   private var isReverse:Boolean = false;
   private var counter:int = 0;

   private function onInit():void {
    var bitmap:BitmapData;

    if (NativeApplication.supportsDockIcon) {
     bitmap = (new icon128() as BitmapAsset).bitmapData;
    }
    else if (NativeApplication.supportsSystemTrayIcon) {
     bitmap = (new icon16() as BitmapAsset).bitmapData;
    }
    else {
     NativeApplication.nativeApplication.exit();
    }

    setIcon(bitmap);
   }

   private function setIcon(bitmap:BitmapData):void {
    NativeApplication.nativeApplication.icon.bitmaps = [bitmap];
   }

   private function onClick(event:MouseEvent):void {
    if (isAnimation) {
     this.removeEventListener(Event.ENTER_FRAME, onAnimation);
     btnAnimation.label = "Animation";
    }
    else {
     this.addEventListener(Event.ENTER_FRAME, onAnimation);
     btnAnimation.label = "Stop";
    }

    isAnimation = !isAnimation;
   }

   private function onAnimation(event:Event):void {
    var iconBitmap:BitmapData;
    var newIconBitmap:BitmapData;
    var rectangle:Rectangle;

    if (isDecrement) {
     counter--;
    }
    else {
     counter++;
    }

    if (NativeApplication.supportsDockIcon) {
     iconBitmap = new BitmapData(128, 128, true, 0x0000000);
     newIconBitmap = (new icon128() as BitmapAsset).bitmapData;
     rectangle = new Rectangle(0, 0, 128, 128);
    }
    else {
     iconBitmap = new BitmapData(16, 16, true, 0x0000000);
     newIconBitmap = (new icon16() as BitmapAsset).bitmapData;
     rectangle = new Rectangle(0, 0, 16, 16);
    }

    setIcon(scaleBitmap(iconBitmap, newIconBitmap,
     rectangle, counter, isReverse));

    if (counter == newIconBitmap.width) {
     isDecrement = true;
     isReverse = !isReverse;
    }
    else if (counter == 0) {
     isDecrement = false;
    }
   }

   private function scaleBitmap(
    iconBitmap:BitmapData, newIconBitmap:BitmapData,
    rectangle:Rectangle, counter:int, isReverse:Boolean):BitmapData {

    if (isReverse) {
     var tempBitmap:BitmapData;
     var tempRectangle:Rectangle;

     if (NativeApplication.supportsDockIcon) {
      tempBitmap = new BitmapData(128, 128, true, 0x00000000);
      tempRectangle = new Rectangle(0, 0, 128, 128)
     }
     else if (NativeApplication.supportsSystemTrayIcon) {
      tempBitmap = new BitmapData(16, 16, true, 0x00000000);
      tempRectangle = new Rectangle(0, 0, 16, 16)
     }

     var tempMatrix:Matrix = new Matrix();
     tempMatrix.scale(-1, 1);
     tempMatrix.translate(tempBitmap.width, 0);
     tempBitmap.draw(newIconBitmap, tempMatrix, null, null, tempRectangle);
     newIconBitmap = tempBitmap.clone();
    }

    var matrix:Matrix = new Matrix();
    var sx:Number = (newIconBitmap.width-counter)/newIconBitmap.width
    var sy:Number = 1;
    var tx:Number = newIconBitmap.width/2-(sx*newIconBitmap.width/2);
    var ty:Number = 0;
    matrix.scale(sx, sy);
    matrix.translate(tx, ty);
    iconBitmap.draw(newIconBitmap, matrix, null, null, rectangle);

    return iconBitmap;
   }
  ]]>
 </mx:Script>
 <mx:Button label="Animation" id="btnAnimation" click="onClick(event)"/>
</mx:WindowedApplication>

大枠は前回のサンプルソースと同様です。違うところは、縮小/拡大するサイズをenterFrameイベントでインクリメント/デクリメントするところと、画像を加工する関数、scaleBitmapの中身くらいです。enterFrameイベントハンドラのonAnimation関数の前半部分の

if (isDecrement) {
 counter--;
}
else {
 counter++;
}

では、counter変数をインクリメント/デクリメントすることで、画像の横幅を徐々に変更していきます。isDecrementフラグは、縮小/拡大の状態を表していて、falseの時に縮小、trueの時に拡大します。

onAnimationの後半部分の

if (counter == newIconBitmap.width) {
 isDecrement = true;
 isReverse = !isReverse;
}
else if (counter == 0) {
 isDecrement = false;
}

では、画像の横幅を徐々に縮小していった結果、サイズが0になった時点でもとの画像を左右反転させ、徐々に拡大していきます。画像の左右反転の状態を示しているのがisReverseフラグです。trueの時に左右反転します

scaleBitmap関数の中の以下の部分では

var matrix:Matrix = new Matrix();
var sx:Number = (newIconBitmap.width-counter)/newIconBitmap.width
var sy:Number = 1;
var tx:Number = newIconBitmap.width/2-(sx*newIconBitmap.width/2);
var ty:Number = 0;
matrix.scale(sx, sy);
matrix.translate(tx, ty);
iconBitmap.draw(newIconBitmap, matrix, null, null, rectangle);

画像を縮小/拡大する処理を実装しています。

var sx:Number = (newIconBitmap.width-counter)/newIconBitmap.width;

で、x軸方向の圧縮率を求めます。

var sy:Number = 1;

y軸方向は圧縮/拡大しませんので、圧縮率は1です。

var tx:Number = newIconBitmap.width/2-(sx*newIconBitmap.width/2);
var ty:Number = 0;

では、圧縮/拡大することによって画像の中心点が移動されますので、元の位置にもどす平行移動距離を求めています。計算式は、flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜

tx=x-ax-cy
ty=y-bx-dy

より求められます。圧縮/拡大時の変換行列は

となりますので、
tx=64-sx*64-0*64=64-sx*64
となるわけです。

元となる画像を反転させている部分は、

if (isReverse) {
 var tempBitmap:BitmapData;
 var tempRectangle:Rectangle;

 if (NativeApplication.supportsDockIcon) {
  tempBitmap = new BitmapData(128, 128, true, 0x00000000);
  tempRectangle = new Rectangle(0, 0, 128, 128)
 }
 else if (NativeApplication.supportsSystemTrayIcon) {
  tempBitmap = new BitmapData(16, 16, true, 0x00000000);
  tempRectangle = new Rectangle(0, 0, 16, 16)
 }

 var tempMatrix:Matrix = new Matrix();
 tempMatrix.scale(-1, 1);
 tempMatrix.translate(tempBitmap.width, 0);
 tempBitmap.draw(newIconBitmap, tempMatrix, null, null, tempRectangle);
 newIconBitmap = tempBitmap.clone();
}

の、

tempMatrix.scale(-1, 1);
tempMatrix.translate(tempBitmap.width, 0);

です。

では、実行してみます。

見方によっては画像中心点のy軸を基準に回転しているようにも見えますね。

■関連記事へのリンク
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのDockアイコンをカスタマイズする方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンをアニメーションさせる方法
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜概要編〜
flashcast:フリーで働くITエンジニア集団のブログ: Macで動くAIRアプリのカスタマイズしたDockアイコンを回転させる方法 〜実装編〜

  • Search:
  • flashcastとは?

    東京を中心に、現在フリーランスとして活動しているITエンジニア、および、かつてフリーランスとして活動していた起業家達が立ち上げたコミュニティーです。

    みんなで集まって面白いことをやろう!形に残そう!ということで、ブログをはじめました。

    技術情報や、フリーエンジニアに役立つ情報などを、ご紹介できたらと思っています。

    お問い合わせ:
    info@flashcast.jp
  • カレンダー

    2010年7月
    日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日
    « 6月    
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • メンバー紹介

    もじゃもじゃ
    flashcastのリーダー

    3年ほどフリーのITエンジニアとして活動。現在は、社員2名の株式会社を経営しています。

    一攫千金を夢見る野心家です。

    ライブキャスト

    yasu
    ダイバー

    自宅サーバーでホームページを作り始めました。

    少しずつ記事を増やしていきますので足を運んでください。

    よろしくお願いします。

    sa-sa-ki.jp

    のら
    たびびと

    ねこ好きに悪人はいなーいっ!!

    バイクや車も好きです。

    めぐ
    デザイナーのたまご

    音楽とデザインとお酒をこよなく愛する永遠のダイエッター。

    現在ペンタブレットでイラストを勉強中。

    Hiro
    コンサル

    PMやSEの案件を業務委託で請けることが多いですが、小規模案件も受託でやっています。

    得意な分野はマイクロソフト製品や関連技術によるシステム構築です。

    KEI
    取締役の風格

    最年少なのに、メンバーで1番の貫禄の持ち主!?

    C#や.netなどサーバ側の開発が得意。

    ろっきー
    美食家★パパ

    自分にとっての息抜きは、ドライブして温泉に入って、美味しいご飯を食べる事。

    ココロとカラダのリフレッシュを大切にし、日々の仕事に励む一児の父親です。

    郵便番号検索

    my-hobby

    とのさま
    げーむのおうさま

    大人なのに好きなことしかやらない駄目人間。

    Web系が得意、アクセスは苦手><

    tonosamart.com

    セクレタリアト
    ギャンブラー

    フリーランス時代は仲間の現場を探すことが多く、それをきっかけに会社を設立。

    現在はSI業に特化せず、他の業種にも興味を持ち始めています。

    メドレー株式会社

  • 広告