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


<?xml-stylesheet href="http://d.hatena.ne.jp/zorio/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/zorio/rss">
	<title>zorioの日記</title>
	<link>http://d.hatena.ne.jp/zorio/</link>
	<description>zorioの日記</description>
	
	<dc:creator>zorio</dc:creator>
	<dc:date>2009-08-26T08:42:29+09:00</dc:date>
	<items>
	<rdf:Seq>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/zorio/20090524/1243172190"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/zorio/20090509/1241886502"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/zorio/20090202/1233581874"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/zorio/20090128/1233161008"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/zorio/20090113/1231843433"/>
	</rdf:Seq>
	</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/zorio/20090524/1243172190">
	<title> クイズの回答</title>
	<link>http://d.hatena.ne.jp/zorio/20090524/1243172190</link>
	<description> 出題が目に止まったので。 http://www.hyuki.com/d/200905.html#i20090524210000 A:病気にかかっている B:検査で陽性と診断される とすると、求めるのはP(A|B) P(B) = 1/100 * 95/100 + 99/100 * 5/100 = 590/10000 P(A∩B) = 1/100 * 95/100 = 95/10000 P(B)P(A|B) = P(A∩</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>出題が目に止まったので。</p>
			<p><a href="http://www.hyuki.com/d/200905.html#i20090524210000" target="_blank">http://www.hyuki.com/d/200905.html#i20090524210000</a></p>
			<p>A:病気にかかっている</p>
			<p>B:検査で陽性と診断される</p>
			<p>とすると、求めるのはP(A|B)</p>
			<p>P(B) = 1/100 * 95/100 + 99/100 * 5/100 = 590/10000</p>
			<p>P(A∩B) = 1/100 * 95/100 = 95/10000</p>
			<p>P(B)P(A|B) = P(A∩B)であるから、</p>
			<p>P(A|B) = 95/10000 * 10000/590 = 95/590</p>
			<p>検査で陽性と出たからといって実際に罹患している可能性は2割も無い。</p>
			<p>乳癌検診の時も似たような話題になる気がしますね。</p>
		</div>
]]></content:encoded>
	<dc:creator>zorio</dc:creator>
	<dc:date>2009-05-24T22:36:30+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/zorio/20090509/1241886502">
	<title> Amazon Product Advertising APIの認証の件</title>
	<link>http://d.hatena.ne.jp/zorio/20090509/1241886502</link>
	<description> 参考：http://chalow.net/2009-05-09-1.html 今後はOpenIDみたいにAWSにシグネチャが要るとか。 rubyで書いてみた。 require &#34;openssl&#34; require &#34;base64&#34; key = &#34;1234567890&#34; req = [ &#34;AWSAccessKeyId=00000000000000000000&#34;, &#34;ItemId=</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>参考：<a href="http://chalow.net/2009-05-09-1.html" target="_blank">http://chalow.net/2009-05-09-1.html</a></p>
			<p>今後はOpenIDみたいにAWSにシグネチャが要るとか。</p>
			<p>rubyで書いてみた。</p>
<pre class="syntax-highlight">
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">openssl</span><span class="synSpecial">&#34;</span>
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">base64</span><span class="synSpecial">&#34;</span>

key = <span class="synSpecial">&#34;</span><span class="synConstant">1234567890</span><span class="synSpecial">&#34;</span>
req = [
<span class="synSpecial">&#34;</span><span class="synConstant">AWSAccessKeyId=00000000000000000000</span><span class="synSpecial">&#34;</span>,
<span class="synSpecial">&#34;</span><span class="synConstant">ItemId=0679722769</span><span class="synSpecial">&#34;</span>,
<span class="synSpecial">&#34;</span><span class="synConstant">Operation=ItemLookup</span><span class="synSpecial">&#34;</span>,
<span class="synSpecial">&#34;</span><span class="synConstant">ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews</span><span class="synSpecial">&#34;</span>,
<span class="synSpecial">&#34;</span><span class="synConstant">Service=AWSECommerceService</span><span class="synSpecial">&#34;</span>,
<span class="synSpecial">&#34;</span><span class="synConstant">Timestamp=2009-01-01T12%3A00%3A00Z</span><span class="synSpecial">&#34;</span>,
<span class="synSpecial">&#34;</span><span class="synConstant">Version=2009-01-06</span><span class="synSpecial">&#34;</span>].join(<span class="synSpecial">&#34;</span><span class="synConstant">&#38;</span><span class="synSpecial">&#34;</span>)

message = [<span class="synSpecial">&#34;</span><span class="synConstant">GET</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">webservices.amazon.com</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">/onca/xml</span><span class="synSpecial">&#34;</span>, req].join(<span class="synSpecial">&#34;\n&#34;</span>)

hash = <span class="synIdentifier">OpenSSL</span>::<span class="synIdentifier">HMAC</span>::digest(<span class="synIdentifier">OpenSSL</span>::<span class="synIdentifier">Digest</span>::<span class="synIdentifier">SHA256</span>.new, key, message)

print <span class="synIdentifier">Base64</span>.encode64(hash) 
<span class="synComment">#=&#62; Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=</span>
</pre>

			<p><a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html" target="_blank">http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html</a></p>
			<p>のサンプルと合わない。</p>
			<p><a href="http://developer.amazonwebservices.com/connect/thread.jspa?threadID=31670&tstart=0" target="_blank">http://developer.amazonwebservices.com/connect/thread.jspa?threadID=31670&#38;tstart=0</a></p>
			<p>によると、サンプルが間違ってるんじゃね？って話みたい。</p>
			<p>ちなみにopensslが古くてSHA256が使えない場合は、HMACの所だけ自前で書けばOK。</p>
			<p><span class="emphasis">2009-06-01追記：ikeyとokeyの初期化がバグってたので修正。2回目以降は正しく動かなくなっていた。</span></p>
			<p><span class="emphasis">2009-07-04追記：まだ間違ってた。コメント欄参照。</span></p>
<pre class="syntax-highlight">
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">digest/sha2</span><span class="synSpecial">&#34;</span>
<span class="synComment">#中略</span>
<span class="synIdentifier">IPAD</span> = <span class="synSpecial">&#34;\x36&#34;</span><span class="synComment"># * 64</span>
<span class="synIdentifier">OPAD</span> = <span class="synSpecial">&#34;\x5c&#34;</span><span class="synComment"># * 64</span>
<span class="synPreProc">def </span><span class="synIdentifier">hmac_sha256</span>(key, message)
<span class="synComment">#  ikey = IPAD</span>
<span class="synComment">#  okey = OPAD</span>
  ikey = <span class="synIdentifier">IPAD</span> * <span class="synConstant">64</span>
  okey = <span class="synIdentifier">OPAD</span> * <span class="synConstant">64</span>
  key.size.times <span class="synStatement">do</span> |<span class="synIdentifier">i</span>|
    ikey[i] = key[i] ^ ikey[i]
    okey[i] = key[i] ^ okey[i]
  <span class="synStatement">end</span>

  value = <span class="synIdentifier">Digest</span>::<span class="synIdentifier">SHA256</span>.digest(ikey + message)
  value = <span class="synIdentifier">Digest</span>::<span class="synIdentifier">SHA256</span>.digest(okey + value)
<span class="synPreProc">end</span>

print <span class="synIdentifier">Base64</span>.encode64(hmac_sha256(key, message)) 
<span class="synComment">#=&#62; Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=</span>
</pre>

			<p>参考：</p>
			<ul>
				<li> <a href="http://www.machu.jp/diary/20060725.html#p01" target="_blank">http://www.machu.jp/diary/20060725.html#p01</a></li>
				<li> <a href="http://ja.wikipedia.org/wiki/HMAC" target="_blank">http://ja.wikipedia.org/wiki/HMAC</a></li>
				<li> <a href="http://en.wikipedia.org/wiki/SHA_hash_functions" target="_blank">http://en.wikipedia.org/wiki/SHA_hash_functions</a></li>
			</ul>
			<p>まあ、そんな事よりYahoo!PipesとかTomblooとかから使えなくなりそうなのが困るんですけどね。</p>
		</div>
]]></content:encoded>
	<dc:creator>zorio</dc:creator>
	<dc:date>2009-05-10T01:28:22+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/zorio/20090202/1233581874">
	<title> TomblooからRemember The Milkに登録</title>
	<link>http://d.hatena.ne.jp/zorio/20090202/1233581874</link>
	<description> よく探したらRTMのヘルプに「Quick Add」ってブックマークレットがあったので、それを使わせてもらうことにした。 models.register({ name : ’Remember The Milk’, ICON : ’http://www.rememberthemilk.com/favicon.ico’, POST_URL: ’http://www.rememberthemilk.com/servic</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>よく探したらRTMのヘルプに「Quick Add」ってブックマークレットがあったので、それを使わせてもらうことにした。</p>
<pre class="syntax-highlight">
models.register(<span class="synIdentifier">{</span>
	name : <span class="synConstant">'Remember The Milk'</span>,
	ICON : <span class="synConstant">'http://www.rememberthemilk.com/favicon.ico'</span>,
	POST_URL: <span class="synConstant">'http://www.rememberthemilk.com/services/ext/addtask.rtm'</span>,
	check : <span class="synIdentifier">function</span>(ps)<span class="synIdentifier">{</span>
		<span class="synStatement">return</span> ps.type == <span class="synConstant">'link'</span>;
	<span class="synIdentifier">}</span>,
	post : <span class="synIdentifier">function</span>(ps)<span class="synIdentifier">{</span>
		<span class="synIdentifier">var</span> url = <span class="synIdentifier">this</span>.POST_URL;
		<span class="synIdentifier">var</span> today = ps.<span class="synType">date</span> || <span class="synStatement">new</span> <span class="synType">Date</span>();
		today = <span class="synStatement">new</span> <span class="synType">Date</span>(Math.max(today, <span class="synStatement">new</span> <span class="synType">Date</span>()));
		<span class="synIdentifier">var</span> <span class="synType">date</span> = today.toLocaleFormat(<span class="synConstant">&#34;%Y-%m-%d&#34;</span>);
		<span class="synStatement">return</span> request(url).addCallback(<span class="synIdentifier">function</span>(res)<span class="synIdentifier">{</span>
			<span class="synStatement">if</span> (res.responseText.indexOf(<span class="synConstant">'You must &#60;a href=&#34;/login/'</span>) != -1)
				<span class="synStatement">throw</span> <span class="synStatement">new</span> Error(getMessage(<span class="synConstant">'error.notLoggedin'</span>));
			<span class="synIdentifier">var</span> doc = convertToHTMLDocument(res.responseText);
			<span class="synStatement">return</span> $x(<span class="synConstant">'//td/select[@id=&#34;l&#34;]/option/@value'</span>, doc);
		<span class="synIdentifier">}</span>).addCallback(<span class="synIdentifier">function</span>(option)<span class="synIdentifier">{</span>
			request(url, <span class="synIdentifier">{</span>
				sendContent : <span class="synIdentifier">{</span>
					<span class="synConstant">'t'</span>  : ps.item, <span class="synComment">//title</span>
					<span class="synConstant">'d'</span>  : <span class="synType">date</span>,    <span class="synComment">//date</span>
					<span class="synConstant">'tx'</span> : ps.tags,  <span class="synComment">//tag</span>
					<span class="synConstant">'l'</span>  : option ,<span class="synComment">//list</span>
					<span class="synConstant">'submitform'</span>: <span class="synConstant">'Add Task'</span>
				<span class="synIdentifier">}</span>
			<span class="synIdentifier">}</span>);
		<span class="synIdentifier">}</span>);
	<span class="synIdentifier">}</span>
<span class="synIdentifier">}</span>);
</pre>

			<p>ちなみに、今まで何の説明もなくコードだけペタペタと貼り付けてましたが、これらのコードを</p>
			<p>「ツール」⇒「Tombloo」⇒「Tomblooの設定」⇒「エントリ内容/他」⇒「データ/スクリプトディレクトリ」</p>
			<p>で指定したディレクトリの下のscriptというフォルダに拡張子をjsにして置いておくと、Firefoxの起動時にTomblooが読み込んでくれます。</p>
		</div>
]]></content:encoded>
	<dc:creator>zorio</dc:creator>
	<dc:date>2009-02-02T22:37:54+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/zorio/20090128/1233161008">
	<title> Amazonの商品明細からGoogleCalendarに登録するTomblooのパッチ</title>
	<link>http://d.hatena.ne.jp/zorio/20090128/1233161008</link>
	<description> どこかから言葉巧みに誘導されてまたは積極的に物欲に身を任せて、Amazonにたどり着く事ってよくありますよね。 そういう時、「この商品を予約注文する」を押せば良いんですが、今は買わないが覚えてはおきたいって事もあります。 なんか、とらのあなで買うと特典が付くとか</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>どこかから言葉巧みに誘導されてまたは積極的に物欲に身を任せて、Amazonにたどり着く事ってよくありますよね。</p>
			<p>そういう時、「この商品を予約注文する」を押せば良いんですが、今は買わないが覚えてはおきたいって事もあります。</p>
			<p>なんか、とらのあなで買うと特典が付くとかそういう感じの。</p>
			<p>Google CalendarかRemember The Milkに簡単に登録する方法はないかなと思って色々調べていたのですが、Tomblooをごにょごにょっとするのが一番簡単そうだったのでやってみました。</p>
			<h4> ソース</h4>
			<p>まずデータを取ってくるところから。TomblooにはあらかじめAmazon用のヘルパクラスがあるので、これを変更します。</p>
			<p>20_model.jsのソースをコピペして部分的に書き換えました。</p>
			<p>変更点は、</p>
			<ul>
				<li> Amazonに問い合わせるときのResponseGroupをSmallからMediumにした</li>
				<li> 取得結果のItemにreleaseDateっていうプロパティを足した</li>
			</ul>
			<p>Amazonのデータには日付が年月しか入っていない事があるので、そういう時は翌月1日を返すようにしました。</p>
<pre class="syntax-highlight">
Amazon.getItem = <span class="synIdentifier">function</span>(asin) <span class="synIdentifier">{</span>
	<span class="synStatement">return</span> request(<span class="synConstant">'http://webservices.amazon.co.jp/onca/xml'</span>, <span class="synIdentifier">{</span>
		queryString : <span class="synIdentifier">{</span>
			Service        : <span class="synConstant">'AWSECommerceService'</span>,
			SubscriptionId : <span class="synConstant">'0DCQFXHRBNT9GN9Z64R2'</span>,
			Operation      : <span class="synConstant">'ItemLookup'</span>,
			ResponseGroup  : <span class="synConstant">'Medium,Images'</span>,
			ItemId         : asin,
		<span class="synIdentifier">}</span>,
	<span class="synIdentifier">}</span>).addCallback(<span class="synIdentifier">function</span>(res)<span class="synIdentifier">{</span>
		<span class="synIdentifier">var</span> xml = convertToXML(res.responseText);
		<span class="synStatement">if</span>(xml.Error.length())
			<span class="synStatement">throw</span> res;
		
		<span class="synStatement">return</span> <span class="synStatement">new</span> Amazon.Item(xml.Items.Item);
	<span class="synIdentifier">}</span>);
<span class="synIdentifier">}</span>;
Amazon.Item = <span class="synIdentifier">function</span>(item)<span class="synIdentifier">{</span>
	<span class="synStatement">return</span> <span class="synIdentifier">{</span>
		get title()<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> <span class="synConstant">''</span>+item.ItemAttributes.Title;
		<span class="synIdentifier">}</span>,
		get creators()<span class="synIdentifier">{</span>
			<span class="synIdentifier">var</span> creators = <span class="synIdentifier">[]</span>;
			
			<span class="synComment">// '原著'以外</span>
			<span class="synStatement">for</span> each(<span class="synIdentifier">var</span> creator <span class="synStatement">in</span> item.ItemAttributes.Creator.(@Role != <span class="synConstant">'</span><span class="synSpecial">\u</span><span class="synConstant">539F</span><span class="synSpecial">\u</span><span class="synConstant">8457'</span>))
				creators.push(<span class="synConstant">''</span>+creator);
			<span class="synStatement">return</span> creators;
		<span class="synIdentifier">}</span>,
		get largestImage()<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> <span class="synIdentifier">this</span>.largeImage || <span class="synIdentifier">this</span>.mediumImage || <span class="synIdentifier">this</span>.smallImage;
		<span class="synIdentifier">}</span>,
		get largeImage()<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> <span class="synStatement">new</span> Amazon.Image(item.LargeImage);
		<span class="synIdentifier">}</span>,
		get mediumImage()<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> <span class="synStatement">new</span> Amazon.Image(item.MediumImage);
		<span class="synIdentifier">}</span>,
		get smallImage()<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> <span class="synStatement">new</span> Amazon.Image(item.SmallImage);
		<span class="synIdentifier">}</span>,
		get releaseDate() <span class="synIdentifier">{</span>
			<span class="synIdentifier">var</span> pud = <span class="synConstant">''</span> + item.ItemAttributes.PublicationDate;
			<span class="synIdentifier">var</span> red = <span class="synConstant">''</span> + item.ItemAttributes.ReleaseDate;
			<span class="synIdentifier">var</span> rel = (pud == <span class="synConstant">''</span> ? red : pud).split(<span class="synConstant">'-'</span>);
			<span class="synIdentifier">var</span> y = parseInt(rel<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>, 10), m = parseInt(rel<span class="synIdentifier">[</span>1<span class="synIdentifier">]</span>||<span class="synConstant">'0'</span>, 10), d = parseInt(rel<span class="synIdentifier">[</span>2<span class="synIdentifier">]</span>||<span class="synConstant">'0'</span>, 10);
			<span class="synIdentifier">var</span> dt;
			<span class="synStatement">if</span> (d === 0) <span class="synIdentifier">{</span>
				<span class="synStatement">if</span> (m === 12) <span class="synIdentifier">{</span>
					dt = <span class="synStatement">new</span> <span class="synType">Date</span>(y + 1, 0, 1);
				<span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span>
					dt = <span class="synStatement">new</span> <span class="synType">Date</span>(y, m, 1);
				<span class="synIdentifier">}</span>
			<span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span>
				dt = <span class="synStatement">new</span> <span class="synType">Date</span>(y, m - 1, d);
			<span class="synIdentifier">}</span>
			<span class="synStatement">return</span> dt;
		<span class="synIdentifier">}</span>,
	<span class="synIdentifier">}</span>
<span class="synIdentifier">}</span>;
</pre>

			<p>次。</p>
			<p>Extractしてmodelに渡すオブジェクトに、dateというプロパティを追加しました。</p>
			<p>一行足すためだけに31_Tombloo.Service.extractors.jsからコピペしてます。</p>
			<p>Quoteは無視してLinkだけを対象にします。</p>
<pre class="syntax-highlight">
Tombloo.Service.extractors<span class="synIdentifier">[</span><span class="synConstant">'Link - Amazon'</span><span class="synIdentifier">][</span><span class="synConstant">'extract'</span><span class="synIdentifier">]</span> = <span class="synIdentifier">function</span>(ctx)<span class="synIdentifier">{</span>
	<span class="synIdentifier">var</span> exts = Tombloo.Service.extractors;
	<span class="synStatement">return</span> exts.Amazon.extract(ctx).addCallback(<span class="synIdentifier">function</span>(item)<span class="synIdentifier">{</span>
		<span class="synStatement">return</span> <span class="synIdentifier">{</span>
			type    : <span class="synConstant">'link'</span>,
			item    : ctx.title,
			itemUrl : ctx.href,
			<span class="synType">date</span>    : item.releaseDate
		<span class="synIdentifier">}</span>
	<span class="synIdentifier">}</span>);
<span class="synIdentifier">}</span>;
</pre>

			<p>最後にGoogleCalendarへの登録部分。</p>
			<p>GoogleCalendarのfaviconのURLが見つけられなかったので、Googleので代用。</p>
			<p>日付が未来の場合はその日の予定として、過去の場合は今日の予定として登録するようにしました。</p>
<pre class="syntax-highlight">
models.register(<span class="synIdentifier">{</span>
	name : <span class="synConstant">'GoogleCalendar'</span>,
	ICON : <span class="synConstant">'http://www.google.com/favicon.ico'</span>,
	POST_URL: <span class="synConstant">'http://www.google.com/calendar/event'</span>,
	check : <span class="synIdentifier">function</span>(ps)<span class="synIdentifier">{</span>
		<span class="synStatement">return</span> ps.type == <span class="synConstant">'link'</span>;
	<span class="synIdentifier">}</span>,
	getAuthCookie : <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span>
		<span class="synStatement">return</span> getCookieString(<span class="synConstant">'www.google.com'</span>, <span class="synConstant">'secid'</span>).split(<span class="synConstant">'='</span>)<span class="synIdentifier">[</span>1<span class="synIdentifier">]</span>;
	<span class="synIdentifier">}</span>,
	post : <span class="synIdentifier">function</span>(ps)<span class="synIdentifier">{</span>
		<span class="synIdentifier">var</span> url = <span class="synIdentifier">this</span>.POST_URL;
		<span class="synIdentifier">var</span> today = ps.<span class="synType">date</span> || <span class="synStatement">new</span> <span class="synType">Date</span>();
		today = <span class="synStatement">new</span> <span class="synType">Date</span>(Math.max(today, <span class="synStatement">new</span> <span class="synType">Date</span>()));
		<span class="synIdentifier">var</span> tomorrow = <span class="synStatement">new</span> <span class="synType">Date</span>(today.getTime() + 86400 * 1000);
		dates = today.toLocaleFormat(<span class="synConstant">&#34;%Y%m%d&#34;</span>) + <span class="synConstant">'/'</span> + tomorrow.toLocaleFormat(<span class="synConstant">&#34;%Y%m%d&#34;</span>);
		<span class="synIdentifier">var</span> secid = <span class="synIdentifier">this</span>.getAuthCookie();
		<span class="synStatement">return</span> request(url, <span class="synIdentifier">{</span>
				queryString : <span class="synIdentifier">{</span>
					<span class="synConstant">'action'</span> : <span class="synConstant">'CREATE'</span>, 
					<span class="synConstant">'secid'</span>  : secid, 
					<span class="synConstant">'dates'</span>  : dates,
					<span class="synConstant">'text'</span>   : ps.item, 
					<span class="synConstant">'details'</span>: ps.itemUrl
				<span class="synIdentifier">}</span>
		<span class="synIdentifier">}</span>);
	<span class="synIdentifier">}</span>
<span class="synIdentifier">}</span>);
</pre>

			<p>Tomblooはブラウザで認証した情報をそのまま使えるのが便利ですね。</p>
			<p>別途ツールを作ったりスクリプトを書いたりすると、パスワードをどこかに保存しておかないといけなかったりして困ります。</p>
		</div>
]]></content:encoded>
	<dc:creator>zorio</dc:creator>
	<dc:date>2009-01-29T01:43:28+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/zorio/20090113/1231843433">
	<title> 今度こそTomblooからInstapaperに投稿するパッチ</title>
	<link>http://d.hatena.ne.jp/zorio/20090113/1231843433</link>
	<description> Instapaper側が仕様変更して、Tomblooから投稿できなくなっていたので修正するパッチ。 models.register(update({ name : ’Instapaper’, ICON : ’chrome://tombloo/skin/instapaper.ico’, POST_URL: ’http://www.instapaper.com/edit’, check : function(ps){ return (/(quo</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Instapaper側が仕様変更して、Tomblooから投稿できなくなっていたので修正するパッチ。</p>
<pre class="syntax-highlight">
models.register(update(<span class="synIdentifier">{</span>
	name : <span class="synConstant">'Instapaper'</span>,
	ICON : <span class="synConstant">'chrome://tombloo/skin/instapaper.ico'</span>,
	POST_URL: <span class="synConstant">'http://www.instapaper.com/edit'</span>,
	check : <span class="synIdentifier">function</span>(ps)<span class="synIdentifier">{</span>
		<span class="synStatement">return</span> (<span class="synConstant">/(quote|link)/</span>).test(ps.type);
	<span class="synIdentifier">}</span>,
	getAuthCookie : <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span>
		<span class="synStatement">return</span> getCookieString(<span class="synConstant">'www.instapaper.com'</span>, <span class="synConstant">'pfu'</span>);
	<span class="synIdentifier">}</span>,
	post : <span class="synIdentifier">function</span>(ps)<span class="synIdentifier">{</span>
		<span class="synIdentifier">var</span> url = <span class="synIdentifier">this</span>.POST_URL;
		<span class="synStatement">return</span> <span class="synIdentifier">this</span>.getSessionValue(<span class="synConstant">'form_key'</span>, <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> request(url).addCallback(<span class="synIdentifier">function</span>(res)<span class="synIdentifier">{</span>
				<span class="synIdentifier">var</span> doc = convertToHTMLDocument(res.responseText);
				<span class="synStatement">return</span> $x(<span class="synConstant">'//input[@id=&#34;form_key&#34;]/@value'</span>, doc);
			<span class="synIdentifier">}</span>);
		<span class="synIdentifier">}</span>).addCallback(<span class="synIdentifier">function</span>(session)<span class="synIdentifier">{</span>
			<span class="synStatement">return</span> request(url, <span class="synIdentifier">{</span>
				redirectionLimit: 0,
				sendContent: <span class="synIdentifier">{</span>
					<span class="synConstant">'form_key'</span>: session,
					<span class="synConstant">'bookmark[url]'</span>: ps.itemUrl,
					<span class="synConstant">'bookmark[title]'</span>: ps.item,
					<span class="synConstant">'bookmark[selection]'</span>: joinText(<span class="synIdentifier">[</span>ps.body, ps.description<span class="synIdentifier">]</span>)
				<span class="synIdentifier">}</span>
			<span class="synIdentifier">}</span>);
		<span class="synIdentifier">}</span>).addCallback(<span class="synIdentifier">function</span>(res)<span class="synIdentifier">{</span>
			<span class="synStatement">if</span>(res.channel.URI.asciiSpec.match(<span class="synConstant">'login'</span>))
				<span class="synStatement">throw</span> <span class="synStatement">new</span> Error(getMessage(<span class="synConstant">'error.notLoggedin'</span>));
		<span class="synIdentifier">}</span>);
	<span class="synIdentifier">}</span>
<span class="synIdentifier">}</span>, AbstractSessionService));
</pre>

		</div>
]]></content:encoded>
	<dc:creator>zorio</dc:creator>
	<dc:date>2009-01-13T19:43:53+09:00</dc:date>
</item>
</rdf:RDF>
