03-29-10

ActionScript3.0でローカルやサーバーの時間を取得する方法

ローカルの時間を取得する方法

この辺の感覚はAS1、2とあまりかわらないですね。

var myDate:Date = new Date();
trace(myDate.fullYear);
trace(myDate.month + 1);
trace(myDate.date);
var dayAry = ["日","月","火","水","木","金","土"];
trace(dayAry[myDate.day]);
trace(myDate.hours);
trace(myDate.minutes);
trace(myDate.seconds);
trace(myDate.milliseconds);

文字列を渡して時間を設定する方法

ローカルの時間だと、ユーザーのパソコンの時計にしまいますので、サーバーの時計等を取得して時計を表示させる場合は、下記のパターンのように、new Dateの引数にStringなどを入れることによって正しい時間を表示させることもできます。

var myDate:Date = new Date("Fri, 26 Mar 2010 06:35:19 +0900");
var myDate:Date = new Date("Sat Nov 30 01:20:00 GMT-0800 1974");
var myDate:Date = new Date(1974, 10, 30, 1, 20);

文字列から時間を再設定してから時を刻むサンプル

getTimer()はFlashPlayerが再生し始めた瞬間からの経過時間をミリ秒で取得できる関数です。1000=1秒です。Date.parseは時間をミリ秒単位で表示してくれる関数です。ミリ秒になった数字に1000を足していくこの方法だと簡単に時を刻むことができます。

trace(Date.parse(dateParsed));//1269552919000
var nowTime = Date.parse(dateParsed);

addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event):void {
	trace(nowTime+getTimer());
	trace(new Date(nowTime+getTimer()));
}

Event.ENTER_FRAMEを使わないサンプル

ENTER_FRAMEで実行させ続けると、どのタイミングで1秒変化したのか分かりにくくナンセンスなので、AS3から使えるようになったTimerクラスを使うと、1秒ごとにカウントしていく。というのが作れます。setIntervalは使いにくかったですからね。。。助かります。ボクはこの方法がベストだと思います。

var dateParsed:String = "Fri, 26 Mar 2010 06:35:19 +0900";
trace(Date.parse(dateParsed));//1269552919000
var nowTime = Date.parse(dateParsed);

var myTimer:Timer = new Timer(1000);
myTimer.addEventListener("timer", timerHandler);
myTimer.start();

function timerHandler(event:TimerEvent):void {
	trace(new Date(nowTime+=1000));
}

03-24-10

FlashPlayerは潜在的に危険な操作を停止しましたの回避策

ローカルでswf再生したとき、またはgetURLやnavigateToURLでページ遷移しようとしたときに、Adobe Flash Playerは潜在的に危険な操作を停止しました。というアラートがでたことあるかと思います。「Adobe Flash Playerは潜在的に危険な操作を停止しました」の回避策とグローバルセキュリティ設定の方法を紹介します。

グローバルセキュリティ設定方法

グローバルセキュリティ設定
Flash Playerヘルプ:グローバルセキュリティ設定パネル
http://www.macromedia.com/support/documentation/jp/flashplayer/help/settings_manager04.html
このページにあるFlash部分の「編集」と書かれているプルダウンメニューの「追加」をクリックして、アラートを出しているswfファイル直接設定するか、フォルダー丸ごと設定するかのどちらかが選べます。すると、「これらのファイルとフォルダを常に信頼する」項目に追加されたと思います。設定はこれで終わりです。ボクはCドライブ全部にかけてます。あまり良くないかもしれませんけどね・・・汗

「Adobe Flash Playerは潜在的に危険な操作を停止しました。」のアラートは何を訴えているのか

簡単に言うと、ローカルで再生されるswfファイルが、別のページへ遷移するけどいいですか?と聞いてくれてるわけですね。もしそのswfファイルが誰が作ったかわからず、悪意があるswfファイル開いた瞬間にウィルスに感染してしまう。ってことになりえるかもしれません。それを未然に防ぐために、そのswfファイルは信頼できるかどうか。前項のグローバルセキュリティ設定パネルで設定して許可をしたということです。
このアラートが出る条件は以下のときに出ると思います。

・getURLやnavigateToURLなどのページ遷移する関数が書かれているswfファイルを、そのままダブルクリックで再生する
「Adobe Flash Playerは潜在的に危険な操作を停止しました。」のアラート画面
・htmlファイルにswfを貼り付けたファイルを、ローカルからブラウザで開く
「Adobe Flash Playerは潜在的に危険な操作を停止しました。」のアラート画面
・ボタンアクションなどでページ遷移しようとした瞬間
Flash Debug Playerが出したエラーログ画面

▼Flash Debug Playerが出したエラーログ

SecurityError: Error #2028: ローカルファイルシステムの SWF ファイル file://C:\hoge.swf はインターネット URL http://hoge.com/ にアクセスできません。
	at global/flash.net::navigateToURL()
	at MethodInfo-404()

▼ActionScript 3.0 コンポーネントリファレンスガイド:ランタイムエラー一覧

http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/runtimeErrors.html#2028

getURLやnavigateToURLでページ遷移しない!ページに飛ばない!と言われたら

そもそもこのアラートが出るだけでもマシかもしれません。アラート自体がでない可能性もあるので、クライアントさんとかに確認してもらってる時に「ページ飛ばないよ」と言われたら、このアラートの可能性が高いと思います。確認出しの方法はいくつかあると思いますが、zipで圧縮してメールで送る場合、ローカルで再生される可能性があるので回避したい。でも、わざわざこの設定をしてもらうのもなんか悪い気がする。。。手っ取り早いのはサーバーにアップして、httpアドレスを直接ブラウザを介して確認してもらいたいところですが、公開してはいけない繊細なコンテンツの場合だと、グローバルセキュリティ設定をしてもらうしかないですね。

03-23-10

Photoshopで編集した画像をFlashに読み込むと色が変化する

Flashに画像を配置した時に、さっきまで見ていた色と違うということがありました。全体的に赤みを帯びていたり、コントラストが強くなってたり。。。原因を調べてみると、画像を編集していたPhotoshopにあることに気がつきました。

プルダウンメニューの「ビュー」⇒「色の校正」にチェックが入ってて、上の「校正設定」が「Windows」以外に選択されてました。画像の見え方は、OSの色の解釈や、画面を見ているモニターの性能によって若干のブレがあるため、この項目で確認したりするためのもので、Flashにインポートするときはjpgかgifに書き出していたため、若干のブレがあり、色が変化しているように見えてたんだとおもいます。ショートカットがCtrl+Yですからね。1つ進むのリドゥと間違えて押してしまったっぽいです笑

Photoshopで編集していた画像をFlashに読み込んだときに、色が若干変化していた時は、ここのチェックをみて、普段作業をするぶんに関しては、チェックを外していたほうがいいかもしれません。

03-22-10

ActionScript3.0でgetURLにかわるnavigateToURL

古のFlashからあるgetURL関数がAS3でなくなっていることに戸惑われた方もいらっしゃるのではないでしょうか。AS3の仕様変更により、URLRequestクラスの変数に、ページ遷移する先のURLテキストを持たせて、navigateToURL関数の引数に渡してあげるとページ遷移します。

var url:URLRequest = new URLRequest("http://creator.cotapon.org/");
navigateToURL(url, "_self");

ボタンで実行する時はリスナー登録したイベントに対して書けば動作します。一回覚えてしまえば簡単ですねー。

btn.addEventListener(MouseEvent.MOUSE_DOWN, btnMouseDown);
function btnMouseDown(e:MouseEvent):void {
	var url:URLRequest = new URLRequest("http://event.rakuten.co.jp/food/bussan/shop/" );
	navigateToURL(url, "_self");
}

03-03-10

IE6はもういらない!撲滅キャンペーンサイト

IE6 No More

「あなたは旧式ブラウザをご利用中です」というアラートが出てますか?割と強引な感じがしますが、最近YouTubeでも同じようなアラートが古いブラウザでアクセスした時に出るようになってます。

WebサイトホスティングサービスのWeeblyがキャンペーンを立ち上げ、その理由としてはIE6や古いブラウザに対応するのがサービス運用のなかで負担になるためと説明しているそうです。このブログのテンプレートもIE6でみると崩れるので、かといってCSSハックがボクにとっては八苦なので、、、このページだけアラートを出しておきます。。^-^;

IE6 No More
http://www.ie6nomore.com/
ソースコードページ
http://www.ie6nomore.com/code-samples.html

03-03-10

GoogleChromeがWebブラウザシェアを着実に増やしていってる

順位 ブラウザ名 シェア(%) 前月比(ポイント)
1 Internet Explorer 62.18 -0.51
2 Firefox 24.41 -0.2
3 Google Chrome 5.20 0.57
4 Safari 4.51 0.05
5 Opera 2.38 -0.02

2010年1月の世界Webブラウザランキングが米調査会社Net Applicationsの調べで分かったそうです。Firefoxがおちてきてるのは、キラーアドオンがChrome対応してきているからでしょうねー。日本だけでの数字ではないので参考になるかどうかはわかりませんが、着実にGoogleChromeがシェアを伸ばしているのが分かります。

youtubeがIE6や古いバージョンのWebブラウザをサポート外にし始め、IE6撲滅キャンペーンページまでできちゃってます。ボクら作り手側としてはIE6にあわせるのは手間がかかってしまうので、できる限りなくなってほしいのですが、このままIE6が減っていくのはまだまだ時間がかかると思います。。。しかし、こういったWebブラウザのシェア表は、リッチコンテンツを作る上でのユーザー属性とかの割合がザックリ想像できると思いますので、見守り続けたいと思います。

2010年1月の世界Webブラウザランキング

03-02-10

FlashLiteで商品検索コンテンツをリリースしました

楽天ウェブサービスの商品検索APIを使って、FlashLiteで商品検索コンテンツを作ってみました。気軽に商品検索をできるように、ブックマークして使ってくださいネ!
FlashLite1.1で作ったので、大半の携帯端末はカバーできていると思います。FlashLite1.1に合わせてAPIを使ったコンテンツってどうやって作ったと思いますか?ふふーん♪ 結構大変でした。。^-^;

このコンテンツの具体的な作り方は後日公開しますのでお待ちくださいー!

03-01-10

crossdomain.xmlをルート以外の設置からでも認識させる方法

ActionScriptでクロスドメインを認識させる方法は、

Security.loadPolicyFile("http://mysite.com/crossdomain.xml");

↑たぶん、このようにスクリプトを書きます。

Security.loadPolicyFile("http://mysite.com/sitemap/crossdomain.xml");

↑状況によってはドキュメントルート直下に「crossdomain.xml」置けないときもあると思います。

ボクは事情により後者で設定してFlashを再生させると、、

Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害
(※これはFlash Debug Playerからのアラートです)

出た!出たよ!!出てしまったよ!!!(TOT)
そこでFlashTracerでログを追跡してどんなエラーが出ているかを調べてみました。
ここでクロスドメインの構造をサクッと説明しますが、ドキュメントルート以外のクロスドメインの方法は更に下のほうに書きます。

crossdomain.xmlの設置と記述方法

Flashのクロスドメイン問題はいにしえからある問題です。そもそもクロスドメインというのは、swfファイルを貼り付けているHTMLをからみて、外部ファイルをロードするときに、そのファイルが置いてある場所は、HTMLファイルとは違うドメインという状態のことを指します。つまり、FlashPlayerは他人のドメインを攻撃してしまわないようにしているわけです。でも、世の中には写真共有サービスがあったりRSSコンテンツがあったりAPIなんかもあります。そういった場合は、どこからでも情報を取得してもいいですよ。といった感じに許可をすることができます。その許可をするための設定ファイルが、「crossdomain.xml」にあたります。

たとえば、自分のサイト「http://mysite.com」というサイトに表示させるFlashコンテンツが「http://hoge.com」というサイトにあるRSSをロードするとします。この場合、クロスしてますよね。hoge.comサイトは、mysite.comがRSSをロードしてもいいよ!と許可をする為に、「crossdomain.xml」をドキュメントルートの場所においてあげます。アドレスは

「http://hoge.com/crossdomain.xml

このようになります。実際に、この「crossdomain.xml」の中に何が書かれているか、

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="http://mysite.com"/>
</cross-domain-policy>

4行目にある記述で「http://mysite.com」と書いていると、「http://hoge.com」のRSSは「http://mysite.com」からのみロードができる。という事になります。

例えば、「http://mysite.com」を含むサブドメインにも許可をする場合は、「*.mysite.com」と書きます。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.mysite.com"/>
</cross-domain-policy>

全てのサイトからのアクセスを許可をする場合は、「*」だけを書きます。この設定はセキュリティに詳しい方に一回相談したほうがいいかもしれません。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

ココからFlashのはなし

実際にFlashで設定するSecurityメソッドは、「crossdomain.xml」がドキュメントルートに設置されてて、かつ、その内容の設定で問題なければ、わざわざクロスドメインポリシーファイルをロードする必要はありません。

Security.loadPolicyFile("http://hoge.com/crossdomain.xml");

↑このようにドキュメントルートにある「crossdomain.xml」をロードする記述はする必要がない。ということです。

んじゃ、どういったときにSecurityメソッドを使って「crossdomain.xml」をロードするのかというと、ドキュメントルートとは違う階層にある「crossdomain.xml」ファイルをロードするときに使います。例えば、ドキュメントルートであるhtdocsに、サブドメインごとにディレクトリを分けているとします。「content1」というディレクトリには外部からアクセスして欲しくないけど、「content2」というディレクトリにあるファイルは別のドメインからアクセス可能とするときに、「content2」にクロスドメインポリシーファイルを設置します。その時に、Flash側で書くスクリプトは、

Security.loadPolicyFile("http://hoge.com/content2/crossdomain.xml");

↑と書いて、ポリシーファイルをロードさせると、Flashは「content2」以下にあるコンテンツを表示させることができます。

FlashPlayer10からの仕様変更

前述のように、ドキュメントルートとは違う場所の「crossdomain.xml」を取得できてましたが、FlashPlayerのバージョン10からクロスドメインの設定ルールに少し変更が加えられ、かならずドキュメントルートの「crossdomain.xml」を最初に参照する使用に変更されました。もしドキュメントルートに「crossdomain.xml」がない場合、たとえ「http://hoge.com/content2/crossdomain.xml」ここの場所に設定ファイルを置いていても「Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害」といったエラーが出てしまいます。

エラー : http://hoge.com/content2/rss.xml のリソースに対する、http://mysite.com/content.swf の要求者からの要求は、ポリシーファイルのアクセス権がないため拒否されました。
※FlashDebugPlayerのログ例

ドキュメントルートにメタポリシーファイルを設定する

「crossdomain.xml」は、セキュリティポリシーを設定する記述のほかに、セキュリティポリシー設定ファイルを管理するメタポリシーとしても使うことができます。つまり、ポリシーファイルのポリシーファイルということですね。これをドキュメントルートに設定すれば、FlashPlayer10以上でも、ドキュメントルート以外の「crossdomain.xml」をロードすることができます。その中の記述に、site-controlタグを記述し、permitted-cross-domain-policiesをallにすると、全てのディレクトリーの「crossdomain.xml」をロードすることを許可することを意味します。

<!--ドキュメントルートに設定するメタポリシーファイル例-->
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
</cross-domain-policy>
<!--ルートから「content2」ディレクトリの「crossdomain.xml」の記述例-->
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.mysite.com"/>
<!--*.mysite.comからの通信を許可をする-->
</cross-domain-policy>

ActionScriptには下記とかく。

Security.loadPolicyFile("http://hoge.com/content2/crossdomain.xml");

クロスドメインでのエラーが出た場合の確認方法

一番単純なのは、外部画像やXMLなど、別ドメインから取得する場合、そのドメインのルートに「crossdomain.xml」があるかどうか確認してください。youtubeのクロスドメインは「http://www.youtube.com/crossdomain.xml」こうなります。ページが真っ白でしたらブラウザの「ソースを見る」で記述が確認できると思います。Flashコンテンツを制作しているなかで、もし、クロスドメイン設定ファイルがなければサーバーの管理者に問い合わせて、設置してもらうようにお願いする必要があります。詳しい「crossdomain.xml」の説明に関してはAdobeのデベロッパーセンターページに詳しく載ってます。
http://www.adobe.com/jp/devnet/articles/crossdomain_policy_file_spec.html