<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/"
>

<channel rdf:about="http://blog.zenbo.jp/">
<title>膳ブログ</title>
<link>http://blog.zenbo.jp/</link>
<description>IT奴隷生活を1.30倍楽しむためのお勉強備忘録</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.sakura.ne.jp/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://blog.zenbo.jp/article/48208612.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/44863172.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/43303496.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/40588666.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/34677221.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/31336802.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/31001856.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/31001847.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/31001727.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/30230008.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/29849489.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/29829311.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/29702787.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/29685153.html" />
<rdf:li rdf:resource="http://blog.zenbo.jp/article/29683996.html" />
</rdf:Seq>
</items>
</channel>

<item rdf:about="http://blog.zenbo.jp/article/48208612.html">
<link>http://blog.zenbo.jp/article/48208612.html</link>
<title>JavaScriptでbound method</title>
<description>Function内のthisの値は呼び出し方によって変化するので、下記コードは意図通りに動かない。//クラス定義function Hoge() {    this.propertyA = 1;}Hoge.prototype = {    methodA: function() {        return this.propertyA;    }};//callback関数を受け取る適当な関数function fuga(callback) {    return callb..</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2011-09-28T21:43:01+09:00</dc:date>
<content:encoded><![CDATA[
Function内のthisの値は呼び出し方によって変化するので、下記コードは意図通りに動かない。
<pre class="brush: js">
//クラス定義
function Hoge() {
    this.propertyA = 1;
}
Hoge.prototype = {
    methodA: function() {
        return this.propertyA;
    }
};

//callback関数を受け取る適当な関数
function fuga(callback) {
    return callback();
}

var hoge = new Hoge();
console.log(fuga(hoge.methodA));    // undefined が出力されてしまう
</pre>
<br />
pythonのbound methodみたいに、インスタンス生成時にthisの値を束縛してくれればインスタンスメソッドの使い勝手がよくなりそうなので、クラス定義を次のように書き換えてみた。
<pre class="brush: js">
function Hoge() {
    this.propertyA = 1;
    for (var property in this) {
        if (typeof this[property] == 'function') {
            this[property] = (function(context, method) {
                return function() {
                    return method.apply(context, arguments);
                };
            })(this, this[property]);
        }
    }
}
Hoge.prototype = {
    methodA: function() {
        return this.propertyA;
    }
};

var hoge = new Hoge();
console.log(fuga(hoge.methodA));    // ちゃんと 1 が出力される
var a = hoge.methodA;
console.log(a());     // これでも 1 が出力される。
</pre>
<br />
実際のプロダクトではこんなことしないで引数渡すときにjQuery.proxy使うけど。
<script type="text/javascript" src="http://www.zenbo.jp/SyntaxHighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="http://www.zenbo.jp/SyntaxHighlighter/scripts/shBrushJScript.js"></script>
<link href="http://www.zenbo.jp/SyntaxHighlighter/styles/shCore.css" rel="stylesheet" type="text/css" />
<link href="http://www.zenbo.jp/SyntaxHighlighter/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
     SyntaxHighlighter.all()
</script><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/44863172.html">
<link>http://blog.zenbo.jp/article/44863172.html</link>
<title>JavaScriptで名前空間2</title>
<description>二年前に、JavaScriptで名前空間という記事を書いたんですが、最近は名前空間の定義方法を変えています。以前は、window.jp.zenbo というように、ドメイン毎にオブジェクトを用意していたのですが、同じ方法で名前空間定義する外部スクリプトと window.jp が競合しそうで怖いので(もしくはサイト側のJSが var jp, com と定義する確率がわずかにある)、window['jp.zenbo'] といった風に競合しないであろうグローバルな名前空間一つだけ用意..</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2011-05-05T12:46:41+09:00</dc:date>
<content:encoded><![CDATA[
二年前に、<a href="http://blog.zenbo.jp/article/13176556.html" target="_blank">JavaScriptで名前空間</a>という記事を書いたんですが、最近は名前空間の定義方法を変えています。<br />
<br />
以前は、window.jp.zenbo というように、ドメイン毎にオブジェクトを用意していたのですが、同じ方法で名前空間定義する外部スクリプトと window.jp が競合しそうで怖いので(もしくはサイト側のJSが var jp, com と定義する確率がわずかにある)、window['jp.zenbo'] といった風に競合しないであろうグローバルな名前空間一つだけ用意するようにしています。<br />
<br />
<pre class="brush: js">
// 昔の定義方法
if (typeof window['jp'] === 'undefined') window['jp'] = {};
if (typeof window['jp']['zenbo'] === 'undefined') window['jp']['zenbo'] = {};

// 今の定義方法
if (typeof window['jp.zenbo'] === 'undefined') window['jp.zenbo'] = {};
</pre>
<br />
window['jp.zenbo']以下は俺俺ルールで好きに使っておｋ。<br />
名前空間は被らないようにするのが第一の目的なので、ドット付きの変数名ならまず大丈夫ではないでしょうか。<br />
本当に大丈夫かどうか心配なので、何か問題あったら教えて下さい。<br />

<script type="text/javascript" src="http://www.zenbo.jp/SyntaxHighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="http://www.zenbo.jp/SyntaxHighlighter/scripts/shBrushJScript.js"></script>
<link href="http://www.zenbo.jp/SyntaxHighlighter/styles/shCore.css" rel="stylesheet" type="text/css" />
<link href="http://www.zenbo.jp/SyntaxHighlighter/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
     SyntaxHighlighter.all()
</script>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/43303496.html">
<link>http://blog.zenbo.jp/article/43303496.html</link>
<title>ATOK2011を窓から投げ捨てたくなったけど思いとどまった</title>
<description>定額制にしているATOKが2011にアップデートできるようなのでインストールしてみたら、ATOKパレットが言語バーと統一していた。以前はタスクトレイに収納して使っていたので、1アイコンでスッキリ表示できていたのにこんな感じで主張しまくる。ATOK2011キタ｜ぶにゃの日記http://ameblo.jp/samael21/entry-10794097751.html上記のサイトを見つけて元に戻せたけど、分かり辛すぎるだろう、ATOK……。それから、引き継ぎ設定をしくじったせい..</description>
<dc:subject>雑記</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2011-02-08T22:35:50+09:00</dc:date>
<content:encoded><![CDATA[
定額制にしているATOKが2011にアップデートできるようなのでインストールしてみたら、ATOKパレットが言語バーと統一していた。<br /><img src="http://zenbo.sakura.ne.jp/sblo_files/zenbo/image/ATOK2011_before.png" width="148" height="39" border="0" align="" alt="ATOK2011_before.png" /><br />以前はタスクトレイに収納して使っていたので、1アイコンでスッキリ表示できていたのにこんな感じで主張しまくる。<br /><br />ATOK2011キタ｜ぶにゃの日記<br /><a href="http://ameblo.jp/samael21/entry-10794097751.html" target="_blank">http://ameblo.jp/samael21/entry-10794097751.html</a><br /><br />上記のサイトを見つけて元に戻せたけど、分かり辛すぎるだろう、ATOK……。<br /><img src="http://zenbo.sakura.ne.jp/sblo_files/zenbo/image/ATOK2011_after.png" width="62" height="41" border="0" align="" alt="ATOK2011_after.png" /><br /><br />それから、引き継ぎ設定をしくじったせいか、「aikon」と入力した状態で変換かけると「n」が「ん」と認識されないようになった。「……」を「てん」で登録しているのに「ten」では「テン」に変換できても「……」が候補に出ない。もう勘弁してくれATOK(ﾉA`)<br />「Nの過不足を修正する」をONにしているのになんで不足時に修正してくれないんだ……。<br /><br />追記：<br />[ローマ字立ち直り]→[する]で問題解決。<br />デフォの引き継ぎ設定は全部ONにしてくれ。もう疲れた。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/40588666.html">
<link>http://blog.zenbo.jp/article/40588666.html</link>
<title>PHPの罠</title>
<description>&amp;lt;br /&amp;gt;class Hoge {&amp;lt;br /&amp;gt;	public static function create() {&amp;lt;br /&amp;gt;		return new self();&amp;lt;br /&amp;gt;	}&amp;lt;br /&amp;gt;	public function unk() {&amp;lt;br /&amp;gt;		return &quot;Hoge#unk&quot;;&amp;lt;br /&amp;gt;	}&amp;lt;br /&amp;gt;}&amp;lt;br /&amp;gt;class Fuga extend..</description>
<dc:subject>PHP</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2010-09-08T00:38:20+09:00</dc:date>
<content:encoded><![CDATA[
<textarea name="code" class="php" cols="60" rows="5">
class Hoge {
	public static function create() {
		return new self();
	}
	public function unk() {
		return "Hoge#unk";
	}
}
class Fuga extends Hoge {
	public function unk() {
		return "Fuga#unk";
	}
}
$a = Fuga::create();
echo $a->unk();
</textarea><br />
<br />
上記のコードだと、<br />
<span style="color:#0000FF;">Hoge#unk</span><br />
が出力される。<br />
<br />
selfは継承ガン無視でメソッドが定義されたクラスに束縛される。<br />
staticメソッド内から別のstaticメソッド呼ぶなよハゲという思想なんだろうか。<br />
その思想自体にいちゃもん付ける気はないけど、だったらselfなんて使い勝手良さそうなキーワードなくして欲しい。<br />
PHP5.3以降ならば回避策があって、selfじゃなくstaticを使用すると実行時のクラスを参照してくれる。<br />
selfはいらない子。<br />
<br />
<textarea name="code" class="php" cols="60" rows="5">
class Hoge {
	public static function create() {
		return new static();
	}
	public function unk() {
		return "Hoge#unk";
	}
}
class Fuga extends Hoge {
	public function unk() {
		return "Fuga#unk";
	}
}
$a = Fuga::create();
echo $a->unk();
</textarea><br />
<br />
これで<br />
<span style="color:#0000FF;">Fuga#unk</span><br />
が出力される。<br />
<br />
また一つバッドノウハウが増えた。<br />
PHPは直感に反する罠がたくさんあって、それぞれ知識として覚え続けてなきゃいけないので辛いです。<br />
頭のいい人以外向かない言語。
<script class="javascript" src="http://www.zenbo.jp/sblo_files/zenbo/lib/shCore.js"></script>
<script class="javascript" src="http://www.zenbo.jp/sblo_files/zenbo/lib/shBrushPhp.js"></script>
<script class="javascript">
dp.SyntaxHighlighter.HighlightAll('code');
</script><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/34677221.html">
<link>http://blog.zenbo.jp/article/34677221.html</link>
<title>掃除できないスイッチ・続</title>
<description>ええ、掃除してないんです。前回から。自分でもビックリな約2年間です。あの後掃除友達が忙しくなってしまったので依頼することができなくなり、掃除できないスイッチがオフのままでした。掃除していないとはいっても完全にしてないわけではなく、キッチン周りや目につくところだけは適当にやっていたので、精神的には大丈夫だったんですが、目に見えないそこかしこにホコリが溜まりまくって健康的に危険な状態にありました。(自分の部屋の中に「安全ゾーン」と「腐海ゾーン」があって平気な精神状態がまともかどう..</description>
<dc:subject>雑記</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2010-01-11T12:47:02+09:00</dc:date>
<content:encoded><![CDATA[
ええ、掃除してないんです。<a href="http://blog.zenbo.jp/article/11391892.html" target="_blank">前回</a>から。<br />自分でもビックリな約2年間です。<br />あの後掃除友達が忙しくなってしまったので依頼することができなくなり、掃除できないスイッチがオフのままでした。<br />掃除していないとはいっても完全にしてないわけではなく、キッチン周りや目につくところだけは適当にやっていたので、精神的には大丈夫だったんですが、目に見えないそこかしこにホコリが溜まりまくって健康的に危険な状態にありました。(自分の部屋の中に「安全ゾーン」と「腐海ゾーン」があって平気な精神状態がまともかどうかは分かりませんが……)<br />そんな状態で友達と自分の家で呑んでいたら、急にやる気を出してくれたようで、早速次の日掃除してくれることになりました。持つべきものは友達です……家事が得意な。<br />翌日朝から行動開始し、例によって掃除だけじゃ済まずに模様替え＆カーペット・布団・つっかえ棒・ラック・蛍光灯買い換えと大がかりになっていき、丸一日かかって作業を終えました。<br />部屋は見違えるほど綺麗になり、達成感に二人で酔いしれていたんですが、ふと危険な仮説を思いつきました。<br />毎度毎度大がかりな掃除をすることで、掃除＝ビッグプロジェクトという刷り込みが自分の中にされてしまい、一人で掃除しようとする切っ掛けを失っているんじゃないだろうか……。<br />掃除を手伝ってもらう以前から自発的に掃除していなかったので、どちらにせよ結論は一緒ですが、相乗効果でもうスイッチが固定されて動かないような気がします。友達が定期的に掃除してくれることを部屋の隅でガタガタ震えながら祈り続けたいと思います。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/31336802.html">
<link>http://blog.zenbo.jp/article/31336802.html</link>
<title>NoSquintをアンインストールするとマウスホイールで文字サイズ変更できなくなる</title>
<description>というわけで、Firefoxのロケーションバーにabout:configと入力して、mousewheel.withcontrolkey.actionの値を3に戻せば直る。Ctrl+ホイールでの文字サイズ変更機能をNoSquintが持っているせいか、拡張が有効の場合は0以外に設定できなくてアンインストール(or無効)にすると5に設定されるみたい。副作用怖い。</description>
<dc:subject>雑記</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-08-16T02:46:31+09:00</dc:date>
<content:encoded><![CDATA[
というわけで、Firefoxのロケーションバーにabout:configと入力して、mousewheel.withcontrolkey.actionの値を3に戻せば直る。<br />Ctrl+ホイールでの文字サイズ変更機能をNoSquintが持っているせいか、拡張が有効の場合は0以外に設定できなくてアンインストール(or無効)にすると5に設定されるみたい。副作用怖い。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/31001856.html">
<link>http://blog.zenbo.jp/article/31001856.html</link>
<title>2009年07月の残業時間数</title>
<description>7月の残業時間数、計10h南米行きたい。ブラジルでも可。</description>
<dc:subject>残業時間数メモ</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-08-02T14:14:44+09:00</dc:date>
<content:encoded><![CDATA[
7月の残業時間数、計10h<br /><br />南米行きたい。<br />ブラジルでも可。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/31001847.html">
<link>http://blog.zenbo.jp/article/31001847.html</link>
<title>2009年06月の残業時間数</title>
<description>6月の残業時間数、計4h動（以下愚痴略</description>
<dc:subject>残業時間数メモ</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-08-02T14:14:02+09:00</dc:date>
<content:encoded><![CDATA[
6月の残業時間数、計4h<br /><br />動（以下愚痴略<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/31001727.html">
<link>http://blog.zenbo.jp/article/31001727.html</link>
<title>産経ニュースのキーワードポップアップを無効にするgreasemonkey</title>
<description>ついカッとなって産経ニュースのキーワードポップアップを無効にするgreasemonkey書きました。onmouseは慎重に使うべきだと思う。EraseSankeiKeyword ver1.0.0.0■ダウンロード</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-08-02T14:06:24+09:00</dc:date>
<content:encoded><![CDATA[
ついカッとなって産経ニュースのキーワードポップアップを無効にするgreasemonkey書きました。<br />onmouseは慎重に使うべきだと思う。<br /><br /><strong>EraseSankeiKeyword ver1.0.0.0</strong><br /><a href="http://www.zenbo.jp/data/erasesankeikeyword.user.js">■ダウンロード</a><br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/30230008.html">
<link>http://blog.zenbo.jp/article/30230008.html</link>
<title>GMarksの「オンラインで管理」が使えなくなった</title>
<description>多分、google側の仕様変更なんでしょうけど、GMarksメニューバーの「オンラインで管理」を選択してもgoogleのトップページに飛ばされるようになってしまいました。というわけで、componentsns/IGMarksCom_google.jsの14行目return &quot;https://google.com/bookmarks&quot;;　↓return &quot;https://www.google.com/bookmarks&quot;;と書き換えればおｋ。ちなみに、0.9.9から1.0のバー..</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-07-01T23:22:42+09:00</dc:date>
<content:encoded><![CDATA[
多分、google側の仕様変更なんでしょうけど、GMarksメニューバーの「オンラインで管理」を選択してもgoogleのトップページに飛ばされるようになってしまいました。<br />というわけで、<br />componentsns/IGMarksCom_google.js<br />の<br /><br />14行目<br />return "https://google.com/bookmarks";<br />　↓<br />return "https://www.google.com/bookmarks";<br /><br />と書き換えればおｋ。<br />ちなみに、0.9.9から1.0のバージョンアップで1000件バグは解消されたぽいです。<br />追記：変更前、変更後が逆だったので修正。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/29849489.html">
<link>http://blog.zenbo.jp/article/29849489.html</link>
<title>mootoolsのFunction#delayは0秒指定で即時実行される</title>
<description>delayってのはFunctionインスタンスにsetTimeoutを組み込んだメソッドなんですが、これをsetTimeoutと同じように0秒指定(もしくはNull)で使用すると、メソッド呼んだ瞬間に実行されるらしい。setTimeout(function() {　　alert(&quot;tnk&quot;);}, 0);alert(&quot;unk&quot;);これは&quot;unk&quot;の後に&quot;tnk&quot;が表示される。(function() {　　alert(&quot;tnk&quot;);}).delay(0);alert(&quot;unk&quot;..</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-06-16T21:44:09+09:00</dc:date>
<content:encoded><![CDATA[
delayってのはFunctionインスタンスにsetTimeoutを組み込んだメソッドなんですが、これをsetTimeoutと同じように0秒指定(もしくはNull)で使用すると、メソッド呼んだ瞬間に実行されるらしい。<br /><br /><span style="color:#0000FF;">setTimeout(function() {<br />　　alert("tnk");<br />}, 0);<br />alert("unk");</span><br /><br />これは"unk"の後に"tnk"が表示される。<br /><br /><span style="color:#0000FF;">(function() {<br />　　alert("tnk");<br />}).delay(0);<br />alert("unk");</span><br /><br />でもdelayだと、"tnk"の後に"unk"が表示される。<br />delayに0を渡すことが何を意味するのかってのは難しいところだけど、公式のドキュメントにsetTimeoutのリンク貼ってるなら仕様は併せて欲しいなぁ。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/29829311.html">
<link>http://blog.zenbo.jp/article/29829311.html</link>
<title>PixivFilterをAutoPagerizeに対応させました</title>
<description>pixivではAutoPagerizeを無効にしてたので絶賛放置中だったんですが、他のGMスクリプト見たら簡単そうだったので、AutoPagerizeに対応させました。多分動く。PixivFilter ver1.2.0.0■ダウンロード</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-06-16T00:03:50+09:00</dc:date>
<content:encoded><![CDATA[
pixivではAutoPagerizeを無効にしてたので絶賛放置中だったんですが、他のGMスクリプト見たら簡単そうだったので、AutoPagerizeに対応させました。<br />多分動く。<br /><br /><strong>PixivFilter ver1.2.0.0</strong><br /><a href="http://www.zenbo.jp/lib/pixivfilter.user.js">■ダウンロード</a><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/29702787.html">
<link>http://blog.zenbo.jp/article/29702787.html</link>
<title>unsafeWindow内のprototypeを書き換えつつGM関数を呼ぶ</title>
<description>愛復活です。Greasemonkey側からprototypeオブジェクトにアクセスできないならunsafeWindow側でやってらえばいけるかもと試してみたらいけたっぽい。GreasemonkeyをBookmarklet的に実行してみる - 0x集積蔵と、いくつかのGreasemonkeyスクリプトが動かなくなってた件 - 青春スイーツの合わせ技です。例として、下記のカウントするだけのクラスをGM_getValue, GM_setValueを使って永続的なカウントをするように..</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-06-09T21:37:04+09:00</dc:date>
<content:encoded><![CDATA[
愛復活です。<br />
<br />
Greasemonkey側からprototypeオブジェクトにアクセスできないならunsafeWindow側でやってらえばいけるかもと試してみたらいけたっぽい。<br />
<br />
<a href="http://d.hatena.ne.jp/os0x/20080403/1207223147" target="_blank">GreasemonkeyをBookmarklet的に実行してみる - 0x集積蔵</a><br />
と、<br />
<a href="http://d.hatena.ne.jp/Aoba/20081019/1224344013" target="_blank">いくつかのGreasemonkeyスクリプトが動かなくなってた件 - 青春スイーツ</a><br />
の合わせ技です。<br />
<br />
<br />
例として、下記のカウントするだけのクラスをGM_getValue, GM_setValueを使って永続的なカウントをするように上書きします。<br />
<br />
■unsafeWindow
<textarea name="code" class="js" cols="60" rows="5" id="code">
function Counter() {
	this.initialize.apply(this, arguments);
}
Counter.prototype = {
	initialize: function() {
		this.count = 0;
	},
	getCount: function() {
		return this.count;
	},
	countUp: function() {
		this.count++;
	}
};
</textarea><br />
<br />
■Greasemonkey
<textarea name="code" class="js" cols="60" rows="5" id="code">
//setTimeout使わないとGM_使えないから、
//GM_getValueは予め取得しておいた方がよさげ。
var count = GM_getValue("count", 0);

//元のメソッドも使いたいからクロージャ内に保存しておく。
unsafeWindow.getNewCounterPrototype = function(old) {
	return {
		//この関数はGM内で定義されているから内部の変数にアクセスできる。
		initialize: function() {
			//永続的な値を取得。シングルトンなカウンター。
			this.count = count;
		},
		getCount: function() {
			//getCountはそのまま
			return old.getCount.apply(this, arguments);
		},
		countUp: function() {
			old.countUp.apply(this, arguments);
			var self = this;
			//countUpはunsafeWindowから呼ばれるからsetTimeout必須。
			setTimeout(function() {
				//値を保存。
				GM_setValue("count", self.count);
			});
		}
	};
};

location.href = 'javascript:(' + function() {
	(function(window){
		window.Counter.prototype = window.getNewCounterPrototype(window.Counter.prototype);
		delete window.getNewCounterPrototype;	//消しておく。
	})(window);
}.toString() + ')()';
</textarea><br />
<br />
<br />
めんどい。
<script class="javascript" src="http://www.zenbo.jp/sblo_files/zenbo/lib/shCore.js"></script>
<script class="javascript" src="http://www.zenbo.jp/sblo_files/zenbo/lib/shBrushJScript.js"></script>
<script class="javascript">
dp.SyntaxHighlighter.HighlightAll('code');
</script><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/29685153.html">
<link>http://blog.zenbo.jp/article/29685153.html</link>
<title>Greasemonkeyの○○○！！</title>
<description>今更な話題なんですけど、今まさにGreasemonkeyでunsafeWindow内のprototypeにアクセスできないという問題にぶち当たってしまい、GreasemonkeyをBookmarklet的に実行してみる - 0x集積蔵の解決策見つけたけど、GM_setValue,GM_getValue,GM_xmlhttpRequestを使いたかったのにうわぁぁぁぁぁんな状況です。愛が壊れた＼(＾o＾)／</description>
<dc:subject>JavaScript</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-06-08T23:02:08+09:00</dc:date>
<content:encoded><![CDATA[
今更な話題なんですけど、今まさにGreasemonkeyでunsafeWindow内のprototypeにアクセスできないという問題にぶち当たってしまい、<br /><br /><a href="http://d.hatena.ne.jp/os0x/20080403/1207223147" target="_blank">GreasemonkeyをBookmarklet的に実行してみる - 0x集積蔵</a><br /><br />の解決策見つけたけど、GM_setValue,GM_getValue,GM_xmlhttpRequestを使いたかったのにうわぁぁぁぁぁんな状況です。<br />愛が壊れた＼(＾o＾)／<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://blog.zenbo.jp/article/29683996.html">
<link>http://blog.zenbo.jp/article/29683996.html</link>
<title>2009年05月の残業時間数</title>
<description>5月の残業時間数、計12hい（以下愚痴略</description>
<dc:subject>残業時間数メモ</dc:subject>
<dc:creator>膳</dc:creator>
<dc:date>2009-06-08T22:07:03+09:00</dc:date>
<content:encoded><![CDATA[
5月の残業時間数、計12h<br /><br />い（以下愚痴略<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
</rdf:RDF>

