griffin-stewieの日記

2007-12-17

[][]Developer's Blog

追記 2007年12月17日17時51分

適宜追記はしているつもりですが、このエントリコメント欄も併せてお読み下さい。



no title

に掲載されているスクリプト

 while (_window.busy) {

  sleipnir.Sleep(10);

 }

って記述必要なのかな?

僕の認識だとSeaHorseはページ読み込み完了後に実行されるはず。

上の記述って「ページ読み込み完了まで待つ」って意味あいですよね?


追記 2007年12月17日17時51分

引用元で修正されました。



あとSleep() メソッドっていつの間に使えるようになっただろう。

WSHスクリプトの頃は使えてたけどSelipnirScriptになってからは

全体がフリーズするようになったと思うんだけど。


サンプルに使われてるスクリプトってわざわざ

// @type SleipnirScript

付けずに 普通JavaScriptでいい気もする。

気になったのでためしてみた。

while.... の部分

あってもなくても問題なく動いた。

// @type SleipnirScript 

こちらも // @type SleipnirScriptの記述を削除して、_document → document と訂正すればOK。

ただし、当然ながらSleipnirScriptを使っている部分は削除しないと動きませんので

面倒だからwhile・・・ の部分丸ごとカットする必要があります。

Sleepメソッド

全体がフリーズする時っていうのは

var pnir = new ActiveXObject("Sleipnir.API");
var id = pnir.GetDocumentID(pnir.ActibeIndex);
var document = pnir.GetDocumentObject(id);
while(pnir.IsBusy(id)){
    sleipnir.sleep(10);
}

みたいな書き方をしてた時だったような気がする。

while文の条件部分が今回のと違う。

それで気づいたんだけど

 while (_window.busy) {

_window.busyってなんだ? 見たことない。IHTMLWindwo2のなんかなんだろうなぁ。調べたけど見つけられなかった orz

たぶんこれを使えばSleipnir本体を固まらせずに読み込み待ちとかできるんだろう。


追記 2007年12月17日17時51分

busy自体はundefinedなため sleipnir.sleep(10); 実行されていない模様。

だけど、最近このSleepの有効なシーンにでくわさなくなったなぁ。スクリプトを書いてないだけですけど。

なんかおかしいことにきづいた。

Developer's Blogにあるスクリプトでは

_document.title = '<謎>' + _document.title + '<ですよ>';

タイトルを書き換えるように書かれているのに

僕の環境 IE7では書き換えられていなかった。

IE6の環境で見てみると書き換えられている。

検証したスクリプト

// ==UserScript==
// @name NazoSample01
// @description SeaHorse Sample 01
// @include http://www.fenrir.co.jp/blog/
// @type SleipnirScript
// ==/UserScript==

 if (document != null) {
 	var hoge= '<謎>' + document.title + '<ですよ>';
	alert(hoge);
	document.title = hoge;
 	for ( var i = 0; i < document.styleSheets.length; i++ )
 	document.styleSheets[i].disabled = true;
 } 

何でだろ?


追記 2007年12月17日17時51分

僕の設定のせいでした。

Sleipnirのメニュー>表示>タイトルの変更を禁止

この項目にチェックが入っていたため動作していませんでした。


ついでに上記スクリプトではSleipnirScriptとtype宣言してるのに

documentがエラーを出さずに使えるのだろう?


追記 2007年12月17日17時51分

グローバル変数として _window が宣言されていて

documentはその _window のプロパティだからだそうです。

謎が多い。謎の人が書いたスクリプトだからか?

まとめ

謎の人は謎だらけ。


追記 2007年12月17日17時51分

名前だけです(笑)

2007-11-22

[][][]LDRizeに拡張機能搭載

え〜 毎度のことながらいろいろ書きたいことがあったのですがなんだかんだでgdgdです。

LDRize with LinkPad - griffin-stewieの日記コメント欄でおねだりしていた機能が実装されました。

958さんお疲れ様です&ありがとう

追加された機能など(同梱ReadMe.txtより)

 ●window.LDRize について

  LDRizeが実行されたページでは、window.LDRizeオブジェクトが追加され、LDRizeの一部の機能にアクセス可能

  ・window.LDRize.jQuery

   jQueryアクセス

   *LDRizeに同梱されているjQueryは、軽量化のためにダイエットされているため、本家のjQueryの一部の機能は使用不可

  ・window.LDRize.getPinList()

   ピンが設定されているパラグラフ配列で返却

  ・window.LDRize.getPinListURL()

   ピンが設定されているパラグラフ内のリンクURL配列で返却

  ・window.LDRize.getCurrentParagraph()

   現在カレントパラグラフを返却

  ・window.LDRize.getParagraphLink(paragraph)

   パラメータに渡されたパラグラフリンクを返却

  ・window.LDRize.clearPin()

   ピンリストを削除

  ・window.LDRize.addKeyBind(key, func)

   キーバインドを追加

充実のインターフェイスです。


また、いくつかスクリプトが同梱されています。

  サンプルとして、以下のスクリプトを添付してあるので、そちらを参照。

  ・LDRizePinAddHatebu.js・・・・・・UserActionスクリプト ハテナブックマークにピンリストを追加

  ・LDRizeClearPin.js・・・・・・・・UserActionスクリプト ピンリストを削除

  ・LDRizeShowGoogleCache.user.js・・Seahorseスクリプト Google検索結果に'c'でGoogleキャッシュを開くキーバインドを追加


書かなくちゃ

LDRize with LinkPad - griffin-stewieの日記も最新バージョンに対応させたい。なにげにあのスクリプト不具合満載です(汗)

サイトによって綺麗にURLがとってこれなかったりするのでその辺の調査&修正もやりたいと思っています。

追記 11月22日午後8時56分

コメントで報告いただいた最新版のLinkPadとLDRizeでLDRizePinAddLinkPad.jsを試してみました。

手元の環境IE7&IE6)ともに、このあいだ不具合発見したYahoo検索とLiveSearchでも僕の意図した動作になっていました。

958さんありがとうございます。

あとは新インターフェイスように微調整です。それはまたあとで。


しかし

明日からの三連休(今知った)は友人の結婚式のため名古屋に攻め入る予定なので弄れるのは週明けかもしれません。

2007-06-28

[][][]つくるぶでの外部サイトへのリンクをダイレクトにするスクリプト

横浜出会いのすべて – all meets YOKOHAMA

ここの

404 Not Found

とかだと外部サイトへのリンクをクリックすると

f:id:griffin-stewie:20070628223025j:image

となって個人的にうざかったので作ってみました。

たぶんちゃんと動きます。

妙なサイト(セキュリティ上まずいとこ)へのリンクはおそらく”つくるぶ”内にはないと思いますので大丈夫でしょう。

// ==UserScript==
// @name つくるぶ外部サイトへ直行
// @description つくるぶで「この先は外部のページとなります。よろしいですか?」を回避
// @author      stewie   http://d.hatena.ne.jp/griffin-stewie/
// @include        http://www.tkrb.jp/*
// ==/UserScript==

var links = document.getElementsByTagName("A");
var len = links.length;
for(i=0;i<len;i++){
	if(links[i].href.match(/http:\/\/www.tkrb.jp\/jump\.php\?url=(.*)/i)){
		links[i].href = RegExp.$1;
	}
}

追記

UTF-8で保存したらFirefox(GreaseMonkey)でもOKみたいです。

2007-06-10

[][][]セキュリティ

こちらでプヨぷよ氏が書かれています。

IHTMLWindow2に渡したオブジェクトはページ内のスクリプトからもアクセスできるので、ISleipnirを渡してしまうとmixiで漏らしたように割と洒落にならないセキュリティホールが出来てしまう。

ローカルで試してみました。

ISleipnirを渡すだけのSeaHorseスクリプトを作成。

ボタンをクリックするとこうなりました。

f:id:griffin-stewie:20070611033126j:image

確かにやばいです。(汗)

プヨぷよ氏が書かれているようにこんなJavaScriptが仕込まれているサイトはない(多くもならない?)だろうとは思いますが、少なくてもISleipnirを渡すSeaHorseスクリプトを不特定多数のサイトで使うのはだめですね。いたずらでいきなり全タブを閉じるとかされたりするかも。その程度で済めばかわいいものですが。信用できそうなサイト以外での使用はダメです。

変数にアクセス

当然ながらサイト側のグローバルな変数があるとSeaHorse側で弄れます。また逆に、SeaHorse側の意図しない動作になるともいえますね。

このあたりはクロージャを使えば回避できるとは思います。

僕はそのあたりのことがイマイチ勉強不足です。

うろ覚えですが

FireFoxのGreaseMonkeyでも似たような問題があったような気がします。

それでunsafeWindowができたように記憶しています。

SeaHorseプラグイン自体にもそういった仕組みが必要なのかもしれません。

今のところ

スクリプトを書く側が対策をするしかないでしょう。

僕にはそこまでの技量があるとは思えないので自作スクリプトを晒すのは控えた方がいいかなぁ。

折角、今日(仕事用ですが)非同期XHRができたのに(涙)

2007-06-07

[][][]SleipnirSeaHorseでドメイン越え

似非GM_XHRかも。

SeaHorseスクリプトができたかも。

ほとんどプヨぷよ氏のパクリです(__;)

実用性0だけどとりあえずあげておきます。

単にgooのトップページのケツにはてなのトップをつないだだけです。

// ==UserScript==
// @name SH_XHR
// @description えせGM_xmlHTTPRequest
// @include http://www.goo.ne.jp/
// @type SleipnirScript
// ==/UserScript==


/*******************************************
動作説明
	ページ内のドキュメントにSleipnirが作成したオブジェクトを持たせること(?)でブラウザのフリーズを回避。
	たぶんこれで非同期化ができてると思う。
	onloadイベント(読み込み時)でSH_XHRが着火。
	onloadイベントは一回しか呼ばれないので非同期モード(引数=true)が可能。
	SH_XHRはonunloadイベントで消される。
********************************************/


if (_document) {
	Init(_window);
}

//SleipnirScript
function Init(targetWindow)
{
	var frames = targetWindow.document.getElementsByTagName("frame");
	if (frames.length) {
		for (i = 0; i < frames.length; i++) {
		 Init(frames[i].contentWindow);
		}
	}
	else if (!targetWindow.dict) {
		targetWindow.xmlhttp = sleipnir.CreateObject("MSXML2.ServerXMLHTTP");
		
		jscript = targetWindow.document.createElement("script");
		jscript.type = "text/javascript";
		jscript.text = SH_XHR + closeSH_XHR;
		targetWindow.document.getElementsByTagName("head").item(0).appendChild(jscript);
		
		targetWindow.attachEvent("onload", targetWindow.SH_XHR);
		targetWindow.attachEvent("onunload", targetWindow.closeSH_XHR);
	}
}

//JavaScript
function SH_XHR()
{
	window.xmlhttp.onreadystatechange = function() { 
	 	if (xmlhttp.readyState == 4) { 
	    	var v = xmlhttp.responseText; 
	    	document.body.innerHTML += v;
	 	} 
	}; 
	xmlhttp.open("GET", "http://hatena.ne.jp/",true, "", "");
	xmlhttp.send(null);
}

//JavaScript
function closeSH_XHR()
{
	window.xmlhttp = null;
}

ん〜

微妙にひっかりがあるなぁ。

きっとプヨぷよ氏やSleipnir2スレの中の人たちがもっといい感じのをリリースしてくれることに期待。

プロフィール

griffin-stewie

griffin-stewie

遂にプログラマの端くれに。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には一切関係ありません。