<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xml:lang="ja">
	<channel>
		<title>金利0無利息キャッシング – キャッシングできます</title>
		<link>http://subtech.g.hatena.ne.jp/mala/</link>
		<description>金利0無利息キャッシング – キャッシングできます</description>
		<dc:creator>mala</dc:creator>


		<item>
			<title>Page2FeedっていうAPIを作った件</title>
			<link>http://subtech.g.hatena.ne.jp/mala/20100203/1265186247</link>

			<description><![CDATA[
		<div class="section">
			<p><a href="http://ic.edge.jp/page2feed/" target="_blank">http://ic.edge.jp/page2feed/</a></p>
			<p>別の大きめの機能のリリース準備中なんですが、片手間に作ってみました。フレーム使ってるサイトとか今のところ動きませんが、おおむね上手く動くと思います。有志が作ってくれた野良フィード、と同程度のクオリティのものを自動で作れます。</p>
			<p>リリースが早かったので「前々から作ってたのかな」みたいな反応もいくつか見ましたが、そういうわけではないです。ただ、過去に似たようなコードを書いたことがあるのですんなり出来ました。</p>
			<p>アルゴリズムはこれに改良を加えたものです <a href="http://la.ma.la/blog/diary_200705301424.htm" target="_blank">http://la.ma.la/blog/diary_200705301424.htm</a></p>
			<p>実装開始 <a href="http://twitter.com/bulkneets/status/8240819145" target="_blank">http://twitter.com/bulkneets/status/8240819145</a></p>
			<p>リリース <a href="http://twitter.com/bulkneets/status/8358993519" target="_blank">http://twitter.com/bulkneets/status/8358993519</a></p>
			<p>twitterでフィードを吐いてないサイトのURLを募集して参考にしました。協力してくれた方に感謝します。よく考えたらなんでもRSSで購読されてるサイトを使えば良いので必要なかったかもしれない。</p>
			<p>とりあえず動くものは3時間ぐらいで出来たと思います(面接試験に調度良い)、あとは2日ぐらいかけて精度の調整をやりました。既存のサービスと何が違うの、みたいなのがFAQだと思うのでいくつか比較してみます。</p>
			<h4> <a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/livedoor">livedoor</a>専用のAPIではない</h4>
			<p>既存の似たようなサービスは沢山あると思うのですが、</p>
			<ul>
				<li> ユーザー登録が必要</li>
				<li> URLからfeedのURLが求められなかったり(サービス独自のidを付ける)</li>
				<li> なんか勝手に広告とか入ったりしそう or 有料サービスに誘導したがる</li>
				<li> アクが強い(サービスのロゴとかクレジットとかデカデカと表示する)</li>
				<li> いつサービス終了するか分からない</li>
				<li> 予告なく止まったリBANされたりしそう</li>
				<li> そもそもサービスの品質が微妙</li>
			</ul>
			<p>というような具合で、タダ乗りしても良さそうなのが無かった。タダ乗りしても良さそうなサービスはこれらと逆の条件を満たしているサービスです。既存のサービスでタダ乗りしても良さげなのがあるならリンク張って終わりというのも考えたのですが、上記と逆の条件を全て満たすようなサービスが無かったので、片手間に作れそうだしせっかくなのでこの際作っておくか、ということになりました。</p>
			<p>単体で収益挙げられるような要素が無いですけども、readerの付加価値が上がるので利益が出なくてもまあ問題ないでしょう。ラボですし。</p>
			<h4> Google Readerのと何が違うの</h4>
			<p>日本語のサイトでも変換出来ます。</p>
			<p><a href="http://googlereader.blogspot.com/2010/01/follow-changes-to-any-website.html" target="_blank">http://googlereader.blogspot.com/2010/01/follow-changes-to-any-website.html</a></p>
			<p><a href="http://blogs.itmedia.co.jp/saito/2010/01/google-reader-6.html" target="_blank">http://blogs.itmedia.co.jp/saito/2010/01/google-reader-6.html</a></p>
			<p>any websiteって言うので、なんかインパクトが大きかったみたいで「LDRにも似たような機能を希望」とか要望が飛んできた。それで作ったので、後追いといえば後追いですが、</p>
			<p><a href="http://www.google.com/support/reader/bin/answer.py?hl=en&answer=172963" target="_blank">http://www.google.com/support/reader/bin/answer.py?hl=en&amp;answer=172963</a></p>
			<p>"Currently, only English-language content in HTML format is supported."としっかり書いてあります。英語のサイトに関しても、生成されたフィードが読みやすいとは思えなかった。実際に試さないで「これはすごい」とか「これは便利」とか記事を書くのは止めませんか。</p>
			<p>現状英語のサイトにしか対応してないのを知らないで試して残念な思いをしている人がチラホラいる。</p>
			<p><a href="http://d.hatena.ne.jp/Imamura/20100202/googlereaderRSS" target="_blank">http://d.hatena.ne.jp/Imamura/20100202/googlereaderRSS</a></p>
			<p><a href="http://dullneko.typepad.com/blog/2010/02/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%89%E3%82%A2rss%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bpage2feed-api%E5%85%AC%E9%96%8B--internet-watch.html" target="_blank">http://dullneko.typepad.com/blog/2010/02/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%89%E3%82%A2rss%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bpage2feed-api%E5%85%AC%E9%96%8B--internet-watch.html</a></p>
			<p>Page2FeedはGoogle Readerでも上手く動くみたいです。独立したAPIなのでタダ乗り歓迎です</p>
			<p><a href="http://bardiche.posterous.com/bbrss" target="_blank">http://bardiche.posterous.com/bbrss</a></p>
			<h4> なんでもRSSでは無い</h4>
			<p>なんでもRSSの問題点をいくつか挙げます。</p>
			<ul>
				<li> フィードのURLと記事のURLが汚いです。</li>
				<li> フィードのURLに解析した抽出すべき要素のXPathが含まれている
				<ul>
					<li> HTMLの構造が変わると以前に生成したフィードのURLが無効になります。</li>
				</ul>
				</li>
				<li> 日付情報が含まれていないと変換出来ません。
				<ul>
					<li> 名前のインパクトは大きいですが、全てのページを変換出来るわけではないです。</li>
				</ul>
				</li>
				<li> url#guid形式の独自のPermalinkを作ります。
				<ul>
					<li> Page2Feedでは要素中にhrefかidがあるならば、なるべくそれを使います。</li>
				</ul>
				</li>
			</ul>
			<p>フィードリーダーから記事をそのまま開いたり、ソーシャルブックマークの情報を参照しやすくするために、なるべく記事のリンクを抽出します。実用性を重視してます。</p>
			<p>逆になんでもRSSとは違って日付情報を解析してないので、記事の更新時刻が正確ではありません。フィードリーダーが取得した時刻になるでしょう。</p>
			<h4> クロールして差分を記録するタイプでは無い</h4>
			<p>クロールして差分を記録するタイプ(page2rss.comやGoogle)は</p>
			<ul>
				<li> ページが更新されるまで生成されるフィードの質が確認出来ない(プレビュー出来ない)</li>
				<li> 過去のデータを蓄積しないと行けないので、ストレージが必要になる(著作権等への配慮も)</li>
			</ul>
			<p>過去記事の蓄積と新着部分の判別はRSSリーダー側に任せて、HTMLをフィードに変換する処理は切り分けてしまった方が良いだろうと判断しました。必要なのは帯域とCPUパワーなので、もしアクセスが異常に増えても対応しやすい。1世代分は保存して学習に使った方が精度が上がるかな、とは思ってます。</p>
			<h4> 本文抽出ではないです</h4>
			<p>スコアが高いのだけを出力すれば本文のみのフィードも作れるのですが、意図的に本文以外も入れています。生成されたフィードは未読管理機能があるフィードリーダーで使う前提です。本文以外の要素もフィードに入る場合がありますが、一度既読になってしまえば現れないからです。なので、例えばティッカーやFirefoxのライブブックマークには適さないでしょう。</p>
			<h4> 学習やサイトごとの定義を(今のところ)使ってません</h4>
			<p>今のところしてません。例えばサイトごとの定義を作るとメンテナンスコストがかかります。ベースとなるアルゴリズムが優秀であれば、上手くいかないサイトに対してだけパッチを作れば良いことになります。定義作るとしてもタイプ(ニュース、日記、掲示板、など)に応じて各種閾値を調整するみたいな感じになると思います。学習や人力による調整を行わなくても、デフォルト状態でとりあえず良い感じのフィードを出力するのを目的としてます。</p>
			<h4> 今後</h4>
			<p>元のコードがJavaScriptなんで今度は<a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/Perl">Perl</a>からJavaScriptに移植すれば何かと役に立つかもしれない。JS実行したDOM構築後のフィード作ったり認証が必要なページをブラウザで解析して送ったりとか。</p>
			<p>もう少し技術よりの解説を書くかもしれない。</p>
		</div>
]]></description>

			<dc:creator>mala</dc:creator>

			<pubDate>Wed, 03 Feb 2010 08:37:27 GMT</pubDate>



		</item>

		<item>
			<title>AnyEvent::Handleで永続的にコネクション張る際にメモリ食いまくり</title>
			<link>http://subtech.g.hatena.ne.jp/mala/20100114/1263458709</link>

			<description><![CDATA[
		<div class="section">
			<p>一つのAnyEvent::Handleをコネクション切らないで使いまわして、JSONRPCなんかでリクエスト送りまくったりした場合に、書き込みバッファが際限なく溜まりすぎてサイズが大きく確保されたまま500MBとかになってしまって困ったのでメモする。</p>
			<h4> 事前知識</h4>
			<ul>
				<li> 変数が使用しているメモリ使用量はDevel::Sizeなんかで確認できる。</li>
				<li> 文字列の伸び縮みではメモリは開放されない。undefされれば開放される。</li>
				<li> ただしコンパイルオプションによってはそもそも開放されない。</li>
				<li> Uusemymallocでググる
				<ul>
					<li> $Config{usemymalloc}がy =&gt; <a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/perl">perl</a>のmallocを使う。</li>
					<li> $Config{usemymalloc}がn =&gt; システムのmallocを使う。</li>
				</ul>
				</li>
				<li> 手元の環境では$Config{usemymalloc}がnで、メモリを開放してくれた。</li>
			</ul>
			<h4> AnyEvent::Handleで何とかするケース</h4>
			<p>書き込みバッファが掃けたタイミングで、新しいイベントを発火させるようにする。</p>
			<ul>
				<li> $hdl-&gt;on_drain(sub{ ... })を定義すると、wbufが掃けたタイミングでコールバックが呼ばれる。</li>
				<li> $hdl-&gt;low_water_mark($bytes)はon_drainが発火する閾値。書き込みバッファが1000KB以下になったらon_drainが呼ばれる、ということが出来る。</li>
			</ul>
			<h4> 際限なくwbufを確保してもいいけどメモリ開放して欲しいケース</h4>
			<p>AE::timerとか使って適当なタイミングでこういうコードを呼ぶ。</p>
<pre class="syntax-highlight">
<span class="synStatement">if</span>(<span class="synIdentifier">$hdl</span>-&gt;{wbuf} <span class="synStatement">eq</span> <span class="synConstant">&quot;&quot;</span>){
    <span class="synStatement">delete</span> <span class="synIdentifier">$hdl</span>-&gt;{wbuf}; <span class="synIdentifier">$hdl</span>-&gt;{wbuf}=<span class="synConstant">&quot;&quot;</span>;
}
</pre>

			<p>もしくは適当なタイミングでコネクション張りなおせば良い。ものすごい勢いで書き込んでいたらどの道メモリを食いつぶすのでオススメできない。</p>
			<h4> Coro使うケース</h4>
			<p>こういうコード挟んで書き込みイベントにwaitを入れる。wbufが8MB以上だったらsleepする。</p>
<pre class="syntax-highlight">
<span class="synStatement">while</span>(<span class="synConstant">1024</span> * <span class="synConstant">1024</span> * <span class="synConstant">8</span> &lt; <span class="synStatement">length</span> <span class="synIdentifier">$hdl</span>-&gt;{wbuf}) {
    <span class="synStatement">warn</span> <span class="synConstant">&quot;wait for write&quot;</span>;
    Coro::Timer::<span class="synStatement">sleep</span> <span class="synConstant">0.05</span>;
}
</pre>

			<h4> まとめ</h4>
			<ul>
				<li> AnyEvent::Handleで書き込みまくるときはon_drainを使うか適当にwait入れた方が良い。</li>
			</ul>

		</div>
]]></description>

			<dc:creator>mala</dc:creator>

			<pubDate>Thu, 14 Jan 2010 08:45:09 GMT</pubDate>



		</item>

		<item>
			<title>LDRの未読件数を表示するGoogle Chrome拡張機能作った</title>
			<link>http://subtech.g.hatena.ne.jp/mala/20091229/1262112751</link>

			<description><![CDATA[
		<div class="section">
			<p>誰か作ってるだろと思ってギャラリー検索したけど見つからなかったので作った。</p>
			<p><a href="https://chrome.google.com/extensions/detail/ifekfcjbnkflfndoahjigdhlhgndkncb" target="_blank">https://chrome.google.com/extensions/detail/ifekfcjbnkflfndoahjigdhlhgndkncb</a></p>
			<p>os0xさんが技評の連載のサンプルで作ってたやつの改造、あとGoogle Mail Checkerのソースなども参考にした。</p>
			<p><a href="http://gihyo.jp/dev/serial/01/chrome-extensions/0001" target="_blank">http://gihyo.jp/dev/serial/01/chrome-extensions/0001</a></p>
			<p>変更点は</p>
			<ul>
				<li> id入力 → 表示の際にスクレイピングしてlocalStorageに保存</li>
				<li> 指数表示 → Kの方が親しみやすいだろうと思ったのでKにした。10000は10K</li>
			</ul>
			<p>一方的にスクリプトを適用するのは簡単で、bookmarkletやGreasemonkeyスクリプト相当の拡張は簡単に作れそう。</p>
			<ul>
				<li> 特定URLに対してスクリプト実行はcontent_scriptで可能</li>
				<li> ブックマークレット相当のことはchrome.tabs.executeScriptで可能</li>
			</ul>
			<p>ただし、拡張側から現在表示中のタブの中身のDOMを直接参照したりは出来ないっぽかった。</p>
			<p>tabオブジェクトのプロパティからURLやtitleは取れるが、DOMは取れない。</p>
			<p><a href="http://code.google.com/chrome/extensions/tabs.html#type-Tab" target="_blank">http://code.google.com/chrome/extensions/tabs.html#type-Tab</a></p>
			<p>これはセキュリティ上の制約と言うことだろうから</p>
			<ul>
				<li> <a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/livedoor">livedoor</a> Readerのドメインにcontent_scriptを適用、メッセージ送信を受け取れるようにする。</li>
				<li> <a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/livedoor">livedoor</a> Readerを表示していたら拡張機能がメッセージを送る、content_scriptが表示中のDOMから<a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/livedoor">livedoor</a> idを取得して返す。</li>
				<li> 拡張機能がcontent_scriptからのレスポンスを受信して<a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/livedoor">livedoor</a> idをlocalStorageに保存</li>
			</ul>
			<p>と言う方法を取った。</p>
		</div>
]]></description>

			<dc:creator>mala</dc:creator>

			<pubDate>Tue, 29 Dec 2009 18:52:31 GMT</pubDate>



		</item>

		<item>
			<title>ウェブサービスにおける正しい退会ページのあり方</title>
			<link>http://subtech.g.hatena.ne.jp/mala/20091216/1260941741</link>

			<description><![CDATA[
		<div class="section">
			<h4> トークンの確認があるべき</h4>
			<ul>
				<li> いわゆるCSRF対策。</li>
				<li> サービスにログインした状態のユーザーを退会フォームにPOSTするような罠を仕込んだページに誘導するだけで退会出来てしまうから</li>
				<li> 退会ページでJavaScriptでconfirm出して「本当によろしいですか？」とか確認してもフォーム直接POSTしてしまえば意味が無い</li>
			</ul>
			<h4> パスワードの確認があるべき</h4>
			<ul>
				<li> もしサービスにXSS脆弱性があったら、そのユーザー自身に退会ページにアクセスさせて正しいトークンを含んだ正規のformを自動でsubmitできてしまうので</li>
				<li> あるいはログインされたまま放置されたPCを誰かが勝手に操作できる状態だったら、セッションが維持されている限り本人でなくても退会できてしまう</li>
			</ul>
			<h4> パスワードの入力フォームがautocomplete=offであるべき</h4>
			<ul>
				<li> ユーザーがパスワードを保存していて、サービスにXSSが存在する場合、パスワードが自動入力された退会ページのsubmitボタンを押すJavaScriptを仕込むことが出来る
				<ul>
					<li> OperaはCtrl+Enter押すまで自動入力されない(DOMで参照できない)ので無理、最初から入力された状態になるブラウザが対象</li>
				</ul>
				</li>
				<li> XSSが存在しなくても、クリックジャッキングによって(パスワードが自動入力された)退会ページを開いて退会ボタンを押すことが出来る
				<ul>
					<li> JavaScriptでconfirmを出すのはこういう攻撃に対して一定の効果があるかもしれない。</li>
				</ul>
				</li>
			</ul>
			<h4> 退会処理が500エラーを返すべき</h4>
			<ul>
				<li> 落ち着け、よく考えてから退会しろ</li>
				<li> わざわざサポート宛にメールを送って本当に退会したいと言ってくるやつだけ本当の退会ページに案内すべきだ</li>
			</ul>

		</div>
]]></description>

			<dc:creator>mala</dc:creator>

			<pubDate>Wed, 16 Dec 2009 05:35:41 GMT</pubDate>



		</item>

	</channel>
</rss>
