感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

AntでJavaを実行する手順のまとめと、線形探索。

<スポンサーリンク>

ことば

言語の制約はそれを使う人の世界を制限する。
ルートウィッヒ・フォン・ヴィトゲンシュタイン

線形探索

線形探索はソートされていないランダムな並びの配列から探索を行うための唯一の方法。

線形探索とは、先頭から順番に当たりをつけていって、一致するものを見ていく方法だ。
コードにするとこんな感じ。

import java.util.Random;

class SeqSearch {

	static int seqSearch(int[] a, int n, int key) {
		int i = 0;
		while (true) {
			if (i == n) {
				return -1;
			}
			if (a[i] == key) {
				return i;
			}
			i++;
		}
	}

	public static void main(String[] args) {
		Random rnd = new Random();

		int elmNum = rnd.nextInt(5000);
		System.out.println("element number is " + elmNum);

		int[] x = new int[elmNum];

		for (int i = 0; i < elmNum; i++) {
			x[i] = rnd.nextInt(100);
		}

		System.out.println("now searching...");
		int key = rnd.nextInt(100);
		System.out.print(key);
		int idx = seqSearch(x, elmNum, key);

		if (idx == -1) {
			System.out.println("\n" + key + "don't exist..");
		} else {
			System.out.println("\nkey exist at x[" + idx + "].");
			System.out.println("x[" + idx + "] is " + x[idx]);
		}
	}
}

実行結果は以下の通り。

element number is 2968
now searching...
73
key exist at x[69].
x[69] is 73
[Finished in 0.8s]

次は「番兵法」を試したいのだが、
今回の勉強の目的は、線形探索とは別に、Antでビルドしたいということである。
上のビルドはSublime Textのctrl + B で行った。
どうでもいいけど、javacの読み方は「ジャヴァシー」と読むらしい。

Antのbuild.xmlを書いてみる。

<?xml version="1.0"?>
<project>
	<javac srcdir="." destdir="." />
</project>

ってこれだけかい〜。
とりあえずコンパイルは完了。
ちょっとずつね、色々使っていこう。
では、ターゲットを使ってみる。

<?xml version="1.0"?>
<project name="my ant">
	<target name="compile">
		<javac srcdir="." destdir="." />
	</target>
</project>

実行

ant compile

次に、今ある.classファイルを削除してみる。

<?xml version="1.0"?>
<project name="my ant">
	<target name="clean">
		<delete>
			<fileset dir="." includes="*.class"/>
		</delete>
	</target>
	<target name="compile">
		<javac srcdir="." destdir="." />
	</target>
</project>

実行

ant clean

.classが消えた!Antおもしれーw
cleanが実行されたあとにcompileされるようにしてみる。

<?xml version="1.0"?>
<project name="my ant">
	<target name="clean">
		<delete>
			<fileset dir="." includes="*.class"/>
		</delete>
	</target>
	<target name="compile" depends="clean">
		<javac srcdir="." destdir="." />
	</target>
</project>

これで、

ant compile

を実行すると以下のように実行してくれる(C:\Users\とかが途切れているのはわざと)

clean:

compile:
    [javac] C:\Users\
classpath=last; set t
    [javac] Compiling

BUILD SUCCESSFUL
Total time: 0 seconds

compileの前のcleanを実行してくれる。

せっかくだから、classesフォルダとか作って、srcフォルダでソースを管理したい。
ではどうするか。

<?xml version="1.0"?>
<project name="my ant">
	<target name="init">
		<mkdir dir="classes"/>
	</target>
	<target name="clean" depends="init">
		<delete>
			<fileset dir="classes" includes="*.class"/>
		</delete>
	</target>
	<target name="compile" depends="clean">
		<javac srcdir="src" destdir="classes" />
	</target>
</project>

これで実行すればOK。
最後に、コンパイルだけではなく実行もしたい場合。

<?xml version="1.0"?>
<project name="my ant">
	<target name="init">
		<mkdir dir="classes"/>
	</target>
	<target name="clean" depends="init">
		<delete>
			<fileset dir="classes" includes="*.class"/>
		</delete>
	</target>
	<target name="compile" depends="clean">
		<javac srcdir="src" destdir="classes" />
	</target>

	<target name="run" depends="compile">
		<java classname="SeqSearch">
			<classpath path="classes"/>
		</java>
	</target>
</project>

これを実行すると、、

[java] java.lang.IllegalAccessException: Class org.apache.tools.ant.taskdefs.ExecuteJava can not access a member of class SeqSearch with modifiers "public static"

謎のエラーが。
調べてみると、こんな感じ。
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Controlling Access to Members of a Class

Access level modifiers determine whether other classes can use a particular field or invoke a particular method. There are two levels of access control:

At the top level—public, or package-private (no explicit modifier).
At the member level—public, private, protected, or package-private (no explicit modifier).
A class may be declared with the modifier public, in which case that class is visible to all classes everywhere. If a class has no modifier (the default, also known as package-private), it is visible only within its own package (packages are named groups of related classes — you will learn about them in a later lesson.)

At the member level, you can also use the public modifier or no modifier

パッケージコントロールしろよ、と。

わかった。
今回はソースをいじって、先頭に
package test;
をつけた。
これでもダメ。
原因は何か?
そう、ここだったのである。

class SeqSearch {

http://stackoverflow.com/questions/1564459/ant-java-command-illegalaccessexception

これを

public class SeqSearch {

として、build.xmlをこんな感じに書き換えたら実行できた。

<?xml version="1.0"?>
<project name="my ant">
	<target name="init">
		<mkdir dir="classes"/>
	</target>
	<target name="clean" depends="init">
		<delete>
			<fileset dir="classes" includes="*.class"/>
		</delete>
	</target>
	<target name="compile" depends="clean">
		<javac srcdir="src" destdir="classes" />
	</target>

	<target name="run" depends="compile">
		<java classname="test.SeqSearch">
			<classpath path="classes"/>
		</java>
	</target>
</project>

読んだ本

明解 Javaによるアルゴリズムとデータ構造

明解 Javaによるアルゴリズムとデータ構造

Ant 第2版

Ant 第2版

感謝のプログラミング

今回で感謝のプログラミングは【300.5時間目】
10000時間まで、あと【9699.5時間】