スピーカー / 写真撮影 / 記事執筆と、一通り携わらせていただいた Adobe AIR Day のイベントレポートが、Adobe イベント・セミナー レポートページに掲載されました。

Adobe AIR Day イベントレポート
http://www.adobe.com/jp/joc/events/airday/

今まで書いてきた記事の中で、過去最多ページ数のレポートになりました。
当日イベントに参加できなかった方はもちろん、参加された方にも是非見ていただけばと思います。

先月 11 月 26 日に行われた Adobe AIR Day の資料をアップしました。
http://labs.taiga.jp/presentationMaterial/FxUG/AIRDay20091126Slide.pdf

口頭での解説がメインだったため、Adobe AIR デベロッパーセンターに掲載されている記事と、内容に大差はありませんが置いておきます。

Touch Viewer リリース後に作った副産物ですが、Win/Mac 両対応するように強化したので晒しておきます。

下記画像のような Flex プロジェクトのフォルダ構造を保っていれば、build.xml を実行するだけで、各 OS に対応した .exe や .dmg を書き出すことができます。

Flash Builder 4 β 2 で作成したサンプル Flex(AIR) プロジェクト

<?xml version="1.0" encoding="utf-8"?>
<!--
build.xml
-->
<project name="≪ プロジェクト名 ≫" basedir="." default="init">

   <condition property="os" value="≪ Flex SDK のフルパス (Windows) ≫">
       <os family="windows" />
   </condition>
   <condition property="os" value="≪ Flex SDK のフルパス (Mac) ≫">
       <os family="mac" />
   </condition>

   <condition property="suffix" value=".exe">
       <os family="windows" />
   </condition>
   <condition property="suffix" value=".dmg">
       <os family="mac" />
   </condition>

   <property name="FLEX_HOME"           value="${os}"                                  />
   <property name="ADT.JAR"             value="${FLEX_HOME}/lib/adt.jar"               />
   <property name="AIR_CONFIG"          value="${FLEX_HOME}/frameworks/air-config.xml" />
   <property name="FLEX_TASKS_JAR"      value="${FLEX_HOME}/ant/lib/flexTasks.jar"     />
   <property name="APP_ROOT_DIR"        value="src"                                    />
   <property name="ASSET_DIR"           value="asset"                                  />
   <property name="ICON_DIR"            value="${ASSET_DIR}/icon"                      />
   <property name="APP_NAME"            value="${ant.project.name}"                    />
   <property name="AIRI_NAME"           value="${APP_NAME}.airi"                       />
   <property name="DESCRIPTOR_NAME"     value="${APP_NAME}-app.xml"                    />
   <property name="NATIVE_APP_NAME"     value="${APP_NAME}${suffix}"                   />
   <property name="SWF_NAME"            value="${APP_NAME}.swf"                        />
   <property name="APP_ROOT_FILE"       value="${APP_ROOT_DIR}/${APP_NAME}.mxml"       />
   <property name="APP_ROOT_DESCRIPTOR" value="${APP_ROOT_DIR}/${APP_NAME}-app.xml"    />
   <property name="KEYSTORE"            value="≪デジタル証明書ファイル名≫.p12"       />
   <property name="STORETYPE"           value="pkcs12"                                 />
   <property name="STOREPASS"           value="≪デジタル証明書のパスワード≫"         />

   <taskdef resource="flexTasks.tasks" classpath="${FLEX_TASKS_JAR}" />

   <target name="resources">
       <copy
           file   = "${APP_ROOT_DESCRIPTOR}"
           tofile = "${APP_NAME}-app.xml"
        />
       <replaceregexp
           file    = "${APP_NAME}-app.xml"
           match   = "<content>.+?</content>"
           replace = "<content>${APP_NAME}.swf</content>"
        />
       <copy toDir="${ICON_DIR}">
           <fileset dir="${APP_ROOT_DIR}/${ICON_DIR}" />
       </copy>
   </target>

   <target name="amxmlc" depends="resources">
       <mxmlc
           file                       = "${APP_ROOT_FILE}"
           output                     = "${SWF_NAME}"
           configname                 = "air"
           actionscript-file-encoding = "UTF-8"
           incremental                = "true"
           debug                      = "false"
           optimize                   = "true"
           target-player              = "10"
       >
           <load-config filename="${AIR_CONFIG}" />
       </mxmlc>
   </target>

   <target name="prepare" depends="amxmlc">
       <java jar="${ADT.JAR}" fork="true" failonerror="true">
           <arg value = "-prepare"           />
           <arg value = "${AIRI_NAME}"       />
           <arg value = "${DESCRIPTOR_NAME}" />
           <arg value = "${SWF_NAME}"        />
           <arg value = "${ICON_DIR}"        />
       </java>
   </target>

   <target name="package" depends="prepare">
       <java jar="${ADT.JAR}" fork="true" failonerror="true">
           <arg value = "-package"           />
           <arg value = "-storetype"         />
           <arg value = "${STORETYPE}"       />
           <arg value = "-keystore"          />
           <arg value = "${KEYSTORE}"        />
           <arg value = "-storepass"         />
           <arg value = "${STOREPASS}"       />
           <arg value = "-target"            />
           <arg value = "native"             />
           <arg value = "${NATIVE_APP_NAME}" />
           <arg value = "${AIRI_NAME}"       />
       </java>
   </target>

   <target name="clean" depends="package">
       <delete dir  = "${ASSET_DIR}"       />
       <delete file = "${AIRI_NAME}"       />
       <delete file = "${SWF_NAME}"        />
       <delete file = "${SWF_NAME}.cache"  />
       <delete file = "${DESCRIPTOR_NAME}" />
   </target>

   <target name="init" depends="clean" />

</project>

昨日、Adobe Labs にて Flash Player 10.1 と AIR 2.0 のパブリック beta 版が公開されましたが、このリリースに併せて、日本のアドビのサイトより、AIR 2.0 beta のサンプルアプリケーションと解説記事が公開されました。
http://www.adobe.com/jp/joc/air2/samples/

私も、サンプルアプリケーション開発と記事執筆に携わっています。
http://www.adobe.com/jp/devnet/air/articles/touchviewer.html

元々、先月 (10/31) と今月 (11/5) に行われた FxUG 勉強会 ( 熊本、東京 ) のために用意していたサンプルアプリだったのですが、アドビさんのご厚意により、今回の公開に至りました。

また、来週 (11/26) に Adobe AIR Day という AIR 2.0 beta のお披露目イベントがありますが、その場で開発 Tips やデモを行います。平日のお昼から開催されるイベントですが、興味のある方は是非お越しください。

Adobe AIR Day
http://www.info-event.jp/adobe/air/

ちなみに、Mac 版のサンプルアプリケーション (Touch Viewer) には、『タイルのリストを選択したとき、2 回目以降に開いたネイティブウィンドウからジェスチャーイベントを取得できない』という既知のバグがあります。ランタイムの問題か SDK の問題か定かではありませんが、現在問合わせ中です。

証明書付き AIR アプリケーション インストールダイアログ

Adobe AIR の署名に日本国内で唯一対応している証明機関は GMO グローバルサイン株式会社なのですが、残念なことに個人/個人事業主からの申し込みは受け付けられないようです。

なので、私のような個人事業主がコード署名証明書を取得するためには、海外の証明機関に申請する必要があります。

証明機関に関する情報は Adobe AIR のヘルプに記載されていますが、Ryan Stewart 氏のブログを読む限りでは、 Chosen Security 社がおすすめらしいので申し込んでみました。以下手順になります。

  1. Chosen Security 社の AIR コード署名証明書購入ページを開きます。
    http://www.chosensecurity.com/tc-publisher-id-for-adobe-air

  2. [Buy TC Publisher ID for Adobe Air for Individual Developers] をクリックして購入手続きへ移動します。

  3. 必要な情報を入力して決済手続きを終えると、入力メールアドレス宛に 2 通メールが届きます。 ( 1 通は個人識別番号 (PIN) が記載されたメール、もう 1 通は証明書発行申請 PDF ファイルが添付されたメール )

  4. 証明書発行申請 PDF ファイル内記述箇所に必要な情報を入力して、メール本文に記載されている ChosenSecurity Support のメールアドレス宛に送付します。 ( 添付 PDF が送られてくるメールアドレスとは異なるので、注意が必要です )

    証明書発行申請 PDF ファイルの記述例をアップしておきます。( 記述例はこちら )

    メールの本文に悩む方は、下記文章を参考にしてください。

    Dear Sir/Madam

    I request a TC Publisher ID for Adobe AIR.
    Please confirm an attached PDF file.


    Sincerely,
  5. Chosen Security 社の担当者から、証明書発行申請の受理通知メールが届きます。

  6. 2 営業日くらいで、証明書ダウンロードサイトの URL が記述されたメールが届きます。

  7. 個人識別番号 (PIN) を入力すると、証明書をダウンロードすることができます。
    この個人識別番号 (PIN) は、AIR ファイルを書き出すためのパスワードにもなります。

以上で、怪しい「オレオレ証明書」付きの AIR アプリケーションともサヨナラです。
自分の作った AIR アプリで、以下のような画面を晒すこともなくなります。

オレオレ証明書付き AIR アプリケーション インストールダイアログ

参考

ご存知の方も多いと思いますが、先月上旬に参加してきた Adobe MAX 2009 のレポートが、Adobe イベント・セミナー レポートページに掲載されました。

Adobe MAX 2009 デベロッパー視点で見る、Adobe MAX 2009 の見所
http://www.adobe.com/jp/joc/events/max2009/users_report/developer/

あと、ノンクレジットではありますが、下記記事の執筆、写真撮影に携わっています。

基調講演1日目
http://www.adobe.com/jp/joc/events/max2009/

基調講演2日目
http://www.adobe.com/jp/joc/events/max2009/page2.html

Adobe Office in San Francisco “Japan Session”
http://www.adobe.com/jp/joc/events/max2009/session/japan/

明日の FxUG 東京勉強会では、参加レポート報告と AIR 2.0 のデモを行います。
Flex 勉強会 第 89 回@東京参加受付

埋め込みフォント サンプル MXML 版

前回のエントリに引き続き、今回は MXML で TLF に埋め込みフォントを適応させるサンプルをアップします。

TLF が使用されている Spark コンポーネントは、RichText と RichEditableText の 2 つで、AS で使用するのと比べてかなり楽に使えます。その代わり、Linked Containers 機能のみ使用できない仕様になっているため、注意が必要です。

埋め込みフォント サンプル

TLF に埋め込みフォントを適応させるための手段について書きます。
FTE の仕様上、TLF の埋め込みフォントフォーマットは DefineFont4(CFF) フォーマットである必要があります。( 従来の TextField に使用されているフォントフォーマットは DefineFont3 フォーマットです )

フォント埋め込み方法

AS, MXML のどちらを使用しても CFF 形式でフォントを埋め込むことは可能ですが、Flash Builder 4 β 2 付属の SDK(4.0.0.10485) で確認したところ、フォント埋め込み時の Embed メタデータタグの引数 cff が、embedAsCFF と名称変更されていたので注意が必要です。

AS での埋め込み例

package {
import flash.display.Sprite;
public class TaigaFont extends Sprite {
    [Embed(
        source               = "asset/font/KozMinPro-Bold.otf",
        fontName             = "testFont",
        mimeType             = "application/x-font",
        embedAsCFF           = "true",
        advancedAntiAliasing = "true",
        unicodeRange         = "U+5927, U+96c5" //大雅
    )]
    public static const FONT:Class;
}
}

上記コードは、フォントを埋め込んだクラスを SWF に書き出して、Loader クラスから外部読み込みして使用することを想定したものですが、この場合、基底クラスは Sprite または MovieClip クラスである必要があります。( Font クラスを基底クラスにしても mxmlc は SWF を書き出せますが、Loader が読み込んでくれません )

読み込み完了後、作成した TextFlow インスタンスの fontLookup プロパティの値を "embeddedCFF" (FontLookup.EMBEDDED_CFF) に定義して、TextLayoutFormat の fontFamily に取得したフォント名を定義します。

I'll participate in the Adobe MAX 2009 LA next week.
Session scheduled to participate are as follows.

Monday, October 5, 2009

  • 09:30 - 11:00 General Session at Nokia Theatre L.A. LIVE
  • 11:30 - 12:30 Moving from Flex 3 to Flex 4
  • 14:00 - 15:00 Encoding Best Practices for H.264 Video Using Flash
  • 15:30 - 16:30 Effects in Flex 4
  • 17:00 - 18:00 Building Flex Collaboration Components
  • 20:00 - 21:00 Meet the Teams (Flex and Flash Builder)
  • 21:00 - 22:00 Meet the Teams (Flash Professional)

Tuesday, October 6, 2009

  • 09:00 - 10:00 Things Every Flash Developer Should Know
  • 10:30 - 12:00 General Session at Nokia Theatre L.A. LIVE
  • 13:30 - 14:30 Flash Player Internals
  • 15:00 - 16:00 XML based FLA: The New Flash File Format
  • 16:30 - 17:30 ELIPS 3.0: Mobile Flex Builder Toolkit
  • 17:30 - 19:00 Sneak Peeks and 2009 MAX Awards
  • 20:00 - 23:00 MAX Bash TBD

Wednesday, October 7, 2009

  • 09:30 - 10:30 Testing and Debugging with Flash Builder 4
  • 11:00 - 12:00 A Deep Dive into Ten Innovative Projects for Flash
  • 14:00 - 15:00 Killer Text in Flash with the Text Layout Framework (TLF)
  • 15:30 - 16:30 Social Media Experiences with Flash Media and RTMFP
  • 17:00 - 18:00 Tackling Memory and Performance in Flash, Flex, and Adobe AIR

This's my first-ever visit to America.
So I'm really looking forward to it!

Flash MX (Flash Player 6) から導入されているアクセシビリティ機能ですが、今までまともに試したことがなかったので試しました。今回試して分かったことは、Accessibility クラスと通信するスクリーンリーダーの用意が意外と手間だったということです。

たとえば、Camera クラスを使用するためには Web カメラが必要であるように、Accessibility クラスを使用するためにはスクリーンリーダーが必要で、スクリーンリーダーを動作させるためには、いくつかのラインタイムやアプリケーションをインストールをしなければなりません。

ひとまず Windows XP(32bit) かつフリーの環境で、スクリーンリーダーと flash.accessibility パッケージの動作確認をするために私が辿った手順を備忘録として残しておきます。決して下記手段を推奨しているわけではありませんので、ご注意ください。