1つの送信要求で送信されるデータ量の上限は40Kです。ユーザがアクセスを無効にしたり格納の制限を設定したりできるので、信頼性は高くありません。データは暗号化されずにディスクに格納されます。データは複数のセッションにわたって使用できます。同じドメイン内のSWFファイル間の通信にのみ役立ちます。共通の、デフォルト以外のパスを使用して、SWFファイルが共有を実行するよう選択する必要があります。中継は信頼できない可能性のあるサードパーティを介して行われます。大規模なデータ交換には非効率的です。クロスサイトスクリプティングを防止するために、慎重なコーディングを使用する必要があります。
関連する脅威:クロスドメインの権限の昇格、悪意のあるデータのインジェクション、送信中のデータに対する無許可のアクセス、承認の不適切な制限
LoaderContextパラメータの設定で指定されているドメインによっては、Loaderクラスを使用して読み込みロードまたはクロススクリプト通信を実行できます。コンテンツをロードする際は、2種類のドメインを指定できます。1つはセキュリティドメインで、これは通常、SWFがロードされた場所によって定義されます。セキュリティドメインは、SWFの読み込みロードを行うかどうかを判断するために使用されます。各セキュリティドメインには、コード内でのクラス間の継承とアクセス範囲を定義する「ApplicationDomain」を複数含めることができます。0で作成されたSWFファイルでのみサポートされます。セキュリティドメインは、別のドメインからSWFファイルがロードされるときに割り当てられます。HTMLページのデフォルトでは、それぞれ異なるドメイン名から別々にロードされた2つのSWFファイルには、別々のセキュリティドメインが割り当てられます。ロードする側のSWFファイルが、コードにリモートSWFを組み込むことによってリモートSWFを明示的に信頼している場合は、それ自身のセキュリティドメインに直接リモートSWFを読み込むことができます。このプロセスを読み込みロードと呼びます。開発者は、読み込みロードを使用することにより、自分のドメインからロードするかのように別のドメインからリモートSWFファイルをロードできます。この方法は、リモートドメインからロードするコンテンツを完全に信頼できる場合にのみ検討するようにしてください。0での読み込みロードは、他人のコードのeval()を実行することと同じです。SWFファイルがそれ自体のセキュリティドメインに置かれたままである場合は、この節の後の方で説明するように、クロススクリプトの許可を使用して通信を許可する必要があります。読み込みロードを実行して現在のセキュリティドメインにリモートSWFをロードするには、2つの方法があります。ロードされる側のSWFのセキュリティドメインは、ロードする側のSWFファイルのドメインにしか変更できません。xmlファイルが存在する必要があります。
読み込みロードされたSWFからロードする側のSWFファイルのDOMへのアクセスの許可
リモートSWFをロードするときは、アクセスによってそのSWFファイルが他のSWFコンポーネントに及ぼす影響と、ロード先のWebページへの影響の両方を考慮する必要があります。
アプリケーションドメインの設定
アプリケーションドメインは、インタプリタがクラスを処理する方法と、ロードされる側のSWFに対してロードする側のSWFファイルのクラスに対するアクセスや継承を許可するかどうかを定義します。アプリケーションドメインはActionScriptコードの協調する単位の管理を目的としており、セキュリティ目的での使用を意図していません。0で作成されたSWFファイルに適用することはできません。どのオプションが適切であるかは、個々のアプリケーションによって異なります。ロードする側のSWFに、ロードされる側のSWFにすぐに公開してはいけないクラスが含まれている場合、開発者はSWFをシステムのApplicationDomainの子としてロードして、ロードする側のファイルのクラスを継承しないようにする必要があります。これを行う方法のコード例を次に示します。
ドメイン間のクロススクリプトの実行
関連する脅威:クロスドメインの権限の昇格、悪意のあるデータのインジェクション、送信中のデータに対する無許可のアクセス、承認の不適切な制限
この節で説明している内容についてさらに詳しく知りたい場合は、Adobe LiveDocsの次のページを参照してください。同じドメインから2つのSWFファイルをロードする場合、そのSWF間で通信を行ってデータと関数を共有できるようにするための方法はいくつかあります。
しかし、別々のドメインから2つのSWFファイルをロードする場合は、アクセス先のSWFファイル内でsystem
allowDomain()を指定して特別にアクセスを許可しない限り、ファイル間でクロススクリプトによる通信を実行することはできません。
2つのSWFファイルが双方向でデータを交換する必要がある場合は、両方のSWFファイルにallowDomainステートメントを含める必要があります(図1
HTTP経由でロードされるSWFファイルがHTTPS経由で提供されるSWFファイルのデータにアクセスするためには、特別なアクセス許可が必要です。このような種類のシナリオは、できる限り避けることを強くお勧めします。この種類の通信を使用すると、SSLによって保護されている重要なデータが、保護されていない環境に流出する恐れがあります。開発者は、SWFのコンパイル時に指定するPlayerのバージョンを決定する際に、その点を考慮に入れる必要があります。
次の表に相違点を示します(表2
Flash Playerの各バージョンで実装されるクロスドメインセキュリティ規則
クロススクリプトに関与するSWFの最新バージョン
必要(スーパードメインが一致しない場合)
必要(ドメインが完全に一致しない場合)
ドメインが完全に一致する場合もこれに含まれます)
アクセス先SWFファイル、またはアクセス先SWFファイルと同じスーパードメインにある任意のSWFファイル
アクセス先SWFファイル、またはアクセス先SWFファイルとまったく同じドメインにある任意のSWFファイル
例えば、Flash Playerバージョン9でバージョン7用に公開されたSWFファイルを再生する場合は、バージョン7に沿った動作が適用されます。これによって、下位互換性が維持され、Flash Playerがアップグレードされてもデプロイ済みのSWFファイルの動作が変更されなくなります。allowDomain()メソッドは、クロススクリプトの実行、表示リストへのアクセス、Stageオブジェクトへのアクセスおよびイベントの検出のためのアクセス許可を付与します。これは、リモートドメインにHTMLからSWFへのスクリプトを許可するということも意味します。2つのドメイン間のクロススクリプトは、スクリプトを許可するアクセスで、アクセスを許可されるドメインを明示的に信頼できる場合にのみ許可するようにしてください。クロススクリプトでは、SWFのアクセス許可の付与に含まれるすべてのオブジェクトとメソッドへのアクセスが許可されます。
共有リソースの使用による通信
次の3つの方法では、共有リソースを使用して通信を行う際の考慮事項について説明します。これらの方法では、対象のSWFファイルをロードする必要はなく、複数のSWFファイルへの通信を許可できます。共有リソースには、ローカル接続、ローカル共有オブジェクトおよびJavaScriptの中継が含まれます。
関連する脅威:クロスドメイン権限の昇格、悪意のあるデータのインジェクション、承認の不適切な制限
2つ以上のSWFファイルが同じマシン上で同時にホストされている場合、LocalConnectionオブジェクトを使用して、SWFファイルが相互に通信することを許可することができます。要件は双方のSWFが同じマシン上で同時に実行されていることだけなので、2つのSWFファイルが同じブラウザで実行されている必要はありません。接続の識別名は、開発者が割り当てた接続名に付加されたドメイン名です。allowDomainメソッドは、許可をチェックするための割り当て可能なメソッドです。次のコード例は、接続名の接頭辞としてスーパードメインを追加する方法を示しています。この場合、次のように完全なドメインで接続を識別する必要があります。また、接続名の前に「_」を追加することで、接続をグローバルアクセス可能にすることもできます。これらの機能は、開発時のデバッグにのみ使用するようにしてください。これらの機能を使用すると、次のようにどのサイトのどのSWFでもLocalConnectionに接続できるので、原則として運用コードで使用することはできません。allowDomainでワイルドカードではなく複数ドメインのホワイトリストを使用する。テスト中、ワイルドカード機能を使用したくない場合は、次のように、許可されたすべての呼び出し元を列挙するallowDomain関数のより複雑なロジックを作成できます。コンパイル時にロードされるSWFのドメイン名が不明である場合、ワイルドカードを使用する代わりに、これらのプロパティを使用してドメイン名をダイナミックに取得できます。ただし、次のように、場合によってはインターネット上のどのサイトでもSWFをロードできることに注意してください。Flash Player 7以降用に作成されたファイルを操作している場合、このメソッドを使用して、セキュリティ保護されていないプロトコルでホストされているSWFファイルから、セキュリティ保護されたプロトコル(HTTPS)を使用してホストされているSWFファイルへのアクセスを許可することはできません。
ローカル共有オブジェクトを使用するときのセキュリティに関する考慮事項
関連する脅威:クロスドメインの権限の昇格、悪意のあるデータのインジェクション、ローカルデータに対する無許可のアクセス、承認の不適切な制限
サードパーティローカル共有オブジェクトについて詳しくは、サードパーティローカル共有オブジェクトについての記事を参照してください。ローカル共有オブジェクト(LSO)は、少量データの永続記憶領域用に用意されたメカニズムです。このデータへのアクセスは、SWFをホストするドメイン、SWFのローカルパス、およびSWFがHTTPS経由でロードされているかどうかという3つの要素を確認することによってセグメント化されます。あるドメインが別のドメインのSWFデータにアクセスできないことを確認するために、ドメインが常にチェックされます。また、ドメインがサードパーティのSWFファイルをホストしている場合にもチェックされます。エンドユーザは、Flash Playerのデフォルト設定を変更して、サードパーティのSWFファイルにローカル共有オブジェクトを作成する機能を与えないようにすることができます。ユーザがこの設定を変更すると、Webページと同じドメインでホストされているSWFファイルはローカル共有オブジェクトを作成できますが、別のドメインから読み込まれたSWFファイルは、ローカル共有オブジェクトを作成したり、既存のローカル共有オブジェクトにアクセスしたりすることはできなくなります。ローカル共有オブジェクトのデータは、URLパスによってもセグメント化されます。デフォルトでは、共有オブジェクトはSWFファイルの名前を含むURLの完全パスに制限されています。つまり、共有オブジェクトを作成したSWFファイルだけがその共有オブジェクトにアクセスできるということです。ただし、共有オブジェクトに対するアクセス許可を拡張して、パスに基づく追加アクセスを許可することができます。ドメイン内のすべてのSWFファイルが同じデータを共有できるように、ローカル共有オブジェクトの作成時に「/」を指定する設計者もいます。独立したグループがすべて同じドメインでホストされている場合、共有環境の開発者にとって問題が生じる可能性があるので、この設定はお勧めしません。他の開発者のコンテンツをホストするサードパーティによってSWFファイルがホストされる場合、Webサイトの自分のセクションだけにアクセスを制限するようパス値を設定することがベストプラクティスです。次のコード例は、localPathをローカル共有オブジェクトに指定する方法を示しています。
secureフラグを使用した共有オブジェクトの保護
これにより、HTTPS経由で提供されるSWFファイルは、同じドメインからHTTPS経由で提供される他のSWFファイルにのみアクセスできる共有オブジェクトを作成できます。つまり、HTTP経由で提供されるSWFとHTTPS経由で提供されるSWFが同じファイルであっても、HTTP経由のSWFは、HTTPS経由のSWFによって設定されたセキュリティ保護された共有オブジェクトにアクセスすることはできません。同じドメインとパスのすべてのSWFが共有オブジェクトにアクセスでき、Flash Player 8以前に作成されたSWFファイルが影響を受けないように、このフラグはデフォルトで「false」に設定されています。次のコード例は、同じドメインからHTTPS経由で提供されたSWFファイル間でローカル共有オブジェクトにアクセスする方法を示しています。ローカル共有オブジェクトに格納されたデータは、直列化されたバイナリ形式で維持されます。ただし、データは暗号化されません。開発者がローカル共有オブジェクトファイルの読み取りと書き込みを行う複数の無料ツールを作成しているので、ローカル共有オブジェクトはセキュリティ保護されていません。また、Cookieと同様に、共有オブジェクトはユーザが制御する設定によって制限されます。エンドユーザは、ローカル共有オブジェクトの記憶領域サイズを変更することも、記憶領域を完全に拒否することもできます。そのため、次のように、ローカル共有オブジェクトを使用してアプリケーションで破棄または変更できないものを格納しないようにしてください。RTMP経由で送信されるデータは暗号化されないので、送信するデータを決定するときは慎重に検討してください。ネットワークトラフィックを監視している攻撃者が、RTMPストリームで送信されるデータを取得する恐れがあります。機密データを送信する必要がある場合は、代わりにRTMPS接続またはHTTPS経由のRTMP接続を使用する必要があります。
関連する脅威:承認の不適切な制限
xmlの比較などの設定には影響しません。このドメイン設定では、ドメインの最初のピリオドの前の値が破棄されます。comドメインに含まれると見なされ、同じものとして扱われます。comは別々のドメインと見なされます。exactSettingsをデフォルト値から変更するときは、Flash Playerがプレイヤーの設定を選択する必要のあるイベント(カメラまたはマイクの使用や、永続共有オブジェクトの取得など)が発生する前に、変更を実行する必要があります。
関連する脅威:悪意のあるデータのインジェクション、承認の不適切な制限
スクリプトアクセスは、元のSWFと元のSWFによってロードされたすべてのSWFに対して許可されます。多くの複雑なWebページには、さまざまなリモートドメインのコードにリンクされた広告が含まれています。SWFはWebブラウザと通信しているので、データ検証を実行していないと、クロスサイトスクリプティングが発生する可能性があります。call()の代わりにfscommand()を使用すると、信頼性のない外部データがWebページに渡されるときに攻撃者が利用できる攻撃対象領域を制限できます。ただし、fscommandを使用してもSWFがブラウザとやり取りする方法が制限されるだけであり、クロスサイトスクリプティング攻撃の可能性を完全に排除できるわけではありません。したがって、可能であればスクリプトアクセスを1つのドメインに制限するようにしてください。addCallback関数から受け取ったデータは、SWFによって処理される前にデータ検証を実行しておく必要があります。クロスサイトスクリプティングの脆弱性がWebページ自体に存在する場合、攻撃者はその脆弱性を利用して悪意のあるデータをSWFに送信する可能性があります。また、SWFが信頼性のないWebページによってロードされる可能性もあります。したがって、データを外部リソースから受信するときには、データ検証を必ず実行する必要があります。allowScriptAccessタグは、Webページへのアクセスを許可する際のオールオアナッシングの方法なので、場合によってはより制限的な代替方法が必要となります。データを受信したら、信頼できるSWFでデータを検証し、Webページへの必要なスクリプト呼び出しを行うことができます。
リモートソースからのデータの検証
次に例を示します。開発者がキー変数を初期化するのを忘れた場合や、コードでまず変数が初期化されると考えている場合、これは開発者にとって問題となることがあります。また、すべての変数を初期化する必要があります。データを検証するときは、ほとんどの種類のデータについて次の重要ポイントを考慮する必要があります。
データは適切な長さか
可変長が許可されている場合は、データを許可されている最小長と最大長の両方と比較します。
データに含まれている文字は正しいか
ASCII文字の場合、そのデータに対して許可される文字のホワイトリストを作成します。Unicodeおよび国際化についての処理を行う場合は、ブラックリスト方式を使用することが必要になる場合があります。
文字は正しい順序になっているか
たとえば、電話番号で括弧を許可することができます。ただし、括弧が文字列の先頭と5番目の位置に配置されていることを確認する必要があります。
データが一連の論理ブロックである場合、個々のブロックの長さと形式は適切か
たとえば、社会保障番号は3-2-4形式でグループ化された一連の数字であり、米国の電話番号は3-3-4形式でグループ化された一連の数字です。
データに含まれているのは想定された文字列だけか
データに不要な文字列が含まれていないか
たとえば、URLにjavascript:などの不要なスキームが含まれていることは望ましくない場合があります。FlashVarsは、ダイナミックなデータを読み込む唯一の方法というわけではありません。0の場合)、XMLクラスまたは他のローダーを使用してサーバからデータを取得できます。SSLを使用していない場合、信頼できるソースからリモートデータをロードするときに、man-in-the-middle攻撃などのネットワークベースの攻撃の対象となることがあります。いずれの場合にも、データ検証を実行する必要があります。読み込まれたデータを検証する一般的な手法は、データが正規表現と一致しているかどうかをチェックすることです。0では、正規表現をネイティブでサポートしています。0の開発者は、データ検証で正規表現を利用するために、as2lib*などのサードパーティライブラリを利用する必要があります。
無料のSDKが提供する一般的なデータ検証クラス
ここに用意されたサンプル以外に、開発済みのデータ検証ライブラリがインターネット上で公開されています。
SWFファイルへのパラメータとしてのリモートコンテンツのURLの受け入れ
関連する脅威:クロスドメイン権限の昇格、悪意のあるデータのインジェクション、ブラウザへのスクリプトのインジェクション
データ検証を実行していない場合、URLをダイナミックな変数として受け入れることができるSWFファイルは、さまざまな種類の攻撃の影響を受けやすいので、URLまたはFlashVarsで提供される変数に対してデータ検証を実行することが非常に重要となります。
ブラウザと通信するメソッドの攻撃
0コードについて考えてみます。このコードでは、FlashVarsのparamタグまたはURL文字列から変数を受け取り、渡される値が予期された値かどうかを検証せずにロード要求に直接渡します。この要求はブラウザに直接渡されるので、攻撃者はブラウザが受け入れる任意のプロトコルで渡すことができます。攻撃者が次の要求を送信したとします。comドメインへのクロスサイトスクリプトを許可されることになります。この攻撃の結果はSWFファイルをホストするブラウザによって異なりますが、概念は適用されます。この種の攻撃から保護するために使用できる方法がいくつかあります。たとえば、独自のドメインからのみURLを要求することを計画している場合は、前述のリスクを伴う例にあるURLRequestの初期化を次のコード行に置き換えることができます。データを任意のドメインからロードする必要がある場合に使用できる別の手法は、http://またはhttps://で始まっていないすべてのURLを拒否することにより、URLのデータ検証を実行することです。URLを使用する前に、次のコードを使用して基本的なテストを実行できます。セキュリティを強化するには、この簡単な例よりもさらに徹底したチェック(URLに特殊文字が含まれていないかどうかの検証など)を実行するのが賢明であると考えられます。この方法を使用すると、SWFをロードしたときにスクリプト処理がブラウザに送信されないようにすることができます。それだけでなく、親によってロードされたSWFからスクリプト処理がブラウザに送信されることもなくなるため、保護が強化されます。
ナビゲーション関数を使用したデータの送信
これにより、SWF内の変数がURLのGETパラメータまたはヘッダ(POSTの使用時)として要求に追加されます。0では送信する変数を指定できないので、開発者はこれらの要求と共に予期しないデータが送信されていないかどうかを確認するためのテストを行う必要があります。また、データはURLの末尾に追加されるので、GETメソッドを設定するときはこの機能を慎重に使用する必要があります。0では、要求に関連付ける変数を手動で指定する必要があります。そのため、誤って不要な変数が含まれることに伴う同様のリスクはありません。
特殊文字のエスケープ
0のコアクラスです。文字をエスケープすることにより、コードで有効なURLを作成できるようになります。どの関数が適切かという判断は、操作しているデータと、そのデータがURI全体または小さな構成要素のどちらを表しているかによって異なります。別の例としては、攻撃者がOSを操作しようと企てて、file: URLの末尾に悪意のあるデータを挿入することが挙げられます。開発者は、次のようにデータをエンコードまたはエスケープすることにより、対象のWebサーバでこのような攻撃が成功する可能性を低減できます。
ネットワーク関数に送信されるURLの検証
前述の各手法は、ネットワーク関数にも適用する必要があります。リモートリソースからXMLデータや変数をロードするためにURLが使用される場合は、それらのURLを必ず検証する必要があります。攻撃者が別のドメインからロードするようにSWFをリダイレクトできる場合、SWFは悪意のあるデータで初期化されるおそれがあります。loadPolicyFile関数は、クロスサイトリクエストフォージェリ攻撃の一環として、クロスドメインのHTTP GET要求を送信する方法として悪用されるおそれがあります。Flash Playerが最初の要求から問題のある戻りデータを受信すると、サイトのその領域への以降の要求はブロックされます。
リモート変数とリモートデータの安全なロード
関連する脅威:悪意のあるデータのインジェクション
通常、変数は次のAPIからロードされます。リモートリソースからデータを取得するときには、開発者はデータを処理する前にデータを検証する手段を講じる必要があります。たとえば、開発者は、信頼できるリモートドメインからデータをロードするのでデータが安全であると思い込んでいることがあります。適切な保護レベルを検討するときには、開発者はホストページのデータの価値を考慮に入れる必要があります。たとえば、SWFにクロスサイトスクリプティングの脆弱性がある場合、ホストページは侵害され、そのサイト上のユーザのデータはリスクにさらされることになります。次の例は、非常に基本的な検証関数を示しています。ほとんどの場合、開発者は各自の環境により特化したものになるように、これらの例を補強すると考えられます。SWFがブラウザからデータを受信するときは、登録済みのコールバック関数によって受信したデータを検証する必要があります。SWFが信頼できるサイトによってホストされている場合でも、ホストサイトにクロスサイトスクリプティングの脆弱性があり、外部の攻撃者が任意のJavaScript呼び出しを行うことができる可能性があります。したがって、外部ソースのすべてのデータを常に検証することが必要です。
テキストフィールドおよび描画可能領域での安全なコンテンツ表示
この節では、SWFアプリケーション内でデータを安全に表示する方法について説明します。ここでは、HTML形式のテキストフィールドの操作および描画可能領域へのコンテンツのロードについて説明します。
出力検証を使用したHTMLテキストフィールドの保護
関連する脅威:悪意のあるデータのインジェクション、ブラウザへのスクリプトのインジェクション
0の場合)、HTML形式のテキストを表示できます。未検証のデータを外部リソースから取得し、テキストフィールドに配置したときに、セキュリティの脆弱性が発生する可能性があります。HTMLが解釈されるので、フィールドはクロスサイトスクリプティングなどの一般的なWeb攻撃の対象となる場合があります。したがって、可能であれば正規テキストフィールドを使用することがベストプラクティスです。場合によっては、サードパーティソースのコンテンツを表示するHTMLテキストフィールドを作成する必要性が生じることがあります。出力検証を多層防御対策として使用することで、不要なHTMLがテキストフィールドに挿入されないようにすることができます。これは、クロスサイトスクリプティング攻撃を防ぐためにWebサーバアプリケーションでも使用される一般的な手法です。0でStringクラスを改良し、置換メソッドを含めました。0の検索および置換メソッドの実装方法については、さまざまな手法が文書化され、Web上で公開されています。0における文字の置換メソッドを示しています。
HTMLテキストフィールドに書き込む前の無効なURLのチェック
関連する脅威:悪意のあるデータのインジェクション、ブラウザへのスクリプトのインジェクション
場合によっては、サードパーティソースのコンテンツを表示するHTMLテキストフィールドを作成する必要性が生じることがあります。悪意のあるユーザが、アンカータグおよびイメージタグ内でjavascript: URLまたはvbscript: URLを使用してクロスサイトスクリプティング攻撃を仕掛けることで、この機能を悪用しようとするおそれがあります。攻撃者は、任意のスキームを含むURLを挿入しようとする場合があることに注意してください。Webブラウザは非常に多くのスキームを認識するので、予期しないスキームが挿入された場合に、ユーザとアプリケーションに対してどのようなリスクがあるかを検討する必要があります。どの方法を使用する場合でも、アンカータグとイメージタグのURLに対処することが必要です。次の例は、クロスサイトスクリプティングで通常使用されるURLの文字列をチェックする方法を示しています。
0の書式設定に対するデータ検証の実行
テキストフィールドの書式設定もHTMLに変換されます。fontフィールドなどのフィールドに対してインジェクション攻撃を仕掛けようとすることがあります。したがって、HTMLテキストフィールドに移動するすべてのリモートデータを必ず検証してください。
ドメインの制限が維持されるHTMLテキストフィールド内のイメージURL
HTMLテキストフィールド内のイメージも、クロスドメインの制限を受けることに注意してください。別のドメインからイメージをロードすることを予定している場合は、次のようにイメージタグ内でcheckPolicyFileフラグを指定して、クロスドメインアクセス許可をチェックできます。テキストフィールド内のイメージタグを使用して、SWFファイルもロードできます。
Loaderオブジェクトのマスクを常に設定
関連する脅威:スプーフィング、クロスドメイン権限の昇格
信頼性のないサードパーティソースからSWFファイルをロードするときは、Stageの中で親にとって不可欠な部分の上にロードされたコンテンツが描画されるのを防ぐために、Loaderオブジェクトのマスクを定義することが必要となる場合があります。0コードは、Loaderオブジェクトにマスクを設定する方法を示しています。エラーおよびセキュリティエラーイベントの処理の詳細については、Adobe LiveDocsの次のページを参照してください。
errorsパッケージに含まれるエラークラス
スローされた例外をキャッチし忘れることは、よくあります。また、例外をキャッチしたときに有効な処理を行わないコードを誤って追加してしまうこともよくあります。Flash Playerで発生する一部のエラーや多くのイベントは、何らかの形で処理する必要があります。たとえば、セキュリティエラーイベントは、外部のソケット、URL、またはファイルへの非同期の接続を通じて通信を行うときに発生します。これらのイベントは、接続が行われるときに必ず発生するとは限りません。エラーイベントは、ロードされた外部データに対して、何らかの処理が行われようとしたときにも発生する場合があります。開発者にとって重要なことは、各メソッドによってスローされる例外の種類を監視することと、できる限り多くの例外をキャッチすることです。セキュリティエラーをキャッチした場合は、フェールセーフなメカニズムを起動して、その処理を終了させるか、アプリケーションを安全に終了させる必要があります。セキュリティが損なわれ、Flash Playerがセキュリティエラーをスローしている状況では、例外を無視して現在のコードパスをそのまま実行することは危険です。次に例を示します。
ロードエラーの処理
セキュリティエラーイベントについて犯しやすい間違いの1つに、Loaderクラスでの処理があります。load()メソッドの実行時にセキュリティエラーイベントが発生する場合があります。次に例を示します。
セキュリティ境界を越えたイベントの共有
データの暗号化
SWF Webアプリケーションでデータを暗号化するには、いくつかの方法があります。ここでは、それらの方法について簡単に説明します。
関連する脅威:送信中のデータに対する無許可のアクセス、ローカルデータに対する無許可のアクセス
ハッシングとは、不可逆的な暗号化を行う方法で、元のテキストを一意の文字列(ハッシュ)に変換します。ハッシュは不可逆であるため、ハッシュを元のテキストに戻す方法はありません。ハッシュアルゴリズムは、パスワードの認証や格納などの処理を行う場合に便利です。多くのアプリケーションでは、パスワードがハッシュアルゴリズムを通じて処理され、作成されたハッシュがディスク上に格納されます。アプリケーションでエンドユーザの認証を行うときは、入力されたパスワードのハッシュが作成され、格納されているパスワードのハッシュと同じ一意の文字列になるかどうか確認されます。2つのハッシュが一致すると、そのユーザはアクセスを許可されます。この方法では、パスワードを平文でない形式で格納できるため、パスワードが解読されて盗まれることはありません。これは、ハッシュアルゴリズムを対象とした暗号解読攻撃が存在することがわかっているためです。次に例を示します。
対称および非対称暗号化方式
関連する脅威:送信中のデータに対する無許可のアクセス、ローカルデータに対する無許可のアクセス
対称および非対称暗号化方式は、データの可逆的な暗号化を行う場合に便利です。これらの暗号化方式は利用しやすいですが、開発者はSWFファイルが逆コンパイルできることを認識しておく必要があります。このため、これらの暗号化方式の秘密鍵およびプライベート鍵は、SWFファイル自体の中に格納できません。少なくとも、対称方式の秘密鍵と非対称方式のプライベート鍵は、セキュリティで保護されたインターネットプロトコルを通じてダウンロードするか、エンドユーザのマシン上のSWFから生成することによって、漏洩を防止する必要があります。
SWFファイル内の鍵に対する脅威
SWFファイル内で対称方式および非対称方式の秘密鍵を使用する場合は、いくつかの脅威が存在します。対称方式の秘密鍵を共有オブジェクトに格納する場合は、共有オブジェクトが暗号化されていないため、ユーザやユーザのマシン上の悪質なソフトウェアによって読み取られる可能性があることを念頭に置いておく必要があります。また、localPathのデフォルトの設定に変更を加える場合にも、十分な注意が必要です。この設定を変更すると、共有オブジェクトに含まれるデータを読み取ることができるSWFファイルの数が増えるからです。共有オブジェクトのセキュアフラグをtrueに設定すると、安全な方法でロードされたSWFファイルだけに共有オブジェクトへのアクセス権を与えることができます。攻撃者が送信中のSWFファイルの置き換えに成功すると、不正なSWFファイルによって共有オブジェクトから鍵が盗まれる可能性があります。
同じドメインにホストされている外部SWFファイル(鍵を格納するSWFにインポート、ロードされる)、およびSecurity
allowDomain()設定によって権限を付与されている外部SWFファイルも、クロススクリプト権限によってSWFファイルから鍵を取得できます。非対称暗号化方式を使用する場合は、SWFファイル内に公開鍵を格納しても、脅威にさらされることはありません。公開鍵は、対応する秘密鍵を持つサーバアプリケーションにデータを送信する前に、そのデータを暗号化するために使用します。この方法では、暗号化されたデータをサーバに送信するという一方向の通信を行うだけで済みます。また、サーバからSWFファイルに送信された電子署名付きデータの検証にも使用できます。この方法の有効な使用例としては、パスワードなどの機密データを収集し、サーバに送信する必要がある場合などが挙げられます。SWFファイルに含まれるのは公開鍵であり、公開鍵は暗号化にのみ使用されるため、第三者がSWFファイルを逆コンパイルして鍵を盗んだとしても問題はありません。攻撃者が不正な暗号化済みデータをサーバに送りつける可能性もありますが、サーバ側で、暗号化が行われているかどうかにかかわらずデータの検証を行うよう対策を施していれば、問題はありません。ただし、暗号化を使用する場合は、パフォーマンスについて考慮する必要のある問題があるため、暗号化を広範囲にわたって使用する場合は、テストを十分に行ってください。たとえば、RSAによる暗号化は、RSAの復号化よりも処理が速い傾向があります。多くの場合、HTTPSプロトコルを使用して暗号化データを送信する方が、ActionScriptコードで暗号化を実行するよりも、処理が速く安全性も高いと言えます。このコードは、公開鍵による暗号化がオープンソースソリューションで実現できることを示すことだけを目的としています。注:AS3Cryptoライブラリはアドビが作成したものではないため、保守および開発については責任を負いません。開発者は、自身が信頼する、必要な機能を備えたライブラリを選択してください。
次のステップ
より安全なSWFアプリケーションをエンドユーザに展開するには、アドビ、Flashアプリケーションの開発者、およびWebサイトの管理者がお互いに協力する必要があります。アドビは、Flash Playerの新バージョンを作成するたびに、より堅牢なセキュリティコントロールと、安全なアプリケーションを作成するためのツールを備えた、より強力なプラットフォームを実現するため、最大限の努力を払っています。開発者は、これらのツールを使用し、SWFファイルを最新バージョン用にコンパイルし、データの検証を行い、提供されているSDKを使用することによって、Flash Playerで実行されるアプリケーションのセキュリティを強化できます。Webサイトの管理者は、オブジェクトタグパラメータを使用し、クロスドメインポリシーファイルをサイトで正しく展開し、アクセスおよび展開に関する合意済みの計画に基づいて開発者と協力することで、これらのSWFファイルをサイト上に展開できます。これらのテクニックを実行することにより、Flash Playerアプリケーションによってリッチなインターネット環境とより安全な環境をエンドユーザに提供できます。詳細については、次のリソースを参照してください。
0のベストプラクティス*
より安全なSWFアプリケーションを記述するための開発者向けチェックリスト
データの検証
インポートしたすべてのデータで悪質なURLの有無をチェックしている。HTMLのテキストフィールドへの記述時に特殊文字をエスケープしている。例外が返された場合は、不正データが存在する可能性があるため、チェックしている。リモートでロードされたSWFファイルが、内部のSWFファイルのスクリプトを操作し、変数や関数を変更する可能性がある状況を認識している。
機密データの保護
SSLを通じてロードされたSWFファイルを使用するときに、ローカルの共有オブジェクトのセキュアフラグを設定している。ローカルの共有オブジェクトのデフォルトのパスを上書きしないようにしている。上書きする必要がある場合は、パスの範囲をできる限り制限している。xmlファイルでは、セキュアフラグをfalseに設定しないようにしている。SSLを使用する場合は、アプリケーションのワークフロー全体で一貫してSSLを使用している。サードパーティのライブラリを使用して別の暗号化技術を追加的に適用している。xmlファイルでは特定のドメインを指定している。
その時点のタスクに最も適した通信の方法を採用している(たとえば、LocalConnectionを通じたメソッドとクロススクリプトのメソッドで別の方法を採用するなど)
クロスサイトスクリプティング攻撃の防止
URL関数に送信される変数でデータ検証を行って、http://プロトコルとhttps://プロトコルだけが許可されるようにしているか、URLが許可されたドメインのものであることを検証するか、相対URLを使用している。HTMLのテキストフィールド内の特殊文字をエスケープしている。HTMLサポートが必要でない限り、HTMLのテキストフィールドを使用しないようにしている。外部でロードされるSWFファイルのローダーにマスクを設定している。信頼されたSWFファイルだけがフルスクリーンモードを使用できるようにしている。SWFファイルは逆コンパイルされる可能性があるため、機密性の高い暗号化鍵やパスワードをSWFファイルに格納しないようにしている。「読み込みプロテクト」、「トレースアクションを省略」、「デバッグを許可」などのコンパイラフラグでは、巧妙な攻撃は防止できないことを認識している。共有オブジェクト内のデータは暗号化されないため、共有オブジェクトに格納されたデータは、ファイルシステムにアクセスできる第三者にも読み取られる可能性があることを認識している。可能な限り、公開された暗号化ライブラリを使用してデータを暗号化している。インターネットによる通信のセキュリティを高めるため、一貫してSSL接続を使用している。
コンテンツのセキュリティ保護のためのWebサイト管理テクニック
すべてのSWFファイルについてこれらの値を明示的に設定することにより、管理者が望むアクセス権限だけがSWFファイルに付与され、コンパイルされたSWFファイルにFlash Playerのデフォルト設定が適用されることがなくなります。信頼しないSWFファイルへの自身のドメインからのリンクには、ドメイン名ではなくIPアドレスを使用する。信頼しないSWFファイルをIPアドレスで参照することにより、ドメイン名でリンクした場合とは別のFlash PlayerセキュリティドメインにそのSWFファイルが割り当てられます。swfが同じサーバ上にある場合でも、前者には後者に対するアクセス権が与えられません。xmlファイルでは、制限を厳格に指定して、信頼されていることが明らかなサイトにのみアクセス権を与えるようにします。
できる限り、サブドメインにワイルドカードを使用して(例:*
xmlファイルを使用することにより、本当にすべてのドメインからアクセスできるようにする必要のあるWebサイトの部分にのみ「domain="*"」と指定できます。ソケットポリシーファイルをポート843に配置すれば、新しく導入されたより制限の厳しいポートポリシーがFlash Playerによって使用されるようになります。ドメインを越えたアクセスを許可しない場合は、空白のクロスドメインファイルを作成する。サイトへのアクセスを許可しない場合は、サイトコントロールメタポリシーを"none"に設定した、許可するドメインのリストを含まないクロスドメインファイルを作成します。ユーザがクロスドメインファイルをWebサーバにアップロードすることを許可しない。この方法は、サイトコントロールメタポリシーと組み合わせて使用してください。
監査担当者向けチェックリスト
SWFアプリケーションが既に作成されており、脆弱な部分が含まれていないかコードを見直す段階にある場合は、次のメソッドを確認することにより、見直し作業の一環として重要なデータ操作の確認を効果的に行うことができます。
0のメソッド
HTMLコードを表示する関数
ネットワーク接続の呼び出しを行う関数
URLを受け取る関数およびオブジェクト
コンテンツのロードを行う関数
Webブラウザと通信する関数
0のメソッド
URLを文字列として受け取る関数およびオブジェクト
HTMLを表示または受け取る関数
Webブラウザと通信する関数
共有オブジェクトにアクセスするための関数
ネットワーク接続の呼び出しを行う関数
リスクを含む可能性の高い関数
著者について
Peleus Uhleyは、アドビのセキュアソフトウェアエンジニアリングチームのシニアセキュリティ研究者です。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
ソケットポリシーファイルサーバの設定
これにより、一部のシステムおよびネットワークでは、許可の付与を可能にするために新たなポートを開いたり、新たなサービスを提供する必要が発生します。今回変更されたFlash Playerの動作は、システム管理者およびネットワーク管理者に新たな課題を投げかけることになりかねません。そこでこの記事では、このような動作がなぜ必要であるかの背景を紹介するとともに、ネットワークにどのような影響を与えるかについて解説します。また本記事には、ソケットポリシーファイルサーバを動作検証環境で構築する際に利用できる、アドビ提供のサンプルコードの解説も含まれています。本記事の内容の理解を深めるには、次のソフトウェアおよびファイルが必要です。メモ: このコードは本稼働向けのコード品質を有するものではなく、セキュアな環境での動作検証を経ていません。あくまで、ソケットポリシーファイルサーバの基礎概念を示すことを目的に提供されているものです。アドビでは、このコードを公式にサポートする予定はありません。
この記事に必要な予備知識
ネットワークソケットおよびオペレーティングシステムサービスに対する理解・知識が必要です。0の知識も推奨されますが、必須ではありません。本記事はWebチームからファイアウォールの一部のポートの解放依頼、または新規システムサービスの実装依頼を受けたシステム管理者またはネットワーク管理者を対象読者として想定したものです。一見このような要求は、より閉鎖的にすることでより安全性を高めるという、セキュリティ原則に反するように感じられるかもしれません。そこで本節ではソケットポリシーファイルについて簡単にその背景を紹介するとともに、ネットワークにどのような影響を与えるかについても解説します。また、ソケットポリシーファイルサーバがFlash Playerランタイムに対して何を提供しなければならないかについても、その枠組みを説明します。
ソケットポリシーファイルが必要な理由
Flash PlayerコンテンツはWeb上で幅広く配布され、ダイレクトコンテンツプロバイダや広告提供者によってホスティングされています。その一例として挙げられるのが、サーバとのデータ通信用にTCPソケット接続が作成できるという機能です。ネットワーク管理者の立場からすれば、インターネット上で取得されたコンテンツから内部ホストへのソケット接続が作成できるということは、逃げ腰になりかねない概念です。だからこそ、Flash Playerではコンテンツにネットワーク接続の作成を許す前に、当該ターゲットホストからの許可が必要とされます。
ソケットポリシーファイルに関する今回の変更点
Flash Playerでは、ソケット機能の搭載当初からソケットポリシーファイルの存在が必要とされていました。1つ目は、今後、Flash Playerがあらゆるソケット接続において、必ずソケットポリシーファイルを必要とすることです。従来のFlash Playerバージョンでは、SWFファイルが自らのホスティング元であるサーバに接続する場合に限り、1024より上のポートにそのまま接続することができました。2つ目の変更点は、ソケットポリシーファイルの中央化を可能にする一元的な位置が新たに制定されたことです。これにより、ソケットマスターポリシーファイルが設置できるようになります。ソケットポリシーファイル用の一元的な位置が制定されることにより、システム管理者は、ホスト上の他のポリシーファイルの設定をオーバーライドする、単一のマスターポリシーを通じて、どのポートが利用できるかを指定できるようになります。仮にFlash Player 9,0,124,0がポート843からマスターポリシーファイルを取得できない場合は、接続しようとしているポートに対してソケットポリシーファイルのリクエストが行われます。ただし、ポリシーファイルがTCPポート843上のサービスを介して公開されている場合は、Flash Playerは、これを当該システムの全権的な許可群として扱います。
ソケットポリシーファイルを利用して管理者が制御できる事柄
ソケットポリシーファイルでは、どのホストがシステムに接続できるかと、これらのホストにどのポートでの接続を許可するかを規定できます。ソケットマスターポリシーファイルの場合は、当該ホスト上で他のソケットポリシーファイルを許可するかも、あわせて定義できます。
ソケットポリシーファイルのスキーマは、adobe
xsdに定義されている通りです。次にソケットマスターポリシーファイルの例を示します。このsite-control要素には、サーバ上で、どのソケットポリシーファイルを許可するのかを定義します。上記の例の場合、値には"master-only"が指定されており、当該サーバ上では、このポリシーファイルのみがFlash Playerによって認知されるべきものであることが規定されています。他のポートに対するソケットポリシーファイルの定義を許可したい場面では、"all"が指定できます。一方、当該システムへのすべてのソケット接続を拒否したい場合は、値に"none"を指定します。この要素の最初のフィールドでは、接続を許可するドメインを定義します。ここには、SWFコンテンツがホスティングされているドメインと同じものを指定するようにします。なお、ここで指定するドメインは、SWFコンテンツを参照するHTMLページがホスティングされたドメインとは異なる場合があります。com」など)を使用することも可能ではありますが、アドビでは、明示的なドメイン名のみを指定することを推奨しています。comでホスティングされたFlashコンテンツに対して、どのポートが用意されているかを指定します。このフィールドには、ワイルドカード(「*」)、ポートの範囲、および(または)個別のポートを指定することができます。アドビでは、当該ドメインからのアクセスを許可するポートのみ、明示的に指定することを推奨しています。
ソケットポリシーのリクエストプロセス
このチェック作業は以下の順に行われます。ソケットマスターポリシーファイルが見つからない場合、あるいはソケットマスターポリシーファイルがあるものの、このポリシーのsite-controlタグで"all"が指定されている場合、Flash Playerは次の手順へと進みます。このチェックは、ソケットマスターポリシーファイルによって、Flash Playerが他の場所をチェックすることが許可されている場合に限り行われます。Flash Playerが、ここでも許可を付与するポリシーファイルを見つけられなかった場合、ソケット接続は拒否されます。
リクエストおよびレスポンスで送信されるデータ
ポリシーファイルのリクエスト自体は非常に簡単なものです。Flashデベロッパーが、送信される文字列に手を加えることはできません。リクエストに対するFlash Playerへのレスポンスとしては、テキスト形式のソケットポリシーファイルが返されます。Flash Playerがソケットポリシーファイルを受信すると当該接続が閉じられ、そして、このポリシーファイルにリクエストの許可が含まれている場合は新たな接続が別途確立されます。Flash Playerは各ソケットポリシーファイルを特定のIPアドレスに関連付けるとともに、新たなIPアドレスへの接続ごとにポリシーファイルを必要とします。たとえば、デベロッパーが接続のホスト名を指定し、これに対するDNSルックアップが複数のIPアドレスを返すような場合、当該ホスト名に対応するIPアドレスが変わるたびに、Flash Playerはソケットポリシーファイルを探すために新たなIPアドレスをチェックします。この動作は、DNS再バインディング攻撃からの保護に役立ちます。
ソケットポリシーファイルサーバのサンプル
アドビでは、デベロッパーによる動作検証用として、ソケットポリシーファイルサーバのサンプルを用意しています。このコードは本稼働向けのコード品質を有するものではなく、セキュアな環境での動作検証は経たものではありません。このコードはソケットポリシーファイルサーバの基本概念を示すためのものです。アドビがこのコードを正式にサポートする予定はありません。また、ここで紹介するスクリプトをご利用中のオペレーティングシステム上の1サービスとして実行するには、一部の構成を変更または追加しなければならないことがあります。
サンプルの概要
サンプルコードはPerlとPythonで用意されていますが、ソケットをサポートする言語であればどれを使用しても、ソケットポリシーファイルサーバを記述することができます。この2つの言語が選ばれているのは、あくまでコードの読みやすさとクロスプラットフォーム対応性を考慮したことと、わずか数行のコードで概念を紹介できるからに過ぎません。これらのファイルをすべてインストールする必要はありません。異なるバージョンが用意されているのは、さまざまな環境向けとして選択肢を提供するために過ぎません。なお、サーバの完全な機能性を確保するには、ご利用の環境に応じて、( /etc/services ファイル内のファイルに"flashpolicy"サービス用としてTCPポート843のエントリを追加する、ファイアウォールの設定でポート843の使用を許可する、SELinuxの構成設定で所定の権限を追加するなど)他にも手動での追加作業が発生することがあります。5が必要です。サンプルファイルのStandaloneフォルダには、PerlとPython両方のスタンドアローンソケットポリシーファイルサーバスクリプトが収録されています。これらのスクリプトはユーザがCtrl+Cキーを押すか、ウィンドウを閉じてプロセスを停止するまで、単にループを実行するものです。pyスクリプトは、いずれも2つの引数を受け付けます。
1つ目の引数は、ファイルシステム上のソケットポリシーファイルへのパス指定
そして、2つ目の引数は、サーバがリッスンするTCPポートを指定するためのオプション項目です。ポートを明示的に指定しない場合、これらのスクリプトはTCPポート843をリッスンします。スクリプトを開始するためのコマンドライン入力例は以下の通りです。Perlスクリプトは基本的なデバッグ情報のログをSTDOUTに記録します。これによりデベロッパーは、いつリクエストが受け取られたか、リクエストが有効であると判定されたか、レスポンスとしてポリシーファイルが送られたか、といった事柄を把握することができます。エラーのログはSTDERRに記録されます。Pythonスクリプトも同様の情報を追跡はするものの、出力はすべてSTDERRに行われます。インストールする必要があるのは、2つのスクリプト群のうち片方のみです。shスクリプトの実行には、当該マシンのルート権限が必要です。このスクリプトは以下のファイルをコピーします。shスクリプトは当該サービスの起動を試みます。これらのスクリプトはinetdやlaunchconfigdといった他のスーパーサーバでも実行できますが、これらのシステム用の設定&インストーラファイルは含まれていません。d/ へとコピーされます。そして最後に、当該サービスの起動が試みられるとともに、ブート時にこのサービスが自動的に起動されるよう、設定が調整されます。このデーモンはルートユーザとして実行され、ログはSTDERRに記録されます。サービスの動作検証は、PerlまたはPythonのいずれかとnetcatユーティリティの組み合わせで素早く実行できます。上記のいずれかのコマンドを実行してソケットポリシーファイルが返される場合は、正しい動作が確保されています。一方、Flash Player 9,0,124,0からは、より厳格な新しいフェーズII方式の動作のみがサポートされており、すべてのソケット接続に対してポリシーファイルが必要とされます。この2つのバージョンの相違点およびログ記録機能の設定方法について詳しくは、別途記事のFlash Player 9におけるポリシーファイルの変更点:ソケットポリシーファイルの節を参照してください。以下に、本記事付属のZIPファイルに収録されたファイル群の内訳を示します。このファイルは、ご利用のサーバに適したポートおよびドメインが反映されるように編集する必要があります。
txt: このアプリケーションおよびプロジェクトに関する情報を収録したファイル
sh: このファイルによって、サービスとして登録するために必要なファイルが所定のディレクトリへとコピーされます。スクリプトに記述されているインストールディレクトリが、ご利用中のシステムに適していることを確認するようにしてください。このスクリプトはPythonで記述されたポリシーファイルサービスであり、ログはsyslogに記録されます。sh: このファイルによって、サービスとして登録するために必要なファイルが所定のディレクトリへとコピーされます。スクリプトに記述されているインストールディレクトリが、ご利用中のシステムに適していることを確認するようにしてください。このスクリプトはPerlで記述されたポリシーファイルサービスであり、ログはSTDOUTとSTDERRに記録されます。sh: このファイルによって、サービスとして登録するために必要なファイルが所定のディレクトリへとコピーされます。スクリプトに記述されているインストールディレクトリが、ご利用中のシステムに適していることを確認するようにしてください。このバージョンは複数のユーザ接続に対応できます。
このファイルはインストーラスクリプトによって、 /etc/rc
このメソッドを使用した場合、当該サービスはルートとして実行されます。このスクリプトの冒頭で規定されている構成変数を検証し、適切なパス変数が用いられていることを確認するようにしてください。pl: スタンドアローン形式のこのシングルスレッドPerlスクリプトは、ユーザがCtrl+Cキーを押すまでループ状に実行され、一度につき1つのユーザ接続を受け付けます。py: スタンドアローン形式のこのPythonスクリプトは、ユーザがCtrl+Cキーを押すまでループ状に実行されます。このバージョンは複数のユーザ接続に対応することができます。xinetdにサービスを登録することで、管理者はいくつかのセキュリティコントロールを利用できるようになります。アドビが提供するスクリプトは、xinetdのセキュリティ設定に手を加えません。これは、これらの設定が各運用環境によって異なるからです。ただし、アドビでは、これらの機能の使用が適切なケースにおいては、これらの機能の利用を推奨します。
次のステップ
ソケットポリシーのリクエストとレスポンスは、単純な通信プロセスである一方で、ソケットポリシーファイルサーバの設定プロセスはインストール対象環境に左右されるものです。先頃登場したFlash Playerバージョンのソケットポリシーファイル関連の変更点ついて詳しくは、別途記事のFlash Player 9におけるポリシーファイルの変更点を参照してください。
著者について
Peleus Uhleyは、アドビのセキュアソフトウェアエンジニアリングチームのシニアセキュリティ研究者です。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
SWFコンテンツ検索に関するFAQ | デベロッパーセンター
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
アドビ システムズでは、検索エンジン業界をリードする企業と協力して、Flash内の動的コンテンツやリッチインターネットアプリケーション(RIA)の検索結果を飛躍的に改善するように取り組んでいます。には検索エンジン向けに最適化されたFlash Playerテクノロジーを提供し、検索エンジンがSWFコンテンツをインデックスする機能の強化を図るとともに、現状では抽出できない情報が抽出できるように協力しています。SWFコンテンツ検索の性能が向上すれば、関連検索の結果において、何百万とあるRIAやFlash内の動的コンテンツがより適切に評価されることになります。RIA開発者やリッチコンテンツのプロデューサーがコンテンツに修正・工夫を加えずとも、世界中のユーザーがSWFコンテンツを検索できるようになります。
なぜ、SWFコンテンツの検索性能を向上させることが重要なのですか
と協力して、SWFコンテンツの検索性能の向上へと取り組んでいます。検索エンジンがRIAやFlashコンテンツの中身を解析し、検索キーワードとの関連性を、SWFコンテンツを内包するHTMLページに付与できるようになれば、検索結果の精度が向上します。SWFコンテンツの検索性能が向上すれば、Flashを活用する制作会社にとってもメリットがあります。制作側は、Flashコンテンツに特別な変更を加える必要はなく、そのままでも検索エンジンにインデックスされます。また検索精度が低下することはありません。そのため、Flashならではのユーザー体験を提供し続けられます。
また、SEOコミュニティの活性化にも繋がるでしょう
より検索性能に適したFlashコンテンツやRIAのベストプラクティスの研究が始まり、SWFコンテンツをビジネスの対象としたスキルが磨かれていくでしょう
なぜ、アドビ システムズがこの開発に取り組んでいるのでしょうか
アドビ システムズは、Flash Player向けのRIAやインタラクティブコンテンツに使用されるファイルフォーマットの詳細を記述した「SWF仕様*」を公開しています。現状、検索エンジンはSWFファイル内の静的テキストやリンクの情報をインデックスしています。
しかし、RIAやFlash内の動的コンテンツに関しては、コンテンツ内容が変動するため、インデックスすることが困難でした(この問題は、他のRIA技術を使った場合でも同じです)
これまでは、Web上にある何百万というRIAや動的コンテンツを検索するということは非常に難しい課題でした。そこで、アドビシステムズとしては、Flash Playerで再生されるコンテンツに対する検索性能の向上に向けて、先頭に立って取り組むことにしました。と協力し、SWFコンテンツの検索性能の飛躍的な向上を目指して開発に取り組み、そこでの成果をすべてのコンテンツ提供者、デベロッパー、エンドユーザーと共有していきます。
SWFコンテンツの検索性能が向上したとありますが、対象となるSWFのバージョンはあるのでしょうか
すべてのバージョンのSWFコンテンツ、つまり現存するすべてのSWFコンテンツにメリットがあります。
コンテンツ提供者やデベロッパー側は何をすればいいのでしょうか
コンテンツ提供者やデベロッパーは、特別なことをする必要はありません。Web上には何百万ものSWFファイルが公開されていますが、それらはそのままの状態で、向上したSWFコンテンツ検索の恩恵を受けることができます。すでにGoogleでは、SWFコンテンツ検索性能が向上した検索エンジンを使用しています。
今後、HTMLコンテンツと同様に、SWFコンテンツでも研究が進み、検索エンジンにより最適化する手法が生まれてくるでしょう
アドビ システムズはどのような技術提供を行っているのでしょうか
にFlash Playerテクノロジーを提供をしており、各社はスパイダーを使って、あたかもユーザーのようにSWFコンテンツをクロールすることができます。検索エンジンのスパイダー向けに最適化されたFlash Playerテクノロジーを使えば、Webブラウザ上のFlash Playerと同様にSWFファイルを再生でき、コンテンツ内の各状態におけるテキストやリンクをすべてスパイダーへ渡すことができます。その情報が、検索結果に表示されるのです。Searchをアップデートする際に、SWFファイル検索性能を強化する予定です。のアルゴリズムに従って、関連性がインデックスされます。その結果、SWFコンテンツから得た情報は、そのSWFコンテンツを内包するWebページの検索可能な情報として追加され、ユーザーはより多くの情報を検索することが可能になるのです。
いつからSWFコンテンツ検索の性能は向上するのでしょうか
Web上には何百万というRIAやFlashコンテンツがありますが、コンテンツ提供者やデベロッパーはコンテンツに何も変更を加えなくても、それらのSWFコンテンツはすぐにでも検索される状態にあるのです。そのため、今後より多くのSWFコンテンツの情報がインデックスされ、検索ユーザーはより関連性の高い情報を入手できるようになります。もSWF検索性能を向上させることを確約しており、その実装時期についてアドビ システムズとともに検討しています。
一般の検索ユーザーにとってのメリット何でしょうか
一般の検索ユーザーは、通常通りに検索サービスを使用するだけでよいのです。インデックス化されたSWFコンテンツの情報は、そのSWFコンテンツを内包するHTMLページの情報に付加され、それらの情報を元に関連性が精査され、ページランキングへと反映されます。
ページによっては、適切な評価を受け、これまでよりも高いランキングに位置するでしょう
Web上には何百万というRIAやFlashコンテンツがありますが、コンテンツ提供者やデベロッパーはコンテンツに何も変更を加えなくても、それらのSWFコンテンツはすぐにでも検索される状態にあるのです。
Googleでは、いつから新しい検索結果が表示されるのでしょうか
今後、Googleスパイダーがより多くのSWFコンテンツをインデックスしていき、より精度の高い検索結果が得られるようになると期待しています。
コンテンツ提供者にとってのメリット何でしょうか
SWF検索性能が向上したことで、「Flashコンテンツは検索されない」という障害がなくなり、企業はこれまで以上にFlashテクノロジーを使ったリッチなWebエクスペリエンスを追求できるようになります。
RIAクリエイターやWebコンテンツプロデューサーも、「自分たちが作り出すリッチメディアやRIAエクスペリエンスが、主要検索エンジンを使うユーザーであれば、世界中の誰でも検索してもらえる」と自信を持つことができるでしょう
また、これまでのRIAサイトでは、検索してもらえるようにHTML/XHTMLのバックアップページを用意していました。
しかし、SWFのさまざまなステータスにおける情報がインデックスされるようになるので、バックアップページを用意する手間も軽減されるでしょう
SWFコンテンツ内のビデオも検索の対象となるのでしょうか
現在の取り組みは、SWFコンテンツ内のダイナミックテキストやリンクの検索性能の改善のみです。より検索されやすくするには、ビデオだけでなく、ビデオとテキストを併用することをおすすめします。
Googleでは、Flexで作成したアプリケーションも検索されやすくなったのでしょうか
また、アプリケーションがアクセスするリモートデータは検索対象となるのでしょうか
今回の向上したSWF検索性能は、Flashで作成したSWFコンテンツだけでなく、Flexで作成したアプリケーションに対してもメリットがあります。また、外部にあるリモートデータ(XMLやSWF)も検索対象の情報として扱われます。
アドビ システムズとして、おすすめのディープ・リンキング方法はありますか
SWFコンテンツやRIAにおいて、「ディープ・リンキング」というのは、コンテンツやアプリケーションの特定のステータスに対するダイレクトリンクのことを指します。ディープ・リンクを張るにはさまざまな方法がありますが、大切なのは「ディープ・リンクを張ることで、リンクとアプリケーションの特定のパートと間で関連性を強めることができる」ということです。Flexには、ブラウザのロケーションバーに表示されるURLを、アプリケーションのステータスを再構築するために必要な情報を含んだ形で更新できるコンポーネントがあります。これを使えば、実行時にSWFコンテンツやRIAの特定のステータスを反映するためのURLを生成することができます。エントリーポイントが無数にあるような複雑なサイトの場合、サイトマップXMLファイルのような技術を使って、検索エンジンのスパイダーに特定のURLを指定することができます。1つのSWFしか使用していないサイトの場合、複数のHTMLファイルを用意して、それぞれ異なる変数をSWFに渡すようにし、 HTMLファイルごとに異なるステータスでアプリケーションが立ち上がるようにすることもできます。複数のエントリーポイントを設けておけば、一連のページがインデックスされたかのようなメリットがあり、しかも1つのアプリケーションを管理するだけで済むのです。
ディープ・リンキングの事例については、「www
今回の開発成果を、他の検索エンジンベンダーに提供していくのでしょうか
アドビシステムズとしての目標は、すべてのSWFコンテンツがもっと検索されやすくすることです。と協業して、SWF検索性能を高めるソリューションを開発しました。このソリューションが、広く利用されるように取り組んでいきたいと思っています。
著者について
この記事は、アドビ システムズ社の著作物です。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
SWFコンテンツのカスタマイズ
スタティック・ダイナミックパブリッシングの仕組み
合計で、11のメソッド*が用意されています。前述のスタティック・ダイナミックパブリッシングの節でこの中の2つを紹介したので、ここでは5つの新しいメソッドについて解説することにします。htmlをWebブラウザで開くと、図8のような警告が表示されるはずです。
非自動的なSWFファイル生成
この「ローレベル」のダイナミックパブリッシングメソッドは、他のJavaScriptライブラリと組み合わせる際に威力を発揮することができます。引数としては、次に挙げる3つの必須のものがあります。このメソッドは、所定のSWFを表す、新たに作成されたobject要素を返します。リリース"または"メジャー"の体裁で指定できます。htmlをWebブラウザで開くと、動作検証用のSWFファイルが表示されるはずです。
この記事の初めに登場した画面と同じものが表示されるはずです(図2参照)
読み込み済みのページからのSWFの削除
使い方は簡単です。単に、SWFファイルに関連付けられたobject要素のidをメソッドに渡すだけです。
このサンプルページを表示してリンクをクリックすると、Webページ上からSWFファイルが削除されることを確認できます(図9参照)
URLクエリ文字列から取得したパラメータのSWFファイルへの受け渡し
たいていの場合、このメソッドはクエリ文字列からSWFに値を渡すために、FlashVarsとともに使用されます。次にコードの例を示します。この状態で、WebブラウザのURLバーの文字列の最後に次の文字列を追加してみてください。なお、このメソッドがクロスサイトスクリプティング攻撃*で悪用されないようにするために、クエリ文字列に[\"<>
次のステップ
さらに詳しい情報については、以下のリソースを参照することをお勧めします。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
WebページにSWFファイルを埋め込む方法として、標準規格との親和性に優れた複数の手段を提供するのがSWFObject 2です。また、プラグインなしでWebをブラウズするユーザに表示する代替コンテンツの使用や、検索エンジンがコンテンツをインデックスしやすくするための機能、ビジターをFlash Playerダウンロードページに誘導するための機能なども用意されています。SWFファイルを埋め込む手段としては、別々の開発理念に支えられた次の2つの方法が用意されています。スタティックパブリッシング:SWFコンテンツと代替コンテンツ両方の埋め込みにマークアップを利用し、邪魔にならない簡潔なJavaScriptを用いて、マークアップだけでは対応できない数々の問題を解決します。この方法では、標準規格準拠のマークアップを記述することが促進されるため、主にWeb規格に敏感なデベロッパーにとって魅力的なはずです。この方法の主な長所は、SWFを埋め込む仕組みとしてobject要素のみが用いられることです。つまり、スクリプト言語に依存する公開方法より、同じコンテンツでリーチできるユーザ数が格段に増えます。この結果、Internet Explorerブラウザの大半から段階的に問題のアクティブコンテンツ処理が廃止されつつあり、影響を受けるユーザはごく少数に限られることになります。ダイナミックパブリッシング:代替コンテンツを定義する目的でのみマークアップを利用し、必要最小限のFlash PlayerバージョンとJavaScriptサポートが用意されている場合は、邪魔にならない簡潔なJavaScriptを用いて、これをSWFに置き替えます。5とUFOに似た使い勝手の良い完全自動型の方法です。この方法は、既存のFlashデベロッパーの多くにとって魅力的なはずです。ダイナミックパブリッシングを利用する場合は、その仕組み上、「クリック起動」の煩わしさを回避することができます。また、スタティックパブリッシュよりもコードが簡潔であり、スクリプトを含むアプリケーションとの親和性にも優れています。つまり、スタティックパブリッシュを利用するのに比べ、配信リーチが狭くなることが課題になります。このチュートリアルを完了するには、次のソフトウェアおよびファイルがインストールされている必要があります。
任意のコードエディタ
この記事に必要な予備知識
zipには、以下が収録されています。
swf: 試験実装のための参照用として収録
swfのソースファイル)を収録
これらのファイルは、SWFObjectのソースコードを勉強したり、個々のデベロッパーのニーズにあったカスタマイズバージョンを作成するために提供されています。どのマークアップコードやJavaScriptコードを使えば良いかを判断するのは、やや手間のかかる作業です。そこで本プロジェクトには、この判断を一任することができるSWFObject Generatorという名のパブリッシングツール(別途ダウンロード)が用意されています。0デスクトップアプリケーションとして提供されています。この2種類の主な違いと言えば、AIRバージョンではクリップボードへのコピー機能が使用できることと、HTMLページをハードディスクに保存できることです。このチュートリアルでは、AIRアプリケーションのバージョンを使用することにします。
SWFコンテンツの埋め込み
swfが含まれています。
スタティックパブリッシングの使用
zipファイルを解凍します。0またはそれ以降がインストールされていることを確認します。)パブリッシング方法のデフォルト設定がスタティックになっていることに注目してください。
埋め込むSWFファイルのサイズ設定
これで、SWFObject 2スタティックパブリッシングを用いた、初めてのSWFファイル埋め込みが完了しました。
とても簡単ではなかったでしょうか
ダイナミックパブリッシングの使用
htmlファイルをWebブラウザで開くと、先ほどと同じように、オペレーティングシステムとFlash Playerのバージョンが記された動作検証用SWFファイルが表示されます。ご覧のように、パブリッシング方法はポップアップメニューの項目を選び直すだけで簡単に切り替えることができます。
SWFコンテンツのカスタマイズ
最低限のコンテキストメニューが表示されることを確認できます(図4参照)
表示品質「低」のSWFファイル上でコンテキストメニューを表示した状態
複数の名前と値のペアを入力したい場合は、単に「add」リンクをクリックするだけです。htmlファイルをWebブラウザで開くと、図5のような結果が表示されるはずです。
代替コンテンツの使用
ダイナミックパブリッシングを使用する場合は、JavaScriptが無効化されていたりサポートされていない場面でも、このコンテンツが表示されます。
代替コンテンツの設定
なお、代替コンテンツは検索エンジンによっても検出されるので、検索エンジンとの親和性に優れたコンテンツを提供するためのツールとしても利用できます。65以降をインストールするビジターが、より新たなバージョンのプラグインを必要とされる場面において、標準化されたダウンロードダイアログボックスを表示します。
swfファイルのパスを指定します(デフォルトでは、このファイルがHTMLファイルと同じディレクトリにあることが想定されています)
htmlファイルをWebブラウザで開くと、図7のようなダイアログボックスが表示されます。このダイアログボックスの「Yes」をクリックすると、Express Installがダウンロード用のダイアログボックスを開くとともに、すべてのブラウザウィンドウを閉じるよう催促します。
では、この動作をどうすれば検証できるかが疑問になることでしょう
筆者の経験から言うと、まず、アドビのアンインストーラ*を利用してFlash Playerをアンインストールし、その後、Flash Playerアーカイブ*より入手できる過去のプラグインをインストールするのがベストな方法です。
スタティックパブリッシングの仕組み
しかし、デベロッパーの中には、自らの開発作業の隅々までをコントロールしたいと考え、コードの記述やカスタマイズ作業を手入力で行うことを希望する方がたくさんおられます。
ここまでにパブリッシュしたHTMLページの仕組みに興味がある場合は、ブラウザウィンドウのソース表示機能を利用するか、完成したHTMLファイルをテキストエディタまたはコードエディタで開いてみると良いでしょう
htmlファイルを開き、最も重要なコード部分を確認してみてください。この手法では、マークアップだけを利用して標準規格との互換性を保つとともに代替コンテンツをもサポートすることで、最大限に最適化されたクロスブラウザサポート*を実現しています。HTMLファイルのbody部分には、以下のコードが記述されています。入れ子object手法を用いる場合、以下の属性が必須になります。
SWFファイルの高さの指定)
コンテンツの詳細設定は、一連のオプション属性とFlash特有のparam要素を利用して調整することができます。なお、入れ子object手法ではobjectの定義が2度発生するので、すべてのオプション属性と入れ子状のparam要素を2度定義する必要があります。
swfファイルが収録されています)
カスタマイズ用のすべてのオプションの概要について詳しくは、SWFObjectドキュメンテーション*を参照してください。
ダイナミックパブリッシングの仕組み
htmlファイルを開き、最も重要なコード部分を確認してみてください。xとUFOでは、参照されているHTMLコンテナの中のコンテンツのみが置き替えられていました。代替コンテンツのコードとしては、ページのマークアップがobject要素での置き替え後も有効になりさえすれば、任意のHTMLコードブロックを使用できます。したがって、trやtd、liといった要素をコンテナとして使うのは、ページが無効になってしまうため避ける必要があります。embedSWFメソッドは、必須の5つの引数とオプションの4つの引数を受け付けることができます。
オプションの引数を使用したくない場合は、値としてfalse、0、またはnullを指定できます(または、単に、後の空の引数を省略します)
カスタマイズ用のオプションについての詳しい情報、およびJavaScriptコードの様々な記述様式について詳しくは、SWFObjectドキュメンテーション*を参照するようにしてください。ここでご覧いただいたように、ダイナミックパブリッシングはスタティックパブリッシングより簡潔です。
コードを手書きするケースでは、ダイナミックパブリッシングの方が手軽に利用できると言えるでしょう
合計で、11のメソッド*が用意されています。前述のスタティック・ダイナミックパブリッシングの節でこの中の2つを紹介したので、ここでは5つの新しいメソッドについて解説することにします。htmlをWebブラウザで開くと、図8のような警告が表示されるはずです。
非自動的なSWFファイル生成
この「ローレベル」のダイナミックパブリッシングメソッドは、他のJavaScriptライブラリと組み合わせる際に威力を発揮することができます。引数としては、次に挙げる3つの必須のものがあります。このメソッドは、所定のSWFを表す、新たに作成されたobject要素を返します。リリース"または"メジャー"の体裁で指定できます。htmlをWebブラウザで開くと、動作検証用のSWFファイルが表示されるはずです。
この記事の初めに登場した画面と同じものが表示されるはずです(図2参照)
読み込み済みのページからのSWFの削除
使い方は簡単です。単に、SWFファイルに関連付けられたobject要素のidをメソッドに渡すだけです。
このサンプルページを表示してリンクをクリックすると、Webページ上からSWFファイルが削除されることを確認できます(図9参照)
URLクエリ文字列から取得したパラメータのSWFファイルへの受け渡し
たいていの場合、このメソッドはクエリ文字列からSWFに値を渡すために、FlashVarsとともに使用されます。次にコードの例を示します。この状態で、WebブラウザのURLバーの文字列の最後に次の文字列を追加してみてください。なお、このメソッドがクロスサイトスクリプティング攻撃*で悪用されないようにするために、クエリ文字列に[\"<>
次のステップ
さらに詳しい情報については、以下のリソースを参照することをお勧めします。
著者について
BobbyはWeb標準とAdobe Flashの大ファンであり、時折これらのトピックについての執筆物を個人のWebサイト*またはオンラインマガジンで公開しています。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
しかし、それに伴って一部の Flash コンテンツが閲覧できないというトラブルが報告されています。一部には Flash Player 側の仕様変更(セキュリティ対策、など)の影響やバグによるものもあるかと思いますが、原因の大半はコンテンツ制作者側が用意したバージョン判別用コードによるものです。今回はそういったトラブルに対応するために、想定される原因とその解決方法をリストアップしてみました。バージョン関係のトラブルでお困りのコンテンツ制作者の方は、ぜひご一読ください。もっとも代表的な原因として「メジャーバージョンを“特定の場所にある一字”で判別してしまっている」というケースが考えられます。以前までの Flash Player はバージョン情報が 1 桁のみでしたので、この種の判別コードで問題が発生することはありませんでした。しかし、今回のアップデートによりバージョンが "10" になったことで、Flash Player の歴史上初めて 2 桁のバージョン情報が登場したことになります。そのため、バージョン情報を表すストリングからメジャーバージョンを“特定の場所にある一字”として抜き出していた場合、Flash Player 10 のバージョンを "1" または "0" として誤認してしまうことになります。※上記コードは広く使用されていますが、プレイヤーのバージョンに関わらず UNIX 版の Flash Player で正しく動作しませんので、今回の件に関わらず修正が必要です。この場合には、以下のように修正することで問題を解決できます。判別処理中にバージョンの大小を比較する際には、事前に parseInt() メソッドなどを利用して数値化することを忘れないようにしてください。上記コードは過去に公式の判別方法として紹介されていたため、古いコンテンツでは現在もこのコードを使用している可能性があります。この場合には、以下のように修正することで問題が解決できます。その中でも、もっとも多くの開発者が使用しているパターンが「SWFObject」で実装する方法です。しかし、「SWFObject」を使用するパターンでも一部の環境で正しく動作しない場合も報告されています。この現象は直接 Flash Player 10 が引き起こしている問題ではありませんが、バージョン判別に深く絡んでくる問題ですので注意が必要です。
詳しくは「メディアテクノロジーラボ ブログ」の「IE7でswfobjectが動作しない件」で報告されていますが、症状をカンタンにまとめると
Flash Player が何らかの事情により複数インストールされてしまっている環境の場合に、という現象になります。この現象は同じような環境であっても問題が発生しなかったりというレアケースのため対策が難しいのですが、以下のような対策が考えられます。js を使用している場合には問題がないというケースが報告されています。」欄にもあるように、そもそもインストーラーが壊れているケースも想定できるので、解決策として知っておくべきことかもしれません。手前味噌ではありますが、筆者の開発している Progression 3 のバージョン判別では、以下のように実装しています。
バージョン判別のベストプラクティス
一部気になる点はありますが、もっとも安定して判別できるのは、やはり「SWFObject」を使用した方法ではないかと思います。0 が正式採用されています。もちろん、今後もブラウザや Flash Player のバージョンアップは想定されますし、Google Chrome のような新しいブラウザの登場も十分考えられますので、永続的にこの方法がベストプラクティスであるとは言い切れません。しかし「SWFObject」はオープンソース・コミュニティに支えられ、今後もそのような変化に柔軟に対応していくものと思われます。
著者について
Web デザイン会社、ウェブサービス会社などを経て、Progression プロジェクトの開発・運営を、本業の Web デザイナーが副業になってしまうほど精力的に展開中
現在はワークショップなどでの講演活動と同時に、グローバルな普及を目指しています。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
SWFコンテンツを含むWebサイトによくある問題といえば、検索エンジンのスパイダーがコンテンツを巡回したくても、サイトに入れないことです。これはあたかもドアマン*がいるナイトクラブに、身分証明書を持たないスパイダーが入ろうとしているようなものです。この状況を防ぐためには、ブラウザーの互換性やAdobe Flash Playerのバージョンを確認するための検知スクリプトをベストプラクティスに従って用意することが肝心です。この記事では、検索エンジンのスパイダーが読者のWebサイトの敷居を確実にまたげるようにするために注意しなければならない点と、対策として講じることができるテクニックについて説明します。この記事を効率よくフォローするには、Adobe Flashテクノロジーについての知識と、SWFベースのWebサイト・アプリケーションに関する高度なWeb開発テクニックの知識が必要です。また、この記事で紹介するテクニックやトピックの詳細な情報を記載した、別途記事の『RIAの検索エンジン最適化テクニック』に目を通している必要があります。検索エンジンのスパイダーはとてもデリケートです。スパイダートラップと呼ばれる様々な問題が原因で、スパイダーが頓挫することがあります。通常、ブラウザーでは正しくWebページを表示できるもののスパイダーでは正しく表示できないといった技術的な事情から、スパイダーはこれらの支障が原因となりサイトを巡回することができません。問題になりがちなテクニックの使用をサイトから排除すれば、サイトのより多くのコンテンツをスパイダーがインデックス化できるようになります。せっかく時間と予算をかけてサイトを構築しても、検索エンジンが排除されるようになっていては話になりません。
では、ユーザーにSWFコンテンツが表示される前に発生する手順および検出スクリプトを検証してみることにしましょう
ブラウザーはサポート対象のものであるか
Noの場合は代替コンテンツを表示
検索スパイダーはここで停止することになります。
Yesの場合はコンテンツを表示
検索スパイダーはここで停止することになります。SWFコンテンツを含むサイトがどの程度、検索エンジンの巡回の妨げになっているかは、「Flash Playerが必要」を検索してみると分かるはずです。数多くの結果がヒットします。comをご覧になるにはFlash Playerプラグインが必要です」といったメッセージが表示されるサイトは、無数に存在します。スパイダーはWebブラウザーとは異なり、サイトとのやり取りを行ったり、所定のソフトウェアをダウンロードするといったことができません。スパイダーはHTMLやPDFファイルといったドキュメント形式しか読み取ることができないため、ソフトウェアのダウンロードを求めるような場面に直面すると、別の場所に移動してしまいます。しかし、テクノロジーは日進月歩しています。このプレイヤーは、SWFコンテンツのステートを変化させ、コンテンツ内のテキストにアクセスすることを可能にする、いわば「ヘッドレス」バージョンのFlash Playerプレイヤーです。幸運にも、スパイダーの洗練度は毎年、高まりつつあります。数年前はスパイダーを混乱させていたようなデザインも、今では問題なくなっていることがあります。とはいえ、スパイダーの技術進化をフォローし、SWFコンテンツとともに最先端のテクニックを導入することは肝心です。
テクニックとベストプラクティス
読者の皆さんは、人気のSWFObject 2を利用してSWFコンテンツを埋め込むようにしていることでしょう
例えば、次のようになります。このテクニックの問題点は、<div>タグを使うことでユーザーから当該コンテンツを隠すことになる場合があるということです。検索業界のエキスパートの多くは、コンテンツをユーザーから隠すことに懸念を示しています。これは、検索エンジンがスパマーの手法であると判断しかねないからです。仮に読者のサイトではバスケットボールシューズを扱っているものの、フットボールシューズでの検索ランキングを上げたかったとします。この場合、メインボディ部分にバスケットボールシューズのコンテンツを配置し、非表示の<div>タグ内にフットボールシューズに関する情報を配置するといったことが可能です。「<div>タグを使用してはいけない」と主張する決定的なドキュメンテーションは存在しませんが、<noscript>タグを用いて代替コンテンツを表示する方が、JavaScriptを無効にしているユーザーに代替コンテンツを表示しているという理由から、より安全な方法であるというのが定説です。検索エンジンはJavaScriptを読み取ることができないため、アクセスが向上するという面でも一石二鳥です。この方法のメリットおよびテクニックについて詳しくは、拙筆の別途記事、『RIAの検索エンジン最適化テクニック』の「HTMLソースへのSWFコンテンツの配置」の節を参照してください。ポップアップウィンドウの使用を避ける。
ポップアップウィンドウは、サイトを巡回しようとする検索エンジンにとって悩みの種といえるでしょう
検索スパイダーはポップアップウィンドウを読み取ることができません。したがって、SWFコンテンツはポップアップウィンドウに頼らなくても済むように構成すべきといえます。
インデックスHTMLファイルにおいて、SWFコンテンツを含むポップアップウィンドウを表示するための「Flashサイトを表示」ボタンを使用することは避けましょう
txtファイルを作成する。txtファイルは、関連性の低いコンテンツに検索エンジンが巡回するのを防ぐために有効な手段です。txtファイルの作成」の節を参照してください。単なるテキスト形式のこのファイルを使用すれば、Webサーバーのルートディレクトリーに配置しておくだけで、スパイダーに当該サーバー上のどのファイルの閲覧を許可するかを指示できます。txtファイルは、検索エンジンが巡回できるコンテンツを手軽に制御できる方法です。txtファイルを作成」ページを参照してください。
次のステップ
検索エンジンによってSWFコンテンツが巡回されることを妨げないようにWebサイトを構成する。これを実現するための手順を以下に示します。ポップアップウィンドウの使用を避ける。txtファイルを作成し、これをサーバーのルートディレクトリーに配置する。拙筆の別途記事、『RIAの検索エンジン最適化テクニック』の「検索ランキングの向上を目指したSWFアプリケーションの最適化」の節を参照し、SWFコンテンツをさらに検索しやすくするための方法を模索する。
著者について
Damienは、オレゴン州ポートランドの大手インタラクティブエージェンシーで10年以上もの間、WebデザイナーおよびWeb開発者としてキャリアを積みました。現在は、どのような検索がマーケティングミックスに一致するのか、顧客企業の理解を深める手助けをしており、Cisco Systemsの25以上の国に渡る検索戦略とプログラム開発チームを率い、クライアントとエージェンシー間のベストプラクティスに取り組んでいます。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
ようこそ、さん
お問い合わせ
ホームユーザ向け写真/ビデオ編集ツール
すべての業種・ソリューション ›すべての製品 ›アドビサポートに問い合わせる。
注文状況の確認
教職員および学生
アドビについて
投資家の皆様へ*
地域・社会への貢献*
お問い合わせ
個人またはホームオフィス
法人のお客さま
教育関係のお客様
おすすめ製品
すべてのソフトウェアを見る ›
購入後について
割引価格でコスト削減
ライセンスをご利用中のお客さま
その他の購入方法
販売店のご紹介
Flashコンテンツを特長としたWebサイトへの訪問者をシームレスにアップグレードするのがいかに簡単かを体験してください。制御された環境下で複数のユーザを対象にFlash Playerのインストール・使用状況を管理する、ITプロフェッショナルまたは管理専門職に役立つ、最新の情報を紹介します。
お使いのPlayer検知スクリプトによって、早期導入者がサイトを表示できなくなっていませんか
コードを改良すると、閲覧者をうっかりシャットアウトしてしまうのを防ぐことができます。
アクティブコンテンツ/IEの変更
検知とインストール
すべての製品のデベロッパーセンター*
すべてのテクノロジセンター*
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
Adobe Flash Player を利用すれば、どのオペレーティングシステムやブラウザーでも同じように動作する、安全かつ表現力豊かな高性能アプリケーションを提供できます。企業のITポリシーに従うよう、どのようなインストール体験が提供されるかを細かく制御することも可能です。複数のユーザーが存在する制御された環境でFlash Playerのインストールまたは使用を管理する、ITプロフェッショナルまたは管理プロフェッショナル向けの最新の情報を紹介します。セキュリティは、アドビにとって大変重要な関心事です。ここで紹介するFlash Playerのセキュリティモデルは、ネットワーク環境における機密情報の安全確保にその効果が実証された、ドメインベースのセキュリティシステムを元に開発されています。部署や組織内のイントラネットでの配布、あるいは開発したソフトウェアやマルチメディアコンテンツと一緒にCD-ROMなどの固定メディアに収録して配布、といったことが可能です。また、SMS 2003 R2のカスタム更新プログラム用インベントリツールを使ったライセンス処理および使用のためにFlash Playerカタログが提供されています。Adobe Flash Playerは、世界で最も普及しているソフトウェアプラットフォーム*であり、世界中のインターネットを利用できるデスクトップの98%以上に搭載されています。どのような企業のお客様が、Flash Playerおよび無料のオープンソースFlexフレームワークを使用されているかをご覧いただけます。
どうすれば入手できますか
部署や組織内のイントラネットでの配布、あるいは開発したソフトウェアやマルチメディアコンテンツと一緒にCD-ROMなどの固定メディアに収録して配布、といったことが可能です。また、SMS 2003 R2のカスタム更新プログラム用インベントリツールを使ったライセンス処理および使用のためにFlash Playerカタログが提供されています。Flash Playerは、さまざまなWebブラウザーおよび数多くのコンピューターにプリインストールされています。サポートされるオペレーティングシステムとブラウザーの一覧をご覧いただけます。Flash Playerを使用したいのですが、会社によって禁止されているかブロックされています。
どうすればよいでしょうか
会社によっては、ビデオ(帯域幅を消費しすぎる)やゲーム(仕事の邪魔になる)に使用されることを懸念して、Flash Playerの使用を禁止している場合があります。Flash Platformで企業アプリケーションを開発しており、Flash Playerからアプリケーションにアクセスする必要がある場合は、このような業務用途に限って使用が認められるよう会社に依頼してみてください。
企業コンテンツをサポートするためには、管理者に依頼して、自分のドメインからの*
swfにアクセスできるようにします。使用しているブラウザー拡張機能によって、SWFコンテンツの表示がブロックされています。
企業Flashアプリケーションを使用できるようにして、他のコンテンツは引き続きブロックすることは可能ですか
自分のドメインからのSWFファイルにアクセスできるように、ブラウザー拡張機能を設定します。これにより、企業SWFコンテンツを使用可能にし、他のソースからのSWFは引き続きブロックすることができます。セキュリティは、アドビにとって大変重要な関心事です。Flash Playerのセキュリティモデルは、ネットワーク環境での機密情報の安全確保にその効果が実証されている、ドメインベースのセキュリティシステムに基づいて開発されています。
セキュリティ情報やアップデートを確認したり、電子メール通知に登録したりするには、adobe
自分のコンピューターにソフトウェアをインストールしたり、アップグレードしたりする権限がありません。
どうすればよいでしょうか
コンピューターにソフトウェアをインストールすることを制限されている場合は、システム管理者に連絡して、インストールまたはアップグレードを依頼してください。
デプロイとインストール
私はネットワーク管理者ですが、Flash Playerを会社全体にデプロイするにはどうすればよいでしょうか
Flash Playerをデプロイするには、最初にデプロイするためのライセンスを取得する必要があります。再配布ライセンスは無償で、オンラインライセンシング申し込みから取得できます。
私はネットワーク管理者ですが、共通のグローバルセキュリティおよびプライバシー設定を使用して、Flash Playerを会社全体にインストールするにはどうすればよいでしょうか
管理者は、設定ファイルをクライアントマシンにデプロイすることにより、セキュリティとプライバシーに関するFlash Playerの設定を指定できます。
Flash Playerのインストールの問題を解決するにはどうすればよいでしょうか
現在、SMS 2003 R2のカスタム更新プログラム用インベントリツールを使ったライセンス処理および使用のためにFlash Playerカタログが提供されています。このカタログをネットワーク管理者がダウンロードし、カスタムスキャンツールに読み込んでお使いいただけます。他のプレーヤー用のカタログは、現在のところ提供されていません。Adobeランタイム配布許諾契約*に、すべての使用許諾条件が記載されています。
アーキテクトのためのFlex学習*
アクティブコンテンツ/IEの変更
企業への導入
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
5日間のビデオトレーニングコースで、プログラミングを段階的に体験できます。共通のコンポーネント、エフェクト、コーディングテクニックなどに関する実行可能なサンプルが、Flexによる開発のレパートリー強化に役立ちます。
Flexに関心をお持ちですか
1時間でアプリケーションを構築できます。
チュートリアルと記事
Sparkのアーキテクチャとコンポーネントセットの概要
FlexおよびJavaアプリケーションのアーキテクチャ
この記事では、FlexとJavaで開発するアプリケーションのアーキテクチャに関して、以下のような内容を説明します。
FlexおよびJavaアプリケーション構築のためのテクノロジー
この記事では、FlexおよびJavaアプリケーションの構築に使用されるテクノロジーの概要を紹介します。
FlexおよびPHPアプリケーションのアーキテクチャ
PHPに関連するFlexに固有の事柄について説明します。HTML/PHPアプリケーションの構築のための一般的な作業を、FlexとPHPでどのように実行するかを紹介したいと思います。Flexはクライアントサイドのテクノロジーであり、PHPはサーバーサイドのテクノロジーです。どちらのテクノロジーも非常に成熟しています。今回は、前回に引き続きデバッグに役立つTIPSをご紹介します。この記事ではPart 1の内容を基にして、クライアントサイドデータ管理を行うアプリケーションに拡張していきます。このチュートリアルでは、Flex 4 から新しく採用されたレイアウトについて紹介します。このチュートリアルでは、Flex 4 から新しく採用されたエフェクトについて紹介します。このチュートリアルでは、Flex4で新たに追加されたSparkコンポーネントとSparkスキンアーキテクチャについて詳しく紹介します。このチュートリアルでは、Sparkコンポーネントの標準SparkスキンとカスタムSparkスキンを紹介します。このチュートリアルでは、Flash Builder 4の3つのテーマのうちのひとつである、データ中心型開発について紹介します。このチュートリアルでは、Flex 4 の新機能であるSparkコンポーネントを紹介します。このチュートリアルでは、Flex 4 から新しく採用されたCSSについて紹介します。このチュートリアルでは、Flex 4 から新しく採用されたステート構文について紹介します。単に製品名が変わっただけではありません。Adobe Flexチームが費やした2年の月日にふさわしい進化を遂げています。この記事では、新しいSDKとフレームワークの新機能の概要について説明します。この記事では、Flex 4の主要な目標の概要、アーキテクチャの違い、およびコンポーネント、レイアウト、ステートの使用方法とエフェクトにおける変更点の概論を提示します。Flex 4でFlex 3アプリケーションをコンパイルするときに予期される事柄に関する質問についても回答します。初めてFlex開発を行う人でも、データやサービスにすばやく接続し、データをリッチなUIコンポーネントにバインドすることができます。また、経験豊かなデベロッパーは、高度なデータ指向アプリケーションを構築するための強力な新しい方法を利用できます。
Sparkのアーキテクチャーとコンポーネントセットの概要
この記事では、Flex 4に付属するSparkのアーキテクチャーとコンポーネントセットについて、すばらしい新機能の一部を紹介します。他にも、レイアウトの割り当て、新しいグラフィックライブラリ、拡張されたステートモデル、一新されたエフェクトエンジンなど、Sparkの優れた機能をいくつかご覧に入れます。今回からデバッグに役立つTIPSをいくつかご紹介していきます。具体的には、次のワークフローを扱います。この記事では、Flash Builder 4ベータ2の新機能の中から、呼び出し階層ビュー、拡張ステートシンタックスのサポート、コードヒントの変更、エディターの改善について説明します。
Flex 4ベータ版のビューポートとスクロールの基礎
独自のインタラクティブスクロールコンポーネントを作成したい場合や、Flex 4のスクロールの仕組を詳しく理解したい場合には、以下の内容が参考になります。
Flex 4ベータ版のビューポートとスクロールの基礎
独自のインタラクティブスクロールコンポーネントを作成したい場合や、Flex 4のスクロールの仕組を詳しく理解したい場合には、以下の内容が参考になります。Flexで実際の業務アプリケーションやWebサイトを構築する際にキーボード周りの実装でトラブルが発生することがあります。ちょっとした工夫でトラブルを回避し、アプリケーションが使いやすくなるようなTIPSを紹介します。この記事は初級、中級のFlex技術者の向けです。Flex/AIR開発では、「ああこれは最初から用意しておくべきだった。」と後悔しがちなポイントがいくつかあります。そのひとつが、Flex/AIRアプリケーションを「開発用」と「本番用」とで切り替える仕組みです。
これからはじめるRIAとFlexプログラミング 第3回Flexプログラミング言語の基礎知識
第3回目はプログラミングの経験がない方のために、Flexの開発言語であるMXMLとActionScriptsの基礎知識を身につけていただくことを目指して、これらのベースとなるトピックをご紹介します。Flexで実際の業務アプリケーFeliCa(フェリカ)は、ソニーが開発した非接触ICカード技術方式です。国内の様々な電子マネーのベースとなっている技術で、馴染みのある方も多いかもしれません。今回は、FeliCaの機能を使って携帯電話のブラウザを起動するFlashアプリケーションをFlexで作成します。Flexで実際の業務アプリケーションやWebサイトを構築する際に発生するトラブルに対してちょっとした工夫でアプリケーションが使いやすくなるようなTIPSをご紹介していきます。初級、中級のFlex技術者の方向けの記事となります。LiveCycle ESには、プログラミング的な手法でFlexのグラフコントロールにデータを挿入し、プロセスデータを視覚的に提示する方法が用意されています。この記事ではイベントを利用して、簡単なデータ検証を行ったり、一部のセルが編集されるのを防ぐことができるような、より複雑なitemEditorの作成方法を紹介します。この記事ではFlex 3フレームワークを用いて大規模なマーケティングプラットフォームを開発する際の一般的なストラテジを解説します。
Flexのデータマップコントロールを使用したデータ駆動型地図アプリケーションの構築
Mapsコンポーネントとデータ駆動の技法を使用して、Flexアプリケーションを作成します。
Flexでのエンタープライズセキュリティ
Flex Antビルドスクリプトを追加タスクで拡張します。Flex 4 SDKベータ版に含まれる新しいエフェクトを使用して、新しいレベルのFlexアプリケーションを作成する方法を学びます。Flex 4ベータ版のスキンアーキテクチャを使ってコンポーネントのスキンを作成する方法を学びます。
0によるFlexアプリケーションのテスト
Flexアプリケーションの自動UIテストを作成して使用します。この記事では、Flex 4 SDKベータ版の新しいエフェクトについて説明します。今回はFlash Playerのシングルスレッドモデルに注目し、それがもたらす問題と対策について紹介します。
Flexアプリケーションの開発におけるCFCの役割について
第2回目はプログラミングの経験がない方のために、最低限必要な知識を身につけていただくことを目指して、Flex開発のためにもっともベーシックとなるトピックをご紹介します。本連載では、その筆者の「Flex/AIRハマり帳」をもとに、これからFlex/AIR開発を始める方が同じ過ちを繰り返さないためのささやかなtipsを紹介していきたいと思います。第二回では、BlazeDSの本番環境へのデプロイについてです。本連載では、その筆者の「Flex/AIRハマり帳」をもとに、これからFlex/AIR開発を始める方が同じ過ちを繰り返さないためのささやかなtipsを紹介していきたいと思います。
マーケティング・ツールとしてのRIA 活用(後編)
マーケティングにおけるデータの分析の中でのFlex チャートコンポーネントの利用について解説をしていきます。
階層型コンポーネント指向アーキテクチャによるビジネスアプリケーション構築
PACアーキテクチャに代表される、階層構造をもつコンポーネントを組み合わせてアプリケーションを構成する、階層型コンポーネント指向アーキテクチャについて説明します。Pixel Benderを使用して、画像やベクトルグラフィックなど任意の表示オブジェクトに対してフィルタ、ブレンド、および領域塗りつぶしを適用する方法について説明します。
パート4:ステートとトランジション
プロジェクトの構造、編成、コード形式を参照するための規則とロードマップについて学習します。
Flexのベストプラクティス - パート2:開発作業におけるベストプラクティス
Flexの開発作業に関するベストプラクティスを、この記事では全部で90項目以上も紹介していきます。Flex 3のランタイム共有ライブラリを使用して、RIAのダウンロード時間を短縮し、起動時間を改善します。FlexとRIAに関する基本知識から開発方法の基礎を習得していただくことを目的とする連載です。FlexとZendを利用してコーディング、デバッギングおよびプロジェクト管理のワークフローを能率化する方法を紹介します。マピオンFlash Maps APIとはドラッグ&ドロップによるフリースクロール可能な地図をFlashアプリケーション内に埋め込むことができる地図APIです。本連載では、AIRでデスクトップウィジェットを制作する方法について、実際のプロジェクト例と実装例を交えながら、複数回に渡ってお届けしようと思います。今回は、FlexをベースにFlashと連携を行った、開発手法について解説を行います。
0 (そうめん) で非同期処理をスマートに
ActionScript Thread Library は、タスクシステムと Java のスレッドモデルをベースとした「疑似スレッド」を実現するライブラリで、複雑で冗長になりがちな、イベント処理や非同期処理、リアルタイム処理を、分かりやすくスマートに記述することを可能にします。初めてFlexを触ってみる人や、軽量スクリプト言語の経験があるWeb系エンジニアにもわかりやすいように、Flexとサーバサイドの通信方法について説明したいと思います。共有ライブラリの作成と使用およびプロトタイプの基礎について学習します。プロジェクトの構造、編成、コード形式を参照するための規則とロードマップについて学習します。ライブヘルプによる担当者とのやりとりを通じてサポートを受けるアプリケーションです。
画面デザインとロジックの分割テクニック
Flexで開発を行う際に、画面デザイン(MXML)、スクリプトを1つのMXMLファイルに記述せずに、画面デザイン部(MXMLファイル)、プログラムコードを記述するロジック部(ActionScriptファイル)のように分けて作成する方法が採用されることがあります。今回はいくつかある分割テクニックのうち、IMXMLObjectインターフェースを使用した方法、更にその方法を発展させた方法を紹介します。
マーケティング・ツールとしてのRIA活用(前編)
蓄積されたデータを多様な視点で分析することを目的としています。
Flexアプリケーションの開発時にありがちな10の失敗点
Flexアプリケーションの開発時に陥りやすい、一般的な誤りについて解説します。スキニングやスタイリングのワークフローを自動化する、CS3拡張機能とFlex Builder 3の機能の概要について解説します。一般的に誤解されがちなFlexに関する10の事柄について、正しい情報を紹介します。
開発したFlexアプリケーションの宣伝方法について
アドビ システムズ社が提供する無償リソースや各種プログラムを通じて、自主開発したFlexアプリケーションの認知度を高める方法を紹介します。この記事では、BlazeDSのメッセージングを使用するデモアプリケーションとして、複数ユーザで同時に書き込めるホワイトボードを例に、機能を説明します。
チャーティング機能を活用したWeb解析ツール
Web解析ツールによるアクセスや到達率、流入数、流出数などHTMLベースで提供されていた集計データを、Flex/Javaを用いてRIA化することによりユーザビリティを向上させ、クライアントにおけるサービス品質の向上を図りました。
Flex 4:マルチプラットフォームRIAの構築のためのオープンソースフレームワーク
アドビのオープンソース*
デベロッパーコミュニティでコードの検索、共有、コメントの投稿を行えます。
さらに詳しく*
次のステップ
Flexデベロッパー認定を取得する*
Flexのコンサルタントまたはトレーニング講師を探す。
Flexのオンラインセミナーに参加する*
デザインとコンポーネント
サービスとツールキット
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
ライブラリの作成と使用
動的なメソッド追加用のプロトタイプ
印刷用に表示
ただし、通常、異常な点がまったくない言語というのはありません。
そのような不具合を完全に排除した言語は、Python3
0と次期バージョンのRubyぐらいではないでしょうか
ときどきの異常な動作を除けば、ActionScriptは言語ツールの威力とハイブリッド型チェック(通常、Flex Builderのツールサポートでは静的型チェックだが、必要に応じて動的型チェック)により、Javaよりもわかりやすくて楽しい言語です。JavaScript言語の機能は、ブラウザ間やブラウザのバージョン間で異なる場合があります。私事になりますが、言語シンタックスと基本的な機能がブラウザ間で異なることを知ってからは、JavaScriptへの情熱が冷めました。ブラウザ間の差異を埋め合わせるために時間を奪われるのはご免です。AJAXライブラリの作成者は、多くの時間と労力を費やしてブラウザ間の差異を埋め合わせるコードを書いています。しかし、結局、ブラウザ間の問題は一部がしわ寄せされて付き合わされることになります。ブラウザごとに言語シンタックスが通用するかどうかを心配する必要はありません。
著者について
Bruce Eckelはコンピュータプログラミングに関する多数の著書や記事の執筆を手がけています。コンピュータプログラマを対象とする講義やセミナーをしばしば実施するほか、ANSI/ISO C++標準化委員会の創設にも携わりました。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
ただし、通常、異常な点がまったくない言語というのはありません。
0と次期バージョンのRubyぐらいではないでしょうか
ときどきの異常な動作を除けば、ActionScriptは言語ツールの威力とハイブリッド型チェック(通常、Flex Builderのツールサポートでは静的型チェックだが、必要に応じて動的型チェック)により、Javaよりもわかりやすくて楽しい言語です。JavaScript言語の機能は、ブラウザ間やブラウザのバージョン間で異なる場合があります。私事になりますが、言語シンタックスと基本的な機能がブラウザ間で異なることを知ってからは、JavaScriptへの情熱が冷めました。ブラウザ間の差異を埋め合わせるために時間を奪われるのはご免です。AJAX ライブラリの作成者は、多くの時間と労力を費やしてブラウザ間の差異を埋め合わせるコードを書いています。しかし、結局、ブラウザ間の問題は一部がしわ寄せされて付き合わされることになります。ブラウザごとに言語シンタックスが通用するかどうかを心配する必要はありません。
ライブラリの作成と使用
コンポーネントに関する以前の記事では、ライブラリを使用しませんでした。しかし、ライブラリコンポーネントはプロジェクト間でコードを共有する最良の方法です。この記事の例では再利用可能なライブラリコンポーネントを使用します。ライブラリの作成について詳しく書いてある本やドキュメントはないようです。最初に、コレクションに進む前にライブラリの作成について詳しく説明します。Java プログラマにとっては、ライブラリの作成プロセスは目新しいものではありません。各コンポーネントは名前空間に定義し、名前空間は競合しないように一意の名前にします。Flexでは、Javaの方法に従ってライブラリを作成する個人や会社のURLを逆にしたURLを名前空間の最初に付けます。
私の場合であれば、名前空間はcom
1つの名前空間内には複数のコンポーネントを定義できます。コンポーネントを機能別にグループ分けすると便利です。
各グループの名前空間は com
また、Javaと同じように、ライブラリのディレクトリ構造は名前空間に対応する必要があるので、名前空間 com
また、通常、Flexプロジェクトは1つのSWFとしてコンパイルされます。したがって、SWFを(Webサイトに)コピーするだけでインストールが完了します。Javaとの類似点として、最後にライブラリのコンポーネントファイルがあります。各ファイルは1つのパブリックエレメント(クラスまたは関数)のみを持つことができます。つまり、各ファイルはその1つのエレメントのみを公開します。私は、この知識を書物から得たのではありません。1つのファイルに複数のパブリックエレメントを挿入しようとしたときに、Flex Builderが私に教えてくれたことです。
ライブラリの作成
ライブラリには任意の名前を付けることができます(前述の規則には制限されません)
「Mindview」フォルダを右クリックして(またはコンピュータに応じた操作をして)、「com」というディレクトリを作成します。ライブラリ全体のディレクトリ構造は次のようになります。この構造には、Flex Builderによって作成されるbinディレクトリやユーザが後で追加する内容も含まれます。
最初のライブラリコンポーネントを作成してみましょう
単純なコンポーネントですが、この記事では役立つコンポーネントです。TextAreaを少しだけ変更し、情報の表示を簡素化するコンポーネントを作成します。ファイル名を付けるオプションはありません。ファイル名はクラス名と同じになります。継承元の基本クラスを指定できます。コンポーネントの挿入先のフォルダに従って、Flex Builderによって自動的にパッケージ名が付けられます。残りのコードも記入すると、コンポーネントは次のようになります。コンパイラでは、括弧で囲まれた式になっている場合を除いて、行末をステートメントの終わりとして解釈します。セミコロンは、1つの行に複数のステートメントがあるか、空の式がある場合にのみ必要です。実は、thisはそれほど必要ではありません。JavaやC++と同様にthisは特殊な場合にのみ必要で、コンパイラによって自動的にthisの参照先にスコープが設定されます。コードの構文を簡素化したいので、省略可能なセミコロンやthisはできるだけ使わないことにします。コンストラクタによってコンポーネントの幅と高さを設定し、メソッドによってテキストを表示する動作を簡素化します。このアスタリスクは「任意の型」を意味します。実際、型を指定しない場合は任意の型が使用され、コンパイラによって警告が表示されます。型のアスタリスクは、これを任意の型にすることをコンパイラに指示します。これにより、show()は任意の型を受け取り、それをStringに型キャストしてプリントします。
試しに、このコンポーネントを使用する小さなFlexアプリケーションを作成しましょう
ファイル/新規/Flexプロジェクトを選択し、名前を付けて「次へ」ボタンをクリックします。再び「次へ」をクリックし、「ライブラリパス」ボタンをクリックして「プロジェクトの追加」を選択します。これを選択します。「完了」をクリックします。これを選択すると、該当する名前空間フィールドに挿入されます。
通常、nameは子コンポーネントに使用されるので、特に問題はないでしょう
CDATAタグは、スクリプトブロック内に特殊文字が含まれる場合にのみ必要です。新しいコンポーネントは特別な機能ではありませんが、それなりの役割を果たします。この記事では、コードの簡素化に役立っています。なお、ライブラリの追加はプロジェクトの作成時にのみ行うものではありません。Flex Builder でプロジェクトを右クリックすることにより、いつでも新しいライブラリを追加できます。
動的にメソッドを追加するためのプロトタイプ
ActionScript言語では、静的型付けがオプションのように説明されていますが、実際には静的型付けはほぼ常に使用されています。Flex Builderでは静的型付けが最も有効であり、型を検出してコードを補完入力したり、コンパイル時のエラーチェックやより効率的なコード生成を行うことができます。ただし、必要に応じて動的型付けを使用できます。特に柔軟性が要求されるコード部分では、静的型チェックをオフにすることができます。静的言語の機能だけでは、より動的なコードが必要になったときに、このようにおいそれとは対応できません。この記事では、常に配列を意味のある形で表示する必要があります。その方法を構文的にすっきりした形で実現する方法を模索していたところ、プロトタイプについて学ぶ結果となりました。ここに、任意の次元の配列を表示する関数があります。列の要素ごとに、その要素自体が配列であるかどうかが確認され、それが配列である場合は再帰呼び出しを行います。is演算子は、ランタイム型識別を行います。要素が Arrayオブジェクトである場合は、再帰呼び出しを行います。
要素が初期化されない場合は、何もしません(この例では空の式を定義するためにセミコロンが必要であることに注意してください)
要素が初期化された場合は、文字列に変換します。すべての場合にカンマが追加されます。したがって、指定サイズの初期化されない配列がある場合は、各スペースにカンマが表示されます。戻り式では、結果が角括弧で囲まれます。この構文は悪くないのですが、不格好です。次のように書く方がすっきりします。そして残りの処理を任せます。より古典的な継承方法が後で追加されたため、プロトタイプは今ではほとんど使用されなくなりました。しかし、プロトタイプには、オブジェクトとクラスの両方に動的にメソッドを追加できるという利点があります。Rubyには オープンクラスという概念があり、既存のクラスは組み込みクラスも含めて変更を加えることができます。
プロトタイプは、オープンクラスほど柔軟ではなく、C# 3
0の拡張メソッドに似ています。特に、プロトタイプを通じて追加したメソッドは、追加先のクラスのpublicエレメントにのみアクセスできます。例えば、次のように始めるとします。このクラスでプロトタイプを使用する場合は、dynamicキーワードが必要です。プロトタイプを使用するには、クラスのprototypeフィールドにアクセスして新しい関数を割り当てます。コメントアウトした行がなくても全体がコンパイルされますが、コメントに示したランタイムエラーが発生します。関数呼び出しに関して、エラーの説明は適切ではありません。しかし、意味は通じます。出力は次のとおりです。xフィールドとyフィールドのアクセスは異なります。フィールドがpublicでない場合は、そのフィールドが作成されて、初期値のnullが割り当てられます。その場合、コンパイラの警告やエラーは発生しないので、対応する値は表示されず、バグの追跡が難しくなります。
プロトタイプを使用して改良した構文
配列を表示するたびに配列名を繰り返す必要はありません。最初の関数により、名前がフィールド id として配列に追加されます。デフォルトでは、オブジェクトに追加するメソッドやフィールドは「列挙型」で、for eachステートメントによって繰り返し処理が行われます。C言語の#includeと同じように、コードは挿入先のファイルの一部として効果的にペーストされてコンパイルされます。その使用例は次のとおりです。ここで、Arrayオブジェクトは便利な角括弧構文を使用して作成されています。formatArray()が正常に動作するかどうかを確認するために配列に複数の次元を設定しました。出力は次のとおりです。プロトタイプは、クラスのpublicメンバにしかアクセスできないので、Rubyのオープンクラスより制限されますが、1つか2つのメソッドのみを追加して既存のクラスを別の関数から呼び出せるようにする場合は便利です。
付記:ライブラリへの関数の挿入
ファイルを正しいフォルダに挿入して正しいパッケージ名を付けることはできましたが、それがFlex Builderによって認識されず、補完入力が行われません。importステートメントに手動で入力してもコンパイルされません。しかし、ライブラリ内にクラスを作成して、その後にパッケージの内容を関数に変更すると、この問題を解決できました。結果としてコンポーネントは認識されました。しかし、この方法は常にうまくいくとは限りません。その場合、新しいプロジェクトライブラリコンポーネントを認識させる唯一の方法としては、ライブラリコンポーネントの追加後に新しいプロジェクトを開始する以外にありません。
この記事が掲載される頃にはこのバグは修正されているでしょう
配列を作成するための角括弧構文については既に説明しました。配列オブジェクトは、コンストラクタ構文を使用して作成および初期化することもできます。
追加、削除、連結、スライスおよびスプライス
Arrayには、要素を挿入および削除するためのツールがあります。splice()は、配列の任意の場所で同時に要素の追加と削除を行って置換します。slice()は、元の配列の一部を含む新しい配列を作成します。出力は次のとおりです。indexOf()は、引数を検索して最初に見つかった値のインデックスを返します。出力は次のとおりです。
基本的なソート
基本的なソートでは、組み込みの比較を使用します。フラグを使用して基本的なソートのバリエーションを指定することもできます。この操作では、論理和をとることができます。以下のほとんどのソートはその場で行われます。出力は次のとおりです。
aのソート結果
aの大文字と小文字を区別したソート結果
aの大文字と小文字を区別した降順のソート結果
bのソート結果
bの数値ソート結果
b:の数値の降順ソートの結果
cのインデックス配列のソート結果
複雑なソート
より複雑なソート機能の例を示すために、複数のフィールドを持つオブジェクトのリストを使用します。コンストラクタで、引数をフィールドから区別するためにthisを使用します。クラスで[Bindable]デコレータを使用すると、このクラスのオブジェクトはバインド可能なデータオブジェクトになります。つまり、オブジェクトのすべてのフィールドはバインド可能になり、その結果として自動的に更新可能になります。この機能は、後で使用します。簡潔にするために、すべてのフィールドはpublicになっていますが、プロパティとして公開することもできます。publicフィールドからプロパティへの変更は、構文が変わらないので、クライアントコードを一切変更せずに透過的に行うことができます。次に示すクラスはMXMLコンポーネントとして使用できます。このコンポーネントにPersonオブジェクトのグループを含む配列を保持できます。列の表示順を制御するたびに繰り返す必要がないように、DataGridから継承するMXML コンポーネントを作成します。columnsグループは、データ列の表示順を定義します。特定の列の見出しをクリックすると、その列をソートできます。次に、フィールドをソートするsortOn()とソート関数を使用して各種の複雑なソートを実行することができます。sortOn()では1つのフィールドを選択してソートできるだけでなく、複数のフィールドを選択することができます。リストの最初のフィールドがプライマリソートフィールド、2番目のフィールドがセカンダリソートフィールド、以下同様になります。さらに、ソートフラグのパラレル配列を追加することもできます。この場合、2番目の配列の各要素は、最初の配列の対応する要素に影響します。通常、sortOn()で複雑なソートを処理できますが、処理できない場合は、sort()メソッドにソート関数を渡すことによって完全に制御することができます。この関数は、最初の引数が2番目の引数より大きい、より少ない、または等しいかどうかに応じて、それぞれ1、-1または0を返す必要があります。上の例では、州が大陸分水嶺の東側にあるか西側にあるかに基づいてソートが行われます。これらは連想配列です。連想配列については後で説明します。コロンの左のキーは、コンパイラによって自動的に文字列に変換されます。この例では使用されないので値はすべて0です。このキーワードは、引数が連想配列のキーの1つであるかどうかを示します。オブジェクトが他のオブジェクトのグループに属しているかどうかを確認する機能は、setの動作です。連想配列を作成することにより、州がeastまたはwestのどちらに属している(in)かを簡単に確認することができます。文字列ではなくオブジェクトをキーとする連想配列を作成することもできます。この点は後で説明します。出力は次のとおりです。
配列のコピー
同じオブジェクトに2つの参照をポイントすると、オブジェクトの変更は両方の参照に反映されます。同じ配列オブジェクトに2つの参照がエイリアスされている場合、a[1]を変更すると、aとbの両方に変更が反映されます。つまり、配列は複製されますが、配列がポイントするオブジェクトは複製されません。深いコピーとは、参照がコピーされるだけでなく、参照がポイントするすべてのオブジェクトもコピーされることを意味します。浅いコピーと深いコピーの相違点を確認するには、一意なフィールドを自動的に生成するクラスを使用するのが便利です。static変数を使用すると、このクラスは新しいオブジェクトごとに異なるidを自動的に作成し、オブジェクトを文字列として要求するたびにそのidを生成します。これはプロトタイプ当時から残る不具合で、うっかり忘れてoverrideを使用すると混乱します。次の例は浅いコピーの問題を示しています。deepCopy()関数では、配列をByteArrayクラスのインスタンスとしてシリアル化し、次にその配列を新しい配列内に読み戻すことによって、深いコピーを作成します。idフィールドはありますが、オブジェクトに関する型情報がありません。連想配列は、辞書またはマップとも言われます。通常の配列では数値をインデックスとして使用しますが、連想配列ではオブジェクトをインデックス(キーと呼ばれます)として使用します。しかし、実際にはそうでもありません。例えば、Pythonではオブジェクトのすべてのメンバが辞書内に保持されます。辞書は中括弧を使用して定義し、キーと値はコロンで分けます。出力は次のとおりです。辞書を定義する構文を使用していますが、実際にはオブジェクトを作成しています。fooのドットアクセスで確認できます。しかし、dict['bar']のように、配列インデックス構文を使用して要素にアクセスすることもできます。
ただし、引用符でキーを囲む必要があります(中括弧内でキーを定義する場合、引用符は不要です)
どちらもオブジェクトの要素を繰り返し処理しますが、forではキーが生成されるのに対して、for eachでは値が生成されます。k:*は、kを不明な型として宣言します。これは汎用関数で、配列の内容が不明であることによります。forを使用する場合は、Arrayのキーとして数値インデックスのみを繰り返し処理することになります。中括弧の構文は、単なる辞書ではなくオブジェクトを生成するので、匿名のオブジェクトを作成する構文でもあります。anonはクロージャの動作も示し、anonのスコープ外に定義されているtimesの値を取り込みます。詳しくは、こちらのクロージャに関する記事*を参照してください。
キーとしてのオブジェクト
このセクションの最初の例で、辞書を以下のように定義しました。この構文では、引用符が使用されていませんが、キーが自動的に文字列として変換されます。しかし、一般に文字列のみがキーとして使用されるのではありません。任意のオブジェクトをキーとして使用できます。次の例では、オブジェクトをキーとして使用しています。このクラスの使い方は、基本的なObject辞書の使い方とは、微妙に異なります。
このクラスでは、この記事で前述したcom
出力をご覧ください。しかし、これにより、aオブジェクト、bオブジェクトおよびcオブジェクトを使用する試行が無視されます。代わりに、キー名が文字列に変換されます。dict1[b]とすると、キーとしてのbオブジェクトの値は生成されません。dict2では、角括弧の構文と引用符なしのa、bおよびcを使用して明示的に割り当てます。
今度はキーとしてオブジェクトを使用していますが、出力を見ると、オブジェクトの文字列表現が使用されています(通常は文字列表現でも十分です)
Dictionary では文字列表現ではなくキーオブジェクトのアイデンティティを使用します。これを実行すると、「true」のアラートが表示されます。データが変更されても、生のArrayオブジェクトはデータプロバイダコンポーネントに対して変更の通知を生成しません。したがって、コンポーネントは再描画されるか、データプロバイダが再割り当てされるまでは、更新されません。ボタン別にアプローチが異なる点にご注目ください。他の機能については、Flex Builderのドキュメントまたはオンラインヘルプを参照してください。ソートやフィルタを適用または削除する場合は、refresh()を呼び出して結果を表示コンポーネントに反映する必要があります。他のすべての操作は自動的に反映されます。通常、カーソルを使わない操作が多いので、実際にそのプロパティやメソッドを目にすることは多くありません。ArrayはFlashプレーヤーコンポーネントであるため、直接バインドできず、独自のイベントも発行しません。いくつかのメソッドは関数プログラミングのカテゴリに属します。関数プログラミングでは、演算をシーケンスに適用します。ただし、その演算の適用方法は、シーケンスをループして一度に1つずつ処理するという通常の方法ではありません。関数プログラミングでは、シーケンスに適用する指示を一括して渡します。関数プログラミングで重要な点は、各演算に副作用がないことです。つまり、演算対象のシーケンスにも周囲の環境にも影響を与えません。純粋な関数の演算は結果を生成するだけです。この制約により、関数の呼び出しごとに別個のスレッドを渡すことができ、スレッド間の競合は発生しません。関数プログラミングは必然的にスレッドセーフなプログラミングモデルです。副作用なしの規則は従うべきもので、プログラミングシステムによって強制するものではありません。Flexのような言語では、プログラミングサポートが(まだ)追随していないため、原則よりもスタイルに従う傾向があります。forEach()は、それ自体では純粋な関数の呼び出しではありません。結果は次のようになります。このように、forEach()には中間の結果を取り込むためのコンテキストがありません。したがって、大文字の名前のリストを作成して返すことはできません。ただし、forEach()を各自の関数内で使用し、このコンテキストを自分で設定することができます。結果から明らかなように、元のArrayには影響しません。強力な関数型の演算の1つとしてmap()があります。これは(上に示したように)独自の新しい結果の配列を構築し、元の配列の各要素に引数関数を適用して、結果の配列の要素を生成します。前の例を次のように書き直すことができます。ただし、各要素をテストし、それが結果に属することを確認して生成します。出力は次のとおりです。
独自の関数演算の作成
独自の関数演算を容易に作成し、ライブラリに追加して再利用することができます。次に示す数例のほかにも容易に追加できます。startと stopは省略可能なので、実際の引数の数を確認して引数の意味を判断する必要があります。"構文は、可変引数リストを示します。Flexでは、パッケージの1つの関数のみを公開できます。
他のアクセス指定子は許可されません(関数を公開する指定子はありません)
したがって、複数の関数を追加する方法としては、その関数をネストする以外にありません。テストプログラムを次に示します。出力は次のとおりです。
最初は、reducerを2つの引数を使用する関数として宣言しようとしましたが、そうするとコンパイラが完全に混乱します(エラーメッセージも表示されず、単純にパニック状態になります)
つまり、部分的なダックタイピング(動的型チェック)です。関数を使用しますが、関数の引数を指定することはできません。そこで、任意の引数と戻り型を使用してreducer()を呼び出します。この場合、使い方が正しくない場合はランタイムエラーが発生します。引数aは変更せずに、それから読み取るだけです。これは、副作用なしの規則に従ったものです。次に示すのは、値を合計するだけの単純なテストです。結果として4950が表示されます。むろん、独自のsum()関数を作成し、それをライブラリに追加することもできます。各タプルは、各引数のシーケンスのn番目の要素を含みます。入力配列ごとにサイズが異なる場合は、最小の入力配列の長さが返されます。初期化式は、最小の場合でもセミコロンが必要です。次に示すのはzip()の動作を示すテストです。出力は次のとおりです。関数プログラミングについて、結合可能性の話題にまだ触れていません。結合可能性とは、既存の関数を呼び出して新しい関数として結合できることを意味します。既存の関数のスレッド独立型の特性は新しい関数でも健在で、独立スレッドで個別に実行することができます。関数の結合は複雑な面があり、副次的な利点がない限り(Flexではまだありません)、一般的には益よりも問題が多いというのが現状です。
著者について
Bruce Eckelはコンピュータプログラミングに関する多数の著書や記事の執筆を手がけています。コンピュータプログラマを対象とする講義やセミナーをしばしば実施するほか、ANSI/ISO C++標準化委員会の創設にも携わりました。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
0 (そうめん) で非同期処理をスマートに | デベロッパーセンター
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
データ読み込みの例
もう少し複雑な読み込みの例
エラー処理の例
アニメーションの例
処理のキャンセルの例
印刷用に表示
0 (そうめん) で非同期処理をスマートに
はじめにこの処理をして、次にこの処理をして
0 (FlashPlayer 9) は、処理の流れがひとつしかない「シングルスレッド」で、かつイベントを介して処理を進める「イベント駆動」を採用しているため、データのロード完了を待つ、ユーザーがマウスをクリックするのを待つ、といった非同期処理が入るととたんにコードが複雑になる傾向があります。ActionScript Thread Library は、タスクシステムと Java のスレッドモデルをベースとした「疑似スレッド」を実現するライブラリで、複雑で冗長になりがちな、イベント処理や非同期処理、リアルタイム処理を、分かりやすくスマートに記述することを可能にします。この記事では、以下のソフトウェアとサンプルを使用しています。
著者について
jpといったコミュニティの運営も行っている。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
0 (そうめん) で非同期処理をスマートに | デベロッパーセンター
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
0 (そうめん) で非同期処理をスマートに
はじめにこの処理をして、次にこの処理をして
0 (FlashPlayer 9) は、処理の流れがひとつしかない「シングルスレッド」で、かつイベントを介して処理を進める「イベント駆動」を採用しているため、データのロード完了を待つ、ユーザーがマウスをクリックするのを待つ、といった非同期処理が入るととたんにコードが複雑になる傾向があります。ActionScript Thread Library は、タスクシステムと Java のスレッドモデルをベースとした「疑似スレッド」を実現するライブラリで、複雑で冗長になりがちな、イベント処理や非同期処理、リアルタイム処理を、分かりやすくスマートに記述することを可能にします。この記事では、以下のソフトウェアとサンプルを使用しています。
データ読み込みの例
// 何か処理をする。ここで、三つの新しいクラスが登場しています。全てのスレッドの元となる基底クラスです。コンストラクタで指定された URLRequest を用いてデータを読み込み、完了するとスレッドが終了します。複数のスレッドを、addThread メソッドで追加された順で、順番に実行するスレッドです。あるスレッドの実行が終了すると次のスレッドを実行し、全てのスレッドの実行が終了するとこのスレッドの実行が終了します。Thread クラスの join メソッドを呼び出すと、呼び出した先のスレッドの終了を待機して、next メソッドで指定したメソッドを終了後に呼び出すようになります。
もう少し複雑な読み込みの例
実際の開発では、読み込みの処理は更に複雑になることがあります。例えば、まず XML を読んで、その内容を元に、画像ファイルを読み込んで表示する、といった処理です。// 読み込んだ XML から更に画像を読み込むスレッドを作成して実行する。ここで、次のクラスが新しく登場しています。Loader を用いて画像などを読み込むスレッドです。コンストラクタで指定された URLRequest を用いて画像などを読み込み、完了するとスレッドが終了します。
xml が次のような内容であった場合、エラー処理の例
エラーが発生した場合に、それをそのまま放っておくのは不親切です。エラーメッセージを表示する、リトライするなど、何か処理を行いたい場合がほとんどだと思います。スローされた例外は、親スレッド (そのスレッドを開始したスレッド) に伝播していくようになっています。そのようにして伝播してきた例外は、error メソッドで捕捉することができます。error メソッドでは、第一引数ひ捕捉したい例外の種類、第二引数に例外発生時に呼び出すメソッドを指定します。例外発生時に呼び出されるメソッドは、第一引数に発生した例外、第二引数に例外が発生したスレッドを採るようにします。このメソッドが何事も無く終了すると、例外発生前に実行していたメソッドに復帰します。ここでは、next メソッドに null を指定することで、なにもせずスレッドが終了するようにしています。
アニメーションの例
これまでデータの読み込みを例に見てきましたが、もちろん、アニメーションにも使用することが出来ます。次の例では、1秒ごとに、ランダムな位置に Sprite をアニメーションさせながら移動させます。ここで、次のクラスが新しく登場しています。Tweener を用いてアニメーションを行うスレッドです。コンストラクタで指定されたターゲットとパラメータを用いて Tweener でアニメーションを行い、完了するとスレッドが終了します。5 秒かけて移動するアニメーションを実行します。
処理のキャンセルの例
既に行われている動作に割り込んで、別の動作を行う、すなわちキャンセル処理を行いたい、というのも、実際の開発ではよくあることです。次の例では、さきほどのランダムな座標にアニメーションするスレッドに対して、キャンセル (割り込み) が要求された場合は、Sprite をフェードアウトして消すという処理を行います。
// 割り込まれた場合
interrupted メソッドを用いると、割り込み要求がされた場合に実行されるメソッドを指定出来ます。こうすると、割り込みフラグが設定され、通常の動作から、割り込み動作に移行します。0 (そうめん) を使ううえでの最大のメリットは、非同期処理を含む、全てのコントローラ的な処理が、このスレッドのスタイルで統一して記述できるところにあります。そのおかげで、コードが読み易くすっきりし、開発スピードも上がりますし、処理の順番の入れ替え等が簡単なため、開発途中での仕様変更にも強くなります。仕事レベルの複雑な処理ほど威力を発揮するので、是非皆さんも使ってみて下さい。詳細や、ダウンロード、サンプルや制作事例等は以下のページで見ることが出来ます。ドキュメントは以下にありますので、是非一度目を通してみて下さい。
著者について
jpといったコミュニティの運営も行っている。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用規約およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
Flexのベストプラクティス - パート2:開発作業におけるベストプラクティス
アセットの取り扱い
0コーディングの標準スタイル
MXMLコーディングの標準スタイル
FlexにおけるCSSコーディングの標準スタイル
単体テストの統合化
Flex開発に関するベストプラクティスのまとめ
これらのプラクティスは、すべてのFlexアプリケーションに適用できます。ベストプラクティスを実践できているかどうか、もう一度確認してみてください。assetsディレクトリを作り、そこにアセットを置く。assetsディレクトリ内はサブディレクトリを作って整理する。SWFディレクトリを使用する。フォントはfontsディレクトリに置く。オーディオはaudioディレクトリに置く。ビデオはvideoディレクトリに置く。XMLディレクトリを使用する。パッケージ名に動詞、形容詞、副詞を使わない。パッケージ名は複数形にする。パッケージ名は、中のクラス群の特徴を表した名前にする。クラスを使ってOOPを積極的に実践する。クラス名には名詞を使用する。クラスの本体内で定義する実行可能コードの量は最小限にする。インスタンス変数と引数の名前を対応させる。クラスの作成時には伝統的・一般的な慣例に従う。クラス名の最後に、そのクラスの種類(フォーマッタ、バリデータ、イベント、エラーなど)を表す言葉を含める。クラス名にスキンの種類を含める。スーパークラス名にはなるべく「Base」を付ける。クラス名にスペースを含めない。メソッドとメソッドの間には空行を入れる。なるべくインターフェイスを実装する形でコーディングする。インターフェイス名は形容詞にする。意味があって内容のわかりやすい変数名を使用する。変数の宣言は1行につき1個にする。変数の宣言では、1つごとに空行を入れる。個々の変数ごとにASDoc形式のコメントを添える。変数に対して、強い型指定をいつも使用する。定数の名前は大文字にする。ストリング定数の名前と内容を一致させる。メソッド名には動詞を含める。1行に記述するステートメントは1つだけにする。クラス内のメソッドは機能別にまとめて記述する。個々のメソッドすべてにASDoc形式のコメントを付ける。戻り値の型を必ず指定する。void(値を返さない)や*(任意の型)の場合でもその旨を明示する。メソッドのシグネチャではアクセス修飾子を必ず使用する。メソッド引数の型を指定する。イベントハンドラの引数は「event」という名前にする。メソッド名と括弧の間はスペースを空けない。キーワードと括弧の間はスペースを空ける。コードブロックは、1レベルにつき4個のスペースでインデントする。クラス内のメソッド間に空行を入れる。コードが読みやすくなるようにスペースを挿入する。MXMLエレメントの属性を整理する。MXMLエレメントのID属性は最初の属性として記述する。関連する複数の属性を1行にまとめる。関連性に応じてMXMLエレメントの属性をグループ化する。メタタグは、マーク対象となるプロパティやメソッドの上に配置する。MXMLエレメント間に空行を入れて整理する。MXMLドキュメント内の構造を整理する。インラインCSSを使わない。CSSの記述量を最小限に、記述内容を簡潔に保つ。似た内容のスタイル定義をグループ化して配置する。スタイルにコメントを付ける。1行に記述するCSS宣言は1つだけにする。なるべくクラスセレクタを使用し、タイプセレクタの使用を避ける。クラスセレクタ名にはアンダースコアを含めない。クラスセレクタ名は特定の外観を表す言葉にしない。一貫した名前付け規則を守る。コメントの書き方はASDocコメントの標準書式に従う。スペースや行頭のアスタリスクを使ってコメントの読みやすさを向上する。説明本文の冒頭には、説明内容を簡潔にまとめた文を置く。有用なコメントを個々のクラスすべてに対して記述する。メソッドに戻り値がある場合は、その型を@returnで示す。ASDocコメントの中では特殊文字を使用しない。コメントのテキストは、どの@タグよりも前に配置する。変数の使い道を説明する。有用なコメントを個々のメソッドやインターフェイスすべてに対して記述する。イベントの種類を完全修飾クラスパスで示す。ユースケースを作成する。UMLの利用を検討する。コード生成ツールの利用を検討する。デザインパターンの利用を検討する。アプリケーション開発フレームワークの利用を検討する。チームベースでの開発作業にはフレームワークを採用する。フレームワークの利用が適切でない場合を認識する。メソッドをテストするのではなく、外部に対する挙動をテストする。「単純すぎるものは壊れようがない」の法則を適用する。基本的なOOPベストプラクティスをテストケースにも適用する。テストメソッドには簡潔明瞭な名前を付ける。テストケースメソッドのコードは単純にする。アサーションメソッド呼び出しの内部では、なるべく静的な値を使用する。テストコードのドキュメントをコメントに記述する。独立した単体テストを作成する。アサーションは1つのテストケースにつき1回とする。
次のステップ
この言葉は、この記事にも同じく当てはまるものだと筆者は考えています。「Flexをターゲットとするプロジェクトはそれぞれに異なります。したがって、ベストプラクティスは担当チームや実際のプロジェクトごとに異なります。小さなチームに通用するプロジェクトプラクティスでも大きなチームには通用しないことがあります。その逆の場合もあります。これは、過去3年間、様々なプロジェクトを観察した結果としてのFlexのベストプラクティスに関する私の見解です。
多くの点で、私の推奨事項は古典的なソフトウェア開発の原則であって、目新しいものではありません」
Flexに関するベストプラクティスをさらに詳しく学ぶには、次の資料を参照してください。
ご協力・謝辞
この記事への情報提供やレビューをしていただいた以下の方々に深く感謝します。各氏の協力がなかったとしたら、この記事が世に出ることはありませんでした。良書ですので、読者の皆さんも機会があれば一読してみてください。この記事は、次の各記事から得た着想と情報に基づき執筆しました。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
Flexのベストプラクティス - パート2:開発作業におけるベストプラクティス
このシリーズのパート1では、Flexプロジェクトを設定する際のベストプラクティスを取り上げました。それに続き、パート2ではFlexでの開発作業におけるベストプラクティスの概要を説明します。Flexの開発作業に関するベストプラクティスを、この記事では全部で90項目以上も紹介していきます。これを読めば、アプリケーションの依存関係をうまく整理できるアセット管理の方法がわかります。0、MXMLおよびCSSのコーディングに関して、Flexデベロッパーのコミュニティに広く普及し、標準的な慣行として実践されているプラクティスも知ることができます。その1つとして紹介するASDocというツールは、アプリケーションのソースコードからHTML形式のAPI言語リファレンスドキュメントを作成するのに役立ちます。アプリケーションアーキテクチャについてのセクションでは、アプリケーションの基本方針を定める際に有効なテクニックを示します。また、アプリケーション開発用のフレームワークに関しては、Flexでの開発に適用できるものをいくつか示し、それらが効果的である場合とそうでない場合について検討します。そして最後は、単体テストを実施してコードベースを検査し、首尾一貫した動作を確実にするためのベストプラクティスを示します。以上のような各種ベストプラクティスに従うことは、コードベース内の作業対象個所を探す際の効率を上げたり、要件の変化に対するアプリケーションの適応能力を高めたりするのに有効です。
当てもなくソースコードを追いかけて場当たり的な変更を繰り返すような事態は避け、ムダなく充実した仕事をしましょう
それではスタートです。0とFlexの基本的な使い方を習得していることが必要です。また、オブジェクト指向プログラミング(OOP)の経験があると、記事中で取り上げる概念やプラクティスを理解する助けになります。
アセットの取り扱い
Flexアプリケーションは、各種メディアなど数多くのファイルを組み合わせて作られるのが普通です。ファイルの種類は、画像、CSSファイル、フォント、オーディオクリップ、ビデオなどさまざまです。そうしたアセットやソースコード内容がきちんと整理されていると、後で変更を求められることになった場合に迅速な対応ができます。ここでは、Flexアプリケーションの関連ファイルについて、名前の付け方と格納方法に関する一般的なガイドラインを示します。srcディレクトリ内に「assets」というフォルダを作成するのが、一般に行われているベストプラクティスです。assetsディレクトリ内はサブディレクトリを作って整理する。多様な種類のメディアを整理しやすいよう、アプリケーションで使用するメディアファイルは、ファイルの種類ごとのサブディレクトリで分類することをお勧めします。以降の項目には、サブディレクトリに関して一般的に行われているプラクティスを示します。SWFディレクトリを使用する。
Flexアプリケーション内のSWFファイルは「SWF」というディレクトリに格納するとよいでしょう
ただし、読み込むSWFファイルの用途によっては異なるディレクトリに置くほうが好都合な場合もあります。例えば、モジュールを別の場所に格納することが考えられます。モジュールについては、この記事では扱いません。詳しくはモジュールの作成*に関するドキュメントを参照してください。フォントはfontsディレクトリに置く。Flexアプリケーションには字体を埋め込むことができます。標準以外のフォントを使う場合は、TTFやその他のフォントファイルを「fonts」というディレクトリに格納します。使用できるフォントはプラットフォームによって異なるという点にも注意してください。複数のプラットフォームを対象とする開発チームでは特に、フォントをアプリケーションに含めるようにするのが安全です。オーディオはaudioディレクトリに置く。オーディオは、リッチインターネットアプリケーションでよく使われる種類のメディアです。ビデオはvideoディレクトリに置く。ビデオの格納場所は「video」というディレクトリにします。XMLディレクトリを使用する。XML構成ファイルがアプリケーションに含まれる場合や、サーバを呼び出すことなくアプリケーションに直接読み込まれるXMLファイルがある場合は、それらを「xml」というディレクトリにまとめておきます。以上の慣例に従って作成したディレクトリ構造を図1に示します。
アセットをサブディレクトリで分類
0コーディングの標準スタイル
ここでは、アプリケーションのコードベースを整然とした読みやすい状態に保つために役立つ、コーディング時についてのプラクティスを示します。これらを守っておくと、後でアプリケーションを保守する別のデベロッパーが楽に作業できます。また、元の作成者自身にとっても、修正が必要になったときにコードのしくみを思い出すことが簡単になります。
パッケージを使った開発についてのベストプラクティス
パッケージ名に動詞、形容詞、副詞を使わない。これらの品詞にあたる単語をパッケージの名前にするのは望ましくありません。名詞の複数形や、概念を表す名詞を使用してください。パッケージ名は複数形にする。複数のクラスを含んだパッケージには、そのことを表すために複数形の名前を付けます。例えば、エフェクトのパッケージ名に「effects」という単語を使います。パッケージ名は、中のクラス群の特徴を表した名前にする。例えば、多数のカスタムボタンクラスを含んだアプリケーションで、それらのクラスを「cunstomButtons」などという名前のパッケージにまとめることが考えられます。パッケージに関しては、「Flexのベストプラクティス–パート1:Flexプロジェクトの設定」で紹介している他のベストプラクティスも参照してください。また、パッケージの作成に関しては、Flex SDKのコーディングに関する慣例とベストプラクティス*も参照してください。
クラスに関するベストプラクティス
クラスの本体内で定義する実行可能コードの量は最小限にする。実行可能なコードは、メソッド内に配置してカプセル化するようにします。インスタンス変数と引数の名前を対応させる。コンストラクタに引数を渡してインスタンス変数を設定する場合は、それら引数名と内部プロパティ名との対応関係がわかるようにします。クラスの作成時には伝統的・一般的な慣例に従う。クラス名は、アプリケーション内で使われるオブジェクトの単体を表す言葉にします。普通、オブジェクトの名前は、名詞の単数形に基づく言葉を連結し、先頭と単語の区切りを大文字で示した「UpperCamelCase」形式で命名します。asのような名前で2つのクラスを定義することが考えられます。また、極端に規模の大きいクラスを作成することは望ましくありません。クラス名の最後に、そのクラスの種類(フォーマッタ、バリデータ、イベント、エラーなど)を表す言葉を含める。フォーマッタ、バリデータ、イベントおよびエラーに関連するクラスについては、その種類を表す言葉をクラス名の最後に付けます。クラス名にスキンの種類を含める。スキンの適用に関連するクラスについては、スキンの種類を表す言葉をクラス名の最後に付けます。スーパークラス名にはなるべく「Base」を付ける。継承関係になっているクラス間では、スーパークラスの名前の最後を「Base」にすると関係がわかりやすくなります。Flexフレームワークでも、例えばListBaseなど、「抽象クラス」の性質を持つと考えられるスーパークラスの命名にこの規則が採用されています。メソッドとメソッドの間には空行を入れる。クラス内の各メソッド間に空行をとると、コードの可読性が向上し、ざっと眺めて構造を把握することも簡単になります。なるべくインターフェイスを実装する形でコーディングする。継承関係の一部を構成するクラスを作成する際は、できるだけ、何らかのインターフェイスを実装する具象クラスとしての形をとるのが望ましいと考えられます。ここでいう「インターフェイス」は、ユーザインターフェイスではなくActionScriptインターフェイスのことです。
変数に関するベストプラクティス
意味のある変数名を使用する。一般論として、1文字だけの変数名を付けることは避けてください。同じように、省略形の言葉を変数名にすることも望ましくありません。内容のわかりやすい変数名を選ぶ。変数名が長くなったとしても、コンパイラによる最適化が働くので最終的なファイルサイズには影響しません。変数や関数の名前自体が端的な説明になっていれば、コードが読みやすくなり、ドキュメントも簡潔にすることができます。変数の宣言は1行につき1個にする。1行に複数の変数宣言や代入を並べて書くことは、なるべく避けてください。いくつもの宣言が並んでいると、見落としのミスが発生しやすくなります。変数の宣言では、1つごとに空行を入れる。ソースコードの可読性を高めるため、個々の変数宣言のすぐ上にASDocコメントを配置します。説明のコメントの下に、該当する変数宣言を1つ書き、その下は1行空けるようにします。個々の変数ごとにASDoc形式のコメントを添える。変数の意味をコメントで説明します。ただし、単に目的を繰り返すのではなく、具体的にどう使われるのかを伝えることが重要です。変数名に「object」という言葉を使うことは避け、変数を見分けるために役立つ、意味のある名前にします。変数に対して、強い型指定をいつも使用する。たとえデータ型が*(型なし)の場合であっても、強い型指定を常に使うことは、変数の意図をより明確に示すために役立ちます。型は、変数の使い方や目的を伝える重要な情報の一部です。変数に強い型指定を付けると、あらかじめデータ型が確定し、該当する型以外のデータが格納されることは(型を変換しない限り)なくなります。このプラクティスに従うと、ブール型の変数とそれ以外とを区別し、すぐに見分けられるようになります。定数の名前は大文字にする。定数名は全体を大文字で表記し、単語間の区切りはアンダースコアで示すようにします。定数の値は、アプリケーションの実行中に変化することがなく一定です。名前を大文字だけにしておくと、値が変化する普通の変数との区別がつきやすくなります。ストリング定数の名前と内容を一致させる。getter/setterアクセサメソッドで操作する変数の名前は、先頭にアンダースコアを付ける。getter/setterメソッド経由で操作する変数を作成する場合、該当する変数自体の名前はアンダースコア(_)で始まるようにします。
メソッドに関するベストプラクティス
メソッド名には動詞を含める。普通、メソッドは、何らかの種類に属する何らかのオブジェクトに対して何らかのアクションを実行するものです。1行に記述するステートメントは1つだけにする。複数のステートメントを1行に続けて書くことは避けてください。クラス内のメソッドは機能別にまとめて記述する。クラスのコード内にメソッドを記述する順序は、なるべく、スコープよりも担当する機能に応じてまとめるようにします。関連性のあるメソッドを隣接して配置すると、コードの読みやすさ、理解しやすさが向上します。個々のメソッドすべてにASDoc形式のコメントを付ける。コメントでは、そのメソッドが必要となった理由を述べ、呼び出し側となるクラスのために詳しい使い方を説明します。何をするメソッドかを単に繰り返すのではなく、「理由」を明らかにすることが重要です。戻り値の型を必ず指定する。void(値を返さない)や*(任意の型)の場合でもその旨を明示する。戻り値の型はすべてのメソッドに明記します。型がわかると、メソッドの用途を理解しやすくなります。メソッドのシグネチャではアクセス修飾子を必ず使用する。メソッド引数の型を指定する。すべての引数に対して型を指定しておくと、呼び出し側のコード開発が楽になります。イベントハンドラの引数は「event」という名前にする。アプリケーション内で、イベントハンドラのコードを見分けやすくなります。これについては、「e」または「evt」という引数名が使われることもよくあります。他の決めごともそうですが、いずれか1つに統一することが重要です。メソッド名と括弧の間はスペースを空けない。ソースコードの記述スタイルを標準化し、簡潔さと一貫性を常に心がけてください。キーワードと括弧の間はスペースを空ける。
書式に関するベストプラクティス
各種ActionScriptクラスのコードは、アプリケーション内の他のコードと同様の方法で整理して配置します。そうしておくと、後でコード内の特定個所を修正する必要が生じたとき、それを行うのが自分であれ別のデベロッパーであれ、目的の個所を見つけて手早く変更を加えることができます。コードの配置順としては、例えば次のような構成が考えられます。
冒頭のコメント(作成者、バージョン、著作権表示、コードライセンス表示などの情報を含めます)
クラスまたはインターフェイス実装のASDocコメント
コードブロックは、1レベルにつき4個のスペースでインデントする。エディタの設定で、Tabキーを押したときにTab文字ではなくスペース列が入力されるようにします。これは、異なるプラットフォーム上でソースコードの表示が崩れ、可読性が損なわれるのを防ぐためです。Tab文字の表示方法はオペレーティングシステムによって異なります。クラス内のメソッド間に空行を入れる。
各メソッドごとに、まずASDocコメントを書き、そのすぐ下にメソッドシグネチャを示します(引数がある場合、引数リストには型指定を含めます)
次にメソッドの本体を記述し、最後に空行を入れます。コードが読みやすくなるようにスペースを挿入する。コンマの後には、原則としてスペース1個を入れます。また、演算子(+、-など)の前後にもスペースを入れます。
MXMLコーディングの標準スタイル
FlexアプリケーションのMXMLソースコードを作成・編集する際、ここに示す各種プラクティスに従うと、一貫性や順序を保ちやすくなります。
エレメントに関するベストプラクティス
エレメントの属性を整理する。エレメントの属性は、プロパティ、イベント、エフェクト、スタイルのように一定の順序で記述します。ID属性を最初の属性として記述する。関連する複数の属性を1行にまとめる。関連性に応じて属性をグループ化する。互いに関連した属性群が1行に書ききれないほど多くある場合は、それらをできるだけ隣接させつつ、複数行に分けて記述します。
書式に関するベストプラクティス
MXMLエレメント間に空行を入れて整理する。関連性のないMXMLエレメントの間は1行空けます。例えば、トランジションの定義に関するエレメント群と、アプリケーションのレイアウトをコントロールするHBoxの間には空行を挿入します。MXMLドキュメント内の構造を整理する。例えば次のような順序を定め、一貫した構造に従ってMXMLを記述するようにします。
ルートXMLエレメント(このXMLドキュメントで使用する名前空間の指定を含む)
Styleエレメント(外部CSSファイルとリンクしていることが必要)
トランジション関連のエレメント
FlexにおけるCSSコーディングの標準スタイル
スタイル指定とスキン適用に関する情報は、コーディングスタイルの標準化を意識して記述しないと、検索や解読が難しいコードになりがちです。ここでは、Flexの開発におけるCSSのベストプラクティスを示します。インラインCSSを使わない。MXMLエレメント内にスタイルを直接定義することは避け、styleNameとカスタムクラス定義を使用してください。CSSの記述量を最小限に、記述内容を簡潔に保つ。CSSコードを外部ファイルに分け、メインアプリケーションではそのファイルを参照します。MXMLコード内にスタイルを埋め込むことは、なるべく避けてください。似た内容のスタイル定義をグループ化して配置する。アプリケーションのCSSファイル内には、似た内容のスタイル同士をまとめて記述します。例えば、まずテキスト関連スタイルのグループ、次にビュー関連スタイルのグループというように分けて記述すると、コードが整理されます。スタイルにコメントを付ける。別のデベロッパーがデザインの変更作業を行う場合のために、スタイルの説明をコメントに残しておきます。1行に記述するCSS宣言は1つだけにする。複数のスタイル定義を1行にまとめて書くことは避けてください。そうすることで、CSSの読みやすさが向上します。
タイプセレクタに関するベストプラクティス
なるべくクラスセレクタを使用し、タイプセレクタの使用を避ける。Flexコントロールのデフォルトスタイルをオーバーライドするのではなく、カスタムクラスを定義するようにしてください。これに従うと、コントロールにstyleNameプロパティを設定することが必要になりますが、後で変更を加える場合の柔軟性が高まります。
クラスセレクタに関するベストプラクティス
これはコミュニティ全体で実践されているベストプラクティスなので、ぜひ守ってください。クラスセレクタ名にはアンダースコアを含めない。同じく、このベストプラクティスもコミュニティ全体で実践されています。ぜひ守ってください。クラスセレクタ名は特定の外観を表す言葉にしない。クラスセレクタには、外観ではなく機能に基づいた名前を付けるように工夫してください。黄色の外観を表すyellowTextという名前を付けた場合、後で警告テキストの色を変更する必要が生じると、名前が実態と合わないものになってしまいます。このような、外観を表す名前は望ましくありません。一貫した名前付け規則を守る。スタイルの名前には一貫性を持たせてください。コメントをソースコードの中に記述することは、コードの処理内容や存在理由を説明するために役立ちます。ASDocは、そうしたコメントを有効活用するための優れたツールです。コードベースに関する「生きた」ドキュメントを作成・管理することで、コード更新作業の円滑化やドキュメントの自動生成を実現できます。メモ:場合によっては、納期が厳しすぎてソフトウェア開発作業中に完全なコメントを書くのが不可能なこともあります。コメント作業を省略するかどうかは、実際のプロジェクトにおけるメリットとデメリットのバランスを考慮しつつ、状況に応じて判断してください。
コメント書式に関するベストプラクティス
コメントの書き方は、次に示すASDocコメントの標準書式に従う。スペースや行頭のアスタリスクを使ってコメントの読みやすさを向上する。ソースコードが乱雑にならないように、整然とコメントを記述します。コメントの書き方が整理されていると、他のデベロッパーがそのソースコードを扱う際に、解読や作業の負担が軽くなります。ASDocから生成されるドキュメントコメントのHTMLファイルを読みやすくするために、それらのタグを自由に使用できます。説明本文の冒頭には、説明内容を簡潔にまとめた文を置く。宣言されている項目を要領よく説明する完結した文を、ASDocコメントの説明本文の第1文として記述します。この文は、当該項目のクラスに関するASDoc HTMLページ上部の概要表に表示されます。
クラスのASDocコメントに関するベストプラクティス
有用なコメントを個々のクラスすべてに対して記述する。クラスに対するコメントは、該当するクラス宣言のすぐ上に書きます。内容にはコードの機能説明と、他のクラスとの関係についての注記を含めます。また、継承関係が存在する理由についても示します。ドキュメントに記載しないことが望ましいクラスに対しては、コメント内のどこかに@privateタグを指定します。メソッドに戻り値がある場合は、その型を@returnで示す。戻り値のあるメソッドに対するコメントでは、返される値の説明を@returnに記述します。他のクラスやパッケージに関連している項目のコメントでは、@seeタグを使ってそれらの関連を説明します。ASDocコメントの中では特殊文字を使用しない。UTF-8でエンコードされていない文字がコードに含まれていると、ASDocではエラーが発生します。コメントのテキストは、どの@タグよりも前に配置する。コメントのテキストを@タグよりも後に書くと、そのテキストは@タグの引数と見なされます。
変数のASDocコメントに関するベストプラクティス
変数の使い道を説明する。その変数がどのように使われるかに関する有用な情報をコメントに含めます。「何を」よりも「なぜ」について説明することが重要です。
メソッドおよびインターフェイスのASDocコメントに関するベストプラクティス
有用なコメントを個々のメソッドやインターフェイスすべてに対して記述する。メソッドに対するコメントは、該当するメソッド宣言のすぐ上に書きます。コメント内では、そのメソッドの目的と、実装に関する詳細情報があればそれらを説明します。何をするメソッドなのかをただ書くのではなく、役に立つ説明になるよう工夫してください。また、メソッドの戻り値と引数についても、必要に応じて意味を説明してください。
イベントのASDocコメントに関するベストプラクティス
イベントの種類を完全修飾クラスパスで示す。完全修飾クラスパスを使うと、そのイベントを完全に一意に特定でき、システム内のどこで定義されたイベントとも競合しません。例えば、アプリケーションにサードパーティ製のコードを含める必要がある場合、アプリケーション自体のコードを間違いなく一意に識別するために完全修飾クラスパスを使用します。Flexアプリケーションは複雑なシステムなので、入念な計画を立てることには多大なメリットがあります。
実績のある方法論に基づいて、手堅い構造を備えたアプリケーションを構築しましょう
ユースケースを作成する。アプリケーション内の目標やタスクごとに、「アクター」の立場から見たユースケースを定義します。多くの場合は、作成しているアプリケーションのユーザ像をアクターとして、ユーザが実行するさまざまな操作を中心にユースケースを作ります。その他、アプリケーション自体をアクターとする場合もあれば、別のアプリケーションや外部のシステム(Webサーバなど)をアクターと見なす場合もあります。UMLの利用を検討する。アプリケーションのメインクラス群とデータモデルをUML(Unified Modeling Language:統一モデリング言語)で記述することは、アプリケーションを構成するオブジェクト群の洗練度を高め、コード設計の見直しが必要となる可能性を小さくするために役立ちます。コード生成ツールの利用を検討する。0のソースコードを生成するツールが多数出回っています。場合によっては、そうしたツールを使って開発期間を短縮できます。デザインパターンの利用を検討する。フレームワークを使用することは、成功の可能性を高めるためにきわめて有効です。ソースコード量の多いアプリケーションにおいて特に効果的であるといえます。アプリケーション開発フレームワークの利用を検討する。Flexアプリケーションの開発にフレームワークを使うべきかどうかについては、賛否が分かれる部分があります。エンタープライズ規模の業務アプリケーションやチームでの開発については、フレームワークが適している可能性がより大きいといえます。筆者自身は、アプリケーション開発フレームワークの利用を勧めたいと考えています。その理由は、フレームワークによってコードベース全体に通用するアーキテクチャ的な共通言語ができ、また、アプリケーションの開発とスケーラビリティについての方向性が定まるからです。チームベースでの開発作業にはフレームワークを採用する。フレームワークは、チーム全体が協力して仕事を進めることを促進し、開発作業に重複が生じる可能性を低減する可能性があります。Flexで使用するために作られたアプリケーション開発フレームワークで、「マテ」と読みます。弱い結びつきを持ったコードベースを許容する控えめなフレームワークです。Flexアプリケーション開発の「事実上の標準」といえるフレームワークです。まだCairngormについて学んだことのない読者は、ぜひ詳しく調べてみてください。アドビのコンサルティング部門でも、開発作業にはCairngormが全面的に採用されています。0用のモデル/ビュー/コントローラ型アプリケーション開発フレームワークです。開発元のFuturescaleは、「PureMVCは、伝統的なモデル/ビュー/コントローラ型デザインメタパターンに基づくアプリケーション作成用の軽量フレームワークです。PureMVCフレームワークの主目的は非常に限定的です。すなわちそれは、アプリケーションのコーディングに関する作業をモデル/ビュー/コントローラの3層に分離することです」と説明しています。
その他のフレームワーク
以上の他にも、Flexでの開発や、もっと素朴な形でAS3を使う開発プロジェクトなどにも適用できるアプリケーション開発フレームワークが多数存在します。フレームワークの利用が適切でない場合を認識する。フレームワークは有用なものですが、あえて導入するほどではないと考えられる場合も少なくありません。
例えば、単身のデベロッパーが自分だけでアプリケーションを開発し、その後のメンテナンスに他人が関与することも一切ないとすると、フレームワークのメリットは得られにくいでしょう
また、きわめて簡単な開発案件(単なるバナー広告など)でもフレームワークの必要性は小さいといえます。データの処理量が限定的でイベントの発生も少ない、非常に単純なアプリケーションを開発するだけであれば、アプリケーション開発フレームワークによって提供される充実した機能セットは「宝の持ち腐れ」となる可能性が大です。Steven Webster氏によるこのブログ記事は、アプリケーション開発フレームワークの利用が適切な場合とそうでない場合について別の切り口から検討しており、参考になります。
単体テストの統合化
単体テストは、コードベースの品質を確保するための重要な作業です。テストケースを作成することがコードの信頼性と品質の向上につながり、テストを行うことがエラーの発見とデバッグ時間の短縮に役立ちます。ここでは、単体テストの実施に関するベストプラクティスを紹介します。メソッドをテストするのではなく、外部に対する挙動をテストする。プライベートメソッドをテストするコードは、いつも必要というわけではなく、場合に応じて必要性を評価すべきものです。常に作成する必要があるのは、オブジェクトのパブリックAPIをテストするコードです。プライベートメソッドは、パブリックAPIをサポートするためにクラス内で使われるため、外部から見える挙動の一部と考えることができます。「単純すぎるものは壊れようがない」の法則を適用する。テストは、多ければ多いほどよいというものではありません。例えば、コードが1行しかない単純なgetterメソッドのためにテストケースを作成するのは過剰であると考えられます。基本的なOOPベストプラクティスをテストケースにも適用する。本来のアプリケーションコードを書くときに使っているオブジェクト指向の手法は、テスト用のコードにも適用できます。
必要に応じてテストケースをリファクタリングし、共通的な機能を切り出してベースクラスを定義しましょう
テストメソッドには簡潔明瞭な名前を付ける。本来のアプリケーションコードベースと同様の名前付け規則をテストケースメソッド名にも適用し、漠然とした名前は避けるようにします。そうすれば、テストメソッドの関係や担当機能、目的などが、他のデベロッパーにもわかりやすくなります。テストケースメソッドのコードは単純にする。テストケース内で行う条件判断を増やさず、コードの単純さを保つよう留意してください。アサーションメソッド呼び出しの内部では、なるべく静的な値を使用する。これに従うと、テストケース内でエラーが発生する可能性を小さくし、テストコードを保守しやすく理解しやすいものにすることができます。テストコードのドキュメントをコメントに記述する。テストの対象と、そのテストを行う理由をコメントに記載します。また、何か特別な状況に関係するテストであれば、その条件のあらましを説明します。独立した単体テストを作成する。1つの単体テストでは、原則として1つのメソッドに関する1つの挙動だけをテストするようにします。アサーションは1つのテストケースにつき1回とする。個々のテストケースに複数のアサーションが含まれていると、パフォーマンスに問題が生じることがあります。また、先に実行されるアサーションに合格しないとその次のアサーションが実行されないことになるため、見落としが生じる可能性もあります。
Flex開発に関するベストプラクティスのまとめ
これらのプラクティスは、すべてのFlexアプリケーションに適用できます。ベストプラクティスを実践できているかどうか、もう一度確認してみてください。assetsディレクトリを作り、そこにアセットを置く。assetsディレクトリ内はサブディレクトリを作って整理する。SWFディレクトリを使用する。フォントはfontsディレクトリに置く。オーディオはaudioディレクトリに置く。ビデオはvideoディレクトリに置く。XMLディレクトリを使用する。パッケージ名に動詞、形容詞、副詞を使わない。パッケージ名は複数形にする。パッケージ名は、中のクラス群の特徴を表した名前にする。クラスを使ってOOPを積極的に実践する。クラス名には名詞を使用する。クラスの本体内で定義する実行可能コードの量は最小限にする。インスタンス変数と引数の名前を対応させる。クラスの作成時には伝統的・一般的な慣例に従う。クラス名の最後に、そのクラスの種類(フォーマッタ、バリデータ、イベント、エラーなど)を表す言葉を含める。クラス名にスキンの種類を含める。スーパークラス名にはなるべく「Base」を付ける。クラス名にスペースを含めない。メソッドとメソッドの間には空行を入れる。なるべくインターフェイスを実装する形でコーディングする。インターフェイス名は形容詞にする。意味があって内容のわかりやすい変数名を使用する。変数の宣言は1行につき1個にする。変数の宣言では、1つごとに空行を入れる。個々の変数ごとにASDoc形式のコメントを添える。変数に対して、強い型指定をいつも使用する。定数の名前は大文字にする。ストリング定数の名前と内容を一致させる。メソッド名には動詞を含める。1行に記述するステートメントは1つだけにする。クラス内のメソッドは機能別にまとめて記述する。個々のメソッドすべてにASDoc形式のコメントを付ける。戻り値の型を必ず指定する。void(値を返さない)や*(任意の型)の場合でもその旨を明示する。メソッドのシグネチャではアクセス修飾子を必ず使用する。メソッド引数の型を指定する。イベントハンドラの引数は「event」という名前にする。メソッド名と括弧の間はスペースを空けない。キーワードと括弧の間はスペースを空ける。コードブロックは、1レベルにつき4個のスペースでインデントする。クラス内のメソッド間に空行を入れる。コードが読みやすくなるようにスペースを挿入する。MXMLエレメントの属性を整理する。MXMLエレメントのID属性は最初の属性として記述する。関連する複数の属性を1行にまとめる。関連性に応じてMXMLエレメントの属性をグループ化する。メタタグは、マーク対象となるプロパティやメソッドの上に配置する。MXMLエレメント間に空行を入れて整理する。MXMLドキュメント内の構造を整理する。インラインCSSを使わない。CSSの記述量を最小限に、記述内容を簡潔に保つ。似た内容のスタイル定義をグループ化して配置する。スタイルにコメントを付ける。1行に記述するCSS宣言は1つだけにする。なるべくクラスセレクタを使用し、タイプセレクタの使用を避ける。クラスセレクタ名にはアンダースコアを含めない。クラスセレクタ名は特定の外観を表す言葉にしない。一貫した名前付け規則を守る。コメントの書き方はASDocコメントの標準書式に従う。スペースや行頭のアスタリスクを使ってコメントの読みやすさを向上する。説明本文の冒頭には、説明内容を簡潔にまとめた文を置く。有用なコメントを個々のクラスすべてに対して記述する。メソッドに戻り値がある場合は、その型を@returnで示す。ASDocコメントの中では特殊文字を使用しない。コメントのテキストは、どの@タグよりも前に配置する。変数の使い道を説明する。有用なコメントを個々のメソッドやインターフェイスすべてに対して記述する。イベントの種類を完全修飾クラスパスで示す。ユースケースを作成する。UMLの利用を検討する。コード生成ツールの利用を検討する。デザインパターンの利用を検討する。アプリケーション開発フレームワークの利用を検討する。チームベースでの開発作業にはフレームワークを採用する。フレームワークの利用が適切でない場合を認識する。メソッドをテストするのではなく、外部に対する挙動をテストする。「単純すぎるものは壊れようがない」の法則を適用する。基本的なOOPベストプラクティスをテストケースにも適用する。テストメソッドには簡潔明瞭な名前を付ける。テストケースメソッドのコードは単純にする。アサーションメソッド呼び出しの内部では、なるべく静的な値を使用する。テストコードのドキュメントをコメントに記述する。独立した単体テストを作成する。アサーションは1つのテストケースにつき1回とする。
次のステップ
この言葉は、この記事にも同じく当てはまるものだと筆者は考えています。「Flexをターゲットとするプロジェクトはそれぞれに異なります。したがって、ベストプラクティスは担当チームや実際のプロジェクトごとに異なります。小さなチームに通用するプロジェクトプラクティスでも大きなチームには通用しないことがあります。その逆の場合もあります。これは、過去3年間、様々なプロジェクトを観察した結果としてのFlexのベストプラクティスに関する私の見解です。
多くの点で、私の推奨事項は古典的なソフトウェア開発の原則であって、目新しいものではありません」
Flexに関するベストプラクティスをさらに詳しく学ぶには、次の資料を参照してください。
ご協力・謝辞
この記事への情報提供やレビューをしていただいた以下の方々に深く感謝します。各氏の協力がなかったとしたら、この記事が世に出ることはありませんでした。良書ですので、読者の皆さんも機会があれば一読してみてください。この記事は、次の各記事から得た着想と情報に基づき執筆しました。
著者について
Seanは、非常に評価の高いFlex開発者およびコンサルタントです。ActionScriptのプログラミング経験が豊かで、Flashプラットフォームの開発に5年以上、デスクトップおよびWebベースのアプリケーションのデザインと開発に10年以上の経験があります。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
階層型コンポーネント指向アーキテクチャについて
1-2 UIモデルへの適合度が高いPACアーキテクチャについて
印刷用に表示
PACアーキテクチャに代表される、階層構造をもつコンポーネントを組み合わせてアプリケーションを構成する、階層型コンポーネント指向アーキテクチャについて説明します。アーキテクチャパターン上のメリットに加え、開発の現場の観点も踏まえた実践的な説明を、サンプルコードとともに紹介します。この記事を効率良くフォローするには、次のソフトウェアやファイルが必要です。
事前に必要な知識
階層型コンポーネント指向アーキテクチャについて
しかし、クライアントサイド内も viewとlogicを分離し、サーバとのデータ交換部を分けることで開発生産性を向上させているプロジェクトが多いことと思います。as)が 非常に複雑になった経験がある開発者も多いことと思います。
以下のようなことがあてはまるのではないでしょうか
各画面(view) に対して1つだけ存在するControllerが、画面部品のクリック処理などのイベント処理、および サーバ呼び出し処理、データ反映処理など多種多様の役割を一手に引き受けている。共通の部品をカスタムコンポーネントとして作成した。大量のデータ取得中に少しずつ画面内のリストを更新しつつ、同時に他のことも行う場合の、サーバ呼び出し方法・サーバ応答処理が複雑になる。また、viewの更新処理がさまざまな箇所にちらばるため、画面全体の処理結合度を増してゆき、ある部位を切り出して共通化することが難しくなってしまいます。
著者について
専任の製品開発者ではなく、SI構築現場への技術支援、ツールの拡張支援の実施など、現場と開発を行き来することで、製品強化のアイディア獲得・サポート向上・横展開情報の提供に努めている。
お問い合わせ
不正コピー防止について
著作権と商標について*
当Webサイトをご利用のお客様は、利用条件およびプライバシーポリシー(2009年7月14日更新)にご同意いただいたものとみなされます。
使い勝手の良いシステムでオンラインでの注文数増加 | デベロッパーセンター
記事のアーカイブ*
ユーザグループの検索*
ユーザグループについて*
この記事に必要なもの
印刷用に表示
使い勝手の良いシステムでオンラインでの注文数増加
ひまわり証券Hitsデモ画面
ひまわり証券が提供するHits証券デリバティブは、株価指数先物取引・株価指数オプション取引・国債先物取引の取引システムです。ユーザーの使い勝手を考慮したユーザーインターフェースを実現するためにFlex2を採用しています。ユーザーが使用しているPC環境に依存せず、簡単かつスピーディーに取引を始めることができます。クラスメソッドは、ひまわり証券開発チームと共に、Flex2を用いたユーザーインターフェースの開発、リアルタイム時価情報配信の仕組みづくり、バックエンドシステムとの連携、カスタムコンポーネントの開発などを担当しました。