メイン

Language アーカイブ

2008年1月24日

アマゾンアソシエイト、<iframe>を<object>に

サイトの雰囲気を壊さない程度にアマゾンアソシエイトを導入してみました。その際に問題だったのがiframeタグを使用していること。これはStrictやxhtml1.1の仕様には沿わないのでobjectタグで代替しなければいけません。今回はその導入方法がなかなか見つからなかったので、少しでも参考になれば、と思っています。

最初にお伝えしておきますが、僕の方法ではxhtml1.0Transitionalまでしか対応させることができません。JavaScriptを使ったりすれば対応させることもできるようですが、そこまでする必要はないのと判断したことと、知識が足りないのか、そもそも無理なのかわかりませんが、IE6のバグが悪さをして無理です。ということで、なるべくxhtml1.1に近づけるように、IEではiframeタグで、それ以外のブラウザではobjectタグで表示させる、という方法をとります。

実用範囲についての注意

上にも書きましたが、万能というわけではないようです。この点に気をつけてください。

  • Strictに近づけるように書いたxhtml 1.0 Transitionalであること
  • xhtml 1.0 Strict、xthml 1.1ではないこと
  • 僕の使用したamazonの表示形式以外にはそのままの流用はできないこと
  • &の文字を文字実態参照(&amp;)、もしくは数値文字参照(&#38;)に置き換えること

適用可能な表示形式は以下のものです。異なる場合は多分幅などを変更すれば適用できるのではないかと思います。

テンプレートと使用方法

テンプレートを貼り付けて起きます。

<p><!--[if IE]>
<iframe src="ここにamazonから提示されたurl" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0">
</iframe>
<![endif]-->
<!--[if !IE]><-->
<object data="ここにamazonから提示されたurl"  width="120px" height="240px" type="text/html">
</object>
<!--><![endif]--></p>

使用する際には前述した"&"を書き換える注意事項を踏まえたうえで、url部を2箇所とも同じものを記述してください。これによりIEエンジンのときのみiframeタグ、その他のエンジンではobjectタグが使用され、もう片方はコメントとして扱われます。

tips

手法に悩んだ挙句、これに選択して使っていますが、その資料探しの時に2つ今まで知らなかったことを発見しました。折角ですので紹介しようと思います。

文字参照について

先ほどの文字参照に、文字実体参照と数値文字参照がありました。その表記方法は上にも記した通りですが、文字実体参照はアルファベットを用い連想が行いやすく、数値文字参照は数字で指定するために、一見何のことかわかりにくいという印象があります。

CYBER@GARDEN『文字参照一覧 | references』の一覧表を見るとわかりやすいです。

どういった差があるのでしょうか。

文字実体参照
DTD で宣言された名前で指定する方法
数値文字参照
ISO/IEC-10646( Unicode )の文字コード位置を指定する方法

とはいっても具体的に何のことかわかりません。ところが、

NN4 文字実体参照の注意点として、などの HTML4.0 に対応していないブラウザでは、 「マークアップ記号、国際化文字」 のほとんどと 「一般記号、数学記号、ギリシア文字」 のすべてを正しく表示できません。これらのブラウザで表示させたい場合は、 数値文字参照 を用いてください。

とありました。以前、面倒でも全部数値文字参照にしたほうがいいよ。ときいたことがあったのですが、これからきているのですね。納得。

IEobjectのバグ

途中どこかの記事で読んだのですが、objectを使うと起きるIEのバグについて、

正確にはローカルでは動くけどサーバにあげると動かなくなる(ドメインが対象と別になると)。iframe なら可。

といわれていた方がいました。裏を取っていませんが、実際に僕にとってもそのようです。amazonからの読み込みは上記と一致しますので。

いずれ調べようと思いますが、こういうこともあるらしいので、同じような状況で問題があったら見直してみてください。

2008年3月15日

Stickam、<embed>を<object>に

Stickamのブログパーツを持ってくる際に、embedをxhtmlに対応させる必要がありました。そのためにobjectへと変更したのですが、objectはIE6では使えません。そこで今回は以前書いた記事、アマゾンアソシエイト、<iframe>を<object>にを参考に、XHTML 1.0 Transitionalに対応させるための記述方法を書きます。

実用範囲についての注意

方法は以下に示しますが、その前に注意書きを何点か。

  • Strictに近づけるように書いたXHTML 1.0 Transitionalであること
  • XHTML 1.0 Strict、XHTML 1.1ではないこと
  • 僕の使用したブログパーツの表示形式以外にはそのままの流用はできないこと
  • &の文字を文字実態参照(&amp;)、もしくは数値文字参照(&#38;)に置き換えること

ここで3番目の流用できないところは、widthだったりheightだったりしますので、そこはにらめっこして考えてください。

実際の表示

今回は以下の表示形式に対応しています。

テンプレートと使用方法

テンプレートを貼り付けて起きます。

<p><!--[if IE]>
<embed src="ここに表示されているurlが入ります" type="application/x-shockwave-flash"
 width="340" height="290" scale="noscale" allowScriptAccess="always"></embed>
<![endif]-->
<!--[if !IE]><-->
<object data="ここに表示されているurlが入ります" width="340" height="290" type="application/x-shockwave-flash">
<param name="movie" value="ここに表示されているurlが入ります" />
<param name="scale" value="noscale" />
<param name="allowScriptAccess" value="always" />
</object>
<!--><![endif]--></p>

使用する際には前述した"&"を書き換える注意事項を踏まえたうえで、url部を2箇所とも同じものを記述してください。これによりIEエンジンのときのみiframeタグ、その他のエンジンではobjectタグが使用され、もう片方はコメントとして扱われます。それと、表示されるurlはStickamのブログパーツに関するページで表示されることと、見た目についても、Stickam側のサービスで変更をするので、くれぐれもhtmlで調整することの無いよう、気をつけてください。

あとがき

前回の記事を流用したものなので、必要以上の動作確認を行っていません。何か疑問などがありましたら、コメントしていただけると幸いです。

それより、このサイズでシンプルな見た目のものはないのかなー...サイトトップから浮いているよ...

2008年5月31日

AIR:Eclipseでmxmlをコンパイルできる環境を一から実装

Eclipse起動画面

はじめに

やっと見つけました、EclipseでのAIRのVer1.0コンパイル。プログラム言語に関して内部事情に疎い(そもそも技術が無い)僕は、一体何が必要不必要かすら分からず、Eclipseでのmxmlコンパイルは絶対できると考えてネットで調べましたが、国内ソースからは一向に出てきません。みんな開発慣れしてて考えずに分かるのかチクショー、なんて結構な時間を費やして、やっと実装できました。今回は、EclipseとFlex3SDKを用いた開発環境を整えるまでです。扱う拡張子はmxmlです。この方法でswfを生成しますが、AIRアプリケーションとして生成するところまでは今回は説明していません。近いうちにまとめて記事に起こそうと思います。それと、筆者の技術の関係上余計な事をしていると思いますがそこはご了承ください。

要約するとこの記事のメリットは、'08.05.31現在、ウェブで方法が掲載されていないであろう、Eclipseでmxmlのコンパイルを方法について書いてあることです。

この記事を踏まえたうえで、fcsh環境の実装も記事にしました。「AIR:Eclipseでfcsh環境を実装」から。

また、Aptanaを用いて同じようなことをしたい場合は、こちらの「AIR:Aptanaでのadobe AIR開発環境を一から実装」をご覧ください。ただしこちらではmxmlのコンパイル方法は言及していません。

今回の記事を書くにあたり、特に以下のサイトを参考にさせていただきました。

Eclipseのインストール、日本語化

最初にEclipseをインストールします。Eclipseのダウンロードは、以下のURLから。
Pleiadeshttp://mergedoc.sourceforge.jp/

なお、PleiadesはEclipseに日本語化プラグインを既に適用したものを扱っているために、日本語化の手間はありません。この時に注意が必要なのですが、数あるバージョンの内、プラグインが少数しか含まれていないものを落とすと、他のサイトで示された手順のアイコンが欠如している場合が多くあります。ですので、UltimateまたはJavaWTPを落としたほうが何かと参考記事が多い人には扱いやすいと思います。

DLファイルの一覧
上に示したどちらかです。JRE付き、無し、それぞれ異なりますので、必要に応じてどちらかをダウンロードしてください。ここで僕はJRE付きのJavaETLを落としました。JavaWTPの方が僕のこれからの説明と多少UIが異なってきますがお勧めです。

落としたEclipseは特に設定することなく、保存したディレクトリから起動することができます。

Flex3SDKのインストール

次にFlex3SDKをインストール、もとい保存します。Flex3SDKのダウンロードは、以下のURLから。
Adobe - Download Adobe Flex 3http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email

SDKのDL場所
ページ下部のSDKの利用規約のチェックボックスをオンにした後、ダウンロードしてください。そして解凍した後、フォルダごとCドライブ直下に配置。コンパイルの際の参照元となりますので、都合の良いところに保存してください。フォルダネームは「flex3sdk」としてあります。

HelloWorldアプリケーションの準備

eclipseのワークスペースの選択
Eclipseを起動すると、ワークスペースの場所を要求されます。僕はここで「C:\flex」に指定。

ツールバー上
ツールバーから「ファイル」、「新規」、「プロジェクト」。

一般、プロジェクト
一般を選択後、プロジェクトを選択し次へ。

プロジェクト名、「helloworld」
プロジェクト名を「helloworld」と入力後、終了。

フォルダ、ファイルを生成
ここから暫くは参考記事とほとんど同じ。フォルダを生成後、空ファイルをいくつか生成し、上の状態を作ります。構成されているファイルとしては、選択されているmxmlのみ異なりますので、その点に注意してください。

右クリックからファイル生成
なお、左のウィンドウで右クリックをして生成可能です。「新規」、「フォルダー」もしくは「ファイル」で作り、またファイルの場合は拡張子も忘れずに記述してください。

HelloWorldアプリケーションの記述

それでは以下に記述する内容を書いていきます。

build.properties(Flex sdkのbinディレクトリの絶対パスを指定)

FLEX3_HOME=C:/flex3sdk/bin

build.propertiesのUI
build.propertiesのUIが、開発環境によって異なることがありますが、ソースコードの記述の際は、下のタブでソース記述に切り替えてください。また、SDKのbinディレクトリを正しく記述できているかを確認してください。3の位置など要注意です。(flex3sdkがflexsdk3、等)

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloWorld" default="build.swf" basedir=".">
    <property file="build.properties" />
    <property name="dist.dir" value="dist" />
    <property name="src.dir" value="src" />
    <property name="height" value="100" />
    <property name="width" value="200" />
    <property name="framerate" value="30" />
    <property name="bgcolor" value="0xFFFFFF" />
   
    <!-- create swf-->
    <target name="build.swf" depends="clean">
        <exec executable="${FLEX3_HOME}/amxmlc.bat" failonerror="true">
            <arg line="-default-size ${width} ${height}" />
            <arg line="-default-frame-rate ${framerate}" />
            <arg line="-default-background-color ${bgcolor}" />
            <arg line="-output ${dist.dir}/HelloWorld.swf" />
            <arg line="${src.dir}/HelloWorld.as" />
        </exec>
    </target>

    <!-- clean dist directory -->
    <target name="clean">
        <delete>
            <fileset dir="${dist.dir}" includes="HelloWorld.swf" />
        </delete>
    </target>

</project>

気をつけなければいけないのは、1行目のxml宣言は、必ずファイルの1行目の最初から記述されなければいけないことです。エラーを吐くときは余分なスペースが無いかを確認してください。

property後続のnameで様々な設定を行った後、中の行のargで引用しています。基本的に読めば分かると思います。framerateは1秒当たりの描画回数、bgcolorはすなわちbackground-color、背景色です。

helloworld.mxml

<?xml version="1.0" ?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:TextArea text="HelloWorld!" />
</mx:Application>

mx:Applicationタグに囲まれた部分が今回表示される文字列です。

コンパイル

Antビューの表示
コンパイルの前に、Antを表示する必要があります。「ウィンドウ」、「ビューの表示」、「Ant」です。これが無い場合は、下の「その他」から「Ant」、「Ant」で選択できます。(果たしてありえるのかはわかりませんが)もし、ここでAntが無い場合、Eclipseを落としなおしてください。ここまでの選択は、全て他に特殊な何かを必要とはしていません。

build.swfをダブルクリック
ウィンドウ内のbuild.swfをダブルクリックしてください。コンパイルが開始されます。エラーを吐く場合は、今までで間違っている部分が無いかを確認してください。

HelloWorld.swfの生成完了
コンパイルが終了したら、distフォルダ内にHelloWorld.swfが生成されています。F5で再読み込みを行えば、画面に表示されるはずです。

HelloWorld.swfの実行
実行するとこんな感じです。簡単に生成した割には、デザインもダサく無いです。これでHelloWorldのサンプルプログラムは終了です。

あとがき

ぶっちゃけ知識があればスムーズに出来たのでは、と思いました。Antなんて今までは外部から持って来る必要があったので、どこだと探したらSDKの中に既に含まれていたりしましたし、空回りしている感も否めなかったです。

しかしこれで念願のmxmlコンパイルが出来ました。以前書いたAptanaの記事は個人的にはいらない子です。今度はEclipseを用いた環境の充実か、もう少し踏み込んだサンプルプログラムを作っていきたいです。

2008年6月21日

AIR:Eclipseでfcsh環境を実装

はじめに

今回は、Eclipseをより使いやすくするために、fcsh環境をAntに組み込むことはできないかな、と模索してみました。

結論から言うと出来ませんでした。そこで環境を2つEclipse上に混在させることで落ち着かせることにしました。

fcshについては、もう皆さん知られていると思いますが、一度コンパイルしたものをメモリ上に保存することにより、以後のコンパイルを1/100ぐらいの速さで実行できます。ですので些細な変更を含めたときは、こちらを使うことで作業時間の待ちを大幅に短縮できます。なお、fcshはFlex3SDKには、最初から含まれています。

fcshを用いずに、Antのみでコンパイルしたい場合はこちらの、「AIR:Eclipseでmxmlをコンパイラできる環境を一から実装」に公開しています。

Antにfcshが組み込めない理由

Antはコンパイルの時に走らせて、コンパイル終了とともに開放されます。Antは実行時にfcshを呼び出すことは出来るのですが、コンパイラ終了によってfcshも同時に開放されてしまい、結局メモリ上にデータが残りません。詳しいところは違うと思いますが、大体これであっていると思います。

Eclopseでのfcsh環境実装方法

「実行」>「外部ツール」>「外部ツールダイアログを開く」
ツールバー上の、「実行」>「外部ツール」>「外部ツールダイアログを開く」を選択します。

外部ツール左、プログラム
表示されたウィンドウの左側のプログラムをダブルクリックします。

window概観
表示された「新規作成(1)」を選択し、左のタブがメインを選択していることを確認してください。

名称変更
「ロケーション」には、fcsh.exeまでを示す必要があります。flex3sdkにはデフォルトで入っています。ですから、僕の場合は

C:\flex3sdk\bin\fcsh.exe

です。下の「作業ディレクトリ」は好きなところでいいです。僕の場合は、HelloWorldのサンプルアプリケーションの中に指定しました。ですので、

${workspace_loc:/helloworld/src}

となります。これらで設定は終わりですので、後は区別のつきやすいように、「新規作成(1)」を「fcsh-AIR」にリネームします。そして「適用」を選び、「閉じる」でこのウィンドウを終了させます。

実行は外部ツール呼び出し
実行の際は、ツールバー上の「実行」から選択しても、二段目のショートカットから実行からでも、好きなほうからでかまいません。

mxmlc ファイル名
実行すると、コンソールウィンドウで作業を行うこととなります。デフォルトでは下部のウィンドウがそれに当たるはずです。

(fcsh)の後にコンパイルのコマンドを打ち込むことで動作します。先ほどお話したHelloWorldのアプリケーションをコンパイルする場合は、

mxmlc helloworld.mxml

このときコンパイルするmxmlのファイル名の大文字小文字を一致させてください。

compile 番号
一度目のコンパイルで、ターゲットIDの番号が表示されます。初回は「1」、以後値が大きくなっていきます。今後同じファイルをコンパイルするときは、表示されたIDが「1」であるなら、以下のように打ち込みます。

compile 1

先ほどのファイルに変更がない場合は、コンパイルはスキップします。

fcshを終了したい場合は、コマンドで「quit」と打ち込むか、Eclipse上のUIの停止ボタンを押してください。

2008年7月13日

Nike+、xhtmlに対応したobject要素への書き換え

Nike+のブログパーツはobjectタグ使っているのにxhtmlには対応していません。今回はXHTML 1.0 Transitionalに対応させつつ、IE6.0やモダンブラウザでも動作するNike+ブログパーツへの変更方法です。

iframeやembedをobjectへ変更する方法は、過去記事のアマゾンアソシエイト、<iframe>を<object>にStickam、<embed>を<object>にでも解説しています。

実用範囲についての注意

方法は以下に示しますが、その前に注意書きを何点か。

  • XHTML 1.0 Transitionalについてのみの解説(Strictでも動くかも
  • ブログパーツの表示形式が異なるときはwidthやheightに注意
  • &の文字を文字実態参照(&amp;)、もしくは数値文字参照(&#38;)に置き換えること

'08.08.17追記CSSoffの状態で表示されないのを確認しました。原因はわからないです。。

実際の表示

今回は以下の表示形式に対応しています。

テンプレートと使用方法

テンプレートを貼り付けて起きます。

<object data="ここに表示されているurlが入ります"
	type="application/x-shockwave-flash" width="198" height="182" align="middle">
<param name="movie" value="ここに表示されているurlが入ります" />
<param name="allowScriptAccess" value="sameDomain" />
<param name="wmode" value="transparent" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<param name="FlashVars" value="FlashVarsのvalue値、人によって異なるはず"/>
</object>

使用する際には前述した"&"を書き換える注意事項を踏まえたうえで、表示されているurlに同じものを記述してください。ここには表示形式に関する情報が入ります。

FlashVarsのvalue値には、多分個人の識別番号(id)が入っているので、独自の値になるはずです。

変更方法について技術情報

objectにembedが入っていたりでわけのわからない元ソースです。そこでembedについて調べてみるのですが、なかなか的を得た情報が出てきません。もしかすると多くのブラウザに対応させるためにこういった書式なのかも知れませんね。

先ず、objectタグ内のid値について、"+"や" "は出現を許されていないのでidごと消します。

次にembedタグ内のsrc値とtype値をobjectに書きます。このとき、srcはdataの値として、typeはそのままコピペします。本来はこれで動くはずなんですが......あれ、表示できない。

もう一度objectタグに戻ってください。ここのcodebaseとclassidを丸ごと削除します。そうすると表示を確認できましたね。classid値は識別番号かと思いきや、どうやら必要ないようです。

後もう少しで完成です。embedを消すために、必要な値が他には無いか確認しましょう。bgcolorやwidth、heightは既に別に定義されています。そのほかの主要そうなものも定義されてますね。ということでembedと内包された値を丸ごと削除。するとテンプレートと同じになるはずです。

最後に&を記事の冒頭に書いたように、置換して終わりです。

あとがき

無理だと思ってあきらめるところだった今回の置換方法。表示が出来ないのはなかなかに困りました。

それよりもNike+ブログパーツは種類が多すぎるので絞ってもらいたいところです。

2008年7月17日

AIR:チュートリアル、ActionScriptとmxmlで記述するコツ

はじめに

AIRプログラミングをしていて、ActionScript(以下AS)を使ったチュートリアルは充実していてもmxmlとASを用いたものはなかなか見つかりませんでした。僕自身プログラミング自体初心者なので、いちいち四苦八苦しています。

ということで、備忘録もかねて、mxmlとASを用いたプログラミングのチュートリアルと、ありがちな間違いについての記事を書きたいと思います。

実行環境

過去に紹介した「AIR:Eclipseでmxmlをコンパイラできる環境を一から実装」と、「AIR:Eclipseでfcsh環境を実装」を前提に、EclipseとFlex3SDKを使います。

プロラムは、undo0530さんのドラッグ&ドロップ1 外からドラッグ | FlashでAIR作りたい人の日記の最後の段落、「ファイルですねわかります」をそのまま流用させてもらいます。そちらから入手してください。

Let's Programing

まずはASだけでコンパイル

まずは先ほどのソースコードが正常にコンパイルできることを確認しましょう。ファイルを作成します。Eclipseでファイルを新規作成、ファイル名は本家が「DandDtest.as」なので、2番目ということで「DandDtest2.as」としましょう。

ソースコードを貼り付けて保存してfcsh環境を立ち上げます。

mxmlc DandDtest2.as

でコンパイル。するとエラー。

(fcsh) mxmlc DandDtest2.as
fcsh: Assigned 1 as the compile target id
Loading configuration file C:\flex3sdk\frameworks\flex-config.xml
C:\flex\helloworld\src\DandDtest2.as: Error: A file found in a source-path 'DandDtest2' must have the same name as the class definition inside the file 'DandDtest'.

(fcsh) 

Javaでもそうですが、ファイル名とclass名、function名は一致させなければいけません。ファイル名は「DandDtest2.as」としたので、class名とfunction名も「DandDtest.as」にして再度コンパイル。

(fcsh) compile 1
Loading configuration file C:\flex3sdk\frameworks\flex-config.xml
Recompile: C:\flex\helloworld\src\DandDtest2.as
Reason: The source file wasn't fully compiled.
Files changed: 0 Files affected: 1
C:\flex\helloworld\src\DandDtest2.as(23): col: 36 Error: 型が見つからないか、コンパイル時定数ではありません : NativeDragEvent。

		private function onDragEnter(evt:NativeDragEvent) {
		                                 ^

C:\flex\helloworld\src\DandDtest2.as(30): col: 35 Error: 型が見つからないか、コンパイル時定数ではありません : NativeDragEvent。

		private function onDragDrop(evt:NativeDragEvent) {
		                                ^

(fcsh) 

今度もいい感じにエラー。ここで注目しなければいけないのは、元のサンプルは正しいのにもかかわらず、僕の環境ではエラーを吐いていることです。

共通しているエラー内容は、NativeDragEventが無いよ、です。しかしNativeDragEventは定義されています。それなのに間違っているのはなぜでしょうか。このNativeDragEventはFlex3SDKにAIRアプリケーション用として組み込まれています。リファレンスはこちら、NativeDragEvent - ActionScript 3.0 言語およびコンポーネントリファレンスガイドから。

これを読んでも僕は気がつかなかったわけですが、パブリック定数の項を見てください。定数の横に赤い三角のマークがありますよね。これはAIRのアプリケーションのみで使えますよ、という印です。

僕のコンパイル方法、「mxmlc DandDtest2.as」ではAIRアプリケーションではなく、Flashになってしまっています。ですからここでのコンパイルは

amxmlc DandDtest2.as

でAIRアプリケーションとしてコンパイルする必要があります。しかしfcsh環境では、デフォルトではamxmlcのコンパイルに対応していません。fcshでのamxmlcコマンドはfcshでApolloを高速コンパイル(参考リンク集のおまけ付き) | てっく煮ブログで実装方法を解説しています。今回はfcshを使わない方法でいきます。

「AIR:Eclipseでmxmlをコンパイラできる環境を一から実装」こちらの記事と同様に、Eclipseの実行>外部ツールから新たに実行プログラムを登録しましょう。

新規作成したロケーションには

C:\flex3sdk\bin\amxmlc.bat

を登録、作業ディレクトリには各人に合わせたものを、引数には

DandDtest2.as

と、コンパイルするファイルを指定してください。そしてコンパイルすると、以下のように表示されます。

Loading configuration file C:\flex3sdk\frameworks\air-config.xml
C:\flex\helloworld\src\DandDtest2.as(14): col: 25 Warning: return value for function 'init' に型宣言がありません。

		private function init() {
		                      ^

C:\flex\helloworld\src\DandDtest2.as(23): col: 51 Warning: return value for function 'onDragEnter' に型宣言がありません。

		private function onDragEnter(evt:NativeDragEvent) {
		                                                ^

C:\flex\helloworld\src\DandDtest2.as(30): col: 50 Warning: return value for function 'onDragDrop' に型宣言がありません。

		private function onDragDrop(evt:NativeDragEvent) {
		                                               ^

C:\flex\helloworld\src\DandDtest2.swf (1016 bytes)

Eclipseでは、このメッセージが赤色で表示されます。Errorは出ていませんが、Warningが出ています。見えにくいので、型宣言を忘れないようにすると、気持ち間違えにくいプログラミングが出来ると思います。それぞれの()のあとに「:void」をつけてコンパイル。

Loading configuration file C:\flex3sdk\frameworks\air-config.xml
C:\flex\helloworld\src\DandDtest2.swf (1027 bytes)

コンパイル成功。しかしこれでは実行できません。出力されたファイルを実行すると、

VerifyError: Error #1014: クラス flash.events::NativeDragEvent が見つかりません。

	at global$init()

amxmlcコマンドでコンパイルして出力されるswfファイルは、AIRアプリケーションのための中間段階のファイルです。実際に実行するためにはAIRアプリケーションとしてパッケージングしなければいけません。

とはいっても、いちいち動作確認の度にやるのは馬鹿らしい話です。そこで登場するのがadlコマンドです。これはデバッグ用のコマンドで、一度そのプログラムに対応させたものを作成しておけば、amxmlcコマンドで中間ファイルとして出力されたswfを実際のアプリケーションとして動作させることができます。

新しいファイルを作成し、それの名前を「DandDtest2.xml」としてください。そしてファイルの中身を、

<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/1.0" minimumPatchLevel="1047">
	<id>net.libertatem.org.DandDtest2</id>
	<name>DandDtest2</name>
	<version>1.0</version>
	<filename>DandDtest2</filename>
	<description>DandDtest2 application</description>
	<copyright>(c) 2008 Libertas</copyright>
	<initialWindow>
		<content>DandDtest2.swf</content>
		<title>DandDtest2</title>
		<systemChrome>standard</systemChrome>
		<transparent>false</transparent>
		<visible>true</visible>
		<minimizable>true</minimizable>
		<maximizable>true</maximizable>
		<resizable>true</resizable>
		<x>150</x>
		<y>150</y>
	</initialWindow>
	<installFolder>libertas/DandDtest2</installFolder>
	<programMenuFolder>libertas/DandDtest2.as</programMenuFolder>
	<customUpdateUI>false</customUpdateUI>
	<allowBrowserInvocation>false</allowBrowserInvocation>
</application>

コピペして保存。このファイルは詳しい説明は省略します。adfファイルというもので、プログラムのウィンドウサイズなどを指定しています。DandDtest2.swfが中段で指定されているところに注目してください。

それではまたEclipseの実行>外部ツールから新たに実行プログラムを登録しましょう。新規作成したロケーションには

C:\flex3sdk\bin\adl.exe

を登録、作業ディレクトリには各人に合わせたものを、引数には

DandDtest2.xml

としてLet's実行です。そうするとウィンドウが現れましたね。この白い四角になにかファイルをドラック&ドロップしてみてください。そうするとEclipseのコンソールウィンドウに文字が現れました。traceは本来デバッグなどに使用する出力コマンドです。僕の環境では文字化けしてしまっていますが、"ファイルですね、わかります"と出力されているはずです。

AS+mxmlでコンパイル

やっとmxmlです。それではmxmlファイルを「DandDtest2.mxml」で新しく作成してください。そして以下をコピぺ。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="absolute">
	<mx:Script source="DandDtest2.as" />
</mx:Application>

さて、これでmxmlからASを呼び出しています。実行できるはず......!と、その前に、amxmlcコマンドの対象を新たなファイルにするために、引数の値を書き換えておきましょう。「DandDtest2.as」から「DandDtest2.mxml」です。

Loading configuration file C:\flex3sdk\frameworks\air-config.xml
C:\flex\helloworld\src\DandDtest2.as(1): col: 9 Error: パッケージをネストすることはできません。

package {
        ^

Why何故......。ではここでは何も考えずに消してみましょう。出来ないなら消せばいい。「DandDtest2.as」のpackageを{}と一緒に消しましょう。これでどうだとコンパイル。

Loading configuration file C:\flex3sdk\frameworks\air-config.xml
C:\flex\helloworld\src\DandDtest2.as(6): col: 9 Error: クラスをネストすることはできません。

	public class DandDtest2 extends Sprite {
	       ^

shit何故......。不安なんか気にせずに消してみましょう。出来ないなら消せばいい。「DandDtest2.as」のclassの行を{}と一緒に消しましょう。これでどうだとコンパイル。

Loading configuration file C:\flex3sdk\frameworks\air-config.xml
C:\flex\helloworld\src\DandDtest2.as(10): col: 20: Error: Multiple constructor definitions found. Constructor may not be defined in <Script/> code.

		public function DandDtest2() {
		                 ^

......もう言わなくてもわかりますね。消し消し~。

Loading configuration file C:\flex3sdk\frameworks\air-config.xml
C:\flex\helloworld\src\DandDtest2.swf (157260 bytes)

やった!コンパイルは成功です!

何でネストできないの?

さまざまな記事で触れられていますが、mxmlからASを呼び出したときは、既にpackageとclassは呼び出されています。ですからファイルにも書かれていると二重に呼び出されたことになります。そのために消す必要があります。

これは仕様ですので今後気をつけてください。ASの書き始めは見た目C言語のようになる、ということです。

完成したかな?

ここまでのASがどうなっているかを下に示します。

	import flash.desktop.*;
	import flash.display.*;
	import flash.events.*;


		private var Yohaku:Number = 20;
		private var canvas:Sprite = new Sprite();


			init();


		private function init():void {
			canvas.graphics.beginFill(0xeeeeee);
			canvas.graphics.drawRect(Yohaku,Yohaku,stage.stageWidth - Yohaku*2, stage.stageHeight - Yohaku*2);
			canvas.graphics.endFill();
			addChild(canvas);
			canvas.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);
			canvas.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDragDrop);
		}

		private function onDragEnter(evt:NativeDragEvent):void {
			var data:Clipboard = evt.clipboard;
			if (data.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
				NativeDragManager.acceptDragDrop(canvas);
			}
		}

		private function onDragDrop(evt:NativeDragEvent):void {
			trace("ファイルですね、わかります");
		}

adlを呼び出しましょう。コンパイルが成功するはずです。

やった~コンパイル成功。でも、あれ、白い四角が表示されていない?

AS+mxmlでのプログラミングで間違いやすいポイント

継承

AIRアプリケーションではUIComponentはSpriteを継承しているためです。これの取り組みについてはこちらの記事に詳しく書かれています。Flex 3で直接Spriteを使用することはできない? - Memorize -

この行に注目してください。

		private var canvas:Sprite = new Sprite();

ここでSpriteが使われていますね。これを以下のようにします。

		private var canvas:UIComponent = new UIComponent();

このように定義が変わっていることがあります。コンパイルが通っても正常動作するとは限らないので用心してください。

mx.core

AIRアプリケーションとして、インポートをいつも求められるのがこれです。先頭行に追加してください。

import mx.core.*;

必ず書くぐらいの認識で問題ないです。

mxmlから呼び出そう

さて、本来のASで以下の部分がありましたね。

		public function DandDtest() {
			init();
		}

ここから「init()」を呼び出していましたが、先ほど消してしまったので機能していません。ですから残された「init()」も消してしまいましょう。

変わりにmxmlから呼び出す必要があります。次の要素を「mx:Application」タグ内に定義してください。

 applicationComplete="init();"

これで完成です。

完成!出来上がった3つのファイル

完成しました!いや、記述ミスがあったら完成していないかもしれません。困ったね。

完成したファイルは以下のようになります。

DandDtest2.mxml

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();"
	layout="absolute">
	<mx:Script source="DandDtest2.as" />
</mx:Application>

DandDtest2.as

import mx.core.*;
	import flash.desktop.*;
	import flash.display.*;
	import flash.events.*;


		private var Yohaku:Number = 20;
		private var canvas:UIComponent = new UIComponent();


		private function init():void {
			canvas.graphics.beginFill(0xeeeeee);
			canvas.graphics.drawRect(Yohaku,Yohaku,stage.stageWidth - Yohaku*2, stage.stageHeight - Yohaku*2);
			canvas.graphics.endFill();
			addChild(canvas);
			canvas.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);
			canvas.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDragDrop);
		}

		private function onDragEnter(evt:NativeDragEvent):void {
			var data:Clipboard = evt.clipboard;
			if (data.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
				NativeDragManager.acceptDragDrop(canvas);
			}
		}

		private function onDragDrop(evt:NativeDragEvent):void {
			trace("ファイルですね、わかります");
		}


DandDtest2.xml

<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/1.0" minimumPatchLevel="1047">
	<id>net.libertatem.org.DandDtest2</id>
	<name>DandDtest2</name>
	<version>1.0</version>
	<filename>DandDtest2</filename>
	<description>DandDtest2 application</description>
	<copyright>(c) 2008 Libertas</copyright>
	<initialWindow>
		<content>DandDtest2.swf</content>
		<title>DandDtest2</title>
		<systemChrome>standard</systemChrome>
		<transparent>false</transparent>
		<visible>true</visible>
		<minimizable>true</minimizable>
		<maximizable>true</maximizable>
		<resizable>true</resizable>
		<x>150</x>
		<y>150</y>
	</initialWindow>
	<installFolder>libertas/DandDtest2</installFolder>
	<programMenuFolder>libertas/DandDtest2.as</programMenuFolder>
	<customUpdateUI>false</customUpdateUI>
	<allowBrowserInvocation>false</allowBrowserInvocation>
</application>
</pre>

あとがき

用語とか高確率で間違っていると思います。調べながらやってみましたが、そのかわり初心者の僕らしいチュートリアルにするべく、慣れていない人には気になるポイントを重点的に取り上げてみました。誰かに聞けないとめちゃくちゃ解決に時間かかりますからね......

記述ミスの確認もしましたが、何かありましたらコメントお願いします。

2008年8月17日

iKnowブログパーツ、xtmlに準拠したobject要素への書き換え

iKnowいいよiKnow。iKnowとは英語の勉強が無料で出来るWebサービス。今回はXHTML 1.0 Transitionalに対応させつつ、IE6.0やモダンブラウザでも動作するiKnowブログパーツへの変更方法です。

iframeやembedをobjectへ変更する方法は、過去記事のNike+、xhtmlに対応したobject要素への書き換えアマゾンアソシエイト、<iframe>を<object>にStickam、<embed>を<object>にでも解説しています。

実用範囲についての注意

方法は以下に示しますが、その前に注意書きを何点か。

  • XHTML 1.0 Transitionalについてのみの解説(Strictでも動くかも
  • ブログパーツの表示形式が異なるときはwidthやheightに注意
  • &の文字を文字実態参照(&amp;)、もしくは数値文字参照(&#38;)に置き換えること
  • CSSを切ると表示されないようです。執筆時点では原因はわかりません。

実際の表示

今回はJavaScript無しの表示形式に対応しています。

テンプレートと使用方法

テンプレートは以下の通り。3種類とも共通部分が多くあります。

<object data="http://www.iknow.co.jp/widgets/iknow_public_badge.swf"<!--iknow,dectation,brainspeedそれぞれ合わせてください-->
	type="application/x-shockwave-flash" width="150" height="40" id="iknow_badge">
<param name="movie" value="http://www.iknow.co.jp/widgets/iknow_public_badge.swf" />
<param name="wmode" value="transparent" />
<param name="allowScriptAccess" value="always" />
<param name="FlashVars" value="FlashVarsのvalue値。&を&#38;に変更" />
</object>

使用する際には前述した"&"を書き換える注意事項を踏まえたうえで、表示されているurlに同じものを記述してください。ここには表示形式に関する情報が入ります。

注意で示した点。CSSを切ると表示されないのは何故なのかわかりません。失念しているだけのようにも思えますが、注意してください。

最後に、iKnowをこの記事で興味をもたれた方、既にお使いになられている方、よかったら先ほどの表示例から飛んで、フレンド登録してくださいー。それぞれの目的のために共闘しませんか、と宣伝しておきます。

About Language

ブログ「Libertas」のカテゴリ「Language」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはCreateです。

次のカテゴリはNotionです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.