Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

Eclipseで実行時に引数を渡す方法

public static void main(String[] args) {←このargsを受け取りたいってときの方法です。

Eclipseでコマンドライン引数を与えて実行する方法 | 学習B5デスノート
にある通りなんですが、

mainメソッドのあるファイルを右クリック
→実行
→実行の構成
→(x)= 引数タブを選択
→プログラムの引数(A): 欄に引数を記入。スペース区切りで複数与えられます。
例)

プログラムの引数(A): hoge boo

だとargs[0] = hoge、args[1] = boo。
→適用
→実行!

TDDに挑戦【Java】

TDDとはTest Driven Development(テスト駆動開発)の略です。
テストコードを書いてから実装しましょう、という開発手法です。
今回は実際にどうやるのか

バグがないプログラムのつくり方 JavaとEclipseで学ぶTDDテスト駆動開発 (Be agile!)

バグがないプログラムのつくり方 JavaとEclipseで学ぶTDDテスト駆動開発 (Be agile!)

を読みながらJavaを使用してやってみました。

TDDの流れ

(1) テストコードを書く

assertEquals(期待値, 実行するもの);

(2) 仮実装
とりあえずコンパイルが通るものを作成。
(3) テスト
テストするファイルを右クリック→実行→JUnitテスト
(4) 失敗(JUnitモジュールが赤色に)※1
(5) テストを成功させるための最小限の実装
(6) テスト
(7) 成功(緑色)
(8) Triangulation(三角測量)=テストケースの追加
(9) 失敗(赤色)
(10) すべてのテストを通過できるようリファクタリング※2
(11) テスト成功!!

※1 失敗の理由はJUnitのモジュールにある
▷Goods.java
 ▷TestGetTaxIncludedPrice.java←該当ソースコードをクリック
すると、下にある障害トレースという項目に表示されます。

※2 リファクタリングとは
・コードの重複排除
・汎用化

試した環境とソースコード

環境

Eclipse Indigo
JUnit version3.8.2
JDK

ソースコード

GoodsTest.java

import junit.framework.TestCase;

public class GoodsTest extends TestCase {

	public GoodsTest(String name) {
		super(name);
	}
	
	public void testGetGoodsPrice() {
		Goods ice = new Goods(100);
		assertEquals(100, ice.getPrice());
	}
	
	public void testGetTaxIncludedPrice() {
		Goods ice = new Goods(100);
		assertEquals(105, ice.getTaxIncludedPrice());
		Goods handkerchief = new Goods(500);
		assertEquals(525, handkerchief.getTaxIncludedPrice());
	}

}

Goods.java

public class Goods {

	private int unitPrice = 0;
	
	public Goods(int unitPrice) {
		this.unitPrice = unitPrice;
	}

	public Object getPrice() {
		return this.unitPrice;
	}

	public Object getTaxIncludedPrice() {
		return (int) (this.unitPrice * 1.05);
	}

}

JavaでマルチスレッドプログラムーRunnableインターフェイス実装編ー

昨日に引き続き今日は、Runnableインターフェイスを実装する場合のマルチスレッドプログラムです。

Q. Runnableインターファイスを実装するのはどんなとき?
A. 他に継承する必要のあるクラスがあり、Threadクラスを継承できないとき。

Q. どうやって実装するの?
A. ソースコードをご覧ください。

/*
 * Runnableインターフェイスの実装。
 * 
*/

public class ExThread2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		RunnableTestThread rtt = new RunnableTestThread();
		Thread t = new Thread(rtt);
		t.start();
		for (int i = 0; i < 10; i++) {
			System.out.println("hoge");
		}
	}

}

// 実際は何らかのクラスを既に継承していて、Threadクラスの継承ができない場合に使用。
// 例、class RunnableTestThread extends hoge implements Runnable {
class RunnableTestThread implements Runnable {
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(this.getClass() + ":" + i);
		}
	}
}

実行結果

hoge
class RunnableTestThread:0
class RunnableTestThread:1
class RunnableTestThread:2
class RunnableTestThread:3
class RunnableTestThread:4
class RunnableTestThread:5
class RunnableTestThread:6
class RunnableTestThread:7
class RunnableTestThread:8
class RunnableTestThread:9
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge
hoge

Q. 気を付けることは?
A. 上の実行結果を見ると

System.out.println("hoge");

が一度実行された後に

System.out.println(this.getClass() + ":" + i);

が走り、その後残りの

System.out.println("hoge");

が実行されています。
スレッド化された処理がいつ実行されるのかは注意がいると思います。

Javaでマルチスレッドプログラム

マルチスレッドってそれとなくわかった気になって、使っていたのですが
改めて調べ直してみました。

マルチスレッドとは
複数の処理が一つのプログラム上で動いているように見せる方法。

種類

  • Threadクラスを継承
  • Runnableインターフェイスを実装
  • shynchronized

実戦

まず、『Treadクラスを継承』をやってみました。

Threadクラスのサブクラスを作って、そこに
runメソッド(=スレッド化したい処理)とmainメソッド(=スレッドを実行)
を書きます。

ソースコード

public class ExThread1 extends Thread {
	
	public void run () {
		// 10 9 8 ... 2 1 0
		for ( int i = 10; i >= 0; i-- ) {
			System.out.println(getName() + ":" + i);
			try {
				// 1秒間ストップ
				sleep(1000);
			} catch ( InterruptedException e ) {		
			}
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ExThread1 thread1 = new ExThread1();
		ExThread1 thread2 = new ExThread1();
		thread1.start();
		thread2.start();
	}

}

実行結果

Thread-1:10
Thread-2:10
Thread-1:9
Thread-2:9
Thread-2:8
Thread-1:8
Thread-1:7
Thread-2:7
Thread-1:6
Thread-2:6
Thread-1:5
Thread-2:5
Thread-1:4
Thread-2:4
Thread-1:3
Thread-2:3
Thread-1:2
Thread-2:2
Thread-1:1
Thread-2:1
Thread-2:0
Thread-1:0

ちなみにThread-1とThread-2を交互に実行していますが
1が終わった後に2をしたい場合は以下。

…
thread1.start();
try {
	thread1.join();
} catch ( InterruptedException e ) {
}
thread2.start();
…

スレッドの完了を待つ『joinメソッド』を使います。



参考URL
http://www.javaroad.jp/java_thread1.htm
http://www.tohoho-web.com/java/thread.htm
http://www.ne.jp/asahi/hishidama/home/tech/java/thread.html

Iterator

HadoopのReducerや、Androidアプリによく登場するIterator。いつも書き方を調べてしまうので自分用にまとめます。

例、

public void reduce ( Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter ) throws IOException
{
    int sum = 0;
    while ( values.hasNext() )
    {
        sum += values.next().get();
    }
    output.collect(key, new IntWritable(sum));
}

Iteratorとは、Collectionの要素に順番にアクセスするための機能です。
hasNext()メソッドで次の要素があるか確認し、next()メソッドで取得します。

import java.util.*;

public class Iterator {

	public static void main(String[] args) {
		HashMap map = new HashMap(); // オブジェクトの生成。
		String[] tel = {"03", "075", "06", "052"}; //key
		String[] area = {"Tokyo", "Kyoto", "Osaka", "Nagoya"}; // value
		
		// HashMapにキーバリューを代入。
		System.out.println("HashMap");
		for ( int i = 0; i < 4; i++ ) {
			map.put(tel[i], area[i]);
			System.out.println("|" + tel[i] + "|" + area[i] + "|");
		}
		
		// Iteratorを使って取り出す。
		System.out.println("Iterator");
		/*
		 * Iterator"i"に
		 * HashMap"map"の
		 * キーバリューを保持したSetをentrySet()で取得して
		 * iterator()によって反復しを
		 * 代入する。
		 */
		for ( java.util.Iterator i = map.entrySet().iterator(); i.hasNext(); ) { // java.utilを外すとなぜかエラーになる。
			System.out.println("キーバリューのペア: " + i.next());
		}
		
	}

}

実行結果。HashMapの順に出てくるわけではないことに注意。

HashMap
|03|Tokyo|
|075|Kyoto|
|06|Osaka|
|052|Nagoya|
Iterator
キーバリューのペア: 075=Kyoto
キーバリューのペア: 06=Osaka
キーバリューのペア: 052=Nagoya
キーバリューのペア: 03=Tokyo


Iterator
http://www.javaroad.jp/java_collection5.htm
http://www.geocities.jp/m_hiroi/java/abcjava09.html
Hadoop
http://xamry.wordpress.com/2012/09/11/your-first-hadoop-map-reduce-job/