<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>寝る前にラーメン</title>
	<atom:link href="http://thleave.com/feed" rel="self" type="application/rss+xml" />
	<link>http://thleave.com</link>
	<description>学生エンジニアのコードに関する忘備録</description>
	<lastBuildDate>Mon, 05 Jul 2010 04:25:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>今さらだけどJSONとAjax せっかくだからJSONP with jQuery</title>
		<link>http://thleave.com/coding/318</link>
		<comments>http://thleave.com/coding/318#comments</comments>
		<pubDate>Sun, 04 Jul 2010 22:28:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=318</guid>
		<description><![CDATA[今さらだけど、「JSONPってなんだ？」って思ったのでまとめてみる。

まず、JSONとAjaxについて整理。
JSON(JavaScript Object Notation)

オブジェクトまたは配列として実現されるデ [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>今さらだけど、「JSONPってなんだ？」って思ったのでまとめてみる。</p>
<p><span id="more-318"></span></p>
<p>まず、JSONとAjaxについて整理。</p>
<h3>JSON(JavaScript Object Notation)</h3>
<ul>
<li>オブジェクトまたは配列として実現される<strong>データ記述言語</strong>。フォーマット。</li>
<li>MIMEタイプは&#8221;application/json&#8221; 拡張子は&#8221;.json&#8221;</li>
<li>（殆ど）そのままJavaScriptの配列/オブジェクトとして扱えるので便利</li>
<li>単純で軽量。パースのコストもXMLなどに比べて安い。</li>
<li>Ajaxの普及と共に注目を浴びた。</li>
</ul>
<p>（AjaxのxはXMLだけど、）今ではJSONを使っている非同期アプリケーションのが多いよね。</p>
<h3>Ajax(Asynchronous JavaScript + XML)</h3>
<ul>
<li>JavaScriptのXMLHttpRequestとXML（今はJSONが多い）を使った非同期通信</li>
<li>セキュリティーの都合のため、<strong>XMLHttpRequestはクロスドメイン間の通信は出来ない。</strong></li>
</ul>
<p>ここで、他のサイトのAPIをAjaxで触りたいとかとなってくると問題になる。<br />
解決策としては、</p>
<ol>
<li>JSONPを使う。</li>
<li>XMLHttpRequest以外で通信する</li>
</ol>
<p>があるけれど、とりあえずここではJSONPについて。</p>
<h3>JSONP(JSON with padding)</h3>
<ul>
<li>HTMLタグのscript#srcにはクロスドメイン制限がないので、それを利用して<strong>クロスドメイン間の通信を実現する手法</strong></li>
<li>予めコールバック関数を定義しておき、パラメーターにコールバックを指定し呼び出してもらう。</li>
</ul>
<p>具体的に書いてみると、<br />
[html]<br />
<script type="text/javascript src="http://crossdomain/json?callback=hoge"></script><br />
<script type="text/javascript">
function hoge(json){
alert(json.data)
}
</script><br />
[/html]<br />
みたいにすること。</p>
<h3>jQueryを用いたJSONPの実装</h3>
<p>でも、結局はjQueryを使うと簡単に出来ちゃうよ、ってお話です。</p>
<p>[javascript]<br />
// $.getJSONでも出来るみたいだけど。<br />
    $.ajax({<br />
        url: &#8220;http://crossdomain/json&#8221;,<br />
        data: {<br />
            hoge: &#8220;hogu&#8221;<br />
        },<br />
        dataType: &#8216;jsonp&#8217;, // これは固定<br />
        callback: &#8216;callbackname&#8217;, // コールバック関数を指定するためのパラメーター名<br />
        success: function(data, status){<br />
            // 何かをする<br />
        }<br />
    });<br />
[/javascript]</p>
<p>jQuery使えば、JSONPのことを知らなくてもクロスドメイン間の通信も実装できちゃいそうだね。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/318/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>私がGoogle Chromeで使っている8つの拡張機能(Google Chrome Extentions)</title>
		<link>http://thleave.com/takokuma/291</link>
		<comments>http://thleave.com/takokuma/291#comments</comments>
		<pubDate>Fri, 02 Jul 2010 22:21:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[コードと関係のない話]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Google Chrome]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=291</guid>
		<description><![CDATA[Google Chromeに魅せられて数週間。
拡張機能にも慣れてきたのでここで一度紹介してみます。

今後も使い続けるであろう拡張機能

 Smooth Gestures

誰もがいれているであろうマウスジェスチャーを [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Google Chromeに魅せられて数週間。<br />
拡張機能にも慣れてきたのでここで一度紹介してみます。</p>
<p><span id="more-291"></span></p>
<h3>今後も使い続けるであろう拡張機能</h3>
<dl>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/Smooth-Gestures1-e1278109986871.png" alt="" title="Smooth Gestures" width="30" height="30" class="alignnone size-full wp-image-301" /> <a href="https://chrome.google.com/extensions/detail/lfkgmnnajiljnolcgolmmgnecgldgeld?hl=ja">Smooth Gestures</a></dt>
<dd>
誰もがいれているであろうマウスジェスチャーを実装する拡張機能から。<br />
なぜ沢山ある中からSmooth Gesturesを選んだのかというのがポイントだと思います。</p>
<p>理由は、シンプルで使いやすく必要な機能が揃っていたということだと思います。<br />
プラスアルファとして、選択しているテキストをGoogleで検索というジェスチャーがあります。<br />
Operaを使っていた時からジェスチャーで実装していたので、これがあるのは嬉しいですし、とても便利です。</dd>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/Firebug-e1278110032110.png" alt="" title="Firebug" width="30" height="30" class="alignnone size-full wp-image-306" /> <a href="https://chrome.google.com/extensions/detail/bmagokdooijbeehmkpknfglimnifench?hl=ja">Firebug Lite for Google Chrome</a></dt>
<dd>
エンジニア、デザイナーの方ならご存知だと思いますが、Firefoxの有名有用アドオンFirebugのGC版です。<br />
機能は少ないですが、Inspect, Consoleなど基本的な機能はしっかり実装されているので、いれておいて損はないです。<br />
今後のアップデートにも期待ですね。</dd>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/rss-e1278109900190.png" alt="" title="rss" width="30" height="30" class="alignnone size-full wp-image-307" /> <a href="https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd?hl=ja">RSS Subscription Extension（by Google）</a></dt>
<dd>
フィードにワンクリックでアクセスできるようにする、Google関係者による拡張機能です。<br />
最初はデフォルトであるはずだとオプションを探してましたが、Google Chromeの場合拡張なんですね笑<br />
主要ブラウザではデフォルトとして実装されているくらいとても便利なので、これも入れて損はないと思います。<br />
あと、Google Readerとしっかり連携できるのもGoogleらしいです。</dd>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/delicious-e1278110065121.png" alt="" title="delicious" width="30" height="30" class="alignnone size-full wp-image-311" /> <a href="https://chrome.google.com/extensions/detail/lnejbeiilmbliffhdepeobjemekgdnok?hl=ja">Delicious Bookmarks Extension (Beta) </a></dt>
<dd>
ソーシャルブックマークの<a href="http://delicious.com/">Delicious</a>の拡張機能です。<br />
簡単にブックマークの追加ができます。<br />
とてもシンプルですが、タグの補完もしてくれるのでBetaですがしっかりしていると思います。<br />
通常はBookmarkletで代用してしまうような機能ですが、ページ遷移がかまない分気持ちイイですね。</dd>
</dl>
<h3>Twitter関連</h3>
<dl>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/reactions-e1278110111838.png" alt="" title="reactions" width="30" height="30" class="alignnone size-full wp-image-312" /> <a href="https://chrome.google.com/extensions/detail/ebipjbfcgphjbnkhbijmnpnpcgjolked?hl=ja">Twitter Reactions</a></dt>
<dd>
Twitterを使った拡張機能です。<br />
それもユニークな拡張機能で、開いているウェブページに関係するツイートを表示します。<br />
開いているウェブについて、どんなディスカッションがされいるかすぐ分かってしまいます。<br />
これからもっと流行りそうな気がしますが、どうでしょうか。</dd>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/extender.png" alt="" title="extender" width="32" height="32" class="alignnone size-full wp-image-313" /> <a href="https://chrome.google.com/extensions/detail/ddcgpjemdlhkehjpibldielpoodpjgjc?hl=ja">Twitter Extender</a></dt>
<dd>
同じくTwitterの拡張機能です。<br />
TL上に「コメント付Retweet」や「DM」などのボタンを追加するシンプルな拡張機能です。<br />
Google Chromeにはまだまだ洗練されたTwitterクライアントがないので、（今後出るかも分かりませんし、）<br />
ウェブに機能を追加する形の方がシンプルで良いかなと思ったので導入しました。<br />
特に「コメント付Retweet」をワンクリックでできるのは良いですね。</dd>
</dl>
<h3>おまけ的なツール</h3>
<dl>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/url_shorten-e1278110163901.png" alt="" title="url_shorten" width="30" height="30" class="alignnone size-full wp-image-314" /> <a href="https://chrome.google.com/extensions/detail/iblijlcdoidgdpfknkckljiocdbnlagk?hl=ja">goo.gl URL Shortener</a></dt>
<dd>
ちょっとしたツールです。<br />
URL短縮をワンクリックで、またクリップボードにコピーまでしてくれます。<br />
こういうシンプルなのが好きなのです。</dd>
<dt><img src="http://thleave.com/wordpress/wp-content/uploads/2010/07/javadoc-e1278110193722.png" alt="" title="javadoc" width="30" height="30" class="alignnone size-full wp-image-315" /> <a href="https://chrome.google.com/extensions/detail/mfgkihmpcjjnijmkchojlbccbmhcdfcd?hl=ja">Javadoc Search Frame</a></dt>
<dd>
Javadocをよく見る人には共感してくれそうな拡張機能です。<br />
ウェブ上にあるJavadocは情報量がとても多くて参考になるのですが、絞り込むのに毎回苦労をします。<br />
そこにインクリメンタルサーチを実装してくれるという、これまたシンプル且つ有用な拡張機能です。<br />
ただこれに限っては、まだがっつり使ってないので使用感まではちょっと分からないです <img src='http://thleave.com/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /><br />
でもきっと便利！ということで紹介しました。</dd>
</dl>
<p>以上ですー！</p>
<p>Google Chromeは拡張機能が実装されて間もないのに、こんなに多くのExtentionsが出てきててびっくりですね。<br />
今後とも注目したいです。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/takokuma/291/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDOStatement-&gt;fetchのループ中でクエリーを発行できない</title>
		<link>http://thleave.com/coding/282</link>
		<comments>http://thleave.com/coding/282#comments</comments>
		<pubDate>Tue, 22 Jun 2010 18:52:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=282</guid>
		<description><![CDATA[PDOStatement->fetchによるループの中で、さらにクエリーを発行できないよってメモ。

コード例。
[php]
while(($row = $pdo->fetch()) !== false){
	$id = [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>PDOStatement->fetchによるループの中で、さらにクエリーを発行できないよってメモ。</p>
<p><span id="more-282"></span></p>
<p>コード例。</p>
<p>[php]<br />
while(($row = $pdo->fetch()) !== false){<br />
	$id = $row['id'];<br />
	$address = $row['address'];</p>
<p>	$log->debug(&#8220;id=$id, address=$address&#8221;);</p>
<p>	$loc = $gm->get_locations(array(&#8216;address&#8217; => $address));<br />
	if ($loc == 0) {<br />
		$log->fatal(&#8220;google response some error.&#8221;);<br />
		break;<br />
	} elseif ($loc == 1) {<br />
		$log->error(&#8220;status=OVER_QUERY_LIMIT&#8221;);<br />
		break;<br />
	}<br />
	$log->debug(&#8220;lat={$loc['lat']}, lng={$loc['lng']}&#8221;);</p>
<p>	$station = $hr->get_stations($loc);<br />
	$stationName = $station['name'];<br />
	$lineName = $station['line'];</p>
<p>	$log->debug(&#8220;station=$stationName, line=$lineName&#8221;);</p>
<p>	$query = &#8220;UPDATE joboffer SET station_name = &#8216;$stationName&#8217;, line_name = &#8216;$lineName&#8217;, latitude = {$loc['lat']}, longitude = {$loc['lng']} WHERE id = $id&#8221;;<br />
	$pdo->exec($query);</p>
<p>	$log->debug($query);</p>
<p>	$affected++;</p>
<p>	sleep($interval);</p>
<p>	break;<br />
}<br />
[/php]</p>
<p>要するに、fetchの途中に更にクエリーを発行することは出来ませんという仕様。</p>
<p>改善するには、</p>
<ul>
<li>fetchAll()してしまう。<br />
（いや、メモリーが・・・）</li>
<li>fetchでループをせずに、idをfor文でまわすなどして逃げる</li>
</ul>
<p>くらいしか思いつかない。<br />
良い回避策、改善策はないんでしょうか。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/282/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakephpでURL書き換えつつPagenation（ページング）</title>
		<link>http://thleave.com/works/277</link>
		<comments>http://thleave.com/works/277#comments</comments>
		<pubDate>Thu, 03 Jun 2010 18:05:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[お仕事]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=277</guid>
		<description><![CDATA[CakephpのPagenatorヘルパーを使ってページングを実装する話。
ただ、URLはデフォルトのものじゃなくて、自由にやりたいんだけど？という制約。

Pagenatorの基本的な使い方
なんだかんだ言って公式が一 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>CakephpのPagenatorヘルパーを使ってページングを実装する話。<br />
ただ、URLはデフォルトのものじゃなくて、自由にやりたいんだけど？という制約。</p>
<p><span id="more-277"></span></p>
<h3>Pagenatorの基本的な使い方</h3>
<p>なんだかんだ言って公式が一番わかり易い気がする。<br />
<a href="http://book.cakephp.org/ja/view/164/Pagination">4.9 ページ付け(Pagination)</a></p>
<p>ダイナミックな検索を実装するときには、検索条件をなんらかの方法で保持しないといけない。<br />
(Pagenatorは自動でそこまではやってくれない)</p>
<p>例えば、<br />
[php]<br />
$options = array(<br />
	&#8216;conditions&#8217; => array(<br />
		&#8216;Joboffer.industry_id&#8217; => $id,<br />
		&#8216;Joboffer.is_deleted&#8217; => &#8217;0&#8242;,<br />
	)<br />
);<br />
$this->Session->write(&#8216;options&#8217;, $options);</p>
<p>[/php]</p>
<p>とかってやってた。</p>
<p>CakePHPのセッションは配列やオブジェクトもそのまま保存できる。<br />
いちいちシリアライズする必要がない。<br />
（標準でもできたっけ？）</p>
<p>ある程度固定ならメンバに書いて、一部変更でも良い。</p>
<p>[php]<br />
	public $paginate = array(<br />
		&#8216;Joboffer&#8217; => array(<br />
			&#8216;limit&#8217;	=> 20,<br />
			&#8216;order&#8217;	=> array(&#8216;Joboffer.regist_date&#8217; => &#8216;desc&#8217;, &#8216;Joboffer.id&#8217;),<br />
			&#8216;conditions&#8217; => array(&#8216;Joboffer.is_deleted&#8217; => &#8217;0&#8242;),<br />
		),<br />
	);<br />
[/php]</p>
<h3>Routesを使って、URLを書き換える</h3>
<p>普段だとmod_rewriteを使う場面。<br />
CakePHPはリクエストされるURLをすべて一度受け取って、<br />
それからディスパッチしてるのでその際のルールを書き換えるだけでOK</p>
<p><a href="http://book.cakephp.org/ja/view/46/Routes-Configuration">3.4.5 Routesの設定</a></p>
<p>制約やルールを簡単に書くと、</p>
<ul>
<li>Routesで指定した変数は$this->paramsに入る。</li>
<li>prefixをつけたい場合は、そのまま書くだけ</li>
<li>但しsuffixをつけたい場合は書くだけでは出来ない。<br/><a href="http://book.cakephp.org/ja/view/46/Routes-Configuration#File-extensions-853">3.4.5.7 File extensions</a>を読む。ここで対応できない部分はたぶんできない。</li>
<li>/:someparam_:someparam/のような書き方はできない。<br/>ひとつのディレクトリーに１変数まで。</li>
</ul>
<p>知らないと意外にハマる。</p>
<h3>PagenatorとRoutesの連携</h3>
<p>一緒になると非常にややこしい。</p>
<p>基本的には別々に設定すれば良い。<br />
ただし、ページ数までカスタムURLの中に含めようとすると頭がいたくなる。</p>
<p>どういうことかというと、以下のように適当にURLを書き換えて、<br />
そのページでページングするなら簡単に出来る。<br />
[php]<br />
	Router::connect(&#8216;/job/:id&#8217;, array(<br />
		&#8216;controller&#8217; => &#8216;job&#8217;,<br />
		&#8216;action&#8217; => &#8216;get&#8217;<br />
	), array(<br />
		&#8216;id&#8217;	=> &#8216;[0-9]+&#8217;,<br />
	));<br />
[/php]</p>
<p>/job/:id/page:2みたいになるはず。</p>
<p>ただ、以下のようになると話が違ってくる。</p>
<p>[php]<br />
	Router::connect(&#8216;/search_:page&#8217;,array(<br />
		&#8216;controller&#8217; => &#8216;search&#8217;,<br />
		&#8216;action&#8217; => &#8216;index&#8217;<br />
	), array(<br />
		&#8216;page&#8217;=> &#8216;[0-9]+&#8217;,<br />
	));<br />
[/php]</p>
<p>search_2.htm のようなURLを作りたいということ。<br />
普通だったらこういうことはもう不要なんだけどね。</p>
<p>実は公式には書いてないんだけど、Pagenatorでリンクを生成する関数を辿っていくと、router.phpに行き着く。<br />
なので、Routesでしっかり設定しておくと、自動的にそのURLでページングされるようになるわけ！ここはもうマジック。</p>
<p>但しマジックなので、コツがいります。</p>
<ul>
<li>router.phpではとても厳しい基準でマッチングをしている。<br />
本当に書き換えるべきURLなのか？分かりやすく正確にRoutesに設定し、Pagenatorで指定する必要がある。<br />
具体的に言うとURLだけでなくパラメーターまで見る。</li>
<li>router.phpのリンク生成の関数までパラメーターを渡すことができる。<br />
viewの関数の引数で、option['url']に配列で渡すと最後まで届く。</li>
</ul>
<p>例を交えて説明します。</p>
<p>まず、<strong>router.phpではとても厳しい基準でマッチングをしている。</strong>という点。<br />
当然なんですが、結構ハマります。</p>
<p>URLだけがマッチしていれば（他に曖昧なものがなければ）、書き換えてくれそうなものですが、<br />
router.phpは指定したパラメーターまで見てくれます。</p>
<p>具体的に説明すると、<br />
[php]<br />
	Router::connect(&#8216;/hogehoge/area_:pref/:page&#8217;, array(<br />
		&#8216;controller&#8217; => &#8216;hogehoge&#8217;,<br />
		&#8216;action&#8217; => &#8216;area&#8217;<br />
	), array(<br />
		&#8216;pref&#8217;	=> &#8216;[0-9]+&#8217;,<br />
		&#8216;page&#8217;	=> &#8216;[0-9]+&#8217;,<br />
	));<br />
[/php]<br />
とした場合、パラメーターがprefとpageとあるわけです。<br />
pageは自動的にPagenatorから渡されますが、<br />
prefは手動で渡してあげないとrouter.phpは気づいてくれません。</p>
<p>ここで次のポイントが生きてきます。<br />
<strong>router.phpのリンク生成の関数までパラメーターを渡すことができる。</strong></p>
<p>router.phpではパラメーターまで見るので、そこまで値が渡せなければいけません。<br />
ただ、普通にoptionに書いたのでは途中で切り捨てられ、届きません。</p>
<p>どうやるかというと、<br />
[php]<br />
$paginator->prev(&#8216;前の20件を表示&#8217;, array(&#8216;url&#8217; => array(&#8216;ext&#8217; => &#8216;htm&#8217;, &#8216;pref&#8217; => $pref_id)));<br />
[/php]<br />
のように、optionのurlに指定してあげます。</p>
<p>この例だと上のようにviewで指定すれば、ちゃんとURLが書き換えられてページングが出来ます。<br />
ややこしいね。</p>
<p>興味がある方は/libs/view/helpers/paginator.phpを読んで、<br />
router.phpまで辿ってみると理解が深まると思います。</p>
<p>ちょっとソースもややこしいので、もっと整理されて分かりやすく使いやすくなればいいなぁと思いました。<br />
それでも標準でここまで出来ることが素晴らしいので、改めてCakePHPのパワーを感じる結果になりました。</p>
<p>ご参考になれば。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/works/277/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Code Jam 2010 Round1B</title>
		<link>http://thleave.com/contests/271</link>
		<comments>http://thleave.com/contests/271#comments</comments>
		<pubDate>Tue, 25 May 2010 06:36:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[プログラミングコンテスト]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[CodeJam]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=271</guid>
		<description><![CDATA[1Aは寝坊しました！
最近実務ばかりで、PHPしか書いてないから最初戸惑ったが、、、Javaバンザイ。
Google Code Jam 2010 is in Dublin!
http://code.google.com/ [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>1Aは寝坊しました！<br />
最近実務ばかりで、PHPしか書いてないから最初戸惑ったが、、、Javaバンザイ。</p>
<p><strong>Google Code Jam 2010 is in Dublin!</strong><br />
<a href="http://code.google.com/codejam">http://code.google.com/codejam</a></p>
<p><span id="more-271"></span></p>
<h3>File Fix-it</h3>
<p>Unixのディレクトリー構造。知ってることが問題だと楽。<br />
mkdirの-pオブションをつけずにディレクトリーを作っていく場合の手数を出す。<br />
Largeでもmax(N)=max(M)=100なので、JavaならばHashSetですぐ。</p>
<h3>Picking Up Chicks</h3>
<p>最初問題の意味がさっぱり分からなかった。<br />
チキンをどうするんだ！チキンを！</p>
<p>相当悩む。テストケース見て意味を探る。<br />
Kの意味の理解に苦しんだ。<br />
最低限スワップする数？？や、この数だけチキンが来ればいいんだ！（ここでアハ体験）<br />
（ここで30分以上かかった）</p>
<p>問題の解釈。</p>
<ul>
<li>（スワップしなければ）並び順通りにゴールしていく！入力が優しい。</li>
<li>順に見ていくうちに時間過ぎたら、それ以降の奴らはスワップしない限り間に合わない</li>
<li>（それでもKに満たないならば、）後ろにいる時間内にゴールできるやつを前に出す。<br />
抜いた分だけがコスト</li>
<li>後ろまでみてKに満たないならばそれはミッションインポッシブル！</li>
</ul>
<p>ここからは書くだけ。<br />
スワップを何で実装しようか迷ったけど、せっかくJavaなんだからLinkedList使うことにした。<br />
[java]<br />
LinkedList<Double> time = new LinkedList<Double>();<br />
// 先頭に追加<br />
time.addFirst(t);<br />
// jに追加<br />
time.add(j, target);<br />
// jを削除<br />
time.remove(j);<br />
[/java]<br />
なんてらくちんな。</p>
<h3>Your Rank is Pure</h3>
<p>やー、全く問題の意味がわからなかった。<br />
なにこれ？<br />
サンプルも２つしか載ってないし。<br />
まだ１時間以上残ってたけど全く解ける気がしなかった。</p>
<p>30分切ったくらいで諦める。2問解いて56pだしいけるんじゃない？って。<br />
したら、みんなsmallはどんどん解いていく。。。どこをどう解釈したら？？</p>
<p>それでも解けないでモヤモヤしてたら終了！その時点で1070位前後。あー。<br />
largeでどれだけ落ちるかと期待したけれど、結果1010位！あと9人！！あと1分ちょい早ければ！！！</p>
<p>これはすげーへこんだ。。<br />
なので、次の日あるのにチャンピオンズリーグを見てしまいましたとさ！<br />
（この終了時間は絶対CL決勝を意識したんだろう！と思ってしまう笑）</p>
<p>1Cは出られなかったので、これで今年のGCJは終わり。<br />
来年また頑張ります。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/contests/271/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not only SQL(NoSQL)という考え方</title>
		<link>http://thleave.com/coding/267</link>
		<comments>http://thleave.com/coding/267#comments</comments>
		<pubDate>Thu, 13 May 2010 16:02:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Cassandra]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=267</guid>
		<description><![CDATA[内定先の会社の社員の方に面談をして頂きました。
といっても、世間話に近い面談だったんでリラックスしてのぞめました。
その中でCassandraというDBMSについての話が出てきたので、
帰ってから調べてみた次第です。

 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>内定先の会社の社員の方に面談をして頂きました。<br />
といっても、世間話に近い面談だったんでリラックスしてのぞめました。</p>
<p>その中でCassandraというDBMSについての話が出てきたので、<br />
帰ってから調べてみた次第です。</p>
<p><span id="more-267"></span></p>
<p>CassandraというのはOSSのDBMSなんですが、<br />
いままでのいわゆるSQLを使うタイプのDBMSではなかったんです。</p>
<h3>特徴</h3>
<ul>
<li>SQLを使わない、いわゆるNoSQL(=Not only SQL)に分類</li>
<li>元GoogleでMysqlチームを率いていた人がFacebookに来て作った。(2008)</li>
<li>2010年2月にApacheのトップレベルプロジェクトになったばかり。</li>
<li>インデックスなどの概念は無い（？）が、常にソートされて返される。</li>
</ul>
<h3>使い方</h3>
<p>インストールとかは公式を見るとして。</p>
<p>大きさ順に表すと。</p>
<ul>
<li>Keyspace ≒ データベース</li>
<li>Column Family ≒ テーブル</li>
<li>Column(name, value, timestampを持つ)</li>
</ul>
<p>みたいな。</p>
<p>最小単位のColumnは、<br />
[javascript]<br />
{<br />
  &#8220;name&#8221;: &#8220;emailAddress&#8221;,<br />
  &#8220;value&#8221;: &#8220;foo@bar.com&#8221;,<br />
  &#8220;timestamp&#8221;: 123456789<br />
}<br />
[/javascript]<br />
みたいな感じ。</p>
<p>今までのRDBMSではSQLで問い合わせていたのが、keyで問い合わせるようになる模様。<br />
使う機会があればまた詳しく書きます。</p>
<p>Apache Cassandra Project<br />
<a href="http://cassandra.apache.org/">http://cassandra.apache.org/</a></p>
<p>Apache Cassandra Wiki(JP)<br />
<a href="http://wiki.apache.org/cassandra/FrontPage_JP">http://wiki.apache.org/cassandra/FrontPage_JP</a></p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/267/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>漸近的計算量と計算時間の相関</title>
		<link>http://thleave.com/coding/256</link>
		<comments>http://thleave.com/coding/256#comments</comments>
		<pubDate>Tue, 11 May 2010 15:06:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=256</guid>
		<description><![CDATA[GoogleCodeJamのQualificationに参加してみて、
どのくらいまでのオーダーの計算量ならコンテスト中に処理できるのか
気になったので簡単なプログラムを作って計測してみました。

テストに使ったのはこん [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>GoogleCodeJamのQualificationに参加してみて、<br />
どのくらいまでのオーダーの計算量ならコンテスト中に処理できるのか<br />
気になったので簡単なプログラムを作って計測してみました。</p>
<p><span id="more-256"></span></p>
<p>テストに使ったのはこんなコード。<br />
ぐちゃぐちゃだけど気にしないで！<br />
[java]<br />
	public static void main(String[] args) {<br />
		for (int order = 1; order <= 15; order++) {<br />
			long start = System.currentTimeMillis();<br />
			long temp = 0;<br />
			long end = (long) Math.pow(10, order);<br />
			for (long i = 0; i < end; i++) {<br />
				if (i % 2 == 0) {<br />
					temp -= i;<br />
				} else {<br />
					temp += i;<br />
				}<br />
			}</p>
<p>			long diff = System.currentTimeMillis() - start;<br />
			System.out.printf("O(10^%d) %d:%02d.%04d\n", order, diff / 1000 / 60, diff / 1000 % 60, diff % 1000);<br />
		}</p>
<p>	}<br />
[/java]</p>
<p>以下が出力結果ですー！</p>
<p>[text]<br />
O(10^1) 0:00.0000<br />
O(10^2) 0:00.0000<br />
O(10^3) 0:00.0000<br />
O(10^4) 0:00.0000<br />
O(10^5) 0:00.0000<br />
O(10^6) 0:00.0026<br />
O(10^7) 0:00.0438<br />
O(10^8) 0:04.0543<br />
O(10^9) 0:46.0106<br />
O(10^10) 7:43.0682<br />
[/text]</p>
<ul>
<li>O(10^7)までは計算量と時間に一応の相関関係はみえる。一応の。</li>
<li>O(10^8)までがコンテストなら許容範囲かな？</li>
<li>O(10^8)からは計算量と時間にはっきりと比例関係がみえる。</li>
<li>O(10^5)まではミリ秒単位でもゼロ！改めてコンピュータの計算力って凄いね。</li>
</ul>
<p>コンパイラのバージョンはjdk1.6でした。<br />
もちろん計測するコンピュータによって結果が変わってくると思うので参考程度に使ってください。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/256/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GoogleCodeJam2010 Qualification に参加しました。</title>
		<link>http://thleave.com/contests/253</link>
		<comments>http://thleave.com/contests/253#comments</comments>
		<pubDate>Sun, 09 May 2010 09:28:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[プログラミングコンテスト]]></category>
		<category><![CDATA[CodeJam]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=253</guid>
		<description><![CDATA[先日開催されたGCJ2010のオンライン予選に参加しました。
ここんところ就活漬けで、コンテスト系のコードにはあまり触れられてなかったんですが、
自分にしてはまずまずの出来だったと思います。

結果から先に言うと、
(s [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>先日開催されたGCJ2010のオンライン予選に参加しました。<br />
ここんところ就活漬けで、コンテスト系のコードにはあまり触れられてなかったんですが、<br />
自分にしてはまずまずの出来だったと思います。</p>
<p><span id="more-253"></span></p>
<p>結果から先に言うと、<br />
(small,large)<br />
A (o,o) +33p<br />
B (x,x)<br />
C (o,x) +10p<br />
43p<br />
で、5809位でした。</p>
<h3>A, Snapper Chain</h3>
<p>問題文を解読するのに時間がかかった。<br />
解読し終わった後に最終的に式に落とし込めそうな気がしたので、<br />
ちょっとずつ共通項をあぶり出していった。</p>
<p>まず、Nに対する手数は固定で、max(N)=30だったので、先に計算して辞書でOK<br />
加えて、電気が付いている状態というのは、コストとほぼ同義。<br />
一度点いたあとはスナッパーが全部OFFになるので、その後は１を挟んで繰り返し。</p>
<p>[java]<br />
	public SnapperChain(Scanner sc, PrintStream ps){<br />
		int[] dic = new int[31];<br />
		dic[1] = 1;<br />
		dic[2] = 3;<br />
		for (int i = 3; i <= 30; i++) {<br />
			dic[i] = (dic[i - 1] - dic[i - 2]) * 2 + dic[i - 1];<br />
		}</p>
<p>		int T = sc.nextInt();<br />
		for (int i = 1; i <= T; i++) {<br />
			int N = sc.nextInt();<br />
			int K = sc.nextInt();<br />
			int cost = dic[N];</p>
<p>			while(true) {<br />
				K -= cost;<br />
				if (K <= 0) break;<br />
				K--;<br />
			}</p>
<p>			if (K == 0) {<br />
				ps.println("Case #"+i+": "+"ON");<br />
			} else {<br />
				ps.println("Case #"+i+": "+"OFF");<br />
			}<br />
		}</p>
<p>		ps.close();<br />
	}<br />
[/java]</p>
<h3>B, Fair Warning</h3>
<p>集中力がきれていて、もうさっぱりわからなかった。<br />
ひとまず、BigInteger使ってひたすら枝刈りした方針は合っているんだろうか？<br />
smallすら通らなかった。</p>
<p>解法は後で読みます。</p>
<p>http://code.google.com/codejam/contest/dashboard?c=433101#s=a&#038;a=1</p>
<h3>C, Theme Park</h3>
<p>smallは問題文の通りコードに起こすだけなので、small正答率も一番高かった模様。<br />
けど、largeはそう簡単には通らないよね。<br />
つい面倒くさくなってすぐlargeやったら通りませんでした。反省してます。</p>
<p>これも後で解法読んで書き直します。</p>
<p>http://code.google.com/codejam/contest/dashboard?c=433101#s=a&#038;a=2</p>
<p>[java]<br />
	public ThemePark(Scanner sc, PrintStream ps) {<br />
		int T = sc.nextInt();<br />
		for (int i = 0; i < T; i++) {<br />
			int R = sc.nextInt();<br />
			int K = sc.nextInt();<br />
			int N = sc.nextInt();</p>
<p>			int[] group = new int[N];<br />
			for (int j = 0; j < N; j++) {<br />
				group[j] = sc.nextInt();<br />
			}</p>
<p>			long res = 0;<br />
			int index = 0;<br />
			int startIndex = 0;<br />
			for (int j = 0; j < R; j++) {<br />
				startIndex = index;<br />
				int k = K;<br />
				while (true) {<br />
					if (k >= group[index]) k -= group[index++];<br />
					else break;<br />
					if (index == N) index = 0;<br />
					if (startIndex == index) break;<br />
				}<br />
				res += K &#8211; k;<br />
			}</p>
<p>			ps.println(&#8220;Case #&#8221;+(i+1)+&#8221;: &#8220;+res);<br />
			System.out.println(&#8220;Case #&#8221;+(i+1)+&#8221;: &#8220;+res);<br />
		}<br />
		ps.close();<br />
	}<br />
[/java]</p>
<h3>Result</h3>
<p>予選は通過できたのは良いこと。<br />
だけど、6000位近いポジションじゃぁ次で落ちるなあ。</p>
<p>もっと頭柔らかくして、しっかり準備して次にのぞもうと思います。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/contests/253/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysqlで流動的な200,000件強のレコードをフリーワード検索</title>
		<link>http://thleave.com/coding/244</link>
		<comments>http://thleave.com/coding/244#comments</comments>
		<pubDate>Sat, 01 May 2010 15:44:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=244</guid>
		<description><![CDATA[就活などの影響で久しぶりの更新。
表題の機能を実装しようと思いいろいろ調べてみる。

この案件のデータは日々変化する。
5,000件/day
つまり、25,000件/week(weekday)
となると、100,000件 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>就活などの影響で久しぶりの更新。</p>
<p>表題の機能を実装しようと思いいろいろ調べてみる。</p>
<p><span id="more-244"></span></p>
<h3>この案件のデータは日々変化する。</h3>
<p>5,000件/day<br />
つまり、25,000件/week(weekday)<br />
となると、100,000件/month</p>
<p>常に200,000件+を推移</p>
<h3>データベースを早くするために</h3>
<p>既知のことですが、改めてTEXT, BLOB, VARCHARなどの型はあまり良くない。<br />
デフラグが効果的？<br />
<a href="http://dev.mysql.com/doc/refman/4.1/ja/dynamic-format.html">7.1.2.2. 動的テーブルの特性</a><br />
<a href="http://www.phppro.jp/news/362">MySQLのクエリを最適化する10のTips</a></p>
<h3>Mysql標準組み込みのソリューション</h3>
<p>初めて知った。<br />
<a href="http://dev.mysql.com/doc/refman/4.1/ja/fulltext-search.html">6.8. MySQL 全文検索</a><br />
<a href="http://www.tatamilab.jp/rnd/archives/000389.html#a">MySQLで全文検索 &#8211; FULLTEXTインデックスの基礎知識</a><br />
<a href="http://www.tatamilab.jp/rnd/archives/000390.html">MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について</a></p>
<p>たたみラボさんの情報がやばい。</p>
<p>でも、デメリットとして、<br />
・INSERT, UPDATEのクエリーが遅くなる。<br />
データの流動性が高いアプリケーションだけに難しいなあ。</p>
<h3>全文検索エンジンというソリューション</h3>
<p>有名どころ。<br />
<a href="http://qwik.jp/senna/FrontPageJ.html">Senna(未来検索ブラジル)</a><br />
<a href="http://www.namazu.org/">Namazu</a></p>
<p>ちなみに、Googleってどうなってるんだろう？<br />
GAE使うと利用出来るのかな。<a href="http://ja.wikipedia.org/wiki/BigTable">BigTable</a>とかどうなんだろう。</p>
<h3>いまのところの方針</h3>
<p>N-gramやるのはかなり面倒だが、<br />
LIKE検索を使うより時間のオーダーが変わるくらい速度に差が出る。<br />
<strong>20万強規模なのでLIKE検索は論外</strong>。</p>
<p>N-gramならインサート時にしっかりやれば、<br />
あとは早いので問題は無いのかもしれない。</p>
<p>もうちょっと考えてみるけど、<br />
コンパイルしなおす必要がなくてこれだけの速度が出るならとても魅力的だね。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/244/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ネットが進化して情報が手に入りやすくなったことで生まれた弊害</title>
		<link>http://thleave.com/takokuma/240</link>
		<comments>http://thleave.com/takokuma/240#comments</comments>
		<pubDate>Mon, 22 Mar 2010 16:56:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[コードと関係のない話]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=240</guid>
		<description><![CDATA[風邪が治らないので、ひたすら家でネットサーフィン。
また他エントリーからの引用です。
とあるファッションブロガーのぼやき
いいなあと思って。


 ｢ITとネットの進化によって将棋の世界に起きた最大の変化は、将棋が強くな [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>風邪が治らないので、ひたすら家でネットサーフィン。<br />
また他エントリーからの引用です。</p>
<p><a href="http://taf5686.269g.net/article/15292619.html">とあるファッションブロガーのぼやき</a></p>
<p>いいなあと思って。</p>
<p><span id="more-240"></span></p>
<blockquote><p>
 ｢ITとネットの進化によって将棋の世界に起きた最大の変化は、将棋が強くなるための高速道路が一気にしかれたということです。でも高速道路を走りぬけた先では大渋滞が起きています｣<br />
古いですが、『WEB進化論』で印象に残っている羽生さんの言葉です。これって、ファッションにも当てはまるのではないのかなと最近よく思います。
</p></blockquote>
<p>羽生さんがこんなことおっしゃってたんですね。<br />
確かにネットの進化によって情報の広がるスピードのオーダーがあがりました。<br />
それによって、大衆にうける、つまりは無難なものを見つけるのが容易くなったということなんでしょうか。<br />
独り目立つよりも、群れるのが好きな人が多い日本人にはきっと特に。</p>
<p>就職活動をしてても感じます。当たり障りのないことを喋る人が多いなあって。<br />
これもネットの弊害かもしれませんね。（というより情報化社会の弊害というべきでしょうか）<br />
もちろんそれも個人のスキルですが、面白みがないし、個性は埋れたまま出てこない。</p>
<p>コーヒー業界もそうです。<br />
ネットでおいしいコーヒーで検索すれば、評判の良い銘柄やお店がすぐに分かります。<br />
星やレートで評価されたランキングで、生産地や採れた時期、精製法が全く違うコーヒーがさも同じように扱われ、大衆に好まれる味のコーヒーが上位に格付けされます。</p>
<p>誤解がないように言えば、ネットで扱われることは決して悪いことではないのです。<br />
それをきっかけにして頂ければ、その豆を育てた人も報われると思います。<br />
ただ、コーヒーはあくまで嗜好品であり、日本で流通しているだけでも数え切れないほどの種類のコーヒー豆があります。<br />
だから是非、その中から自分の舌に合うコーヒーを探すのを楽しんで欲しいのです。</p>
<p>例えば、コーヒーの中にはお湯を注ぐ前からとても独特な香りがして、ミルクとは到底合わないコーヒーもあります。<br />
しかし、それはコーヒー通に珍重され、ベリーを使ったお菓子驚くほど合うコーヒーであったりもします。<br />
そんな発見を楽しむのが嗜好品なんじゃないかなあと私は思います。<br />
カッコいいからって理由でタバコをすうのは、（法律違反ですけど）さすがに高校生で終わりですよね。</p>
<p>日常で扱える情報量が増えて便利になりましたが、人の個性の平坦化も同時に起きている私は感じます。<br />
情報もあくまでツールです。<br />
（参考程度に）うまく活用していきたいですね。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/takokuma/240/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
