<?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; Eclipse</title>
	<atom:link href="http://thleave.com/tag/eclipse/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>幅優先探索を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>EclipseでPerlの開発環境を作ったけれど。</title>
		<link>http://thleave.com/coding/107</link>
		<comments>http://thleave.com/coding/107#comments</comments>
		<pubDate>Fri, 21 Aug 2009 16:08:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=107</guid>
		<description><![CDATA[昨日の投稿の続き。
EclipseでPerlの開発環境を作ろう
http://thleave.com/coding/98
自作のモジュールとかを使うときに警告が出ちゃうという話。
でるだけならいいんだけど、そこで文法チェ [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>昨日の投稿の続き。</p>
<p>EclipseでPerlの開発環境を作ろう<br />
<a href="http://thleave.com/coding/98">http://thleave.com/coding/98</a></p>
<p>自作のモジュールとかを使うときに警告が出ちゃうという話。<br />
でるだけならいいんだけど、そこで文法チェックが終わっちゃうからタチがわるい。</p>
<p>でも、perl.exeの指定のところで、以下のようにすれば解決。<br />
[perl]<br />
&#8220;C:\Perl\bin\perl.exe&#8221; -Mmodule=[workspaceの場所]<br />
[/perl]</p>
<p>&#8212;</p>
<p>[2009/09/15 追記]<br />
あ、これやるとデバック効かない・・・かも？</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/107/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EclipseでPerlの開発環境を作ろう</title>
		<link>http://thleave.com/coding/98</link>
		<comments>http://thleave.com/coding/98#comments</comments>
		<pubDate>Thu, 20 Aug 2009 14:33:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=98</guid>
		<description><![CDATA[前にも書いたようにPerlを使うことになったので、開発環境を探していました。
でも、ずっとJavaでEclipseを使って慣れていたので、Eclipseを使うことにしました。
&#8212;
Eclipse は現在3.5 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>前にも書いたようにPerlを使うことになったので、開発環境を探していました。<br />
でも、ずっとJavaでEclipseを使って慣れていたので、Eclipseを使うことにしました。</p>
<p>&#8212;</p>
<p>Eclipse は現在3.5(Galileo)が最新です。<br />
公式から落としてきます。<br />
種類がありますが、Classicで十分です。<br />
<a href="http://www.eclipse.org/">http://www.eclipse.org/</a></p>
<p>次にプラグインをいれます。<br />
EclipseをPerlに対応させるものだと、今はEPICしか見あたらないようです。<br />
<a href="http://www.epic-ide.org/">http://www.epic-ide.org/</a></p>
<p>EPICをインストールするにはまずEclipseを起動して、<br />
[Help]->[Install New Software]<br />
で表示されるダイアログでURLを指定します。<br />
公式にもありますが、以下のURLです。<br />
<strong>http://e-p-i-c.sf.net/updates</strong><br />
後は流れに任せます。</p>
<p>次にPerlをインストールします。<br />
XAMPPなどの統合環境を使っていても、とりあえず入れた方がいいです。<br />
いろいろ方法はありますが、WIndowsユーザーならActivePerlが楽だと思います。<br />
<a href="http://www.activestate.com/activeperl/">http://www.activestate.com/activeperl/</a><br />
ダウンロードしてインストールします。</p>
<p>そしたら、EclipseからPerlが見えるように設定をします。<br />
[Window]->[Preferences]<br />
で設定画面が開きます。<br />
[ Perl EPIC]という項目があるので、そこで&#8221;perl.exe&#8221;までのパスを設定します。<br />
&#8220;perl.exe&#8221;はActivePerlのインストール先のbin以下にあるはずです。</p>
<p>ここらへんで再起動をして、インストールは一通り終わりです。<br />
これで大体の補完とデバックが効きます。<br />
ただ、「動的型付け言語であること」「EPICの更新があまりアクティブに行われていないこと」が原因だと思いますが、あまりキビキビとした補完はききません。<br />
Javaユーザーの方は不満に思うかも。</p>
<p>あと、実際に使うのであれば、もうすこしプラグインが必要だと思います。</p>
<p>Perlには関係ありませんが、</p>
<ul>
<li>SVN<br />
Eclipse3.4あたりから別途インストールが必要になってしまいました。</li>
<li><a href="http://aptana.com/">AptanaIDE</a><br />
重いんですが、スペックに余裕があれば。HTMLやJSのエディタが感動するほど素晴らしいです。</li>
<li><a href="http://muermann.org/gotofile/">GotoFile Eclipse Plugin</a><br />
ファイル検索が秒速でできるようになります。キャメルサーチなどをEclipse上で実装。</li>
<li><a href="http://www.azzurri.jp/ja/clay/index.html">Clay Database Modeling</a><br />
軽量で使いやすいDBモデリングソフトです。CREATE文の自動生成やリバースエンジニアリングなど。</li>
</ul>
<p>などはいれておいて損がないと思います。</p>
<p>長くなりましたが参考になれば。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/98/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache Maven2を使ったApache WicketのQuick Start</title>
		<link>http://thleave.com/coding/71</link>
		<comments>http://thleave.com/coding/71#comments</comments>
		<pubDate>Sun, 09 Aug 2009 14:29:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=71</guid>
		<description><![CDATA[ルー語みたいなタイトルになっちゃいました。
前にもやったことがあったのですが、
開発環境が変わりやり方も忘れてしまったので、
今度は忘れないように備忘録として。
&#8212;
Apache Mavenは現在v2が主流。 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>ルー語みたいなタイトルになっちゃいました。</p>
<p>前にもやったことがあったのですが、<br />
開発環境が変わりやり方も忘れてしまったので、<br />
今度は忘れないように備忘録として。</p>
<p>&#8212;</p>
<p>Apache Mavenは現在v2が主流。<br />
<a href="http://maven.apache.org/">http://maven.apache.org/</a></p>
<ol>
<li>落としてきて適当な場所に解凍する。</li>
<li>ローカルリポジトリを設定する。<br />
最初にやっとかないと、デフォルトのディレクトリ（~/.m2/以下）にファイルが沢山ダウンロードされちゃう。</p>
<p>[解凍先]/conf/settings.xml<br />
local_repositoryっぽい場所があるので、好きな場所に変更する。</li>
<li>（コマンドプロンプトから実行するので）環境変数を設定する。<br />
PATH=[解凍先]/bin/<br />
JAVA_HOME=[JDKのディレクトリ]</li>
<li>試しに行してみる。<br />
$mvn &#8211;version<br />
など。返事が返ってくれば成功。</li>
<li>プロジェクトを作成したいディレクトリに移動。<br />
カレントディレクトリにプロジェクトが作成されるので、<br />
EclipseのWorkspace内など、好きな場所へ。</li>
<li>Apache Wicket Quick Start!<br />
<a href="http://wicket.apache.org/quickstart.html">http://wicket.apache.org/quickstart.html</a><br />
詳しくはリンク先を読んでください。</li>
<li>自動生成されたコマンドを実行する。<br />
EclipseなどIDEとの連携を考えている人は、<br />
上記リンク先の下の方もちゃんと読む！（必要なコマンドがあります）</li>
</ol>
<p>以上でおわり。</p>
<p>さぁ、作業作業。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/71/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse galileo arrives in 3 weeks</title>
		<link>http://thleave.com/coding/45</link>
		<comments>http://thleave.com/coding/45#comments</comments>
		<pubDate>Tue, 09 Jun 2009 11:32:08 +0000</pubDate>
		<dc:creator>tchiba</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://thleaves.railsplayground.net/?p=45</guid>
		<description><![CDATA[Eclipse 3.5 通称Galileoが6/24にお目見えするとのこと。
新機能は楽しみだけど、言語毎にEclipse置いてるから入れ替えるのが面倒くさいなぁ。
http://www.eclipse.org/gali [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Eclipse 3.5 通称Galileoが6/24にお目見えするとのこと。<br />
新機能は楽しみだけど、言語毎にEclipse置いてるから入れ替えるのが面倒くさいなぁ。</p>
<p><a href="http://www.eclipse.org/galileo/">http://www.eclipse.org/galileo/</a></p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/coding/45/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
