<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6406779057808667722</id><updated>2012-02-29T00:25:25.592+09:00</updated><category term='AOP'/><category term='エディタ'/><category term='AdventCalendar'/><category term='リブログ'/><category term='SpiderMonkey'/><category term='非同期'/><category term='短縮URL'/><category term='アニメ'/><category term='ゲーム'/><category term='FileAPI'/><category term='URI'/><category term='開発'/><category term='ReleaseNotes'/><category term='SNS'/><category term='Greasemonkey'/><category term='GUI'/><category term='パッチ'/><category term='Node.js'/><category term='ライブラリ'/><category term='DOM'/><category term='jsFiddle'/><category term='アルゴリズム'/><category term='Feed'/><category term='CPU'/><category term='BrightShadow'/><category term='Delphi'/><category term='Webアプリ'/><category term='プログラミング'/><category term='Bookmark'/><category term='pixiv'/><category term='ラボ'/><category term='HTML5'/><category term='ベンチマーク'/><category term='圧縮'/><category term='TINAMI'/><category term='Google+'/><category term='Pot.js'/><category term='jQuery'/><category term='Evernote'/><category term='Peggy'/><category term='CSS'/><category term='Deferred'/><category term='エラー'/><category term='サンプル'/><category term='Tumblr'/><category term='比較'/><category term='DragAndDrop'/><category term='Search'/><category term='LZ77'/><category term='Google'/><category term='PHP'/><category term='ソフトウェア'/><category term='GoogleReader'/><category term='リーダー'/><category term='ネトゲ'/><category term='Firefox'/><category term='PotLite.js'/><category term='スクリプト'/><category term='ツール'/><category term='Tombloo'/><category term='twitter'/><category term='Element'/><category term='HTML'/><category term='雑記'/><category term='正規表現'/><category term='JavaScript'/><category term='音楽'/><category term='逆アセンブリ'/><category term='SoundCloud'/><category term='Event'/><category term='アップデート'/><category term='画像'/><category term='文章'/><category term='アドオン'/><category term='イテレータ'/><title type='text'>圧縮電子精神音楽浮遊構造体</title><subtitle type='html'>圧縮アルゴリズムを考えつつ音楽を作ったり聴いたりするプログラマの無意識の意識化</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-480365044800398880</id><published>2012-02-25T21:27:00.003+09:00</published><updated>2012-02-29T00:25:25.603+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='正規表現'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='jsFiddle'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>JavaScriptコードをトークンに分解する正規表現</title><content type='html'>&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;/(\/\*[\s\S]*?\*\/|\/{2,}[^\r\n]*(?:\r\n|\r|\n|)|&amp;quot;(?:\\[\s\S]|[^&amp;quot;\r\n\\])*&amp;quot;|'(?:\\[\s\S]|[^'\r\n\\])*'|(?:(?:\/(?!\*)(?:\\.|[^\/\r\n\\])+\/)(?:[gimy]{0,4}|\b)(?=\s*(?:(?!\s*[\/\\&amp;lt;&amp;gt;*+%`^&amp;quot;'\w$-])[^\/\\&amp;lt;&amp;gt;*+%`^'&amp;quot;@({[\w$-]|===?|!==?|\|\||[&amp;amp;][&amp;amp;]|\/[*\/]|[,.;:!?)}\]\r\n]|$)))|&amp;lt;([^\s&amp;gt;]*)[^&amp;gt;]*&amp;gt;[\s\S]*?&amp;lt;\/\2&amp;gt;|&amp;gt;&amp;gt;&amp;gt;=?|&amp;lt;&amp;lt;=|===|!==|&amp;gt;&amp;gt;=|\+\+(?=\+)|\-\-(?=\-)|[=!&amp;lt;&amp;gt;*+\/&amp;amp;|^-]=|[&amp;amp;][&amp;amp;]|\|\||\+\+|\-\-|&amp;lt;&amp;lt;|&amp;gt;&amp;gt;|0(?:[xX][0-9a-fA-F]+|[0-7]+)|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|[1-9]\d*|[-+\/%*=&amp;amp;|^~&amp;lt;&amp;gt;!?:,;@()\\[\].{}]|(?![\r\n])\s+|(?:\r\n|\r|\n)|[^\s+\/%*=&amp;amp;|^~&amp;lt;&amp;gt;!?:,;@()\\[\].{}'&amp;quot;-]+)/g&lt;br /&gt;&lt;/pre&gt;これがパターンです。&lt;br /&gt;&lt;br /&gt;例えば、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;/* comment */&lt;br /&gt;var regex = /[\/\\&amp;quot;']*/g;&lt;br /&gt;var str = &amp;quot;hoge\&amp;quot;fuga'\&lt;br /&gt;piyo&amp;quot;;&lt;br /&gt;// 'comment'&lt;br /&gt;var arr = [&lt;br /&gt;  0x0FFF, 1e8, 0, 12345,&lt;br /&gt;  3.524603890386048e+24,&lt;br /&gt;  0.0006215, 0666&lt;br /&gt;];&lt;br /&gt;var i = 0;&lt;br /&gt;var e4x = &amp;lt;&amp;gt;{{///*E4X*///}}&amp;lt;/&amp;gt;;&lt;br /&gt;var xml = &amp;lt;root&amp;gt;&amp;lt;hoge fuga=&amp;quot;piyo&amp;quot; /&amp;gt;&amp;lt;/root&amp;gt;;&lt;br /&gt;var ほげ = '/*&amp;quot;ほ//げ&amp;quot;*/';&lt;br /&gt;var $var = re.test(str) &amp;amp;&amp;amp; arr[2] || (i+++i) === 1;&lt;br /&gt;&lt;/pre&gt;このコードを文字列として code.match(pattern) すると、以下の要素を持った配列が得られます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;0: /* comment */&lt;br /&gt;1: &lt;br /&gt;&lt;br /&gt;2: var&lt;br /&gt;3:  &lt;br /&gt;4: regex&lt;br /&gt;5:  &lt;br /&gt;6: =&lt;br /&gt;7:  &lt;br /&gt;8: /[\/\\&amp;quot;']*/g&lt;br /&gt;9: ;&lt;br /&gt;10: &lt;br /&gt;&lt;br /&gt;11: var&lt;br /&gt;12:  &lt;br /&gt;13: str&lt;br /&gt;14:  &lt;br /&gt;15: =&lt;br /&gt;16:  &lt;br /&gt;17: &amp;quot;hoge\&amp;quot;fuga'\&lt;br /&gt;piyo&amp;quot;&lt;br /&gt;18: ;&lt;br /&gt;19: &lt;br /&gt;&lt;br /&gt;20: // 'comment'&lt;br /&gt;&lt;br /&gt;21: var&lt;br /&gt;22:  &lt;br /&gt;23: arr&lt;br /&gt;24:  &lt;br /&gt;25: =&lt;br /&gt;26:  &lt;br /&gt;27: [&lt;br /&gt;28: &lt;br /&gt;&lt;br /&gt;29:   &lt;br /&gt;30: 0x0FFF&lt;br /&gt;31: ,&lt;br /&gt;32:  &lt;br /&gt;33: 1e8&lt;br /&gt;34: ,&lt;br /&gt;35:  &lt;br /&gt;36: 0&lt;br /&gt;37: ,&lt;br /&gt;38:  &lt;br /&gt;39: 12345&lt;br /&gt;40: ,&lt;br /&gt;41: &lt;br /&gt;&lt;br /&gt;42:   &lt;br /&gt;43: 3.524603890386048e+24&lt;br /&gt;44: ,&lt;br /&gt;45: &lt;br /&gt;&lt;br /&gt;46:   &lt;br /&gt;47: 0.0006215&lt;br /&gt;48: ,&lt;br /&gt;49:  &lt;br /&gt;50: 0666&lt;br /&gt;51: &lt;br /&gt;&lt;br /&gt;52: ]&lt;br /&gt;53: ;&lt;br /&gt;54: &lt;br /&gt;&lt;br /&gt;55: var&lt;br /&gt;56:  &lt;br /&gt;57: i&lt;br /&gt;58:  &lt;br /&gt;59: =&lt;br /&gt;60:  &lt;br /&gt;61: 0&lt;br /&gt;62: ;&lt;br /&gt;63: &lt;br /&gt;&lt;br /&gt;64: var&lt;br /&gt;65:  &lt;br /&gt;66: e4x&lt;br /&gt;67:  &lt;br /&gt;68: =&lt;br /&gt;69:  &lt;br /&gt;70: &amp;lt;&amp;gt;{{///*E4X*///}}&amp;lt;/&amp;gt;&lt;br /&gt;71: ;&lt;br /&gt;72: &lt;br /&gt;&lt;br /&gt;73: var&lt;br /&gt;74:  &lt;br /&gt;75: xml&lt;br /&gt;76:  &lt;br /&gt;77: =&lt;br /&gt;78:  &lt;br /&gt;79: &amp;lt;root&amp;gt;&amp;lt;hoge fuga=&amp;quot;piyo&amp;quot; /&amp;gt;&amp;lt;/root&amp;gt;&lt;br /&gt;80: ;&lt;br /&gt;81: &lt;br /&gt;&lt;br /&gt;82: var&lt;br /&gt;83:  &lt;br /&gt;84: ほげ&lt;br /&gt;85:  &lt;br /&gt;86: =&lt;br /&gt;87:  &lt;br /&gt;88: '/*&amp;quot;ほ//げ&amp;quot;*/'&lt;br /&gt;89: ;&lt;br /&gt;90: &lt;br /&gt;&lt;br /&gt;91: var&lt;br /&gt;92:  &lt;br /&gt;93: $var&lt;br /&gt;94:  &lt;br /&gt;95: =&lt;br /&gt;96:  &lt;br /&gt;97: re&lt;br /&gt;98: .&lt;br /&gt;99: test&lt;br /&gt;100: (&lt;br /&gt;101: str&lt;br /&gt;102: )&lt;br /&gt;103:  &lt;br /&gt;104: &amp;amp;&amp;amp;&lt;br /&gt;105:  &lt;br /&gt;106: arr&lt;br /&gt;107: [&lt;br /&gt;108: 2&lt;br /&gt;109: ]&lt;br /&gt;110:  &lt;br /&gt;111: ||&lt;br /&gt;112:  &lt;br /&gt;113: (&lt;br /&gt;114: i&lt;br /&gt;115: ++&lt;br /&gt;116: +&lt;br /&gt;117: i&lt;br /&gt;118: )&lt;br /&gt;119:  &lt;br /&gt;120: ===&lt;br /&gt;121:  &lt;br /&gt;122: 1&lt;br /&gt;123: ;&lt;br /&gt;&lt;/pre&gt;そもそもシンタックスハイライトのほうが崩れてる…。&lt;br /&gt;&lt;br /&gt;jsFiddle でテストできます。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jsfiddle.net/polygonplanet/5gWtm/" target="_blank" title="JavaScriptコードをトークンに分解する正規表現 - jsFiddle" style="font-weight: bold;"&gt;JavaScriptコードをトークンに分解する正規表現 - jsFiddle&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;文字列は、改行の前にバックスラッシュ (\) がある場合も対応してみました。&lt;br /&gt;セミコロン挿入もあって、スペースと改行は区別されます。&lt;br /&gt;&lt;br /&gt;E4X はシンプルなのだけ対応してます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var x = &amp;lt;root&amp;gt;&amp;lt;div id={(function() {&lt;br /&gt;    return '&amp;lt;/root&amp;gt;' ? 'hoge' : 'fuga';&lt;br /&gt;}())}&amp;gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;/pre&gt;こういうのは無理っぽい。あとネストとか。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;match() に g つけて match(/(...)/g) がこんな便利だなんて…。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-480365044800398880?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/480365044800398880/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/480365044800398880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/480365044800398880'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/javascript.html' title='JavaScriptコードをトークンに分解する正規表現'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-7181750247456838334</id><published>2012-02-24T22:11:00.001+09:00</published><updated>2012-02-25T19:53:10.774+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='Deferred'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='CPU'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='イテレータ'/><category scheme='http://www.blogger.com/atom/ns#' term='Pot.js'/><category scheme='http://www.blogger.com/atom/ns#' term='PotLite.js'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='アルゴリズム'/><category scheme='http://www.blogger.com/atom/ns#' term='ReleaseNotes'/><title type='text'>同期処理を非同期に変換-JavaScriptライブラリPot.js+PotLite.jsリリースノート</title><content type='html'>&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wwyHCwNF-tk/T0eLp4LA25I/AAAAAAAAFCw/Us94EuklM_M/s1600/pot.js.mini.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="101" src="http://2.bp.blogspot.com/-wwyHCwNF-tk/T0eLp4LA25I/AAAAAAAAFCw/Us94EuklM_M/s200/pot.js.mini.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" style="font-weight: bold; margin-left: 1.5em;" title="Pot.js zip"&gt;Pot.js 1.14&lt;/a&gt; と &lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" style="font-weight: bold;" title="PotLite.js  zip"&gt;PotLite.js 1.31&lt;/a&gt; リリースしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;その前に &lt;a href="http://polygonplanet.github.com/Pot.js/" style="font-size: 120%; font-weight: bold;" title="Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library"&gt;Pot.js + PotLite.js リファレンス&lt;/a&gt; が完成しました (ということにしたい) ので、&lt;br /&gt;お時間あるときにでも覗いてみてください。&lt;br /&gt;&lt;br /&gt;結局 /test-for-new-design/ に置いてあるのはファイル消すのも嫌だし&lt;br /&gt;全部リダイレクトさせるようにしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pot.js 1.14 と PotLite.js 1.31 では、&lt;a href="http://polygonplanet.github.com/Pot.js/#reference.function.Pot.Deferred.deferreed" target="_blank" title="Pot.Deferred.deferreed -  Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library"&gt;Pot.&lt;b&gt;deferreed()&lt;/b&gt;&lt;/a&gt; ていう関数つくりました。&lt;br /&gt;&lt;br /&gt;deferreed は、関数の中の for, for-in, for-of, do, while 等の同期ループを&lt;br /&gt;Pot.Deferred.forEach() などの非同期イテレータに置き換えて関数を再定義します。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2012/02/javascript-whilepotdeferredforevercpu.html" title="JavaScript whileループとPot.Deferred.forEverイテレータでCPU使用率を比較-Pot.js+PotLite.jsリリースノート | 圧縮電子精神音楽浮遊構造体"&gt;前の記事「JavaScript whileループとPot.Deferred.forEverイテレータでCPU使用率を比較」&lt;/a&gt; でも書いてますが、&lt;br /&gt;Pot.js ライブラリのイテレータは CPU の負荷なく実行できます。&lt;br /&gt;&lt;br /&gt;ループを置き換えることで、巨大な文字列を扱ったり、ループ回数が未知な処理をする際に&lt;br /&gt;重さについて考えなくて済むようにと、作ってみまみた。&lt;br /&gt;&lt;br /&gt;もともとは &lt;a href="http://polygonplanet.github.com/Pot.js/#reference.function.Pot.Deferred.deferrize" target="_blank" title="Pot.Deferred.deferrize - Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library"&gt;deferrize()&lt;/a&gt; という関数から派生しています。&lt;br /&gt;&lt;br /&gt;関数内のコードをトークン単位に分解して、&lt;br /&gt;単純にトークンの数が多いループブロックをメインループとして解析して、&lt;br /&gt;その文に見合った Pot.Deferred イテレータを割り当ててるんですが&lt;br /&gt;ぜんぜん思ったよりたいへんで まだ複雑なものは対応できてないです。&lt;br /&gt;とくに三項演算子 (?:) と function のコンボとか、E4X とかまでは今後の課題。。 にしたいけど、&lt;br /&gt;そこまでしてたらライブラリの方向性違うんじゃないのって思ってしかたないです。&lt;br /&gt;&lt;br /&gt;deferreed の 1 コールで zip.deflate 圧縮とかファイル規模への md5 とか非同期化できたら楽そう。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-source-code"&gt;例えば以下のような関数が&lt;/h2&gt;&lt;pre class="js" name="code" style="-moz-background-inline-policy: continuous; background: none repeat scroll 0% 0% white; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre-wrap; word-wrap: break-word;"&gt;// 文字列を charCode からなる配列にして返す関数&lt;br /&gt;var toCharCode = function(string) {&lt;br /&gt;    var result = [];&lt;br /&gt;    for (var i = 0; i &amp;lt; string.length; i++) {&lt;br /&gt;        result.push(string.charCodeAt(i));&lt;br /&gt;    }&lt;br /&gt;    return result;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// deferreed により for 文を非同期イテレータにした関数を生成&lt;br /&gt;var toCharCodeDefer = Pot.deferreed(toCharCode);&lt;br /&gt;&lt;br /&gt;// 例えば toCharCodeDefer は内部で以下のような感じに変換される&lt;br /&gt;//&lt;br /&gt;//  function(string) {&lt;br /&gt;//      var result = [];&lt;br /&gt;//      return Pot.Deferred.repeat(string.length, function(i) {&lt;br /&gt;//          result.push(string.charCodeAt(i));&lt;br /&gt;//      }).then(function() {&lt;br /&gt;//          return result;&lt;br /&gt;//      });&lt;br /&gt;//  };&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;// Pot.Deferred インスタンスが返るため then() などで繋げられる&lt;br /&gt;toCharCodeDefer('abc').then(function(res) {&lt;br /&gt;    Pot.debug(res); // [97, 98, 99]&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// この変化により、巨大な文字列でも負荷を分散させ実行できる&lt;br /&gt;var largeString = new Array(100000).join('abcdef');&lt;br /&gt;&lt;br /&gt;// 'slow' などの指定が可能&lt;br /&gt;toCharCodeDefer.slow(largeString).then(function(res) {&lt;br /&gt;    Pot.debug(res.length); // 599994&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;あと、プラグインみたいなことしたくて&lt;br /&gt;Pot.Plugin ての作ったんですが、なにか違うような気がしてならないです。&lt;br /&gt;&lt;br /&gt;プラグイン = ただのオブジェクト&lt;br /&gt;&lt;br /&gt;になってしまった。&lt;br /&gt;&lt;br /&gt;Pot.addPlugin() という関数で任意の関数とかオブジェクトを登録。&lt;br /&gt;Pot.removePlugin() で削除。 Pot.hasPlugin() で確認、Pot.listPlugin() で列挙。&lt;br /&gt;&lt;br /&gt;addPlugin した関数は Pot.xxx でアクセスできる。&lt;br /&gt;&lt;br /&gt;・・・それって &lt;code&gt;Pot.myFunc = function() {};&lt;/code&gt; でいいじゃん!&lt;br /&gt;てなったので、以下のようにしてみました。&lt;br /&gt;&lt;br /&gt;&lt;pre class="js" name="code" style="-moz-background-inline-policy: continuous; background: none repeat scroll 0% 0% white; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre-wrap; word-wrap: break-word;"&gt;var string = '\t abc\n \t ';&lt;br /&gt;&lt;br /&gt;// オリジナルの Pot.trim()&lt;br /&gt;debug(Pot.trim(string)); // 'abc'&lt;br /&gt;&lt;br /&gt;// プラグイン関数の登録により Pot.trim() を上書き&lt;br /&gt;Pot.addPlugin('trim', function(s) {&lt;br /&gt;    return s.replace(/^ +| +$/g, ''); // スペース (U+0020) だけ削除するようにする&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// 登録した Pot.trim()&lt;br /&gt;debug(Pot.trim(string)); // '\t abc\n \t'&lt;br /&gt;&lt;br /&gt;// プラグインの trim を削除&lt;br /&gt;Pot.removePlugin('trim');&lt;br /&gt;&lt;br /&gt;// 元に戻る&lt;br /&gt;debug(Pot.trim(string)); // 'abc'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;元に戻せる (むしろ消えない) ので、一時的に挙動を変えたい時とか便利かもしれないです。&lt;br /&gt;あと、Pot.globalize() したときに プラグイン関数もグローバル化します。&lt;br /&gt;Pot.globalize() しなくても &lt;code&gt;with (Pot) {...}&lt;/code&gt; でもいい気がしてきました。&lt;br /&gt;&lt;br /&gt;プラグインの詳細は &lt;a href="http://polygonplanet.github.com/Pot.js/#reference.function.Pot.addPlugin" target="_blank" title="Pot.addPlugin - Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library"&gt;Pot.Plugin リファレンス&lt;/a&gt; あたりから参照ください。&lt;br /&gt;&lt;br /&gt;マニュアルは英語版も含めてちょっとずつ進めています。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;以下はレポジトリとかのリンクなど。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potjs"&gt;Pot.js / PotLite.js&lt;/h2&gt;Pot.js は CPU に負荷をかけることなく JavaScript の実行を可能とするユーティリティライブラリです。&lt;br /&gt;&lt;br /&gt;PotLite.js は Pot.js の非同期な部分だけを抽出したライトバージョンです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ダウンロード&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" style="font-weight: bold;" title="Pot.js / PotLite.js master zip"&gt;Pot.js / PotLite.js 最新&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;マニュアル&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/" style="font-weight: bold;" title="Pot.js + PotLite.js - Document and Reference - JavaScript Async + Utility Library"&gt;Pot.js + PotLite.js - Document and Reference - JavaScript Async Utility Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;その他の情報についてはマニュアル/マニュアルからのリンク から参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js" style="font-weight: bold;" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;その他、なにか問題・バグ・感想・指摘などあれば、&lt;br /&gt;コメントやメールまたは &lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;@polygon_planet&lt;/a&gt; まで送っていただけるとうれしいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-7181750247456838334?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/7181750247456838334/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/javascriptpotjspotlitejs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/7181750247456838334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/7181750247456838334'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/javascriptpotjspotlitejs.html' title='同期処理を非同期に変換-JavaScriptライブラリPot.js+PotLite.jsリリースノート'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wwyHCwNF-tk/T0eLp4LA25I/AAAAAAAAFCw/Us94EuklM_M/s72-c/pot.js.mini.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2978647262445903361</id><published>2012-02-18T05:40:00.000+09:00</published><updated>2012-02-18T05:40:13.088+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='リブログ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tumblrのリブログ/ポストのリミット残数が確認できるTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;Tumblr でリブログ/ポスト できる残りリミット数を表示する Tombloo パッチです。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://4.bp.blogspot.com/-cM9CnWe-Gm4/Tz644Tt-qJI/AAAAAAAAFCo/_RqjGb8z-1o/s1600/tombloo-patch-tumblr-post-reblog-limit-contextmenu.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-cM9CnWe-Gm4/Tz644Tt-qJI/AAAAAAAAFCo/_RqjGb8z-1o/s1600/tombloo-patch-tumblr-post-reblog-limit-contextmenu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;前々から作ろうとしてて、でも正確に計算できないと思って困ってましたが&lt;br /&gt;べつに ちょっとくらい違ってもいいやって作りました。&lt;br /&gt;&lt;br /&gt;リセットされる正確な時間がずっとわからずに&lt;br /&gt;16:00 なのか 14:00 なのか 14:15 なのか&lt;br /&gt;いろんな違う情報があって曖昧です。&lt;br /&gt;先日、このパッチのテストのため リミットまでリブログして&lt;br /&gt;次の日の 14:00 過ぎにポストしたらリセットされてました。&lt;br /&gt;タンブリストが 14:00 だよ! て言ってくれたので間違いないと思います。&lt;br /&gt;&lt;br /&gt;それと、タイムゾーンで考えると 14 が自然な数値だともわかります。&lt;br /&gt;Tumblr, Inc. はニューヨークにあります。&lt;br /&gt;ニューヨークのタイムゾーンは EST (Eastern Standard Time) で、&lt;br /&gt;GMT -5 時間になり、 日本との時差は -14 時間です。&lt;br /&gt;人間が考えそうなリセット時間はおそらく 0:00 ですので、&lt;br /&gt;日本ではちょうど 14:00 にリセットされることになります。&lt;br /&gt;&lt;br /&gt;そんなわけでパッチでは 14:00 にリセットされる設定になってます。&lt;br /&gt;&lt;br /&gt;このパッチはテストに日数がかかるので、まだ完全な状態じゃないかもしれません。&lt;br /&gt;そもそも Tombloo 以外からリブログしたら、その数だけ狂っていきます。&lt;br /&gt;とは言っても、&lt;a href="http://www.tumblr.com/new/photo" title="http://www.tumblr.com/new/photo"&gt;http://www.tumblr.com/new/photo&lt;/a&gt; を見ているので&lt;br /&gt;ある程度リミットに近くなったら整合性はとれるはずです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;機能:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tumblr のリブログ/ポストのリミット残数が確認できる&lt;/li&gt;&lt;li&gt;「アカウント切り替え」に対応&lt;/li&gt;&lt;li&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/posttombloo.html" title="POST完了時に通知メッセージを表示するTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「ポスト完了時に通知メッセージを表示するパッチ」&lt;/a&gt;と連携&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;「ポスト完了時に通知メッセージを表示するパッチ」と連携 は、&lt;br /&gt;Tumblr にリブログ/ポストすると、以下のような &lt;b&gt;Post&lt;/b&gt; と &lt;b&gt;Reblog&lt;/b&gt; の表示が付くようになります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://3.bp.blogspot.com/-8QOK4hMTMKM/Tz6vHZ0lCVI/AAAAAAAAFCg/CYHKoBUVW-g/s1600/tombloo-patch-tumblr-post-reblog-limit-notify.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8QOK4hMTMKM/Tz6vHZ0lCVI/AAAAAAAAFCg/CYHKoBUVW-g/s1600/tombloo-patch-tumblr-post-reblog-limit-notify.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;上のメッセージを表示させるパッチは、&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/posttombloo.html" title="POST完了時に通知メッセージを表示するTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「ポスト完了時に通知メッセージを表示するパッチ」&lt;/a&gt; からインストールできます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;修正や改善策などあれば地味にアップデートしていきます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;問題等あればパッチ削除してください。&lt;br /&gt;&lt;br /&gt;パッチの削除がわからなかったら、&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/07/tombloo.html" title="インストールされてる全てのパッチを一括でアップデートできるTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;パッチ一括アップデートぱっち&lt;/a&gt; で削除もできます。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.model.tumblr.postlimit.message.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.model.tumblr.postlimit.message.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-2978647262445903361?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/2978647262445903361/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/tumblrtombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2978647262445903361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2978647262445903361'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/tumblrtombloo.html' title='Tumblrのリブログ/ポストのリミット残数が確認できるTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cM9CnWe-Gm4/Tz644Tt-qJI/AAAAAAAAFCo/_RqjGb8z-1o/s72-c/tombloo-patch-tumblr-post-reblog-limit-contextmenu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-6784434992145707007</id><published>2012-02-11T22:15:00.000+09:00</published><updated>2012-02-11T22:15:14.240+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='Deferred'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='CPU'/><category scheme='http://www.blogger.com/atom/ns#' term='サンプル'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='圧縮'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='イテレータ'/><category scheme='http://www.blogger.com/atom/ns#' term='Pot.js'/><category scheme='http://www.blogger.com/atom/ns#' term='PotLite.js'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='比較'/><category scheme='http://www.blogger.com/atom/ns#' term='ベンチマーク'/><category scheme='http://www.blogger.com/atom/ns#' term='jsFiddle'/><category scheme='http://www.blogger.com/atom/ns#' term='ReleaseNotes'/><title type='text'>JavaScript whileループとPot.Deferred.forEverイテレータでCPU使用率を比較-Pot.js+PotLite.jsリリースノート</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" title="Pot.js zip" style="font-weight: bold;"&gt;Pot.js 1.13&lt;/a&gt; と &lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" title="PotLite.js  zip" style="font-weight: bold;"&gt;PotLite.js 1.30&lt;/a&gt; リリースしました。&lt;br /&gt;&lt;br /&gt;Pot.js 1.13 と PotLite.js 1.30 では、主に内部ループ処理を大幅に高速化しました。&lt;br /&gt;(そろそろ ChangeLog 作らないとまずいかも…)&lt;br /&gt;&lt;br /&gt;あとは、変数宣言とか &lt;a href="http://polygon-planet.blogspot.com/2011/12/javascript-function-function.html" title="JavaScriptの無名関数の実行 (function(){})() と (function(){}()) の違い | 圧縮電子精神音楽浮遊構造体"&gt;例の (function(){}())&lt;/a&gt; とか (結局直してる)&lt;br /&gt;細かい修正などです。&lt;br /&gt;&lt;br /&gt;先日、&lt;a href="https://news.ycombinator.com/item?id=3566141" title="Pot.js is a utility library that can execute JavaScript without burdening CPU. | Hacker News"&gt;Hacker News&lt;/a&gt; や &lt;a href="http://www.echojs.com/news/418" title="Pot.js + PotLite.js - JavaScript Async + String Utility Library - Echo JS"&gt;Echo JS&lt;/a&gt; で Pot.js が紹介されました (ありがとうございます)。&lt;br /&gt;でもアクセスが今までの 1000 倍くらいになって、すごいことになってちょっとビビった。&lt;br /&gt;(API サーバのほうは適当に調節しておいたので大丈夫だった。よかった。。)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;それで Pot.js の本来の存在意義ですが、&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;実行環境の CPU に負荷をかけることなく JavaScript が実行できる。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;といったことが本来の目的であり、常に追求している目標でもあります。&lt;br /&gt;Deferred が重点にとらわれがちですが、Pot.Deferred はそれの足がかりであり、&lt;br /&gt;Pot.Deferred だけがライブラリの中核ではないので、いろいろ使ってみてください。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-new-reference"&gt;新しいデザインのリファレンス&lt;/h2&gt;現在、新しいデザインでリファレンスを書き直しています。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/test-for-new-design/" title="Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library" style="font-weight: bold;"&gt;Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;前は 全部で 1 ファイルになっちゃってて、どんどん重くなるし更新もやり難くて&lt;br /&gt;どうしようもなかったのですが、今回は 各ページを非同期読み込みにして&lt;br /&gt;英語版と日本語版で見れるようにして、戻るボタンとかも再現したり、がんばってます。&lt;br /&gt;&lt;br /&gt;でもまだ作成途中です (2012-02-11 現在)。&lt;br /&gt;&lt;br /&gt;ある程度完成したら 本来の /index.html に移動させようと思ってるんですが、&lt;br /&gt;先ほどの Echo JS などが /test-for-new-design/ にリンクしちゃってるもんだから&lt;br /&gt;どうしようかと考え中。(たぶん リダイレクトか、もうこのままでいいか…)。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-example-run"&gt;CPU 比較を実行&lt;/h2&gt;jsFiddle のほうで&lt;br /&gt;JavaScript の while ループと、Pot.js の非同期イテレータとで CPU 使用率の比較を書いてみました。&lt;br /&gt;前に書いた &lt;a href="http://polygon-planet.blogspot.com/2011/11/javascript.html" title="フリーズやカクカクしない安定した動作のアプリやアドオン、ゲームなどが作れるJavaScriptライブラリ | 圧縮電子精神音楽浮遊構造体"&gt;Pot.js イテレータと jQuery.each と for ループの CPU 使用率をグラフで比較&lt;/a&gt;&lt;br /&gt;と同じ事ですが、実際に実行できます (ただし負荷テストなのでブラウザクラッシュに気をつけてください)。&lt;br /&gt;もっとも最近のブラウザはループでクラッシュしないと思いますが。。&lt;br /&gt;&lt;br /&gt;CPU 使用率は、Web ブラウザからの JavaScript では取得できないと思うので、&lt;br /&gt;CPU モニタリングするアプリとか、&lt;br /&gt;なければ Win ならタスクマネージャから「パフォーマンス」→ 「CPU 使用率」&lt;br /&gt;を見ながら実行してみるとわかりやすいと思います。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jsfiddle.net/polygonplanet/Kg6Sa/" title="JavaScript whileループとPot.Deferred.forEverイテレータのCPU使用率を比較 - jsFiddle" style="font-weight: bold;"&gt;JavaScript while ループと Pot.Deferred.forEver イテレータの CPU 使用率を比較 - jsFiddle&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;今回は while 文と Pot.Deferred.forEver の比較ですが、&lt;br /&gt;Pot.js 非同期イテレータは CPU 負荷が一定量に抑えられたループが可能になっていると思います。&lt;br /&gt;ただし、この例のような処理だと実行時間はある程度伸びてしまいます。&lt;br /&gt;&lt;br /&gt;実行時間に関しては 速度調整 が可能なので、処理に応じたスピードを選ぶこともできます。&lt;br /&gt;(このへんは今後改善したいです)。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-source-code"&gt;サンプルのソースコード&lt;/h2&gt;jsFiddle でも確認できますが、今回使用したサンプルのソースコードです。&lt;br /&gt;ループ処理の部分だけ抽出しています。&lt;br /&gt;&lt;br /&gt;JavaScript while ループを使ったソースコード:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// while で同期ループして圧縮&lt;br /&gt;compressSync : function(s) {&lt;br /&gt;  var a = 53300, b, c, d, e, f, g = -1,&lt;br /&gt;      h, i, r = [], x = String.fromCharCode;&lt;br /&gt;&lt;br /&gt;  s = new Array(a--).join(' ') + s;&lt;br /&gt;  while ((b = s.substr(a, 256))) {&lt;br /&gt;    for (c = 2, i = b.length; c &amp;lt;= i; ++c) {&lt;br /&gt;      d = s.substring(&lt;br /&gt;          a - 52275,&lt;br /&gt;          a + c - 1&lt;br /&gt;      ).lastIndexOf(b.substring(0, c));&lt;br /&gt;      if (!~d) {&lt;br /&gt;        break;&lt;br /&gt;      }&lt;br /&gt;      e = d;&lt;br /&gt;    }&lt;br /&gt;    if (c === 2 || c === 3 &amp;amp;&amp;amp; f === g) {&lt;br /&gt;      f = g;&lt;br /&gt;      h = s.charCodeAt(a++);&lt;br /&gt;      r.push(&lt;br /&gt;          x(h &amp;gt;&amp;gt; 8 &amp;amp; 255),&lt;br /&gt;          x(h &amp;amp; 255)&lt;br /&gt;      );&lt;br /&gt;    } else {&lt;br /&gt;      r.push(&lt;br /&gt;          x((e &amp;gt;&amp;gt; 8 &amp;amp; 255) | 65280),&lt;br /&gt;          x(e &amp;amp; 255),&lt;br /&gt;          x(c - 3)&lt;br /&gt;      );&lt;br /&gt;      a += c - 1;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return r.join('');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pot.js 非同期イテレータ (今回は Pot.Deferred.forEver) を使ったソースコード:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// Pot.js 非同期イテレータで圧縮&lt;br /&gt;compressAsync : function(s) {&lt;br /&gt;  var a = 53300, b, c, d, e, f, g = -1,&lt;br /&gt;      h, i, r = [], x = String.fromCharCode;&lt;br /&gt;&lt;br /&gt;  var deferred = new Pot.Deferred();&lt;br /&gt;&lt;br /&gt;  s = new Array(a--).join(' ') + s;&lt;br /&gt;&lt;br /&gt;  // whileループを forEver に置き換え&lt;br /&gt;  Pot.Deferred.forEver[SPEED](function() {&lt;br /&gt;    &lt;br /&gt;    b = s.substr(a, 256);&lt;br /&gt;    if (!b) {&lt;br /&gt;      throw Pot.StopIteration;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    for (c = 2, i = b.length; c &amp;lt;= i; ++c) {&lt;br /&gt;      d = s.substring(&lt;br /&gt;          a - 52275,&lt;br /&gt;          a + c - 1&lt;br /&gt;      ).lastIndexOf(b.substring(0, c));&lt;br /&gt;      if (!~d) {&lt;br /&gt;        break;&lt;br /&gt;      }&lt;br /&gt;      e = d;&lt;br /&gt;    }&lt;br /&gt;    if (c === 2 || c === 3 &amp;amp;&amp;amp; f === g) {&lt;br /&gt;      f = g;&lt;br /&gt;      h = s.charCodeAt(a++);&lt;br /&gt;      r.push(&lt;br /&gt;          x(h &amp;gt;&amp;gt; 8 &amp;amp; 255),&lt;br /&gt;          x(h &amp;amp; 255)&lt;br /&gt;      );&lt;br /&gt;    } else {&lt;br /&gt;      r.push(&lt;br /&gt;          x((e &amp;gt;&amp;gt; 8 &amp;amp; 255) | 65280),&lt;br /&gt;          x(e &amp;amp; 255),&lt;br /&gt;          x(c - 3)&lt;br /&gt;      );&lt;br /&gt;      a += c - 1;&lt;br /&gt;    }&lt;br /&gt;  }).then(function() {&lt;br /&gt;    deferred.begin(r.join(''));&lt;br /&gt;  }, function(err) {&lt;br /&gt;    deferred.raise(err);&lt;br /&gt;  });&lt;br /&gt;  return deferred;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;同期か非同期かの違いがありますが、&lt;br /&gt;単に、メインの while 文を Pot.Deferred.forEver に変えてるだけです。&lt;br /&gt;forEver は、StopIteration が throw されるまで、永久にループする関数です。&lt;br /&gt;&lt;br /&gt;あと、この関数は &lt;a href="http://polygon-planet.blogspot.com/2011/02/lz77javascript.html" title="LZ77アルゴリズムによる圧縮関数をJavaScript最短コードで | 圧縮電子精神音楽浮遊構造体"&gt;LZ77アルゴリズムによる圧縮関数をJavaScript最短コードで | 圧縮電子精神音楽浮遊構造体&lt;/a&gt;&lt;br /&gt;で作ったソースコードをちょっとだけ手直ししたものです。&lt;br /&gt;文字列を圧縮解凍します。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potjs"&gt;Pot.js / PotLite.js&lt;/h2&gt;Pot.js は CPU に負荷をかけることなく JavaScript の実行を可能とするユーティリティライブラリです。&lt;br /&gt;&lt;br /&gt;PotLite.js は Pot.js の非同期な部分だけを抽出したライトバージョンです。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ダウンロード&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" title="Pot.js / PotLite.js master zip" style="font-weight:bold;"&gt;Pot.js / PotLite.js 最新&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;マニュアル&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/test-for-new-design/index.html" title="Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library (作成中)" style="font-weight:bold;"&gt;Pot.js + PotLite.js - Document and Reference - JavaScript Async + String Utility Library (作成中)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス - JavaScriptライブラリ" style="font-weight:bold;"&gt;Pot.js + PotLite.js ドキュメント リファレンス&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;マニュアルは上に書いたように 2012-02-11 現在、まだすべてのオブジェクトの解説ができてません。。&lt;br /&gt;&lt;br /&gt;その他の情報についてはマニュアル/マニュアルからのリンク から参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub" style="font-weight:bold;"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;その他、なにか問題・バグ・感想・指摘などあれば、&lt;br /&gt;コメントやメールまたは &lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;@polygon_planet&lt;/a&gt; まで送っていただけるとうれしいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-6784434992145707007?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/6784434992145707007/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/javascript-whilepotdeferredforevercpu.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/6784434992145707007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/6784434992145707007'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/02/javascript-whilepotdeferredforevercpu.html' title='JavaScript whileループとPot.Deferred.forEverイテレータでCPU使用率を比較-Pot.js+PotLite.jsリリースノート'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-8846936036080624756</id><published>2012-01-22T05:35:00.000+09:00</published><updated>2012-01-22T05:35:01.554+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>TomblooでTwitpicが動かないのでとりあえずFixのパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;Tombloo から &lt;a href="https://twitpic.com/" title="TwitPic"&gt;Twitpic&lt;/a&gt; にポストできなくなってたので&lt;br /&gt;とりあえず動くようにして、あとアイコンが https のほうじゃないと 403 だったからそれも修正したパッチ。&lt;br /&gt;&lt;br /&gt;あまり確認してないので、あとで本体がアプデで修正したらパッチ削除したほうがいいです。&lt;br /&gt;&lt;br /&gt;パッチの削除がわからなかったら、&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/07/tombloo.html" title="インストールされてる全てのパッチを一括でアップデートできるTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;パッチ一括アップデートぱっち&lt;/a&gt; で削除もできます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.model.twitpic.fixicon.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.model.twitpic.fixicon.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-8846936036080624756?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/8846936036080624756/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/tomblootwitpicfix.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8846936036080624756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8846936036080624756'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/tomblootwitpicfix.html' title='TomblooでTwitpicが動かないのでとりあえずFixのパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-1805323199526002620</id><published>2012-01-11T21:50:00.003+09:00</published><updated>2012-01-12T23:43:25.051+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='サンプル'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='FileAPI'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Pot.js'/><category scheme='http://www.blogger.com/atom/ns#' term='PotLite.js'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='ReleaseNotes'/><category scheme='http://www.blogger.com/atom/ns#' term='DragAndDrop'/><title type='text'>HTML5 File APIでドラッグ＆ドロップのサンプル-Pot.js+PotLite.jsリリースノート</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" title="Pot.js zip" style="font-weight: bold;"&gt;Pot.js 1.11&lt;/a&gt; と &lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" title="PotLite.js  zip" style="font-weight: bold;"&gt;PotLite.js 1.28&lt;/a&gt; リリースしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;主な新機能として、HTML5 の File API を使った&lt;br /&gt;ファイルのドラッグ＆ドロップ を扱う &lt;strong&gt;Pot.DropFile&lt;/strong&gt; を実装しました。&lt;br /&gt;&lt;br /&gt;Pot.DropFile は FileReader でドロップされたファイルをアップロードしたり&lt;br /&gt;内容やサイズを取得してその場で処理することが可能です。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-SDejvmmXyoY/Tw0q5d_1K5I/AAAAAAAAFCE/ilhrIbv1NHc/s1600/drag-and-drop.png" imageanchor="1"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-SDejvmmXyoY/Tw0q5d_1K5I/AAAAAAAAFCE/ilhrIbv1NHc/s320/drag-and-drop.png" width="288" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;HTML5 とドラッグ＆ドロップイベントをサポートしてるブラウザ (Firefox, GoogleChrome, Safari) で&lt;br /&gt;このブログ内に、デスクトップなどから画像やテキストなどの適当なファイルをドロップしてみてください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="dropfile-container" style="margin: 10px; border-color: #ccc; border-style: dashed; border-width: 1px 0 1px 0;"&gt;ここにドロップされたファイル内容が表示されます。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;script src="http://api.polygonpla.net/js/pot/1.11/pot.min.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script&gt;$(function () {// ドロップされた結果を表示する divvar targetId = '#dropfile-container';// ドロップ用のパネルを作成var panel = $('&lt;div/&gt;').css({    position        : 'fixed',    left            : '10%',    top             : '10%',    width           : '80%',    height          : '80%',    minHeight       : 200,    background      : '#ff8cd3',    zIndex          : 9999999,    display         : 'table',    textAlign       : 'center',    WebkitBoxShadow : '1px 1px 10px #333',    MozBoxShadow    : '1px 1px 10px #333',    boxShadow       : '1px 1px 10px #333'  })  .append(    $('&lt;div/&gt;')      .css({        display       : 'table-cell',        color         : '#fff',        fontWeight    : 'bold',        verticalAlign : 'middle',        fontSize      : '160%'      })      .text('ここにファイルをドロップします')  )  .hide()  .appendTo('body');// ファイルの情報を表示する関数var showFileInfo = function(name, size, type) {  $('&lt;div/&gt;')    .text(name + ' (' + type + ' ' + size + 'bytes)')    .appendTo(targetId);};var dropFile = new Pot.DropFile(panel, {  // メッセージを表示すべき時  onShow : function() { panel.show() },  // メッセージを非表示にすべき時  onHide : function() { panel.hide() },  // ドロップ時の処理  onDrop : function(files) {},  // 画像がドロップされた時  onLoadImage : function(data, name, size, type) {    showFileInfo(name, size, type);    $('&lt;img/&gt;')      .attr({src : data})      .css({maxWidth : 500, maxHeight : 500})      .appendTo(targetId);  },  // テキストがドロップされた時  onLoadText : function(data, name, size, type) {    showFileInfo(name, size, type);    $('&lt;textarea/&gt;')      .val(data)      .css({width : '90%', height : 300})      .appendTo(targetId);  },  // 不明なファイルがドロップされた時  onLoadUnknown : function(data, name, size, type) {    showFileInfo(name, size, type);    $('&lt;textarea/&gt;')      .val(data)      .css({width : '90%', height : 300})      .appendTo(targetId);  },  // ドロップされたファイルが読み込めた時 (このときアップロードも可能)  onLoadEnd : function(files) {    // 今回は未使用    /*      this.upload(        'http://www.example.com/',        'dropfiles'      ).then(function(res) {        alert('finish upload.\nresponse:\n\n' + res.responseText);      });    */  }});});&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-source-code"&gt;ソースコード&lt;/h2&gt;このサンプルのソースコードです。&lt;br /&gt;DOM ノードを作成するのにあたって jQuery を使用しています。&lt;br /&gt;&lt;br /&gt;HTML のソース:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="html" name="code"&gt;&amp;lt;div id=&amp;quot;dropfile-container&amp;quot; style=&amp;quot;margin: 10px; border-color: #ccc; border-style: dashed; border-width: 1px 0 1px 0;&amp;quot;&amp;gt;&lt;br /&gt;ここにドロップされたファイル内容が表示されます。&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=&amp;quot;http://api.polygonpla.net/js/pot/1.11/pot.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;JavaScript のソース:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;$(function () {&lt;br /&gt;&lt;br /&gt;    // ドロップされた結果を表示する div&lt;br /&gt;    var targetId = '#dropfile-container';&lt;br /&gt;&lt;br /&gt;    // ドロップ用のパネルを作成&lt;br /&gt;    var panel = $('&amp;lt;div/&amp;gt;').css({&lt;br /&gt;        position        : 'fixed',&lt;br /&gt;        left            : '10%',&lt;br /&gt;        top             : '10%',&lt;br /&gt;        width           : '80%',&lt;br /&gt;        height          : '80%',&lt;br /&gt;        minHeight       : 200,&lt;br /&gt;        background      : '#ff8cd3',&lt;br /&gt;        zIndex          : 9999999,&lt;br /&gt;        display         : 'table',&lt;br /&gt;        textAlign       : 'center',&lt;br /&gt;        WebkitBoxShadow : '1px 1px 10px #333',&lt;br /&gt;        MozBoxShadow    : '1px 1px 10px #333',&lt;br /&gt;        boxShadow       : '1px 1px 10px #333'&lt;br /&gt;    })&lt;br /&gt;    .append(&lt;br /&gt;        $('&amp;lt;div/&amp;gt;')&lt;br /&gt;            .css({&lt;br /&gt;                display       : 'table-cell',&lt;br /&gt;                color         : '#fff',&lt;br /&gt;                fontWeight    : 'bold',&lt;br /&gt;                verticalAlign : 'middle',&lt;br /&gt;                fontSize      : '160%'&lt;br /&gt;            })&lt;br /&gt;            .text('ここにファイルをドロップします')&lt;br /&gt;        )&lt;br /&gt;    .hide()&lt;br /&gt;    .appendTo('body');&lt;br /&gt;&lt;br /&gt;    // ファイルの情報を表示する関数&lt;br /&gt;    var showFileInfo = function(name, size, type) {&lt;br /&gt;        $('&amp;lt;div/&amp;gt;')&lt;br /&gt;            .text(name + ' (' + type + ' ' + size + 'bytes)')&lt;br /&gt;            .appendTo(targetId);&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    // ----- ここから処理の中心 -----&lt;br /&gt;    // 設定と共にインスタンスを生成&lt;br /&gt;    var dropFile = new Pot.DropFile(panel, {&lt;br /&gt;        // メッセージを表示すべき時&lt;br /&gt;        onShow : function() { panel.show() },&lt;br /&gt;        // メッセージを非表示にすべき時&lt;br /&gt;        onHide : function() { panel.hide() },&lt;br /&gt;        // ドロップ時の処理&lt;br /&gt;        onDrop : function(files) {},&lt;br /&gt;        // 画像がドロップされた時&lt;br /&gt;        onLoadImage : function(data, name, size, type) {&lt;br /&gt;            showFileInfo(name, size, type);&lt;br /&gt;            $('&amp;lt;img/&amp;gt;')&lt;br /&gt;                .attr({src : data})&lt;br /&gt;                .css({maxWidth : 500, maxHeight : 500})&lt;br /&gt;                .appendTo(targetId);&lt;br /&gt;        },&lt;br /&gt;        // テキストがドロップされた時&lt;br /&gt;        onLoadText : function(data, name, size, type) {&lt;br /&gt;            showFileInfo(name, size, type);&lt;br /&gt;            $('&amp;lt;textarea/&amp;gt;')&lt;br /&gt;                .val(data)&lt;br /&gt;                .css({width : '90%', height : 300})&lt;br /&gt;                .appendTo(targetId);&lt;br /&gt;        },&lt;br /&gt;        // 不明なファイルがドロップされた時&lt;br /&gt;        onLoadUnknown : function(data, name, size, type) {&lt;br /&gt;            showFileInfo(name, size, type);&lt;br /&gt;            $('&amp;lt;textarea/&amp;gt;')&lt;br /&gt;                .val(data)&lt;br /&gt;                .css({width : '90%', height : 300})&lt;br /&gt;                .appendTo(targetId);&lt;br /&gt;        },&lt;br /&gt;        // ドロップされたファイルが読み込めた時 (このときアップロードも可能)&lt;br /&gt;        onLoadEnd : function(files) {&lt;br /&gt;            // 今回は未使用&lt;br /&gt;            /*&lt;br /&gt;            this.upload('http://www.example.com/').then(function(res) {&lt;br /&gt;                alert('finish upload.\nresponse:\n\n' + res.responseText);&lt;br /&gt;            });&lt;br /&gt;            */&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potjs"&gt;Pot.js / PotLite.js&lt;/h2&gt;Pot.js は非同期イテレータと文字列処理を中心とした JavaScript ライブラリです。&lt;br /&gt;&lt;br /&gt;Web ブラウザ上や Node.js 上、 UserScript や XUL 上で動作します。&lt;br /&gt;この例のような DOM や HTML5 File API が含む処理は Node.js などの環境では意味がありませんが&lt;br /&gt;テキスト処理やイテレータなどを利用するメリットがあります。&lt;br /&gt;とくに非同期処理を扱う Deferred オブジェクトにより作業効率が向上すると思います。&lt;br /&gt;&lt;br /&gt;PotLite.js は Pot.js の非同期な部分だけを抽出したライトバージョンです。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ダウンロード&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/master" title="Pot.js / PotLite.js master zip" style="font-weight:bold;"&gt;Pot.js / PotLite.js 最新&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;マニュアル&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス - JavaScriptライブラリ" style="font-weight:bold;"&gt;Pot.js + PotLite.js ドキュメント リファレンス&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;マニュアルは 2012-01-11 現在、まだすべてのオブジェクトの解説ができてません。。&lt;br /&gt;&lt;br /&gt;その他の情報についてはマニュアルから参照ください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub" style="font-weight:bold;"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-1805323199526002620?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/1805323199526002620/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/html5-file-api-potjspotlitejs.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/1805323199526002620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/1805323199526002620'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/html5-file-api-potjspotlitejs.html' title='HTML5 File APIでドラッグ＆ドロップのサンプル-Pot.js+PotLite.jsリリースノート'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-SDejvmmXyoY/Tw0q5d_1K5I/AAAAAAAAFCE/ilhrIbv1NHc/s72-c/drag-and-drop.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-3411665273493145917</id><published>2012-01-11T14:29:00.000+09:00</published><updated>2012-01-11T14:29:20.020+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='SoundCloud'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tomblooの「アカウントの切り替え」にSoundCloudを追加するパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;Tombloo の 「アカウントの切り替え」 ダイアログに SoundCloud を追加します。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-sB0w21y8OfI/Tw0Z2GNg1uI/AAAAAAAAFB8/Jq3IxDV6MWU/s1600/tombloo-patch-change-account-dialog-soundcloud.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-sB0w21y8OfI/Tw0Z2GNg1uI/AAAAAAAAFB8/Jq3IxDV6MWU/s1600/tombloo-patch-change-account-dialog-soundcloud.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-notice" style="color: #ff4433;"&gt;注意点&lt;/h2&gt;http&lt;b style="color: #ff4433;"&gt;s&lt;/b&gt; じゃないとアカウント情報が取得できない環境があります。&lt;br /&gt;その場合、 &lt;a href="https://soundcloud.com/login?ref=top" title="SoundCloud"&gt;http&lt;b style="color: #ff4433;"&gt;s&lt;/b&gt;://soundcloud.com/login?ref=top&lt;/a&gt; から&lt;br /&gt;入力を記憶してログインすると有効になります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;あと、 &lt;a href="http://polygon-planet.blogspot.com/2011/08/tombloo.html" title="「アカウントの切り替え」ダイアログを内容サイズに合わせてリサイズするTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「アカウントの切り替え」ダイアログを内容サイズに合わせてリサイズするTomblooパッチ&lt;/a&gt; のほうも&lt;br /&gt;アップデートしました。&lt;br /&gt;アップデートというか、サービス切替時に&lt;br /&gt;別 window オブジェクトの非同期処理がうまく拾えてなかったので&lt;br /&gt;ソート機能を一時的に停止してます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.soundcloud.changeaccount.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.soundcloud.changeaccount.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-3411665273493145917?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/3411665273493145917/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/tombloosoundcloud.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3411665273493145917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3411665273493145917'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/tombloosoundcloud.html' title='Tomblooの「アカウントの切り替え」にSoundCloudを追加するパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-sB0w21y8OfI/Tw0Z2GNg1uI/AAAAAAAAFB8/Jq3IxDV6MWU/s72-c/tombloo-patch-change-account-dialog-soundcloud.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-3947724500498125527</id><published>2012-01-05T21:36:00.000+09:00</published><updated>2012-01-05T21:36:39.950+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ラボ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='文章'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='ツール'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><category scheme='http://www.blogger.com/atom/ns#' term='Webアプリ'/><title type='text'>こう言い換えろ→論文に死んでも書いてはいけない言葉→こう言い換えるマシーン(β)作りました</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}body div.pot-overlay-content hr {  width: 98%;  height: 0;  margin: 0 0 6px 0;  padding: 0 0 6px 0;  *margin: 0;  border: 1px dashed #999;  border-width: 0;  border-bottom-width: 1px;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}.pot-overlay-content h3 {font-size: 130%; margin-top: 30px; margin-bottom: 20px;}.pot-overlay-content h4 {font-size: 110%; margin-top: 18px; margin-bottom: 10px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}body div.pot-overlay-content table.grid,body div.pot-overlay-content table.grid td {  border: 1px solid #999;  padding: 4px 6px;  margin; 4px 6px;  vertical-align: middle;  text-align: center;  border-collapse: collapse;  border-spacing: 0;  empty-cells: show;}body div.pot-overlay-content dt, body div.pot-overlay-content dd {  margin-top: 6px;  margin-bottom: 6px;}body div.pot-overlay-content dt, body div.pot-overlay-content dt * {  font-style: normal;  font-weight: normal;}body div.pot-overlay-content dt em, body div.pot-overlay-content dt em * {  font-style: italic;}body div.pot-overlay-content dt dfn, body div.pot-overlay-content dt dfn * {  font-weight: bold;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  /*  $('#pot-polygonplanet-scrollto-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-dst', 800);    return false;  });  */  $('#pot-polygonplanet-scrollto-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-src', 800);    return false;  });  $('#pot-polygonplanet-scrollto-tiny-dst').attr({    href: 'javascript:void(0)'  }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-tiny-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;久しぶりにツールっぽいものを。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://readingmonkey.blog45.fc2.com/blog-entry-557.html" title="こう言い換えろ→論文に死んでも書いてはいけない言葉３０ 読書猿Classic: between / beyond readers" style="font-weight:bold;"&gt;こう言い換えろ→論文に死んでも書いてはいけない言葉３０ 読書猿Classic: between / beyond readers&lt;/a&gt; を発端に&lt;br /&gt;論文やブログなどの文章校正マシーンを作ってみました。&lt;br /&gt;&lt;br /&gt;かなりやっつけです。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;これ →  &lt;a href="http://lab.polygonpla.net/js/proof/" title="こう言い換えるマシーン(β) - polygonlab" style="font-weight:bold;font-size:175%;"&gt;こう言い換えるマシーン(β)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;独自に校正パターンを組んで、文章を変換し&lt;br /&gt;どの部分が構成されたか確認できます。&lt;br /&gt;&lt;br /&gt;自分のブログ文章とか、どこか適当なところから文章をコピペしてみると&lt;br /&gt;どんなものかわかると思います。&lt;br /&gt;&lt;br /&gt;デフォルトのパターンは 上リンクの 「こう言い換えろ→論文に死んでも書いてはいけない言葉３０」&lt;br /&gt;の変換マップが元となってます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ほとんどは JavaScript で処理してますが、&lt;br /&gt;ちょっとだけセッションしてて変換回数の多いプリセットを共有できるようになってます。&lt;br /&gt;あまり大量に保持してないので変動するかと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;不明な点、要望やバグや感想などありましたら&lt;br /&gt;&lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;@polygon_planet&lt;/a&gt; や、またはメールでなんでも伝えてください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;他の開発物は以下の GitHub レポジトリに集め中。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;GitHub レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-3947724500498125527?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/3947724500498125527/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3947724500498125527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3947724500498125527'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2012/01/blog-post.html' title='こう言い換えろ→論文に死んでも書いてはいけない言葉→こう言い換えるマシーン(β)作りました'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-8695543859472648512</id><published>2011-12-17T21:45:00.166+09:00</published><updated>2011-12-17T21:45:01.866+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='ベンチマーク'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><category scheme='http://www.blogger.com/atom/ns#' term='SpiderMonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='逆アセンブリ'/><category scheme='http://www.blogger.com/atom/ns#' term='AdventCalendar'/><title type='text'>JavaScriptの無名関数の実行 (function(){})() と (function(){}()) の違い</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}body div.pot-overlay-content hr {  width: 98%;  height: 0;  margin: 0 0 6px 0;  padding: 0 0 6px 0;  *margin: 0;  border: 1px dashed #999;  border-width: 0;  border-bottom-width: 1px;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}.pot-overlay-content h3 {font-size: 130%; margin-top: 30px; margin-bottom: 20px;}.pot-overlay-content h4 {font-size: 110%; margin-top: 18px; margin-bottom: 10px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}body div.pot-overlay-content table.grid,body div.pot-overlay-content table.grid td {  border: 1px solid #999;  padding: 4px 6px;  margin; 4px 6px;  vertical-align: middle;  text-align: center;  border-collapse: collapse;  border-spacing: 0;  empty-cells: show;}body div.pot-overlay-content dt, body div.pot-overlay-content dd {  margin-top: 6px;  margin-bottom: 6px;}body div.pot-overlay-content dt, body div.pot-overlay-content dt * {  font-style: normal;  font-weight: normal;}body div.pot-overlay-content dt em, body div.pot-overlay-content dt em * {  font-style: italic;}body div.pot-overlay-content dt dfn, body div.pot-overlay-content dt dfn * {  font-weight: bold;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  /*  $('#pot-polygonplanet-scrollto-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-dst', 800);    return false;  });  */  $('#pot-polygonplanet-scrollto-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-src', 800);    return false;  });  $('#pot-polygonplanet-scrollto-tiny-dst').attr({    href: 'javascript:void(0)'  }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-tiny-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;JavaScript Advent Calendar 2011 (オレ標準コース) 17 日目、&lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;polygon_planet&lt;/a&gt; です。&lt;br /&gt;&lt;br /&gt;ずっと Advent Calendar 参加してみたいなぁと思ってたんですが&lt;br /&gt;ネタが思いつかない日々で半分諦めてたんですが、考え過ぎな気がしてきたので&lt;br /&gt;別におもしろい記事でもないし、技術的にも参考になるのか不明ですがとりあえず書きます。&lt;br /&gt;&lt;br /&gt;もしかしたら同じようなこと解説してる記事がすでにあるかも…(うまく検索できてない)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JavaScript で無名関数をその場で実行するとき、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;(function() {&lt;br /&gt;  // 処理&lt;br /&gt;})();&lt;br /&gt;&lt;/pre&gt;という書き方が主流っぽいですが、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;(function() {&lt;br /&gt;  // 処理&lt;br /&gt;}());&lt;br /&gt;&lt;/pre&gt;こう書いたらどう違うのか。&lt;br /&gt;&lt;br /&gt;ちなみに、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;function() {&lt;br /&gt;&lt;br /&gt;}(); // エラー&lt;br /&gt;&lt;/pre&gt;これは式ではなく文として扱われるためエラーです。&lt;br /&gt;ただし、以下のように実行する場合はエラーではありません。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var arr = [function(){}()];        // [undefined]&lt;br /&gt;var obj = {foo: function(){}()};   // {foo: undefined}&lt;br /&gt;&lt;/pre&gt;&lt;h2 id="pot-polygonplanet-blog-anonymous-function"&gt;(function(){})() vs (function(){}())&lt;/h2&gt;どちらも同じように実行され、結果的には同じなので&lt;br /&gt;とりあえず、無名関数が生成され実行するまでの JavaScript コードの過程を追ってみます。&lt;br /&gt;&lt;br /&gt;今回は手元に SpiderMonkey に付いてる JavaScript shell しかなかったので、それを使います。&lt;br /&gt;わりと前にコンパイルしたやつですが JavaScript バージョンは 1.8 なので現行と大差ないと思います。&lt;br /&gt;中間コードは js shell の dis で逆アセンブルして確認します。&lt;br /&gt;&lt;br /&gt;まず &lt;strong&gt;(function(){})()&lt;/strong&gt; から。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: #333 none repeat scroll 0% 0%; border: 1px solid #999; color: #f8f8ff; font-family: consolas,'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.4; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word"&gt;$ js&lt;br /&gt;js&amp;gt; dis(function() { (function(){})() });&lt;br /&gt;flags: LAMBDA INTERPRETED&lt;br /&gt;main:&lt;br /&gt;00000:  anonfunobj (function () {})&lt;br /&gt;00003:  group&lt;br /&gt;00004:  pushobj&lt;br /&gt;00005:  call 0&lt;br /&gt;00008:  pop&lt;br /&gt;00009:  stop&lt;br /&gt;&lt;br /&gt;Source notes:&lt;br /&gt;  0:     5 [   5] pcbase   offset 5&lt;br /&gt;&lt;/pre&gt;anonfunobj というは、無名関数を定義していると思われますが、&lt;br /&gt;確認のため Mozilla のソースコードを見てます。&lt;br /&gt;&lt;br /&gt;今回は js shell のバージョンに合わせるため&lt;br /&gt;&lt;a href="http://mxr.mozilla.org/mozilla-central/source/js/src/" title="mozilla-central mozilla/js/src/"&gt;/mozilla-central/&lt;/a&gt; ではなく &lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/" title="mozilla mozilla/js/src/"&gt;/mozilla/&lt;/a&gt; を参照します。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsopcode.tbl#305" title="mozilla mozilla/js/src/jsopcode.tbl"&gt;jsopcode.tbl&lt;/a&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;305 /* Auto-clone (if needed due to re-parenting) and push an anonymous function. */&lt;br /&gt;306 OPDEF(JSOP_ANONFUNOBJ,  128, &amp;quot;anonfunobj&amp;quot;,  NULL,     3,  0,  1, 19,  JOF_OBJECT)&lt;br /&gt;&lt;/pre&gt;このあたりの JSOP_* から参照できます。&lt;br /&gt;JSOP は &lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsopcode.c#3777" title="mozilla mozilla/js/src/jsopcode.c"&gt;jsopcode.c&lt;/a&gt; あたりで確認できます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;3777               case JSOP_ANONFUNOBJ:&lt;br /&gt;3778 #if JS_HAS_GENERATOR_EXPRS&lt;br /&gt;3779                 sn = js_GetSrcNote(jp-&amp;gt;script, pc);&lt;br /&gt;3780                 if (sn &amp;amp;&amp;amp; SN_TYPE(sn) == SRC_GENEXP) {&lt;br /&gt;3781                     JSScript *inner, *outer;&lt;br /&gt;3782                     void *mark;&lt;br /&gt;3783                     SprintStack ss2;&lt;br /&gt;3784 &lt;br /&gt;3785                     LOAD_FUNCTION(0);&lt;br /&gt;3786                     inner = fun-&amp;gt;u.i.script;&lt;br /&gt;// ... (長いので省略) ...&lt;br /&gt;&lt;/pre&gt;ここでは LOAD_FUNCTION が使われています。&lt;br /&gt;&lt;br /&gt;JavaScript バイトコードインタプリタの &lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsinterp.c#5744" title="mozilla mozilla/js/src/jsinterp.c"&gt;jsinterp.c&lt;/a&gt; を参照して無名関数の生成から追ってみます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;5744           BEGIN_CASE(JSOP_ANONFUNOBJ)&lt;br /&gt;5745             /* Load the specified function object literal. */&lt;br /&gt;5746             LOAD_FUNCTION(0);&lt;br /&gt;5747 &lt;br /&gt;5748             /* If re-parenting, push a clone of the function object. */&lt;br /&gt;5749             parent = js_GetScopeChain(cx, fp);&lt;br /&gt;5750             if (!parent)&lt;br /&gt;5751                 goto error;&lt;br /&gt;5752             obj = FUN_OBJECT(fun);&lt;br /&gt;5753             if (OBJ_GET_PARENT(cx, obj) != parent) {&lt;br /&gt;5754                 obj = js_CloneFunctionObject(cx, fun, parent);&lt;br /&gt;5755                 if (!obj)&lt;br /&gt;5756                     goto error;&lt;br /&gt;5757             }&lt;br /&gt;5758             PUSH_OPND(OBJECT_TO_JSVAL(obj));&lt;br /&gt;5759           END_CASE(JSOP_ANONFUNOBJ)&lt;br /&gt;&lt;/pre&gt;ここでも LOAD_FUNCTION が使われているので定義を追ってみます。&lt;br /&gt;&lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsinterp.c#2604" title="mozilla mozilla/js/src/jsinterp.c"&gt;jsinterp.c&lt;/a&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;2604 #define LOAD_FUNCTION(PCOFF)                                                  \&lt;br /&gt;2605     JS_GET_SCRIPT_FUNCTION(script, GET_FULL_INDEX(PCOFF), fun)&lt;br /&gt;&lt;/pre&gt;JS_GET_SCRIPT_FUNCTION を実行するマクロになっています。&lt;br /&gt;&lt;br /&gt;じゃあ JS_GET_SCRIPT_FUNCTION はどうなってるの&lt;br /&gt;&lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsscript.h#143" title="mozilla mozilla/js/src/jsscript.h"&gt;jsscript.h&lt;/a&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;143 #define JS_GET_SCRIPT_FUNCTION(script, index, fun)                            \&lt;br /&gt;144     JS_BEGIN_MACRO                                                            \&lt;br /&gt;145         JSObject *funobj_;                                                    \&lt;br /&gt;146                                                                               \&lt;br /&gt;147         JS_GET_SCRIPT_OBJECT(script, index, funobj_);                         \&lt;br /&gt;148         JS_ASSERT(HAS_FUNCTION_CLASS(funobj_));                               \&lt;br /&gt;149         JS_ASSERT(funobj_ == (JSObject *) STOBJ_GET_PRIVATE(funobj_));        \&lt;br /&gt;150         (fun) = (JSFunction *) funobj_;                                       \&lt;br /&gt;151         JS_ASSERT(FUN_INTERPRETED(fun));                                      \&lt;br /&gt;152     JS_END_MACRO&lt;br /&gt;&lt;/pre&gt;JSFunction にキャストして JavaScript 関数オブジェクトになることが確認できました。&lt;br /&gt;(これは現行の JavaScript だともっとてっとり早くなってる)&lt;br /&gt;&lt;br /&gt;こんな感じで追ってみると、anonfunobj は無名関数の生成ということがわかります。&lt;br /&gt;&lt;br /&gt;次の group は、&lt;br /&gt;&lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsopcode.tbl#317" title="mozilla mozilla/js/src/jsopcode.tbl"&gt;jsopcode.tbl&lt;/a&gt; で同じく定義されています。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;317 /* Parenthesization opcode to help the decompiler. */&lt;br /&gt;318 OPDEF(JSOP_GROUP,       131, &amp;quot;group&amp;quot;,       NULL,     1,  0,  0, 19,  JOF_BYTE)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://mxr.mozilla.org/mozilla/source/js/src/jsopcode.c#2066" title="mozilla mozilla/js/src/jsopcode.c"&gt;jsopcode.c&lt;/a&gt; では以下のあたり。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="c:nogutter" name="code"&gt;2066               case JSOP_GROUP:&lt;br /&gt;2067                 cs = &amp;amp;js_CodeSpec[lastop];&lt;br /&gt;2068                 if ((cs-&amp;gt;prec != 0 &amp;amp;&amp;amp;&lt;br /&gt;2069                      cs-&amp;gt;prec &amp;lt;= js_CodeSpec[NEXT_OP(pc)].prec) ||&lt;br /&gt;2070                     pc[JSOP_GROUP_LENGTH] == JSOP_NULL ||&lt;br /&gt;2071                     pc[JSOP_GROUP_LENGTH] == JSOP_DUP ||&lt;br /&gt;2072                     pc[JSOP_GROUP_LENGTH] == JSOP_IFEQ ||&lt;br /&gt;2073                     pc[JSOP_GROUP_LENGTH] == JSOP_IFNE) {&lt;br /&gt;//                       ...(中略)...&lt;br /&gt;2100                 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;無名関数オブジェクトを生成し、それを括弧 () によって式とし、&lt;br /&gt;そしてそれを call というような流れになっています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;続いて &lt;strong&gt;(function(){}())&lt;/strong&gt; のほうも同じように。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: #333 none repeat scroll 0% 0%; border: 1px solid #999; color: #f8f8ff; font-family: consolas,'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.4; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word"&gt;$ js&lt;br /&gt;js&amp;gt; dis(function() { (function(){}()) });&lt;br /&gt;flags: LAMBDA INTERPRETED&lt;br /&gt;main:&lt;br /&gt;00000:  anonfunobj (function () {})&lt;br /&gt;00003:  pushobj&lt;br /&gt;00004:  call 0&lt;br /&gt;00007:  pop&lt;br /&gt;00008:  stop&lt;br /&gt;&lt;br /&gt;Source notes:&lt;br /&gt;  0:     4 [   4] pcbase   offset 4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;なんと、&lt;strong&gt;(function(){})()&lt;/strong&gt; と比べると&lt;br /&gt;group がないだけで、ほかは同じになってしまいました。&lt;br /&gt;&lt;br /&gt;無名関数に対する Parenthesization が発生しないので、&lt;br /&gt;ちょうど、上で書いた &lt;code&gt;[function(){}()]&lt;/code&gt; のように実行されています。&lt;br /&gt;&lt;br /&gt;この結果から、&lt;br /&gt;&lt;br /&gt;&lt;div style="font-size:110%"&gt;&lt;strong&gt;(function(){})()&lt;/strong&gt; よりも、 &lt;strong&gt;(function(){}())&lt;/strong&gt; のほうが&lt;br /&gt;&lt;strong&gt;コストが減る&lt;/strong&gt;とわかりました。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;とは言っても、どちらを使用しても実行時間が変化するとしてもマイクロ秒単位などで&lt;br /&gt;JavaScript でそこまでクリティカルな処理が存在するのかも微妙なところで&lt;br /&gt;あまり気にしないでいい気がします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;でも一応ベンチマークをとってみます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;js&amp;gt; for (var t = +new Date, i = 0, f; i &amp;lt; 10000000; i++) f = (function(){}());&lt;br /&gt;    print(+new Date - t);&lt;br /&gt;10437&lt;br /&gt;js&amp;gt; for (var t = +new Date, i = 0, f; i &amp;lt; 10000000; i++) f = (function(){})();&lt;br /&gt;    print(+new Date - t);&lt;br /&gt;10485&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結果:&lt;br /&gt;&lt;ul&gt; &lt;li&gt;&lt;strong&gt;(function(){}())&lt;/strong&gt; : 10437 ms.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;(function(){})()&lt;/strong&gt; : 10485 ms.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;たしかに (function(){}()) のほうが速かったんですが、&lt;br /&gt;10,000,000 回ループして わずか 48 ミリ秒の違い。&lt;br /&gt;これを懸念してる人って…(いるのでしょうか)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そういえばこの違いについてはちょっと前に Twitter で話題(?) になって気がします。&lt;br /&gt;もしかしてもうまとめられてたのかな…。だとしたら……考えたくない。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずモヤモヤした感じがなくなったのでよかった。&lt;br /&gt;たまにソースコード確認してみると新鮮デスネ！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-8695543859472648512?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/8695543859472648512/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/12/javascript-function-function.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8695543859472648512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8695543859472648512'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/12/javascript-function-function.html' title='JavaScriptの無名関数の実行 (function(){})() と (function(){}()) の違い'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-383177281612198491</id><published>2011-12-06T19:11:00.000+09:00</published><updated>2011-12-06T19:11:19.716+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Deferred'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Node.js'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='イテレータ'/><category scheme='http://www.blogger.com/atom/ns#' term='PotLite.js'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='ReleaseNotes'/><title type='text'>JavaScript非同期ライブラリ PotLite.js 1.23 リリース</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}body div.pot-overlay-content hr {  width: 98%;  height: 0;  margin: 0 0 6px 0;  padding: 0 0 6px 0;  *margin: 0;  border: 1px dashed #999;  border-width: 0;  border-bottom-width: 1px;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}.pot-overlay-content h3 {font-size: 130%; margin-top: 30px; margin-bottom: 20px;}.pot-overlay-content h4 {font-size: 110%; margin-top: 18px; margin-bottom: 10px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}body div.pot-overlay-content table.grid,body div.pot-overlay-content table.grid td {  border: 1px solid #999;  padding: 4px 6px;  margin; 4px 6px;  vertical-align: middle;  text-align: center;  border-collapse: collapse;  border-spacing: 0;  empty-cells: show;}body div.pot-overlay-content dt, body div.pot-overlay-content dd {  margin-top: 6px;  margin-bottom: 6px;}body div.pot-overlay-content dt, body div.pot-overlay-content dt * {  font-style: normal;  font-weight: normal;}body div.pot-overlay-content dt em, body div.pot-overlay-content dt em * {  font-style: italic;}body div.pot-overlay-content dt dfn, body div.pot-overlay-content dt dfn * {  font-weight: bold;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  /*  $('#pot-polygonplanet-scrollto-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-dst', 800);    return false;  });  */  $('#pot-polygonplanet-scrollto-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-src', 800);    return false;  });  $('#pot-polygonplanet-scrollto-tiny-dst').attr({    href: 'javascript:void(0)'  }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-tiny-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;JavaScript 非同期処理ライブラリ &lt;strong&gt;PotLite.js 1.23&lt;/strong&gt; リリースしました。&lt;br /&gt;&lt;br /&gt;Version 1.23 は、ほとんどバグフィックスです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/11/javascript-potlitejs-122-signal.html" title="JavaScript非同期ライブラリ PotLite.js 1.22 リリース。アスペクト指向っぽく書けるSignal実装 | 圧縮電子精神音楽浮遊構造体"&gt;AOP ぽいことができる Pot.Signal&lt;/a&gt; がひどくて、&lt;br /&gt;シグナル解除して再度登録すると重複してコールバック関数が呼ばれちゃったりしてたので&lt;br /&gt;がんばって可能な限り実行テスト増やしてフィックスして&lt;br /&gt;やっと想定の動きになりました。&lt;br /&gt;&lt;br /&gt;前バージョン (1.22) を使ってる方いたら申し訳ないです。。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-about"&gt;PotLite.js&lt;/h2&gt;PotLite.js は、めんどうになりがちな非同期処理をとにかく楽にコーディングできるよう&lt;br /&gt;直感的に記述できる &lt;strong&gt;Deferred オブジェクト&lt;/strong&gt;を中核として実装しています。&lt;br /&gt;そして、ユーザー (UI) への配慮を目的として&lt;br /&gt;CPU など負荷のかからないループ処理やイテレータが利用できる JavaScript ライブラリです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;経緯などについては、&lt;a href="http://polygon-planet.blogspot.com/2011/10/javascriptdeferred.html" title="JavaScriptでDeferredとイテレータの非同期処理用ライブラリ作ってみた | 圧縮電子精神音楽浮遊構造体"&gt;以前の記事&lt;/a&gt; や、 &lt;a href="http://polygon-planet.blogspot.com/2011/11/javascript.html" title="フリーズやカクカクしない安定した動作のアプリやアドオン、ゲームなどが作れるJavaScriptライブラリ | 圧縮電子精神音楽浮遊構造体"&gt;CPU 使用率のベンチマーク結果の記事&lt;/a&gt; など&lt;br /&gt;シグナル (イベント) については &lt;a href="http://polygon-planet.blogspot.com/2011/11/javascript-potlitejs-122-signal.html" title="JavaScript非同期ライブラリ PotLite.js 1.22 リリース。アスペクト指向っぽく書けるSignal実装 | 圧縮電子精神音楽浮遊構造体"&gt;PotLite.js 1.22 リリース - アスペクト指向っぽく書けるSignal実装&lt;/a&gt;&lt;br /&gt;などの記事を参照ください。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;ダウンロード&lt;/h2&gt;&lt;p&gt;PotLite.js 1.23&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/zipball/PotLite.js-1.23" title="PotLite.js version 1.23 (zip)" style="font-weight:bold"&gt;zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js/tarball/PotLite.js-1.23" title="PotLite.js version 1.23 (tar.gz)" style="font-weight:bold"&gt;tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;HEAD (常に最新)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/zipball/master" title="最新のzip" style="font-weight: bold;"&gt;zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/tarball/master" title="最新のtar.gz" style="font-weight: bold;"&gt;tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;レポジトリ&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 6px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="txt:nogutter:nocontrols" name="code"&gt;$ git clone git://github.com/polygonplanet/Pot.js&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;以下は PotLite.js について情報です。&lt;br /&gt;レポジトリにも同じようなこと書いてあるので&lt;br /&gt;インストールや概要など、不要な場合は読み飛ばしてください。&lt;br /&gt;マニュアルのリンクは下にあります。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-compatibility"&gt;動作環境&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;以下の Web ブラウザで動作確認済みです。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mozilla Firefox *&lt;/li&gt;&lt;li&gt;Internet Explorer 6+&lt;/li&gt;&lt;li&gt;Safari *&lt;/li&gt;&lt;li&gt;Opera *&lt;/li&gt;&lt;li&gt;Google Chrome *&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;また、以下の環境でも動作するよう設計されています。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Greasemonkey (UserScript)&lt;/li&gt;&lt;li&gt;Mozilla Firefox Add-On (on XUL)&lt;/li&gt;&lt;li&gt;Node.js&lt;/li&gt;&lt;li&gt;Other non-browser environment&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-install"&gt;インストール&lt;/h2&gt;&lt;div&gt;&lt;p&gt;一般的な方法で動作します。&lt;/p&gt;&lt;p&gt;例:&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="html" name="code"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;potlite.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;!--または--&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Node.js の場合。&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// Example to define Pot object on Node.js.&lt;br /&gt;var Pot = require('./potlite.min.js');&lt;br /&gt;Pot.debug(Pot.VERSION);&lt;br /&gt;&lt;br /&gt;Pot.Deferred.begin(function() {&lt;br /&gt;    Pot.debug('Hello Deferred!');&lt;br /&gt;}).then(function() {...})&lt;br /&gt;// ...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Greasemonkey (userscript) の例。&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// ...&lt;br /&gt;// @require  https://github.com/polygonplanet/Pot.js/raw/master/potlite.min.js&lt;br /&gt;// ...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;Pot.Deferred.begin(function() {&lt;br /&gt;    return Pot.request('http://www.example.com/data.json').then(function(res) {&lt;br /&gt;        return Pot.parseFromJSON(res.responseText);&lt;br /&gt;    });&lt;br /&gt;}).then(function(res) {&lt;br /&gt;    Pot.debug(res);&lt;br /&gt;    // do something...&lt;br /&gt;});&lt;br /&gt;//...&lt;br /&gt;&lt;/pre&gt;PotLite.js をバージョンを限定して Web から直接読み込みたい場合、&lt;br /&gt;上の GitHub リンクでは常に最新になってしまうため&lt;br /&gt;実装の差異による不具合が発生するかもしれません。&lt;br /&gt;そのため、ホスティング用 API サーバを用意しています。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;v1.23 : &lt;a href="http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js"&gt;http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;これは、1.23 の部分をリリース済みのバージョンに合わせて変更できます。&lt;br /&gt;レポジトリに (例えば 1.xx と) バージョンをタグ付けした時に、&lt;br /&gt;あわせて API サーバに置くようにしています。&lt;br /&gt;&lt;br /&gt;例えば Greasemonkey で 1.23 を使いたい場合、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// ...&lt;br /&gt;// @require  http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js&lt;br /&gt;// ...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;/pre&gt;と記述できます。&lt;br /&gt;&lt;br /&gt;Greasemonkey に限らず script タグからでもなんでも自由に使ってください。&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;p&gt;jQuery プラグインとしての例:&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// jQuery を読み込んだ後に実行。&lt;br /&gt;Pot.deferrizejQueryAjax();&lt;br /&gt;&lt;br /&gt;// Ajax 系の関数が Pot.Deferred を返すようになる&lt;br /&gt;$.getJSON('/hoge.json').then(function(data) {&lt;br /&gt;    alert(data.results[0].text);&lt;br /&gt;}).rescue(function(err) {&lt;br /&gt;    alert('Error! ' + err);&lt;br /&gt;}).ensure(function() {&lt;br /&gt;    return someNextProcess();&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// エフェクトなどを Deferred 化する 'deferred' が追加される&lt;br /&gt;$('div#hoge').deferred('hide', 'slow').then(function() {&lt;br /&gt;    // .hide() が終了したあとの処理&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Pot.deferrizejQueryAjax() は v1.23 現在、ライブラリ側からは自動で実行しません。&lt;br /&gt;なので、プラグインとして利用する場合は コードの最初などで一度コールしてください。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-reference"&gt;リファレンス・マニュアル&lt;/h2&gt;&lt;p&gt;より詳しい情報はすべてリファレンスに載っています。&lt;br /&gt;基本的な導入や、各メソッド・関数についても扱っています。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ" style="font-weight:bold;"&gt;Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-testrun"&gt;動作テスト&lt;/h2&gt;&lt;p&gt;以下のページで動作テストができます。&lt;br /&gt;ページを開くと実装されている主な関数・メソッドを全てテストします。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/potlite.test.html" title="Pot.js + PotLite.js - Test Run - JavaScript Async Library"&gt;Pot.js + PotLite.js - Test Run - JavaScript Async Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-jsdoc"&gt;自動生成されたドキュメント&lt;/h2&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/jsdoc/potlite/index.html" title="PotLite.js - JsDoc Reference - Index"&gt;JSDoc ドキュメント (PotLite.js)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://code.google.com/intl/ja/closure/compiler/docs/js-for-compiler.html" title="Annotating JavaScript for the Closure Compiler - Closure Compiler - Google Code"&gt;Closure Compiler&lt;/a&gt; によりソースコードから自動生成されたドキュメントです。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;殆どの関数ごとにサンプルコードを載せているので、ある程度は参考になると思います。&lt;br /&gt;生成物をすべて確認しているわけではないので、誤認識してる箇所もあるかもしれません。&lt;br /&gt;より詳細な実装などは直接ソースコードを参照ください。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;不明な点、要望やバグや感想などありましたら&lt;br /&gt;&lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;@polygon_planet&lt;/a&gt; や 下のレポジトリから、またはメールでなんでも伝えてください。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-383177281612198491?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/383177281612198491/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/12/javascript-potlitejs-123.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/383177281612198491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/383177281612198491'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/12/javascript-potlitejs-123.html' title='JavaScript非同期ライブラリ PotLite.js 1.23 リリース'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-700417551768178075</id><published>2011-12-05T21:59:00.000+09:00</published><updated>2011-12-05T21:59:03.100+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Search'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='画像'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>マウス下の画像をGoogle画像検索するTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;マウス下の画像を Google 画像検索 (Google Image Search) で検索できるようになります。&lt;br /&gt;&lt;a href="https://chrome.google.com/extensions/detail/ldcnohnnlpgglecmkldelbmiokgmikno" title="Taberareloo - Google Chrome Extension"&gt;Taberareloo&lt;/a&gt; には既に付いていて、せっかくなので作りました。&lt;br /&gt;あと、二次画像詳細検索 も選べます。&lt;br /&gt;&lt;br /&gt;コンテキストメニューの 「Tombloo」 から操作できます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://3.bp.blogspot.com/-jCgq63Jx8xE/Tty9Nq_BdRI/AAAAAAAAEfc/pe51-kN_5hg/s1600/tombloo-patch-action-search-context-menu.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-jCgq63Jx8xE/Tty9Nq_BdRI/AAAAAAAAEfc/pe51-kN_5hg/s1600/tombloo-patch-action-search-context-menu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;今のところメニューは 2 つだけですが、&lt;br /&gt;なにか思いついたら追加して随時アップデートする予定です。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.actions.search.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.actions.search.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-700417551768178075?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/700417551768178075/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/12/googletombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/700417551768178075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/700417551768178075'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/12/googletombloo.html' title='マウス下の画像をGoogle画像検索するTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-jCgq63Jx8xE/Tty9Nq_BdRI/AAAAAAAAEfc/pe51-kN_5hg/s72-c/tombloo-patch-action-search-context-menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-8721810408699750994</id><published>2011-11-23T09:01:00.001+09:00</published><updated>2011-12-08T03:47:17.906+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Node.js'/><category scheme='http://www.blogger.com/atom/ns#' term='Element'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>JavaScript非同期ライブラリ PotLite.js 1.22 リリース。アスペクト指向っぽく書けるSignal実装</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}body div.pot-overlay-content hr {  width: 98%;  height: 0;  margin: 0 0 6px 0;  padding: 0 0 6px 0;  *margin: 0;  border: 1px dashed #999;  border-width: 0;  border-bottom-width: 1px;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}.pot-overlay-content h3 {font-size: 130%; margin-top: 30px; margin-bottom: 20px;}.pot-overlay-content h4 {font-size: 110%; margin-top: 18px; margin-bottom: 10px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}body div.pot-overlay-content table.grid,body div.pot-overlay-content table.grid td {  border: 1px solid #999;  padding: 4px 6px;  margin; 4px 6px;  vertical-align: middle;  text-align: center;  border-collapse: collapse;  border-spacing: 0;  empty-cells: show;}body div.pot-overlay-content dt, body div.pot-overlay-content dd {  margin-top: 6px;  margin-bottom: 6px;}body div.pot-overlay-content dt, body div.pot-overlay-content dt * {  font-style: normal;  font-weight: normal;}body div.pot-overlay-content dt em, body div.pot-overlay-content dt em * {  font-style: italic;}body div.pot-overlay-content dt dfn, body div.pot-overlay-content dt dfn * {  font-weight: bold;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  /*  $('#pot-polygonplanet-scrollto-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-dst', 800);    return false;  });  */  $('#pot-polygonplanet-scrollto-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-src', 800);    return false;  });  $('#pot-polygonplanet-scrollto-tiny-dst').attr({    href: 'javascript:void(0)'  }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-tiny-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;&lt;div style="border:2px solid #336699;margin:10px;padding:4px 8px;color:#336699;background:#f0f8ff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;"&gt; &lt;h2 style="color:#336699;margin:2px 6px;"&gt;追記&lt;/h2&gt; PotLite.js 1.22 はバギーなため 記事内のリンクを 1.23 に変更しました。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;PotLite.js 1.22 リリースしました。&lt;br /&gt;&lt;br /&gt;PotLite.js は、非同期処理や負荷のかからないループ処理やイテレータを重視した JavaScript ライブラリです。&lt;br /&gt;経緯などについては、&lt;a href="http://polygon-planet.blogspot.com/2011/10/javascriptdeferred.html" title="JavaScriptでDeferredとイテレータの非同期処理用ライブラリ作ってみた | 圧縮電子精神音楽浮遊構造体"&gt;以前の記事&lt;/a&gt; や、 &lt;a href="http://polygon-planet.blogspot.com/2011/11/javascript.html" title="フリーズやカクカクしない安定した動作のアプリやアドオン、ゲームなどが作れるJavaScriptライブラリ | 圧縮電子精神音楽浮遊構造体"&gt;CPU 使用率のベンチマーク結果の記事&lt;/a&gt; を参照ください。&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;dfn&gt;ダウンロード&lt;/dfn&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;PotLite.js 最新&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/zipball/master" title="PotLite.js 最新 (zip)" style="font-weight:bold"&gt;zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/tarball/master" title="PotLite.js version 最新 (tar.gz)" style="font-weight:bold"&gt;tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;レポジトリ&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt; &lt;/dl&gt;&lt;br /&gt;PotLite.js バージョン 1.22 では Pot.Signal オブジェクトを実装しました。&lt;br /&gt;&lt;br /&gt;Pot.Signal は、任意のハンドラを登録し シグナルを送信して実行に移すことが可能です。&lt;br /&gt;言い方を変えると、自らイベントを作成し、任意のタイミングで呼び出せるようなものです。&lt;br /&gt;&lt;br /&gt;「イベント」という概念で実装したわけではありませんが、ここでは便宜上イベントという言い方をします。&lt;br /&gt;&lt;br /&gt;Pot.Signal には大まかに以下の関数があります。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;attach : イベントを登録&lt;/li&gt;&lt;li&gt;detach : イベントを解除&lt;/li&gt;&lt;li&gt;signal : イベントを実行&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-signal-example"&gt;Pot.Signal の使用例&lt;/h2&gt;Pot.Signal はいろいろな使い方があります。&lt;br /&gt;例えば、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// イベントを登録&lt;br /&gt;//  (第一引数に文字列を渡すと document.getElementById を使用する)&lt;br /&gt;var handler = attach('#foo', 'click', function(ev) {...});&lt;br /&gt;&lt;br /&gt;// イベント解除&lt;br /&gt;detach(handler);&lt;br /&gt;&lt;/pre&gt;上のように addEventListener/removeEventListener の代わりに使用したり、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var MyObj = {};&lt;br /&gt;&lt;br /&gt;// 独自のシグナルを登録&lt;br /&gt;var handler = attach(MyObj, 'clear-data', function() {&lt;br /&gt;  // プロパティの初期化など&lt;br /&gt;  MyObj.data = null;&lt;br /&gt;  MyObj.time = null;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;attach(window, 'load', function() {&lt;br /&gt;  // 初期化するシグナルを送信&lt;br /&gt;  signal(MyObj, 'clear-data');&lt;br /&gt;&lt;br /&gt;  // リセットボタンを押した時にもクリアするよう設定&lt;br /&gt;  attach('#reset', 'click', function() {&lt;br /&gt;    signal(MyObj, 'clear-data');&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  // 既存の処理など&lt;br /&gt;  myLoadProcess();&lt;br /&gt;  //...&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;上のように attach, signal を独自のシグナルとして使用したりできます。&lt;br /&gt;&lt;br /&gt;そして、attachBefore と attachAfter を使うと処理の前後に何らかの動作を追加できます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// 保存ボタンを押した時のイベントを設定&lt;br /&gt;attach('#saveData', 'click', function() {&lt;br /&gt;  // 保存する関数&lt;br /&gt;  saveData(document.getElementById('inputText').value);&lt;br /&gt;  // ユーザーに保存を伝える関数&lt;br /&gt;  showSaveData('Saved!');&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// これにフォーカス移動するよう後付けする&lt;br /&gt;attachAfter('#saveData', 'click', function() {&lt;br /&gt;  document.getElementById('inputText').focus();&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// その前にログを取るよう設定する&lt;br /&gt;attachBefore('#saveData', 'click', function() {&lt;br /&gt;  MyLogger.log('Save inputText');&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;attachBefore, attachAfter はいくつでも登録できます。&lt;br /&gt;登録した順に実行されます。&lt;br /&gt;&lt;br /&gt;また、attachPropBefore, attachPropAfter という関数もあります。&lt;br /&gt;これは、attachBefore, attachAfter と違い、&lt;br /&gt;オブジェクトの関数にダイレクトに作用します。&lt;br /&gt;オブジェクトの持つ関数が呼ばれると、自動的に Before, After のハンドラ関数が実行されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;例えば何らかのアプリケーションを実行する時に、ログをとりたくなった場合。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var MyApp = {&lt;br /&gt;  execute : function() {&lt;br /&gt;    // 何らかの処理を開始する&lt;br /&gt;    myAppDoit();&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;attach('#execute', 'click', function() {&lt;br /&gt;  // アプリケーションを実行&lt;br /&gt;  MyApp.execute();&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// 実行する前にログを取る&lt;br /&gt;attachPropBefore(MyApp, 'execute', function() {&lt;br /&gt;  MyLogger.log('Begin execute');&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// 実行した後のログを取る&lt;br /&gt;attachPropAfter(MyApp, 'execute', function() {&lt;br /&gt;  MyLogger.log('End execute');&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;このように設定することで、上の例の場合では&lt;br /&gt;MyApp.execute が実行される前後に任意の処理を追加できます。&lt;br /&gt;&lt;br /&gt;解除したくなったら、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var handler = attach(...);&lt;br /&gt;&lt;br /&gt;// シグナルを解除&lt;br /&gt;detach(handler);&lt;br /&gt;&lt;/pre&gt;attach*() 関数の戻り値のハンドラオブジェクトを使い、&lt;br /&gt;detach (Pot.Signal.detach) で解除できます。&lt;br /&gt;&lt;br /&gt;他にも detachAll() を使い一括で解除することもできます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pot.attach(), Pot.signal() などは Pot.Signal.attach() として実装されていますが、&lt;br /&gt;Pot オブジェクトからも参照できます。&lt;br /&gt;Pot.globalize() を実行しておくと、単に attach(obj, ...) と書けます。&lt;br /&gt;今回の例では attach と表現しています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これらの関数、とくに Before, After を使うことで、&lt;br /&gt;アスペクト指向 (AOP) っぽいプログラミングが可能となります。&lt;br /&gt;&lt;br /&gt;Pot.Signal は Node.js などのサーバでの利用も可能ですが、&lt;br /&gt;Web ブラウザ上、HTML5 での Web Storage (localStorage や sessionStorage) を使う時などに便利と思います。&lt;br /&gt;&lt;br /&gt;また、attach 系の関数 (attach*) の後に .once を付けると、一度だけ実行されます。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// 一度クリックしたら解除される&lt;br /&gt;attach.once('#hoge', 'click', function() {...});&lt;br /&gt;&lt;/pre&gt;&lt;h2 id="pot-polygonplanet-blog-signal-reference"&gt;Pot.Signal の関数&lt;/h2&gt;&lt;dl&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;attach&lt;/dfn&gt;(object, signalName, callback[, useCapture])&lt;/dt&gt;&lt;dd&gt;スロットにシグナルを登録します。&lt;br&gt;Pot.Signal が保持しているハンドラリストに任意のオブジェクトとコールバック関数を登録します。&lt;br&gt;引数 object が DOM エレメントだった場合、addEventListener と同じように働きます。&lt;br&gt;戻り値は、Pot.Signal.Handler のインスタンスです。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;attachBefore&lt;/dfn&gt;(object, signalName, callback[, useCapture])&lt;/dt&gt;&lt;dd&gt;スロットに存在するハンドラが呼ばれる前に実行されるシグナルを登録します。&lt;br&gt;Pot.Signal.attach() で登録したものと同じシグナル signalName で登録した場合、&lt;br&gt;attach() のハンドラが呼ばれる前に実行されます。&lt;br&gt;同じシグナルが存在しない場合 signal() によって実行しても何も起きません。&lt;br&gt;DOM エレメントに対して attach() した場合も同様です。&lt;br&gt;戻り値は、Pot.Signal.Handler のインスタンスです。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;attachAfter&lt;/dfn&gt;(object, signalName, callback[, useCapture])&lt;/dt&gt;&lt;dd&gt;スロットに存在するハンドラが呼ばれた後に実行されるシグナルを登録します。&lt;br&gt;Pot.Signal.attach() で登録したものと同じシグナル signalName で登録した場合、&lt;br&gt;attach() のハンドラが呼ばれた後に実行されます。&lt;br&gt;同じシグナルが存在しない場合 signal() によって実行しても何も起きません。&lt;br&gt;DOM エレメントに対して attach() した場合も同様です。&lt;br&gt;戻り値は、Pot.Signal.Handler のインスタンスです。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;attachPropBefore&lt;/dfn&gt;(object, propName, callback)&lt;/dt&gt;&lt;dd&gt;object が持つ関数 propName が呼ばれる前に実行されるシグナル callback を登録します。&lt;br&gt;attachBefore() と違い、Pot.Signal.signal() を呼ばなくても&lt;br&gt;object[propName] が呼ばれた時に自動的に実行されます。&lt;br&gt;attachPropBefore は、DOM オブジェクトに対しての動作は保証されません。&lt;br&gt;戻り値は、Pot.Signal.Handler のインスタンスです。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;attachPropAfter&lt;/dfn&gt;(object, propName, callback)&lt;/dt&gt;&lt;dd&gt;object が持つ関数 propName が呼ばれた後に実行されるシグナル callback を登録します。&lt;br&gt;attachAfter() と違い、Pot.Signal.signal() を呼ばなくても&lt;br&gt;object[propName] が呼ばれた時に自動的に実行されます。&lt;br&gt;attachPropAfter は、DOM オブジェクトに対しての動作は保証されません。&lt;br&gt;戻り値は、Pot.Signal.Handler のインスタンスです。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;detach&lt;/dfn&gt;(object[, signalName[, callback[, useCapture]]])&lt;/dt&gt;&lt;dd&gt;Pot.Signal.attach*() によって登録したシグナルを 1 つ解除します。&lt;br&gt;attachBefore, attachAfter, attachPropBefore, attachPropAfter で登録したものも同様に解除可能です。&lt;br&gt;引数に object だけを渡した場合、関連するシグナルが 1 つ解除されます。&lt;br&gt;引数 signalName, callback を渡すと明確に解除できます。&lt;br&gt;また、attach() などの戻り値のハンドラを object として渡して解除もできます。&lt;br&gt;登録と解除の関係は、setTimeout と clearTimeout の関係と同様に扱えます。&lt;br&gt;DOM エレメントに対しては、 removeEventListener と同様に扱うことができます。&lt;br&gt;解除成功時に true、失敗時に false が返ります。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;detachAll&lt;/dfn&gt;([object[, ...signals]])&lt;/dt&gt;&lt;dd&gt;Pot.Signal.attach*() によって登録したシグナルをすべて解除します。&lt;br&gt;attachBefore, attachAfter, attachPropBefore, attachPropAfter で登録したものも同様に解除可能です。&lt;br&gt;引数に object だけを渡した場合、関連するシグナルがすべて解除されます。&lt;br&gt;引数 signals を渡すと一致するシグナルがすべて解除できます。&lt;br&gt;シグナル名となる signals は文字列または配列で複数指定できます。&lt;br&gt;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;Pot.Signal.&lt;/em&gt;&lt;dfn&gt;signal&lt;/dfn&gt;(object, signalName[, ...args])&lt;/dt&gt;&lt;dd&gt;Pot.Signal.attach() によって登録したシグナルを実行します。&lt;br&gt;引数 object と signalName に一致するシグナルがすべて実行されます。&lt;br&gt;実行される関数には第三引数～以降に任意の引数が渡せます。&lt;br&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-about"&gt;PotLite.js&lt;/h2&gt;以下は PotLite.js について情報です。&lt;br /&gt;インストールや概要など、不要な場合は読み飛ばしてください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-download"&gt;PotLite.js ダウンロード&lt;/h2&gt;&lt;h4&gt;最新&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/zipball/master" title="最新のzip" style="font-weight: bold;"&gt;zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/tarball/master" title="最新のtar.gz" style="font-weight: bold;"&gt;tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;レポジトリ&lt;/h4&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 6px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="txt:nogutter:nocontrols" name="code"&gt;$ git clone git://github.com/polygonplanet/Pot.js&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;GitHub : &lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-compatibility"&gt;動作環境&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;以下の Web ブラウザで動作確認済みです。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mozilla Firefox *&lt;/li&gt;&lt;li&gt;Internet Explorer 6+&lt;/li&gt;&lt;li&gt;Safari *&lt;/li&gt;&lt;li&gt;Opera *&lt;/li&gt;&lt;li&gt;Google Chrome *&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;また、以下の環境でも動作するよう設計されています。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Greasemonkey (userscript)&lt;/li&gt;&lt;li&gt;Mozilla Firefox Add-On (on XUL)&lt;/li&gt;&lt;li&gt;Node.js&lt;/li&gt;&lt;li&gt;Other non-browser environment&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-install"&gt;インストール&lt;/h2&gt;&lt;div&gt;&lt;p&gt;一般的な方法で動作します。&lt;/p&gt;&lt;p&gt;例:&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="html" name="code"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;potlite.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;!--または--&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Node.js の場合。&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// Example to define Pot object on Node.js.&lt;br /&gt;var Pot = require('./potlite.min.js');&lt;br /&gt;Pot.debug(Pot.VERSION);&lt;br /&gt;&lt;br /&gt;Pot.Deferred.begin(function() {&lt;br /&gt;    Pot.debug('Hello Deferred!');&lt;br /&gt;}).then(function() {...})&lt;br /&gt;// ...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Greasemonkey (userscript) の例。&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// ...&lt;br /&gt;// @require  https://github.com/polygonplanet/Pot.js/raw/master/potlite.min.js&lt;br /&gt;// ...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;Pot.Deferred.begin(function() {&lt;br /&gt;    return Pot.request('http://www.example.com/data.json').then(function(res) {&lt;br /&gt;        return Pot.parseFromJSON(res.responseText);&lt;br /&gt;    });&lt;br /&gt;}).then(function(res) {&lt;br /&gt;    Pot.debug(res);&lt;br /&gt;    // do something...&lt;br /&gt;});&lt;br /&gt;//...&lt;br /&gt;&lt;/pre&gt;PotLite.js をバージョンを限定して Web から直接読み込みたい場合、&lt;br /&gt;上の GitHub リンクでは常に最新になってしまうため&lt;br /&gt;実装の差異による不具合が発生するかもしれません。&lt;br /&gt;そのため、API サーバを用意しました。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;v1.23 : &lt;a href="http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js"&gt;http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;これは、1.23 の部分をリリース済みのバージョンに合わせて変更できます。&lt;br /&gt;レポジトリに (例えば 1.xx と) バージョンをタグ付けした時に、&lt;br /&gt;あわせて API サーバに置くようにしています。&lt;br /&gt;&lt;br /&gt;例えば Greasemonkey で 1.23 を使いたい場合、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// ...&lt;br /&gt;// @require  http://api.polygonpla.net/js/pot/potlite/1.23/potlite.min.js&lt;br /&gt;// ...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;/pre&gt;と記述できます。&lt;br /&gt;&lt;br /&gt;Greasemonkey に限らず script タグからでもなんでも自由に使ってください。&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;p&gt;jQuery プラグインとしての例:&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// jQuery を読み込んだ後に実行。&lt;br /&gt;Pot.deferrizejQueryAjax();&lt;br /&gt;&lt;br /&gt;// Ajax 系の関数が Pot.Deferred を返すようになる&lt;br /&gt;$.getJSON('/hoge.json').then(function(data) {&lt;br /&gt;    alert(data.results[0].text);&lt;br /&gt;}).rescue(function(err) {&lt;br /&gt;    alert('Error! ' + err);&lt;br /&gt;}).ensure(function() {&lt;br /&gt;    return someNextProcess();&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// エフェクトなどを Deferred 化する 'deferred' が追加される&lt;br /&gt;$('div#hoge').deferred('hide', 'slow').then(function() {&lt;br /&gt;    // ( hide() が終了したあとの処理)&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Pot.deferrizejQueryAjax() は現状、&lt;br /&gt;ライブラリ側で実行しません。&lt;br /&gt;なので、プラグインを使用する場合は&lt;br /&gt;コードの最初などで実行する必要があります。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-reference"&gt;リファレンス・マニュアル&lt;/h2&gt;&lt;p&gt;より詳しい情報はすべてリファレンスに載っています。&lt;br /&gt;基本的な導入や、各メソッド・関数についても扱っています。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ"&gt;Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-testrun"&gt;動作テスト&lt;/h2&gt;&lt;p&gt;以下のページで動作テストができます。&lt;br /&gt;ページを開くと実装されている主な関数・メソッドを全てテストします。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/potlite.test.html" title="Pot.js + PotLite.js - Test Run - JavaScript Async Library"&gt;Pot.js + PotLite.js - Test Run - JavaScript Async Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-jsdoc"&gt;自動生成されたドキュメント&lt;/h2&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/jsdoc/potlite/index.html" title="PotLite.js - JsDoc Reference - Index"&gt;JSDoc ドキュメント (PotLite.js)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://code.google.com/intl/ja/closure/compiler/docs/js-for-compiler.html" title="Annotating JavaScript for the Closure Compiler - Closure Compiler - Google Code"&gt;Closure Compiler&lt;/a&gt; によりソースコードから自動生成されたドキュメントです。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;殆どの関数ごとにサンプルコードを載せているので、ある程度は参考になると思います。&lt;br /&gt;生成物をすべて確認しているわけではないので、誤認識してる箇所もあるかもしれません。&lt;br /&gt;より詳細な実装などは直接ソースコードを参照ください。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;不明な点、要望やバグや感想などありましたら&lt;br /&gt;&lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;@polygon_planet&lt;/a&gt; や 下のレポジトリから、またはメールでなんでもどぞです。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-8721810408699750994?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/8721810408699750994/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/javascript-potlitejs-122-signal.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8721810408699750994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8721810408699750994'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/javascript-potlitejs-122-signal.html' title='JavaScript非同期ライブラリ PotLite.js 1.22 リリース。アスペクト指向っぽく書けるSignal実装'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2876890891446541643</id><published>2011-11-05T13:02:00.007+09:00</published><updated>2011-11-12T19:47:44.528+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='イテレータ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Deferred'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='ベンチマーク'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>フリーズやカクカクしない安定した動作のアプリやアドオン、ゲームなどが作れるJavaScriptライブラリ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}body div.pot-overlay-content hr {  width: 98%;  height: 0;  margin: 0 0 6px 0;  padding: 0 0 6px 0;  *margin: 0;  border: 1px dashed #999;  border-width: 0;  border-bottom-width: 1px;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}.pot-overlay-content h3 {font-size: 130%; margin-top: 30px; margin-bottom: 20px;}.pot-overlay-content h4 {font-size: 110%; margin-top: 18px; margin-bottom: 10px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}body div.pot-overlay-content table.grid,body div.pot-overlay-content table.grid td {  border: 1px solid #999;  padding: 4px 6px;  margin; 4px 6px;  vertical-align: middle;  text-align: center;  border-collapse: collapse;  border-spacing: 0;  empty-cells: show;}&lt;/style&gt;&lt;script&gt;$(function() {if (1) {  /*  $('#pot-polygonplanet-scrollto-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-dst', 800);    return false;  });  */  $('#pot-polygonplanet-scrollto-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-src', 800);    return false;  });  $('#pot-polygonplanet-scrollto-tiny-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-polygonplanet-scrollto-tiny-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Web を閲覧していると、突然 CPU 100% になったり&lt;br /&gt;定期的に負荷がかかったりします。&lt;br /&gt;&lt;br /&gt;flash などを除くと、それ以外のほとんどは JavaScript による重いループ処理が原因です。&lt;br /&gt;少しずつ改善されてるような気はしますが&lt;br /&gt;おそらくもう何年も前から、この問題がついてまわっていたのではないでしょうか。&lt;br /&gt;&lt;br /&gt;そしてこのような負荷は、高スペックなマシンでは気付かないと思います。&lt;br /&gt;開発者やテスターが高スペックな PC で動作確認を行ったことにより、&lt;br /&gt;瞬間的な負荷を見過ごされたまま公開、リリースされてしまうこともあると思います。&lt;br /&gt;それを、低スペックなマシンや iPhone などスマホを使っているユーザーが実行し&lt;br /&gt;負荷に耐え切れずカクカクな描画になってしまったり、&lt;br /&gt;最悪フリーズしてしまう場合もあります。&lt;br /&gt;&lt;br /&gt;マシンの性能に限らず、例え高スペックマシンでも&lt;br /&gt;いくつものアプリケーションを常時起動していて&lt;br /&gt;タスクがいっぱいになっているユーザーもこのような事例に該当します。&lt;br /&gt;&lt;br /&gt;何らかのアプリケーションを開発する場合、&lt;br /&gt;処理の高速化は常に求められます。&lt;br /&gt;より高速に動作したほうが軽快なのは確かです。&lt;br /&gt;&lt;br /&gt;ですがクライアントアプリケーションを作る場合、&lt;br /&gt;CPU 100% 使う処理を 10 秒も 20 秒も続けられてしまったら&lt;br /&gt;それはもう不快でしかありません。&lt;br /&gt;さらにそれが非ブロックでなく実行されてたら&lt;br /&gt;マシンはもうフリーズのような動かない状態になりっぱなしです。&lt;br /&gt;&lt;br /&gt;単純に高速を目指すのではなく、UI のことを考え制御を返すことが重要です。&lt;br /&gt;UI を無視してひたすら高速に実行して 5 秒かかる処理だったら、&lt;br /&gt;定期的に UI に制御を返し&lt;br /&gt;例え数秒遅くなってもバックグラウンドで行い CPU 負荷を抑えることが&lt;br /&gt;ユーザーへのストレス軽減として重要と考えています。&lt;br /&gt;&lt;br /&gt;さらに非同期で実行することで並列化も可能になり、&lt;br /&gt;逆に本来より速く実行できる可能性もあります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PotLite.js&lt;/strong&gt; は、そのような負荷軽減を可能とする JavaScript ライブラリです。&lt;br /&gt;非同期処理をチェインで扱う Deferred オブジェクトを中心に&lt;br /&gt;いろいろなループ処理を非同期で実行できるイテレータを実装しています。&lt;br /&gt;&lt;br /&gt;イテレータは PotLite.js バージョン 1.21 現在、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;forEach&lt;/li&gt;&lt;li&gt;repeat&lt;/li&gt;&lt;li&gt;forEver&lt;/li&gt;&lt;li&gt;iterate&lt;/li&gt;&lt;li&gt;items&lt;/li&gt;&lt;li&gt;zip&lt;/li&gt;&lt;li&gt;map&lt;/li&gt;&lt;li&gt;filter&lt;/li&gt;&lt;li&gt;reduce&lt;/li&gt;&lt;li&gt;every&lt;/li&gt;&lt;li&gt;some&lt;/li&gt;&lt;/ul&gt;が実装されています。&lt;br /&gt;非同期での実行、同期での実行、そして Deferred チェイン上での実行が可能です。&lt;br /&gt;&lt;br /&gt;そして、速度指定できるのが特徴の一つです。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js:nogutter" name="code"&gt;Deferred.forEach(obj, function(value, key) {...})&lt;br /&gt;&lt;/pre&gt;上のコードが forEach (jQuery での jQuery.each のようなもの) の非同期での通常実行になり、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js:nogutter" name="code"&gt;Deferred.forEach.slow(obj, function(value, key) {...})&lt;br /&gt;&lt;/pre&gt;上のように .slow と速度を明示することができます。&lt;br /&gt;すると各ループをゆっくり目で実行します。&lt;br /&gt;&lt;br /&gt;他にも .fast などの指定ができます。&lt;br /&gt;関数内で &lt;code&gt;return wait(1);&lt;/code&gt; 等と Pot.Deferred オブジェクトを返すことで&lt;br /&gt;各ループ間でより細かな wait などの調整ができます。&lt;br /&gt;逆に、非同期イテレートをより速く実行したい場合は&lt;br /&gt;&lt;code&gt;Pot.Defered.forEach.ninja(...)&lt;/code&gt; と、&lt;br /&gt;最も速く実行するよう定義されている .ninja を指定すると&lt;br /&gt;通常の for 文を単に関数で包んだのと同じくらいの速度で実行できます。&lt;br /&gt;&lt;br /&gt;より詳しくは &lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ" style="font-weight: bold;"&gt;リファレンス&lt;/a&gt; を参照してください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;どれくらい変化があるかベンチマークをとってみました。&lt;br /&gt;&lt;div style="padding: 5px; margin: 10px;"&gt;&lt;table border="1" class="grid"&gt;&lt;tr&gt; &lt;td&gt;イテレータ&lt;/td&gt; &lt;td&gt;JSON ファイルサイズ&lt;/td&gt; &lt;td&gt;CPU 最大使用率&lt;/td&gt; &lt;td&gt;CPU 平均使用率&lt;/td&gt; &lt;td&gt;実行時間 (ms)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;for 文&lt;/td&gt; &lt;td&gt;1MB&lt;/td&gt; &lt;td&gt;14.52%&lt;/td&gt; &lt;td&gt;10.61%&lt;/td&gt; &lt;td&gt;1211ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;jQuery.each&lt;/td&gt; &lt;td&gt;1MB&lt;/td&gt; &lt;td&gt;16.28%&lt;/td&gt; &lt;td&gt;13.53%&lt;/td&gt; &lt;td&gt;1362ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Pot.Deferred.forEach&lt;/td&gt; &lt;td&gt;1MB&lt;/td&gt; &lt;td&gt;11.65%&lt;/td&gt; &lt;td&gt;5.53%&lt;/td&gt; &lt;td&gt;1647ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;for 文&lt;/td&gt; &lt;td&gt;5MB&lt;/td&gt; &lt;td&gt;24.85%&lt;/td&gt; &lt;td&gt;21.71%&lt;/td&gt; &lt;td&gt;4717ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;jQuery.each&lt;/td&gt; &lt;td&gt;5MB&lt;/td&gt; &lt;td&gt;27.78%&lt;/td&gt; &lt;td&gt;24.29%&lt;/td&gt; &lt;td&gt;5570ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Pot.Deferred.forEach&lt;/td&gt; &lt;td&gt;5MB&lt;/td&gt; &lt;td&gt;13.74%&lt;/td&gt; &lt;td&gt;8.61%&lt;/td&gt; &lt;td&gt;8925ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;for 文&lt;/td&gt; &lt;td&gt;10MB&lt;/td&gt; &lt;td&gt;28.14%&lt;/td&gt; &lt;td&gt;25.92%&lt;/td&gt; &lt;td&gt;10699ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;jQuery.each&lt;/td&gt; &lt;td&gt;10MB&lt;/td&gt; &lt;td&gt;31.09%&lt;/td&gt; &lt;td&gt;30.77%&lt;/td&gt; &lt;td&gt;15844ms.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Pot.Deferred.forEach&lt;/td&gt; &lt;td&gt;10MB&lt;/td&gt; &lt;td&gt;18.62%&lt;/td&gt; &lt;td&gt;9.77%&lt;/td&gt; &lt;td&gt;38909ms.&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;この結果は、&lt;a href="#pot-polygonplanet-scrollto-src" id="pot-polygonplanet-scrollto-dst"&gt;下記のネストループ&lt;/a&gt;を Core i3 で 5 回実行した平均結果です。&lt;br /&gt;JSON ファイルは、&lt;a href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%AD%A1%BC%A5%EF%A1%BC%A5%C9%B0%EC%CD%F7%A5%D5%A5%A1%A5%A4%A5%EB" title="はてなキーワード一覧ファイルとは - はてなキーワード"&gt;はてなキーワード一覧&lt;/a&gt; から取得した CSV をキーワードだけの JSON に変換したものです。&lt;br /&gt;10MB はキーワードすべて、5MB は半分で切った JSON ファイル、 1MB はそのまた半分です。 &lt;br /&gt;&lt;br /&gt;Pot.Deferred.forEach によるイテレータは、処理時間が他と比べ長くなっていますが&lt;br /&gt;CPU 最大使用率、CPU 平均使用率 共に安定しているのがわかります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU グラフも比較してみました。&lt;br /&gt;すべてのキーワードを対象に、Pot.Deferred.forEach (上) と、jQuery.each (下) をそれぞれ実行した結果です。&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://2.bp.blogspot.com/-B2SoZWGB3PU/TrR6euItVhI/AAAAAAAAEe8/FATex7Ij7ZY/s1600/cpu-jquery-vs-potlitejs-deferred-loop-iterate-javascript.png" imageanchor="1"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/-B2SoZWGB3PU/TrR6euItVhI/AAAAAAAAEe8/FATex7Ij7ZY/s640/cpu-jquery-vs-potlitejs-deferred-loop-iterate-javascript.png" width="388" /&gt;&lt;/a&gt;&lt;/div&gt;jQuery.each は、途中で「警告：応答しないファイル」のダイアログがでてしまいました。&lt;br /&gt;そのため、本来なら Pot.Deferred.forEach のほうが時間がかかると予想してください。&lt;br /&gt;&lt;br /&gt;それでも、Pot.Deferred.forEach では jQuery.each に比べ&lt;br /&gt;瞬間的 (もしくは断続的) な負荷を抑えることができています。&lt;br /&gt;これは、対象のデータがどれほど巨大でも&lt;br /&gt;負荷のかからないイテレートが可能なことを示しています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;なお、上記のベンチマークは&lt;br /&gt;&lt;strong&gt;ある程度負荷のかかるループ処理&lt;/strong&gt; を対象としています。&lt;br /&gt;PotLite.js のイテレータは、各ループがある程度重いと判断すると CPU 負荷を抑えるよう働きます。&lt;br /&gt;つまり、逆に言うと&lt;br /&gt;&lt;strong&gt;瞬時に終わるような小中規模のループでは、他のループと変わらない速度で実行される&lt;/strong&gt;ということです。&lt;br /&gt;&lt;br /&gt;以下に、小規模のループ結果を記します。&lt;br /&gt;&lt;div style="padding: 5px; margin: 10px;"&gt;&lt;table border="1" class="grid"&gt;&lt;tr&gt;&lt;td&gt;イテレータ&lt;/td&gt;&lt;td&gt;CPU 最大使用率&lt;/td&gt;&lt;td&gt;CPU 平均使用率&lt;/td&gt;&lt;td&gt;実行時間 (ms)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;for 文&lt;/td&gt;&lt;td&gt;4.10%&lt;/td&gt;&lt;td&gt;3.87%&lt;/td&gt;&lt;td&gt;9ms.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;jQuery.each&lt;/td&gt;&lt;td&gt;5.54%&lt;/td&gt;&lt;td&gt;4.72%&lt;/td&gt;&lt;td&gt;18ms.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pot.Deferred.forEach&lt;/td&gt;&lt;td&gt;4.71%&lt;/td&gt;&lt;td&gt;4.15%&lt;/td&gt;&lt;td&gt;19ms.&lt;/td&gt;&lt;/tr&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;この結果は、1MB の JSON ファイルを対象に &lt;a href="#pot-polygonplanet-scrollto-tiny-src" id="pot-polygonplanet-scrollto-tiny-dst"&gt;ユニーク処理をなくした&lt;/a&gt;実行結果です。&lt;br /&gt;上と同じく 5 回実行した結果の平均になります。&lt;br /&gt;&lt;br /&gt;PotLite.js は、jQuery.each とほぼ同じ実行速度で、&lt;br /&gt;ちょうど for 文を関数で包んだものを実行したのと同じくらいの速度で実行できています。&lt;br /&gt;&lt;br /&gt;このような毎回の処理が小さなループでは、 for 文などが最も適していますが&lt;br /&gt;適度に各関数を使うことでコストも減少させることができます。&lt;br /&gt;&lt;br /&gt;&lt;div id="pot-polygonplanet-scrollto-src"&gt;以下は、テストの使用したソースコードです。&lt;/div&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// jQuery.each&lt;br /&gt;function benchmark_jQuery() {&lt;br /&gt;    $.getJSON('hatena.keywords.json?callback=?', {&lt;br /&gt;        size : '10mb'&lt;br /&gt;    }, function(data) {&lt;br /&gt;        var results = [];&lt;br /&gt;        var start = +new Date;&lt;br /&gt;        $.each(data.keywords, function(k, word) {&lt;br /&gt;            if (!/[^a-zA-Z0-9_.-]/.test(word)) {&lt;br /&gt;                var uniq = true;&lt;br /&gt;                for (var i = 0; i &amp;lt; results.length; i++) {&lt;br /&gt;                    if (word === results[i]) {&lt;br /&gt;                        uniq = false;&lt;br /&gt;                        break;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                if (uniq) {&lt;br /&gt;                    results.push(word);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        $('#result').text((+new Date) - start);&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;巨大なファイルの転送と負荷のテストのため、ソースのみ記します。&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// Pot.Deferred.forEach&lt;br /&gt;function benchmark_potlite() {&lt;br /&gt;    begin(function() {&lt;br /&gt;        return jsonp('hatena.keywords.json?callback=?', {&lt;br /&gt;            queryString : {&lt;br /&gt;                size : '10mb'&lt;br /&gt;            }&lt;br /&gt;        }).then(function(res) {&lt;br /&gt;            var results = [];&lt;br /&gt;            var start = now();&lt;br /&gt;            return Deferred.forEach(res.keywords, function(word) {&lt;br /&gt;                if (!/[^a-zA-Z0-9_.-]/.test(word)) {&lt;br /&gt;                    var uniq = true;&lt;br /&gt;                    for (var i = 0; i &amp;lt; results.length; i++) {&lt;br /&gt;                        if (word === results[i]) {&lt;br /&gt;                            uniq = false;&lt;br /&gt;                            break;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    if (uniq) {&lt;br /&gt;                        results.push(word);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }).then(function() {&lt;br /&gt;                return now() - start;&lt;br /&gt;            });&lt;br /&gt;        }).then(function(time) {&lt;br /&gt;            $('#result').text(time);&lt;br /&gt;        });&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div id="pot-polygonplanet-scrollto-tiny-src"&gt;以下は、小規模のループとしてテストしたソースコードです。&lt;/div&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// jQuery.each&lt;br /&gt;function benchmark_jQuery_lite() {&lt;br /&gt;    $.getJSON('hatena.keywords.json?callback=?', {&lt;br /&gt;        size : '1mb'&lt;br /&gt;    }, function(data) {&lt;br /&gt;        var results = [];&lt;br /&gt;        var start = +new Date;&lt;br /&gt;        $.each(data.keywords, function(k, word) {&lt;br /&gt;            if (!/[^a-zA-Z0-9_.-]/.test(word)) {&lt;br /&gt;                results.push(word);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        $('#result').text((+new Date) - start);&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// Pot.Deferred.forEach&lt;br /&gt;function benchmark_potlite_lite() {&lt;br /&gt;    begin(function() {&lt;br /&gt;        return jsonp('hatena.keywords.json?callback=?', {&lt;br /&gt;            queryString : {&lt;br /&gt;                size : '1mb'&lt;br /&gt;            }&lt;br /&gt;        }).then(function(res) {&lt;br /&gt;            var results = [];&lt;br /&gt;            var start = now();&lt;br /&gt;            return Deferred.forEach(res.keywords, function(word) {&lt;br /&gt;                if (!/[^a-zA-Z0-9_.-]/.test(word)) {&lt;br /&gt;                    results.push(word);&lt;br /&gt;                }&lt;br /&gt;            }).then(function() {&lt;br /&gt;                return now() - start;&lt;br /&gt;            });&lt;br /&gt;        }).then(function(time) {&lt;br /&gt;            $('#result').text(time);&lt;br /&gt;        });&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs"&gt;PotLite.js&lt;/h2&gt;PotLite.js は、Pot.js の軽量バージョンです。&lt;br /&gt;非同期処理のオブジェクト/関数だけに絞ったライブラリです。&lt;br /&gt;経緯などは &lt;a href="http://polygon-planet.blogspot.com/2011/10/javascriptdeferred.html" title="JavaScriptでDeferredとイテレータの非同期処理用ライブラリ作ってみた | 圧縮電子精神音楽浮遊構造体"&gt;Pot.js に関する以前の記事&lt;/a&gt; を参照ください。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-overview"&gt;概要&lt;/h2&gt;PotLite.js は、非ブロックでの非同期処理を直列的に書けるようにし、&lt;br /&gt;UI や CPU への負担を軽減するループ処理を中心に実装された JavaScript ライブラリです。&lt;br /&gt;MochiKit ライクな Deferred オブジェクトにより&lt;br /&gt;様々なイテレート (forEach, filter, map, repeat, some など) を可能とします。 &lt;br /&gt;&lt;br /&gt;※ここでいう MochiKit ライクとは、JSDeferred とは違い 1 つのチェインが 1 つのインスタンスということです。&lt;br /&gt;※Deferred チェイン は JSDeferred や MochiKit.Async.Deferred と同じ感覚で扱えます。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-download"&gt;ダウンロード&lt;/h2&gt;&lt;h4&gt;最新&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/zipball/master" title="最新のzip" style="font-weight: bold;"&gt;zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js/tarball/master" title="最新のtar.gz" style="font-weight: bold;"&gt;tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;レポジトリ&lt;/h4&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 6px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="txt:nogutter:nocontrols" name="code"&gt;$ git clone git://github.com/polygonplanet/Pot.js&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;GitHub : &lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-compatibility"&gt;動作環境&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;以下の Web ブラウザで動作確認済みです。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mozilla Firefox *&lt;/li&gt;&lt;li&gt;Internet Explorer 6+&lt;/li&gt;&lt;li&gt;Safari *&lt;/li&gt;&lt;li&gt;Opera *&lt;/li&gt;&lt;li&gt;Google Chrome *&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;また、以下の環境でも動作するよう設計されています。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Greasemonkey (userscript)&lt;/li&gt;&lt;li&gt;Mozilla Firefox Add-On (on XUL)&lt;/li&gt;&lt;li&gt;Node.js&lt;/li&gt;&lt;li&gt;Other non-browser environment&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-install"&gt;インストール&lt;/h2&gt;&lt;div&gt;&lt;p&gt;一般的な方法で動作します。&lt;/p&gt;&lt;p&gt;例:&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="html" name="code"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;potlite.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Node.js の場合。&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// Example to define Pot object on Node.js.&lt;br /&gt;var Pot = require('./potlite.min.js');&lt;br /&gt;Pot.debug(Pot.VERSION);&lt;br /&gt;&lt;br /&gt;Pot.Deferred.begin(function() {&lt;br /&gt;    Pot.debug('Hello Deferred!');&lt;br /&gt;}).then(function() {...})&lt;br /&gt;// ...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Greasemonkey (userscript) の例。&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// ...&lt;br /&gt;// @require  https://github.com/polygonplanet/Pot.js/raw/master/potlite.min.js&lt;br /&gt;// ...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;Pot.Deferred.begin(function() {&lt;br /&gt;    return Pot.request('http://www.example.com/data.json').then(function(res) {&lt;br /&gt;        return Pot.parseFromJSON(res.responseText);&lt;br /&gt;    });&lt;br /&gt;}).then(function(res) {&lt;br /&gt;    Pot.debug(res);&lt;br /&gt;    // do something...&lt;br /&gt;});&lt;br /&gt;//...&lt;br /&gt;&lt;/pre&gt;PotLite.js をバージョンを限定して Web から直接読み込みたい場合、&lt;br /&gt;上の GitHub リンクでは常に最新になってしまうため&lt;br /&gt;実装の差異による不具合が発生するかもしれません。&lt;br /&gt;そのため、API サーバを用意しました。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;v1.21 : &lt;a href="http://api.polygonpla.net/js/pot/potlite/1.21/potlite.min.js"&gt;http://api.polygonpla.net/js/pot/potlite/1.21/potlite.min.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;これは、1.21 の部分をリリース済みのバージョンに合わせて変更できます。&lt;br /&gt;レポジトリに (例えば 1.22 と) バージョンをタグ付けした時に、&lt;br /&gt;あわせて API サーバに置くようにしています。&lt;br /&gt;&lt;br /&gt;例えば Greasemonkey で 1.21 を使いたい場合、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// ...&lt;br /&gt;// @require  http://api.polygonpla.net/js/pot/potlite/1.21/potlite.min.js&lt;br /&gt;// ...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;/pre&gt;と記述できます。&lt;br /&gt;&lt;br /&gt;Greasemonkey に限らず script タグからでもなんでも自由に使ってください。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;&lt;p&gt;jQuery プラグインとしての例:&lt;/p&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// jQuery を読み込んだ後に実行。&lt;br /&gt;Pot.deferrizejQueryAjax();&lt;br /&gt;&lt;br /&gt;// Ajax 系の関数が Pot.Deferred を返すようになる&lt;br /&gt;$.getJSON('/hoge.json').then(function(data) {&lt;br /&gt;    alert(data.results[0].text);&lt;br /&gt;}).rescue(function(err) {&lt;br /&gt;    alert('Error! ' + err);&lt;br /&gt;}).ensure(function() {&lt;br /&gt;    return someNextProcess();&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// エフェクトなどを Deferred 化する 'deferred' が追加される&lt;br /&gt;$('div#hoge').deferred('hide', 'slow').then(function() {&lt;br /&gt;    // ( hide() が終了したあとの処理)&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Pot.deferrizejQueryAjax() は現状、&lt;br /&gt;ライブラリ側で実行しません。&lt;br /&gt;なので、プラグインを使用する場合は&lt;br /&gt;コードの最初などで実行する必要があります。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-reference"&gt;リファレンス・マニュアル&lt;/h2&gt;&lt;p&gt;より詳しい情報はすべてリファレンスに載っています。&lt;br /&gt;基本的な導入や、各メソッド・関数についても扱っています。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ"&gt;Pot.js + PotLite.js - ドキュメントリファレンス - JavaScript非同期処理ライブラリ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-testrun"&gt;動作テスト&lt;/h2&gt;&lt;p&gt;以下のページで動作テストができます。&lt;br /&gt;ページを開くと実装されている主な関数・メソッドを全てテストします。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/potlite.test.html" title="Pot.js + PotLite.js - Test Run - JavaScript Async Library"&gt;Pot.js + PotLite.js - Test Run - JavaScript Async Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-potlitejs-jsdoc"&gt;自動生成されたドキュメント&lt;/h2&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/jsdoc/potlite/index.html" title="PotLite.js - JsDoc Reference - Index"&gt;JSDoc ドキュメント (PotLite.js)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://code.google.com/intl/ja/closure/compiler/docs/js-for-compiler.html" title="Annotating JavaScript for the Closure Compiler - Closure Compiler - Google Code"&gt;Closure Compiler&lt;/a&gt; によりソースコードから自動生成されたドキュメントです。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;殆どの関数ごとにサンプルコードを載せているので、ある程度は参考になると思います。&lt;br /&gt;生成物をすべて確認しているわけではないので、誤認識してる箇所もあるかもしれません。&lt;br /&gt;より詳細な実装などは直接ソースコードを参照ください。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;久しぶりにちょっとがんばって重点をまとめてみました。&lt;br /&gt;これを機に、Pot.js (PotLite.js) で遊んでくれると嬉しいです。&lt;br /&gt;&lt;br /&gt;不明な点、要望やバグや感想などありましたら&lt;br /&gt;&lt;a href="http://twitter.com/polygon_planet" title="Twitter @polygon_planet"&gt;@polygon_planet&lt;/a&gt; や 下のレポジトリから、またはメールでなんでもどぞです。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-2876890891446541643?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/2876890891446541643/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2876890891446541643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2876890891446541643'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/javascript.html' title='フリーズやカクカクしない安定した動作のアプリやアドオン、ゲームなどが作れるJavaScriptライブラリ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-B2SoZWGB3PU/TrR6euItVhI/AAAAAAAAEe8/FATex7Ij7ZY/s72-c/cpu-jquery-vs-potlitejs-deferred-loop-iterate-javascript.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2370723080209266886</id><published>2011-11-03T23:46:00.000+09:00</published><updated>2011-11-03T23:46:46.974+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Element'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>ページ内のDOM要素を削除したり操作できるTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;ページ内の DOM 要素を削除したりします。&lt;br /&gt;主にウザい要素を消し去るのに便利かも。&lt;br /&gt;マウス下の HTML エレメントや、選択範囲の要素を削除できます。&lt;br /&gt;Ctrl+A (全選択) して選択範囲を消すと何もなくなり寂しい気分が味わえます。&lt;br /&gt;&lt;br /&gt;こんなことは Firebug で事足りるのですが、&lt;br /&gt;パネルを出したり戻したりするのすら めんどくさいので作りました。&lt;br /&gt;&lt;br /&gt;Adblock など常時使ってる方にはあまり意味ないかもしれません。&lt;br /&gt;&lt;br /&gt;コンテキストメニューの 「Tombloo」 から操作できます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://1.bp.blogspot.com/-CAiAcSh4np8/TrKlsUY5CEI/AAAAAAAAEe0/CIRlR9zBnqw/s1600/tombloo-patch-action-element-context-menu.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-CAiAcSh4np8/TrKlsUY5CEI/AAAAAAAAEe0/CIRlR9zBnqw/s1600/tombloo-patch-action-element-context-menu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;今のところメニューは 2 つだけですが、&lt;br /&gt;なにか思いついたら追加して随時アップデートする予定です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.actions.element.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.actions.element.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-2370723080209266886?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/2370723080209266886/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/domtombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2370723080209266886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2370723080209266886'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/domtombloo.html' title='ページ内のDOM要素を削除したり操作できるTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-CAiAcSh4np8/TrKlsUY5CEI/AAAAAAAAEe0/CIRlR9zBnqw/s72-c/tombloo-patch-action-element-context-menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-699094594678665323</id><published>2011-11-02T09:44:00.001+09:00</published><updated>2011-11-02T13:20:46.193+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='リーダー'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='GoogleReader'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Feed'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>新GoogleReaderで左サイドバー非表示ボタンをつけるGreasemonkey</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}body div.pot-overlay-content .note, body div.pot-overlay-content .warn {  display: block;  margin: 6px;  padding: 6px;  font-weight: bold;  -webkit-border-radius: 3px;  -moz-border-radius: 3px;  border-radius: 3px;}body div.pot-overlay-content .note {  color: #333366;  background: #eeeeff;  border: 2px solid #6252ea;}body div.pot-overlay-content .warn {  color: #c65b3a;  background: #ffeeee;  border: 2px solid #e27751;}body div.pot-overlay-content .note *, body div.pot-overlay-content .warn * {font-weight: bold;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;div class="warn"&gt; このスクリプトはゴミです (コメント参照)。&lt;br /&gt; それでも使う人だけどうぞ。&lt;br /&gt;&lt;br /&gt; 恥ずかしーーーー！！&lt;br /&gt; 記事消そうか真剣に悩んだ……&lt;br /&gt; (教えてくれてありがとう)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;こないだから新しいインターフェイスになった Google リーダーにまだ慣れない。&lt;br /&gt;f 押すとフルスクリーンになることを知ったのはいいのですが&lt;br /&gt;マウス操作に慣れてたのでどうしようかと。&lt;br /&gt;そのためにジェスチャー拡張したりマウスボタン拡張したりとかしたくなかったから、&lt;br /&gt;とりあえず Greasemonkey で書きました。&lt;br /&gt;左サイドバーをトグル表示 (表示/非表示) するボタンがつくだけのシンプルなスクリプトです。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://2.bp.blogspot.com/-d3A1dmKKAg0/TrCPp_VxjXI/AAAAAAAAEes/z5SGN-fDrSs/s1600/google-reader-expand-greasemonkey.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-d3A1dmKKAg0/TrCPp_VxjXI/AAAAAAAAEes/z5SGN-fDrSs/s1600/google-reader-expand-greasemonkey.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;Download&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://userscripts.org/scripts/show/116959" style="font-weight: bold;" title="Google Reader Layout Expander for Greasemonkey"&gt;Google Reader Layout Expander for Greasemonkey&lt;/a&gt; から Install ボタンでインストールできます。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-699094594678665323?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/699094594678665323/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/googlereadergreasemonkey.html#comment-form' title='3 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/699094594678665323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/699094594678665323'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/11/googlereadergreasemonkey.html' title='新GoogleReaderで左サイドバー非表示ボタンをつけるGreasemonkey'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-d3A1dmKKAg0/TrCPp_VxjXI/AAAAAAAAEes/z5SGN-fDrSs/s72-c/google-reader-expand-greasemonkey.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2124353834730397221</id><published>2011-10-20T23:13:00.001+09:00</published><updated>2011-10-20T23:19:45.736+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='URI'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>ページのタイトルや(非圧縮の)URLをクリップボードにコピーするだけのTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;&lt;p&gt;開いてるページのタイトルや 非圧縮の URL をクリップボードにコピーします。&lt;br /&gt;コンテキストメニューの 「Tombloo」 からコピーできます。&lt;br /&gt;ただそれだけのパッチです。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ちょっとした HTML などを書いてる時や&lt;br /&gt;ブログとかのテンプレートいじってる時、&lt;br /&gt;リンク (&amp;lt;a href=&amp;quot;...&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;) を作って別タブで開いて&lt;br /&gt;ソース開いてタイトルを &amp;lt;title/&amp;gt; からコピペという原始的なことをやっていたので&lt;br /&gt;思わず恥ずかしくなって作った次第でございます。&lt;br /&gt;&lt;/p&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://4.bp.blogspot.com/-Aa_V-fWTmH8/TqAppFwZXPI/AAAAAAAAEeY/Ng5Ah8B99R4/s1600/tombloo-copytitle-dialog-patch.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Aa_V-fWTmH8/TqAppFwZXPI/AAAAAAAAEeY/Ng5Ah8B99R4/s1600/tombloo-copytitle-dialog-patch.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Web ページ上でコンテキストメニューを開くと&lt;br /&gt;Tombloo メニューに 「&lt;b&gt;クリップボードにコピー&lt;/b&gt;」 が出現します。&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.actions.copytitle.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.actions.copytitle.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-2124353834730397221?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/2124353834730397221/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/10/urltombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2124353834730397221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2124353834730397221'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/10/urltombloo.html' title='ページのタイトルや(非圧縮の)URLをクリップボードにコピーするだけのTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Aa_V-fWTmH8/TqAppFwZXPI/AAAAAAAAEeY/Ng5Ah8B99R4/s72-c/tombloo-copytitle-dialog-patch.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-6478185227937367151</id><published>2011-10-11T18:35:00.001+09:00</published><updated>2011-11-12T20:57:55.836+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='イテレータ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='非同期'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Deferred'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Node.js'/><title type='text'>JavaScriptでDeferredとイテレータの非同期処理用ライブラリ作ってみた</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Pot.js という JavaScript ライブラリを作りました。&lt;br /&gt;&lt;br /&gt;1ヶ月半くらい前からこつこつ書いてたんですが&lt;br /&gt;実は先日、HDD トラブルでソースコードまるごと紛失してしまったんです。&lt;br /&gt;作業ディレクトリごとなくなっちゃってもう涙目でした。&lt;br /&gt;システム復元とかキャッシュとかいろいろ探したりがんばって&lt;br /&gt;HDD の断片から数週間前のデータの一部がいちおう見つかって&lt;br /&gt;そのコードの切れ端みたいのと記憶を頼りに元に戻してるところです。&lt;br /&gt;&lt;br /&gt;その作業があまりにめんどくさいので、&lt;br /&gt;とりあえず動くところまで元に戻った&lt;br /&gt;非同期処理のオブジェクトのみライブラリにしようと&lt;br /&gt;PotLite.js としてコミットしました。&lt;br /&gt;&lt;br /&gt;あまり巨大なライブラリより結局のところよかったのかもしれないです。&lt;br /&gt;それでも、一部の関数など足りてない気がしてならない。&lt;br /&gt;ぜんぜん思い出せないけど。。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="PotLite.js"&gt;PotLite.js&lt;/h2&gt;PotLite.js は、&lt;br /&gt;非ブロックでの非同期処理を直列的に書けるようにし、&lt;br /&gt;UI や CPU への負担を軽減するループ処理を中心に実装された JavaScript ライブラリです。&lt;br /&gt;MochiKit ライクな Deferred オブジェクトにより&lt;br /&gt;様々なイテレート (forEach, filter, map, filter, repeat, some など) を可能とします。 &lt;br /&gt;&lt;br /&gt;※ここで言う MochiKit ライクとは、1 つのチェインが 1 つのインスタンスということです&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;Download&lt;/h2&gt;&lt;p&gt;最新はレポジトリにあります:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-document"&gt;ドキュメント/リファレンス&lt;/h2&gt;&lt;p&gt;&lt;a href="http://polygonplanet.github.com/Pot.js/index.html" title="Pot.js + PotLite.js - ドキュメントリファレンス" style="font-weight: bold;"&gt;PotLite.js のドキュメントとリファレンス&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-feature"&gt;特徴&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;クロスブラウザ + Greasemonkey, Firefox アドオン (XUL), Node.js などで動く&lt;/li&gt;&lt;li&gt;まるで jQuery のように繋げやすい Deferred チェイン&lt;/li&gt;&lt;li&gt;Deferred チェイン上で forEach などのイテレートが可能&lt;/li&gt;&lt;li&gt;チェインのコールバック引数を利用した分割代入 (Destructuring-Assignment) ぽいことが可能&lt;/li&gt;&lt;li&gt;イテレータは各ループ処理の負荷を計算し自動で負荷軽減する&lt;/li&gt;&lt;li&gt;各チェイン間やイテレータで実行速度の指定ができる&lt;/li&gt;&lt;li&gt;重たい処理やループを分散させ軽減することが可能&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;なんだかあまり思いつかなかった。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;重たい処理の軽減というのは、&lt;br /&gt;前に作った &lt;a href="http://polygon-planet.blogspot.com/2011/06/audiobookmarktombloo.html" title="「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ"&gt;Tombloo の Bookmark パッチ&lt;/a&gt; で既に近いことを実装してるんです。&lt;br /&gt;&lt;br /&gt;というのも、私はブックマークのタグ名をキーワードとして扱ってるせいか&lt;br /&gt;タグ数が 10000 とか超えてどんどん処理が重くなっちゃうんです。&lt;br /&gt;&lt;br /&gt;マシンスペックにもよりますが、&lt;br /&gt;そういった大きな配列やオブジェクトをループするたび重くて&lt;br /&gt;落ちないか心配になってるようじゃどうしようもないなと思って&lt;br /&gt;瞬間的な (もしくは数秒～数十秒間続く持続的な) 負荷をどうにか抑えられないかと&lt;br /&gt;いろいろやってますが、ほとんどは分散させるように実行することと&lt;br /&gt;UI に制御を返すことで、だいぶ安定した動作になったのです。&lt;br /&gt;&lt;br /&gt;それを Web ブラウザ上でもできないかと&lt;br /&gt;今回実装したライブラリ Pot.js (PotLite.js) の主な目的がそれです。&lt;br /&gt;&lt;br /&gt;あとはやはり、JSDeferred の影響が大きいかもしれないです。&lt;br /&gt;MochiKit や dojo (dojo.Deferred) もそうですが、&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 5px; margin-left: 20px; border-left: 5px solid #ccc; padding-left: 5px;"&gt;「JavaScript の高速化とは、単純に速度だけを目指すのではなく&lt;br /&gt;UI スレッドの最短ブロック時間のほうが重要。」&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;つまり、無理と高速にしたせいでその処理間、&lt;br /&gt;たとえ一瞬でもカクカクとなるようではイカんでしょという感じでしょうか。&lt;br /&gt;&lt;br /&gt;PotLite.js の非同期イテレータは、&lt;br /&gt;適度に使い分けることで UI スレッドを独占するような処理の&lt;br /&gt;負荷分散的なツールとして使えると思います。&lt;br /&gt;&lt;br /&gt;まだまだ改善の余地はあるのですが、&lt;br /&gt;とりあえず安定して動くかたちになったので&lt;br /&gt;ここで記事も書いておこうと思ったしだいです。&lt;br /&gt;(というか最近ぜんぜんブログ書いてなかった…)&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-example"&gt;サンプルコード&lt;/h2&gt;サンプル的なコードを書いてみます。&lt;br /&gt;ぜんっぜんいい感じの例が思いつかなくて苦しんでるのですが、&lt;br /&gt;サンプルコード書く専用のプログラマがいてもいいんじゃないかしら。。&lt;br /&gt;&lt;br /&gt;Pot.Deferred を使って非同期処理を直列化する例です。&lt;br /&gt;&lt;br /&gt;まず、Deferred を使わないで書いた場合、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var elem = document.getElementById('output');&lt;br /&gt;&lt;br /&gt;// 5 秒後に foo を出力&lt;br /&gt;setTimeout(function() {&lt;br /&gt;    elem.value = 'foo';&lt;br /&gt;    // さらに 4 秒後に bar を付け足す&lt;br /&gt;    setTimeout(function() {&lt;br /&gt;        elem.value += 'bar';&lt;br /&gt;        // そしてさらに 3 秒後に baz を付ける&lt;br /&gt;        setTimeout(function() {&lt;br /&gt;            elem.value += 'baz';&lt;br /&gt;        }, 3000);&lt;br /&gt;    }, 4000);&lt;br /&gt;}, 5000);&lt;br /&gt;&lt;/pre&gt;上の例は、ネストがどんどん深くなってしまっています。&lt;br /&gt;これを Deferred (Pot.Deferred) を使って書くと、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;var elem = document.getElementById('output');&lt;br /&gt;&lt;br /&gt;wait(5).then(function() {&lt;br /&gt;    elem.value = 'foo';&lt;br /&gt;}).wait(4).then(function() {&lt;br /&gt;    elem.value += 'bar';&lt;br /&gt;}).wait(3).then(function() {&lt;br /&gt;    elem.value += 'baz';&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;このように書くことができます。&lt;br /&gt;非同期処理を直列的に書けます。&lt;br /&gt;&lt;br /&gt;本当はもっと複雑なことに向いてる気もするのですが、&lt;br /&gt;例が思いつかない。。困りました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;というわけで、 PotLite.js でした!&lt;br /&gt;&lt;br /&gt;&lt;div style="border:3px solid #5566ff;margin:10px;padding:6px;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"&gt;&lt;h3 style="color:#5566ff;"&gt;続き!&lt;/h3&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/11/javascript.html" title="フリーズやカクカクしない安定した動作のアプリやアドオン、ゲームなどが作れるJavaScriptライブラリ | 圧縮電子精神音楽浮遊構造体"&gt;PotLite.js で実装されてるイテレータについて、&lt;br /&gt;CPU 使用率などを for 文と jQuery.each とで比較した結果&lt;/a&gt; を書きました。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/Pot.js" title="polygonplanet/Pot.js - GitHub"&gt;polygonplanet/Pot.js - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-6478185227937367151?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/6478185227937367151/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/10/javascriptdeferred.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/6478185227937367151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/6478185227937367151'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/10/javascriptdeferred.html' title='JavaScriptでDeferredとイテレータの非同期処理用ライブラリ作ってみた'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2422739422263404014</id><published>2011-08-10T07:40:00.000+09:00</published><updated>2011-08-10T07:40:32.226+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='リブログ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tumblrでリブログ時にタグの継承を可能にするTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;&lt;p&gt;Tumblr でリブログ時に、付けられたタグも一緒にポストできるようになっています。&lt;br /&gt;いつの間にかはわかりませんが、&lt;br /&gt;とりあえず Tombloo でも同じになるようパッチ作りました。&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Tumblr でリブログ時にタグも継承する&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.extractor.tumblr.reblog.tags.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.extractor.tumblr.reblog.tags.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;できない場合は&lt;br /&gt;「&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;Tomblooパッチのインストールに失敗しなくなるパッチ&lt;/a&gt;」 のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo" title="polygonplanet/tombloo - GitHub"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-2422739422263404014?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/2422739422263404014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/tumblrtombloo.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2422739422263404014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2422739422263404014'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/tumblrtombloo.html' title='Tumblrでリブログ時にタグの継承を可能にするTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-3454790221421971382</id><published>2011-08-06T05:11:00.000+09:00</published><updated>2011-08-06T05:11:03.116+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>「アカウントの切り替え」ダイアログを内容サイズに合わせてリサイズするTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;&lt;p&gt;Tombloo のメニュー 「&lt;b&gt;アカウントの切り替え&lt;/b&gt;」 ダイアログのサイズを調節します。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;デフォルトの状態ではダイアログのサイズが小さくスクロールがめんどいので大きくするだけです。&lt;br /&gt;ついでにリストボックスに表示されるユーザー名をソートします。&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.actions.changeacount.resize.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.actions.changeacount.resize.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;できない場合は&lt;br /&gt;「&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;Tomblooパッチのインストールに失敗しなくなるパッチ&lt;/a&gt;」 のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo" title="polygonplanet/tombloo - GitHub"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-3454790221421971382?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/3454790221421971382/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/tombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3454790221421971382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3454790221421971382'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/tombloo.html' title='「アカウントの切り替え」ダイアログを内容サイズに合わせてリサイズするTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-7308243553772463536</id><published>2011-08-06T04:58:00.000+09:00</published><updated>2011-08-06T05:25:48.324+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Google+'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Google+ストリーム上の画像を原寸大でポストできるTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 38px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;機能概要&lt;/h2&gt;&lt;p&gt;Google+ 用の extractor です。&lt;br /&gt;Google+ のストリーム上の画像を原寸大でポスト (extract) 可能にします。&lt;br /&gt;&lt;/p&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-LRNEheSjZic/TjxInOPCkvI/AAAAAAAAEbk/aDQEBjfMwYw/s1600/tombloo-googleplus-extractor-contextmenu.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-LRNEheSjZic/TjxInOPCkvI/AAAAAAAAEbk/aDQEBjfMwYw/s1600/tombloo-googleplus-extractor-contextmenu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;画像の上でコンテキストメニューを開くと Share に 「&lt;b&gt;Photo - Google+&lt;/b&gt;」 が出現します。&lt;br /&gt;いまのところ画像のみ扱えます。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;あらゆる画像が扱えるとは限りません。&lt;br /&gt;リンク画像の場合、リンク先がアクセス制限してる場合など失敗します。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;利用については Google+ のポリシー通りです。&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.extractor.googleplus.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.extractor.googleplus.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-7308243553772463536?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/7308243553772463536/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/googletombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/7308243553772463536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/7308243553772463536'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/googletombloo.html' title='Google+ストリーム上の画像を原寸大でポストできるTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LRNEheSjZic/TjxInOPCkvI/AAAAAAAAEbk/aDQEBjfMwYw/s72-c/tombloo-googleplus-extractor-contextmenu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-1462353483161708389</id><published>2011-08-05T01:49:00.000+09:00</published><updated>2011-08-05T01:49:46.665+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='短縮URL'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>ページやリンクの短縮URLをクリップボードにコピーできるTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;&lt;p&gt;現在のページ URL やリンクの短縮 URL をクリップボードにコピーします。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;bit.ly や j.mp など対象のサービスが選べます。&lt;br /&gt;また、シンプルなダイアログ上で短縮 URL を展開する機能もあります。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;このパッチは、azu さんの「&lt;a href="http://efcl.info/2009/0831/res1276/" title="今見てるサイトの短縮URLをクリップボードにコピーするTomblooパッチ | Web scratch"&gt;今見てるサイトの短縮URLをクリップボードにコピーするTomblooパッチ | Web scratch&lt;/a&gt;」&lt;br /&gt;を元に作られています。&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;現在のページの短縮 URL をクリップボードにコピーする&lt;/li&gt;&lt;li&gt;フォーカスリンクの短縮 URL をクリップボードにコピーする&lt;/li&gt;&lt;li&gt;bit.ly や j.mp など使用する URL 短縮サービスが選べる&lt;/li&gt;&lt;li&gt;ダイアログ上で任意の短縮 URL を展開する機能&lt;/li&gt;&lt;li&gt;goo.gl モデルを実装&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://2.bp.blogspot.com/-O-rmpIAwLrM/Tjq7C8a3CAI/AAAAAAAAEbg/QvnShzTYfHo/s1600/tombloo-short-url-contextmenu.png" imageanchor="1"&gt;&lt;img border="0" height="310" src="http://2.bp.blogspot.com/-O-rmpIAwLrM/Tjq7C8a3CAI/AAAAAAAAEbg/QvnShzTYfHo/s640/tombloo-short-url-contextmenu.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;上の画像はリンクの上でコンテキストメニューを表示した状態です。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.actions.urlshortener.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.actions.urlshortener.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-1462353483161708389?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/1462353483161708389/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/urltombloo.html#comment-form' title='3 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/1462353483161708389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/1462353483161708389'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/urltombloo.html' title='ページやリンクの短縮URLをクリップボードにコピーできるTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-O-rmpIAwLrM/Tjq7C8a3CAI/AAAAAAAAEbg/QvnShzTYfHo/s72-c/tombloo-short-url-contextmenu.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-6021807503855886302</id><published>2011-08-04T23:00:00.000+09:00</published><updated>2011-08-04T23:00:44.694+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Google+'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tombloo.Google+サークル指定可パッチのアップデートについて解説</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;こないだの Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチ、&lt;br /&gt;「&lt;a href="http://polygon-planet.blogspot.com/2011/07/googletombloo_17.html" title="Google+で指定のサークルにポストできるようにするTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;Google+で指定のサークルにポストできるようにするTomblooパッチ&lt;/a&gt;」 のアップデートについてです。&lt;br /&gt;&lt;br /&gt;UI を拡張したら分かり難くなってしまったのでここで解説します。&lt;br /&gt;&lt;br /&gt;なお、このパッチをインストールしてない場合は上の元の記事を参照ください。&lt;br /&gt;使用するにあたって、&lt;a href="https://github.com/YungSang/Scripts-for-Tombloo/raw/master/model.gplus.js" title="YungSang/Scripts-for-Tombloo - GitHub - /raw/master/model.gplus.js"&gt;YungSang さん製の Google+ モデル&lt;/a&gt; のインストールが必要です。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.model.googleplus.circle.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.model.googleplus.circle.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最新のバージョン 1.10 (2011-08-04 現在) では、&lt;br /&gt;画像のポストを 「&lt;b&gt;引用&lt;/b&gt;」 か 「&lt;b&gt;アップロード&lt;/b&gt;」 で切り替えることができます。&lt;br /&gt;&lt;br /&gt;「&lt;b&gt;引用&lt;/b&gt;」 は Web から 「リンクを追加」 で画像を含む場合を模しています。&lt;br /&gt;GooglePhotos (Picasa) にアップロードしないで文章も含めて引用ポストできます。&lt;br /&gt;Tombloo での 「Quote」 とは違います。 Quote は通常、画像を含めません。&lt;br /&gt;引用の画像サイズは若干小さめで表示されます。&lt;br /&gt;&lt;br /&gt;「&lt;b&gt;アップロード&lt;/b&gt;」 は GooglePhotos (Picasa) にアップロードします。&lt;br /&gt;Web からの 「写真を追加」 と同じ動作になります。&lt;br /&gt;画像は大きめの表示になります。&lt;br /&gt;そのかわり引用文は含めることができません、コメントのみ追加できます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-quote"&gt;引用:&lt;/h2&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://1.bp.blogspot.com/-v7cmA3MzSv4/TjqIjHZiIGI/AAAAAAAAEbU/H5p_CbFQ9z4/s1600/tombloo-googleplus-patch-update-quote-01.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-v7cmA3MzSv4/TjqIjHZiIGI/AAAAAAAAEbU/H5p_CbFQ9z4/s1600/tombloo-googleplus-patch-update-quote-01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Photo&lt;/b&gt; で引用したい画像を Share から選択しクイックポストフォームを開きます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://2.bp.blogspot.com/-Ck1KeXGBdZs/TjqIjaJLm2I/AAAAAAAAEbY/gnmqLmYgDkA/s1600/tombloo-googleplus-patch-update-quote-02.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Ck1KeXGBdZs/TjqIjaJLm2I/AAAAAAAAEbY/gnmqLmYgDkA/s1600/tombloo-googleplus-patch-update-quote-02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;任意の Google+ サークル/一般 アイコンを ON にすると、&lt;br /&gt;「&lt;b&gt;画像を GooglePhotos(Picasa) にアップロード&lt;/b&gt;」 というチェックボックスが現れます。&lt;br /&gt;&lt;br /&gt;このままポストすると「アップロード」 になります。&lt;br /&gt;チェックを外すと、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://4.bp.blogspot.com/-4yqI20htiLw/TjqIj6AulsI/AAAAAAAAEbc/Kg1UaLD9D8o/s1600/tombloo-googleplus-patch-update-quote-03.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-4yqI20htiLw/TjqIj6AulsI/AAAAAAAAEbc/Kg1UaLD9D8o/s1600/tombloo-googleplus-patch-update-quote-03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;空の状態に表示されるテキストが「&lt;b&gt;Quote Text (Google+)&lt;/b&gt;」 という入力フィールドがでてきます。&lt;br /&gt;この入力フィールドが 「引用」 するための文章を扱うフィールドです。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://1.bp.blogspot.com/-QXSUu4MS3P4/TjqIgxMCCdI/AAAAAAAAEa4/Np4XVgSQ1-s/s1600/tombloo-googleplus-patch-update-quote-04.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-QXSUu4MS3P4/TjqIgxMCCdI/AAAAAAAAEa4/Np4XVgSQ1-s/s1600/tombloo-googleplus-patch-update-quote-04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ページ内でテキストを選択すると、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://3.bp.blogspot.com/-nBg13pm_hRk/TjqIhDvLDZI/AAAAAAAAEa8/u_Vr8UYwzfE/s1600/tombloo-googleplus-patch-update-quote-05.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-nBg13pm_hRk/TjqIhDvLDZI/AAAAAAAAEa8/u_Vr8UYwzfE/s1600/tombloo-googleplus-patch-update-quote-05.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Description ボックス、Google+ 用の Quote テキストボックスの両方に&lt;br /&gt;同じ引用文が挿入されます (同じ動作をさせています)。&lt;br /&gt;Description ボックスの入力内容は Google+ ではコメントとして扱われます。&lt;br /&gt;&lt;br /&gt;この状態で POST すると、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://2.bp.blogspot.com/-6fs6tdiGaxo/TjqIhWoQWLI/AAAAAAAAEbA/z_ZclAAHHTM/s1600/tombloo-googleplus-patch-update-quote-06.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-6fs6tdiGaxo/TjqIhWoQWLI/AAAAAAAAEbA/z_ZclAAHHTM/s1600/tombloo-googleplus-patch-update-quote-06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;上のように通常の 「リンクの追加」 と同じような結果となり表示されます。&lt;br /&gt;&lt;br /&gt;Description ボックスにもテキストがあったのに消えてる訳は、&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Description ボックスと Quote テキストボックスが同じ内容だった場合、&lt;br /&gt;Description ボックスのテキストは同一の引用文とみなし無視するようになっています。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;違う内容の場合は通常通りポストされます。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-upload"&gt;アップロード&lt;/h2&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://1.bp.blogspot.com/-rjwBksDS9jM/TjqIhzFHwXI/AAAAAAAAEbE/DemCM3DqQm0/s1600/tombloo-googleplus-patch-update-quote-07.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-rjwBksDS9jM/TjqIhzFHwXI/AAAAAAAAEbE/DemCM3DqQm0/s1600/tombloo-googleplus-patch-update-quote-07.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;チェックをした状態で POST すると GooglePhotos (Picasa) にアップロードします。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://4.bp.blogspot.com/-pR1ESDuCVDA/TjqIiPaSKhI/AAAAAAAAEbI/Cc0DBiuZxLY/s1600/tombloo-googleplus-patch-update-quote-08.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-pR1ESDuCVDA/TjqIiPaSKhI/AAAAAAAAEbI/Cc0DBiuZxLY/s1600/tombloo-googleplus-patch-update-quote-08.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ポストすると、上のように少し大きめの画像になり 「写真の追加」 と同じ結果になります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://2.bp.blogspot.com/-n1oCGqGml40/TjqIilk-6AI/AAAAAAAAEbM/NxC0Zr-BTpI/s1600/tombloo-googleplus-patch-update-quote-09.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-n1oCGqGml40/TjqIilk-6AI/AAAAAAAAEbM/NxC0Zr-BTpI/s1600/tombloo-googleplus-patch-update-quote-09.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;コメントを入れる例です。&lt;br /&gt;Description ボックスに任意のテキストを入力します。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://3.bp.blogspot.com/-EZu12cbb3cw/TjqIixj8GWI/AAAAAAAAEbQ/LSt1vuvIvWY/s1600/tombloo-googleplus-patch-update-quote-10.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-EZu12cbb3cw/TjqIixj8GWI/AAAAAAAAEbQ/LSt1vuvIvWY/s1600/tombloo-googleplus-patch-update-quote-10.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Web から入力した場合と同じく、コメントが付加されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ちなみに私は BAN されているので (2011-08-04 現在)&lt;br /&gt;なかなかデバッグなどが進まず涙目です……。&lt;br /&gt;ポストも +1 もできなかったのですが、先日突然自由になったのでコード書いてたら&lt;br /&gt;途中でまた全部禁止されて…ひどいよ…あんまりだよ……。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-6021807503855886302?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/6021807503855886302/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/tombloogoogle.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/6021807503855886302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/6021807503855886302'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/08/tombloogoogle.html' title='Tombloo.Google+サークル指定可パッチのアップデートについて解説'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-v7cmA3MzSv4/TjqIjHZiIGI/AAAAAAAAEbU/H5p_CbFQ9z4/s72-c/tombloo-googleplus-patch-update-quote-01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-1534949523285584871</id><published>2011-07-30T22:58:00.000+09:00</published><updated>2011-07-30T22:58:17.428+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pixiv'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='TINAMI'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>TINAMIの画像をオリジナルサイズでサムネイルからでもポストできるTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要とか機能&lt;/h2&gt;例の &lt;a href="http://www.pixiv.net/" title="[pixiv]"&gt;pixiv&lt;/a&gt; の件があって早速 &lt;a href="http://www.tinami.com/" title="TINAMI - Navigator of Manga Artists -"&gt;TINAMI&lt;/a&gt; でも同じようなことできたらいいんじゃないかしらと思って&lt;br /&gt;とりあえずパッチは一通り動くようになって、&lt;br /&gt;TINAMI リニューアルのほうも落ち着いてきたようなので記事にしてみた次第です。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://2.bp.blogspot.com/-nXxqkwlltE8/TjQNFhtTZKI/AAAAAAAAEWw/ihfFnD28PK4/s1600/tombloo-tinami-contextmenu.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-nXxqkwlltE8/TjQNFhtTZKI/AAAAAAAAEWw/ihfFnD28PK4/s1600/tombloo-tinami-contextmenu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;TINAMI の画像 (イラスト/漫画/モデル/コスプレ) をオリジナルサイズでポストできるパッチです。&lt;br /&gt;検索ページなどのサムネイルからもポストできます。&lt;br /&gt;&lt;br /&gt;ポストと同時に 「クリエイターをお気に入りに追加」 する model、&lt;br /&gt;「作品をコレクションに追加」 する model も入ってます。&lt;br /&gt;model は 「Tomblooの設定」 ダイアログメニューから有効にできます。&lt;br /&gt;&lt;br /&gt;また、作品に付けられたタグを抽出してポスト時のタグ入力欄に自動で加えます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/04/pixivposttombloo.html" title="pixivからブックマークと同時にPOSTできるTomblooパッチがサムネイル対応 | 圧縮電子精神音楽浮遊構造体"&gt;pixiv のパッチ&lt;/a&gt; と同じようなものだと思ってください。&lt;br /&gt;それより機能は若干少ないです。&lt;br /&gt;&lt;br /&gt;まだサーバーのほうが時間帯によって不安定ぽくて 403 や 500 になることがあります。&lt;br /&gt;そういう時は殆ど取得に成功しないので負荷軽減のためにも時間をおいてみてください。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.tinami.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.service.tinami.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-1534949523285584871?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/1534949523285584871/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/tinamitombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/1534949523285584871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/1534949523285584871'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/tinamitombloo.html' title='TINAMIの画像をオリジナルサイズでサムネイルからでもポストできるTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-nXxqkwlltE8/TjQNFhtTZKI/AAAAAAAAEWw/ihfFnD28PK4/s72-c/tombloo-tinami-contextmenu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2845312562076790092</id><published>2011-07-29T10:26:00.000+09:00</published><updated>2011-07-29T10:26:44.743+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='アップデート'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>インストールされてる全てのパッチを一括でアップデートできるTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;Tombloo にインストールされている数々のパッチの&lt;br /&gt;アップデート状況を調べて更新という作業がめんどくさいので、&lt;br /&gt;ボタン一発でできないかと作ってみたパッチです。&lt;br /&gt;&lt;br /&gt;更新するために最初は &lt;b&gt;raw&lt;/b&gt; リンクの URL を登録する必要がありますが、 &lt;br /&gt;それが済めば、ボタン押すだけで すべてのパッチのアップデートを一括で済ませられます。&lt;br /&gt;&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.extension.update.patches.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.extension.update.patches.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;インストールされているすべてのパッチを一括でアップデートできる&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://1.bp.blogspot.com/-51_jrdD4DkE/TjH-01s_GcI/AAAAAAAAEWk/T5Pdc9fjrk4/s1600/tombloo-update-patches-contextmenu.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-51_jrdD4DkE/TjH-01s_GcI/AAAAAAAAEWk/T5Pdc9fjrk4/s1600/tombloo-update-patches-contextmenu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;インストールすると、上のようにコンテキストメニュー内に&lt;br /&gt;「&lt;b&gt;パッチの一括アップデート&lt;/b&gt;」 というメニューが出現します。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://3.bp.blogspot.com/-RrXilzEX3NI/TjH77xsnGNI/AAAAAAAAEWg/MC0iWxJ-qxg/s1600/tombloo-update-patches-dialog-edit-updateurl.png" imageanchor="1"&gt;&lt;img border="0" height="635" src="http://3.bp.blogspot.com/-RrXilzEX3NI/TjH77xsnGNI/AAAAAAAAEWg/MC0iWxJ-qxg/s640/tombloo-update-patches-dialog-edit-updateurl.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;メニューを実行すると上のようなダイアログが表示されます。&lt;br /&gt;&lt;br /&gt;インストールされているパッチがリストボックス内に収められます。&lt;br /&gt;一括アップデートするために、&lt;br /&gt;各パッチの 「&lt;b&gt;インストールした URL (raw)&lt;/b&gt;」 を設定します。&lt;br /&gt;入力ボックスは、ダブルクリックもしくは F2、Enter などでトグル表示されます。&lt;br /&gt;ほとんどは GitHub の raw リンクになると思います。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://2.bp.blogspot.com/-gxOLIQxOsH0/TjH_BK3wpEI/AAAAAAAAEWo/CdsKoSn_-BY/s1600/tombloo-update-patches-dialog-check-listbox.png" imageanchor="1"&gt;&lt;img border="0" height="636" src="http://2.bp.blogspot.com/-gxOLIQxOsH0/TjH_BK3wpEI/AAAAAAAAEWo/CdsKoSn_-BY/s640/tombloo-update-patches-dialog-check-listbox.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;「更新を確認」 ボタンを押すと、&lt;br /&gt;各パッチがアップデートできるかどうかチェックされます。&lt;br /&gt;&lt;br /&gt;このパッチはコメントのメタ情報を最優先に見ています。&lt;br /&gt;@ (アットマーク) に続いたキーワード、&lt;br /&gt;「&lt;b&gt;@updateURL&lt;/b&gt;」 をスペースで区切った URL が使われます。&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;/**&lt;br /&gt; * なにかするパッチ&lt;br /&gt; *&lt;br /&gt; * @version    1.0.0&lt;br /&gt; * @updateURL  http://www.example.com/hoge.js&lt;br /&gt; */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上のようなコメントが記述されていると、&lt;br /&gt; &lt;b&gt;@updateURL&lt;/b&gt; が取得でき、&lt;br /&gt; さらに &lt;b&gt;@version&lt;/b&gt; で バージョン情報も得られるため、アップデート処理はより確実になります。&lt;br /&gt;&lt;br /&gt;この情報が得られない場合、サイズや文字列の diff により判断されますが&lt;br /&gt;間違いなく新しいバージョンとは限らないので確認しながらアップデートすることを推奨します。&lt;br /&gt;&lt;br /&gt;※ @updateURL は Fiefox アドオン Scriptish (Greasemonkey) に準拠&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://4.bp.blogspot.com/-fqxZWOIIExg/TjH_KKqhCAI/AAAAAAAAEWs/xljyRc13VOQ/s1600/tombloo-update-patches-dialog-update-completed.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-fqxZWOIIExg/TjH_KKqhCAI/AAAAAAAAEWs/xljyRc13VOQ/s1600/tombloo-update-patches-dialog-update-completed.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;アップデートが成功すると通知メッセージが表示されます。&lt;br /&gt;&lt;br /&gt;&lt;p&gt;存在するすべての Tombloo パッチを網羅してるわけではないので、&lt;br /&gt;どのような処理がされてるか、パッチ内で何かコンフリクトが起こるべき特殊な処理をしてる場合、&lt;br /&gt;成功しない可能性があります。&lt;br /&gt;そのようなパッチの場合は (今のところ) 手動でアップデートすることになります。&lt;br /&gt;そうそうないと思いますが…。&lt;br /&gt;&lt;/p&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-2845312562076790092?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/2845312562076790092/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/tombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2845312562076790092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/2845312562076790092'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/tombloo.html' title='インストールされてる全てのパッチを一括でアップデートできるTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-51_jrdD4DkE/TjH-01s_GcI/AAAAAAAAEWk/T5Pdc9fjrk4/s72-c/tombloo-update-patches-contextmenu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-5113849487217248114</id><published>2011-07-17T15:00:00.001+09:00</published><updated>2011-08-04T23:20:47.722+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Google+'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='SNS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Google+で指定のサークルにポストできるようにするTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/YungSang/Scripts-for-Tombloo" title="YungSang/Scripts-for-Tombloo - GitHub"&gt;YungSang さん製の Google+ モデル&lt;/a&gt; を使って&lt;br /&gt;Google+ で指定のサークルにポストできるようにするパッチです。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;※ このパッチは &lt;a href="https://github.com/YungSang/Scripts-for-Tombloo" title="YungSang/Scripts-for-Tombloo - GitHub"&gt;YungSang さんの Google+ モデル&lt;/a&gt; が必要です。&lt;br /&gt;あらかじめインストールしてご利用ください&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://1.bp.blogspot.com/-FfgdqeKkqvY/TiJ5KuOjP-I/AAAAAAAAEII/SSXb7-kFgdU/s1600/tombloo-googleplus-dialog.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-FfgdqeKkqvY/TiJ5KuOjP-I/AAAAAAAAEII/SSXb7-kFgdU/s1600/tombloo-googleplus-dialog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download or Update):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.model.googleplus.circle.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.model.googleplus.circle.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール/アップデート:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Google+ で指定のサークルにポストできるようにする&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div id="pot-polygonplanet-blog-update-info" style="border: 2px solid #99aaff; border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; padding: 8px; margin: 10px;"&gt; &lt;h2 style="margin: 5px; color: #6677ff;"&gt;続き&lt;span style="font-weight: normal;"&gt;(追記)&lt;/span&gt;:&lt;/h2&gt; &lt;p&gt; ↓アップデートに関する記事です。&lt;br /&gt; &lt;a href="http://polygon-planet.blogspot.com/2011/08/tombloogoogle.html" title="Tombloo.Google+サークル指定可パッチのアップデートについて解説 | 圧縮電子精神音楽浮遊構造体" style="font-weight: bold;"&gt;Tombloo.Google+サークル指定可パッチのアップデートについて解説&lt;/a&gt;&lt;br /&gt; &lt;/p&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-5113849487217248114?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/5113849487217248114/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/googletombloo_17.html#comment-form' title='5 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/5113849487217248114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/5113849487217248114'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/googletombloo_17.html' title='Google+で指定のサークルにポストできるようにするTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-FfgdqeKkqvY/TiJ5KuOjP-I/AAAAAAAAEII/SSXb7-kFgdU/s72-c/tombloo-googleplus-dialog.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-723741023095339674</id><published>2011-07-14T16:21:00.000+09:00</published><updated>2011-07-14T16:21:21.216+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='リブログ'/><category scheme='http://www.blogger.com/atom/ns#' term='リーダー'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Feed'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Googleリーダーにポストしたサイトのフィードを登録するTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Home - tombloo - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;&lt;p&gt;ポスト時にサイトの Feed があれば Google リーダーに登録します。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Firefox からフィードを取得することもできるのですが、&lt;br /&gt;(window.content.getBrowser().mCurrentBrowser.feeds に配列で入ってる)&lt;br /&gt;Google リーダーの QuickAdd に閲覧してるページの URL (例えば拡張子 .html のページ)&lt;br /&gt;を渡すと、解析して適切なフィードを選択、登録してくれるので&lt;br /&gt;その方法にしました。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://4.bp.blogspot.com/-PpulIaP_Wdk/Th6YD02fmYI/AAAAAAAAEG0/3DVKYWItVWE/s1600/tombloo-googlereader-dialog.png" imageanchor="1"&gt;&lt;img border="0" height="411" src="http://4.bp.blogspot.com/-PpulIaP_Wdk/Th6YD02fmYI/AAAAAAAAEG0/3DVKYWItVWE/s640/tombloo-googlereader-dialog.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.model.googlereader.quickadd.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.model.googlereader.quickadd.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;ポスト時にサイトの Feed があれば Google リーダーに登録する&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;リブログ時には注意してください。&lt;br /&gt;Quote, Photo などを常に ON にしておくと大変なことになります (私がなりました)。&lt;br /&gt;&lt;br /&gt;なので今は Bookmark のみ ON にして使い分けています。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-723741023095339674?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/723741023095339674/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/googletombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/723741023095339674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/723741023095339674'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/googletombloo.html' title='Googleリーダーにポストしたサイトのフィードを登録するTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-PpulIaP_Wdk/Th6YD02fmYI/AAAAAAAAEG0/3DVKYWItVWE/s72-c/tombloo-googlereader-dialog.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-3843401712552842148</id><published>2011-07-05T12:44:00.000+09:00</published><updated>2011-07-05T12:44:54.229+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='Bookmark'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>「Audio」と「Bookmark」を追加するTomblooパッチのアップデートについて</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image,body div.pot-separator-image-full {  display: block; margin: 10px; padding: 0pt; text-align: left;}body div.pot-separator-image a,body div.pot-separator-image-full a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img,body div.pot-separator-image-full a img {  border: 2px solid #999;border-radius:3px;  -moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify,body div.pot-separator-image-full a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait,body div.pot-separator-image-full a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image-full {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image-full a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;こないだの Firefox アドオン Tombloo のパッチ&lt;br /&gt;『&lt;a href="http://polygon-planet.blogspot.com/2011/06/audiobookmarktombloo.html" title="「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ&lt;/a&gt;』 の続きです。&lt;br /&gt;&lt;br /&gt;「最新のアップデート確認」 というメニューがありながら、&lt;br /&gt;これまでのバージョンは殆ど壊れててアップデートできません。&lt;br /&gt;たぶん、メニュークリックしても何もでない、もしくは&lt;br /&gt;プログレスバーだけでて「アップデートしますか？」というダイアログは出ないで消える。&lt;br /&gt;そんな状態だと思います。&lt;br /&gt;もしかしたら ブラウザ起動時にダイアログが出て成功してるかもしれませんが…。&lt;br /&gt;&lt;br /&gt;自動アップデート機能が動いてないので、&lt;br /&gt;バージョンアップされないまま使ってる場合は再度インストールしてアップデートをお願いします。&lt;br /&gt;単にリンクを右クリックから 「パッチのインストール」 で上書きすれば完了します。&lt;br /&gt;&lt;div style="border:2px solid #ff6666; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; padding: 8px; padding-top: 2px; margin: 5px;margin-top:15px;"&gt;&lt;h2 id="pot-polygonplanet-blog-notice" style="color: #ff6666; font-size: 16px; margin: 5px; padding: 2px;"&gt;注意:&lt;/h2&gt;はじめてインストールする場合は、&lt;br /&gt;元の記事 『&lt;a style="font-weight:bold" href="http://polygon-planet.blogspot.com/2011/06/audiobookmarktombloo.html" title="「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ&lt;/a&gt;』 &lt;br /&gt;を参照ください。重要な注意点が記述してあります。&lt;br /&gt;どちらのインストールリンクも同じものです。&lt;br /&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.poster.bookmark.pot.assort.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.poster.bookmark.pot.assort.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;追加された主な機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;各ブックマークサービスのエントリー数(被ブックマーク数)の表示機能&lt;/li&gt;&lt;li&gt;アップデート機能の修正&lt;/li&gt;&lt;li&gt;コンテキストメニューのアイコンをブックマーク済みならカラーに彩色&lt;/li&gt;&lt;li&gt;スクリプト全体のループ処理を大幅に最適化(CPU使用率など)&lt;/li&gt;&lt;li&gt;「ローマ字入力変換キー設定」を追加&lt;/li&gt;&lt;li&gt;置換したファイルなどが把握できるよう「Bookmarkパッチについて」メニューを追加&lt;/li&gt;&lt;li&gt;livedoorクリップを少しだけBookmarkに合わせて実装&lt;/li&gt;&lt;li&gt;クロスポスト用に Twitter, FriendFeed, はてなダイアリー, Clipp 等を統合&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;大まかにこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="font-size:larger;"&gt;各ブックマークサービスのエントリー数(被ブックマーク数)の表示機能&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image-full"&gt;&lt;a href="http://2.bp.blogspot.com/-tIlGEsNQ8z4/ThJ-_l1h3hI/AAAAAAAAEAU/LoqBUeu5fvs/s1600/tombloo-bookmark-audio-patches-sbm-entry-counts.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-tIlGEsNQ8z4/ThJ-_l1h3hI/AAAAAAAAEAU/LoqBUeu5fvs/s1600/tombloo-bookmark-audio-patches-sbm-entry-counts.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;上の画像のダイアログ上部にある &lt;b style="background: none repeat scroll 0% 0% rgb(255, 238, 238); color: #ff5555; text-decoration: underline; font-size: smaller;"&gt;166 users&lt;/b&gt; などのユーザー数のことです。&lt;br /&gt;今のところ、&lt;br /&gt;「はてなブックマーク」「Twitter」「Delicious」「livedoorクリップ」「Yahoo!ブックマーク」&lt;br /&gt;が表示されます。&lt;br /&gt;クリックすると、そのエントリーページ (コメントが閲覧できるページ) を新しいタブで開きます。&lt;br /&gt;ユーザー数が 0 の場合は表示されないものもあります (「0 users」と表示されるサービスもあります)。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="font-size:larger;"&gt;コンテキストメニューのアイコンをブックマーク済みならカラーに彩色&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-0Tch7_I2bvo/ThJ_JGGoLUI/AAAAAAAAEAY/oP8yn7AIfXY/s1600/tombloo-bookmark-audio-patches-sbm-contextmenu-bookmarked.png" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-0Tch7_I2bvo/ThJ_JGGoLUI/AAAAAAAAEAY/oP8yn7AIfXY/s1600/tombloo-bookmark-audio-patches-sbm-contextmenu-bookmarked.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;これは過去のバージョンでもアイコンが一応変化してたのですが、&lt;br /&gt;メニューの表示速度とブックマークしてるかどうかを取得する通信/処理速度が間に合わず&lt;br /&gt;ゴチャゴチャなことになっていたので、&lt;br /&gt;メニュー表示中に非同期でブックマーク済みかどうかを取得し、&lt;br /&gt;動的にメニューのアイコンを切り替えるよう変更しました。&lt;br /&gt;ラグの大きいサービスでもおそらく違和感なく利用できると思います。&lt;br /&gt;&lt;br /&gt;現在表示してるページで、カラーの時がブックマーク済み。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-XOaqwHWDT5c/ThJ_TBSMAII/AAAAAAAAEAc/8RjccTZt0tc/s1600/tombloo-bookmark-audio-patches-sbm-contextmenu-not-bookmarked.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-XOaqwHWDT5c/ThJ_TBSMAII/AAAAAAAAEAc/8RjccTZt0tc/s1600/tombloo-bookmark-audio-patches-sbm-contextmenu-not-bookmarked.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;グレーの時は、まだブックマークしてない。という表現です。&lt;br /&gt;&lt;br /&gt;でもたぶん、クイックポストフォームのほうに &lt;b style="color: #e8e856; font-weight: bolder;  text-shadow: 1px 1px 1px #666"&gt;★&lt;/b&gt; マークでるから活用されないと思う。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="font-size:larger;"&gt;「ローマ字入力変換キー設定」を追加&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;これはタグ入力補完時の漢字のローマ字変換キーを定義します。&lt;br /&gt;例えば、デフォルトは 「&lt;strong style="color:#5e449e;"&gt;じ&lt;/strong&gt;」 の変換が 「&lt;strong style="color:#5e449e;"&gt;zi&lt;/strong&gt;」 になっているのを、 「&lt;strong style="color:#5e449e;"&gt;ji&lt;/strong&gt;」 に置き換えるなど&lt;br /&gt;使い慣れたキーボードマップに置き換えることができます。&lt;br /&gt;&lt;br /&gt;メニューから「ローマ字入力変換キー設定」ダイアログを開くと&lt;br /&gt;デフォルトのキーが入力されているので、それを必要に応じて置換してください。&lt;br /&gt;&lt;br /&gt;&lt;b style="font-size:larger;"&gt;その他&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;あとは内部的な処理の改善やバグ修正などが殆どです。&lt;br /&gt;ループ処理に関しては、速度が必要なロジック以外は&lt;br /&gt;CPU を喰わないようゆっくり実行しています (体感では気づかない程度のゆっくりです)。&lt;br /&gt;&lt;br /&gt;ほか、なにかバグや要望などありましたらコメントやメール、または &lt;a href="http://twitter.com/polygon_planet"&gt;@polygon_planet&lt;/a&gt; に伝えていただけると嬉しいです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-3843401712552842148?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/3843401712552842148/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/audiobookmarktombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3843401712552842148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3843401712552842148'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/audiobookmarktombloo.html' title='「Audio」と「Bookmark」を追加するTomblooパッチのアップデートについて'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-tIlGEsNQ8z4/ThJ-_l1h3hI/AAAAAAAAEAU/LoqBUeu5fvs/s72-c/tombloo-bookmark-audio-patches-sbm-entry-counts.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-3235183433862089282</id><published>2011-07-02T17:32:00.000+09:00</published><updated>2011-07-02T17:32:50.025+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Evernote'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Evernoteのログイン切れてたら自動で再ログインするTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン Tombloo のパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;Evernote は 1 週間ほどでログインセッションがきれてしまい、&lt;br /&gt;その度ログインしなおし、というめんどうな作業を自動化し&lt;br /&gt;セッション切れを感知して勝手に再ログインするパッチです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;ログインセッションきれてたら再ログインする&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.model.evernote.relogin.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.model.evernote.relogin.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-3235183433862089282?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/3235183433862089282/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/evernotetombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3235183433862089282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3235183433862089282'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/07/evernotetombloo.html' title='Evernoteのログイン切れてたら自動で再ログインするTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-8139090579361250334</id><published>2011-06-19T17:52:00.002+09:00</published><updated>2011-07-05T13:03:43.499+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='リブログ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='アルゴリズム'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='Bookmark'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;body div.pot-overlay-content {  line-height: 1.4;}.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-overlay-content div.pot-separator-image {  padding-left: 0 !important;  padding-right: 0;  margin-left: 0 !important;  margin-right: 0;}body div.pot-overlay-content div.pot-separator-image a {margin-left: 0; margin-right: 0;}&lt;/style&gt;&lt;script&gt;$(function() {if (0) {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });}});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content" style="line-height: 1.6;"&gt;Firefox アドオン Tombloo のパッチです。&lt;br /&gt;&lt;br /&gt;パッチといっても今回のはすごく…大きいです…。機能が多すぎて列挙しきれませんので&lt;br /&gt;簡単に言うと、Photo とか Link, Quote の他に 「&lt;strong&gt;Bookmark&lt;/strong&gt;」 と 「&lt;strong&gt;Audio&lt;/strong&gt;」 を追加するパッチです。&lt;br /&gt;Bookmark は、省略しがちなタグやコメントを入力しやすくしたもので、Audio はオマケです。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-overview"&gt;概要&lt;/h2&gt;もともとは、Google ブックマークアドオンの GMarks を使うのやめて&lt;br /&gt;Tombloo で全部統一しようと思ったのがきっかけだったと思いますが、&lt;br /&gt;細かい修正パッチを重ねてくうちに折角だからと他のサービスも手を出して&lt;br /&gt;はてブ、GoogleBookmarks、Delicious、Yahoo!Bookmark、Firefoxのブックマークなど、&lt;br /&gt;主なソーシャルブックマークサービスで殆ど同じに使えるように&lt;br /&gt;おすすめタグの出ないものはキーワード解析し表示するようにし、&lt;br /&gt;タグ名やコメントの最大文字数によるエラーが発生しないよう機能を追加したり&lt;br /&gt;結局のところ細かいところまで機能実装してるパッチの集合体みたいになってます。&lt;br /&gt;Audio は、&lt;a href="http://github.com/Constellation"&gt;Constellation&lt;/a&gt; さんが作ってる &lt;a href="https://chrome.google.com/extensions/detail/ldcnohnnlpgglecmkldelbmiokgmikno"&gt;Taberareloo&lt;/a&gt; がすでに実装してるので、&lt;br /&gt;それを元にさせていただいて Tombloo でもリブログなど可能になっています。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-LQ18H70JqRA/Tf2GMahzgmI/AAAAAAAAD7I/Uibyt9Rk5PY/s1600/tombloo-bookmark-audio-patches-dialog-posters.png" imageanchor="1"&gt;&lt;img class="large-image" border="0" height="466" src="http://3.bp.blogspot.com/-LQ18H70JqRA/Tf2GMahzgmI/AAAAAAAAD7I/Uibyt9Rk5PY/s640/tombloo-bookmark-audio-patches-dialog-posters.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;上の画像の設定ダイアログのように、「&lt;strong&gt;Audio&lt;/strong&gt;」 と 「&lt;strong&gt;Bookmark&lt;/strong&gt;」 が追加されます。&lt;br /&gt;&lt;h2 id="pot-polygonplanet-blog-operation"&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Posters に 「Bookmark」 と 「Audio」 を追加実装&lt;/li&gt;&lt;li&gt;設定ダイアログ内にチェック可能な 「Bookmark」 と 「Audio」 を追加&lt;/li&gt;&lt;li&gt;Audio のリブログと mp3, wav, ogg, mid, midi リンクからのポストを実装&lt;/li&gt;&lt;li&gt;Audio のローカル保存を実装&lt;/li&gt;&lt;li&gt;ブックマーク用の POST ダイアログを追加実装&lt;/li&gt;&lt;li&gt;はてなブックマーク、GoogleBookmarks など主なサービス対応&lt;/li&gt;&lt;li&gt;主なブックマークエラーを修正および改善&lt;/li&gt;&lt;li&gt;POST ダイアログのコンテキストメニューを拡張&lt;/li&gt;&lt;li&gt;Quote したテキストの 「HTML」 と 「PlainText」 を切り替え表示できる項目追加&lt;/li&gt;&lt;li&gt;POST ダイアログが表示されたとき画像が小さいままになる状態を修正&lt;/li&gt;&lt;li&gt;POST ダイアログが半分消えてる状態になって現れた場合のフィックス&lt;/li&gt;&lt;li&gt;タグ補完時に左右キー(←→)で補完窓を閉じられるようイベントを追加&lt;/li&gt;&lt;li&gt;POST 時にタグ名をユニークにして重複防止&lt;/li&gt;&lt;li&gt;タグ名の大文字小文字をユーザー側優先で扱うよう改善(おすすめタグなど)&lt;/li&gt;&lt;li&gt;ブックマーク時に文字数オーバーでエラーになるのを自動で調整カット&lt;/li&gt;&lt;li&gt;ブックマーク済みかどうかを明確にわかるよう改善&lt;/li&gt;&lt;li&gt;タグ付け補助用のキーワード抽出などをメニューに追加&lt;/li&gt;&lt;li&gt;パッチのバージョン確認と自動アップデート機能を実装&lt;/li&gt;&lt;li&gt;メニューからクリックするだけでパッチのアンインストールが可能&lt;/li&gt;&lt;li&gt;FirefoxBookmark などおすすめタグが無いサービスでもキーワードを表示する機能&lt;/li&gt;&lt;li&gt;タグ名補完で読みが想定外なものを本来の読みに一部修正&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;ほかにも機能や修正などありますが、内部的なことも含むので省きます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://1.bp.blogspot.com/-c0T4MjNc8pA/Tf2HEp84FXI/AAAAAAAAD7M/sf_zrLNUxkc/s1600/tombloo-bookmark-audio-patches-dialog-quickpostform.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-c0T4MjNc8pA/Tf2HEp84FXI/AAAAAAAAD7M/sf_zrLNUxkc/s1600/tombloo-bookmark-audio-patches-dialog-quickpostform.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;POST フォームはこんな感じです。&lt;br /&gt;タグ入力欄の下に表示される おすすめタグは、&lt;br /&gt;Firefoxブックマークや GoogleBookmarks でも利用できます。&lt;br /&gt;&lt;br /&gt;コンテキストメニューを拡張しています。&lt;br /&gt;上の画像では HTML タグ補助ですが、他にもたくさんあります。&lt;br /&gt;あまりに多いのでここでは説明を省きます。たぶん使ってみるとわかります。&lt;br /&gt;&lt;br /&gt;トップメニューの 2 つだけ説明すると、&lt;br /&gt;「キーワード抽出」 は、そのページ内の文章からキーワードを抽出し、&lt;br /&gt;テキスト入力欄に結果をだします。&lt;br /&gt;&lt;br /&gt;どのメニューも、その時入力されているテキストが対象の場合&lt;br /&gt;テキスト全体を置換する動きをします。&lt;br /&gt;つまりその時のテキストは失われますのでご注意ください。&lt;br /&gt;でも 「元に戻す」 が有効であれば戻ります。&lt;br /&gt;&lt;br /&gt;「マルコフ連鎖で要約」 は、入力欄のテキストもしくは 「キーワード抽出」 と同じく、&lt;br /&gt;そのページ内から文章を取得し、マルコフ連鎖というアルゴリズムで文章を要約し&lt;br /&gt;テキスト入力欄に結果を出します。&lt;br /&gt;あまり賢くはないです。&lt;br /&gt;&lt;br /&gt;この 2 つのメニューアイテムは、&lt;br /&gt;タグの他にコメントも検索対象としてるブックマークサービスがあるため、&lt;br /&gt;その目的を楽に済ますために付けました。&lt;br /&gt;でも、過度な期待はしないでください。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-ZBcL4_nuWA4/Tf2MDUHAf6I/AAAAAAAAD7Q/KiK_-H_5fGs/s1600/tombloo-bookmark-audio-patches-dialog-settings1.png" imageanchor="1"&gt;&lt;img class="large-image" border="0" height="624" src="http://4.bp.blogspot.com/-ZBcL4_nuWA4/Tf2MDUHAf6I/AAAAAAAAD7Q/KiK_-H_5fGs/s640/tombloo-bookmark-audio-patches-dialog-settings1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;設定ダイアログのポスト関連です。&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;「ショートカット - Bookmarkクイックポスト」&lt;br /&gt;&lt;dt&gt;&lt;br /&gt;&lt;dd&gt;これはインストール時に 「&lt;code&gt;CTRL + D&lt;/code&gt;」 に設定されます。&lt;br /&gt;通常のブラウザのブックマークの代わりに Tombloo Bookmark のダイアログが出ます。&lt;br /&gt;任意に変更してください (リセットする場合 エスケープキー 「&lt;code&gt;Esc&lt;/code&gt;」 です)。&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;「自動挿入するタグ」&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;ここに入力したタグは、最優先で常に送信するタグに付きます。&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;「非公開でブックマークする」&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;そのままですが、プライベートモードがサポートされてるサービス限定です。&lt;br /&gt;Delicious や YahooBookmarks は利用できます。&lt;br /&gt;チェックをつけておくと、それらのサービスでは常に非公開になります。&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;あと、いま画像見て気付きましたが…、&lt;br /&gt;「Faves」 と 「LivedoorClip」 は実装してません (Tombloo 既存の機能のみ使える)。&lt;br /&gt;需要あるようでしたら、コメントください。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-W4kSa3Dy-QI/Tf2Pvy3yrcI/AAAAAAAAD7U/Aiwn3RhRClg/s1600/tombloo-bookmark-audio-patches-dialog-settings2.png" imageanchor="1"&gt;&lt;img class="large-image" border="0" height="624" src="http://3.bp.blogspot.com/-W4kSa3Dy-QI/Tf2Pvy3yrcI/AAAAAAAAD7U/Aiwn3RhRClg/s640/tombloo-bookmark-audio-patches-dialog-settings2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;次のタブの設定ダイアログです。&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;「メディア(Photo等)をフォルダ分けして保存」&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;これにチェックを入れると、ローカル (Local) に保存する際、&lt;br /&gt;Photo (画像) を、 ホスト名別でフォルダを作り保存するようになります。&lt;br /&gt;例えばこのブログの画像をローカルにポストした場合、&lt;br /&gt;「photo」 フォルダの中に 「polygon-planet.blogspot.com」 というフォルダが作られ&lt;br /&gt;その中に画像が保存されます。&lt;br /&gt;この機能によって、一つのフォルダに大量に保存され開けなくなったなど解消されますが、&lt;br /&gt;デメリットとして、同じ画像が複数のホストにあった場合、重複画像が増えます。&lt;br /&gt;なお、「audio」 も、このチェックで作用します。&lt;br /&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-0IJXJVng42o/Tf2VO062WNI/AAAAAAAAD7Y/ptWO66CapNo/s1600/tombloo-bookmark-audio-patches-contextmenu-html-plain-switch.png" imageanchor="1"&gt;&lt;img class="large-image" border="0" src="http://4.bp.blogspot.com/-0IJXJVng42o/Tf2VO062WNI/AAAAAAAAD7Y/ptWO66CapNo/s1600/tombloo-bookmark-audio-patches-contextmenu-html-plain-switch.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Quote&lt;/strong&gt; で選択したテキスト入力欄でコンテキストメニューを開くと、&lt;br /&gt;&lt;strong&gt;「テキストと HTML を切り替え」&lt;/strong&gt; というメニューが現れます。&lt;br /&gt;この機能は、プレーンテキストと HTML を切り替えて表示します。&lt;br /&gt;&lt;br /&gt;アイコンが &lt;b&gt;&lt;span style="color: #3d85c6;"&gt;カラー&lt;/span&gt;&lt;/b&gt; の時は 「&lt;b&gt;HTML 表示中&lt;/b&gt;」 の状態。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://1.bp.blogspot.com/-dn8OGWLCi1U/Tf2We81HuoI/AAAAAAAAD7c/c3Lxe4zVUIk/s1600/tombloo-bookmark-audio-patches-contextmenu-html-plain-switch-gray.png" imageanchor="1"&gt;&lt;img class="large-image" border="0" src="http://1.bp.blogspot.com/-dn8OGWLCi1U/Tf2We81HuoI/AAAAAAAAD7c/c3Lxe4zVUIk/s1600/tombloo-bookmark-audio-patches-contextmenu-html-plain-switch-gray.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;アイコンが&lt;b&gt;&lt;span style="color: #666666;"&gt; グレー&lt;/span&gt;&lt;/b&gt; の時は 「&lt;b&gt;プレーンテキスト表示中&lt;/b&gt;」 の状態です。&lt;br /&gt;&lt;br /&gt;最終的に送信されるのは、1 文字でも編集した場合は 表示中のテキストになり、&lt;br /&gt;まったく編集してない場合は、HTML が送信されます。&lt;br /&gt;たとえ HTML 表示中にして、入力欄を空にしても&lt;br /&gt;結局は Tombloo 内部で元の HTML を保持しているので&lt;br /&gt;HTML 表示にして編集した後、&lt;br /&gt;送信するときには 未編集のプレーンテキストに切り替えてた場合、&lt;br /&gt;HTML が送信されることになります。&lt;br /&gt;&lt;br /&gt;分かり難い…。&lt;br /&gt;&lt;br /&gt;このパッチの機能 「HTML ⇔ プレーンテキスト 切り替え」 は、&lt;br /&gt;2 つのテキストボックスがあってそれを交互に表示切り替えしてるわけではなく&lt;br /&gt;単にテキスト入力欄の文字列を 2 つのデータで入れ替えてるだけです。&lt;br /&gt;&lt;br /&gt;Tombloo の Quote テキストは、&lt;br /&gt;テキストを選択して クイックポストフォーム を開いたときに&lt;br /&gt;HTML と プレーンテキスト の両方が保持されます。&lt;br /&gt;そして、送信時 (POST ボタン押下時) に入力欄のテキストが&lt;br /&gt;保持していたプレーンテキストと違えば入力欄のテキストを使い、&lt;br /&gt;同じだった場合は保持していたデータのうち、HTML が優先して使われます。&lt;br /&gt;&lt;br /&gt;たんにプレーンテキストで送信したい場合は、&lt;br /&gt;プレーンテキスト表示で改行やスペースなど 1 文字でも変えればいいわけです。&lt;br /&gt;&lt;br /&gt;今まで通りの使い方をしたい場合は、そのままポストでいいと思います。&lt;br /&gt;&lt;br /&gt;注意というかプレーンテキストの改行は自動で &amp;lt;br /&amp;gt; タグなどは付かないです。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-3BlrO1aNgLo/Tf2mGL14h6I/AAAAAAAAD7g/h-1ihxtcOc0/s1600/tombloo-bookmark-audio-patches-contextmenu-settings.png" imageanchor="1"&gt;&lt;img class="large-image" border="0" src="http://4.bp.blogspot.com/-3BlrO1aNgLo/Tf2mGL14h6I/AAAAAAAAD7g/h-1ihxtcOc0/s1600/tombloo-bookmark-audio-patches-contextmenu-settings.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;このパッチは自動でアンインストールとアップデートができます。&lt;br /&gt;&lt;br /&gt;なぜかというと、&lt;code&gt;/tombloo/chrome/content&lt;/code&gt; フォルダの中のスクリプトを置換しているからです。&lt;br /&gt;そのため、インストール時にバックアップを作り、アンインストール時に元に戻しています。&lt;br /&gt;その影響で、既にユーザーの手でソースコードが編集されてる場合や&lt;br /&gt;ファイル名が変わっていたりパスが違ったりするとインストール/アンインストール共に失敗します。&lt;br /&gt;&lt;br /&gt;置換/バックアップするファイル:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;tombloo/chrome/content/quickPostForm.xul&lt;/li&gt;&lt;li&gt;tombloo/chrome/content/prefs.xul&lt;/li&gt;&lt;li&gt;tombloo/chrome/content/completion.xml&lt;/li&gt;&lt;li&gt;tombloo/chrome/locale/ja-JP/tombloo.dtd&lt;/li&gt;&lt;li&gt;tombloo/chrome/locale/en-US/tombloo.dtd&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;インストール/アンインストール/アップデートのチェックはしましたが、 &lt;br /&gt;編集済みの環境の場合、インストールする前にバックアップをとってください。&lt;br /&gt;編集済みでなくても、できるだけバックアップしたほうがいいです。 &lt;br /&gt;&lt;br /&gt;とくに Mac 環境で テスト出来ていないので、Mac で動いた場合は報告いただけると嬉しいです。&lt;br /&gt;他にもバグや要望があればコメントまたはメールか &lt;a href="http://twitter.com/polygon_planet"&gt;@polygon_planet&lt;/a&gt; で伝えてくれるとうれしいです。&lt;br /&gt;&lt;br /&gt;そしてめずらしく長々(?)と書きましたが、そういう理由で&lt;br /&gt;あえて下のほうにインストール/ダウンロードリンクを置きました。&lt;br /&gt;このパッチは理解なしでインストールして途中で失敗すると戻せなくなる可能性があるのです。&lt;br /&gt;ここまでやるならフォークしたほうがよかったんじゃ…とか思ったけどそれにはまだまだ…。&lt;br /&gt;他にも書くことあった気がするけど忘れました…。&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid #ccc; border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; padding: 5px; margin: 5px;"&gt;&lt;strong style="color: #666;"&gt;追記&lt;/strong&gt;&lt;br /&gt;思い出しました。&lt;br /&gt;「&lt;strong&gt;HTML ⇔ PlainText 切り替え&lt;/strong&gt;」 は、HTML のテキストを可視化することで&lt;br /&gt;巧妙な方法で &lt;strong&gt;スクリプトが埋め込まれてる場合に確認&lt;/strong&gt; できるようにと付けた理由もあります。&lt;br /&gt;Tombloo は、ある程度の サニタイジングを行いますが 100% ではないのです。&lt;br /&gt;とは言っても滅多にないと思います。&lt;br /&gt;Quote したら確認程度に一度、切り替えてみるといいかもしれません。&lt;br /&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-download"&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.poster.bookmark.pot.assort.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合は下記参照)"&gt;tombloo.poster.bookmark.pot.assort.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="pot-polygonplanet-blog-install"&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;div style="border: 2px solid #6666ff; border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; padding: 5px; margin: 5px; margin-top: 10px; line-height: 1.8;"&gt;&lt;h2 style="color:#336699; padding: 2px 4px; margin: 2px 4px;"&gt;続き&lt;/h2&gt;アップデートされた機能に関する記事です。↓&lt;br /&gt;「 &lt;a href="http://polygon-planet.blogspot.com/2011/07/audiobookmarktombloo.html" title="「Audio」と「Bookmark」を追加するTomblooパッチのアップデートについて | 圧縮電子精神音楽浮遊構造体"&gt;「Audio」と「Bookmark」を追加するTomblooパッチのアップデートについて&lt;/a&gt; 」&lt;br /&gt;&lt;/div&gt;&lt;h2 id="pot-polygonplanet-blog-repository"&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo"&gt;polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-8139090579361250334?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/8139090579361250334/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/06/audiobookmarktombloo.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8139090579361250334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8139090579361250334'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/06/audiobookmarktombloo.html' title='「Audio」と「Bookmark」をポスト一覧に追加するTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-LQ18H70JqRA/Tf2GMahzgmI/AAAAAAAAD7I/Uibyt9Rk5PY/s72-c/tombloo-bookmark-audio-patches-dialog-posters.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-370697463879713298</id><published>2011-06-02T01:18:00.000+09:00</published><updated>2011-06-02T01:18:08.248+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>TwitterにPOSTするとき先頭に“見てる”を付けてタイトルを括弧で囲うTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}&lt;/style&gt;&lt;script&gt;$(function() {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content"&gt;Firefox アドオン Tombloo のパッチです。&lt;br /&gt;&lt;br /&gt;このパッチは、&lt;br /&gt;azu さんの 「&lt;a href="http://efcl.info/2009/0429/res648/" title="TomblooからTwitterにポストするときに、頭に”見てる:”と付けるパッチ | Web scratch"&gt;TomblooからTwitterにポストするときに、頭に”見てる:”と付けるパッチ | Web scratch&lt;/a&gt;」 や、&lt;br /&gt;toby さんの　「&lt;a href="http://d.hatena.ne.jp/toby/20100220/quoted_title_of_tombloo_patch_for_posting_twitter" title="Firefox拡張のTomblooからTwitterにポストするときに、タイトルにカギ括弧を付け見やすくするパッチ - 技術文化遺産復興日記"&gt;Firefox拡張のTomblooからTwitterにポストするときに、タイトルにカギ括弧を付け見やすくするパッチ - 技術文化遺産復興日記&lt;/a&gt;」 &lt;br /&gt;が元になっています。&lt;br /&gt;&lt;h2&gt;概要&lt;/h2&gt;Tombloo から ダイアログを通して (または直接) Link 等で Twitter にポストする時、&lt;br /&gt;ダイアログ内の Description に何も入力しなかったとき、&lt;br /&gt;自動で先頭に “見てる” などの代替テキストを付けてくれるパッチ。&lt;br /&gt;また、“見てる” などのプレフィックスを違うテキストに変更したい時のために、&lt;br /&gt;Tombloo コンテキストメニュー 内に 「代替テキスト設定用ダイアログ」 が追加される。&lt;br /&gt;&lt;h2&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Twitter ポスト時にタイトルを括弧 (「」) 等で囲う&lt;/li&gt;&lt;li&gt;タイトルに括弧が使われてる場合、違う括弧に自動で切り替える&lt;/li&gt;&lt;li&gt;Twitter ポスト時に先頭に “見てる” 等の代替テキストを自動で付加できる&lt;/li&gt;&lt;li&gt;コンテキストメニューから代替テキストの編集用ダイアログが利用できる&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://2.bp.blogspot.com/-yZUdIpSv74M/TeZkSdf3hbI/AAAAAAAAD7A/qQlHFeF60Lc/s1600/tombloo-twitter-enclose-patches-contextmenu.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-yZUdIpSv74M/TeZkSdf3hbI/AAAAAAAAD7A/qQlHFeF60Lc/s1600/tombloo-twitter-enclose-patches-contextmenu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-YHEQT3fVNis/TeZkdPzu20I/AAAAAAAAD7E/UzZqf-vIing/s1600/tombloo-twitter-enclose-patches-settings-dialog.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-YHEQT3fVNis/TeZkdPzu20I/AAAAAAAAD7E/UzZqf-vIing/s1600/tombloo-twitter-enclose-patches-settings-dialog.png" /&gt;&lt;/a&gt;&lt;/div&gt;「OK」 ボタンで保存されます。 キャンセルする場合は 「×」 ボタンを押してください。&lt;br /&gt;&lt;h2&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.extension.twitter.enclose.js" style="font-weight: bold;" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合はダウンロードしてください)"&gt;tombloo.extension.twitter.enclose.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;h2&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/blob/master/tombloo.extension.twitter.enclose.js"&gt;tombloo.extension.twitter.enclose.js at master from polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt; &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-370697463879713298?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/370697463879713298/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/06/twitterposttombloo.html#comment-form' title='6 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/370697463879713298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/370697463879713298'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/06/twitterposttombloo.html' title='TwitterにPOSTするとき先頭に“見てる”を付けてタイトルを括弧で囲うTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-yZUdIpSv74M/TeZkSdf3hbI/AAAAAAAAD7A/qQlHFeF60Lc/s72-c/tombloo-twitter-enclose-patches-contextmenu.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-7919820032075321359</id><published>2011-05-24T15:04:00.000+09:00</published><updated>2011-05-24T15:04:59.735+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='エディタ'/><category scheme='http://www.blogger.com/atom/ns#' term='Peggy'/><category scheme='http://www.blogger.com/atom/ns#' term='ライブラリ'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Peggyキーワード定義CRECのECMAScript5版「ac_javascript185.kwd」作成</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}body div.pot-separator-image a img.portrait {  border: 1px solid #666;  -webkit-border-radius: 2px;  -moz-border-radius: 2px;  border-radius: 2px;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}&lt;/style&gt;&lt;script&gt;$(function() {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });});&lt;/script&gt;&lt;br /&gt;&lt;div class="pot-overlay-content"&gt;なんかいまさら感がすごいですが、&lt;br /&gt;Peggy/PeggyPad のキーワード/カラー定義 CREC の&lt;br /&gt;「&lt;b&gt;JavaScript 1.8.5 / ECMAScript 5&lt;/b&gt;」 用定義ファイルを公式うｐしました。&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://1.bp.blogspot.com/-4-5N1Br8MaQ/TdtHGEthCFI/AAAAAAAAD68/UdgFWs1BgWo/s1600/peggyPad-JavaScript185-Color-Example.png" imageanchor="1"&gt;&lt;img border="0" height="291" src="http://1.bp.blogspot.com/-4-5N1Br8MaQ/TdtHGEthCFI/AAAAAAAAD68/UdgFWs1BgWo/s400/peggyPad-JavaScript185-Color-Example.png" width="400" class="portrait" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.anchorsystems.jp/anchor/" style="font-weight: bold;" title="アンカーシステムズ公式サイト"&gt;アンカーシステムズ&lt;/a&gt; のメニュー「ライブラリ」→ &lt;br /&gt;「CREC ユーザ定義ファイル、言語サポート DLL」 に 「&lt;b&gt;ac_javascript185.kwd&lt;/b&gt;」 があるのでそれです。&lt;br /&gt;&lt;br /&gt;Peggy インストールフォルダの 「share」 に突っ込むと認識されます。&lt;br /&gt;そのへんは公式を参照ください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;カラー定義は適当に選んだので環境によっては変な色になるかもです。&lt;br /&gt;わかる範囲はデフォルトの JavaScript の色と同じにしましたがもしかしたら違うかもです。&lt;br /&gt;&lt;br /&gt;E4X は完全に定義できませんでした。単純なものだけ色分けされます。&lt;br /&gt;(これがやりたくてはじめたのに…)&lt;br /&gt;&lt;br /&gt;たぶん、CREC では無理なんだろうと思い込むことにしています。&lt;br /&gt;&lt;br /&gt;DOM、E4X (XML)、CSS (CSSStyleDeclaration)、XMLHttpRequest、JSON 等を定義してるので、&lt;br /&gt;プロパティ名などが かぶってるものがあります。&lt;br /&gt;&lt;br /&gt;そういうものは優先度順で色分けされます。&lt;br /&gt;問題あれば標準の JavaScript に戻すといいです。&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-7919820032075321359?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/7919820032075321359/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/peggycrececmascript5acjavascript185kwd.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/7919820032075321359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/7919820032075321359'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/peggycrececmascript5acjavascript185kwd.html' title='Peggyキーワード定義CRECのECMAScript5版「ac_javascript185.kwd」作成'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-4-5N1Br8MaQ/TdtHGEthCFI/AAAAAAAAD68/UdgFWs1BgWo/s72-c/peggyPad-JavaScript185-Color-Example.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-8683710769547283241</id><published>2011-05-19T10:12:00.000+09:00</published><updated>2011-05-19T10:12:39.918+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='エラー'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>POST完了時に通知メッセージを表示するTomblooパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}body div.pot-separator-image a img.notify {  border: 0 none;  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25), 2px 2px 4px rgba(0, 0, 0, 0.25) inset;}&lt;/style&gt;&lt;script&gt;$(function() {  $('#pot-timbloo-notity-20110519-src').attr({ href: "javascript:void(0)" }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-dst', 800);    return false;  });  $('#pot-timbloo-notity-20110519-dst').attr({ href: 'javascript:void(0)' }).click(function() {    $.scrollTo('#pot-timbloo-notity-20110519-src', 800);    return false;  });});&lt;/script&gt;&lt;div class="pot-overlay-content"&gt;Firefox アドオン &lt;a href="https://github.com/to/tombloo/wiki" title="Tombloo Home - GitHub"&gt;Tombloo&lt;/a&gt; のパッチです。&lt;br /&gt;&lt;h2&gt;機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;ポスト完了時に画面右下に通知メッセージが表示されるようになる&lt;/li&gt;&lt;li&gt;Tumblr にポストした時の いくつかのエラーを解消する &lt;a href="#pot-timbloo-notity-20110519-dst" id="pot-timbloo-notity-20110519-src" style="font-size: x-small;"&gt;*1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://4.bp.blogspot.com/-Iq1_N6fuuZE/TdRnODD5upI/AAAAAAAAD64/KUhii5TMeGQ/s1600/tombloo-notify-patches-information.png" imageanchor="1"&gt;&lt;img border="0" class="notify" height="31" src="http://4.bp.blogspot.com/-Iq1_N6fuuZE/TdRnODD5upI/AAAAAAAAD64/KUhii5TMeGQ/s400/tombloo-notify-patches-information.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;最初 (特にダッシュボードでのリブログ時) はウザいと思われます…、&lt;br /&gt;でも慣れるとけっこう便利かも。&lt;br /&gt;&lt;h2&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.post.notify.js" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合はダウンロードしてください)"&gt;tombloo.service.post.notify.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は&lt;br /&gt;&lt;br /&gt;&lt;a href="http://polygon-planet.blogspot.com/2011/05/tombloo.html" title="Tomblooパッチのインストールに失敗しなくなるパッチ | 圧縮電子精神音楽浮遊構造体"&gt;「Tomblooパッチのインストールに失敗しなくなるパッチ」&lt;/a&gt; のパッチ/記事をインストールもしくは参照ください。&lt;br /&gt;&lt;br /&gt;ブラウザ再起動してもポスト時に通知メッセージが表示されない場合は&lt;br /&gt;不具合と思われるのでコメントください。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/blob/master/tombloo.service.post.notify.js"&gt;tombloo.service.post.notify.js at master from polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="font-size: small; margin-bottom: 20px; margin-top: 20px;"&gt;&lt;div&gt;&lt;a href="#pot-timbloo-notity-20110519-src" id="pot-timbloo-notity-20110519-dst" style="font-size: x-small;"&gt;*1&lt;/a&gt;:&lt;/div&gt;エラーの解消といってもエラーを修正したわけではなく、&lt;br /&gt;特定のエラーは「再度 POST ボタンを押すことで重複なく成功する」ので&lt;br /&gt;そういったエラーの場合は自動で再度同じ内容を 1 ～ 3 回程度ポスト試行するだけです。&lt;br /&gt;その際の通知メッセージのラベルには &lt;b&gt;[RETRY]&lt;/b&gt; と書かれます。&lt;/div&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-8683710769547283241?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/8683710769547283241/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/posttombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8683710769547283241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/8683710769547283241'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/posttombloo.html' title='POST完了時に通知メッセージを表示するTomblooパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Iq1_N6fuuZE/TdRnODD5upI/AAAAAAAAD64/KUhii5TMeGQ/s72-c/tombloo-notify-patches-information.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-3126725351170046317</id><published>2011-05-04T04:06:00.000+09:00</published><updated>2011-05-04T04:06:42.056+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tomblooパッチのインストールに失敗しなくなるパッチ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}&lt;/style&gt;&lt;div class="pot-overlay-content"&gt;Firefox アドオン Tombloo のパッチです。&lt;br /&gt;Firefox 4 になってから コンポーネントの動作が変わったところがあって、&lt;br /&gt;特に「パッチのインストール」に失敗するようになっています。&lt;br /&gt;&lt;br /&gt;具体的には、github に対して HEAD メソッドで Tombloo ライブラリの request 関数を使うと&lt;br /&gt;Content-Type が text/html で返ってきてしまう、という点です。&lt;br /&gt;&lt;br /&gt;処理の中で Content-Type が text/javascript もしくは text/plain じゃないと失敗扱いなので、&lt;br /&gt;このパッチではそのへんの条件をゆるくしています。&lt;br /&gt;あと HEAD の戻り値に期待しないよう変更しています。&lt;br /&gt;&lt;br /&gt;かなり条件がゆるいので、関係ないところで「パッチのインストール」が選択可能になるかもしれません。&lt;br /&gt;そういう場合は無視してください。&lt;br /&gt;間違えて JavaScript じゃないファイルをインストールして Tombloo が動かなくなった時などは、&lt;br /&gt;下で説明するパッチのフォルダ内で不正なファイルを削除または移動、リネーム等してください。&lt;br /&gt;&lt;h2&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.actions.installpatch.fix.js" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合はダウンロードしてください)"&gt;tombloo.service.actions.installpatch.fix.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;インストール:&lt;/h2&gt;&lt;br /&gt;※なんか毎回説明してますが不要な人はとばしてください&lt;br /&gt;&lt;br /&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない場合:&lt;br /&gt;&lt;br /&gt;できない場合は &lt;b style="color: #338833;"&gt;{ProfD}&lt;/b&gt;/tombloo/script ディレクトリ (設定依存) に&lt;br /&gt;「tombloo.service.actions.installpatch.fix.js」 と名前を付けて保存し、&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後に、&lt;br /&gt;メニューの 「ツール」→「Tombloo」→「Tomblooのリロード」(もしくは Firefox 再起動) でインストール完了です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: #338833;"&gt;{ProfD}&lt;/b&gt; は、&lt;br /&gt;&lt;br /&gt;WinXPの場合:&lt;ul&gt;&lt;li&gt;C:\Documents and Settings\{ユーザー}\Application Data\Mozilla\Firefox\Profiles\{ハッシュ値}.default\extensions\tombloo\script&lt;/li&gt;&lt;/ul&gt;Mac (たぶん) :&lt;ul&gt;&lt;li&gt;~Library/Application Support/Firefox/Profiles/{ハッシュ値}.default/tombloo/script &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;上記のようなパスがデフォルトで、&lt;br /&gt;Tombloo の設定で 「データ/スクリプトディレクトリ」 を変更してる場合はその場所になります。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/blob/master/tombloo.service.actions.installpatch.fix.js"&gt;tombloo.service.actions.installpatch.fix.js at master from polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-3126725351170046317?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/3126725351170046317/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/tombloo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3126725351170046317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/3126725351170046317'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/tombloo.html' title='Tomblooパッチのインストールに失敗しなくなるパッチ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-4386124269790514120</id><published>2011-05-02T14:15:00.002+09:00</published><updated>2011-05-02T14:25:06.492+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pixiv'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tombloo.pixivパッチにサムネイル画像のズーム表示機能付けたよ</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={ axis :'xy',duration:parseFloat(d.fn.jquery)&gt;=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={ onAfter :b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&amp;&amp;b.axis.length&gt;1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&amp;&amp;o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]&lt;=0?0:Math.min(g[c],m);if(!a&amp;&amp;b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&amp;&amp;function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{ top :a,left:a}}})(jQuery);&lt;/script&gt;&lt;style&gt;.pot-overlay-content h2 {font-size: 150%; margin-top: 50px; margin-bottom: 30px;}dl dt {font-style:normal; font-weight: bold;}&lt;/style&gt;&lt;style&gt;body div.pot-separator-image { display: block; margin: 10px; padding: 0pt; text-align: left; }body div.pot-separator-image a {margin-left: 1em; margin-right: 1em;}body div.pot-separator-image a img {border: 2px solid #999;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}&lt;/style&gt;&lt;div class="pot-overlay-content"&gt;こないだの Firefox アドオン Tombloo のパッチ&lt;br /&gt;「&lt;a href="http://polygon-planet.blogspot.com/2011/04/pixivposttombloo.html"&gt;pixiv からブックマークと同時に POST できる Tombloo パッチがサムネイル対応&lt;/a&gt;」をアップデートしました。&lt;br /&gt;&lt;br /&gt;前バージョンでサムネイル対応したものの、&lt;br /&gt;もう少し画像を大きく表示できないものかと思うことが多々あり&lt;br /&gt;小さいサムネイルイラスト画像をズームできる機能を付けました。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://1.bp.blogspot.com/-nUlimd9qQ1I/Tb4Sxx9OwvI/AAAAAAAAC2Q/VxpLQjD70Ns/s1600/tombloo-pixiv-service-illust.png" imageanchor="1"&gt;&lt;img border="0" height="281" src="http://1.bp.blogspot.com/-nUlimd9qQ1I/Tb4Sxx9OwvI/AAAAAAAAC2Q/VxpLQjD70Ns/s320/tombloo-pixiv-service-illust.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;画像をクリックするとズームして拡大表示できます。&lt;br /&gt;ズームした状態でも pixiv ポストが可能です。 &lt;br /&gt;&lt;br /&gt;本来の作品 (イラスト) ページに行くには、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://1.bp.blogspot.com/-NtIOeAfjk5I/Tb4o-FCe0MI/AAAAAAAAC2g/hIq__MKrh3o/s1600/tombloo-pixiv-service-link-hover.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-NtIOeAfjk5I/Tb4o-FCe0MI/AAAAAAAAC2g/hIq__MKrh3o/s1600/tombloo-pixiv-service-link-hover.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;イラスト画像の下または横にあるテキスト、&lt;br /&gt;作品のタイトルがリンクになっているのでそこから移動できます。 &lt;br /&gt;&lt;h2&gt;今回追加/改善された機能&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;pixiv のサムネイル画像をクリックすると拡大表示される&lt;/li&gt;&lt;li&gt;ズーム機能の ON/OFF 切り替え可&lt;/li&gt;&lt;li&gt;今までポストしてから数秒待たないとエラー出てたのが改善して連続ポストできるようになった&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;ON/OFF の切り替えは、&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-9-IHOJxfjVo/Tb4h5HsxYMI/AAAAAAAAC2U/nhPdUimNQRg/s1600/tombloo-pixiv-service-contextmenu.png" imageanchor="1"&gt;&lt;img border="0"  src="http://3.bp.blogspot.com/-9-IHOJxfjVo/Tb4h5HsxYMI/AAAAAAAAC2U/nhPdUimNQRg/s1600/tombloo-pixiv-service-contextmenu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;コンテキストメニューの Tombloo に、&lt;br /&gt;「&lt;b&gt;Expand pixiv thumbnail image&lt;/b&gt;」 というメニューが追加されます。&lt;br /&gt;&lt;br /&gt;メニューの pixiv アイコンの色が、 &lt;b&gt;&lt;span style="color: #3d85c6;"&gt;カラー&lt;/span&gt;&lt;/b&gt; の時は &lt;b&gt;ON&lt;/b&gt; の状態、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://3.bp.blogspot.com/-r6D8S-E5G6s/Tb4kCJ_7U8I/AAAAAAAAC2Y/b5qrD97vy_8/s1600/tombloo-pixiv-service-contextmenu-sub-off.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-r6D8S-E5G6s/Tb4kCJ_7U8I/AAAAAAAAC2Y/b5qrD97vy_8/s1600/tombloo-pixiv-service-contextmenu-sub-off.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #666666;"&gt;グレー&lt;/span&gt;&lt;/b&gt; の時は &lt;b&gt;OFF&lt;/b&gt; の状態です。 &lt;br /&gt;&lt;h2&gt;変更点&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;作品の「ブックマーク」と、ユーザーに対する「お気に入り追加 」を別々の models に分けた&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;今まで 直接スクリプトを編集してくださいとか言ってましたがその必要はなくなりました。&lt;br /&gt;&lt;div class="separator pot-separator-image"&gt;&lt;a href="http://2.bp.blogspot.com/-2sCANo8jXJ0/Tb4nU8nrBNI/AAAAAAAAC2c/Zurz6IpcB8k/s1600/tombloo-pixiv-service-setting-dialog-strong.png" imageanchor="1"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/-2sCANo8jXJ0/Tb4nU8nrBNI/AAAAAAAAC2c/Zurz6IpcB8k/s400/tombloo-pixiv-service-setting-dialog-strong.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;User がついてるほうが ユーザーに対する 「お気に入り追加 」 です。&lt;br /&gt;&lt;h2&gt;パッチ (Download):&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/raw/master/tombloo.service.pixiv.js" title="右クリック→「Tombloo」→「Tomblooパッチのインストール」(できない場合はダウンロードしてください)"&gt;tombloo.service.pixiv.js&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;パッチの URL とインストール方法は変わってませんがいちおう。&lt;br /&gt;説明不要な人はとばしてください。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;インストール:&lt;/h2&gt;上のパッチリンクを&lt;br /&gt;右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール。&lt;br /&gt;&lt;br /&gt;※直接右クリックからインストールできない環境があるっぽいです。&lt;br /&gt;&lt;br /&gt;できない場合は &lt;b style="color: #338833;"&gt;{ProfD}&lt;/b&gt;/tombloo/script ディレクトリ (設定依存) に&lt;br /&gt;「tombloo.service.pixiv.js」 と名前を付けて保存し、&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後に、&lt;br /&gt;メニューの 「ツール」→「Tombloo」→「Tomblooのリロード」でインストール完了です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: #338833;"&gt;{ProfD}&lt;/b&gt; は、&lt;br /&gt;&lt;br /&gt;WinXPの場合:&lt;ul&gt;&lt;li&gt;C:\Documents and Settings\{ユーザー}\Application Data\Mozilla\Firefox\Profiles\{ハッシュ値}.default\extensions\tombloo\script&lt;/li&gt;&lt;/ul&gt;Mac (たぶん) :&lt;ul&gt;&lt;li&gt;~Library/Application Support/Firefox/Profiles/{ハッシュ値}.default/tombloo/script &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;上記のようなパスがデフォルトで、&lt;br /&gt;Tombloo の設定で 「データ/スクリプトディレクトリ」 を変更してる場合はその場所になります。&lt;br /&gt;&lt;br /&gt;インストールすると 「Tomblooの設定」 ダイアログ内に pixiv アイコンが現れます。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;レポジトリ&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/polygonplanet/tombloo/blob/master/tombloo.service.pixiv.js"&gt;tombloo.service.pixiv.js at master from polygonplanet/tombloo - GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;そういえば機能的に Greasemonkey のほうがいいなと思ったけど、なんでおパッチにしたのかもう忘れた…。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;しばらく Tombloo 関連の記事が続きそう。&lt;br /&gt;&lt;div style="margin-bottom: 50px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-4386124269790514120?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/4386124269790514120/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/tombloopixiv.html#comment-form' title='11 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/4386124269790514120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/4386124269790514120'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/05/tombloopixiv.html' title='Tombloo.pixivパッチにサムネイル画像のズーム表示機能付けたよ'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-nUlimd9qQ1I/Tb4Sxx9OwvI/AAAAAAAAC2Q/VxpLQjD70Ns/s72-c/tombloo-pixiv-service-illust.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-4615551517347011564</id><published>2011-04-21T05:26:00.002+09:00</published><updated>2011-04-21T05:30:17.025+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='リブログ'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='スクリプト'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Tumblrサブ垢からリブログをボタン押すだけで自動化するGreasemonkeyスクリプト</title><content type='html'>もともと自分用に使ってたんですが、せっかくなので公開することにしました。&lt;br /&gt;とは言ってもサブアカウントを使ってて&lt;br /&gt;メインへまとめる作業を自動でできないかなーと思ってるような人限定になりますが。。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AutoSubReblogize&lt;/b&gt; という Greasemonkey スクリプトです。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;インストール:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt; &lt;b&gt;&lt;a href="http://userscripts.org/scripts/show/101514"&gt;AutoSubReblogize for Greasemonkey&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-left: 25px;"&gt;↑のリンクから 「Install」 ボタンを押すとインストールが開始されます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;(最近 userscripts.org にアクセスすると 502 が多いですがリロードで大抵いけます)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;使い方:&lt;/h2&gt;インストールすると、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator"&gt;&lt;a href="http://3.bp.blogspot.com/-eITS9rM1_lg/Ta8wkpWGvNI/AAAAAAAACxY/26AyNmlCgFU/s1600/tumblr-autosubreblogize-menu.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-eITS9rM1_lg/Ta8wkpWGvNI/AAAAAAAACxY/26AyNmlCgFU/s1600/tumblr-autosubreblogize-menu.png" style="border: 2px solid rgb(204, 204, 204);" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;アドオンバー/ステータスバー/ツールバーにある、Greasemonkey アイコンから&lt;br /&gt;「ユーザスクリプトコマンド(C)」 に 「AutoSubReblogize - Settings」というメニューが追加されます。&lt;br /&gt;まずここから設定します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;メニューをクリックすると、&lt;br /&gt;&lt;br /&gt;&lt;div class="separator"&gt;&lt;a href="http://3.bp.blogspot.com/-Mz5Rn-Y2Lyw/Ta8w4pGkBzI/AAAAAAAACxc/ba7Ki76a4J0/s1600/tumblr-autosubreblogize-dialog.png" imageanchor="1"&gt;&lt;img border="0" height="273" src="http://3.bp.blogspot.com/-Mz5Rn-Y2Lyw/Ta8w4pGkBzI/AAAAAAAACxc/ba7Ki76a4J0/s320/tumblr-autosubreblogize-dialog.png" style="border: 2px solid rgb(204, 204, 204);" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;↑のようなダイアログが表示されるので、各項目にそれぞれ入力します。&lt;br /&gt;&lt;style&gt;.auto-sub-reblogize-about dt{font-weight:bold;margin:8px 0;}&lt;/style&gt;&lt;br /&gt;&lt;dl class="auto-sub-reblogize-about"&gt;&lt;dt&gt;一番上のテキストボックス:&lt;/dt&gt;&lt;dd&gt;サブアカウントの URL を入力します。&lt;br /&gt;複数ある場合は 改行区切りで入力します。&lt;br /&gt;トップページの URL を入力してください。 &lt;/dd&gt;&lt;dt&gt;リブログから除外するアカウント名:&lt;/dt&gt;&lt;dd&gt;入力したアカウント名が既にリブログしてる場合スキップするようになります。&lt;br /&gt;通常、メインのアカウント名を入れます。&lt;/dd&gt;&lt;dt&gt;メインアカウントのメールアドレス:&lt;/dt&gt;&lt;dd&gt;そのままですが、Tumblr API を使ってる都合上 必要になります。 &lt;/dd&gt;&lt;dt&gt;メインアカウントのパスワード:&lt;/dt&gt;&lt;dd&gt;これも Tumblr API を使ってる都合上 必要になります。 &lt;/dd&gt; &lt;/dl&gt;&lt;div style="font-size: small; margin: 10px 0pt;"&gt;メールアドレスとパスワードは、&lt;br /&gt;SSL や WEP などで広く使われているストリーム暗号 ARCFOUR によって暗号化されます。&lt;br /&gt;Greasemonkey 内に保存されるだけですがいちおう。&lt;/div&gt;&lt;br /&gt;設定が完了して OK ボタンを押すと保存されます。&lt;br /&gt;そして サブアカウントのページを開くと&lt;br /&gt;&lt;br /&gt;&lt;div class="separator"&gt;&lt;a href="http://3.bp.blogspot.com/-9ViJuQPASes/Ta8xDd3IvKI/AAAAAAAACxg/vi4JqfIIOYM/s1600/tumblr-autosubreblogize-overlay.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-9ViJuQPASes/Ta8xDd3IvKI/AAAAAAAACxg/vi4JqfIIOYM/s1600/tumblr-autosubreblogize-overlay.png" style="border: 2px solid rgb(204, 204, 204);" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ページの左上に ↑ のようなパネルが表示されるようになります。&lt;br /&gt;これをクリックすると 自動リブログが開始されます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator"&gt;&lt;a href="http://3.bp.blogspot.com/-_HT988vbXJA/Ta8xMkgk_LI/AAAAAAAACxk/FVCpXUTzvkU/s1600/tumblr-autosubreblogize-process.png" imageanchor="1"&gt;&lt;img border="0" height="364" src="http://3.bp.blogspot.com/-_HT988vbXJA/Ta8xMkgk_LI/AAAAAAAACxk/FVCpXUTzvkU/s640/tumblr-autosubreblogize-process.png" style="border: 2px solid rgb(204, 204, 204);" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;実行中は↑の画像のように、&lt;br /&gt;画像などを表示するコンテンツパネル、ステータスが流れてくテキストボックスが中央に表示されます。&lt;br /&gt;&lt;br /&gt;左上の 「Click to Stop」 と書いてあるパネルをクリックすると途中で中止できます。&lt;br /&gt;&lt;br /&gt;約 3 ～ 6 秒おきにリブログが続きます。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;その他:&lt;/h2&gt;Tumblr の調子がわるい時などはエラーが頻発しますが、そういう時はほとんど失敗するし&lt;br /&gt;Tumblr サーバーに負担をかけないためにも中止して別の時にしましょう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;リブログの重複防止については、notes を見て判断してますが&lt;br /&gt;POST された時からある程度の期間が経つと、どうもうまく取得できないようです (未確認)。&lt;br /&gt;API が返す notes が稀に抜けがあるのは確認。&lt;br /&gt;そういう時は再度取得というわけにもいかないので仕方がないです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;あと、Tumblr のデフォルトのテーマ (なんか最初は青っぽいやつ) にしておくと、&lt;br /&gt;notes の自動取得や Permalink の Fix など通常のリブログを楽にできるようにしてくれます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ちょっとした懸念点ですが、サブアカウントの URL のみ実行するとはいっても&lt;br /&gt;他のページでも ある程度スクリプトを読み込まれるわけです。&lt;br /&gt;メモリ使用量などが気になる方は、直接ユーザースクリプトを編集して、&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: white none repeat scroll 0% 0%; border: 1px solid #cccccc; color: #333333; font-family: 'MS Gothic','courier new',monospace; font-size: 13px; line-height: 1.2; margin: 4px; padding: 4px; white-space: pre; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: -pre-wrap; word-wrap: break-word" class="js" name="code"&gt;// ==UserScript==&lt;br /&gt;// @name           AutoSubReblogize&lt;br /&gt;...&lt;br /&gt;// @include        http://polygonplanet*.tumblr.com/  ←ここにサブのURLを書く&lt;br /&gt;// @exclude        http://polygonplanet.tumblr.com/   ←ここにメインのURLを書く&lt;br /&gt;// @exclude        http://www.tumblr.com/&lt;br /&gt;...&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;/pre&gt;こんな感じで設定しておくと、他の URL は完全に除外されるのでメモリコストも減ります。&lt;br /&gt;そのかわり、サブの URL が変則的な場合は毎回設定しないとなのでめんどうかもしれません。&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 50px"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6406779057808667722-4615551517347011564?l=polygon-planet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygon-planet.blogspot.com/feeds/4615551517347011564/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://polygon-planet.blogspot.com/2011/04/tumblrgreasemonkey.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/4615551517347011564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6406779057808667722/posts/default/4615551517347011564'/><link rel='alternate' type='text/html' href='http://polygon-planet.blogspot.com/2011/04/tumblrgreasemonkey.html' title='Tumblrサブ垢からリブログをボタン押すだけで自動化するGreasemonkeyスクリプト'/><author><name>polygon</name><uri>http://www.blogger.com/profile/13448806743097583559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_4TAXTQzJyY4/TQnbruwHPeI/AAAAAAAAAJk/0ycMXsHzXjE/S220/polygon_tribe_100x100.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-eITS9rM1_lg/Ta8wkpWGvNI/AAAAAAAACxY/26AyNmlCgFU/s72-c/tumblr-autosubreblogize-menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6406779057808667722.post-2843352818839805755</id><published>2011-04-14T16:30:00.003+09:00</published><updated>2011-04-14T16:42:12.280+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pixiv'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='アドオン'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='パッチ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='Tombloo'/><category scheme='http://www.blogger.com/atom/ns#' term='開発'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>pixivからブックマークと同時にPOSTできるTomblooパッチがサムネイル対応</title><content type='html'>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;/*** jQuery.ScrollTo - Easy element scrolling using jQuery.* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com* Dual licensed under MIT and GPL.* Date: 5/25/2009* @author Ariel Flesler* @version 1.4.2** http://flesler.blogspot.com/2007/10/jqueryscrollto.html*/;(function(d){var k=d.scrollTo=functi
