Opera Mobile にも優しく はてなアンテナをまとめて手動更新する UserJS

以前にも同じようなエントリーをあげていましたが、

あいも変わらず、アンテナを手動更新する話題です。

2006-05-04の当時は はてなアンテナ のサーバーが瀕死の状態であったけれども最近はかなり安定している気がするので今回のエントリーも"有り"かなぁ?と………。*1

今回の UserJS も アンテナ手動更新リンク - はてなグリースモンキー にで紹介されている Firefox用のGreasemonkeyスクリプト HatenaAntennaManualUpdate.user.js にしょうしょう手を加えたものです って言うか、 2006-05-04 のエントリーにあげた UserJS を改良したものです。

どの点を「改良」したかというと、

  1. はてな純正のスクリプトが作る「更新」のリンクのほかに、アンテナページの左上隅*2に「一括更新」のリンクも作ります。この「一括更新」のリンクをクリックすると当該ページ内に登録されているアンテナの全てをまとめて"手動更新"チェックします。この更新チェック結果は別ウィンドウ(タブ)に表示されます。
  2. 2006-05-04 のエントリーに載せていたブックマークレットを実行した場合は、個々の更新チェックをそれぞれ IFRAME を作って行っていたのでブラウザが大量のメモリーを消費していたので Opera Mobile は OS を巻き込んでフリーズしてしまいました。私の初代W-ZERO3では、アンテナページに30個以上のアンテナが登録されていると確実にフリーズしていました。しかし、今回のバージョンでは200個くらいのアンテナが登録されていてもメモリーを食べ尽くすことは無くなりました。
↓こちらが、今回の UserJS
http://borbis.web.fc2.com/hatena/HatenaAntennaManualUpdate.user.js

// Copyright (C) 2005, hatena.
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// ==UserScript==
// @name           Hatena Antenna ManualUpdateByBorbis
// @namespace      http://www.hatena.ne.jp
// @include        http://a.hatena.ne.jp/*
// ==/UserScript==

(function() {
		var uT = new Array();
		var uTcnt=0;

	function createUpdateLink(url) {
		var text = unescape("%u66F4%u65B0");
		var aTag = document.createElement("a");
		aTag.style.fontSize = "9pt";
		aTag.style.fontWeight = "normal";
		if (!url) {
			text = unescape("%u4E00%u62EC") + text;
			var S=document.createElement('script');
			S.appendChild(document.createTextNode("<!-- \n"));
			S.appendChild(document.createTextNode("var ForceUpHTML='"+escape(createForceUpHTML())+"';"));
			S.appendChild(document.createTextNode("// -->\n"));
			document.body.appendChild(S);
			aTag.href = "javascript:(function(){var W=window.open();W.document.write(unescape(ForceUpHTML));W.document.close();})();";
		} else {
			aTag.href = "http://api.a.hatena.ne.jp/check?robots=1&url=" + encodeURIComponent(url);
		}
		aTag.appendChild(document.createTextNode(text));
		return aTag;
	}
	
	var pageName = location.pathname.split("/")[2];
	if (! (pageName=="" || pageName=="simple" || pageName=="detail" || pageName=="image"))
		return;
	if (! ( document.getElementById("hatena-antenna-normal") || document.getElementById("hatena-antenna-simple") || document.getElementById("hatena-antenna-detail") || document.getElementById("hatena-antenna-image") ))
		return;

	var liTags = document.getElementsByTagName("li");
	for (var i=0; i<liTags.length; i++) {
		var li = liTags[i];
		if (li.firstChild.nodeName.toLowerCase()=="script") continue;
		for (var n=1; n<li.childNodes.length ; n++) {
			if (li.childNodes[n].nodeName.toLowerCase()=="a") {
				var url = li.childNodes[n].href;
				if (url.match(/^http:\/\/a.hatena.ne.jp\/include\?/)) {
					var checkurl=url.replace(/^http:\/\/a.hatena.ne.jp\/include\?(.*)$/,"$1");
					if (checkurl) { 
						if (pageName=="" || pageName=="detail") {
							var pTag = li.getElementsByTagName("p")[0];
							li.insertBefore(createUpdateLink(checkurl), pTag);
						} else {
							li.appendChild(createUpdateLink(checkurl));
						}
						uT[uTcnt++]=checkurl;
						break;
					}
				}
			}
		}
	}
	if (uTcnt==0) return;
	document.body.insertBefore(document.createElement("hr"),document.body.firstChild);
	document.body.insertBefore(createUpdateLink(),document.body.firstChild);


	function createForceUpHTML() {
		var LiteralHtmHead=[
			'<HTML><HEAD>',
			'<style type="text/css"><!--',
			'.diff {background-color: #E5EBFF; margin:1em; padding: 4px 4px 4px 4px;}',
			'--></style>',
			'<SCRIPT><!--',
			'var uT = ['
		];
		var LiteralHtmBody=[
			'];',
			'var uTcnt;',
			'var Timer_ID;',
			'function checkThis(url){',
			'	var ol=document.getElementsByTagName("ol")[0];',
			'	var li=ol.appendChild(document.createElement("li"));',
			'	var span=li.appendChild(document.createElement("span"));',
			'	span.appendChild(document.createTextNode(url));',
			'	var pMessage=li.appendChild(document.createElement("p"));',
			'	var io = new XMLHttpRequest();',
			'	io.open("GET","/check?robots=1&fixpage=1&url="+encodeURIComponent(url),true);',
			'	io.onload = function(){',
			'		function rDel(inp,rstr){',
			'			var re=new RegExp(rstr,"i");',
			'			var ro=re.exec(inp);',
			'			return (ro)?(RegExp.leftContext+RegExp.rightContext):inp;',
			'		}',
			'		var RE=new RegExp("<table class=.table-config.>(.|\\n|\\r)*?<\\/table>","i");',
			'		var RO=RE.exec(io.responseText);',
			'		if(RO){',
			'			var str=rDel(RO[0],"<br\\/?>"+unescape("%u66F4%u65B0%u5185%u5BB9%u306E%u8868%u793A%uFF1A%u8A31%u53EF"));',
			'			str=rDel(str,"<br\\/?>"+unescape("%u30ED%u30DC%u30C3%u30C8%uFF1A%u8A31%u53EF"));',
			'			var rerep=new RegExp("("+unescape("%u5185%u5BB9%u304C%u66F4%u65B0%u3055%u308C%u307E%u3057%u305F%u3002")+")","i");',
			'			pMessage.innerHTML=str.replace(rerep,"<FONT size=+1 color=red><B>$1</B></FONT>");',
			'		}else{',
			'			pMessage.innerHTML="<FONT color=red><B>Server Error</B></FONT>";',
			'		}',
			'	};',
			'	io.send(null);',
			'	pMessage.innerHTML="<FONT color=#ff00ff><B>Waiting ...</B></FONT>";',
			'}',
			'function forcedCheck(){',
			'	if(uTcnt<uT.length)checkThis(uT[uTcnt++]);',
			'	else clearInterval(Timer_ID);',
			'}',
			'function fCheckMain(){',
			'	uTcnt=0;',
			'	Timer_ID=setInterval("forcedCheck()",3000);',
			'	var ol=document.createElement("ol");',
			'	ol.start=eval((location.search)?(location.search.match(/of=(\\d+)/)?RegExp.$1:0):0)+1;',
			'	document.body.appendChild(ol);',
			'}',
			'/\/ --></SCRIPT></HEAD><BODY onload=fCheckMain()></BODY></HTML>'
		];
		var Lite='';
		for(var i=0;i<LiteralHtmHead.length;i++) Lite+=(LiteralHtmHead[i]+'\n');
		for(var i=0;i<uT.length;i++) Lite+=('"'+uT[i]+'"'+((i!=uT.length-1)?',':'')+'\n');
		for(var i=0;i<LiteralHtmBody.length;i++) Lite+=(LiteralHtmBody[i]+'\n');
		return Lite;
	}
})();

使い方

OperaFirefox でブラウズしている人で「物は試し」で一度だけ使って見たい方は、例えばコチラの鉄道運行情報のアンテナ頁に行ってからアドレスバーに↓をコピペしてエンターキーを押して見てください。

javascript:void((document.body.appendChild(document.createElement('script'))).src='http://borbis.web.fc2.com/hatena/HatenaAntennaManualUpdate.user.js')

アンテナページの左上隅一括更新のリンクが表示されたらこのリンクをクリックします。
すると、新しいページが開いて更新チェック状況が表示されます。
気に入ったら↑をそのままブックマークに登録すればブックマークレットとして使えます。


もちろん FirefoxGreasemonkeyスクリプトととしてインストールしても使えます。が、インストール方法は省略します。(だって、私よりも、あなたの方が良く知っているのだから)


デスクトップ版の Opera 9.50βにインストールする場合には、……省略します。(だって、……以下略)


デスクトップ版の Opera 9.26 にインストールする場合には、
メニュー > ツール > 設定 > 詳細設定 > コンテンツ > [JavaScriptオプション] > [選択]
と進んで任意のフォルダを指定します。
WindowsXP でユーザ毎にプロファイルを分けてOperaをインストールしている場合には
C:\Documents and Settings\(ユーザ名)\Application Data\OperaUserJS
↑こんな感じのフォルダ設定をするのが私の好みです。
ここで設定したパスは、 Opera のアドレスバーに opera:about と打ち込んでエンターキーを押すと、その頁の中ほどに
ユーザー JavaScript ファイル C:\Documents and Settings\(ユーザ名)\Application Data\OperaUserJS
が表示されます。
ただし Opera の場合サイト毎に UserJS を分けて指定できるので、もうチョット Opera に慣れてきた人は、ウェブページ(ここ話の場合アンテナページ)を表示している状態でページの中の何も無い所で右クリックして、
サイト設定の編集 > スクリプト > [選択]
から自分の好みのフォルダを指定することも出来ます。
さて、フォルダ設定が済んだら
http://borbis.web.fc2.com/hatena/HatenaAntennaManualUpdate.user.js
から UserJS をダウンロードして、自分の指定したフォルダに放り込めば UserJS のインストールは完了です。


W-ZERO3等の Opera Mobile にインストールする場合には、
私の初代W-ZERO3miniSDOperaをインストールしてある場合を例に採ると
\miniSDカード\Application Data\Opera\opera.ini
の中の[User Prefs]セクションに

Always Load User JavaScript=1
User JavaScript=1
User JavaScript File=\miniSDカード\Application Data\Opera\UserJS\

を追記してフォルダ設定をして、ここで設定したフォルダに
http://borbis.web.fc2.com/hatena/HatenaAntennaManualUpdate.user.js
から UserJS をダウンロードして、自分の指定したフォルダに放り込めば UserJS のインストールは完了です。
本体側に Opera をインストールした場合には
\miniSDカード
の部分を削除すれば良いですし、
アドエスこと Advanced/W-ZERO3[es] で採用されている microSD の場合は
\microSDカード
に置き換えれば良いだけですね。

注意事項

さて、2006-05-04 のエントリーでも指摘しておいたつもりですが、この一括更新の機能はアンテナサーバーに多大の負荷を掛ける事になりかねませんし、本来手動更新チェックの機能は、自分の管理しているウェブページが期待どうりにアンテナサーバに巡回されていない場合に自分のページの更新をサーバに通知する為の機能でしかありません。
つまり、本来の使い道を逸脱しているワケでして無闇やたらに使って良い物ではありません。


しかし、鉄道の運行情報などのアンテナの場合は状況が5分〜10分で変わってしまうし、差し迫った状態でアンテナを見たい人もいるかも?とも思うし、幸いはてなアンテナは5分以内に更新されたアンテナは更新チェックをスキップしてくれるのでモバイルの低速回線のユーザーが限度をわきまえて使い分には「はてな」側も「お目溢し」してくれるのでは無いかと思います。って勝手に解釈しています。ごめんなさい。

*1:あれっ!何処かから「それは、お前の"ネット"ライフスタイルが全然進歩していない事の弁明に過ぎない!」って声が聞えたような気がする。たっ、たしかに、図星かも、えっ、えーぃ『うるさいだまれ』

*2:Opera Mobile の場合、ページのTopにジャンプする機能は標準のUIに用意されているので「一括更新」を実行したくなった時に頁Topから即座に更新チェック出来ます。