<?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>寝る前にラーメン &#187; Coding</title>
	<atom:link href="http://thleave.com/category/coding/feed" rel="self" type="application/rss+xml" />
	<link>http://thleave.com</link>
	<description>学生エンジニアのコードに関する忘備録</description>
	<lastBuildDate>Mon, 30 Aug 2010 15:41:01 +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>mMeasureよりか簡単に導入できるサーバー監視ソフトウェアmunin</title>
		<link>http://thleave.com/coding/345</link>
		<comments>http://thleave.com/coding/345#comments</comments>
		<pubDate>Mon, 30 Aug 2010 15:41:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[munin]]></category>
		<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=345</guid>
		<description><![CDATA[前にmMeasureに関するエントリーを書いたんですが、
その後に見つけたmuninはインストールも簡単で高機能でいいです。

GIGAZINE読んで知りました。
MRTGよりお手軽に負荷やトラフィックをグラフ化できる「 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>前に<a href="http://thleave.com/works/342">mMeasureに関するエントリー</a>を書いたんですが、<br />
その後に見つけた<a href="http://munin-monitoring.org/">munin</a>はインストールも簡単で高機能でいいです。</p>
<p><span id="more-345"></span></p>
<p>GIGAZINE読んで知りました。<br />
<a href="http://gigazine.net/index.php?/news/comments/20060904_munin/">MRTGよりお手軽に負荷やトラフィックをグラフ化できる「Munin」</a></p>
<p>インストールの仕方もちゃんと書いてあったので、あっさり導入できました。<br />
yumでいれたらApache周りも勝手に設定されるので、とても簡単。</p>
<p>ただ、MysqlについてはmMeasureの方が詳しく解説してくれるし、<br />
チューニングのアドバイスもしてくれるのでそこはmuninにはない長所だと思います。</p>
<p>対して、muninはMysqlだけじゃなくてApacheやSystem、ネットワークまでグラフ化できるので、<br />
守備範囲はとても広いです。</p>
<p>mMeasureはMysqlチューニング用、muninは運用時の監視用って感じですかね。<br />
muninはプラグインで機能を追加できるので、知識がつけばmuninだけでいけそうな気もします。</p>
<p>Munin &#8211; Trac<br />
<a href="http://munin-monitoring.org/">http://munin-monitoring.org/</a></p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/345/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>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>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>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>幅優先探索をJavaを使って覚える</title>
		<link>http://thleave.com/coding/218</link>
		<comments>http://thleave.com/coding/218#comments</comments>
		<pubDate>Sat, 16 Jan 2010 16:59:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=218</guid>
		<description><![CDATA[下らない内容だなぁと思い人もたくさんいるかと思いますが、
自分は今まで幅優先探索が苦手で敬遠してきました！(笑
そんなお仲間がいらっしゃればご参考になればと。
この記事はそれ以上でもそれ以下でもございません。

まず、き [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>下らない内容だなぁと思い人もたくさんいるかと思いますが、<br />
自分は今まで幅優先探索が苦手で敬遠してきました！(笑</p>
<p>そんなお仲間がいらっしゃればご参考になればと。<br />
この記事はそれ以上でもそれ以下でもございません。</p>
<p><span id="more-218"></span></p>
<p>まず、きっかけです。<br />
最近いろいろなところで目にしたので、是非解きたいと思った問題がありまして、、</p>
<p>人材獲得作戦・４　試験問題ほか | 人生を書き換える者すらいた。<br />
<a href="http://okajima.air-nifty.com/b/2010/01/post-abc6.html">http://okajima.air-nifty.com/b/2010/01/post-abc6.html</a></p>
<p>これなんですが、読んでみたら簡単そうなんですが、どうやら幅優先探索(BFS:BreadthFirstSearch)を使いそう。<br />
TopCoderでは、「BFSがベストアンサー！」みたいな問題は今まで見かけなかったので放置していたんですが、<br />
腹をくくって勉強。<br />
DFSは得意なんだよね。なぜか、あの再帰具合が。</p>
<p>で、たまたまITMediaで連載中の講座でも探索が！<br />
これは偶然だけども。</p>
<p>知れば天国、知らねば地獄――「探索」虎の巻 | 最強最速アルゴリズマー養成講座<br />
<a href="http://www.itmedia.co.jp/enterprise/articles/1001/16/news001.html">http://www.itmedia.co.jp/enterprise/articles/1001/16/news001.html</a></p>
<p>探索は基本だよねえ。うん。</p>
<h3>Javaでの実装に使うもの</h3>
<p>そこを読ませて頂いても、Wikipediaの解説を読んでも、キュー(Queue)を使うのが基本らしい。<br />
幅優先っていう概念はわかりやすいんだけどね。実装がねー</p>
<p>JavaでQueueだと、Queueインターフェイスを実装した<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/util/LinkedList.html">LinkedList</a>なんかがお手頃。<br />
※ 話が逸れるけど、Eclipseで「LLi」ってとこまでいれて保管すると一番上にLinkedListがでる。</p>
<p>で、問題はなんのメソッドを使うか。<br />
Stackインターフェイスも実装しているからややこしいんだけど、<br />
Queueは先入れ先出し(FIFO)が原則なので、後方から入れて先頭から出すようにする。<br />
行列と同じ。以下の２つのメソッドを使う。</p>
<p><strong>LinkedList#offer(e)</strong><br />
リストの末尾に追加。</p>
<p><strong>LinkedList#poll()</strong><br />
リストの先頭を取得して削除。</p>
<p>Stackに関係するメソッドは有名だから知ってたけど、<br />
この２つは最近まで全然知らなかった。（のは俺だけかもしれない）</p>
<h3>実装</h3>
<p>後は書くしか無い。</p>
<p>ALGORITHM NOTE | 幅優先探索 Breadth First Search<br />
<a href="http://algorithms.blog55.fc2.com/blog-entry-127.html">http://algorithms.blog55.fc2.com/blog-entry-127.html</a></p>
<p>参考にしました。このサイトにはいつも助けられてます。</p>
<p>自分で分かりやすく書きたかったので、結構だらだら長いコードだけど、こんな感じ。<br />
[java]<br />
public class BreadthFirstSearch {<br />
	Point[] move = new Point[]{new Point(0, -1), new Point(-1,0), new Point(1, 0), new Point(0,1)};<br />
	char[] directions = new char[]{&#8216;r&#8217;, &#8216;d&#8217;, &#8216;u&#8217;, &#8216;l&#8217;};</p>
<p>	public BreadthFirstSearch(int[][] input, int sx, int sy){<br />
		class Puzzle {<br />
			int[][] map = new int[3][3];<br />
			int x = 0;<br />
			int y = 0;<br />
			String path;</p>
<p>			public Puzzle(int[][] map, int x, int y, String path) {<br />
				this.map = map;<br />
				this.x = x;<br />
				this.y = y;<br />
				this.path = path;<br />
			}</p>
<p>			public boolean check(){<br />
				for (int i = 0; i < 8; i++) {<br />
					if (this.map[i / 3][i % 3] != i+1) return false;<br />
				}<br />
				return true;<br />
			}<br />
		}</p>
<p>		LinkedList<Puzzle> queue = new LinkedList<Puzzle>();<br />
		queue.push(new Puzzle(input, sx, sy, &#8220;&#8221;));</p>
<p>		BFS : while (queue.size() > 0) {<br />
			Puzzle p = queue.poll();</p>
<p>			for (int i = 0; i < 4; i++) {<br />
				int x = p.x + move[i].x;<br />
				int y = p.y + move[i].y;</p>
<p>				if (x >= 0 &#038;&#038; x <= 2 &#038;&#038; y >= 0 &#038;&#038; y <= 2) {<br />
					int[][] map = this.dc(p.map);<br />
					map[p.x][p.y] = map[x][y];<br />
					map[x][y] = 0;</p>
<p>					Puzzle moved = new Puzzle(map, x, y, p.path + directions[i]);<br />
					if (moved.check()) {<br />
						System.out.println(moved.path);<br />
						break BFS;<br />
					}</p>
<p>					queue.add(moved);<br />
				}<br />
			}<br />
		}</p>
<p>		System.out.println("#END");<br />
	}</p>
<p>	public int[][] dc(int[][] input){<br />
		int[][] output = new int[input.length][input[0].length];<br />
		for (int i = 0; i < input.length; i++) {<br />
			output[i] = input[i].clone();<br />
		}<br />
		return output;<br />
	}</p>
<p>	public static void main(String[] args) throws FileNotFoundException {<br />
		FileInputStream fis = new FileInputStream("src/study/puzzle.in");<br />
		Scanner sc = new Scanner(fis);</p>
<p>		int[][] puzzle = new int[3][3];<br />
		int x = 0;<br />
		int y = 0;</p>
<p>		for (int i = 0; i < 9; i++) {<br />
			char input = sc.next().charAt(0);<br />
			if (input == 'x') {<br />
				x = i / 3;<br />
				y = i % 3;<br />
				puzzle[i / 3][i % 3] = 0;<br />
			} else {<br />
				puzzle[i / 3][i % 3] = input - '0';<br />
			}<br />
		}</p>
<p>		new BreadthFirstSearch(puzzle, x, y);<br />
	}<br />
}</p>
<p>[/java]</p>
<p>次に本命のあのサイト。<br />
せっかくだからTopCoderっぽくコストから出してみた。<br />
かなり回りくどいけど、書いてて自分で勉強になった。</p>
<p>[java]<br />
public class Kuma4_1 {<br />
	static final int width = 26;<br />
	static final int height = 13;<br />
	Point[] movable = new Point[]{new Point(1, 0), new Point(0, 1), new Point(-1, 0), new Point(0, -1)};</p>
<p>	public Kuma4_1(char[][] map, int sx, int sy, int gx, int gy) {<br />
		LinkedList<Point> queue = new LinkedList<Point>();<br />
		queue.add(new Point(sx, sy));<br />
		int cost = 1;<br />
		int[][] costMap = new int[height][width];<br />
		char[][] copiedMap = this.dc(map);</p>
<p>		BFS: while (queue.size() > 0) {<br />
			Point now = queue.poll();</p>
<p>			for (int i = 0; i < movable.length; i++) {<br />
				int x = now.x + movable[i].x;<br />
				int y = now.y + movable[i].y;</p>
<p>				if (map[x][y] == 'G') {<br />
					costMap[x][y] = cost;<br />
					this.out(copiedMap, costMap, gx, gy);<br />
					break BFS;</p>
<p>				} else if (map[x][y] == ' ') {<br />
					costMap[x][y] = cost;<br />
					map[x][y] = '#';<br />
					queue.offer(new Point(x,y));<br />
				}<br />
			}</p>
<p>			cost++;<br />
		}</p>
<p>		System.out.println("#process end");<br />
	}</p>
<p>	public void out(char[][] map, int[][] costMap, int gx, int gy){<br />
		int cost = costMap[gx][gy];<br />
		Point p = new Point(gx, gy);<br />
		while (cost > 1){<br />
			cost&#8211;;<br />
			for (int i = 0; i < movable.length; i++) {<br />
				int x = p.x + movable[i].x;<br />
				int y = p.y + movable[i].y;</p>
<p>				if (costMap[x][y] == cost) {<br />
					map[x][y] = &#8216;$&#8217;;<br />
					p = new Point(x,y);<br />
				}<br />
			}<br />
		}</p>
<p>		for (int i = 0; i < map.length; i++) {<br />
			System.out.println(new String(map[i]));<br />
		}<br />
	}</p>
<p>	public void out(int[][] map) {<br />
		for (int i = 0; i < map.length; i++) {<br />
			for (int j = 0; j < map[i].length; j++) {<br />
				System.out.printf(&#8220;%3d&#8221;, map[i][j]);<br />
			}<br />
			System.out.println();<br />
		}<br />
	}</p>
<p>	public void out(char[][] map) {<br />
		for (char i = 0; i < map.length; i++) {<br />
			System.out.println(new String(map[i]));<br />
		}<br />
	}</p>
<p>	public char[][] dc(char[][] input){<br />
		char[][] output = new char[input.length][input[0].length];<br />
		for (char i = 0; i < input.length; i++) {<br />
			output[i] = input[i].clone();<br />
		}<br />
		return output;<br />
	}</p>
<p>	public static void main(String[] args) throws FileNotFoundException {<br />
		FileInputStream fis = new FileInputStream(&#8220;src/study/kuma4.in&#8221;);<br />
		Scanner sc = new Scanner(fis);</p>
<p>		char[][] map = new char[height][width];</p>
<p>		for (int i = 0; sc.hasNext(); i++) {<br />
			String line = sc.nextLine();<br />
			map[i] = line.toCharArray();<br />
		}</p>
<p>		int sx=0, sy=0, gx=0, gy=0;<br />
		for (int i = 0; i < map.length; i++) {<br />
			for (int j = 0; j < map[0].length; j++) {<br />
				if (map[i][j] == &#8216;S&#8217;) {<br />
					sx = i;<br />
					sy = j;<br />
				} else if (map[i][j] == &#8216;G&#8217;) {<br />
					gx = i;<br />
					gy = j;<br />
				}<br />
			}<br />
		}</p>
<p>		new Kuma4_1(map, sx, sy, gx, gy);<br />
	}<br />
[/java]</p>
<p>しかしなげぇ。でも、書く時間自体はそんなかからなかった。30分弱くらいかなあ。<br />
でも、アルゴリズム調べてからだから、そう考えると論外だとも。</p>
<p>とにかく、ぼくはこれで幅優先探索をやっと覚えました！ばっちこい。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/218/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby1.9.1の開発環境(AptanaRadRails)をWindowsで作る Part1</title>
		<link>http://thleave.com/coding/151</link>
		<comments>http://thleave.com/coding/151#comments</comments>
		<pubDate>Fri, 27 Nov 2009 14:12:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=151</guid>
		<description><![CDATA[


突然RubyがやりたくなってRubyの導入本を買った。
他の言語、いわゆるPerl、Java、C++とかやってる人ならオススメ、良本です。
オライリーなのに日本語訳ではなく、日本人が書いてるってのがスゴイです。
本 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><div class="fright">
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=sasuraifish-22&#038;o=9&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;md=1X69VDGQCMF7Z30FM082&#038;asins=4873113679" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<p>突然RubyがやりたくなってRubyの導入本を買った。</p>
<p>他の言語、いわゆるPerl、Java、C++とかやってる人ならオススメ、良本です。<br />
オライリーなのに日本語訳ではなく、日本人が書いてるってのがスゴイです。</p>
<p>本を読み進めていたら実際に書きたくなったので、環境作ることにしました。</p>
<p><br class="clear"/><br />
<span id="more-151"></span></p>
<hr/>
元々Javaを書く人でずっと前からEclipse信者なので今度もそれベースで組むのは即決。<br />
となるとAptanaのRadRailsが良さそうです。<br />
元々RDT(Ruby Development Tools)として出ていたプラグインがAptanaのプラグインに変わったもの。</p>
<p>俺はAptanaのHTMLやJSエディタを使い始めてからDreamweaverは全く起動しなくなりました。<br />
DW同様重いけど、プログラマーが使うのに相性が良いです。</p>
<p>Rubyはバージョン1.8が主流のようだけど、最新の1.9の安定版が最近出たようなのでそれを使うことに。<br />
話は逸れるけど、Ruby2.0は新しい仕様が多いらしく、PHPでいうと5.0から6.0にあがる話みたいな感じなのかな。<br />
その繋ぎとなるのがRuby1.9であり、PHP5.3(だっけ？)らしいので、楽しみなバージョンだよね。</p>
<p>ここまでで使うモノが大体決まりました。</p>
<ul>
<li><strong>Ruby1.9.1(stable)</strong></li>
<li><strong>Aptana RadRails</strong></li>
</ul>
<p>せっかくなので、ROR(Ruby on Rails)やRubyGems、テスト環境としてXAMPPへの対応もやりましょう。</p>
<hr/>
<h3>Rubyのインストール</h3>
<p>Windowsだと便利なインストーラがあって、これを使うと１発でRubyとRubyGemsが入って環境変数(Path)まで通してくれます。</p>
<p>One-Click Installer &#8211; Windows<br />
<a href="http://rubyforge.org/projects/rubyinstaller/">http://rubyforge.org/projects/rubyinstaller/</a></p>
<p>ただ、Ruby1.9のインストーラが無かったので、今回は手動でインストールすることにします。</p>
<p>オブジェクト指向スクリプト言語 &#8211; Ruby<br />
<a href="http://www.ruby-lang.org/ja/">http://www.ruby-lang.org/ja/</a></p>
<p>/binaries/mswin32/ruby-1.9.1-p129-i386-mswin32.zip</p>
<p>好きな場所に解凍します。<br />
XAMPPに組み込む人はc:\xmapp\rubyとかが格好つくかと思います。</p>
<p>手動でいれた人は自力でPATHを通す必要があります。<br />
c:\xmapp\rubyに置いた人はPATHにc:\xmapp\ruby\binを追加してください。</p>
<p>[bash]<br />
$ruby -v #=> ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]<br />
[/bash]</p>
<hr/>
<h3>RubyGemsのインストール</h3>
<p>Rubyのインストールが終わったらRubyGemsをインストールします。<br />
俺はyumとかのRuby版だと解釈してます。あったほうが断然便利。</p>
<p>RubyForge: RubyGems<br />
<a href="http://rubyforge.org/frs/?group_id=126">http://rubyforge.org/frs/?group_id=126</a></p>
<p>好きなバージョンを落として好きな場所に解凍します。<br />
その次にコマンドプロンプトからインストールをします。</p>
<p>[bash]<br />
$ruby setup.rb<br />
[/bash]</p>
<p>少し時間がかかりますが、勝手にインストールしてくれます。楽ちん。</p>
<p>疲れたのでとりあえずここまで。続く。</p>
<p><a href="http://thleave.com/coding/189">=>Part2</a></p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/151/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Closure Libraryを使ってみた</title>
		<link>http://thleave.com/coding/139</link>
		<comments>http://thleave.com/coding/139#comments</comments>
		<pubDate>Sat, 07 Nov 2009 08:03:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=139</guid>
		<description><![CDATA[公開されたばかりのGoogle製のJavaScriptライブラリをちょっとだけ触ってみた。
GoogleAppsEngineも凄かったけど、
これも並ぶくらいにヤバいんじゃない？って思ってる。
こんなライブラリを自由時間 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>公開されたばかりのGoogle製のJavaScriptライブラリをちょっとだけ触ってみた。<br />
GoogleAppsEngineも凄かったけど、<br />
これも並ぶくらいにヤバいんじゃない？って思ってる。<br />
こんなライブラリを自由時間に作っちゃって、<br />
ひょいひょい公開するGoogleはホント鳥肌たつ。</p>
<p>Gmailとかもこのライブラリで作られてるんだって。</p>
<p>以下、せっかくなので要点だけまとめてみた。</p>
<p><span id="more-139"></span></p>
<p>英語読める方は<a href="http://code.google.com/intl/ja-JP/closure/library/docs/overview.html">GoogleLabsのドキュメント</a>読んだ方がいいかも。</p>
<p>まず、ソースはSVNから落としてくる。<br />
[code]</p>
<p>http://closure-library.googlecode.com/svn/trunk/</p>
<p>[/code]</p>
<p><br/><br />
HTMLファイルにはbase.jsだけ読み込むだけで良い。<br />
[html]<br />
<script type="text/javascript" src="closure-library/closure/goog/base.js"></script><br />
[/html]</p>
<p><br/><br />
但し、JavaScriptソースにはJavaなどに似た記法で使うソースの宣言が必要。<br />
[javascript]<br />
goog.require(&#8216;goog.dom&#8217;);<br />
[/javascript]</p>
<p><br/><br />
名前空間の概念がある。最上位は&#8221;goog&#8221;である。<br />
jQueryとは異なり、階層構造になっているから注意。（Javaとかに慣れてる人は大丈夫）</p>
<p>また、継承も出来る。詳しくは追々かな。<br />
[javascript]<br />
goog.inherits(goog.ui.MenuButton, goog.ui.Button);<br />
[/javascript]<br />
<br/></p>
<p>jQueryみたいに、独自のイベントハンドラがあるし、ユーザー独自のイベントも作れる。<br />
（ブラウザ毎の差異を吸収できる）<br />
[javascript]<br />
goog.events.listen(this.elHeader_, goog.events.EventType.CLICK, this.onHeaderClick_, false, this);<br />
[/javascript]<br />
ここは、覚えないとダメそう。<br />
<a href="http://code.google.com/intl/ja-JP/closure/library/docs/events_tutorial.html">Event Handling</a></p>
<p>&#8212;</p>
<p>ClosureLibraryはClosureToolsの一部で、<br />
その他にコードを最適化するCompilerなどがあるみたい。<br />
様子見てつかってみたいです</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/139/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavascriptとIE7</title>
		<link>http://thleave.com/coding/132</link>
		<comments>http://thleave.com/coding/132#comments</comments>
		<pubDate>Sun, 25 Oct 2009 18:18:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=132</guid>
		<description><![CDATA[ブラウザによってAタグのhref属性の値が違う。
[html]
link
[/html]
みたいなソースで、
[javascript]
var href = $(&#8220;a#takotako&#8221;).att [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>ブラウザによってAタグのhref属性の値が違う。</p>
<p>[html]<br />
<a href="#kumakuma">link</a><br />
[/html]</p>
<p>みたいなソースで、</p>
<p>[javascript]<br />
var href = $(&#8220;a#takotako&#8221;).attr(&#8220;href&#8221;);<br />
alert(&#8220;href = &#8221; + href);<br />
[/javascript]</p>
<p>JSとかで取得する場面があった。</p>
<ul>
<li>モダンブラウザ(FF, Opera, IE8.etc)<br />
href = &#8220;#kumakuma&#8221;<br />
これが普通だと思うけど。</li>
<li>IE7(IE6もかも？)<br />
href = &#8220;http://thleave.com/#kumakuma&#8221;<br />
ご丁寧に全部出る。</li>
</ul>
<p>これにすげーハマった。<br />
ってきり、JSON（も扱っているのでその）周りかと思ったら全然違う。<br />
みなさん是非、IEはIEでもIE8を使いましょう！</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/132/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
