<?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 &#187; twitter</title> <atom:link href="http://efcl.info/tag/twitter/feed/" rel="self" type="application/rss+xml" /><link>http://efcl.info</link> <description>フリーソフトやFirefoxなどについて、web全般なサイト</description> <lastBuildDate>Sat, 14 Apr 2012 15:37:26 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <item><title>twicliの設定とプラグインのメモ</title><link>http://efcl.info/2011/0303/res2341/</link> <comments>http://efcl.info/2011/0303/res2341/#comments</comments> <pubDate>Thu, 03 Mar 2011 00:32:50 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[webサービス]]></category> <category><![CDATA[Firefox]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[ブラウザ]]></category> <category><![CDATA[設定]]></category><guid
isPermaLink="false">http://efcl.info/?p=2341</guid> <description><![CDATA[ずっとメインで使っているTwitterブラウザクライアントのtwicliの設定メモ twicliはブラウザで動くのでUnified Sidebarを使ってサイドバーに縦置きタブバーと一緒に表示しています。サイドバーへの表 [...]]]></description> <content:encoded><![CDATA[<p>ずっとメインで使っているTwitterブラウザクライアントの<a
title="twicli" href="http://twicli.neocat.jp/index.html">twicli</a>の設定メモ</p><p>twicliはブラウザで動くので<a
title="Unified Sidebar" href="http://piro.sakura.ne.jp/xul/_unifiedsidebar.html">Unified Sidebar</a>を使ってサイドバーに縦置きタブバーと一緒に表示しています。<br
/>サイドバーへの表示はブックマークは面倒なので<a
title="Custom Buttons" href="https://addons.mozilla.org/ja/firefox/addon/custom-buttons/">Custom Buttons</a>のボタンとしておいています。</p><p><a
title="twicli" href="custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//custombuttons2.com/%22%3E%0A%20%20%3CCb2Ver%3E3.1.0%3C/Cb2Ver%3E%0A%20%20%3Cname%3Etwicli%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX///9ZZP////9MWf///2ZwdvuBivnv7/9wdvuBivlZZP+4vP////9ZZP+/wq3//2ZTpML6AAAAEHRSTlMA///////u/+7dIv8iVczu0KWLVAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNAay06AAAAEGSURBVBiVY2AAglOrVq06wAABJxMFBQVnQni8yYZAjuEsMOeqYSCQIyjxACQRHF0N4gjGATlHhTepC4M4ogcYeJKBnNBQIEd4AgNv9O4ipfLyjcKGgjEMvEFKIFDY91hQEsbZPP+HoBgDr9juIvVtGcZPvhmLMvAKGyepC5u9++L3biIDr6BgklKz3RcXF5eHEE6yxBMXl3+hUI6gnYvLY6BpgsJJSpsNQ4AcOQaeYOEgpermFL8vzgkMDBMFpYF2yj3se3iBgeGEoOB2pc2ChoKWB8Aci20gV89hYOCZDHSvMZAtCZTgFc2cCvSOsMQckEdzD/DMbBXtvAMOAqAsz6pXZ0BMAK1WT1eD5lhsAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20title%20%3D%20%22twicli%22%3B%0A//%20http%3A//www.geocities.jp/twicli/twicli.html%0Avar%20uri%20%3D%20%22http%3A//twicli.neocat.jp/twicli.html%22%3B%0Avar%20sidebarTitle%20%3D%20document.getElementById%28%22sidebar-title%22%29.value%3B%0Avar%20sidebarBox%20%3D%20document.getElementById%28%22sidebar-box%22%29%3B%0Aif%20%28title%20%3D%3D%20sidebarTitle%29%20%7B%0A%09toggleSidebar%28%29%3B%0A%7D%20else%20%7B%0A%09openWebPanel%28title%2C%20uri%29%3B%20%20%0A%7D%5D%5D%3E%3C/code%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%3C/custombutton%3E"><img
style="margin: 0 6px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX///9ZZP////9MWf///2ZwdvuBivnv7/9wdvuBivlZZP+4vP////9ZZP+/wq3//2ZTpML6AAAAEHRSTlMA///////u/+7dIv8iVczu0KWLVAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNAay06AAAAEGSURBVBiVY2AAglOrVq06wAABJxMFBQVnQni8yYZAjuEsMOeqYSCQIyjxACQRHF0N4gjGATlHhTepC4M4ogcYeJKBnNBQIEd4AgNv9O4ipfLyjcKGgjEMvEFKIFDY91hQEsbZPP+HoBgDr9juIvVtGcZPvhmLMvAKGyepC5u9++L3biIDr6BgklKz3RcXF5eHEE6yxBMXl3+hUI6gnYvLY6BpgsJJSpsNQ4AcOQaeYOEgpermFL8vzgkMDBMFpYF2yj3se3iBgeGEoOB2pc2ChoKWB8Aci20gV89hYOCZDHSvMZAtCZTgFc2cCvSOsMQckEdzD/DMbBXtvAMOAqAsz6pXZ0BMAK1WT1eD5lhsAAAAAElFTkSuQmCC" border="0" alt="twicli" />twicli</a></p><p><a
href="http://efcl.info/wp-content/uploads/2011/03/ss-2011-03-03-6.png"><img
class="alignnone size-medium wp-image-2342" title="ss-2011-03-03-6" src="http://efcl.info/wp-content/uploads/2011/03/ss-2011-03-03-6-155x300.png" alt="" width="155" height="300" /></a></p><p>次はCSSの設定、CSSは基本的に最小限で無駄なものを消したりするぐらいです。</p><pre class="brush:css;">.uname{
    display:none;
}
#counter{
    font-size: 9pt!important;
}
/* Removeボタン */
#user_info &#62; input{
    display:none;

}
/* shortcut.js */
.selected {
    background-color: #DDD !important
}</pre><p>Removeボタンを消してるのはプラグインの関係で誤爆を防ぐためです。(通常は確認ダイアログがでるので誤爆しないかな)<br
/>次にプラグインの設定</p><pre class="brush:javascript;">
ssl.js
regexp.js
lists.js
shortcutkey.js
search.js
search2.js
followers.js
shorten_url.js
resolve_url.js
translate.js
scroll.js
thumbnail.js
geomap.js
tweet_url_reply.js

https://gist.github.com/510112.txt#multi-users.js


https://gist.github.com/567983.txt#twicli_post_canceler.js


https://gist.github.com/655300.txt#switchViewedSearches.js

data:text/javascript,var fst=$('fst');fst.focus=fst.select=confirm=Array;</pre><p>URLじゃないの部分はデフォルトのプラグインなので説明を省きますが、最後の4つが使ってるプラグインです。</p><ul><li><a
title="multi-users.js" href="https://gist.github.com/510112">multi-users.js</a></li></ul><p>一度タイムラインを表示したことのあるユーザーのタイムラインを簡単に再表示するプラグイン</p><ul><li><a
title="twicli post canceler.js" href="https://gist.github.com/567983">twicli post canceler.js</a></li></ul><p>ポストをした際に5秒以内なら中止できるボタンを出す</p><ul><li><a
title="switchViewedSearches.js" href="https://gist.github.com/655300">switchViewedSearches.js</a></li></ul><p>ハッシュタグや検索結果のタブを一つのタブにまとめる。<br
/>サイドバーで使うと狭いので、まとめるために使ってる。</p><p>最後のデータスキームURIとなってる部分はわざわざjsファイルとして読み込ませるほど長くはないので直接書いています。</p><pre>data:text/javascript,var fst=$('fst');fst.focus=fst.select=confirm=Array;</pre><p>これは、twicliはデフォルトだとポスト後に入力フォーム(fst)へのフォーカスしてしまって、サイドバーで使っているとフォーカスが奪われるのでかなり邪魔になります。なので、focusやselectを潰して、またRTなどで確認ダイアログが面倒になっているので同じように潰しています。(Removeボタンも確認ダイアログがなくなるので、RemoveボタンはCSSで非表示にしています)</p><p>他のTwicliプラグインは<a
title="twicli plugins - GitHub" href="https://github.com/NeoCat/twicli/wiki/Plugins">twicli plugins &#8211; GitHub</a>にまとめられているそうです。</p><p>Pickup Patternはそこまで使ってないでの省略。</p><p>twicliはJavaScriptで拡張できて、ブラウザで動くのでどこでも使える感じで便利。<br
/>みんなもっと設定公開するといいよ</p><dl><dt><strong>twicli &#8211; A Web Browser-Based Lightweight Twitter Client</strong></dt><dd><a
title="twicli - A Web Browser-Based Lightweight Twitter Client" href="http://www.geocities.jp/twicli/">http://www.geocities.jp/twicli/</a></dd></dl>]]></content:encoded> <wfw:commentRss>http://efcl.info/2011/0303/res2341/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Twitterの活動を検索するサービスのまとめ</title><link>http://efcl.info/2010/1101/res2053/</link> <comments>http://efcl.info/2010/1101/res2053/#comments</comments> <pubDate>Mon, 01 Nov 2010 13:23:45 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[まとめ]]></category> <category><![CDATA[Greasemonkey]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[検索]]></category><guid
isPermaLink="false">http://efcl.info/?p=2053</guid> <description><![CDATA[Twitterを検索するサービス、自分のTweets、Favを検索するサービスをまとめてみた。 まずはTwitterを検索するサービス Twitter SearchTwitter公式の検索サービス。最も反映が早いけど、日 [...]]]></description> <content:encoded><![CDATA[<p>Twitterを検索するサービス、自分のTweets、Favを検索するサービスをまとめてみた。</p><p>まずはTwitterを検索するサービス</p><ul><li><a
href="http://search.twitter.com/">Twitter Search</a><br
/>Twitter公式の検索サービス。最も反映が早いけど、日本語とかの検索は不向き<br
/>一週間分のデータしか検索できません。</li><li><a
href="http://googleblog.blogspot.com/2010/04/replay-it-google-search-across-twitter.html">Replay</a><br
/>GoogleによるTwitterのアーカイブ検索です。<br
/>反映もとても早く、過去の内容も検索でき、日本語もGoogleのエンジンで検索するので多少曖昧でも引っかかります。<br
/>誰か知らないけど、こういう事言ってたという感じのものを検索する場合はReplayが一番期待に添えると思います。<br
/>適当に作ったFirefoxの検索プラグイン(ChromeとIEも検索サイトに追加できるみたい)は<a
href="http://ready.to/search/jp/?sna=TwitterReplay&amp;prf=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Dja%26amp%3Btbo%3D1%26amp%3Btbs%3Dmbl%3A1%26amp%3Besrch%3DRTReplay%26amp%3Bq%3D&amp;des=Google%E3%81%A7%E3%81%AETwitter%E6%A4%9C%E7%B4%A2&amp;img=iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAB3RJTUUH2gsBDQAkhMa0HwAAABd0RVh0U29mdHdhcmUAR0xEUE5HIHZlciAzLjRxhaThAAAACHRwTkdHTEQzAAAAAEqAKR8AAAAEZ0FNQQAAsY8L/GEFAAADTElEQVR4nCWTf0xVZRzG3/MebMlI4A/bmr9YKzONuTaLCxcidbFgNW2mhpu6ZflP9uOvSrs1BS+KpmIYCfaTtZuYM0BB7yys1CLHQF1YgfIrS/JegXthVy/n3vPpe45ne877nvec5/k+3+d9j1JyWQno6B0ia32AlOe+ouLoJZIkiEdGOVuYR7ehmNSapFICTUyeR2TucFXCAhtYXn4KtTqI3tDBtJe/5+q/UXmRIPZ7NzfSUl2ybZgkhewIhFUKA1pEhItlWTy0qRW1oR21sQtV+hPl3112lUWDgaIi4sogYSrihsGYMgmJSL/jwk6Kgnzk9bWh1/6C3tiOXnOO1Xs7HWlHn2srljMhFTGcFkzGZfxHyD3adBw4CknKGi6jVgRJeeUC+qUfKK1ql1WxcAd+fXQePz9wD01zM2nNyqQjYwqDYt/JRvUO3nIzGI7EmLepBfXiaaatDRLsuu6u1zYdYtZbWaiPczBrClDVXqZWPkneq9nsWpCOemTdFxxtuyImbEajcb4800fP0C23uv9ULarsMcw6L+bBPFRNjiAXY7/MqwsxdixBTV91mIxln7LkzQDb69vupia9n+n5Df3OHNShJ1C1QqzLwTiQ70Lt82DsLhCBp8RBaT0zV37NvSWfk/nsQfqHI9i2zWD4OnPrXkAdyEZ/kivwytyD/siLsa8ALQKq0oN6sHgvnnWfseqDZt6o+pGunhHXvi33UDRE0eHXMPZki/V8t38XIqB2CbYLAqcvEhpx82ZyrJvha430ddVwe/ymu4WTctKKA6+LyHwhS8Uqr1TPRe0UQb/A2cXx/y7S2eihvzGVv1sUQ8c0VxrmEwn/5Wbyx/AA91UUCjkX88N8dKVU9kv/2wR3rAk6AjmMnpCjel5jnU0l1jaVm0cUvY0lbh5Org/vXyk9L0LtkRYqCpiybSnG+yIQDffxZ/0MbgcziATTiLakM9aczsTxGdz4diHEx4lZNrP8JUKUMP2LZRQXW59GvSdOrIRN/8n1hL9JY6zpfiLN011y5MhsRs753GwaLpzEfPtxjHI5D2XSilN5i2Dz0rt/pDURJnTex2jrMiJNz8j4PLHOauJWjEuDfcx8t1gIi9A+IfucyhLelsUu+X9YP4Z603rFvwAAAABJRU5ErkJggg==&amp;in=utf&amp;ou=ono&amp;mod=pn">ここから</a></li><li><a
href="http://pcod.no-ip.org/yats/">twitter検索(yats)<br
/></a>日本語に絞ったTwitter検索です。<br
/>user:オプションや-noiseオプションなどを使う事でかなり絞ってかつ日本語圏の発言が検索できるのでとても重宝する。<br
/>情報の精度が高いという感じなので<a
href="http://userscripts.org/scripts/show/65540">Twitter search(ja) result on Google for Greasemonkey</a>を使ったりしてよく利用しています。</li></ul><p>自分の発言やお気に入りを検索するサービス</p><ul><li><a
href="http://twilog.org/">Twilog &#8211; Twitterのつぶやきをブログ形式で保存</a><br
/>自分の発言をアーカイブできるサービス。<br
/>ログインすることで公式ReTweetしたものもアーカイブできるので、発言+RTが保存できます<ul><li><a
href="http://userscripts.org/scripts/show/70683">twilog date linker for Greasemonkey</a><br
/>検索結果に日付別へ飛ぶリンクをつけます</li></ul></li><li><a
href="http://favolog.org/">favolog &#8211; Twitterのお気に入りをらくらく管理</a><br
/>TwilogのFavバージョン。<br
/>Favmemoと同じくタグ編集機能があります。<br
/>基本的な作りはTwilogと同じなので、自分以外のユーザーへも公開できます。</li><li><a
href="http://favmemo.com/">Favmemo</a><br
/>自分のお気に入り(Fav)したものを検索できるサービス<br
/>過去をさかのぼって、お気に入りしたものも取り込んでくれます。<br
/>お気に入りにタグをつけて管理することもできるのでこれからも期待。<br
/>検索がAjaxで行われるので体感的に早く感じます。<br
/>Favmemoの検索プラグインは<a
href="http://ready.to/search/jp/?sna=Favmemo&amp;prf=http%3A%2F%2Ffavmemo.com%2F%23q%3D&amp;suf=%26amp%3Btype%3Dand&amp;des=Favmemo%E3%81%AE%E6%A4%9C%E7%B4%A2&amp;img=iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABC1BMVEX/5hD53hD43RDatw794xDqzA/rzA/rzQ/szw/84hD95RO6wGpultqFo7q2v3rWwi7MylKEpdPC0fDL2PFklPdxnPaMnsSetLHd0zyJp7yxxfDt7u/x8fHy8vKXtviDqPaht+O/xobr2yqUq6OguvDo6/Dw8PD09PT29vbi6feAqPuDq/zm20H14R2ktImTse3f5O/19fX39/f5+fn6+vq3zf2Xtun/5hHJyFmpwfLz8/P4+Pj8/Pz1+P670fvQ0n2VsMjv8PP7+/v5+/3L3P+8y7Xw4DLf1kO7z/f9/f3X5P+2ydHo3EauwLPz9fvh6/61yuTd12Dv3jG4zvu5zvLS03n95Rbf2Vn54x8TALIoAAAAl0lEQVQYlWNgQAGMTKh8BmYWVD4rGyqfhY0dVYCdgxPO5uLm4eXjZ4XzBQSFhEVExcShXAlJKWkZWTl5BUUwV0lZRVVNVl1DU0tbB8jV1dM3AHINjYxNTM3MgQIWlmoyVoZG1iY2tnb2YB0OjoYa1iZOzi6ubhAT3T2sjZ08vbx94Fb6+nn6BwQiuS8oOCQ0DMXF4RFIHABXvRKEc+vlbAAAAABJRU5ErkJggg==&amp;in=utf&amp;ou=ono&amp;mod=pn">こちらから</a></li><li><a
href="http://favlook.osa-p.net/index.html">ふぁぼるっく </a><br
/>お気に入りしたものやお気に入りされたものを検索できる。(ふぁぼったーにあったような感じ)<br
/>ただ取りこぼしもあるので完璧ではない。</li></ul><p><a
href="http://favmemo.com/">Favmemo</a>ができた事で、Twitterでの事は大体アーカイブでき検索できる環境が整った気がします。<br
/><a
href="http://ja.favstar.fm/">Favstar</a>とか<a
href="http://favotter.net/">ふぁぼったー</a>とか<a
href="http://twistar.cc/">Twistar</a>は通常は検索できないので今回は除外した。</p><p>では良き検索生活を。</p> ]]></content:encoded> <wfw:commentRss>http://efcl.info/2010/1101/res2053/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>JavaScriptベストプラクティス30選-jsEdu</title><link>http://efcl.info/2010/1015/res1985/</link> <comments>http://efcl.info/2010/1015/res1985/#comments</comments> <pubDate>Fri, 15 Oct 2010 12:04:39 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[javascript]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[まとめ]]></category><guid
isPermaLink="false">http://efcl.info/?p=1985</guid> <description><![CDATA[#jsEduから適当に選んで日本語にしたものです。訳とかは全く正確ではなく、as possibleなど表現をかなり省いてるので命令口調になってます。フィーリング的なものはあんまり入れてないので、興味をもったらTogett [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://twitter.com/#search?q=%23jsEdu">#jsEdu</a>から適当に選んで日本語にしたものです。<br
/>訳とかは全く正確ではなく、as possibleなど表現をかなり省いてるので命令口調になってます。<br
/>フィーリング的なものはあんまり入れてないので、興味をもったら<a
href="http://togetter.com/li/59441">Togetter &#8211; 「JavaScriptのベストプラクティス大会 jsEdu」</a>を読みましょう。(まとめた奴はこれの10倍くらいありますが、被ってるのや関係無いのもあるので読める程度の量です)<br
/>全てを確認したわけではないので、正確性は保証しかねます。</p><p><span
id="more-1985"></span></p><ol><li>==ではなく===を使うべき<br
/> (自動的に型変換に行われないのでバグが減る、高速)</li><li>new      Object() and new Array() よりも[] or {}を使うべき。<br
/> []や{}の方がシンプル<br
/> <a
href="http://journal.mycom.co.jp/news/2009/11/11/015/index.html">JavaScriptを高速化する6つのテクニック      | エンタープライズ | マイコミジャーナル</a>で出てくるのは間違いだと思う。<ul
type="circle"><li><a
href="http://jsperf.com/vs-new-array">[] vs new Array() · jsPer</a></li><li><a
href="http://twitter.com/Constellation/status/27351865075">http://twitter.com/Constellation/status/27351865075</a></li></ul></li><li>evalなど文字列から実行するタイプの使うのを避けろ</li><li>クロージャーでvar      that = this;の方が意味合いがいい気がする</li><li>ループ内で使う変数の宣言はループの外側でしろ</li><li>If(){}の{}はできる限り省略するな</li><li>プロトタイプ汚染があるかも知れないときにfor      inはhasOwnProperty()と組み合わせ</li><li><strong>奇数や偶数を知るためにif( i % 2 )を使うなら、ビット演算でif( i &amp; 1 )とやった方が高速。</strong>(補足あり)<br
/>(整数以外の時は気をつける必要あり <a
href="https://twitter.com/Constellation/statuses/27349855309">https://twitter.com/Constellation/statuses/27349855309</a> )</li><li>変数宣言するときにvarはつけ忘れるな。スコープで混乱する</li><li>jQuery      で下のように書くと便利<br
/> ( function( $ ) { /* Code */ } )( jQuery );</li><li>alert(&#8220;hello&#8221;); (いや何となく入れたかった)</li><li>初期化にvar      foo = o || {};とするとoが無いときに空のオブジェクトが入るテクニック。<br
/> if文でやるよりも&amp;演算子を使ってオブジェクトの確認した方が高速。<br
/> var bar = o &amp;&amp; o.bar;// oがあったらo.barがbarに入る</li><li>jQuery      on IE6,IE7でClassnameだけのセレクタ指定は避けた方がいい。(遅い)</li><li><strong>ある年月の日数を取得するには(その月の最終日)<br
/> var numdays = 32 &#8211; new Date([year], [month], 32).getDate();<br
/></strong><a
href="https://twitter.com/xulapp/statuses/27442123309">https://twitter.com/xulapp/statuses/27442123309</a></li><li>文字列の結合は配列に入れて最後にjoin(&#8220;&#8221;)するといい<br
/> (主に差が出るのはIE)</li><li>p<span
style="text-decoration: line-through;">arseInt(number,      10);</span>よりも~~number というようにビット演算使った方が高速(補足あり)<br
/>(Math.floorの代替)</li><li>グローバル名前空間を汚すことないように即時実行できる無名関数を使えるときは使う。<br
/> (function(){ /* MY CODE HERE */ })()</li><li>Ajaxリクエストでキャッシュが使われたくないときはURLに適当なクエリをつける<br
/> var sUrl = &#8220;ajaxResponse.php?t=&#8221;+new Date().getTime();</li><li>forループで毎回lengthを参照するのは非効率なので、最初か外に出しましょう。(5と似てる)<br
/> for(var 0, arrLen = myArray.length; i&lt;arrLen; i++){&#8230;}</li><li>関数のcontextを変えるには&#8221;myFunction.call&#8221;      や&#8221;myFunction.apply&#8221;が使えるよ。</li><li>javascript      1.8ならオブジェクトのプロパティ数を取得できる。<br
/> function getPropertyCount(obj) return obj.__count__;<br
/><a
href="http://www.nczonline.net/blog/2009/02/24/mozilla-javascript-extension-count/">Mozilla JavaScript Extension: __count__ | NCZOnline</a><br
/><a
href="http://ido.nu/kuma/2007/10/23/javascript-object-__count__-property/">javascript object __count__ property « ku</a></li><li>a      onclick=&#8221;soVeryWrong();&#8221;は止めておけ。イベントリスナーを使いましょう。</li><li><strong>Math.max.apply(Math, arr); その配列arrの最大値が取得できる。</strong></li><li>Math.floorの代わりにビット演算(補足あり)<br
/> var num = 2.222 | 0;// 2</li><li><strong>無名関数の即時実行の応用で、undefinedの手に入れ方<br
/> (function(undefined){/*now you can be sure that undefined really is      undefined*/}()); </strong><br
/> (JavaScriptだとundefinedは書き換え可能なので、void      0などでundefined取得する方法などがある)</li><li>argumentsを配列に変換するなら<br
/> var      ary = Array.prototype.slice.call(arguments);</li><li>ワンライナーでURLのファイル部分(/から最後まで)を取得するには<br
/> location.href.split(&#8220;/&#8221;).pop(); や location.href.split(&#8220;/&#8221;).slice(-1)[0];// こっちは非破壊的(この場合意味ないけど)</li><li>JavaScriptでステートメントの最後には<strong>;</strong>をいつもつけておいた方がいい。</li><li><strong>if文などで偽として評価されるのはfalse,      null, undefined, 0, &#8220;&#8221;, NaNの6つ。</strong></li><li>sort()は安定ソートではない(Chrome and Operaは特に)、なので扱う時気をつけろ。</li></ol><p>16,24の補足<br
/>ビット演算は速いけど、副作用がある場合があるので使う時は気をつける。(負の値の時とか)</p><ul><li><a
href="http://d.hatena.ne.jp/sii-side/20090319/p1">小数から整数部分だけを取り出すときのアレコレ &#8211; まるでとりとめのない。</a></li><li><a
href="http://d.hatena.ne.jp/mindcat/20091119/1258651717">JavaScriptのビット演算の仕組みを理解する &#8211; 風と宇宙とプログラム</a></li><li><a
href="http://labs.cybozu.co.jp/blog/mitsunari/2007/07/1.html">論理演算1 (mitsunari@cybozu labs)</a> &#8211; 副作用</li><li><a
href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators">Bitwise Operators &#8211; MDC</a></li></ul><dl><dt><strong>Togetter &#8211; 「JavaScriptのベストプラクティス大会 jsEdu」</strong></dt><dd><a
title="Togetter - 「JavaScriptのベストプラクティス大会 jsEdu」" href="http://togetter.com/li/59441">http://togetter.com/li/59441</a></dd></dl>]]></content:encoded> <wfw:commentRss>http://efcl.info/2010/1015/res1985/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>またニコニコ動画見てるGreasemonkeyのOAuth対応版</title><link>http://efcl.info/2010/0906/res1930/</link> <comments>http://efcl.info/2010/0906/res1930/#comments</comments> <pubDate>Mon, 06 Sep 2010 11:50:21 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[Greasemonkey]]></category> <category><![CDATA[ニコニコ動画]]></category> <category><![CDATA[twitter]]></category><guid
isPermaLink="false">http://efcl.info/?p=1930</guid> <description><![CDATA[2010.8月末にTwitterのBASIC認証が終わったので、今までのまたニコぐりもんは動かなくなっていると思います。なのでOAuth認証に対応してるまたニコニコ見てるを作ってみました。(作ったのは結構前だけどね) m [...]]]></description> <content:encoded><![CDATA[<p>2010.8月末にTwitterのBASIC認証が終わったので、今までのまたニコぐりもんは動かなくなっていると思います。<br
/>なのでOAuth認証に対応してるまたニコニコ見てるを作ってみました。(作ったのは結構前だけどね)</p><ul><li><a
href="http://userscripts.org/scripts/show/83795">mataniconicomiteru for Greasemonkey</a></li></ul><h3>使用方法</h3><p>まずはニコニコ動画の動画ページでステータスバーのGreasemonkeyアイコンを右クリック→ユーザースクリプトコマンドからOAuth認証をする必要があります。 <br
/><a
href="http://efcl.info/wp-content/uploads/2010/09/ss-2010-09-06-11.png"><img
class="alignnone size-medium wp-image-1938" title="ss-2010-09-06-1" src="http://efcl.info/wp-content/uploads/2010/09/ss-2010-09-06-11-300x95.png" alt="" width="300" height="95" /></a></p><p>コマンドを実行するとOAuth認証のパネルが出てくるので、ボタンからTwitterへ行きOAuth認証してPINコードをコピーしてテキストエリアに入力すると準備完了です。<br
/><a
href="http://efcl.info/wp-content/uploads/2010/09/large.png"><img
class="alignnone size-medium wp-image-1939" title="large" src="http://efcl.info/wp-content/uploads/2010/09/large-300x192.png" alt="" width="300" height="192" /></a></p><p>認証済みだったら動画タイトル部分にまたニコのボタンが出るので、それをクリックしてコメントを入力してまたボタンを押せばTwitterへ投稿できます。(nico.msのURLを使って投稿します。<br
/><a
href="http://efcl.info/wp-content/uploads/2010/09/input_mata.png"><img
class="alignnone size-full wp-image-1940" title="input_mata" src="http://efcl.info/wp-content/uploads/2010/09/input_mata.png" alt="" width="482" height="78" /></a></p><p>オリジナルの機能としてはコメント入力欄の右側に文字数のカウンターが付いてるぐらいです。</p><dl><dt><strong>mataniconicomiteru for Greasemonkey</strong></dt><dd><a
title="mataniconicomiteru for Greasemonkey" href="http://userscripts.org/scripts/show/83795">http://userscripts.org/scripts/show/83795</a></dd></dl><p>&nbsp;</p>]]></content:encoded> <wfw:commentRss>http://efcl.info/2010/0906/res1930/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[javascript]]></category> <category><![CDATA[NILScript]]></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
/> これで、実行する準備はできたので試しに何かスクリプトを実行してみましょう。</p><p><strong>追記:現在は<a
title="Home - NILScript - GitHub" href="https://github.com/azu/NILScript/wiki">Home &#8211; NILScript &#8211; GitHub</a>にほとんどのスクリプト置いてあります</strong><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><strong>追記:現在は<a
title="Home - NILScript - GitHub" href="https://github.com/azu/NILScript/wiki">Home &#8211; NILScript &#8211; GitHub</a>にほとんどのスクリプト置いてあります</strong></p><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><br
class="spacer_" /></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>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」をOAu [...]]]></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><script src="http://gist.github.com/511308.js?file=twitter%20OAuth%20test.user.js"></script><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>Post Now browsing to Twitterの解説</title><link>http://efcl.info/post-now-browsing-to-twitter/</link> <comments>http://efcl.info/post-now-browsing-to-twitter/#comments</comments> <pubDate>Thu, 10 Jun 2010 00:51:58 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[その他]]></category> <category><![CDATA[Greasemonkey]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[設定]]></category><guid
isPermaLink="false">http://efcl.info/?page_id=1730</guid> <description><![CDATA[Post Now browsing to Twitterの機能解説ページ。今見ているサイトのURLとタイトルにコメントを付けてTwitterにポストするGreasemonkeyスクリプトです。 使用方法 OAuthを使っ [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://userscripts.org/scripts/show/46441"><br
/>Post Now browsing to Twitter</a>の機能解説ページ。<br
/>今見ているサイトのURLとタイトルにコメントを付けてTwitterにポストするGreasemonkeyスクリプトです。</p><h3>使用方法</h3><p>OAuthを使ってTwitterへポストするためまずはOAuth認証をする必要があります。<br
/>OAuth認証の手順は以下の動画を参考にして下さい。</p><p><object
classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param
name="allowFullScreen" value="true" /><param
name="allowscriptaccess" value="always" /><param
name="src" value="http://www.youtube.com/v/8oXTuZk5xAk&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;hd=1" /><param
name="allowfullscreen" value="true" /><embed
type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/8oXTuZk5xAk&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;hd=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p><p>文字で書くと、</p><ol><li>ステータスバーのGreasemonkeyアイコンを右クリック<br
/>ユーザースクリプトコマンド→Post Now browsing to Twitter Settingから設定画面へ</li><li>OAuth認証をまだしてないなら、&#8221;Sign in with Twitter&#8221;ボタンが表示されるのでクリック</li><li>OAuth認証ページが開くので、そこへ行き許可(Allow)する。</li><li>PINコードが表示されるのでCtrl+Cなどでコピーする。</li><li>再び設定画面に戻り、インプットボックスへPINコードをCtrl+V(ペースト)して、Comfirmボタンを押す。</li><li>Success!と出たら認証完了</li></ol><p><strong>投稿の仕方</strong></p><ol><li>投稿したいページで設定したショートカットキーを押す(デフォルトは<strong>Ctrl+Shift+Enter</strong>)</li><li>適当にコメントとかを書いたらEnter(設定でCtrl+Enterに変えられます)でTwitterへポストする</li><li>投稿できたらOK</li></ol><p>この時、設定のUse selectionQuoteに✓チェックが入っていると、選択範囲を引用して投稿することもできます。<br
/>また入力画面でESCキーを押すとキャンセルできます。</p><h3>設定項目</h3><p>設定画面を開くには<strong>ステータスバーのGreasemonkeyアイコンを右クリック <br
/>ユーザースクリプトコマンド→Post Now browsing to Twitter Setting</strong>をクリックします。</p><p>それぞれの設定項目の解説</p><ul><li><strong>Prefix</strong>:コメント未入力でポストした時に付ける接頭辞とする文字列</li><li><strong>Use  selectionQuote</strong>:選択範囲があるときにそれを「」で囲って引用するか?</li><li><strong>Short URL</strong>:使用する短縮URLサービス</li><li><strong>ShortcutKey</strong>: ポストするために使うショートカット 枠内でキーを押すと自動で入力されます。 デフォルトはCS+Enter<br
/>テキストボックスで使いたいショートカットキーの組み合わせを押すだけで設定できます。</li><li><strong>Post with  Ctrl+Enter</strong>:Enterの代わりにCtrl+Enterでポストできるようにします。</li></ul><p>使用できる短縮URLサービス</p><ul><li><a
href="http://bit.ly/">http://bit.ly/</a> (j.mp) APIにも対応しています。</li><li><a
href="http://is.gd/">http://is.gd/</a></li><li><a
href="http://goo.gl/">http://goo.gl/</a></li><li><a
href="http://tinyurl.com/">http://tinyurl.com/</a></li></ul><ul><li><strong>bit.ly </strong>: 短縮URLでbit.lyまたはj.mpを選んだときに使用するAPIKEYを変えられます。<br
/>デフォルトは作者のものになっています。</li></ul><p><strong>OAuth Authorization</strong> : OAuth認証についての設定です。(上記の設定とは別領域に保存されています)<br
/>まだOAuth認証をしていない場合は以下のような表示になるのでOAuth認証をして下さい。<br
/><a
href="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-10-2.png"><img
class="size-medium wp-image-1731 alignnone" title="sshot-2010-06-10-2" src="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-10-2-300x223.png" alt="未認証" width="300" height="223" /></a></p><p>認証が既に済んでいる場合はlogoutボタンが表示されているので、OAuth認証をやり直したい場合の時などそこからOAuth関係の情報を削除できます。(Twitter側のconnection設定が解除されるわけではないので、完全に消す場合は<a
href="https://twitter.com/settings/connections">Twitter / Connections</a>から削除して下さい)</p><p><a
href="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-10-3.png"><img
class="alignnone size-medium wp-image-1732" title="sshot-2010-06-10-3" src="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-10-3-300x186.png" alt="" width="300" height="186" /></a></p><p>以上で設定項目は終わりです。<br
/>またサイト固有の行動としてLDRとFastladderの記事上でショートカットキーを押すと、フォーカスがある記事を投稿できます。</p><h3>その他機能</h3><ul><li>引用機能<br
/>設定のUse selectionQuoteに✓チェックが入っているとき、ショートカットキーを押す前に引用したい部分を選択しておくと、選択範囲(複数の選択範囲も対応)の内容を「」で囲んでタイトルの前に付加します。</li><li>activityFiled(引用とタイトルが表示される部分)の編集<br
/>activityFiledをクリックまたはコメント入力欄でTabキーを押すことで編集状態になります。<br
/>引用したい部分を後から少し削りたい時などに使う。<br
/><a
href="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-20-2.png"></a><a
href="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-20-21.png"><img
class="alignnone size-medium wp-image-1798" title="sshot-2010-06-20-2" src="http://efcl.info/wp-content/uploads/2010/06/sshot-2010-06-20-21-300x69.png" alt="" width="300" height="69" /></a></li></ul><p>インストールはこちらから<strong><br
/></strong></p><dl><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><p>&nbsp;</p>]]></content:encoded> <wfw:commentRss>http://efcl.info/post-now-browsing-to-twitter/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Post Now browsing to TwitterをOAuth認証に対応しました</title><link>http://efcl.info/2010/0609/res1715/</link> <comments>http://efcl.info/2010/0609/res1715/#comments</comments> <pubDate>Wed, 09 Jun 2010 10:55:01 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[Greasemonkey]]></category> <category><![CDATA[API]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[UI]]></category> <category><![CDATA[設定]]></category><guid
isPermaLink="false">http://efcl.info/?p=1715</guid> <description><![CDATA[Twitterへ今見ているサイトをコメントと共に投稿する「Post Now browsing to Twitter」がOAuth認証に対応しました。このGreasemonkeyをインストールする前に、以前のバージョン(2 [...]]]></description> <content:encoded><![CDATA[<p>Twitterへ今見ているサイトをコメントと共に投稿する「<a
href="http://userscripts.org/scripts/show/46441">Post Now browsing  to Twitter</a>」が<strong>OAuth認証に対応</strong>しました。<br
/>このGreasemonkeyをインストールする前に、<strong>以前のバージョン(2010年6月より前)のものを入れている場合はそれをアンインストール</strong>してから、改めて「<a
href="http://userscripts.org/scripts/show/46441">Post Now browsing to Twitter</a>」をインストールして下さい。(以前と設定の互換が無くなったため設定ごと破棄をお勧めします)<br
/>ツール→Greasemonkey(もしくはステータスバーの猿アイコン)→ユーザースクリプトの管理→Post Now browsing to  Twitterを選択→✓関連付けられた設定も削除にチェック→アンインストール</p><p><span
id="more-1715"></span>主な変更点を箇条書きすると以下のような感じです。</p><p>変更内容<br
/>1. OAuth対応<br
/>BASIC認証が2010年6月末に廃止されるためOAuth認証に対応しました。<br
/>設定画面から認証できます。<br
/>BlowsingNow!などの外部サーバを経由するものとは違い、PINコードを使ってGreasemonkeyスクリプト単体でOAuth認証を行います。<br
/>2. 入力UIがサイトの影響を受けなくなった<br
/>入力UI自体は以前と同じですが、サイト側CSSの影響を受けることがあったのを改善し、影響を受けないようにしました。<br
/>3. 設定項目の変更<br
/>以前と設定項目が変わったため設定の互換性がありません。<br
/>そのため、<strong>以前のものはアンインストールから</strong>インストールして下さい。</p><ol><li>短縮URLの選択肢が増えた<br
/> 新たにbit.ly(j.mp)、goo.glを追加しました。<br
/> bit.ly(j.mp)はAPIの設定も行えます。</li><li>Ctrl+Enterでのポスト<br
/> デフォルトはEnterで送信ですが、設定のチェックの意味が逆になったという変更。(正直気にすることはない)<br
/> 設定でCtrl+Enterでポストするように変更できます。</li><li>Twitterアカウントの入力項目廃止<br
/> 以前はベーシック認証を使っていたので、Twitterアカウントの入力項目がありましたが、OAuth認証に対応したため廃止しました。</li></ol><p>OAuth認証は設定の一番下に表示されます。(いつでも認証を解除する事ができます。)<br
/>4. 短縮URLのリトライ機能<br
/>短縮URLサービスのサーバにアクセスできないときに(5秒でタイムアウト)、別の短縮URLサービスに切り替えて短縮します。</p><p>ぱっとした変化を見ると、OAuthに対応したのと、bit.ly、goo.glなどの短縮URLが使えるようになったぐらいかな。</p><h3>OAuth認証の手順</h3><p>Greasemonkey 単体でOAuth認証を行うようにしたので手順が少し複雑です。<br
/>以下の動画を参考にして下さい。</p><p><object
classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param
name="allowFullScreen" value="true" /><param
name="allowscriptaccess" value="always" /><param
name="src" value="http://www.youtube.com/v/8oXTuZk5xAk&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;hd=1" /><param
name="allowfullscreen" value="true" /><embed
type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/8oXTuZk5xAk&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;hd=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p><p>文字で書くと、</p><ol><li>ステータスバーのGreasemonkeyアイコンを右クリック<br
/>ユーザースクリプトコマンド→Post Now browsing to Twitter Settingから設定画面へ</li><li>OAuth認証をまだしてないなら、&#8221;Sign in with Twitter&#8221;ボタンが表示されるのでクリック</li><li>OAuth認証ページが開くので、そこへ行き許可(Allow)する。</li><li>PINコードが表示されるのでCtrl+Cなどでコピーする。</li><li>再び設定画面に戻り、インプットボックスへPINコードをCtrl+V(ペースト)して、Comfirmボタンを押す。</li><li>Success!出たら、ページでショートカットキー(デフォルトはCtrl+Shift+Enter)を押し、入力UIを出す。</li><li>適当にコメントとかを書いたらEnter(設定でCtrl+Enterに変えられます)でTwitterへポストする</li><li>投稿できたらOK</li></ol><p>5ぐらいまでがOAuth認証の手順で、6以降は投稿する手順。</p><p>以下感想<br
/>OAuthに対応してるGreasemonkeyが皆無で結局自分で色々書かないといけなかった。<br
/>OAuth.jsとかライブラリを使ってるので結構サイズが大きくなった。<br
/>OAuthページとかのアイコンがやっつけ感酷いのでアイコン募集中。</p><dl><dt>機能説明ページ<br
/></dt><dt><strong>Post Now browsing to Twitter | Web scratch</strong></dt><dd><a
title="Post Now browsing to Twitter | Web scratch" href="../post-now-browsing-to-twitter/">http://efcl.info/post-now-browsing-to-twitter/</a></dd></dl><dl><dt>スクリプト配布ページ<br
/></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>]]></content:encoded> <wfw:commentRss>http://efcl.info/2010/0609/res1715/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>twilogに日付毎のページへ飛ぶリンクをつけるGreasemonkey</title><link>http://efcl.info/2010/0310/res1595/</link> <comments>http://efcl.info/2010/0310/res1595/#comments</comments> <pubDate>Wed, 10 Mar 2010 05:35:41 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[Greasemonkey]]></category> <category><![CDATA[twitter]]></category><guid
isPermaLink="false">http://efcl.info/?p=1595</guid> <description><![CDATA[twilogの日付の隣あたりに日付毎のページへ飛ぶリンクをつけるGreasemonkeyです。 要は下のスクリーンショットみたいに日付ページへ飛ぶリンクをつけるだけです。 twilog date linker カッとなっ [...]]]></description> <content:encoded><![CDATA[<p>twilogの日付の隣あたりに日付毎のページへ飛ぶリンクをつけるGreasemonkeyです。<br
/> 要は下のスクリーンショットみたいに日付ページへ飛ぶリンクをつけるだけです。</p><p><a
href="http://efcl.info/wp-content/uploads/2010/03/sshot-2010-03-07-1.png"><img
class="aligncenter size-medium wp-image-1596" title="sshot-2010-03-07-1" src="http://efcl.info/wp-content/uploads/2010/03/sshot-2010-03-07-1-299x35.png" alt="" width="299" height="35" /></a></p><ul><li><a
href="http://userscripts.org/scripts/show/70683">twilog date linker</a></li></ul><p>カッとなってつけたけどデフォルトでないのが意外。</p><dl><dt><strong>twilog date linker for Greasemonkey</strong></dt><dd><a
title="twilog date linker for Greasemonkey" href="http://userscripts.org/scripts/show/70683">http://userscripts.org/scripts/show/70683</a></dd></dl>]]></content:encoded> <wfw:commentRss>http://efcl.info/2010/0310/res1595/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>TwitterとJavaScriptな人々</title><link>http://efcl.info/2010/0304/res1584/</link> <comments>http://efcl.info/2010/0304/res1584/#comments</comments> <pubDate>Wed, 03 Mar 2010 15:39:17 +0000</pubDate> <dc:creator>azu</dc:creator> <category><![CDATA[javascript]]></category> <category><![CDATA[twitter]]></category><guid
isPermaLink="false">http://efcl.info/?p=1584</guid> <description><![CDATA[自分のTLで見る感じのJavaScriptな人々 勝手な印象、主観なのでコメントを気にしたら負け。 Firefoxはデフォルト要素なので特に書いてません。 t_trace pbtweet、mbtweetの作者 CSS3が [...]]]></description> <content:encoded><![CDATA[<p>自分のTLで見る感じのJavaScriptな人々<br
/> 勝手な印象、主観なのでコメントを気にしたら負け。<br
/> Firefoxはデフォルト要素なので特に書いてません。</p><table
style="width: 483px; height: 1867px;" border="0"><tbody><tr><td><a
href="http://twitter.com/t_trace"><img
src="http://img.tweetimag.es/i/t_trace_n" alt="" /></a>t_trace</td><td><p>pbtweet、mbtweetの作者 <br
/> CSS3が好きそうな人<br
/> 実際にHTML5を使ったアプリケーションをつくったりしてる</p></td></tr><tr><td><a
href="http://twitter.com/m_satyr"><img
src="http://img.tweetimag.es/i/m_satyr_n" alt="" /></a>m_satyr</td><td>Ubiquity<br
/> 何かJavaScriptでも珍しい事をやってる気がする。</td></tr><tr><td><a
href="http://twitter.com/Griever2"><img
src="http://img.tweetimag.es/i/Griever2_n" alt="" /></a>Griever2</td><td>Opera、Firefox<br
/> userChrome.jsとか弄ってる</td></tr><tr><td><a
href="http://twitter.com/miya2000"><img
src="http://img.tweetimag.es/i/miya2000_n" alt="" /></a>miya2000</td><td>Opera<br
/> <a
href="http://orera.g.hatena.ne.jp/miya2000/20091010/p0">wnp</a>の作者。<br
/> テクい事をやってたりするような</td></tr><tr><td><a
href="http://twitter.com/snj14"><img
src="http://img.tweetimag.es/i/snj14_n" alt="" /></a>snj14</td><td><a
href="http://userscripts.org/scripts/show/11562">LDRize</a>とか<a
href="http://userscripts.org/scripts/show/11759">Minibuffer</a></td></tr><tr><td><a
href="http://twitter.com/hell2u"><img
src="http://img.tweetimag.es/i/hell2u_n" alt="" /></a>hell2u</td><td>Emacs、CSSに詳しそう</td></tr><tr><td><a
href="http://twitter.com/teramako"><img
src="http://img.tweetimag.es/i/teramako_n" alt="" /></a>teramako</td><td><p>vimperator(<a
href="http://twitter.com/teramako/vimperator">vimperator</a>となげくと監視されます)<br
/> JScriptとかxpcshellとか<br
/> Firefoxのあんなことやこんなことを知ってる印象</p></td></tr><tr><td><a
href="http://twitter.com/monjudoh"><img
src="http://img.tweetimag.es/i/monjudoh_n" alt="" /></a>monjudoh</td><td>jQueryとかfirebugとかMercurial<br
/> プログラミング関係のツールが好きそう。</td></tr><tr><td><a
href="http://twitter.com/nanto_vi"><img
src="http://img.tweetimag.es/i/nanto_vi_n" alt="" /></a>nanto_vi</td><td>JavaScriptやHTMLなど仕様に関して本当に詳しい<br
/> nantoメソッド:誰かが記事にしたことに対して既に<a
href="http://nanto.asablo.jp/blog/">Days on the Moon</a>で記事になっていたことがよくある。</td></tr><tr><td><a
href="http://twitter.com/ku"><img
src="http://img.tweetimag.es/i/ku_n" alt="" /></a>ku</td><td>iPhoneアプリとかGoogleChromeとか<br
/> 新しいことを見つけ出したりしてる印象</td></tr><tr><td><a
href="http://twitter.com/stillpedant"><img
src="http://img.tweetimag.es/i/stillpedant_n" alt="" /></a>stillpedant</td><td><a
href="https://addons.mozilla.org/ja/firefox/addon/13118">KeySnail</a>の作者。<br
/> 勉強家、出てきたことに対してちゃんと学ぼうとしてる感じ。</td></tr><tr><td><a
href="http://twitter.com/javascripter"><img
src="http://img.tweetimag.es/i/javascripter_n" alt="" /></a>javascripter</td><td>nightlyを追ってる気がする。<br
/> あんまりTLじゃ見ないけど、一行コードを残していく。</td></tr><tr><td><a
href="http://twitter.com/amachang"><img
src="http://img.tweetimag.es/i/amachang_n" alt="" /></a>amachang</td><td>最近はJavaScriptな話題はあんまりみないけど。<br
/> 高速化、新しいことには手が早い<br
/> 昔のプレゼンの資料どこだろ？</td></tr><tr><td><a
href="http://twitter.com/ofk"><img
src="http://img.tweetimag.es/i/ofk_n" alt="" /></a>ofk</td><td>オレオレjQueryとか。<br
/> JavaScriptの高速化について詳しい<br
/> そういえばこれ書こうと思ったきっかけ → <a
href="http://d.hatena.ne.jp/ofk/20091219/1261161288">日本のJavaScript界隈のブログを適当かつ詳細にまとめてみようと思って挫折したけど、もうちょっと頑張ってみた &#8211; ?D of K</a></td></tr><tr><td><a
href="http://twitter.com/uupaa"><img
src="http://img.tweetimag.es/i/uupaa_n" alt="" /></a>uupaa</td><td>uupaa.js(uupaa.jsはフレームワークではなくてライブラリ)の人<br
/> JavaScriptの高速化について詳しい。<br
/> 黒魔術の使い手。<br
/> 他とは互換が効かないような人な気がする。</td></tr><tr><td><a
href="http://twitter.com/azu_re"><img
src="http://img.tweetimag.es/i/azu_re_n" alt="" /></a>azu_re</td><td>自分<br
/> Greasemonkeyとかニコニコ</td></tr><tr><td><a
href="http://twitter.com/edvakf"><img
src="http://img.tweetimag.es/i/edvakf_n" alt="" /></a>edvakf</td><td>Opera、Google Chrome<br
/> 英語圏の記事を読んでたり、新しい機能を弄ってたり、それをアウトプットしたりいくつかあるブログの更新頻度は高め<br
/> 勉強家</td></tr><tr><td><a
href="http://twitter.com/33"><img
src="http://img.tweetimag.es/i/33_n" alt="" /></a>33</td><td><a
href="http://wiki.github.com/to/tombloo/">tombloo</a>作者<br
/> kiva</td></tr><tr><td><a
href="http://twitter.com/swdyh"><img
src="http://img.tweetimag.es/i/swdyh_n" alt="" /></a>swdyh</td><td><a
href="http://autopagerize.net/">AutoPagerize</a>作者</td></tr><tr><td><a
href="http://twitter.com/os0x"><img
src="http://img.tweetimag.es/i/os0x_n" alt="" /></a>os0x</td><td>Opera、Google Chromeに深く関係<br
/> 細かいところまで拾える人</td></tr><tr><td><a
href="http://twitter.com/cherenkov"><img
src="http://img.tweetimag.es/i/cherenkov_n" alt="" /></a>cherenkov</td><td>jetpack、Greasemonkey</td></tr><tr><td><a
href="http://twitter.com/hagino3000"><img
src="http://img.tweetimag.es/i/hagino3000_n" alt="" /></a>hagino3000</td><td>サーバーサイドJSとかExt JS</td></tr><tr><td><a
href="http://twitter.com/anekos"><img
src="http://img.tweetimag.es/i/anekos_n" alt="" /></a>anekos</td><td>猫、vimperator</td></tr><tr><td><a
href="http://twitter.com/xulapp"><img
src="http://img.tweetimag.es/i/xulapp_n" alt="" /></a>xulapp</td><td>まだつかみ切れてない。<br
/> 結構お詳しそうな様子</td></tr><tr><td><a
href="http://twitter.com/Constellation"><img
src="http://img.tweetimag.es/i/Constellation_n" alt="" /></a>Constellation</td><td><a
href="http://wiki.github.com/Constellation/taberareloo/">Taberareloo</a>作者、Greasemonkey<br
/> ホントよくコードを書いてる気がする。<br
/> 最近はGoogle chromeでいろいろ</td></tr></tbody></table><dl><dt><strong>azu (azu_re) on Twitter</strong></dt><dd><a
title="azu (azu_re) on Twitter" href="http://twitter.com/azu_re">http://twitter.com/azu_re</a></dd></dl>]]></content:encoded> <wfw:commentRss>http://efcl.info/2010/0304/res1584/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 4/18 queries in 0.030 seconds using disk: basic
Object Caching 796/830 objects using disk: basic

Served from: efcl.info @ 2012-05-23 11:12:22 -->
