<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ku &#187; Firebug</title>
	<atom:link href="http://ido.nu/kuma/category/firebug/feed/" rel="self" type="application/rss+xml" />
	<link>http://ido.nu/kuma</link>
	<description></description>
	<lastBuildDate>Fri, 04 Jun 2010 00:26:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Firebug 1.2 ‘console’ implementation 和訳</title>
		<link>http://ido.nu/kuma/2008/05/16/firebug-12-%e2%80%98console%e2%80%99-implementation-japanese-translation/</link>
		<comments>http://ido.nu/kuma/2008/05/16/firebug-12-%e2%80%98console%e2%80%99-implementation-japanese-translation/#comments</comments>
		<pubDate>Fri, 16 May 2008 12:39:15 +0000</pubDate>
		<dc:creator>ku</dc:creator>
				<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[和訳]]></category>

		<guid isPermaLink="false">http://ido.nu/kuma/?p=1019</guid>
		<description><![CDATA[
Firebug &#8211; Web Development Evolved » Blog Archive » Firebug 1.2 ‘console’ implementationの和訳です。
実装はソースコードに書いてあるのそのまま(あたりまえ)。webページに書かれてある悪意あるコードを特権つきで実行しないようにするための細工だっていうことがわかったところが収穫でした。

Firebug 1.2 ‘console’ implementation
FF3betaでFirebugの1.1のコマンドが動かなくなりました。これを直すのがすごい難しくてコマンドラインとコンソールを作り直す必要がありました。はじめにコンソールについて書いて、次回コマンドラインの実装について書きます(訳注:けっきょく2008.5.16現在まだ書かれてないです)。
Firebugの&#8217;console&#8217;を使ってWeb開発者はテキストやオブジェクトをFirebugのコンソールパネルに出力することができます。新しいバージョンは emelement messaging を使っています。webページの要素を使ってFirebugに制御フローと値を渡す、っていう意味です。こんなかんじで動きます。
Webページがロードされてからはじめのjavascript関数が呼ばれたりする前に document.createElement() を使ってページにscriptタグを仕込みます。スクリプトは_firebugConsoleという見えないdiv要素とconsole関数を追加します。Webページの開発者が console.log("foo"); を呼ぶとlog()関数は

"foo"という文字列をconsoleのユーザオブジェクトの配列に書き込みます。
_firebugConsole要素のひとつの属性に"foo"オブジェクトのインデックスを書き込みます。
_firebugConsole要素のfirebugAppendConsoleイベントをディスパッチします。

これらは全部標準のDOM操作です。
Firebug側ではfirebugAppendConsoleイベントリスナを_firebugConsole要素に追加しておきます。イベントがやってきたら、要素の属性を使ってユーザーオブジェクトにアクセスしてそれをFirebugのコンソールパネルに書き込みます。
FirebugはユーザーオブジェクトにアクセスすることでFirefoxのセキュリティラッパーテクノロジーを使って、おかしなウェブのコードがextension空間に入ってくるのを防いでいます。
いま(1.2a13)の実装にはもうひとつ間にレイヤがあります。consoleを定義するscriptタグはロードされるページ全部に入れられるわけではありません。かわりに小さな5行でできたwindow.consoleのgetterを定義します。getterはconsoleのコードをロードして、consoleオブジェクトがはじめて使われたときに_firebugConsole要素を作ります。
Mike Shaver, Mark Kahn, Justin Dolskeがこれを作るヒントをくれました。ありがとう。もしコンソールについてソースを見ようと思ったらこのへんになります。

consoleを定義するソースを注入しているところ
The firebugAppendConsoleをlistenしているFirebugのイベントハンドラ.
The console本体

]]></description>
			<content:encoded><![CDATA[<div class="note">
<a href="http://www.getfirebug.com/blog/2008/04/06/firebug-12-console-implementation/">Firebug &#8211; Web Development Evolved » Blog Archive » Firebug 1.2 ‘console’ implementation</a>の和訳です。</p>
<p>実装はソースコードに書いてあるのそのまま(あたりまえ)。webページに書かれてある悪意あるコードを特権つきで実行しないようにするための細工だっていうことがわかったところが収穫でした。
</p></div>
<h3>Firebug 1.2 ‘console’ implementation</h3>
<p>FF3betaでFirebugの1.1のコマンドが動かなくなりました。これを直すのがすごい難しくてコマンドラインとコンソールを作り直す必要がありました。はじめにコンソールについて書いて、次回コマンドラインの実装について書きます(訳注:けっきょく2008.5.16現在まだ書かれてないです)。</p>
<p>Firebugの&#8217;console&#8217;を使ってWeb開発者はテキストやオブジェクトをFirebugのコンソールパネルに出力することができます。新しいバージョンは emelement messaging を使っています。webページの要素を使ってFirebugに制御フローと値を渡す、っていう意味です。こんなかんじで動きます。</p>
<p>Webページがロードされてからはじめのjavascript関数が呼ばれたりする前に <code>document.createElement()</code> を使ってページに<code>script</code>タグを仕込みます。スクリプトは<code>_firebugConsole</code>という見えない<code>div</code>要素と<code>console</code>関数を追加します。Webページの開発者が <code>console.log("foo");</code> を呼ぶと<code>log()</code>関数は</p>
<ol>
<li><code>"foo"</code>という文字列を<code>console</code>のユーザオブジェクトの配列に書き込みます。</li>
<li><code>_firebugConsole</code>要素のひとつの属性に<code>"foo"</code>オブジェクトのインデックスを書き込みます。</li>
<li><code>_firebugConsole</code>要素の<code>firebugAppendConsole</code>イベントをディスパッチします。</li>
</ol>
<p>これらは全部標準のDOM操作です。</p>
<p>Firebug側では<code>firebugAppendConsole</code>イベントリスナを<code>_firebugConsole</code>要素に追加しておきます。イベントがやってきたら、要素の属性を使ってユーザーオブジェクトにアクセスしてそれをFirebugのコンソールパネルに書き込みます。</p>
<p>FirebugはユーザーオブジェクトにアクセスすることでFirefoxのセキュリティラッパーテクノロジーを使って、おかしなウェブのコードがextension空間に入ってくるのを防いでいます。</p>
<p>いま(1.2a13)の実装にはもうひとつ間にレイヤがあります。<code>console</code>を定義する<code>script</code>タグはロードされるページ全部に入れられるわけではありません。かわりに小さな5行でできた<code>window.console</code>のgetterを定義します。getterはconsoleのコードをロードして、<code>console</code>オブジェクトがはじめて使われたときに<code>_firebugConsole</code>要素を作ります。</p>
<p>Mike Shaver, Mark Kahn, Justin Dolskeがこれを作るヒントをくれました。ありがとう。もしコンソールについてソースを見ようと思ったらこのへんになります。</p>
<ul>
<li><a href="http://code.google.com/p/fbug/source/browse/branches/firebug1.2/content/firebug/consoleInjected.js">consoleを定義するソースを注入しているところ</a></li>
<li><a href="http://code.google.com/p/fbug/source/browse/branches/firebug1.2/content/firebug/consoleInjector.js">The firebugAppendConsoleをlistenしているFirebugのイベントハンドラ.</a></li>
<li><a href="http://code.google.com/p/fbug/source/browse/branches/firebug1.2/content/firebug/console.js">The console本体</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ido.nu/kuma/2008/05/16/firebug-12-%e2%80%98console%e2%80%99-implementation-japanese-translation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One more Tombloo patch</title>
		<link>http://ido.nu/kuma/2008/02/29/one-more-tombloo-patch/</link>
		<comments>http://ido.nu/kuma/2008/02/29/one-more-tombloo-patch/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 17:34:24 +0000</pubDate>
		<dc:creator>ku</dc:creator>
				<category><![CDATA[Firebug]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[tumblr]]></category>

		<guid isPermaLink="false">http://ido.nu/kuma/2008/02/29/one-more-tombloo-patch/</guid>
		<description><![CDATA[TomblooをFirefox3で動くようにするパッチをちょこっと改良して追記。拡張機能をインストール/アンインストールして再起動したあとの1回目でTomblooが機能しないのを解決しました。
components/tombloo.jsのいちばんはじめのほうで
const ExtensionManager = getService('/extensions/manager;1', Ci.nsIExtensionManager);
と代入してしてExtensionManagerを利用すると、たぶんXPCOMの追加/削除が行われたあとでcompreg.datなんかを再構築するときのファイル読み込み順依存でnsIExtensionManagerが利用できる/できないが決まって、それがconstに代入されちゃうので、ほんとはXPCOMの初期化が終わったあとに呼び出されるのでnsIExtensionManagerは常に利用できるはずのTomblooServiceのcreateInstanceの中でもExtensionManagerが存在しなくてこけてるようでした。
XPCOMコンポーネントから他のXPCOMを使うときは、利用可能になるタイミングを意識しておく必要がありそうです。今回はcreateInstanceの中で使うからかんたんに解決できるけど、registerSelfみたいな初期化の過程で呼ばれるようなところの中で使いたかったらどーするんだろう。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://ido.nu/kuma/2008/02/20/a-patch-make-tombloo-working-with-firefox3/">TomblooをFirefox3で動くようにするパッチ</a>をちょこっと改良して追記。拡張機能をインストール/アンインストールして再起動したあとの1回目でTomblooが機能しないのを解決しました。</p>
<p><code>components/tombloo.js</code>のいちばんはじめのほうで</p>
<pre><code>const ExtensionManager = getService('/extensions/manager;1', Ci.nsIExtensionManager);</code></pre>
<p>と代入してして<code>ExtensionManager</code>を利用すると、たぶんXPCOMの追加/削除が行われたあとで<code>compreg.dat</code>なんかを再構築するときのファイル読み込み順依存で<code>nsIExtensionManager</code>が利用できる/できないが決まって、それがconstに代入されちゃうので、ほんとはXPCOMの初期化が終わったあとに呼び出されるので<code>nsIExtensionManager</code>は常に利用できるはずの<code>TomblooService</code>の<code>createInstance</code>の中でも<code>ExtensionManager</code>が存在しなくてこけてるようでした。</p>
<p>XPCOMコンポーネントから他のXPCOMを使うときは、利用可能になるタイミングを意識しておく必要がありそうです。今回は<code>createInstance</code>の中で使うからかんたんに解決できるけど、<code>registerSelf</code>みたいな初期化の過程で呼ばれるようなところの中で使いたかったらどーするんだろう。</p>
]]></content:encoded>
			<wfw:commentRss>http://ido.nu/kuma/2008/02/29/one-more-tombloo-patch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firebugのコマンラインを拡張してincludeできるようにしたら便利でした</title>
		<link>http://ido.nu/kuma/2008/02/19/extending-firebug-console-add-include-function/</link>
		<comments>http://ido.nu/kuma/2008/02/19/extending-firebug-console-add-include-function/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 13:02:57 +0000</pubDate>
		<dc:creator>ku</dc:creator>
				<category><![CDATA[Firebug]]></category>

		<guid isPermaLink="false">http://ido.nu/kuma/2008/02/19/extending-firebug-console-add-include-function/</guid>
		<description><![CDATA[さいきんFirebugでコードを書いている。書いてCtrl-Enterを押した瞬間に結果が確認できるので気持ちがいい。Canvasを使えばグラフィックも扱える。BASICでコードを書く感覚を思い出した。


Firebug上では、あんまり長いコードを書くのはつらいところが難点だった。自分で拡張してincludeできるようにしたらこれがすごくいい。Firebug上で実行して動作を確認しながら関数を書いていって、うまく動くようになった時点でincludeしているファイルのほうに移動してFirebugのコマンドラインを空にする。vim上でコードを書いてブラウザに戻ってきてreloadするのにくらべてストレスが少ない。
vim上でコードを書き換えたときもCtrl-Enterでもう一度includeされて実行されるので、リロードは発生しないし、Firefoxとvimとをいったりきたりしなくてもいい。
Firebug を「カクカク化」して $x の第 2 引数でコンテキストノードを指定できるようにする。 &#8211; IT戦記のはなしの流れで、だれかがuserChrome.jsに書いたらいいじゃん、と書いていたのを思い出してuserChromeで拡張することにした。
[Ext] userChrome.js 0.8 &#8211; MozillaZine Forumsからダウンロードした。0.8はFirefox3でしか動かないっぽくて、Firefox2のままにしていたWindowsのほうもFirefox3にしちゃった。

更新 2008.2.25
FirebugCommandLineAPIがあるとかないとかでエラーが出ることがあったのでwatchメソッドでオブジェクトが存在するようになるのを待ってから実行する
を組み合わせて使うようにした。

現在のchrome/userChrome.jsはこうなってる。
( function (parentObject, props, f) {
    var fn = props.reduceRight( function (callback, propname) {
        return function (parentObject) {
            if ( parentObject[propname] [...]]]></description>
			<content:encoded><![CDATA[<p>さいきんFirebugでコードを書いている。書いてCtrl-Enterを押した瞬間に結果が確認できるので気持ちがいい。Canvasを使えばグラフィックも扱える。BASICでコードを書く感覚を思い出した。<br />
<!--<br />
extending firebug console add include function<br />
--></p>
<p><img src="http://ido.nu/kuma/wp-content/uploads/2008/02/picture-4-7.png" alt="firebug console" title="firebug console" border="1" height="682" hspace="4" vspace="4" width="809" /></p>
<p>Firebug上では、あんまり長いコードを書くのはつらいところが難点だった。自分で拡張してincludeできるようにしたらこれがすごくいい。Firebug上で実行して動作を確認しながら関数を書いていって、うまく動くようになった時点でincludeしているファイルのほうに移動してFirebugのコマンドラインを空にする。vim上でコードを書いてブラウザに戻ってきてreloadするのにくらべてストレスが少ない。</p>
<p>vim上でコードを書き換えたときもCtrl-Enterでもう一度includeされて実行されるので、リロードは発生しないし、Firefoxとvimとをいったりきたりしなくてもいい。</p>
<p><a href="http://d.hatena.ne.jp/amachang/20071213/1197523826">Firebug を「カクカク化」して $x の第 2 引数でコンテキストノードを指定できるようにする。 &#8211; IT戦記</a>のはなしの流れで、だれかが<code>userChrome.js</code>に書いたらいいじゃん、と書いていたのを思い出してuserChromeで拡張することにした。</p>
<p><a href="http://forums.mozillazine.org/viewtopic.php?t=556229">[Ext] userChrome.js 0.8 &#8211; MozillaZine Forums</a>からダウンロードした。0.8はFirefox3でしか動かないっぽくて、Firefox2のままにしていたWindowsのほうもFirefox3にしちゃった。</p>
<div class="note">
<h4>更新 2008.2.25</h4>
<p><code>FirebugCommandLineAPI</code>があるとかないとかでエラーが出ることがあったので<a href="http://ido.nu/kuma/2008/02/20/waiting-for-an-object-ready/">watchメソッドでオブジェクトが存在するようになるのを待ってから実行する</a><br />
を組み合わせて使うようにした。
</div>
<p>現在の<code>chrome/userChrome.js</code>はこうなってる。</p>
<pre><code>( function (parentObject, props, f) {
    var fn = props.reduceRight( function (callback, propname) {
        return function (parentObject) {
            if ( parentObject[propname] ) {
                var newValue = parentObject[propname];
                callback(newValue);
            } else {
                {
                    parentObject.watch( propname, function ( name, oldValue, newValue ) {
                        callback(newValue);
                        unwatch(parentObject, name);
                        return newValue;
                    } );
                }
            }

        };
    }, f);
    fn(parentObject);
} )(window, ['FirebugCommandLineAPI'], function(newvalue) {
        newvalue.prototype.json2infogami = function (firstarg) {
                var infogamiEscape = function (v) { return v.replace(/([_\*])/g, "\\$1" ) };
                var textfilter = infogamiEscape ;
                var a = (firstarg.constructor.name == "Array") ? firstarg : arguments;
                var r = [];
                   for(var i = 0; i < a.length; i++) {
                                         var siteinfo = "";
                         for ( var n in a[i] ) {
                                var v = a[i][n];
                                siteinfo += n + ":    " + textfilter(v) + "\n";
                  }
                  r.push('<textarea class="autopagerize_data" readonly="readonly">\n' + siteinfo + '\n');
                }
                return r.join("\n\n");
        }

        newvalue.prototype.$x1 = function () {
                var r = this.$x.apply(window.FirebugCommandLineAPI, arguments);
                return r &#038;&#038; r.shift();
}

        newvalue.prototype.include = function (f) {
                try {
                        var file = Components.classes["@mozilla.org/file/local;1"]
                                                .createInstance(Components.interfaces.nsILocalFile);
                        var ssl = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                                                                                 .createInstance(Components.interfaces.mozIJSSubScriptLoader);
                        var ios = Components.classes['@mozilla.org/network/io-service;1']
                                                .getService(Components.interfaces.nsIIOService);

                        this.log = function () {
                                return Firebug.Console.log(arguments);
                        }
                        file.initWithPath(f);
                        var entryURI = ios.newFileURI(file).spec;
                        return ssl.loadSubScript( entryURI, this);
                } catch (e) {
                        Firebug.Console.log(e);
                }

        }
        return newvalue;
} );</code></pre>
<p>はじめこれってウェブページの側からも<code>include</code>できてセキュリティ的にはちょーやばいかもとおもったけど、そんなことはなくて<code>FirebugCommandLineAPI</code>で登録される関数はウェブ側からは見えなくて、コマンドラインを実行しているsandboxからだけ見えるようになってました。ウェブ側から見えるFirebugのオブジェクトは<code>console</code>だけで、なにを追加しようが外側からはみえないので安全みたい。</p>
<p>Firebugのコンソールのコマンド拡張はしばらくはまりそう。</p>
]]></content:encoded>
			<wfw:commentRss>http://ido.nu/kuma/2008/02/19/extending-firebug-console-add-include-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickrの写真をpostする LDRize Minibuffer flickr.share コマンド</title>
		<link>http://ido.nu/kuma/2007/11/30/ldrize-minibuffer-flickrshare-command/</link>
		<comments>http://ido.nu/kuma/2007/11/30/ldrize-minibuffer-flickrshare-command/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 16:19:29 +0000</pubDate>
		<dc:creator>ku</dc:creator>
				<category><![CDATA[Firebug]]></category>
		<category><![CDATA[LDRize]]></category>
		<category><![CDATA[greasemonkey]]></category>

		<guid isPermaLink="false">http://ido.nu/kuma/2007/11/30/ldrize-minibuffer-flickrshare-command/</guid>
		<description><![CDATA[FlickrでLDRizeでピンを立てたものをTumblrにpostするLDRizeのMinibuffer用コマンドです。
ダウンロード
LDRize Mibuffer flickr.share command – Userscripts.orgからどうぞ。
使い方
reblog commandと同じです。Tumblrにpostしたい写真をpでピンを立てていって気が向いたときに
pinned-node &#124; flickr.share

でピンを立てた写真をtumblrにpostすることができます。




Flickr: Photos from kungfootv

ただ、Flickrの仕様上3回リクエストを出さないとtumblrにpostできないためreblog commandに比べて完了までに時間がかかります(5秒くらい?)。焦らずお待ちください。
LDRizeが効くページでは使えると思います。ピンを立てたparagraphの中で一番大きい写真がpostされるようになっています。うまくいかないところがあったら教えてくださいー。
注意点
tumblrにログインしていない、枚数制限を超えているなどの理由でpostに失敗したときでもエラーが出たりしないで成功したことになるのでご注意ください。
Tomblooで使われているnsIXMLHttpRequestのGreasemonkeyバージョンGM_xmlhttpRequestが機能的に貧弱でリダイレクトされてもわからないためです&#8230;
感想
LDRize mibuffer tumblr reblog commandのほうの中身はほとんどShareOnTumblrで出来ているのですが、そのShareOnTumblrはTomblooに吸収されてなくなったのでreblog commandもいいかげんtomblooベースにしないと(コアの部分を自分でメンテナンスしないといけなくなって)めんどくさくなるなーと思いつつ、動くからいいやと思っていました。
FlickrでもtumblrのdashboardみたいにLDRizeでピンを立てていってpostしたいなーと思って、でもpostする部分は既にTomblooで実現されている機能なのでTomblooからちぎって繋げばいける、というわけで行数にして95%をTombloo0.0.9から持ってきています(そのうちの85%はMochiKitのコード)。のこりの5%のうち2%は
Curiosity is bliss: XMLHttpRequest &#8211; Security Bypassで自分で書いたのは250行くらい。
ShareOnTumblrのコードは流用しにくかったけれど、TomblooはTombloo、0.0.7 &#8211; 実用に15日書けてリファクリタングしたと書かれている通り、サービスの抽象化のしかたも(いろんなサービスからデータを読み出して、いろんなサービス(TumblrとFFFFOUND!のふたつ)に書き込むことができます)、非同期処理のハンドリングもほんとうに素晴らしくて、わずかに1行書き換えるだけでそのまま再利用できました。
flickr.share commandの仕事
Tomblooはpostしたいものをマウスを使って(つまりGUIで)選びます。postするものは、基本的にはマウスでクリックされたHTMLの要素(画像とか選択されたテキスト)になります。LDRizeの場合は、ピンを立てるのはページの中にある繰り返し要素のひとつひとつ(paragraph)なので、そのparagraphの中にある何をpostするのかまではわかりません。
flickr.shareは、LDRizeから渡されたparagraphから、一番大きなimg要素を取り出してcontextの中に設定して
Tombloo.Service.share(context, Tombloo.Service.extracters[ 'Photo - Flickr' ]);

を呼び出しているだけです。
FFFFOUND!でもLDRizeでピンを立ててtumblrにpostしたいと思えば'Photo - Flickr'の部分を'Photo - FFFFOUND!'に変えればffffound.shareコマンドができちゃう! わけです。
Tomblooの中には既に31個くらいのデータの読み出し元(と、読み出すときに特定の手続きが必要だったりすることもあるのでその読み出しかた)が定義されているので、こうやってちまちまuser.jsを書くんじゃなくてTomblooの側からGreasemonkeyのsandboxにアクセスする方法でもってMinibufferにコマンドを追加する方向でいこうと思います。
Thanks
LDRize Minibuffer flickr.share command contains following codes. Thanks for the respective developers.

Tombloo 0.0.9 &#8211; 実用
MochiKit &#8211; A lightweight Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>FlickrでLDRizeでピンを立てたものをTumblrにpostするLDRizeのMinibuffer用コマンドです。</p>
<h3>ダウンロード</h3>
<p><a href="http://userscripts.org/scripts/show/15049">LDRize Mibuffer flickr.share command – Userscripts.org</a>からどうぞ。</p>
<h3>使い方</h3>
<p><a href="http://userscripts.org/scripts/show/12305">reblog command</a>と同じです。Tumblrにpostしたい写真を<code>p</code>でピンを立てていって気が向いたときに</p>
<pre><code>pinned-node | flickr.share
</code></pre>
<p>でピンを立てた写真をtumblrにpostすることができます。</p>
<div>
<div>
<img src="http://ido.nu/kuma/wp-content/uploads/2007/11/kungfootv.png" height="654" width="811" border="1" hspace="4" vspace="4" alt="Kungfootv photos" title="Kungfootv photos" />
</div>
<p><a href="http://www.flickr.com/photos/1001/">Flickr: Photos from kungfootv</a>
</div>
<p>ただ、Flickrの仕様上3回リクエストを出さないとtumblrにpostできないためreblog commandに比べて完了までに時間がかかります(5秒くらい?)。焦らずお待ちください。</p>
<p>LDRizeが効くページでは使えると思います。ピンを立てたparagraphの中で一番大きい写真がpostされるようになっています。うまくいかないところがあったら教えてくださいー。</p>
<h4>注意点</h4>
<p>tumblrにログインしていない、枚数制限を超えているなどの理由でpostに失敗したときでもエラーが出たりしないで成功したことになるのでご注意ください。<br />
Tomblooで使われている<code>nsIXMLHttpRequest</code>のGreasemonkeyバージョン<code>GM_xmlhttpRequest</code>が機能的に貧弱でリダイレクトされてもわからないためです&#8230;</p>
<h3>感想</h3>
<p><a href="http://userscripts.org/scripts/show/12305">LDRize mibuffer tumblr reblog command</a>のほうの中身はほとんど<a href="http://d.hatena.ne.jp/brazil/20070708/1183855622">ShareOnTumblr</a>で出来ているのですが、そのShareOnTumblrは<a href="http://d.hatena.ne.jp/brazil/20071127/1196158755">Tombloo</a>に吸収されてなくなったのでreblog commandもいいかげんtomblooベースにしないと(コアの部分を自分でメンテナンスしないといけなくなって)めんどくさくなるなーと思いつつ、動くからいいやと思っていました。</p>
<p>FlickrでもtumblrのdashboardみたいにLDRizeでピンを立てていってpostしたいなーと思って、でもpostする部分は既にTomblooで実現されている機能なのでTomblooからちぎって繋げばいける、というわけで行数にして95%をTombloo0.0.9から持ってきています(そのうちの85%はMochiKitのコード)。のこりの5%のうち2%は<br />
<a href="http://blog.monstuff.com/archives/000262.html">Curiosity is bliss: XMLHttpRequest &#8211; Security Bypass</a>で自分で書いたのは250行くらい。</p>
<p>ShareOnTumblrのコードは流用しにくかったけれど、Tomblooは<a href="http://d.hatena.ne.jp/brazil/20071122/1195712672">Tombloo、0.0.7 &#8211; 実用</a>に15日書けてリファクリタングしたと書かれている通り、サービスの抽象化のしかたも(いろんなサービスからデータを読み出して、いろんなサービス(TumblrとFFFFOUND!のふたつ)に書き込むことができます)、非同期処理のハンドリングもほんとうに素晴らしくて、わずかに1行書き換えるだけでそのまま再利用できました。</p>
<h4>flickr.share commandの仕事</h4>
<p>Tomblooはpostしたいものをマウスを使って(つまりGUIで)選びます。postするものは、基本的にはマウスでクリックされたHTMLの要素(画像とか選択されたテキスト)になります。LDRizeの場合は、ピンを立てるのはページの中にある繰り返し要素のひとつひとつ(paragraph)なので、そのparagraphの中にある何をpostするのかまではわかりません。</p>
<p>flickr.shareは、LDRizeから渡されたparagraphから、一番大きなimg要素を取り出してcontextの中に設定して</p>
<pre><code>Tombloo.Service.share(context, Tombloo.Service.extracters[ 'Photo - Flickr' ]);
</code></pre>
<p>を呼び出しているだけです。</p>
<p>FFFFOUND!でもLDRizeでピンを立ててtumblrにpostしたいと思えば<code>'Photo - Flickr'</code>の部分を<code>'Photo - FFFFOUND!'</code>に変えればffffound.shareコマンドができちゃう! わけです。</p>
<p>Tomblooの中には既に31個くらいのデータの読み出し元(と、読み出すときに特定の手続きが必要だったりすることもあるのでその読み出しかた)が定義されているので、こうやってちまちまuser.jsを書くんじゃなくてTomblooの側から<a href="http://ido.nu/kuma/2007/10/29/privileged-minibuffer-command-dirty-hack/">Greasemonkeyのsandboxにアクセスする</a>方法でもってMinibufferにコマンドを追加する方向でいこうと思います。</p>
<h3>Thanks</h3>
<p>LDRize Minibuffer flickr.share command contains following codes. Thanks for the respective developers.</p>
<ul>
<li><a href="http://d.hatena.ne.jp/brazil/20071127/1196158755">Tombloo 0.0.9 &#8211; 実用</a></li>
<li><a href="http://www.mochikit.com/">MochiKit &#8211; A lightweight Javascript library</a>(Tombloo requires)</li>
<li><a href="http://blog.monstuff.com/archives/000262.html">Curiosity is bliss: XMLHttpRequest &#8211; Security Bypass</a>(to emulating XMLHttpRequest with GM_xmlhttpRequest)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ido.nu/kuma/2007/11/30/ldrize-minibuffer-flickrshare-command/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firebug1.1にするとFirefox3(Gran Paradiso)でFirebugが使える</title>
		<link>http://ido.nu/kuma/2007/11/02/firebug-11-works-on-firefox3-gran-paradiso/</link>
		<comments>http://ido.nu/kuma/2007/11/02/firebug-11-works-on-firefox3-gran-paradiso/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 03:14:56 +0000</pubDate>
		<dc:creator>ku</dc:creator>
				<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://ido.nu/kuma/2007/11/02/firebug-11-works-on-firefox3-gran-paradiso/</guid>
		<description><![CDATA[
補足 2008.5.16
Firefox3beta3くらいからはFirebug Releasesにある1.2alphaしか動きません。

古いはなしですが今日知りました。
Please try Firebug 1.1 on Gran Paradiso (Firefox 3.0) &#8211; Firebug &#124; Google Groups に書かれているとおりでFirebug1.1ならFirefox3でも動きました。時々表示が乱れたり、不安定だったりもしますが使えないよりぜんぜんよし。
ダウンロードはfireclispから。
そのほか細かい変更点もあるみたいです。
Firebug 1.1 (beta) at Michael Sync
HTMLツリーとエレメントの情報が同時に見られるようになったのは地味に便利。


]]></description>
			<content:encoded><![CDATA[<div class="note">
<h3>補足 2008.5.16</h3>
<p>Firefox3beta3くらいからは<a href="http://www.getfirebug.com/releases/">Firebug Releases</a>にある1.2alphaしか動きません。
</div>
<p>古いはなしですが今日知りました。<br />
<a href="http://groups.google.com/group/firebug/browse_thread/thread/b9de7453d66142cb">Please try Firebug 1.1 on Gran Paradiso (Firefox 3.0) &#8211; Firebug | Google Groups</a> に書かれているとおりでFirebug1.1ならFirefox3でも動きました。時々表示が乱れたり、不安定だったりもしますが使えないよりぜんぜんよし。</p>
<p>ダウンロードは<a href="http://fireclipse.xucia.com/#Downloads">fireclisp</a>から。</p>
<p>そのほか細かい変更点もあるみたいです。<br />
<a href="http://michaelsync.net/2007/09/12/firebug-11-beta">Firebug 1.1 (beta) at Michael Sync</a></p>
<p>HTMLツリーとエレメントの情報が同時に見られるようになったのは地味に便利。</p>
<div>
<img src="http://ido.nu/kuma/wp-content/uploads/2007/11/fb11.png" height="403" width="658" border="1" hspace="4" vspace="4" /></div>
]]></content:encoded>
			<wfw:commentRss>http://ido.nu/kuma/2007/11/02/firebug-11-works-on-firefox3-gran-paradiso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FirebugのXPath関連関数でエレメントからXPathを作る</title>
		<link>http://ido.nu/kuma/2007/10/25/tiny-xpath-related-utilities-in-firebug/</link>
		<comments>http://ido.nu/kuma/2007/10/25/tiny-xpath-related-utilities-in-firebug/#comments</comments>
		<pubDate>Thu, 25 Oct 2007 04:39:48 +0000</pubDate>
		<dc:creator>ku</dc:creator>
				<category><![CDATA[Firebug]]></category>
		<category><![CDATA[XPath]]></category>

		<guid isPermaLink="false">http://ido.nu/kuma/2007/10/25/tiny-xpath-related-utilities-in-firebug/</guid>
		<description><![CDATA[AutoPagerize用のXPathをかんたんに作るためのブックマークレット AutoPagerize IDE &#8211; bits and bytesみたいに、ブラウザ上でクリックした要素を表すXPathがほしいことがよくある。perlだったらこないだのXML::LibXML::ElementのnodePathでおしまい。
jsだとFirebugが中にそういうのを持ってる。コンソールに出力されたHTML要素の上にマウスを持っていくと、その要素を表すXPathが表示されるやつ。

extensionからだったらFirebugLib経由で呼び出すことができます。
/**
 * Gets an XPath for an element which describes its hierarchical location.
 */
this.getElementXPath = function(element)
{
    if (element &#038;&#038; element.id)
        return '//*[@id="' + element.id + '"]';
    else
        return this.getElementTreeXPath(element);
};

this.getElementTreeXPath [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://labs.gmo.jp/blog/ku/2007/07/autopagerizexpath_autopagerize_ide.html">AutoPagerize用のXPathをかんたんに作るためのブックマークレット AutoPagerize IDE &#8211; bits and bytes</a>みたいに、ブラウザ上でクリックした要素を表すXPathがほしいことがよくある。perlだったらこないだの<a href="http://ido.nu/kuma/2007/10/15/get-xpath-expression-with-xmllibxmlelement-method-nodepath/">XML::LibXML::ElementのnodePath</a>でおしまい。</p>
<p>jsだとFirebugが中にそういうのを持ってる。コンソールに出力されたHTML要素の上にマウスを持っていくと、その要素を表すXPathが表示されるやつ。</p>
<div><img src="http://ido.nu/kuma/wp-content/uploads/2007/10/xpath.png" height="132" width="316" border="1" hspace="4" vspace="4" /></div>
<p>extensionからだったらFirebugLib経由で呼び出すことができます。</p>
<pre><code>/**
 * Gets an XPath for an element which describes its hierarchical location.
 */
this.getElementXPath = function(element)
{
    if (element &#038;&#038; element.id)
        return '//*[@id="' + element.id + '"]';
    else
        return this.getElementTreeXPath(element);
};

this.getElementTreeXPath = function(element)
{
    var paths = [];

    for (; element &#038;&#038; element.nodeType == 1; element = element.parentNode)
    {
        var index = 0;
        for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling)
        {
            if (sibling.localName == element.localName)
                ++index;
        }

        var tagName = element.localName.toLowerCase();
        var pathIndex = (index ? "[" + (index+1) + "]" : "");
        paths.splice(0, 0, tagName + pathIndex);
    }

    return paths.length ? "/" + paths.join("/") : null;
};
</code></pre>
<p><code>FirebugLib.getElementTreeXPath</code>でノードのXPathが作れます。<br />
これなんで<code>paths.<del>push</del>unshift</code>じゃなくて<code>paths.splice</code>してるんですかね。</p>
<p>で、これだとextension(とかJSActions)からしか呼び出せないのでそういうときは自分で書くしかない。</p>
<pre><code>function xN(xpath, context) {
    var snapshot = document.evaluate(xpath, context, null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
    return snapshot.snapshotLength;
}
function nodePath(node) {
    return ( node != document ? (
        [nodePath(node.parentNode) , node.nodeName ].join('/') +
        "[" + (xN('./preceding-sibling::' + node.nodeName, node) + 1) + "]"
    ) : '');
}
</code></pre>
<p>こんなかんじでいけます。<br />
ノードのpositionを得るのがわりと時間のかかる処理で、FirebugのようにpreviousSiblingをたどって数を数えるよりも、中身がネイティブコードなXPathで数えてもらった方がだいたいの場合(そのノードがfirstChildに近い方だとXPathのオーバーヘッドのほうが大きくなる)早いです。</p>
<p>っていうのは<a href="http://d.hatena.ne.jp/gyuque/20071019">CodeRepos に nobjdb.js 追加 &#8211; 最速チュパカブラ研究会</a>でindexOfがネイティブなぶん早いというのを読んでもしかしてと思って試してみたのでした。</p>
<p>以下は<a href="http://digg.com/">Digg / All News &amp; Videos</a>で測った結果。<code>FirebugLib. getElementTreeXPath</code>と上のXPathでpositionを数えてる<code>nodePath</code>の比較。10,000回実行したときにかかった時間です。</p>
<dl>
<dt><code>//body/DIV[1]/DIV[3]/DIV[1]/DIV[2]/div[15]</code>のノードの場合</dt>
<dd>
<dl>
<dt><code>FirebugLib. getElementTreeXPath</code></dt>
<dd>16545ms</dd>
<dt><code>nodePath</code></dt>
<dd>10687ms</dd>
</dl>
</dd>
<dl>
<dt><code>//body/DIV[1]/DIV[3]/DIV[1]/DIV[2]/div[1]</code>のノードの場合</dt>
<dd>
<dl>
<dt><code>FirebugLib. getElementTreeXPath</code></dt>
<dd>10655ms</dd>
<dt><code>nodePath</code></dt>
<dd>10499ms</dd>
</dl>
</dd>
</dl>
<p>どっちが早いとかいいにくいかんじの結果。</p>
<h3>補足(2007.11.6)</h3>
<p><a href="http://groups.google.com/group/mozilla.dev.tech.dom/tree/browse_frm/month/2006-05?_done=%2Fgroup%2Fmozilla.dev.tech.dom%2Fbrowse_frm%2Fmonth%2F2006-05%3F&amp;">mozilla.dev.tech.dom | Google Groups</a>に自分の<code>position()</code>を得る方法として</p>
<pre><code>   document.evaluate(
     'count(preceding-sibling::*) + 1',
     contextNode,
     null,
     XPathResult.NUMBER_TYPE,
     null
   )

   document.evaluate(
     'count(ancestor-or-self::*)',
     contextNode,
     null,
     XPathResult.NUMBER_TYPE,
     null
   )
</code></pre>
<p>というのが載ってました。<code>*</code>になってるところを自分のタグ名で置き換えればok.</p>
]]></content:encoded>
			<wfw:commentRss>http://ido.nu/kuma/2007/10/25/tiny-xpath-related-utilities-in-firebug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
