<?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>Web scratch</title>
	<atom:link href="http://efcl.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://efcl.info</link>
	<description>フリーソフトやFirefoxなどについて、web全般なサイト</description>
	<lastBuildDate>Thu, 02 Sep 2010 13:23:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>GoogleのJavaScriptコーディングスタイルチェッカー「Closure Linter」</title>
		<link>http://efcl.info/2010/0902/res1917/</link>
		<comments>http://efcl.info/2010/0902/res1917/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 13:18:50 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1917</guid>
		<description><![CDATA[GoogleではJavaScriptは特定のコーディングスタイルで統一されるようにClosure Linterという専用のスクリプトを使用しているそうです。Google JavaScript Style Guide(Go [...]]]></description>
			<content:encoded><![CDATA[<p>GoogleではJavaScriptは特定のコーディングスタイルで統一されるように<a href="http://code.google.com/intl/ja/closure/utilities/index.html">Closure Linter</a>という専用のスクリプトを使用しているそうです。<br /><a href="http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml">Google JavaScript Style Guide</a>(<a href="http://cou929.nu/data/google_javascript_style_guide/">Google JavaScript Style Guide 和訳</a>)という規則に従ってjsのコードは書かれていて、その規則に沿っているかを確認する<code>gjslint</code>とその規則に合うように修正する<code>fixjsstyle</code>からなるスクリプトです。</p>
<h3>インストール方法</h3>
<p><a href="http://code.google.com/intl/ja/closure/utilities/docs/linter_howto.html">How to Use Closure Linter &#8211; Closure Linter &#8211; Google Code</a><br />pythonで書かれているのでeasy_installを使ってインストールします。<br />まずはPythonをインストールしてなかったらインストールして、次にeasy_installコマンドを使うために<a href="http://pypi.python.org/pypi/setuptools">setuptools</a>を自分のPythonにあったものをインストールします。<br />WindowsならC:\Python26\Scriptsに環境パスを通せば、コマンドプロンプトからeasy_installが使えるようになるので、</p>
<pre>&#62; easy_install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz</pre>
<p>と打ってたらインストールできます。(パス通してないならC:\Python26\Scriptseasy_install でも大丈夫)</p>
<p>*注意<br />現在配布されるやつはfixjsstyleが<em>TypeError: &#8216;NoneType&#8217; object is unsubscriptable</em>のようになって動かないので、</p>
<pre>&#62; easy_install -Z http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz</pre>
<p>という感じでファイルを展開するオプションをつけてインストールしてから、/python2.6/site-packages/closure_linter-2.2.1-py2.6.egg/<br />closure_linter/fixjsstyle.py の36行目にargfとなってるtypoiがあるのでそれをargvにすれば動きます。</p>
<h3>使い方</h3>
<p>使い方は単純で<a href="http://code.google.com/intl/ja/closure/utilities/docs/linter_howto.html">How to Use Closure Linter &#8211; Closure Linter &#8211; Google Code</a>を見ると分かりますが、</p>
<pre>gjslint path/to/my/file.js
fixjsstyle path/to/file1.js path/to/file2.js</pre>
<p>のようにファイルやディレクトリを指定して実行するだけです。<br />&#8211;strictオプションやディレクトリに対してまとめてやる再帰オプションもあります。またGoogleのコーディングスタイルではJsDocを使う事になってるので、それを無視するオプションもあります。</p>
<p>fixjsstyleはE4Xとか特殊なものは認識してないっぽいので無理に書けると構文エラーを出すようになったりしますが、<br />Googleのコーディングスタイルはそこまで特殊ではないので、ちょっとした確認に使えたりして便利です。<br />JavaScriptの整形には<a href="http://jsbeautifier.org/">Online javascript beautifier</a>(これ自体がJavaScriptで書かれているのでEmeditorや<a href="http://efcl.info/2010/0816/res1888/">NILScript</a>で動かせる<a href="http://gist.github.com/453042">gist: 453042 &#8211; クリップボードのJavaScriptコードを整形してクリップボードに返すNILScript &#8211; GitHub</a>)とかと併用すると面白いかも。</p>
<dl>
<dt><strong>Introducing Closure Linter &#8211; Closure Tools Blog</strong></dt>
<dd><a title="Introducing Closure Linter - Closure Tools Blog" href="http://closuretools.blogspot.com/2010/08/introducing-closure-linter.html">http://closuretools.blogspot.com/2010/08/introducing-closure-linter.html</a></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0902/res1917/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox3をインストール[設定やアドオンの移行方法]</title>
		<link>http://efcl.info/2008/0515/res187/</link>
		<comments>http://efcl.info/2008/0515/res187/#comments</comments>
		<pubDate>Thu, 15 May 2008 12:31:08 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[Firefox]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[Firefox3]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[アドオン]]></category>
		<category><![CDATA[バックアップ]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=187</guid>
		<description><![CDATA[Firefox3に移行するための準備
バージョンはFirefox2からFirefox 3 Beta 5へ パソコンはWindows Vista
まずはバックアップから
Firefox3をインストールする前に、まずは今使っ [...]]]></description>
			<content:encoded><![CDATA[<p>Firefox3に移行するための準備</p>
<p>バージョンはFirefox2から<a href="http://www.mozilla-japan.org/products/firefox/beta/">Firefox 3 Beta 5</a>へ<br /> パソコンはWindows Vista</p>
<h3><span style="color: #000000; font-size: medium;">まずはバックアップから</span></h3>
<p><strong>Firefox3をインストールする前に</strong>、まずは今使ってるFirefoxのバックアップから開始するべき。<br /> <a href="https://addons.mozilla.org/ja/firefox/addon/2109">FEBE :: Firefox Add-ons</a>で拡張やプロファイルをバックアップしておき、<a href="https://addons.mozilla.org/ja/firefox/addon/2942">CLEO :: Firefox Add-ons</a>でFirefox3に持って行きたいアドオンを固める。<br /> <a href="https://addons.mozilla.org/ja/firefox/addon/2942">CLEO</a>でアドオンを固めたものは<a href="https://addons.mozilla.org/ja/firefox/addon/2942">CLEO</a>を入れたFirefoxでしかインストールできないので注意。</p>
<p>必要なアドオンを選別ための情報</p>
<ul>
<li><a href="http://slashcolon.com/wordpress/?page_id=138">Slashcolon /: » Firefoxアドオン3系対応状況</a></li>
<li><a href="http://bowz.info/1351">主な拡張機能の Firefox 3 対応状況 | Bowz::Notebook</a></li>
</ul>
<p>基本的にはバージョンがあってなくても動く場合の方が多い。(PCに優しいかどうかは置いといて)<br /> タブやブックマーク関係は更新されてないと動かないことが多い。<br /> セキュアなインストールしか受付なくなったので野良アドオンはインストールできないことがある。</p>
<p><a href="http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2007-09-04_addon-security.htm">Latest topics &gt; Firefox 3でのアドオンの自動更新に関する仕様変更（セキュアじゃないアドオンは全部蹴られる件） &#8211; outsider reflex</a></p>
<h3>設定も移行できるものはエクスポート</h3>
<p>Tab mixなど設定や<strong>ブックマーク</strong>などエクスポートできるものはエクスポートしておく。</p>
<h3><span style="font-size: medium;">Firefox3をインストール(まだ起動しない)</span></h3>
<p>それからFirefox3をインストールを開始するが、インストールしてもすぐには起動させないように注意する。<br /> (インストーラー画面でボタン連打は危険)<br /> Firefox２と共存させる場合は</p>
<ul>
<li><a href="http://www.koikikukan.com/archives/2008/04/14-000555.php">小粋空間: Firefox2 と Firefox3（ベータ版）の共存</a></li>
<li><a href="http://www.mozilla-japan.org/products/firefox/beta/">次世代ブラウザ Firefox &#8211; Firefox 3 ベータ版ダウンロード</a></li>
</ul>
<p>をよく見て、プロファイルを別に作るようにしておく。<br /> <strong>まだFirefox3を起動させないように。</strong></p>
<h3><span style="font-size: medium;">パスワードやフォームなどの履歴のコピー</span></h3>
<p>自動的に入力されるパスワードやフォーム履歴を移行したい人は<br /> <a href="http://firefoxhacks.at.webry.info/200801/article_1.html#trackback">新しいプロファイルにデータを移行する Firefox Hacks 翻訳日記/ウェブリブログ</a></p>
<p>をよくみてFirefox2で使っていたプロファイルから新しく作ったプロファイルへコピーする。<br /> プロファイルの場所は以下の通り<br /> C:\Users\(自分のユーザー名)\AppData\Local\Mozilla\Firefox\xxxxxxxx.プロファイル名<br /> （xxxxxxxxの部分には8桁の英数字が入ります）<br /> <a href="http://firefoxhacks.at.webry.info/200801/article_1.html"></a></p>
<p>パスワードの移行は少し複雑なので(上手く認識しなかったりするので)コメント欄に書いてように場合によって少しやり方を変える。<strong><br /> 移行するときにFirefoxは停止してからやらないと上書きされる場合があるので注意。</strong><br /> <strong>まだ一度もFirefox3を起動してない場合</strong><br /> <a href="http://firefoxhacks.at.webry.info/200801/article_1.html#trackback"><br /> </a></p>
<blockquote>
<p>1. インストールしたら「すぐに起動」せず、プロファイルマネージャを起動。 2. 新規のプロファイルを作成。（この時点では signons3.txt は生成されない） 3. Fx 2 のプロファイルから signons2.txt と key3.db をコピー。 4. 新規のプロファイルでおもむろに Fx 3 を起動。 でもいいようです。 3. で history.dat もコピーして、bookmarks.html を上書きコピーしておくと places.sqlite にコンバートしてくれる模様。</p>
</blockquote>
<p><strong>一度Firefox3を起動してしまった場合</strong><br /> <a href="http://firefoxhacks.at.webry.info/200801/article_1.html#trackback"></a></p>
<blockquote>
<p>・起動してプロファイル・フォルダが完成したら終了 ・プロファイル・フォルダから signons3.txt を削除 ・2.0.0.x の signons2.txt と key3.db を 3.0b のプロファイル・フォルダにコピー ・3.0 を起動して、設定を読み込んだ signons3.txt を生成させる ・パスワード設定が有効になっていれば signons2.txt を削除しても構わない</p>
<p style="text-align: left;">
</blockquote>
<p><strong>ブックマーク</strong>はエクスポートしたものをインポートした方が上手くいくので、ここれ移動させるのは微妙かも。</p>
<h3><span style="font-size: medium;">Firefox3を起動してデータの移行</span></h3>
<p>Firefox2とは別のプロファイルから起動して設定をいじっていく。</p>
<p>上で移行したものが反映しているかを確かめてから、アドオンなどをインストールしていく。</p>
<p>まずはアドオンがFirefox3をサポートしてなくても、インストールできるように</p>
<ul>
<li><a href="https://addons.mozilla.org/ja/firefox/addon/6543">Nightly Tester Tools</a></li>
<li><a href="https://addons.mozilla.org/ja/firefox/addon/2109">FEBE</a></li>
</ul>
<p>のどちらかをインストールする。(これらのアドオンはバージョンチェックを無効にすることで無理矢理インストールできる状態を作る。)<br /> 最初に<a href="https://addons.mozilla.org/ja/firefox/addon/2109">FEBE</a>+<a href="https://addons.mozilla.org/ja/firefox/addon/2942">CLEO</a>でアドオンを固めた場合は<a href="https://addons.mozilla.org/ja/firefox/addon/2109">FEBE</a>と<a href="https://addons.mozilla.org/ja/firefox/addon/2942">CLEO</a>をインストールする。</p>
<p><a href="https://addons.mozilla.org/ja/firefox/">Firefox Add-ons</a>で</p>
<p><span style="text-decoration: underline;"><strong>このアドオンは古いバージョンの Firefox 向けです</strong><br /> とでてインストールできない場合は下の方の</span><br /> <span style="text-decoration: underline;"><strong><span class="view">すべてのバージョンを表示</span></strong><br /> というところからいけばインストールできる。(動くかどうか別)</span><br /> そしてアドオンをインストールして行きながら動くかどうかを確かめていく。<br /> <a href="https://addons.mozilla.org/ja/firefox/">Firefox Add-ons</a>に対応しているものがない場合は無理矢理インストールしてみるか、作者のところから作者ページに行き<br /> 最新版があるかを確認してみる。(まだ<a href="https://addons.mozilla.org/ja/firefox/">Firefox Add-ons</a>で公開してない人も多い。)</p>
<h3><span style="font-size: medium;">使ってみての感想</span></h3>
<p>CPUやメモリの使用量については少し減ったかなという感じで、元々量自体はあまり気にしていなかったので、<br /> 気にならないがやはり実行スピード自体はかなり改善されてる印象と体感がある。<br /> Javascriptの実行速度はかなりよくなってる、前とはだいぶ動き自体が違う感じがして重いページでも読み終わるまで<br /> 動けなかったのが、普通にうごけるようになってたりとこれは乗り換えていいと思った。</p>
<p>気になるところは、データ実行防止 (<strong>DEP</strong>)というWindowsの悪質なマルチウェアなどを防止する機能が働いて落ちる事が目立つ。<br /> これはパソコンとの相性やベータ版であることと無理矢理アドオンを動かしてるので、まだ仕方ないかということで無視している。</p>
<p>Firefox2と違うとことしてplaces.sqliteとかurlclassifier3.sqliteによるHDDへの書き込みが頻繁に行われている感じが見られたけど、パフォーマンス自体にはそこまで気にする程度ものでもないかな。</p>
<p>places.sqliteはブックマークのデータベースでFirefox3のPlaces Organizerに関係してるものかな。</p>
<p><a href="http://gigazine.net/index.php?/news/comments/20070913_firefox3_places/">ついにFirefox3の新機能「Places Organizer」の全貌が明らかに &#8211; GIGAZINE</a></p>
<blockquote>
<p>今回発表された「Places Organizer」の画像を見ると、ブックマークだけでなく、ページ閲覧履歴やダウンロードしたファイルの履歴、さらにはサムネイル画像やタグ付けなど、Firefoxに関するもろもろのものを集中管理するための機能というのが正しい位置づけのようです。</p>
</blockquote>
<p>urlclassifier3.sqliteは「攻撃・偽装サイト」のデータベースを、バックグラウンドで頻繁に更新してるので書き込みが見られるみたい。<br /> でも特定のタイミングでやってるのでそこまで気にならない。</p>
<p>もっと詳しく見てみたい人は<a href="http://homepage.mac.com/project_h2/note_class/note_040308a.html">やってもzillaな備忘録</a>にいろいろ書いてある。</p>
<p>まとめると、動きがよくなったはかなりいい感じで全く動かないアドオンは少なく使用していたヤツの一割ぐらいだった。<br /> 次のRCぐらいで安定したら移っても問題ないような気がする。<br /> データ実行防止 (<strong>DEP</strong>)で落ちるは早く改善してもらいたいところ。</p>
<p><span id="trackbacks-link">追記:</span>データ実行防止 (<strong>DEP</strong>)で落ちる原因を調べていたら、Flashのdllが上手く認識してないのが原因かもしれない。</p>
<p><a href="http://as3s.org/archives/2007/10/firefoxflash-player.html">FirefoxでFlash Playerの動作確認 &#8211; AS3S.ORG</a></p>
<blockquote>
<p>FirefoxでFlashの動作確認環境を整備するためのメモ。 以下、基本的にWindowsXP SP2の場合。</p>
</blockquote>
<p>Firefoxは<br /> C:\WINDOWS\system32\Macromed\Flash\<strong>NPSWF32.dll</strong><strong><br /> </strong>をみないで<strong><br /> </strong><strong>C:\Program Files\Mozilla Firefox\plugins\NPSWF32.dll</strong><br /> を見に行くらしいので<strong>C:\Program Files\Mozilla Firefox\plugins\NPSWF32.dll</strong>を確認したら見事になかったので、Flashのフォルダからコピーして入れてみた。</p>
<p>でも、これをする前にflashプレイヤーは動作してたからこれが原因かは不明。</p>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2008/0515/res187/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tomblooのポスト先にはてなダイアリーを追加するパッチ</title>
		<link>http://efcl.info/2010/0825/res1909/</link>
		<comments>http://efcl.info/2010/0825/res1909/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 15:55:59 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[Tombloo]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[はてな]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1909</guid>
		<description><![CDATA[以前からずっと書いて修正していたパッチですが、Tombloo 0.4.11(自動更新はこないので手動でアップデートしましょう)で、はてなダイアリーのユーザー情報取得方法がスクレイピングからhttp://b.hatena. [...]]]></description>
			<content:encoded><![CDATA[<p>以前からずっと<span style="text-decoration: line-through;">書いて</span>修正していたパッチですが、<a href="http://github.com/to/tombloo/downloads">Tombloo </a>0.4.11(自動更新はこないので手動でアップデートしましょう)で、<br />はてなダイアリーのユーザー情報取得方法がスクレイピングから<a title="http://b.hatena.ne.jp/my.name" href="http://b.hatena.ne.jp/my.name">http://b.hatena.ne.jp/my.name</a>のAPIを利用したものに変わったので、<br />はてなダイアリーへのポストができるように修正しました。</p>
<p><span id="more-1909"></span></p>
<p><script src="http://gist.github.com/547176.js?file=model.HatenaDairy.js"></script></p>
<p>rawのリンク上で右クリック、[Tombloo]-[Tomblooパッチのインストール]で簡単インストールできます。<br /><a href="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-25-1.png"><img class="alignnone size-medium wp-image-1910" title="ss-2010-08-25-1" src="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-25-1-300x141.png" alt="" width="300" height="141" /></a><br />インストールすると利用サービスにはてなダイアリーが増えていると思います。<br />はてなブックマークと同じくはてなにログインしてから使用します。</p>
<p>確かその場編集モード を使ってるとポストできないらしいので、ホントはAtomAPIでやった方がよいらしい<br />残骸<a href="http://gist.github.com/354700">gist: 354700 &#8211; GitHub</a></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 83px; width: 1px; height: 1px; overflow: hidden;">&lt;a href=&#8221;http://gist.github.com/354700&#8243;&gt;gist: 354700 &#8211; GitHub&lt;/a&gt;</div>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0825/res1909/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ページ移動時などに音を鳴らすアドオン「KIRISAKE」</title>
		<link>http://efcl.info/2010/0821/res1906/</link>
		<comments>http://efcl.info/2010/0821/res1906/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 05:27:05 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[Jetpack]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[アドオン]]></category>
		<category><![CDATA[拡張機能]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1906</guid>
		<description><![CDATA[またJetpack SDKで1つアドオンを作成してみました。リンクをクリックしてページ移動などの通信が始まった際に、風を切り裂くような音を出すアドオンです。

KIRISAKE :: Add-ons for Firefo [...]]]></description>
			<content:encoded><![CDATA[<p>またJetpack SDKで1つアドオンを作成してみました。<br />リンクをクリックしてページ移動などの通信が始まった際に、風を切り裂くような音を出すアドオンです。</p>
<ul>
<li><a href="https://addons.mozilla.org/ja/firefox/addon/220208/">KIRISAKE :: Add-ons for Firefox</a> ダウンロード先</li>
<li><a href="http://github.com/azu/JetpackSDK/tree/master/KIRISAKE/">KIRISAKE at master from azu&#8217;s JetpackSDK &#8211; GitHub</a> ソースコード</li>
</ul>
<p>作った理由ですが、<br />移動する際に音を出すと、ちゃんとリンクをクリックできたかなどが聴覚的にも認識できるのと、上記のような音を使う事でブラウザが少し早くなったような感じがします(I shallplease)</p>
<p>という後付けの理由があったりしますが、HTML5のAudioタグを使って見たかったというのが第一の要因です。<br />そういう気分になったのは中国のJetpackerのLT資料を見つけて、pageWorkerでhtmlファイルを読み込んでその中でAudioタグを鳴らすというサンプルが載っていたので実践してみました。<br />見つけたLTの資料はこれ<a href="http://www.slideshare.net/littlebtc/jetpack-sdk-the-new-possibility-of-the-extensions-on-browser">Jetpack SDK: The new possibility of the extensions on browser</a></p>
<p>処理的にはたいしたことはやっていませんが、Jetpack SDKにはページ移動(ページを読み込みじゃなくて、通信が始まった瞬間)に反応するAPIはまだないような感じなので、nsIWebProgressを使った普通のFirefox拡張機能と同じように直に書きました。<br />Components.interfacesとか使う必要性が出てくるわけですが、Jetpack SDK0.6からはCiやCcというエイリアスがデフォルトではなくなったので、以下のようにrequireしてから使う必要があります。<br /><a href="https://dev.mozilla.jp/2010/07/jetpack-sdk-0-6/">Jetpack SDK 0.6 がリリースされました « Mozilla Developer Street (modest)</a></p>
<pre>var {Cc, Ci} = require("chrome");
</pre>
<p>ちなみにこのvar {a,b} = obj;みたいな表記は<a href="https://developer.mozilla.org/ja/New_in_JavaScript_1.7#.e5.88.86.e5.89.b2.e4.bb.a3.e5.85.a5">分割代入</a>というJavaScript 1.7からの機能を使ったもので、</p>
<pre>var Cc = require("chrome").Cc , Ci = require("chrome").Ci;
</pre>
<p>というのと同様の意味になります。一部地域ではよく見かけるので覚えておくと便利です。</p>
<ul>
<li><a href="http://nanto.asablo.jp/blog/2009/12/30/4784624">Kanasan.JS Jetpack ワークショップ: Days on the Moon</a></li>
<li><a href="http://d.hatena.ne.jp/mooz/20100729/p1">JavaScript の分割代入まとめ &#8211; mooz deceives you</a></li>
</ul>
<p>参考サイト</p>
<ul>
<li><a href="http://d.hatena.ne.jp/cou929_la/20100301/1267434283">Progress Listenersでロケーションバーのurl変更されたときに何かする &#8211; フリーフォーム フリークアウト</a></li>
<li><a href="http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2007-01-21_splitbrowser-subbrowser.htm">Latest topics &gt; Split Browser開発のよもやま話（6）：分割されたブラウザの作り込み &#8211; outsider reflex</a></li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 108px; width: 1px; height: 1px; overflow: hidden;">Components.interfaces</div>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0821/res1906/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Web Historyに見たページを自動記録するアドオン(Jetpack SDK)</title>
		<link>http://efcl.info/2010/0809/res1872/</link>
		<comments>http://efcl.info/2010/0809/res1872/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 17:16:16 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[Jetpack]]></category>
		<category><![CDATA[アドオン]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1872</guid>
		<description><![CDATA[GoogleにはGoogle &#8211; ウェブ履歴というものがあり、検索してどのページを訪ねたかなどが記録されています。またその記録は検索ページで既読リンクの色にするなどの判定にも使われています。Google検索か [...]]]></description>
			<content:encoded><![CDATA[<p>Googleには<a href="https://www.google.com/history/">Google &#8211; ウェブ履歴</a>というものがあり、検索してどのページを訪ねたかなどが記録されています。<br />またその記録は検索ページで既読リンクの色にするなどの判定にも使われています。<br />Google検索から訪ねたサイト以外のURLもウェブ履歴に登録するFirefox拡張機能を作成してみました。<br />既に</p>
<ul>
<li><a href="http://d.hatena.ne.jp/brazil/20080514/1210767708">Googleウェブ履歴を残すGreasemonkeyスクリプト</a></li>
<li><a href="http://d.hatena.ne.jp/mallowlabs/20080104/1199461216">Opera で Google Web History を使えるようにする UserJS &#8211; mallowlabsの備忘録</a></li>
</ul>
<p>などGreasemonkeyやTomblooパッチなど代わりになる手段は山ほどある気がしますが、<strong>Jetpack SDK</strong>を使いたかったのと、意外にもFirefoxアドオンとして同じ役割するものが見つからなかったので作ってみました。</p>
<p>他のスクリプトとの違いは大して無いと思いますが、できるだけ無駄な送信を控えるようにしています。</p>
<ul>
<li>最近訪れたサイトは重複送信しない(100件ぐらいでクリアされます)</li>
<li><a href="http://outgoing.mozilla.org/v1/62ec45e9d2205ac4d757b771a01ed16cc048d97e/https%3A//">https://はホストのみを送信</a></li>
<li>ローカルやIPアドレスベースのURLの場合は送らない</li>
</ul>
<p>ダウンロードはAMOからできるようにしてあります。<br />Firefoxアドオンのxpiを簡単における場所が無かったので、AMOに登録しておいてあります。</p>
<ul>
<li><a href="https://addons.mozilla.org/ja/firefox/addon/213956/">Google WebHistory Updater :: Add-ons for Firefox</a></li>
</ul>
<p>Jetpack SDKでコンパイル?前のソースコードはこちらに</p>
<ul>
<li><a href="http://github.com/azu/JetpackSDK/tree/master/Google-webhistory-updater/">Google-webhistory-updater at master from azu&#8217;s JetpackSDK &#8211; GitHub</a></li>
</ul>
<h3>Jetpack SDKで何か作るには</h3>
<p>Jetpack SDKで既に<a href="https://addons.mozilla.org/ja/firefox/user/2222641/">3つ</a>ほどアドオンを作成していますが、0.5だとJetpack prototypeとできることはそこまで変わってないです。(prototypeのギャラリー無くなったみたいですね。8個ぐらい作った気がする)<br />Jetpack SDKで作る上で参考にしたのは</p>
<ul>
<li><a href="http://www.xuldev.org/blog/?cat=42">SCRAPBLOG : Jetpack</a> 基礎的なAPIの使い方</li>
<li><a href="http://www.asukaze.net/etc/jetpack/">Jetpack SDK &#8211; あすかぜ・ねっと</a> とても参考になる</li>
<li><a href="https://jetpack.mozillalabs.com/sdk/latest/docs/#guide/getting-started">Jetpack SDK Docs</a></li>
</ul>
<p>最後のJetpack SDK Docsはcfx docsで開いて、jetpack-coreあたりに現在使えるAPIが載っているのでそれを見て使い方を調べるとAPIの使い方は分かる感じ。(Jetpack prototypeの頃よりはドキュメントにサンプルもあってマシになりました)<br />一番ハマるところはcfxとかコマンドでエラーがでるとかその辺だった気がする。<br />環境はWindows Vistaです。<br />cfx testallすら通らない場合は-aとか-bオプションを指定してみるといい。 <a href="http://d.hatena.ne.jp/Cherenkov/20100603/p1">Jetpack SDK 0.4でcfx testallを成功させる方法 (windows) &#8211; Cherenkovの暗中模索にっき</a><br />毎回オプションを付けるのが面倒になったら<a href="http://www.xuldev.org/blog/?p=697">local.json</a>を作りデフォルト値を決めてみましょう。<br />自分はjetpack用のプロファイルを作りそれを指定してます</p>
<pre>{
  "configs": {
    "default": &#91;
      "-a", "firefox",
      "-b", "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
      "-P", "%appdata%\\Mozilla\\Firefox\\Profiles\\h545wqkn.jetpack"
    &#93;,
    "ff37": &#91;
      "-a", "firefox",
      "-b", "C:\\Program Files\\Mozilla Firefox 3.7\\firefox.exe",
      "-P", "C:\\Users\\admin\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\testuser"
    &#93;
  }
}</pre>
<p>package.jsonを作り、libフォルダを作りmain.jsを書いて → さあcfx runで起動しようとしたら、まずはpackage.json内にidが自動生成されます。そしてもう一度cfx runすると下のようなエラーが出てくることがあります。</p>
<pre>Traceback (most recent call last):
  File "D:\jetpack\bin\cfx", line 6, in
    cuddlefish.run()
  File "D:\jetpack\python-lib\cuddlefish\__init__.py", line 475, in run
    include_dep_tests=options.dep_tests
  File "D:\jetpack\python-lib\cuddlefish\packaging.py", line 267, in generate_bu
ild_for_target
    add_dep_to_build(dep)
  File "D:\jetpack\python-lib\cuddlefish\packaging.py", line 254, in add_dep_to_
build
    add_section_to_build(dep_cfg, "lib", is_code=True)
  File "D:\jetpack\python-lib\cuddlefish\packaging.py", line 232, in add_section
_to_build
    validate_resource_hostname(name)
  File "D:\jetpack\python-lib\cuddlefish\packaging.py", line 65, in validate_res
ource_hostname
    raise ValueError('invalid resource hostname: %s' % name)
ValueError: invalid resource hostname: jid0-英数字-フォルダ名-lib</pre>
<p>これはpackage.jsonのnameに<strong>大文字</strong>やマルチバイト文字やスペースなどが含まれていると出てきます。(んなの分かるか)<br />なので小文字英数とハイホンあたりでnameを決めておきましょう。</p>
<p>console.logはコマンドプロンプトの方にでてくるので、それを使って(他に何かあるのかなー)デバッグしながらmain.jsなどを完成させて、xpiをcfx xpiコマンドではき出せば完成です。<br />まだ設定画面やパネルなどのGUIが簡単に使えなかったりしますが、用途が合えば簡単にアドオンを作成できるのでなかなか面白いです。</p>
<dl>
<dt><strong>Google WebHistory Updater :: Add-ons for Firefox</strong></dt>
<dd><a title="Google WebHistory Updater :: Add-ons for Firefox" href="https://addons.mozilla.org/ja/firefox/addon/213956/">https://addons.mozilla.org/ja/firefox/addon/213956/</a></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0809/res1872/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NILScriptの使い方と書き方</title>
		<link>http://efcl.info/2010/0816/res1888/</link>
		<comments>http://efcl.info/2010/0816/res1888/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 05:19:47 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[NILScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[エクスプローラ]]></category>
		<category><![CDATA[クリップボード]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1888</guid>
		<description><![CDATA[NILScriptとはSpiderMonkeyを使ったJavaScriptベースのスクリプト実行環境です。(Windows専用+Wine環境でもある程度)直感的に言うと、WSH + AutoHotKeyみたいな感じという [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lukewarm.s151.xrea.com/nilscript.html">NILScript</a>とはSpiderMonkeyを使ったJavaScriptベースのスクリプト実行環境です。(Windows専用+Wine環境でもある程度)<br />直感的に言うと、WSH + AutoHotKeyみたいな感じというのが分かりやすいかな。<br />できることなど細かい事は<a href="http://lukewarm.s151.xrea.com/nilscript.html">NILScript</a>のページやDocを読んでもらうとして、SpiderMonkey(JavaScript 1.8.1ベース)を使った処理系なのでFirefoxと同じJavaScriptの文法で、エクスプローラでのバッチ処理やキーバインドの変更などWSHやAutoHotKeyで行っていたような事が<strong>JavaScript</strong>で書けます。</p>
<h3>使い方</h3>
<p><a href="http://lukewarm.s151.xrea.com/nilscript.html">NILScript</a>のページからnil.zipをダウンロードして、適当な場所に解凍します。<br />解凍して出てくるng.exe(コンソールあり)とngw.exe(コンソールなし)のどちらかに、NILScriptのスクリプトファイルである*.ngファイルを渡すと実行されます。(WSHだとng = Cscript ,ngw = Wscript みたいな感じ)<br />毎回ng.exeなどにD&amp;Dや引数などでngファイルを渡すのは面倒なので、ngファイルをクリックで実行できるように関連づけを行うinstall.batというのが入っています。実行するとng.exeと*.ngファイルが関連づけされ、クリックで実行できるようになります。<br />(多分レジストリを使うのはここだけ)<br />これで、実行する準備はできたので試しに何かスクリプトを実行してみましょう。<br />自分が作った適当なスクリプトで試してみる。</p>
<ul>
<li><a href="http://gist.github.com/raw/526275/67c3dd182b194beee8c48ceac80a00c0bc5d834d/displayInputKeys.ng">displayInputKeys.ng</a></li>
</ul>
<p><a href="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-16-1.png"><img class="alignnone size-full wp-image-1889" title="ss-2010-08-16-1" src="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-16-1.png" alt="" width="153" height="78" /></a></p>
<p>上のngスクリプトはちっちゃいウィンドウが出てきて押したキー(組み合わせも大丈夫)を表示するだけのスクリプトです。</p>
<ul>
<li><a href="http://gist.github.com/raw/487432/8adefe14ee39f7bb54130c3c4ab55dda731ca011/Twitter_friend_search.ng">Twitter_friend_search.ng</a></li>
</ul>
<p><a href="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-16-2.png"><img class="alignnone size-medium wp-image-1890" title="ss-2010-08-16-2" src="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-16-2-179x300.png" alt="" width="121" height="203" /></a></p>
<p>こっちのngスクリプトは、Twitterで自分がフォローしてる人からユーザー名を検索してコピーするスクリプトです。 <br />初回の起動時はOAuth認証します。(NILScriptで立てた簡易サーバをリダイレクト先にしている)<br />2回目の起動で自分のフォローしてるユーザーのリストを取得してから、ユーザー名を検索するウィンドウを表示します。<br />ユーザー名を途中まで入力して↓キーなどを押せば、入力したユーザー名の所まで飛べます。Ctrl+Cでユーザー名をコピーできます。</p>
<p>このようにngスクリプトを書けば、ローカルで動くものがJavaScriptで書けるので簡単なものを書いたりするのに便利です。<br />特にエクスプローラなどのファイル操作周りはWSHより簡単に書けるので、簡易なバッチ処理を書きやすい。<br />次はngスクリプトの書き方を見ていきます。</p>
<h3>書き方</h3>
<p>ドキュメントはダウンロードしたnilフォルダにdocというフォルダがあり、その中にユニット(機能)毎のドキュメントが書いてあります。<br />いろいろあるので何から見れば良いか迷いますが、まずは_readme.txtを開いてみると、NILScriptには大きく分けて、<br />Base.ng内で定義されているNIL標準クラス・関数 と require()関数で読み込んで使うユニットスクリプトがあることが分かります。<br />簡単言うと、前者はngスクリプトにそのまま書いて使える関数などで、後者はrequire(&#8216;Clipboard&#8217;)のようにユニットスクリプトを読み込んでから使えるようになる関数などが存在するという事です。<br />まずはNIL標準クラス・関数にどんなものがあるかをbase_*.txtなどを軽く見て把握しましょう。<br />眺めているとprintlnなどのよくあるような感じのものからsleepやスレッドやポインタなどのJavaScriptでは扱えないものもあることが分かります。(base_main.txtはよく使う関数があるので必須)<br />正直、まだドキュメントは箇条書き程度で文例などが不足しているので、実際に動かしながら確認する必要がある。<br />(<a href="http://nilscript.blogspot.com/" target="_blank">NILScriptブログ</a>で使い方などの解説も始まったので合わせて読む)<br />必要な機能は必要になったらgrepなどで検索して探すので効率的。</p>
<p>ドキュメントばかり見てもよく分からないので、サンプルファイルを見ながらどういう風に書いているのかを見てみましょう。<br />サンプルはnilフォルダのsampleというフォルダに入っています。<br />NIL標準クラス・関数はそのまま使えるので、ドキュメントや動作を見れば何となく分かってくると思います。<br />ユニットスクリプトを使うものはrequireしてから使う必要があるので、requireの仕方を見てみましょう。<br />例えばsampleのclipboard.ngを見ると、clipboardを扱うためのユニットスクリプトを読み込んでいるのが分かります。(詳細はClipboard.txtに)</p>
<pre class="brush:javascript;">/*
タスクトレイにアイコンを登録して常駐し、
クリップボードの内容が変更された時に、形式に応じた情報を表示します。
*/

Main.createNotifyIcon();// タスクバーにアイコン表示
var Clipboard=require('Clipboard').Clipboard;// ユニットスクリプトを読み込む

Clipboard.observe('change',function(obj){// クリップボードが変化したら動作するリスナー
	if(this.hasFormat('files')){// クリップボードの中身がファイル形式
		var a=this.files,r=&#91;&#93;;
		for(var i=0,l=a.length;i&#60;l;i++){
			r.push(a&#91;i&#93;.name);
		}
		Main.notifyIcon.showInfo(r.join("\n"),this.isMove?"move":"copy");// タスクトレイのアイコンにバルーンメッセージを表示する
	}else if(this.hasFormat('html')){// html形式
		var h=this.html;
		Main.notifyIcon.showInfo(h.fragment,h.url);
	}else if(this.hasFormat('text')){// テキスト形式
		Main.notifyIcon.showInfo(this.text,'text');
	}
});</pre>
<p>上ではvar Clipboard=require(&#8216;Clipboard&#8217;).Clipboard;というようにクリップボードのユニットスクリプトを読み込んで、<br />読み込んだクリップボードスクリプトのClipboardというクラスをClipboardという変数に渡しています。<br />_readme.txtの●ユニットスクリプト機能にも書いてありますが、ユニットスクリプトrequire(&#8220;SomeUnit&#8221;).SomeClass という感じで、<br />多くのものはSomeUnitとSomeClassは同じ名前を持っているので上のような読み込み方法がよく出てきます。<br />他にもユニットスクリプトの使い方はあるので詳しくは<a href="http://nilscript.blogspot.com/2010/08/blog-post_2026.html">NILScript: ユニット(拡張ライブラリスクリプト)の読み込み方法</a>を見ると良いでしょう。(withでやるやり方はWindowでよく使います)</p>
<p>まずはHelloWorldを書いて実行するところから始めて、クリップボードが使いたくなったら関係するサンプルとClipboard.txtを見て作ってみる(それでもよく分からないときはlibフォルダにユニットスクリプトのソースがあるので中身を見てしまうと言うのもあります)</p>
<pre class="brush:javascript;">println("Hellow World");</pre>
<p>サンプルを見ていくと大体雰囲気は使えめると思いますが、まだまだ文例が足りないのでハマる事があります。<br />くだらないものを書いてもどんどん公開して、いろんな書き方が見られるようになるともっと使いやすいものになると思います！</p>
<h3>作例</h3>
<p>というわけで自分が今までに自分が書いたNILScript。</p>
<ul>
<li><a href="http://gist.github.com/401178">gist: 401178 &#8211; NILScript用のスクリプト- GitHub</a><br />コピーする深さを決められるtreeコマンドみたいなもの。<br />一番最初に書いたものなので何かおかしいところがあったり。(フォルダ判定はsizeより、dir.attributes.directoryがフォルダならtrueを返してくれるのでそっちを使いましょう)</li>
<li><a href="http://gist.github.com/425452">gist: 425452 &#8211; 30分ごとにLDRの未読数を表示するNilScript- GitHub</a><br />アイコンとタイマーとHTTP.getText</li>
<li><a href="http://gist.github.com/526275">gist: 526275 &#8211; 押したキーを表示するNILScript- GitHub</a><br />上で紹介していたもの。<br />ウィンドウの表示方法とKeyboard。</li>
<li><a href="http://gist.github.com/453042">gist: 453042 &#8211; クリップボードのJavaScriptコードを整形してクリップボードに返すNILScript &#8211; GitHub</a><br />JavaScriptで実装されたJS Beautifierをそのまま使えるって話</li>
<li><a href="http://gist.github.com/453264">gist: 453264 &#8211; プロセスを起動して落ちるのを待つだけ- GitHub</a><br />サンプルにも似たようなものがあるのでそっちの方が参考になる<br />exeの起動方法</li>
<li><a href="http://gist.github.com/526351">gist: 526351 &#8211; プロセスの起動 &#8211; GitHub</a><br />上と殆ど同じ。プロセスのフルパスはエスケープする必要がある。</li>
<li><a href="http://gist.github.com/454863">gist: 454863 &#8211; NILScriptでXMLHttpRequest的なものを書くテスト- GitHub</a><br />GM_xmlhttpRequestてきな感覚でXHRを書くのをテスト<br />同じインスタンスのリクエストは上から順に実行される?</li>
<li><a href="http://gist.github.com/456001">gist: 456001 &#8211; ファイルの作成して書き込み #NILScript- GitHub</a><br />そのまま。</li>
<li><a href="http://gist.github.com/467939">gist: 467939 &#8211; #NILScript にデフォルト値を入れたものを新規作成- GitHub</a><br />上のを土台にした作ったもの。<br />Greasemonkeyの新規作成ダイアログみたいなもので、// ==NILScript==のようなメタ情報を書いたngファイルを生成する。<br />AutoHotKeyでもそうだったけど、スクリプト単体で配布されることが多いので、後でこれどこで拾ったけ?って事があると思うので、メタ情報はできるだけ入れておいた方がよいと思う。</li>
<li><a href="http://gist.github.com/463430">gist: 463430 &#8211; D&amp;Dしたディレクトリ以下をフラットにする #NILScript- GitHub</a><br />フォルダ(1)内のフォルダ(2)の中身をフォルダ(1)に移動させて、フォルダ(2)を削除
<pre>    フォルダ
    ├fileA
    ├fileB
    └フォルダ&#91;DIR&#93;
     ├fileC
     └fileD
が
    フォルダ
    ├fileA
    ├fileB
    ├fileC
    └fileD</pre>
<p>のようにするスクリプト。複数のフォルダを同時にD&amp;Dしてもできるようにしている。<br />treeコマンドの時よりフォルダの扱いがちゃんとしてるはず。</p>
</li>
<li><a href="http://gist.github.com/485691">gist: 485691 &#8211; #NILScript からTwitterへ投稿- GitHub</a><br />Greasemonkey向けにOAuthラッパを書いてあったので、NILScriptでも動くようにしてみたサンプル。<br />NILscriptでのOAuthについては後ろの方でまた書くのでこれは見る程度で。<br /><a href="http://github.com/azu/OAuth-for-Greasemonkey">azu&#8217;s OAuth-for-Greasemonkey at master &#8211; GitHub</a></li>
<li><a href="http://gist.github.com/487432">gist: 487432 &#8211; 自分のフォローしてる人からユーザー(スクリーン)名を検索する #NILScript- GitHub</a><br />これもOAuth使ったサンプル。<br />OAuth.jsとかも一緒くたにしてるので、分離する方法はまた後ろ</li>
</ul>
<p>&nbsp;</p>
<p>最後の方で出てきた<strong>OAuthをNILScriptで使う方法</strong>。(上のサンプルは無視していいよ)</p>
<ul>
<li><a href="http://gist.github.com/raw/526379/fa17c5da823169bd8d4c6f4f6159ae2cf277b85e/OAuth.ng">OAuth.ng</a> (ライブラリみたいなものです)</li>
</ul>
<p>をダウンロードして、OAuthを使うスクリプト内でinclude(&#8220;OAuth.ng&#8221;);して、後は<a href="http://efcl.info/2010/0610/res1721/">OAuth for Greasemonkeyのラッパーライブラリ | Web scratch</a>とメソッドの使い方は同じ。(xhrは実装してないです)<br />単純なサンプルで、OAuth.ngと同じフォルダに入れて実行するとOAuth認証ができます。</p>
<ul>
<li><a href="http://gist.github.com/526378">gist: 526378 &#8211; OAuth for NILScriptのサンプル- GitHub</a></li>
</ul>
<p>本当はユニットスクリプトやプラグインにした方が良いんだけどやり方がイマイチ分からなかったのでincludeにしてみた。</p>
<h3>まとめ</h3>
<p>良いところ</p>
<p>SpiderMonkeyベースなのでE4Xなども使えて文字列処理がやりやすいので、Firebugなどでマクロ的な文字列処理をしてる人とかJavaScriptで書くならこっちの方が便利かもよ。(JavaScript の新しめの機能(Array の拡張)とかも動くよ)<br />デフォルトで<a href="http://nilscript.blogspot.com/2010/08/hotstrokes.html">マルチストローク対応ホットキー</a>やマウスジェスチャープラグインなどもあるので、AutoHotKeyでよくあるキーバインドを変更するとかもできるよ(自分の設定を公開とかやるといいかも)<br />WSHに比べてファイル操作をするものがかなり書きやすいよ。(base_io.txtを読む)<br />AutoHotKeyと違ってマルチバイト文字列に対応してるのでダメ文字とか日本語書けないとかに悩まされないよ。<br />標準関数やユニットスクリプトなどもNILScriptで書かれているので、ソースを直接読むことができる(この辺、情報不足感といいJetpackによく似てる。requireするとこも)</p>
<p>悪いところ</p>
<p>知名度が少ないので情報が少ない(→作ったものはどんどん公開して欲しい)<br />SpiderMonkeyにはDOM実装はないので、LooseXMLという独自のパーサーになっている。XPathに似た表記で使えたり悪いとは言い切れないけど、普段使うJavaScriptのDOMとはちょっと違うので手間取る。<br />GUIの表現が貧弱。Windowを使う事で基本的なウィンドウは簡単に作れるが、文字サイズなど装飾など細かい事ができない部分も多い。</p>
<p>NILScriptの用途として個人的に使うものを書く場合が多いと思いますが、書いたものをどんどん公開していこうぜ！という感じで〆</p>
<dl>
<dt><a href="http://lukewarm.s151.xrea.com/nilscript.html"><strong>NILScript</strong></a></dt>
<dd>NILScript配布場所</dd>
<dt><a href="http://nilscript.blogspot.com/" target="_blank">NILScriptブログ</a></dt>
<dd>特徴や使用例の紹介記事</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0816/res1888/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ニコニコ動画のAPIまとめ</title>
		<link>http://efcl.info/wiki/niconicoapi/</link>
		<comments>http://efcl.info/wiki/niconicoapi/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 11:47:35 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[ニコニコ動画]]></category>

		<guid isPermaLink="false">http://efcl.info/?page_id=1445</guid>
		<description><![CDATA[ニコニコのマイリスト周りにAPIがいろいろ増えていたので、列挙してみる。  使い方は http://res.nimg.jp/js/nicoapi.js をよく読む。  見方としては
分別
    メソッド名
       [...]]]></description>
			<content:encoded><![CDATA[<p>ニコニコのマイリスト周りにAPIがいろいろ増えていたので、列挙してみる。 <br /> 使い方は http://res.nimg.jp/js/nicoapi.js をよく読む。 <br /> 見方としては</p>
<pre>分別
    メソッド名
        URL(http://www.nicovideo.jp/api/foo/bar　という感じで使う)
            クエリー(それぞれの要素を&amp;でつなげて指定)
    返ってくるもの
</pre>
<p>という感じで書いている。</p>
<dl>
<dt><strong>Cathode Music: ニコニコ動画(9)APIを纏めた</strong></dt>
<dd><a title="Cathode Music: ニコニコ動画(9)APIを纏めた" href="http://tewi.blogspot.com/2009/11/9api.html">http://tewi.blogspot.com/2009/11/9api.html</a></dd>
</dl>
<p>も併せて読む。</p>
<p>書き方の一例(testという名前のマイリストを新規作成する)</p>
<p><a id="ctl00_ContentPlaceHolder1_fvDownloadResults_Hyperlink5" href="javascript:(function(){var%20token=NicoAPI.token;location.href=&quot;http://www.nicovideo.jp/api/mylistgroup/add?name=test&amp;description=&amp;public=1&amp;default_sort=1&amp;icon_id=0&amp;token=&quot;+token;})()">Nico make mylist </a>←のブックマークレットをニコニコ動画上のトークンがあるページで実行する<a id="ctl00_ContentPlaceHolder1_fvDownloadResults_Hyperlink5" href="javascript:(function(){var%20token=NicoAPI.token;location.href=&quot;http://www.nicovideo.jp/api/mylistgroup/add?name=test&amp;description=&amp;public=1&amp;default_sort=1&amp;icon_id=0&amp;token=&quot;+token;})()"><br /> </a></p>
<p>var token = NicoAPI.token;<br /> location.href = &#8220;http://www.nicovideo.jp/api/mylistgroup/add?name=test&amp;description=&amp;public=1&amp;default_sort=1&amp;icon_id=0&amp;token=&#8221;+token;</p>
<p>APIのURLに引数となるクエリーを&amp;区切りでつなげていったURLにアクセスすると正否を表すjsonが返ってくる。<br /> 書き込み権限が必要なAPIにはtokenも必要となる。<br /> tokenはNicoAPI.token = &#8220;xxxxx-xxxxx-xxxxxxxxxxxx&#8221;という感じでページに埋め込まれているので、<br /> Greasemonkeyからならvar  token = unsafeWindow.NicoAPI.token で取得できるはず。</p>
<p>基本的に返ってくるものはjson形式</p>
<p>適当にパラメータの説明</p>
<ul>
<li>item_typeは<span style="text-decoration: line-through;">0であることがほとんどらしい。</span>動画が0、静画が5。</li>
<li>item_idは接頭辞のない数字だけの動画番号を指定する</li>
<li>id_listは id_list[0][]=item_id という感じのパラメータになる</li>
</ul>
<pre>NicoAPI.Deflist
とりあえずマイリスト
    list
    とりあえずマイリストの一覧を取得
        "/api/deflist/list"
	jsonフォーマットで返ってくる

    add
    とりあえずマイリストに追加
        "/api/deflist/add",
    			{ "item_type": item_type,
    			  "item_id": item_id,
    			  "description": description }
	item_typeは接頭辞のない数字だけの動画番号を指定する

    update
    とりあえずマイリストを更新
    	"/api/deflist/update",
    		{ "item_type": item_type,
    		  "item_id": item_id,
    		  "description": description }

    remove
    とりあえずマイリストから削除
        "/api/deflist/delete",
            { "id_list": id_list }
    move
    とりあえずマイリストから移動
        "/api/deflist/move"
    			{ "target_group_id": target_group_id,
    			  "id_list": id_list }
    copy
    とりあえずマイリストからコピー
        "/api/deflist/copy"
            { "target_group_id": target_group_id,
    			  "id_list": id_list }
</pre>
<pre>NicoAPI.MylistGroup
マイリスト
    list
    jsonフォーマットでマイリスト一覧を取得
    マイリストの名前やidなど(中身はNicoAPI.Mylistで)
        "/api/mylistgroup/list"
    get
    指定したマイリストIDの詳細を取得
    listに含まれてるのと同じ内容?
        "/api/mylistgroup/get"
            { "group_id": group_id }
    add
    マイリストを新規作成
        "/api/mylistgroup/add"
			{ "name": name,
			  "description": description,
			  "public": is_public,// 0:非公開 1:公開
			  "default_sort": default_sort,
			  "icon_id": icon_id }
    update
    マイリスト情報を更新
         "/api/mylistgroup/update",
			{ "name": name,
			  "description": description,
			  "public": is_public,
			  "default_sort": default_sort,
			  "icon_id": icon_id }
    remove
    マイリストを削除する
	    "/api/mylistgroup/delete",
	        { "group_id": group_id }
	sort
	マイリストのソートの実行
	マイリスト情報の"default_sort"で指定したソート法でソートし直す
	    "/api/mylistgroup/sort"
	        { "group_id_list": group_id_list }
</pre>
<p>icon_idの指定</p>
<p><a href="http://efcl.info/wp-content/uploads/2009/11/ss-2009-11-12-20-25-10.png"><img class="alignnone size-medium wp-image-1453" title="ss-2009-11-12-20-25-10" src="http://efcl.info/wp-content/uploads/2009/11/ss-2009-11-12-20-25-10-300x48.png" alt="ss-2009-11-12-20-25-10" width="300" height="48" /></a></p>
<p>左から順に0,1,2,3となっていて 数字で指定</p>
<p>default_sortのソート法の指定</p>
<table style="border-collapse: collapse; height: 354px;" border="0" cellspacing="0" cellpadding="0" width="235">
<col style="width: 107pt;" width="143"></col>
<col style="width: 54pt;" width="72"></col>
<tbody>
<tr style="height: 15pt;" height="20">
<td class="xl67" style="height: 15pt; width: 107pt;" width="143" height="20">ソート方法<span> </span></td>
<td class="xl68" style="width: 54pt;" width="72"><span> </span>ID<span> </span></td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl66" style="height: 13.5pt;" height="18">登録が古い順<span> </span></td>
<td class="xl66" style="border-left: medium none;" align="right">0</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">登録が新しい順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">1</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">メモ昇順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">2</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">メモ降順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">3</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">タイトル昇順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">4</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">タイトル降順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">5</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">投稿が新しい順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">6</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">投稿が古い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">7</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">再生が多い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">8</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">再生が少ない順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">9</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">コメントが新しい順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">10</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">コメントが古い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">11</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">コメントが多い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">12</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">コメントが少ない順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">13</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">マイリスト登録が多い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">14</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">マイリスト登録が少ない順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">15</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">時間が長い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">16</td>
</tr>
<tr style="height: 13.5pt;" height="18">
<td class="xl65" style="border-top: medium none; height: 13.5pt;" height="18">時間が短い順<span> </span></td>
<td class="xl65" style="border-top: medium none; border-left: medium none;" align="right">17</td>
</tr>
</tbody>
</table>
<pre>NicoAPI.Mylist
マイリストの動画操作
	list
	指定したマイリストの動画一覧を取得
		"/api/mylist/list",
			{ "group_id": group_id }

	add
	指定したマイリストの動画を加える
		"/api/mylist/add",
			{ "group_id": group_id,
			  "item_type": item_type,
			  "item_id": item_id,
			  "description": description }

	update
	指定したマイリストの動画情報を更新
		"/api/mylist/update",
			{ "group_id": group_id,
			  "item_type": item_type,
			  "item_id": item_id,
			  "description": description }

	remove
	指定したマイリストの動画を削除
		"/api/mylist/delete",
			{ "group_id": group_id,
			  "id_list": id_list }
	id_listの形式
		function make_id_list(item_type, item_id) {
			var id_list = {};
			id_list&#91;item_type&#93; = jQuery.makeArray(item_id);
			return id_list;
		}

	move
	指定したマイリストの動画を別のマイリストに移動
		"/api/mylist/move",
			{ "group_id": group_id,
			  "target_group_id": target_group_id,
			  "id_list": id_list }
	例)

http://www.nicovideo.jp/api/deflist/move?id_list%5B0%5D%5B%5D=動画番号&amp;target_group_id=マイリスト番号&amp;token=トークン

	指定したマイリストの動画を別のマイリストにコピー
	copy
		"/api/mylist/copy",
			{ "group_id": group_id,
			  "target_group_id": target_group_id,
			  "id_list": id_list }</pre>
<pre>NicoAPI.Watchitem
ウォッチリスト
	list
	ウォッチリストの一覧を取得
		"/api/watchitem/list"
	watchitem配列にウォッチリストに登録したユーザー名やIDが入っている

	exist
	ウォッチリストのitem確認
		"/api/watchitem/exist",
			{ "item_type": item_type,
			  "item_id": item_id }

	add
	ウォッチリストに加える
		"/api/watchitem/add",
			{ "item_type": item_type,
			  "item_id": item_id }

	remove
	ウォッチリストから削除する
		"/api/watchitem/delete",
			{ "id_list": id_list }
</pre>
<pre>NicoAPI.Mymemory
マイメモリー
	list
	マイメモリーに入れている動画一覧を取得
		"/api/mymemory/list"

	remove
	マイメモリーからid_listで指定した動画を削除
		"/api/mymemory/delete",
			{ "id_list": id_list }

NicoAPI.Friendlist
フレンドリスト
	list
		"/api/friendlist/list",
			{ "sort": options.sort,
			  "order": options.order,
			  "offset": options.offset,
			  "count": options.count }

	remove
		"/api/friendlist/delete",
			{ "target_user_id": target_user_id }
</pre>
<pre>NicoAPI.Mylistcomment
マイリストコメント
	list
		"/api/mylistcomment/list"
			{ "item_type": item_type,
			  "item_id": item_id }
	nicoapi.jsには書いてないので、この指定方法が正しいか分からない。
	json形式でマイリストが返ってくる
</pre>
<p><span style="text-decoration: line-through;">実際にこのAPIを叩くと<br /> {&#8220;mylistcomment&#8221;:&amp;#91;&amp;#93;,&#8221;status&#8221;:&#8221;ok&#8221;}<br /> のような空が返ってきてしまう。正しく取得する方法があればお知らせ下さい。</span></p>
<pre>	例) sm9 のマイリストコメントを取得

http://www.nicovideo.jp/api/mylistcomment/list?item_type=0&amp;item_id=1173108780

	item_typeは0でないといけないらしい。(動画が0で、静画が5だそうです)
	item_idには接頭辞のない動画番号を指定。
</pre>
<p>例)Greasemonkeyからマイリストコメントのコメントを取得</p>
<pre class="brush:javascript;">getMylistcomments(function(res){
	console.log(res)
});

function getMylistcomments(callback){
	var itemId = document.getElementsByName("thread_id")&#91;0&#93;.value;
	GM_xmlhttpRequest( {
		method : 'GET',
		url : "http://www.nicovideo.jp/api/mylistcomment/list?item_type=0&amp;item_id=" + itemId,
		headers :  {
			'User-Agent' : 'Mozilla/5.0 Greasemonkey; Nico MylistComments'
		},
		onload : function (res) {
			var jsObject = JSON.parse(res.responseText);
			var l = jsObject.mylistcomment.length;
			var result = &#91;&#93;;
			if (jsObject.status == "ok" &amp;&amp; l &#62; 0) {
				for(var i =0;i&#60;l;i++){
					result.push(jsObject.mylistcomment&#91;i&#93;.description)
				}
				callback(result)
			}
		}
	});
}
</pre>
<pre>	remove
		"/api/mylistcomment/delete",
			{ "item_type": item_type,
			  "item_id": item_id,
			  "comment_user_id": comment_user_id }
</pre>
<p>静画関係のAPIはこちらを見た方がよいです。</p>
<dl>
<dt><strong>ニコ動マイリスト系APIまとめ &#8211; あたご型護衛艦日記</strong></dt>
<dd><a title="ニコ動マイリスト系APIまとめ - あたご型護衛艦日記" href="http://d.hatena.ne.jp/aTaGo/20100811/1281552243">http://d.hatena.ne.jp/aTaGo/20100811/1281552243</a></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/wiki/niconicoapi/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>OAuth for Greasemonkeyのラッパーライブラリ</title>
		<link>http://efcl.info/2010/0610/res1721/</link>
		<comments>http://efcl.info/2010/0610/res1721/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 03:33:32 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1721</guid>
		<description><![CDATA[Post Now browsing to TwitterをOAuth認証に対応しました &#124; Web scratchでGreasemonkeyスクリプトの「Post Now browsing   to Twitter」をO [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://efcl.info/2010/0609/res1715/">Post Now browsing to TwitterをOAuth認証に対応しました | Web scratch</a></strong>でGreasemonkeyスクリプトの「<a href="http://userscripts.org/scripts/show/46441">Post Now browsing   to Twitter</a>」をOAuth認証に対応したものを作りました。<br />OAuthのJavaScript実装はいくつかあるみたいですがGreasemonkeyで使う感じになってるものは無かったみたいなので、OAuth.jsを使ったtwitterでのOAuth認証を手助けするラッパーみたいなものを書きました。</p>
<p>xAuthを使えば楽な気もしますがブラウザベースのものはxAuthを使わずに<a href="http://help.twitter.com/requests/982242">OAuthを使ってね</a>との事です</p>
<p>大部分は</p>
<ul>
<li><a href="http://blog.tomatomax.net/archives/2696">TwitterクライアントのOAuth対応(Javascript編) | tomatomax.net</a></li>
<li><a href="http://techno-st.net/2009/11/26/twitter-api-oauth-0.html">Twitter API を OAuth で認証するスクリプトを 0 から書いてみた &#8211; trial and error</a></li>
<li><a href="http://sites.google.com/site/elekmole/twitter4jtop/00-preparation/h-oauth-preparation">H.Basic認証/OAuth認証 (陽昇れども地の底に光届かず)</a></li>
</ul>
<p>を参考に書きました。<br />何となく分かるかも知れませんが、今回扱うアプリはApplication Typeがclientタイプのものです。</p>
<p><a href="http://userscripts.org/scripts/show/78102"><span id="more-1721"></span><br /></a>今回書いたラッパーは以下のOAuthライブラリを簡単に扱うためのものになってます。<br /> OAuth.js<br /> SHA-1.js<br /> <a href="http://code.google.com/p/oauth/source/browse/code/javascript/">http://code.google.com/p/oauth/source/browse/code/javascript/</a> あたりにある。<br /> ラッパーと併せて3つのjsからなりますが、3回も@requireするのは面倒だったので一つのファイルにまとめたソースコードを<strong><a href="http://userscripts.org/scripts/show/78102">OAuth for Greasemonkey for Greasemonkey</a></strong>に置いてあります。<br />OAuth.jsはApache license ver2、SHA-1.jsはBSDライセンスになっています。<br />自分が書いたラッパー部分はMITライセンスとしておきます(基本的に自由に使える)<br />しかし、いつ変更するか分からないので自分で別途保存して@requireする方が良いでしょう。<br />追記: <strong>githubに置いたのでこちらを利用した方がいいと思います</strong></p>
<ul>
<li>
<h4><a href="http://github.com/azu/OAuth-for-Greasemonkey">azu&#8217;s OAuth-for-Greasemonkey at master &#8211; GitHub</a></h4>
</li>
</ul>
<p>以下はラッパー部分だけを抜き出したものです。(2010/08/07現在のソースから)<br /><strong>ここに書いてあるのは古いと思うので上のリンクから適当に見て下さい。</strong></p>
<pre class="brush:javascript;">// TwitterOauth for Greasemonkey
function TwitterOauth(){
    this.initialize.apply(this, arguments);
}
TwitterOauth.prototype = {
    initialize: function(con) {
        var accessor = this.getAccessor();
        if(accessor){
            this.accessor = accessor;
        }else{
            this.accessor.consumerKey = con.consumerKey;
            this.accessor.consumerSecret = con.consumerSecret;
            this.accessor.token = "";
            this.accessor.tokenSecret = "";
        }
    },
    accessor : {
        consumerKey : "",
        consumerSecret: "",
        token: "",// response access_token
        tokenSecret: "", // response access_token_secret
    },
    // temp for request
    request : {
        token :"",// response oauth_token
        tokenSecret: ""// response oauth_token_secret
    },
    // トークンが取得済みかの真偽値を返す
    isAuthorize : function(){
        var accessor = this.accessor;
        if(accessor.consumerKey &amp;&amp; accessor.consumerSecret &amp;&amp; accessor.token &amp;&amp; accessor.tokenSecret){
            return true;
        }else{
            return false;
        }
    },
    getAccessor : function(){
        var accessor = GM_getValue("OAuthAccessor", null);
        if(accessor){
            return JSON.parse(accessor);
        }else{
            return false;
        }
    },
    // 取得したトークンを保存
    saveAccessor : function(){
        GM_setValue("OAuthAccessor",JSON.stringify(this.accessor));
    },
    deleteAccessor : function(){
        var clientInfo = {
            consumerKey: this.accessor.consumerKey,
            consumerSecret: this.accessor.consumerSecret,
        }
        GM_deleteValue("OAuthAccessor");
        this.initialize(clientInfo);
    },
    // 認証ページのURLを取得
    getRequestToken : function(callback){
        var message = {
          method: "GET",
          action: "https://twitter.com/oauth/request_token",
          parameters: {
            oauth_signature_method: "HMAC-SHA1",
            oauth_consumer_key: this.accessor.consumerKey
          }
        };
        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message, this.accessor);
        var target = OAuth.addToURL(message.action, message.parameters);
        var self = this;
        var options = {
          method: message.method,
          url: target,
          onload: function(d) {
            if(d.status == 200){
                var res = d.responseText;
                var parameter = self.getParameter(res);
                self.request.token = parameter&#91;"oauth_token"&#93;;
                self.request.tokenSecret = parameter&#91;"oauth_token_secret"&#93;;
                // requestURLを引数にcallback
                if(callback){
                    callback("https://twitter.com/oauth/authorize?oauth_token="+self.request.token);
                }
            }else{
                alert(d.statusText);
            }
          },
        };
        GM_xmlhttpRequest(options);

    },
    // pinを元にAccess Tokenを取得して保存、callbackにはaccessorオブジェクトを渡す
    getAccessToken : function(pin ,callback) {
        var message = {
          method: "GET",
          action: "https://twitter.com/oauth/access_token",
          parameters: {
            oauth_signature_method: "HMAC-SHA1",
            oauth_consumer_key: this.accessor.consumerKey,
            oauth_token: this.request.token, // Request Token
            oauth_verifier: pin
          }
        };
        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message, this.request);
        var target = OAuth.addToURL(message.action, message.parameters);
        var self = this;
        var options = {
          method: message.method,
          url: target,
          onload: function(d) {
            if(d.status == 200){
                /* 返り値からAccess Token/Access Token Secretを取り出す */
                var res = d.responseText;
                var parameter = self.getParameter(res);
                self.accessor.token = parameter&#91;"oauth_token"&#93;;
                self.accessor.tokenSecret = parameter&#91;"oauth_token_secret"&#93;;
                // Accessorの保存
                self.saveAccessor();
                if(callback){
                    callback(self.accessor);
                }
            }else{
                alert(d.statusText);
            }
          },
        };

        GM_xmlhttpRequest(options); // 送信
    },
    // api+?+query にアクセスした結果をcallbackに渡す
    get : function(api, query, callback) {
        var btquery = (query)? "?"+this.buildQuery(query) : "";
        var message = {
          method: "GET",
          action: api + btquery,
          parameters: {
            oauth_signature_method: "HMAC-SHA1",
            oauth_consumer_key: this.accessor.consumerKey,// queryの構築
            oauth_token: this.accessor.token // Access Token
          }
        };
        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message, this.accessor);
        var target = OAuth.addToURL(message.action, message.parameters);
        var options = {
          method: message.method,
          url: target,
          onload: function(d) {
            if(d.status == 200){
                if(callback){
                    callback(d.responseText);
                }
            }else{
                callback(d.statusText);
            }
          },
        };
        GM_xmlhttpRequest(options); // 送信
    },
    post : function(api, content, callback) {
        var message = {
          method: "POST",
          action: api,
          parameters: {
            oauth_signature_method: "HMAC-SHA1",
            oauth_consumer_key: this.accessor.consumerKey,
            oauth_token: this.accessor.token // Access Token
          }
        };
        // 送信するデータをパラメータに追加する
        for ( var key in content ) {
          message.parameters&#91;key&#93; = content&#91;key&#93;;
        }
        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message, this.accessor);
        var target = OAuth.addToURL(message.action, message.parameters);
        var options = {
            method: message.method,
            url: target,
            onload: function(d) {
                if (d.status == 200) {
                    if (callback) {
                        callback(d.responseText);
                    }
                } else {
                    // typeof d == object
                    callback(d);
                }
            }
        };
        GM_xmlhttpRequest(options); // 送信
    },
    // GM_xmlhttpRequest風に使う
    xhr : function(opts){
        if(!(opts &amp;&amp; opts.url &amp;&amp; opts.method)){
            GM_log("URLまたはメソッドが指定されていません");
            return;
        }
        var message = {
          method: opts.method,
          action: opts.url,
          parameters: {
            oauth_signature_method: "HMAC-SHA1",
            oauth_consumer_key: this.accessor.consumerKey,
            oauth_token: this.accessor.token // Access Token
          }
        };
        // POST - opts.dataは文字列でもオブジェクトでも可能にする
        if(opts &amp;&amp; opts.method.toLowerCase() == "post" &amp;&amp; opts.data){
            if(typeof(opts.data) === "string"){// 文字列からパラメータオブジェクトを作る
                opts.data = this.getParameter(opts.data);
            }
            var content = opts.data;
            if(typeof(content) === "object"){
                for(var key in content) {
                    message.parameters&#91;key&#93; = content&#91;key&#93;;
                }
            }
        }
        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message, this.accessor);
        opts.url = OAuth.addToURL(message.action, message.parameters);// URLを書き換え
        GM_xmlhttpRequest(opts);// 送信
    },
    // utility関数
    // http://kevin.vanzonneveld.net
    urlencode : function (str) {
        str = (str+'').toString();
        return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
                                                                        replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
    },
    // オブジェクトからクエリを生成
    buildQuery : function(formdata, numeric_prefix, arg_separator) {
        // *     example 1: http_build_query({foo: 'bar', php: 'hypertext processor', baz: 'boom', cow: 'milk'}, '', '&amp;amp;');
        // *     returns 1: 'foo=bar&amp;amp;php=hypertext+processor&amp;amp;baz=boom&amp;amp;cow=milk'
        // *     example 2: http_build_query({'php': 'hypertext processor', 0: 'foo', 1: 'bar', 2: 'baz', 3: 'boom', 'cow': 'milk'}, 'myvar_');
        // *     returns 2: 'php=hypertext+processor&amp;myvar_0=foo&amp;myvar_1=bar&amp;myvar_2=baz&amp;myvar_3=boom&amp;cow=milk'
        var value, key, tmp = &#91;&#93;;
        var self = this;
        var _http_build_query_helper = function (key, val, arg_separator) {
            var k, tmp = &#91;&#93;;
            if (val === true) {
                val = "1";
            } else if (val === false) {
                val = "0";
            }
            if (val !== null &amp;&amp; typeof(val) === "object") {
                for (k in val) {
                    if (val&#91;k&#93; !== null) {
                        tmp.push(_http_build_query_helper(key + "&#91;" + k + "&#93;", val&#91;k&#93;, arg_separator));
                    }
                }
                return tmp.join(arg_separator);
            } else if (typeof(val) !== "function") {
                return self.urlencode(key) + "=" + self.urlencode(val);
            } else {
                throw new Error('There was an error processing for http_build_query().');
            }
        };

        if (!arg_separator) {
            arg_separator = "&amp;";
        }
        for (key in formdata) {
            value = formdata&#91;key&#93;;
            if (numeric_prefix &amp;&amp; !isNaN(key)) {
                key = String(numeric_prefix) + key;
            }
            tmp.push(_http_build_query_helper(key, value, arg_separator));
        }

        return tmp.join(arg_separator);
    },
    // Query String から 連想配列を返す
    getParameter: function(str){
      var dec = decodeURIComponent;
      var par = {}, itm;
      if(typeof(str) == 'undefined') return par;
      if(str.indexOf('?', 0) &#62; -1) str = str.split('?')&#91;1&#93;;
      str = str.split('&amp;');
      for(var i = 0; str.length &#62; i; i++){
        itm = str&#91;i&#93;.split("=");
        if(itm&#91;0&#93; != ''){
          par&#91;itm&#91;0&#93;&#93; = typeof(itm&#91;1&#93;) == 'undefined' ? true : dec(itm&#91;1&#93;);
        }
      }
      return par;
   }
};
</pre>
<p>OAuth認証を手助けすることを目的に書いたので、アクセストークンを使って実際にAPIをたたく部分のTwitterOauth.getやTwitterOauth.postは適当です。<br />ラッパーの動作自体はそこまで難しい事はやってないので、<strong>OAuth認証の手順を理解する方が大切</strong>です。<br /><a href="http://dev.twitter.com/apps">Twitter Applications | dev.twitter.com</a> から自分の作成するGreasemonkeyをnew appから登録しておきます。<br />Application TypeはClientならPINコードを使うタイプ、Browserなら認証したときにリダイレクトするURLを決めてそのURLでアクセストークンを受け取れます。今回は<strong>ClientタイプつまりPINコードを使う方法</strong>です。</p>
<div id="attachment_1745" class="wp-caption alignnone" style="width: 310px"><a href="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-10-4.png"><img class="size-medium wp-image-1745" title="sshot-2010-06-10-4" src="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-10-4-300x284.png" alt="" width="300" height="284" /></a><p class="wp-caption-text">登録でClientを選ぶ</p></div>
<p>ユーザーにPINコードをコピーさせてそれを入力させるという動作が、普通のWebサービスではあまり見ない流れだと思います。このラッパーでやっているOAuth認証の流れを簡単に図にするとこんな流れです。(Browserタイプよりユーザーの負担が大きい)</p>
<p><a href="http://efcl.info/wp-content/uploads/2010/06/4853f6fc7d7316c872b273d972580a55.png"><img class="aligncenter size-medium wp-image-1724" title="シーケンス図0" src="http://efcl.info/wp-content/uploads/2010/06/4853f6fc7d7316c872b273d972580a55-270x300.png" alt="" width="270" height="300" /></a>もっとコアの流れをみるなら<a href="http://d.hatena.ne.jp/furyu-tei/20090929/1254225568">OAuthのやり取りを読み取ってみる &#8211; 風柳メモ</a> とか</p>
<p>実際にGreasemonkeyでやってる動画 <a href="http://www.youtube.com/watch?v=8oXTuZk5xAk">YouTube &#8211; Post Now browsing to Twitter for Greasemonkey</a><br />かなり大雑把な流れなので詳しくは他のサイトを参照して下さい。<br />基本的にはトークンなどを元にしてOAuth.jsのOAuth.SignatureMethod.signでシグネチャを作成して、それを元に新たなトークンを受け取ってまたOAuth.SignatureMethod.signでシグネチャを作るみたいな繰り返しです。<br />最終的にAPIを叩く際に必要なものがアクセストークンとなります。</p>
<ol>
<li>リクエストトークンとリクエストトークンシークレットをもらいに行く。(タイムスタンプとconsumerKeyで一意な情報を元にする)</li>
<li>もらってきたリクエストトークンを使って認証ページのURLを作る。<br />(https://twitter.com/oauth/authorize?oauth_token= + リクエストトークンが認証ページのURL)</li>
<li>ユーザーに認証の動作を行ってもらう。</li>
<li>認証するとPINコードが表示されるので、ユーザーにPINコードをコピーしてアプリに入力してもらう。</li>
<li>入力してもらったPINコードを元にアクセストークンとアクセストークンシークレットをもらいに行く。(アクセストークンがAPIにたたくときに必要となるものです。リクエストトークンは認証時に必要となるだけなので使い捨てです。)</li>
<li>アクセストークンをもらったら保存して完了。</li>
</ol>
<p>実際にラッパーを使った大筋の流れとして、まずラッパーを呼び出して各自のアプリ情報を渡して初期化します。</p>
<pre class="brush:javascript;">// http://dev.twitter.com/apps に書いてある。
var clientInfo = {
    name: 'アプリ名',
    consumerKey: '各自アプリ',
    consumerSecret: '各自アプリ',
}
// TwitterOauthにクライアント情報を渡してnewする(必須)
var tw = new TwitterOauth(clientInfo);
</pre>
<p>そして、tw.isAuthorize() で既にアクセストークンを持っているかを調べられる(持ってたら直ぐにAPIをたたける)ので、持っていなかったらリクエストトークンをもらいに行きます。</p>
<pre class="brush:javascript;">if(tw.isAuthorize()){// まだ認証していない
    tw.getRequestToken(callback);
    // callbackに渡る引数は認証ページのURL
}
</pre>
<p>getRequestTokenのcallback関数には認証ページのURLが渡るので、それを元にユーザーにそのページに行ってもらいアプリのOAuth認証してPINコードをコピーしてきてもらいます。<br />PINコードを入力してもらう必要があるので、適当な入力エリアを作っておく必要もあります。</p>
<pre class="brush:javascript;">// アクセストークンをもらいに行く。
// アクセストークンを取得できたら自動で保存処理を行っています。
// callbackにはaccessor(アクセストークンなどが入ったオブジェクト)を渡しますが、使い道は…
tw.getAccessToken(callback);
// 取得したアクセストークンを捨てたいときは
// tw.deleteAccessor() で破棄できます。
</pre>
<p>アクセストークンを取得して保存できたらOAuth認証は完了です。<br />アクセストークンを持っていればAPIをたたけるので、tw.get、tw.postを使ってAPIを叩きます。</p>
<pre class="brush:javascript;">   // get第二引数はクエリになるオブジェクトを渡す
   // 以下はapi?q=oauth&amp;per_page=5 となる。
    var query = {
        q : "oauth",
        per_page : 5
    }
    // get : function(api, query, callback)
    tw.get("http://api.twitter.com/1/users/search.json" , query ,function(res){
        if(typeof res != "object"){// Twitterのエラー時はリスポンスのオブジェクトをそのまま返すため
            console.log(res); // firebug
        }
    })
</pre>
<pre class="brush:javascript;">    // postはそのまま何も工夫がない。
    var content = {status: "update test", source: clientInfo.name};
    tw.post('http://twitter.com/statuses/update.json', content ,function(){
        console.log(res); // firebug
    });
</pre>
<p><a href="http://apiwiki.twitter.com/Twitter-API-Documentation">Twitter API Wiki / Twitter API Documentation</a> を参考に使う。<br />HTTP MethodがGETならそのクエリになるようにAPIのURLとクエリオブジェクトをtw.getに渡す。<br />HTTP MethodがPOSTなら、APIのURLにcontentとなるオブジェクトを渡す。という感じでかなり適当な作りをしています。<br /><a href="http://code.google.com/p/twigadge/source/browse/trunk/js/twigadge.js">twigadge</a> のようにもう少し機能別に作った方が使いやすくなると思います。</p>
<p>以上で説明のようなそうでないものは終わりですが、以下に簡単なサンプルGreasemonkeyを置いてあります。</p>
<ul>
<li><a href="http://gist.github.com/418274">GreasemonkeyでOAuth認証を手助けするライブラリとそのサンプル</a><br />(猿アイコンのユーザースクリプトから認証とget、postのテストができます。できれば自分のconsumerKeyとか使ってね。)</li>
</ul>
<p><strong>追記</strong></p>
<p>新たにxhrというメソッドを追加しました。(上記ならtw.xhr({})みたいな使い方)<br />xhrメソッドはGM_xmlhttpRequestと同じようにオプションのオブジェクトを引数にとって、APIと通信します。<br />GM_xmlhttpRequestをラップしているので、感覚的にはGM_xmlhttpRequestと同じ感じで使えると思います。<br />一つサンプル</p>
<p><script src="http://gist.github.com/511308.js?file=twitter%20OAuth%20test.user.js"></script></p>
<p>// ↓↓↓↓Your Script↓↓↓↓ の所までがOAuth認証のパネルを作ったりするテンプレート的なものです。<br />OAuth認証が済んでない（tw.isAuthorize()==false)なら途中でreturnされるので、既存コードの上部に<em>// ClientInfomation</em> から <em>// ↓↓↓↓Your Script↓↓↓↓</em>までをコピペして、API周りを修正すれば簡単にOAuth認証に対応できます。(できる限り自分の登録したアプリのclientInfoを使って下さい)<br />当たり前ですが、その時@requireでOAuth.jsの3点セットを読み込んでおいて、インストールし直す必要があります(<strong>@requireが動作するのはインストール時のみ</strong>)<br />APIを叩くときにOAuth認証で得たアクセストークンからシグネチャを作る必要があるので、GM_xmlhttpRequestでそのままAPIを叩いたままでは通りません。そこで今回追加したxhrメソッドの出番です。<br />Getメソッドの場合だとGM_xmlhttpRequestをtw.xhrに変更するだけで既存のコードは通ると思います。<br />POSTメソッドもGM_xmlhttpRequestをxhrメソッドに変えるだけで大体通ると思います。<br />GM_xmlhttpRequestだとdata部分は文字列で書くので、そのまま&#8221;foo=fizz&amp;bar=bazz&#8221;と書く方法と下のようにオブジェクト書く方法が使えます。(オブジェクトの方が効率がいい)</p>
<pre>data : {
    foo:fizz,
    bar:bazz,
}</pre>
<p>サンプルは猿アイコンを右クリックからでるユーザーコマンドで、xhrのそれぞれgetとpostをテストする関数が動作するだけです。</p>
<p>以下リンクまとめ</p>
<p>ライブラリの置き場所。こっちが多分一番新しい。</p>
<dl>
<dt><strong>azu&#8217;s OAuth-for-Greasemonkey at master &#8211; GitHub</strong></dt>
<dd><a title="azu's OAuth-for-Greasemonkey at master - GitHub" href="http://github.com/azu/OAuth-for-Greasemonkey">http://github.com/azu/OAuth-for-Greasemonkey</a></dd>
</dl>
<dl>
<dt>実際にラッパーを使ったGreasemonkey</dt>
<dt><strong>Post Now browsing to Twitter for Greasemonkey</strong></dt>
<dd><a title="Post Now browsing to Twitter for Greasemonkey" href="http://userscripts.org/scripts/show/46441">http://userscripts.org/scripts/show/46441</a></dd>
</dl>
<dl>
<dt>上のGreasemonkeyで使ってるラッパーライブラリとかをまとめたもの</dt>
<dt><strong>OAuth for Greasemonkey for Greasemonkey</strong></dt>
<dd><a title="OAuth for Greasemonkey for Greasemonkey" href="http://userscripts.org/scripts/show/78102">http://userscripts.org/scripts/show/78102</a></dd>
</dl>
<p>&nbsp;</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 6332px; width: 1px; height: 1px;">HTTP MethodがGETならそのクエリになるようにAPIのURLとクエリオブジェクトをtw.getに渡す。</div>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0610/res1721/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Googleのマルチアカウント機能を有効化する方法</title>
		<link>http://efcl.info/2010/0804/res1862/</link>
		<comments>http://efcl.info/2010/0804/res1862/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 14:27:58 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[webサービス]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[設定]]></category>

		<guid isPermaLink="false">http://efcl.info/?p=1862</guid>
		<description><![CDATA[GmailやGoogle CalendarなどGoogleのサービスを、複数のアカウントで同時に使えるようになるMultiple Sign-In機能がリリースされたようなので使って見ました。現在は以下のサービスでマルチア [...]]]></description>
			<content:encoded><![CDATA[<p>GmailやGoogle CalendarなどGoogleのサービスを、複数のアカウントで同時に使えるようになる<a title="Googleの複数アカウントの使い分けが再ログイン不要になる–Multiple Sign-In機能" rel="bookmark" href="http://jp.techcrunch.com/archives/20100803gmail-multiple-accounts/">Multiple Sign-In機能</a>がリリースされたようなので使って見ました。<br />現在は以下のサービスでマルチアカウントがつかえるようです。</p>
<ul>
<li>Calendar</li>
<li>Code</li>
<li>Gmail</li>
<li>Reader</li>
<li>Sites</li>
</ul>
<p>有効化する方法は<a href="http://www.google.com/support/accounts/bin/answer.py?hl=en&amp;answer=181599">Enabling multiple sign-in : Getting started &#8211; Accounts Help</a>に書いてあります。<br />簡単に有効化する手順を書くと</p>
<ol>
<li><a href="https://www.google.com/accounts/b/0/ManageAccount">アカウント情報</a>を英語のインターフェースにする。<br />英語にしないと有効化できてないような気がします。<br />自分は<a href="http://www.google.co.jp/ig/settings">iGoogle の設定</a>から言語をEnglishにすることで変更できました。<br /><a href="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-04-1.png"><img class="alignnone size-medium wp-image-1863" title="ss-2010-08-04-1" src="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-04-1-300x134.png" alt="" width="300" height="134" /></a></li>
<li><a href="https://www.google.com/accounts/MultipleSessions" target="_blank">multiple sign-in settings page</a> へprimary(主)となるアカウントでアクセスする</li>
<li>有効化を選んでチェックボックスに全部✓をいれてSaveする(この状態だと英語の説明文がでますが)<br />既に日本語訳もあったりしました。<br /><a href="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-04-2.png"><img class="alignnone size-medium wp-image-1864" title="ss-2010-08-04-2" src="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-04-2-300x204.png" alt="" width="300" height="204" /></a></li>
<li>Saveしたら一度Googleからログアウトします。</li>
<li>Google Readerなどのマルチアカウントが使えるサービスにログインし直すと、右上のアドレス部分に▼がついてので、そこから&#8221;別のアカウントでログイン&#8221;をクリックすると別のアカウントでもログインでき、一度ログインすれば切り替えも同じ所からできます。<br /><a href="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-04-3.png"><img class="alignnone size-medium wp-image-1865" title="ss-2010-08-04-3" src="http://efcl.info/wp-content/uploads/2010/08/ss-2010-08-04-3-300x94.png" alt="" width="300" height="94" /></a></li>
</ol>
<p>Multiple Sign-Inは複数のアカウントの切り替えが簡単というだけじゃなくて、同時に複数のアカウントでログインできるので2つのタブで2つのアカウントを同時に使うなどが行えます。</p>
<p>人によってはまだ使えないかも知れません。Gmailが上手くできなかった…<br />でも<a href="http://userscripts.org/scripts/show/16341">Google Account Multi-Login for Greasemonkey</a> みたいなGreasemonkey使わなくてもいいのでとても便利。</p>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/2010/0804/res1862/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ニコニコ動画用Greasemonkeyスクリプトのまとめ</title>
		<link>http://efcl.info/wiki/niconico_greasemonkey/</link>
		<comments>http://efcl.info/wiki/niconico_greasemonkey/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 01:39:38 +0000</pubDate>
		<dc:creator>azu</dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[アドオン]]></category>
		<category><![CDATA[ニコニコ動画]]></category>

		<guid isPermaLink="false">http://efcl.info/wiki/niconico_greasemonkey/</guid>
		<description><![CDATA[GreasemonkeyとはFirefoxで利用できるアドオン。 ニコニコ動画利用できるGreasemonkeyスクリプトのまとめたものです。

ニコニコ動画のコメント熱狂度を可視化するGreasemonkeyスクリプト [...]]]></description>
			<content:encoded><![CDATA[<p>GreasemonkeyとはFirefoxで利用できるアドオン。<br /> ニコニコ動画利用できるGreasemonkeyスクリプトのまとめたものです。</p>
<ul>
<li><a rel="nofollow" href="http://blog.fulltext-search.biz/pages/visualize-comments-upsurge-greasemonkey-script-for-nicovideo">ニコニコ動画のコメント熱狂度を可視化するGreasemonkeyスクリプト</a></li>
</ul>
<p>ニコニコ動画の各動画に、コメントの盛り上がり度合いをサーモグラフィーの色合いで表示するGreasemonkeyスクリプトです。 弾幕やコメント職人の出現位置が一目で分かります。 Wrapperと併用版もあります。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://cureblack.com/20070810.html#p01">ニコニコ動画にアクセスしている時間をカウントするGreasemonkeyスクリプト</a></li>
</ul>
<p><a href="http://cureblack.com/20070810.html#p01"> </a>タイトル通りの機能を持ちます。 画面右下に時間のカウントを表示します。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://d.hatena.ne.jp/togeinu/20070907">NicoCommandButton ニコニコ動画コマンド入力ボタン</a></li>
</ul>
<p>動画の下にコメント色変更ボタンを追加します。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://d.hatena.ne.jp/kotas/20070925/playlist">ニコニコ動画でプレイリストが使える Greasemonkey スクリプト</a></li>
</ul>
<p>ニコニコ動画でプレイリストが使える Greasemonkey スクリプト。 <br /> ランキングの動画を連続再生したり、きまぐれ検索でランダム再生したりできます。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://d.hatena.ne.jp/kotas/20080110/favlist">ニコニコ動画でマイリストの新着を知る Greasemonkey スクリプト</a></li>
</ul>
<p>ニコニコ動画のトップページに、好きなマイリストの新着動画を表示します。 <br /> 投稿者の公開マイリストに登録ボタンがあります。 マイリストのRSSリーダーみたいなものです。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://m035.blog61.fc2.com/blog-entry-66.html">ニコニコ動画サイズ変更+画質向上ブックマークレット</a></li>
</ul>
<p>動画サイズ変更、および低画質動画の画質を向上します。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://castor.s26.xrea.com/products/greasemonkey/nicovideo_additional_mylist.html">ニコニコ動画に拡張マイリストを追加するGreasemonkeyスクリプト</a></li>
</ul>
<p>ニコニコ動画で登録数に制限のないマイリストを利用可能にするGreasemonkeyスクリプトです。 <br /> とても便利なGreasemonkeyスクリプトで、動画再生画面に拡張マイリストへの追加ボタンが現れます。 <br /> 拡張マイリストは<strong>タグ</strong>で管理でき、動画へのメモ書きもできます。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://d.hatena.ne.jp/spiritloose/20071116/1195220145">ニコニコ動画の一覧画面でポチポチとマイリストに追加するGreasemonkey</a></li>
</ul>
<p>ニコニコ動画の一覧画面でマイリストへの一発登録ボタンが表示されます。 動画再生画面にいかなくてマイリストへの追加ができます。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://d.hatena.ne.jp/authorNari/20071007/1191751102">にこ☆さうんどでMP3抽出ずみキャッシュを表示するブックマークレット</a></li>
</ul>
<p>にこ☆さうんど経由でニコニコ動画のMP3抽出ずみキャッシュを表示するブックマークレット。 <a href="http://nicosound.dip.jp/help.aspx#bookmarklet">変換ブックマークレット版</a></p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a rel="nofollow" href="http://wktklabs.blog98.fc2.com/blog-entry-1.html">NicoWatch Tools　-　けっこう多機能なスクリプト。</a></li>
</ul>
<p>ニコニコ動画観覧ページに以下の機能を追加します。<br /> ①FLVファイルダウンロード ②MP3ダウンロード(<a href="http://www.nicomimi.com/">nicomimi &#8211; にこみみ -</a>との連携) ③XML(コメントデータ)ダウンロード ④コメント内キーワード/ユーザーID検索 ⑤コメント内リンク抽出 ⑥フィルター逆探知(フィルターによって変わるワードが分かります。)</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://blog.fulltext-search.biz/articles/2008/01/29/re-mata-samune">twitterに張られたニコニコのリンクをサムネ(というかiframe)展開するぐりもん </a></li>
</ul>
<p>タイトルそのままなぐりもん</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://blog.fulltext-search.biz/articles/2007/12/29/nicomment-cloud">ニコニコ動画のコメントをタグクラウドっぽく表示するぐりもん「Nicomment Cloud」をつくりました</a></li>
</ul>
<p><a href="http://blog.fulltext-search.biz/articles/2007/12/29/nicomment-cloud"> </a>タグクラウドを追加する<br /> <a title="tagnico.jpg" href="http://efcl.info/wp-content/uploads/tagnico.jpg"><img src="http://efcl.info/wp-content/uploads/tagnico.thumbnail.jpg" alt="tagnico.jpg" /></a></p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a class="title" href="http://script41self.seesaa.net/article/80648996.html">nicovideo taglinker<br /> </a></li>
</ul>
<p><span class="title">ニコニコのタグに他の動画のIDが入ってるときにそのタグをクリックすると、</span>「もしかしてsm******をお探しですか？」とステップをとばして 直接飛ぶグリモン。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a class="title" href="http://script41self.seesaa.net/article/73226087.html">Nico Nickname </a></li>
</ul>
<p>動画のうｐ主のニックネームを表示するGMスクリプト 修正して、<a rel="nofollow" href="http://www.nicochart.jp/">ニコニコチャート</a>と連携させているバージョン →<a title="Permalink to  [Greasemonkey]ニコニコ動画でニックネームを表示" rel="bookmark" href="http://efcl.info/2007/1229/res14/">ニコニコ動画でニックネームを表示</a></p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://maps.smartnetwork.co.jp/blog/taxonomy/term/4">だれでもコメ職人</a></li>
</ul>
<p>コメントをコマンド的に増やす事ができます。 だれでもコメ職人は、ニコニコ動画に投稿するコメントを装飾するツールです。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://muumoo.jp/news/2007/09/08/0nicommentlinks.html">ニコニコ動画のコメントの中から、動画IDやURLっぽいやつを抽出するGreasemonkeyスクリプト</a></li>
</ul>
<p>タイトルそのままのグリモンです。 サムネ表示と表示位置を少しかえたバージョン <a title="Permalink to  ニコニコ動画のコメントの中から、動画IDやURLっぽいやつを抽出するGreasemonkeyスクリプト(自分仕様)" rel="bookmark" href="http://efcl.info/2008/0119/res20/">→ニコニコ動画のコメントの中から、動画IDやURLっぽいやつを抽出するGreasemonkeyスクリプト(自分仕様)</a></p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://d.hatena.ne.jp/Sore_0/20080127/1201444608">ニコニコ動画の一覧ページで強調表示するGreasemonkey + ニコニコ動画プレイリスト追加機能</a></li>
</ul>
<p>マーキングとプレイリスト機能のグリモン</p>
<ul>
<li><a href="http://d.hatena.ne.jp/kotas/20080306/customtabs">カテゴリタブを好きな順番にする Greasemonkey スクリプト</a></li>
</ul>
<p>カテゴリの順番を自分の好みで変える。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/Sore_0/20080305#1204738095">はてブページの動画に付加情報を入れる</a></li>
</ul>
<ul>
<li><a href="http://d.hatena.ne.jp/Sore_0/searchdiary?word=%2a%5bGreasemonkey%5d">ニコニコ動画へのリンクからサムネイル情報を取得するGreasemonkey </a></li>
</ul>
<p>ニコニコの動画へのリンク(sm～～)の上のマウスを乗せると動画情報をポップアップする。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/AOI-CAT/20080226/1204035593">選択範囲内にあるニコニコ動画の情報を取得するGreasemonkey</a></li>
</ul>
<p>上のグリモンに似ていて、選択範囲で指定すると同じように情報をポップアップする。</p>
<ul>
<li><a href="http://togeinu.googlepages.com/nicocolorfilter">NicoColorFilter 0.0.1 ニコニコ動画色コメフィルタ</a></li>
</ul>
<p><a href="http://togeinu.googlepages.com/nicocolorfilter"> </a>ニコニコ動画の動画の下に色つきコメントを削除するボタンを追加します。 shita +水色など色とコマンドを組み合わせたものをフィルタする事ができる。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/togeinu/20070907/1189098100">NicoCommandButton ニコニコ動画コマンド入力ボタン &#8211; アンビバノンノン</a></li>
</ul>
<p>再生画面の下にコマンドを補助するボタンが追加されます。</p>
<ul>
<li><a href="http://www.oti-orz.mydns.jp/%7Ekhiker/">ニコニコ動画に動画の FLV ファイルとコメントをダウンロードするリンクを付与 &amp; コメントをその場で表示</a></li>
</ul>
<p>FLV&amp;XMLダウンロードと再生画面で   コメントをその場で表示することもできる。というか,<br /> この表示の方が力を入れてる. コメント表示で表示されるのは,<br /> No., 書込時刻, 暗号化されたユーザID, コメント それぞれの項目はソートして表示することができる(ユーザIDでソートなど)</p>
<ul>
<li><a href="http://andre-garden.com/blog/2008/03/greasemonkey_1.html">Andre&#8217;s garden &#8211; ニュータイプっぽくニコニコ動画の一覧から動画を先読みするGreasemonkey</a></li>
</ul>
<p>動画リンク横にできるボタンをクリックすると画面遷移することなしに動画をポップアップで起動できるようになります。 そのページを見ながら動画を見ることができる。</p>
<ul>
<li><a href="http://script41self.seesaa.net/article/90974190.html"> ニコニコ動画のコメントのネタバレの可能性を表示するスクリプト</a></li>
</ul>
<p>&#8220;ネタバレ&#8221;,&#8221;ねたばれ&#8221;などの文字列がコメントに存在するときに、それを促すメッセージを出す。</p>
<ul>
<li><a href="http://script41self.seesaa.net/article/90503970.html"> 悪質な投稿者の動画を検索結果から消す(非表示にする)スクリプト</a></li>
</ul>
<p>検索結果をフィルタリングする。ただニックネームのみの判断なので被っていた場合もフィルタされる。</p>
<ul>
<li><a href="http://note.openvista.jp/247/#tea0d5e">RSS Link for ニコニコ動画</a></li>
</ul>
<p>タグなどの検索ページに<a href="http://zio3.net/nicoRss/">ニコRSS ニコニコ動画/RSS配信</a>を利用したRSSへのリンクを追加する。</p>
<ul>
<li><a href="http://www.copytr.net/wikis/16">GreaseMonkey スクリプト &#8211; Wiki &#8211; コピトレ</a></li>
</ul>
<p>ニコニコ動画の動画ページのタイトル近くに、該当するコピトレの情報ページへのリンクを追加するスクリプト</p>
<ul>
<li><a href="http://22century.cute.bz/app/">thumbcatch.user.js</a></li>
</ul>
<p>ランキングでサムネイルだけを表示する<br /> 。 <a title="thumbcatch.jpg" href="http://efcl.info/wp-content/uploads/thumbcatch.jpg"><img src="http://efcl.info/wp-content/uploads/thumbcatch.thumbnail.jpg" alt="thumbcatch.jpg" /></a></p>
<ul>
<li><a href="http://blog.libelabo.jp/2008/01/29/niconico-sample-inserter/">Libelablog » どこでもニコニコ動画のサンプルを貼り付けるGreasemonkeyスクリプト（Autopagerize対応）</a></li>
<li><a href="http://userscripts.org/scripts/show/21909">Google Reader Subscribers Count – Userscripts.org</a></li>
</ul>
<p>マイリストのところにgoogle readerの登録数を表示する。</p>
<ul>
<li><a href="http://eclipse.cspc.jp/perma/000263/">ニコニコ動画の再生画面で登録済みマイリストを表示するGreaseMonkey | METAMATE</a></li>
</ul>
<p>マイリストにすでに登録してある場合にそれを示唆する表示をする。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/shiroica/20080331/1206991712">ニコニコ動画のコメントのランダム方向スクロール用グリモンスクリプト &#8211; shiroicaの日記</a></li>
</ul>
<p>エープリルフールを味わう。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/Constellation/20080405/1207403013">GetNicovideoInfoCommand &#8211; 枕をそばだてて聴く</a></li>
</ul>
<p>MinibufferのCommandを追加する。 up主の名前を表示とミニプレーヤを利用したもの</p>
<ul>
<li><a href="http://nicovideo.g.hatena.ne.jp/snsn9pan/20080226/1204002367">アッハ計測グリモン</a></li>
</ul>
<p><a href="http://www.nicograph.jp/">にこぐらふ</a>に似ている機能をグリモンで [w]をカウントする</p>
<ul>
<li><a href="http://itmst.blog71.fc2.com/blog-entry-90.html">Electronic Genome &#8211; ニコ動でプレーヤ部分まで自動スクロールさせるスクリプト</a></li>
</ul>
<p>プレイヤーの位置まで画面をスクロールさせる。</p>
<ul>
<li><a href="http://cureblack.com/20070831.html">野ログはノロキュアMaxHeart &#8211; twitterをGreasemonkeyから使いやすくするCGI , ニコニコ動画の最近見た動画を超パワーアップさせるGreasemonkey</a></li>
</ul>
<p>Twitteに自動で見た動画をつぶやく。普段とは別のIDにもログインしないで利用できます。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/25917">nicovideo Add Stars to Tags &#8211; Userscripts.org </a></li>
</ul>
<p>ニコニコ動画の動画再生ページで、アップロード者がロックしたタグに★をつけます。 タグの更新ボタンもつきます。</p>
<ul>
<li><a href="http://blog.endflow.net/?p=62&amp;lang=ja">NicoVideo Auto Play: ニコニコ動画で次の動画を自動再生するGreasemonkeyスクリプト | endflow.net blog</a></li>
</ul>
<p>「～Part2」「～その5」みたいにシリーズ化されている動画を次々と自動再生してくれるグリモンです。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/gifnksm/20080523/1211570361">ニコニコ動画で，タグ荒らしからの復旧を補助するGreasemonkeyスクリプト</a></li>
</ul>
<p><a href="http://www.nicotag.jp/">ニコタグ</a>からのデータを使い荒らされたタグを復旧できる。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/26307">nicovideo Add nicotag link </a></li>
</ul>
<p><a href="http://www.nicotag.jp/">ニコタグ</a>へのリンクをニコニコ動画の動画再生ページと検索画面上に表示します。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/28910">nicovideo Thumbinfo popup</a></li>
</ul>
<p>動画へリンク上にマウスオーバーしたときに動画情報をポップアップする。<a href="http://d.hatena.ne.jp/Sore_0/searchdiary?word=%2a%5bGreasemonkey%5d">ニコニコ動画へのリンクからサムネイル情報を取得するGreasemonkey</a>とほとんど同じですが、ポップアップのサイズをその場で変えられるなど細かな違いがあります。  <a name="1204889784" href="http://subtech.g.hatena.ne.jp/motemen/20080307/1204889784"></a></p>
<ul>
<li><a name="1204889784" href="http://subtech.g.hatena.ne.jp/motemen/20080307/1204889784">ニコニコ動画のサムネイルをクリックしたらその場にプレーヤーを表示する</a></li>
</ul>
<ul> <a href="http://coderepos.org/share/browser/lang/javascript/userscripts/add-nicovideo-thumbnail-and-player-to-delicious.user.js?">add-nicovideo-thumbnail-and-player-to-delicious.user.js</a>を使えばdeliciousでもサムネクリックで見ることができる。</p>
<p><br class="spacer_" /></p>
<p><br class="spacer_" /></p>
<p><br class="spacer_" /></p>
<p><br class="spacer_" /></p>
<li><a href="http://userscripts.org/scripts/show/27771">NicoDic Link Editor Names</a></li>
</ul>
<p>ニコニコ大百科の編集履歴画面で，編集者の投稿した動画一覧(ニコチャート)へのリンクを張ります。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/29801">NicoVideo Stats – Userscripts.org</a></li>
</ul>
<p>再生ページにコメント率とマイリスト率を表示する。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/30237">nicovideo Synchronized Fullscreen – Userscripts.org</a></li>
</ul>
<p>ブラウザのウインドウを全画面表示にしたとき，同時に動画プレイヤーも全画面表示にします。 Firefox3専用。</p>
<ul>
<li><a href="http://subtech.g.hatena.ne.jp/mala/20080615/1213492297">ニコニコ動画で日本語入力できない人のためのGreasemonkeyスクリプト</a></li>
</ul>
<p>プレイヤーとは別にコメント入力欄を追加します。(Macで入力できなくなるバグ向けに作成?)</p>
<ul>
<li><a href="http://d.hatena.ne.jp/gifnksm/20080625/1214358591">ニコニコ動画で動画説明文を改行したりリンクを張ったりするスクリプト </a></li>
</ul>
<p>動画説明文で，スペースが連続しているところで改行する 動画説明文中のURLにリンクを張る</p>
<ul>
<li><a href="http://d.hatena.ne.jp/nastack/20080727/1217172263">「音量注意」タグのついた動画の音量を下げておくuser.js</a></li>
</ul>
<p>タグに「音量注意」が含まれていた場合に音量を下げてくれます。</p>
<ul>
<li><a href="http://fuktommy.com/niconico/">JKScroll</a></li>
</ul>
<p>タグ検索などの動画一覧画面でキーボードでスクロールします。 LDRIZEの簡易版といった感じ。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/31426">nicovideo Show All Ranks</a></li>
</ul>
<p>ニコニコ動画のランキングページで、マイリスト・コメント・再生数のランキングを同時に表示</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/32955">delicious video thumbnail – Userscripts.org</a></li>
</ul>
<p>delicious に youtube とニコニコ動画のサムネイルを表示します。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/yuyarin/20080830/1220057085">ニコニコ動画のランキング内でソートするGreasemonkeyスクリプト &#8211; yuyarinの日記</a></li>
</ul>
<p><a href="http://www.nicovideo.jp/ranking/view/hourly/all" target="_blank">ニコニコ動画(夏)のランキングページ</a>で結果の動画を、順位、動画の長さ、投稿日時、再生数、コメント数、マイリスト数、でソート</p>
<ul>
<li><a href="http://d.hatena.ne.jp/tumo300-500/20080811/1218457236">Greasemonkey &#8211; だらだらとだらだら</a></li>
</ul>
<p>NiconicoRankingNew ニコニコのランキングで指定した時間以内に投稿された動画を優先して表示する  NiconicoMylistDiff マイリストで表示される動画に、前回マイリストでその動画を見たときとの差を表示するスクリプト。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/32512">nicodanmakudic – Userscripts.org</a></li>
</ul>
<p>コメント入力を補助するGreasemonkey。 定型文を登録して入力欄に選択したものを入力できる。</p>
<ul>
<li><a href="http://script41self.seesaa.net/article/106627828.html">++ Script for oneself ++: ニコニコ動画のメニューバーに、mylistへのリンクを追加するGreasemonkeyスクリプト</a></li>
</ul>
<p>マイリストのプルダウンが追加される。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/nokturnalmortum/20080802/1217633913">ニコニコ動画のプレイヤーにフォーカスしないようにするグリモン。 &#8211; 地獄の猫日記</a></li>
</ul>
<p>Flashのプレイヤーにフォーカスしないようになる。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/30845">NicoVideo Quality Config – Userscripts.org</a></li>
</ul>
<p><span class="external text">Flashプレーヤーの画質設定を自動変更する</span></p>
<ul>
<li><a href="http://d.hatena.ne.jp/yuyarin/20081004/1223124531">ニコニコ動画のランキング内でソートできるGreasemonkeyスクリプトに絞り込み機能をつけてみた &#8211; yuyarinの日記</a></li>
</ul>
<p>ランキングで絞り込み検索ができる。</p>
<ul>
<li><a href="http://orera.g.hatena.ne.jp/miya2000/20081005/p0">ニコニコ動画のプレイヤーをキーボードで操作する user.js &#8211; m2O &#8211; チーム俺等</a></li>
</ul>
<ul>
<li><a href="http://d.hatena.ne.jp/Azr_pp/20090101/1230755467">詳細情報・メニューを表示したり、タグを編集しても、プレイヤーの位置がズレないようにするニコニコ動画用Greasemonkeyスクリプト &#8211; (ββ)対応版 &#8211; Az++.log</a></li>
</ul>
<p>*  動画のタイトルを最初からすべて表示する * 詳細情報・メニューが以下のように動画の右側に表示される  <strong> </strong></p>
<ul>
<li><a href="http://d.hatena.ne.jp/Cyario/20081225/1230214551">NicoStopper</a></li>
</ul>
<p>・ニコニコ動画を見ている間ブラウザの左下にカウンタが付きます。<br /> ・1日1時間しかニコニコ動画を見る事ができなくなり、時間を有意義に使えるようになります。</p>
<ul>
<li><a href="http://script41self.seesaa.net/article/106627828.html">ニコニコ動画のメニューバーに、mylistへのリンクを追加するGreasemonkeyスクリプト</a></li>
</ul>
<p>ニコニコ動画のメニューバーの位置に自分の全てマイリストをセレクトボックスから直接移動できるようになります。<br /> マイリストページでは5つまでしか一覧に表示されないので多数のマイリストを保持している方には便利。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/15048">ニコニコ動画 タイトル書き換え(タブブラウザ用)</a></li>
</ul>
<p>ニコニコ動画のWebページタイトルを変更します。<br /> トップページは「ニコ」に変更し，その他は「ニコニコ動画(*)-」の表示を消します。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/41650">NicoVideo Multiple Tag Search Tool</a></li>
</ul>
<p>ニコニコの再生ページでタグにチェックボックスを付けて複数のタグについて組み合わせ検索が行えます。</p>
<ul>
<li><a href="http://tetetep.blog112.fc2.com/blog-entry-449.html">ニコニコのマイページにもニコニコ広告を反映させるグリモン</a></li>
</ul>
<p>マイページの投稿動画一覧に広告を反映させるGreasemonkeyスクリプト</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/44343">Niconico Economy Quality</a></li>
</ul>
<p>常にエコノミーになるGreasemonkey</p>
<ul>
<li><a href="http://d.hatena.ne.jp/compartmentism/20090414/1239718308">NicoRankingKidokuDelete</a></li>
</ul>
<p>ランキングページで，任意の動画を縮小、訪問済みを判定、宣伝コメント部分を省略</p>
<ul>
<li><a href="http://d.hatena.ne.jp/Azr_pp/20090624/1245847072">プレイヤーの位置に関するニコ動ββ用Greasemonkeyスクリプト with jQuery &#8211; Az++.log</a></li>
</ul>
<p>自動スクロール</p>
<ul>
<li><a href="http://script41self.seesaa.net/article/122132932.html">++ Script for oneself ++: ニコニコ動画のマイリスト検索をしやすくするGreasemonkeyスクリプト</a></li>
</ul>
<p>公開マイリストを検索するフォームを設置する。<br /> 仕組み:<a href="http://d.hatena.ne.jp/favril/20090624/1245821161">ニコニコ動画の公開マイリスト検索(/openlist/sm****)は、AND検索もOR検索もNOT検索もできるっぽい &#8211; 超自己満足プログラミング</a></p>
<ul>
<li><a href="http://userscripts.org/scripts/show/48046">NicoVideo Post to SBM with selected tags for Greasemonkey</a></li>
</ul>
<p>再生ページでタグを選択して、コメント付けてはてなブックマークかdeliciousにポストする。(クロスポストも可能)                 <br /> 選択したタグを検索</p>
<ul>
<li><a href="http://hextomino.tsukuba.ch/e25795.html">ニコニコのタグをプレビューするスクリプト | Hextomino</a></li>
</ul>
<p>リンク上にマウスオーバーでタグをプレビューする</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/48300">Popup Nico Dict for Greasemonkey</a></li>
</ul>
<p>ニコニコ大百科のキーワードをマウスオーバーでポップアップ</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/50859">Nico load ratio for Greasemonkey</a></li>
</ul>
<p>ページタイトルに動画のロード量を表示します。                 <br /> wrapperのタイトルをいじると同様の機能</p>
<ul>
<li><a href="http://itmst.blog71.fc2.com/blog-entry-175.html">Electronic Genome &#8211; ニコニコ動画でプレーヤ部分まで自動スクロールするスクリプト改良版『nicoscroll2』</a></li>
</ul>
<p>再生ページで自動的にスクロールする<br /> Firefox+Greasemonkey / Chrome / Sleipnir+SeaHorse / Opera / IE+Trixie / IE+IE7Pro / Safari(Mac)+GreaseKitに対応</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/51762">NicoVideo MyList RSS</a></li>
</ul>
<p>現在見ている動画ページ内にある全てのマイリストの RSS フィードを動的にページ内に挿入します。<br /> マイリストページに移動しなくてもその場で RSS 登録できます。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/50639">NicoNicoPlaylist mod</a></li>
</ul>
<p><a href="http://d.hatena.ne.jp/Sore_0/20080127/1201444608">マーキング　＋　プレイリスト</a>のmodバージョン。<br /> マルチプレイリスト、自動再生など様々な機能が追加されている。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/33754">nicovideo Show registrated message</a></li>
</ul>
<p>現在動画を見ているアカウントのマイリストへの登録状況をチェックできます。             <br /> 他のアカウントのマイリストもチェック対象に追加可能。</p>
<ul>
<li><a href="http://blog.guron.net/2009/09/13/680.php">GRN blog » 新プレイヤー対応ニコニコ動画補助スクリプト</a></li>
</ul>
<p>コメント入力の補助、動画のダウンロード、投稿者名の表示</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/58168">nicovideo comment modify</a></li>
</ul>
<p>ニコニコ動画の動画再生ページやランキング、検索結果などに表示される動画説明文中の連続するスペースを改行や削除します。<br /> またURLやメールアドレス、動画ページ（ID+数字）などを示す文字列があった場合にそれをリンクにします。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/57753">Nico search filter</a></li>
</ul>
<p>ニコニコのキーワード/タグ検索の結果をフィルタリングする。<br /> 投稿者説明文の全文と投稿者名を取得し、検索結果の情報にそれを付け加える。             <br /> 上で取得した情報に対して正規表現を用いたフィルタリングを行う。</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/57388">Nico play length coloring</a></li>
</ul>
<p>ニコニコ動画の検索結果の再生時間をカラーリングして分ける。</p>
<ul>
<li><a href="http://orera.g.hatena.ne.jp/miya2000/20091010/p0">nicovideo_wnp<br /> </a></li>
</ul>
<p>高機能な連続再生プレイヤー。<br /> wnp はニコニコ動画をポップアップウィンドウで再生するプレイヤーです。<br /> 全画面表示やプレイリストの連続再生を行うことができます。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/kenmaz/20100210/1265818897">すでに見たランキング動画をかくす君</a></li>
</ul>
<p>ニコ動のランキングページから既に見た動画を隠すユーザスクリプト</p>
<ul>
<li><a href="http://d.hatena.ne.jp/ronekko/20100131/1264933532">Nicovideo &#8211; Direct Link from Tag</a></li>
</ul>
<p>ニコニコ動画でタグがsm******やURLを含む場合に直接開けるようにするGreasemonkey</p>
<ul>
<li><a href="http://d.hatena.ne.jp/favril/20100127/1264570618">nico_sort.user.js</a></li>
</ul>
<p>ニコ動の検索設定(ソート順)を保存するGreasemonkeyスクリプト</p>
<ul>
<li><a href="http://d.hatena.ne.jp/aTaGo/20100112/1263285275">ニコニコ動画の検索ページに共起タグクラウドを表示するChrome用ユーザスクリプト</a></li>
<li><a href="../2010/0113/res1531/">ニコニコ動画のマイリストページに共起タグクラウドを表示するGreasemonkey</a></li>
</ul>
<p>ページ内の動画についている全ての<span class="keyword">タグ</span>を収集し、<span class="keyword">タグクラウド</span>状に表示</p>
<ul>
<li><a href="http://d.hatena.ne.jp/h1mesuke/20100108/p1">ニコニコ動画の検索結果をフィルタリングする Greasemonkeyスクリプト</a></li>
</ul>
<p>正規表現や閾値をもちいたフィルタリングを行うGreasemonkey</p>
<ul>
<li><a href="http://d.hatena.ne.jp/mount-root-yy/20091129/1259490349">ニコニコ動画外部プレイヤーとYouTube埋め込みプレイヤーをテキストリンクに変換するGreasemonkey</a></li>
</ul>
<ul>
<li><a href="http://userscripts.org/scripts/show/80942">Nico Comment Viewer for Greasemonkey</a></li>
</ul>
<p>ニコニコ動画のプレイヤーからコメントを取得して表示</p>
<ul>
<li><a href="http://userscripts.org/scripts/show/58168">nicovideo comment modify for Greasemonkey</a></li>
</ul>
<p>ニコニコ動画の動画説明文などに含まれる連続するスペースを改行にURLをリンクへ変換</p>
<ul>
<li><a href="http://d.hatena.ne.jp/shibason/20100315/1268655146">ニコニコ大百科とピクペディアで相互にリンクをはるGreasemonkeyスクリプト &#8211; しばそんノート</a></li>
</ul>
<ul>
<li><a href="http://d.hatena.ne.jp/ronekko/20100131/1264933532">ニコニコ動画でタグがsm******やURLを含む場合に直接開けるようにするGreasemonkeyスクリプト &#8211; ろ日記</a></li>
</ul>
<p>タグにURLがある場合は直接リンクにする</p>
<ul>
<li><a href="http://d.hatena.ne.jp/h1mesuke/20100108/p1">ニコニコ動画の検索結果をフィルタリングする Greasemonkeyスクリプト &#8211; Alone Like a Rhinoceros Horn</a></li>
</ul>
<p>検索結果をいろいろなパターンでフィルタリング。</p>
<ul>
<li><a href="http://d.hatena.ne.jp/hecomi/20100730/1280499442">ニコニコ動画でキーボードショートカットを使えるようにするgreasemonkeyスクリプト &#8211; 凹みTips</a></li>
</ul>
<p>LDRizeのようなキーボード操作をする</p>
<ul>
<li><a href="http://d.hatena.ne.jp/gifnksm/20100729/1280429284">ニコニコ動画の「キーワードを含むタグ検索」に大百科アイコンを表示させるGreasemonkeyスクリプト &#8211; なんとなく目記</a></li>
</ul>
<ul>
<li><a href="http://d.hatena.ne.jp/aTaGo/20100712/1278915935">ニコニコ動画の検索画面に「もしかして：」を表示するユーザスクリプト &#8211; あたご型護衛艦日記</a></li>
</ul>
<p>検索にGoogleのもしかしての結果も表示</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 6198px; width: 1px; height: 1px;">ニコ動のランキングページから既に見た動画を隠すユーザスクリプト</div>
]]></content:encoded>
			<wfw:commentRss>http://efcl.info/wiki/niconico_greasemonkey/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  efcl.info/feed/ ) in 3.46885 seconds, on Sep 3rd, 2010 at 6:08 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Sep 3rd, 2010 at 7:08 am UTC -->