性懲りも無くOperaとちず丸の件(対策編)

このところ、SymantecNorton Internet Security のサポート担当者とメールでやり取りをしている。
正確に言うと Symantec社の人では無くてサポート業務を請け負っている下請け会社の人らしい。
うわさに聞いてはいたが、担当者の氏名からすぐに出身国の国名が思い浮かんでくる氏名がメールに担当者名として書かれている。
やはり人件費の関係でそういう事になっているのだろうか。
どこかの日本語学校を卒業した人なのか?、はたまた、現在日本語学校に在籍しているアルバイターなのか?詳しい事は判らないが、こちらが日本語で書いて送った内容に対して日本語で返事が返って来るのだから、多少は日本語を知っている人が担当者である事は間違いが無い。


しかし、返信されてくる文章は完全に定型文をコピペしたものでしか無いし、こちらの文章の全体に目を通しているとは思えない程にピントを外している。
当方は Opera 9.0 の話をしているのに IE についての対処法を書いて寄こしてみたり、念を押して Opera だと言ってやると今度は Opera が全くインターネットに接続できない場合の対処法を返信してきたりする。
こんな”のらりくらり”とした事では、そのうち1年たってサポートの有効期限が過ぎてしまいそうだ。
それが向こうの作戦かも知れないが…、
あるいは、こちらからのサポート要求を諦めさせようとしているのだろうか?


Norton Internet Security を使うのをやめる事も1つの選択肢かも知れないし、
Opera 9.0 を使う事をやめて Opera 8.54 や Firefox を使い分ける事も選択肢かも知れない。


しかし、多少の不満はあるものの NIS にしても Opera 9.0 にしても捨てがたい魅力がある。


だから、 NISOpera 9 とが共存できる未来を信じて前進してみたい。


こんなに前置きが長くなってしまうと、この後↓の内容の希薄さがお恥ずかしい。




問題となっている現象は2006-07-08性懲りも無くOperaとちず丸の件(続編)で述べたように、外部スクリプトが正しく読み込まれていない事だった。
だから、外部スクリプトを確実に読み込んでキャッシュに放り込んでやれば、「ちず丸」を表示できるかも知れない。
と考えた対策がこちら↓。

(対策1)「セッション」を利用して外部スクリプトを手動で読む方法

ちず丸」は、↓の13個の外部JavaScriptを必要としている。
http://www.chizumaru.com/czm/LibCrossBrowser.js
http://www.chizumaru.com/czm/EventHandler.js
http://www.chizumaru.com/czm/Slider.js
http://www.chizumaru.com/czm/sliderscale.js
http://www.chizumaru.com/czm/biyobiyo.js
http://www.chizumaru.com/czm/Cookie.js
http://www.chizumaru.com/cz2004general.js
http://www.chizumaru.com/czHeaderMenu.js
http://www.chizumaru.com/czm/czMap.js
http://www.chizumaru.com/czm/czMapMenu.js
http://www.chizumaru.com/czm/czMapControl.js
http://www.chizumaru.com/czm/czMapDisplay.js
http://www.chizumaru.com/czm/czMapIndex.js
↑を通常のWEBページと同様に扱って、ひとまとめにして、オペラの機能である「セッション」として登録して置いて、「ちず丸」を表示する直前にこの「セッション」を読み込んでしまえばよい。


実際に実験すると NIS2006 を「無効」にしなくても「ちず丸」を表示できる。
つまり、パーソナルファイアーウォールの保護の下にセキュアなインターネットを楽しむ事が出来る。


また、「はてなマップ」の場合には、↓をセッションに登録すればよい。
http://maps.google.com/maps?hl=ja&file=api&v=1&datum=wgs84&key=ABQIAAAA3aeYPTw0AFDdSYtyw0ChLxTWCtbCIKU4E61Fef5hZRg8_zsMfxTdEhzAXetW9YVIQML7iD0qB7O4yw
http://maps.google.com/maps?hl=ja&file=api&v=2&datum=wgs84&key=ABQIAAAA3aeYPTw0AFDdSYtyw0ChLxTWCtbCIKU4E61Fef5hZRg8_zsMfxTdEhzAXetW9YVIQML7iD0qB7O4yw
http://map.hatena.ne.jp/js/prototype-1.4.0.11.js
http://map.hatena.ne.jp/js/map-2.0.js
http://map.hatena.ne.jp/js/page-2.0.js
http://map.hatena.ne.jp/js/Jemplate.js
http://map.hatena.ne.jp/js/jemplate/map.js




しかし、この方法では事前調査・事前準備がシンドイ。
しかも、表示に問題のあるサイトを見つけたら一々この調査・準備をしなければならない。


で事前調査・事前準備を自動化したのが↓こちら。

(対策2) 「user.js」 を利用して外部スクリプトを読んで手動で確認する方法

オペラの 「user.js」 には、外部スクリプトを読むイベントを捕らえる機能がある。
この機能を利用するとオペラブラウザが外部スクリプトを読む直前に確実に読んでキャッシュに放り込む事が出来る。
↓の user.js では、このイベントを捕らえて、別ウィンドウに外部スクリプトを読み込んでいる。


loadAllExtJs_NIS2006_user.js (追記:後述の新版と入れ替えました)

/*	チュートリアルのマネッコなダサイスクリプト(緊急避難的措置って事で勘弁ネ!)
//	http://www.opera.com/support/tutorials/userjs/examples/#loadingscripts
*/
// ==UserScript==
// @name loadAllExtJs_NIS2006_user
// @author borbis
// @namespace http://d.hatena.ne.jp/borbis/
// @version 0.01.05
// ==/UserScript==


if(  window.location.href.match(/^http:..www.chizumaru.com\/czm\/main.aspx/)	// ちず丸PC
  || window.location.href.match(/^http:..sp.chizumaru.com\/dbh\/willcom2\//)	// ちず丸PC for WILLCOM
  || window.location.href.match(/^http:..ask.jp\/local\//)			// Ask.jp ジモナビβ
  || window.location.href.match(/^http:..www.mapion.co.jp\/c\/f/)		// Mapion
  || window.location.href.match(/^http:..beta.mapion.co.jp\/fs\//)		// Mapion のスクロール地図(ベータ版)
  || window.location.href.match(/^http:..map.yahoo.co.jp\/beta\/index.htm/)	// Yahoo!地図情報 - スクロール地図(ベータ版)
  || window.location.href.match(/^http:..map.goo.ne.jp\/navi\/map.php/)		// goo ラボ エリア情報検索実験
  || window.location.href.match(/^http:..map.goo.ne.jp\/map.php/)		// goo 地図 のスクロール地図
  || window.location.href.match(/^http:..www.mapfan.com\//)			// MapFan Web
  || window.location.href.match(/^http:..map.livedoor.com\/map/)		// livedoor 地図情報
  || window.location.href.match(/^http:..www.navitime.co.jp\//)			// NAVITIME
  || window.location.href.match(/^http:..walk.eznavi.jp\/map\//)		// EZナビウォーク
  || window.location.href.match(/^http:..eznavi.duogate.jp\/map\//)		// DUOGATE デュオゲート
  || window.location.href.match(/^http:..map.hatena.ne.jp/)			// はてなマップ
  || window.location.href.match(/^http:..gis01.city.fujisawa.kanagawa.jp\//)	// ふじさわ電縁マップ
  ) {
	window.opera.addEventListener(
		'BeforeExternalScript',
		function(e){
			var srcurl = e.element.getAttribute('src');
			var w = window.open(srcurl,srcurl);
			for ( ; w.closed==false ; ) ;
		},
		false
	);
}


↑このスクリプトが実行されると自動的に(実際の感覚としては「突如として」)別ウィンドウが開いて外部スクリプトのソースが表示される。
利用者は、この外部スクリプトの読み込み完了を目視で確認したら、この自動的に開いたウィンドウを「手動」で閉じる必要がある。
そうしないと、先に進まない。
なんとも、お恥ずかしいスペックで御座いますです。 orz




でも、これで、ファイアーウォールを無効にせずにスクロール地図を表示できる事が確認できた。




ここまでやって来てみると、どうだろう、


NISは重い」って話はよく聞くけれど、


確かに NISを「無効」にして「ちず丸」を表示させると正常に表示出来て待ち時間も短い様な気がする。(プラシーボ?)


オイオイ!。ってぇー事は、 " Time Out " で外部スクリプトの読み込みに失敗してただけなのか?
だとすると、タイムアウトの判定を下していたのは、誰なの?


Norton さん?、それとも、 Opera さん?

追記

実は「はてなRSS」に於いても「もっと読む」ボタンが機能しない事がチョクチョクあって、面白い事に、ある時は動くけれど、またある時は動かないって云う状態を行ったり来たりしていました。
で、案の定「もっと読む」ボタンが機能しない時にかぎって「エラーコンソール」に未定義エラーが出てきます。
その反対に「もっと読む」が動く時には、Proxomitron のログに

X-Requested-With: XMLHttpRequest

なんて文字が現れて来ます。
どうやらスクロール地図と同じ様に Ajax で動いている様です。
で、
user.js に↓を追加してやると確実に「もっと読む」が動くようになります。

  || window.location.href.match(/^http:..r.hatena.ne.jp\//)			// はてなRSS







「ふむふむ、 Ajax の外部JavaScript を読み込む時に Time Out が発生している可能性が有る」
と思えて来ます。
Ajax と言えば、 JavaScript のオンパレードで当然ファイルサイズも大きいに違いない。」
と考えて「はてなRSS」で読み込みに失敗したファイルのサイズを見てみると、52KB です。
通常のページでの外部スクリプトは、せいぜい数KBですから、1桁サイズが大きい事が判ります。


今度は「ちず丸」についてサイズを見てみると最大でも22KBですが10KBを超えているファイルが4つも有ります。それに地図の画像データと一緒に読み込んでいるとすると Time Out が起きるかも知れない。
ちょっと手前勝手な発想かも?




ただ、ここで疑問なのは Ajax の本家本元の Google Mapshttp://maps.google.com/ ) の場合、1つしか外部ファイルを使っていないものの、そのサイズは150KBを超えている。それなのに外部スクリプトの読み込みに失敗した事は、一度も経験していない(と思う)。


外部スクリプトを1個にまとめてしまう事が問題の発生を減らす事に寄与しているのか?
或いは、本家本元のサイトだからこそ、他のソフトから特別扱いを受けているのか?




まあ結局、門外漢のド素人には、分かるはずも無いって事なんですが、
Ajax外部JavaScript
の場合に障害が発生して困って居りますって言って置きたい。

追記

相手側のサイトが模様替えをしたからなのか「地図検索のお手伝いをするブックマークレット」の一部の機能で文字化けしていたので、ヌルコムアーカイブス・デジタル制作室で公開している Escape Codec Library を外部スクリプトとして組み込んでみたら私の Opera 9.01 は読み込んでくれなかった。
サイズが22KBと、ちょっと大きめなのでダメらしい。


訂正すると、 (Ajax 等の)外部JavaScript で問題が発生している。って事。


ところで、このブックマークレットの最大のユーザーは、たぶん”私”なので、外部をやめて内部に取込む事にした。

追記

どうやら、この NIS2006 と Opera9 との問題は、私の PC だけの問題だって事に落ち着きそうな感じ。
オミトロンが間に入ってる時は、多少再現性が有るらしいのだが、私の場合はオミトロンの有無は無関係に起きている問題なので、どうも他所のPCとは違う状況っぽい)

ユーザJSを↓こんなふうに改良する事でかなり普通っぽく使えるようになったので、これで我慢かも。
loadAllExtJs_NIS2006_user.js

/*	チュートリアルのマネッコなダサイスクリプト(緊急避難的措置って事で勘弁ネ!)
//	http://www.opera.com/support/tutorials/userjs/examples/#loadingscripts
*/
// ==UserScript==
// @name loadAllExtJs_NIS2006_user
// @author borbis
// @namespace http://d.hatena.ne.jp/borbis/
// @version 0.02.03
// ==/UserScript==

	window.opera.addEventListener(
		'BeforeExternalScript',
		function(e){
			var srcurl = e.element.getAttribute('src');
			var srchost = srcurl.match(/^http:\/\//i)?srcurl.split('\/')[2]:location.hostname;
			if( srchost == location.hostname ){
				var oXH=new XMLHttpRequest();
				oXH.open("GET",srcurl,false);
				oXH.send('');
			}else{
				var w = window.open(srcurl,srcurl);
				for ( ; w.closed==false ; ) ;
			}
		},
		false
	);

クロスドメインの壁を打ち破れる程のスキルは無いのでこれでしばらく使ってみるつもり。