2010.11.01 Monday | 10:28

  Flash(Flex)の、ExternalInterface.objectID が、Google Chrome で取得できなかったのですが トラブル

昨日、2010年10月31日に対応してました。ほんと、びっくりしてしまいました。
もともと、Flash の問題として発生していたみたいなんですが、えらい迷惑です。

[FP-383] ExternalInterface.objectID がセットされていません。

昨日のテストでは、IE や Firefox では発生せずに、Google Chrome で起こります。
( Flash は、10,1,85,3 )

仕方無いので FlashVars を併用する事にしていますが、ここ最近の問題は
それだけでは無く、Firefox のみ、Flash(Flex) で呼び出した JavaScript
の関数内で、alert を実行するとフリーズするという現象です。

昨日、古いPC の Opera でも発生したので全ての処理で、

setTimeout("alert('文字列')", 10 );

に書き換える必要がありそうです。
// *********************************************************
// 汎用型 クリップボードコピー用 Flash ボタン
// *********************************************************

package {

import flash.display.*;
import flash.events.*;
import flash.external.*;
import flash.system.*;
import flash.net.*;

// 表示用クラス 【Sprite】を継承
public class flashButton extends Sprite {

	[Bindable]
	[Embed("button.gif")]
	private var imgButton:Class;
	private var strid:String;

	// *********************************************************
	// コンストラクタ
	// *********************************************************
	public function flashButton():void {

		// IE:Object の id,それ以外 Embed の name
		strid = ExternalInterface.objectID;
		if ( strid == null ) {
			strid = stage.loaderInfo.parameters.objid;
		}
		// Firebug 用
		// ExternalInterface.call("console.log", strid );

		// stage の設定
		stage.scaleMode = StageScaleMode.NO_SCALE;
		stage.align = StageAlign.TOP_LEFT;

		// マウスイベント取得用
		var eventArea:Sprite = new Sprite();
		eventArea.x = 0;
		eventArea.y = 0;
		eventArea.buttonMode = true;	// ハンドカーソル
		addChild(eventArea);

		var imgPath:String = ExternalInterface.call( "orgCodeInit", strid );

		if ( imgPath == null || imgPath == "" ) {
			// デフォルトのボタン画像
			var myImg:Bitmap = new imgButton();
			myImg.x = 0;
			myImg.y = 0;
			eventArea.addChild(myImg);
		}
		else {
			var loader:Loader = new Loader();
			loader.load(new URLRequest(imgPath));
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
				function ():void {
					eventArea.addChild( loader );
				}
			);
		}

		eventArea.addEventListener(MouseEvent.CLICK,
			function(ev:flash.events.MouseEvent):void {

				// Firebug 用
				// ExternalInterface.call("console.log", strid );

				var shift_flg:String;
				var ctrl_flg:String;

				if ( ev.shiftKey ) {
					shift_flg = "1";
				}
				else {
					shift_flg = "0";
				}
				if ( ev.ctrlKey ) {
					ctrl_flg = "1";
				}
				else {
					ctrl_flg = "0";
				}

				var str:String = 
					ExternalInterface.call(
						"orgCodeGetForClipcopy",
						strid,
						shift_flg,
						ctrl_flg
					);

				// 戻された文字列に何か入っていたら
				// クリップボードにコピーして再び呼び出す
				if ( str != null && str != "" ) {
					System.setClipboard(str);
					ExternalInterface.call("orgCodeClipcopyEnd" );
				}


			}
		);

	}

}}






2010.10.31 Sunday | 14:43

  アマゾンの Product Advertising API のカスタマーレビューの対応 プログラマ

Creview

変更内容はたいした事ではないので放っておいてましたが、さすがにそろそろ
しておかないと忘れてしまいます。そもそも、他人の文章をそのまま取ってこ
れていたのがおかしいのですが、リンクを使って IFRAME 化してもあまり格好
良く無いので、shadowbox を使って、かっこよくページ内にできるかぎり大き
く表示するようにしました。

でまあ、自分のブログで書いたレビューを個別に挿入できるようにして、
しばらく様子を見ようと思います。


※ 使い方は、上のサンプルのソースを見れば解ります


それと、忘れがちなので、API のキーの確認。

1) Product Advertising API タブ
2) ちょっとスクロールして、リソースの アカウント設定 
3) アクセスキー情報 で、API 用のログイン





2010.10.31 Sunday | 10:31

  ほぼ、全て JavaScript で作成される Twitter のページで目を引く3つのスクリプト記述 プログラマ

その1

たぶん、IE に対するブックマークレット用のプロテクトです。
外部ドメインを参照するようなブックマークレットが動かなくなります。

( IE 以外では試した事ありません。)
<script type="text/javascript" charset="utf-8">
  // this must be set absolutely before any other script on the app is loaded for IE7
  document.domain = 'twitter.com';
</script>


その2

Firebug が実行中で無い場合にエラーにならないようにしたもので、
ページのデバッグをいつでもできるようにする為の特殊オプションだと思います。

使い方としては、JavaScript から Firebug のコンソールに直接出力するような
テストをするのでしょうが、その処理を埋め込んだままでも運用できるようにする
為だと思われます。

Console API - FirebugWiki
<script>
  var TIME = +new Date;
  if (!window.console) {
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    window.console = {};
    for (var i = 0; i < names.length; ++i)
      window.console[ names[ i ] ] = function() {}
  }
</script>


その3

みたままですが、IE6 以前のブラウザの為のなんらかの処理ですが、
暇な時に見てみます。まだ IE6 動く環境あるので。
<!--[if lte IE 6]>
<script src="http://a0.twimg.com/a/1288470193/javascripts/phoenix/phxie6.bundle.js"></script>
<![endif]-->

IE 用条件コメント : バージョン ベクタ





2010.10.30 Saturday | 19:45

  PHP 5.3.0 以降の無名関数 プログラマ

借りている「さくらインターネット」ではまだ 5.3.0 は使えないみたいですが、
ローカルの 5.3.0 で動かしてみると気持ち良く動いたのです。

なんだか JavaScript 書いてるみたいで。

特に複雑な変数を明示する為の {} が役に立ってますねぇーー

5.3.0 での違いをはっきり認識したのは今回初めてだったのですが、
そんなにいちいちドキュメントに目を通すわけでも無く。ただ、必ず
さくらインターネットにアップして実行を確かめるのが常なので、
サーバーで動かなくって、「あれれれれ」

今後はもっと気を付けましょう。
<?
// **********************************************************
// n 桁の前ゼロ文字列を作成するには
// 以下で簡単に作成できますが、
// **********************************************************
$a = sprintf("%05d", 1);
print "$a<br>";

// **********************************************************
// どんな言語でもたぶんある関数(メソッド)を使って行うには
// **********************************************************

// 1) n 桁の 0 を目的の文字列の前に連結する

$a = "00000" . 1;

// 2) 全体の長さを取得する

$len = strlen($a);

// 3) 全体の長さ - 欲しい長さを開始位置とする

$start = $len - 5;

// 4) その位置から欲しい長さぶん切り取る

$x = substr( $a, $start, 5 );

print "$x<br>";

// **********************************************************
// PHP 5.3.0 より実行可能な無名関数
// **********************************************************
$f = function( $target, $n ) {

	$target = str_repeat("0",$n) . $target;
	$len = strlen($target);
	$start = $len - $n;
	$target = substr( $target, $start, $n );
	return $target;

};

print "{$f(1,5)}<br>";
print "{$f("AA",5)}<br>";
print "{$f("あA",5)}<br>";
print "{$f(1234,5)}<br>";
print "{$f(12345,5)}<br>";

?>

関連する記事

PHP : 前ゼロ文字列作成と右から必要な長さ文字列を取得する処理





2010.10.23 Saturday | 12:48

  Twitter の IE 用プロテクト? トラブル

英文コメントから、そうかもしれないと思われるのですが・・・

「アプリの他のどのスクリプトもIE7のためにロードされる前に、これは絶対にセットされなければなりません」

Firefox には効果無く、Google Chrome ではそもそもこの記述が無いです。

結論から言うと、これを実行している事によってある種のブックマークレットが
動かなくなります。セキュリティ設定を変更すれば解除されるかも知れませんが、
IE のセキュリティ設定は複雑なので、メリットもありません。

IE のセキュリティホールを利用されないようにする為の対処だと
思うのですが、まあ、この後のスクリプト処理も面白そうなので読んで
みたくはなってきました。
<script type="text/javascript" charset="utf-8">
  // this must be set absolutely before any other script on the app is loaded for IE7
  document.domain = 'twitter.com';
</script>






2010.10.23 Saturday | 12:19

  Flex4 SDK のダウンロード トラブル

Flex3 の SDK のダウンロードページが見れなくなっていましたが、
復活して、同様の Flex4 SDK のダウンロードページです。

Flex4sdk

Flex4 SDK ダウンロード(www.adobe.com) からダウンロードしたバージョンと一致している事を
確認しています。

その他の Flex 関連のリンクは、flex3 チュートリアル からどうぞ。




<< 2/29 >>