自宅開発環境のアップデート

自宅開発環境アップデートです。
前回の教訓を生かして、こまめにアップデートします。自分への覚書を残しておきます。


Ubuntuアップデート
VirtualBox上のEclipse等を詰め込んだ、Ubuntu開発環境をアップデート。
特に問題なく終了。


Hyper-V Serverアップデート
古くなったPCに、Hyper-V 2012 Server Consoleを入れています。
Hyper-V ServerのWindows Updateを実行。特に問題なく終了。


Hyper-V上のCentOS5.10は、yum update でアップデート。特に問題なく終了。
Hyper-V上のJenkinsとJenkinsプラグインもアップデート。特に問題なく終了。


Windowsのアップデート
Windows8.1→Windows10にアップデート。
アップデート直後は、画面の解像度が変更できなかったり、
Google Chromeが強制終了するなどで、ちょっとビビりましたが、
Windows Updateとディスプレイドライバを更新したら治りました。
今のところ、問題なく使えています。なんとなく、OS自体が軽くなった気がする。(気分的に)


Windows10にしてしまったので、 Hyper-VServerのリモート管理ができなくなった・・・
Windows10用のリモート サーバー管理ツールと、hvremoteの配布待ちですね。


https://code.msdn.microsoft.com/windowsdesktop/Hyper-V-Remote-Management-26d127c6

Groovyでユニットテストを書いてみる(DbUnit)⑧

Groovyでユニットテストを書いてみます。
今回は、DbUnitを使用してみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "DbUnitを使ってみる(参照)"() {

		// DbUnitのJARファイルは、下記からダウンロードしました。
		// http://sourceforge.net/projects/dbunit/files/dbunit/

		// SLF4Jも必要です。
		// slf4j-nop-X.X.X.jar、slf4j-api-X.X.X.jar
		// http://www.slf4j.org/download.html

		// Apache POIも必要です。
		// https://poi.apache.org/download.html

		setup:	// 前準備

		// H2データベースを起動
		def server = org.h2.tools.Server.createTcpServer().start()

		// DB接続
		def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

		// テーブル作成
		try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {} // 既にテーブルがある場合のエラーは無視

		// 初期データ投入
		IDataSet xls = new XlsDataSet( new File( './TEST.xls' ) ) // .xlsx形式だと動かない・・・
		DatabaseConnection connection = new DatabaseConnection( sql.getConnection() )
		DatabaseOperation.CLEAN_INSERT.execute( connection, xls )

		when: // SELECT実行
		def rows = sql.rows( "select * from TEST" )

		then: // 実行結果を検証
		rows.size() == 1			// 取得行は1件であるか
		rows[ 0 ].NAME == 'test'	// NAMEカラムの値が'test'であるか
		rows[ 0 ].TEXT == 'text'	// TEXTカラムの値が'text'であるか

		cleanup: // 後処理
		sql.close()
		server.stop()
	}

	@Test
	def "DbUnitを使ってみる(更新)"() {

		setup:	// 前準備

		// H2データベースを起動
		def server = org.h2.tools.Server.createTcpServer().start()

		// DB接続
		def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

		// テーブル作成
		try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {} // 既にテーブルがある場合のエラーは無視

		// 初期化(全レコード削除)
		IDataSet xls = new XlsDataSet( new File( './TEST.xls' ) ) // .xlsx形式だと動かない・・・
		DatabaseConnection connection = new DatabaseConnection( sql.getConnection() )
		DatabaseOperation.DELETE_ALL.execute( connection, xls )

		when: // INSERT実行
		sql.execute( "INSERT INTO TEST( NAME, TEXT ) values ( 'test', 'text' )" )

		then: // 期待値Excelと比較
		IDataSet actual = connection.createDataSet()
		Assertion.assertEquals( xls.getTable( 'TEST' ), actual.getTable( 'TEST' ) )	// テーブルと期待値Excelが一致するか

		cleanup:// 後処理
		sql.close()
		server.stop()
	}
}


DbUnitで、データベース操作のユニットテストをしてみました。
参照系は、Excelファイルから初期データを投入しておき、SELECTの取得結果が想定どおりであるかを確認。
更新系は、INSERTを実行し、INSERT結果が期待値Excelファイルと一致するかを確認します。


初期データおよび期待値のExcelファイルは下記の形式です。
シート名がテーブル名、1行目がカラム名、2行目移行がデータです。

Groovyでユニットテストを書いてみる(Mock)⑦

Groovyでユニットテストを書いてみます。
今回は、Mockを使用してみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "Mockを使ってみる"() {

		// Mockを使って、既存クラスの挙動を変更する事ができる。
		// 異常系の試験が簡単になります。(わざとエラーコードを返却させるなど)

		// JMockitを使います。
		// JMockitのJARファイルは、下記からダウンロードしました。
		// http://jmockit.org/
		// JMockit.jarをjunit.jarより上位のクラスパスに設定します。(JMockit.jarを先に読み込む必要がある為)

		setup:	// 前準備
		// System.currentTimeMillis()にMockを設定し、現在時刻でなく、0を返却する
		new MockUp<java.lang.System>() {
			@Mock
			long currentTimeMillis() { return 0 }
		}

		cleanup:// 後処理

		when:
		def x = System.currentTimeMillis()
		then:
		x == 0 // 0で返却されるのでテストOK
	}
}


JMockitで、Mockを使ってユニットテストをしてみました。
System.currentTimeMillis()は、Javaの標準ライブラリですが、
Mockにすり替えて、戻り値を0に変更しています。


このように、Mockを使うと、
Java標準APIの挙動を自由に操作できるので、ユニットテストが簡単になります。(ラップする必要がなくなります)

Groovyでユニットテストを書いてみる⑥

Groovyでユニットテストを書いてみます。

■Groovyでユニットテスト

package sample

// いろいろと方法がありますが、今回は、spockを使用します。
// spock:https://code.google.com/p/spock/

// spockのJARファイルは、下記からダウンロードしました。
// http://repo1.maven.org/maven2/org/spockframework/spock-core/1.0-groovy-2.3/

// spockのテストをEclipseで実行するには、
//「Preferences ⇒ Groovy ⇒ Use monospace font for JUnit」をチェックする。

import static org.junit.Assert.*
import groovy.sql.Sql
import mockit.*

import org.dbunit.Assertion
import org.dbunit.database.DatabaseConnection
import org.dbunit.dataset.IDataSet
import org.dbunit.dataset.excel.XlsDataSet
import org.dbunit.operation.DatabaseOperation
import org.junit.*

import spock.lang.*


class ユニットテスト extends Specification {

	@Test
	def "java.lang.Mathのテスト(基本)"() {

		setup:	// 前準備
		cleanup:// 後処理

		// when: テストしたいことを実行
		// then: 実行結果をチェック
		when:
		def x1 = Math.max( 1, 2 )
		then:
		x1 == 2

		// when 〜 then は複数記載できる

		when: def x2 = Math.max( 0, 2 )
		then: x2 == 2

		when: def x3 = Math.max( 1, 0 )
		then: x3 == 1
	}

	@Test
	def "java.lang.Mathのテスト(応用)"() {

		setup:	// 前準備
		cleanup:// 後処理

		// expect 〜 where で、引数と戻り値の複数パターンをまとめて記載できる

		expect:
		Math.max( a, b ) == c

		where:
		a | b || c
		1 | 2 || 2
		0 | 2 || 2
		1 | 0 || 1
	}
}


spockを使うと簡潔に書けます。
JUnitを使った事がある人は、なんとなくコードからイメージが掴めると思います。


特筆すべきは、パラメータと戻り値の複数パターンテストですね。
where句にマトリックスのイメージで、テストパターンが記述できます。
テストパターンが一目瞭然です。


spockをEclipseで使用するには、設定を1箇所変更する必要があります。
Eclipseメニューの「ウィンドウ」→「設定」を選択。


「Groovy」→「Use monospace font for JUnit」をチェックします。


実行してみます。実行方法はJUnitと同じです。
ソースファイルを選択して、右クリック。
コンテキストメニューから「実行」→「JUnit テスト」を選択します。


ユニットテストでエラーになると、こうなります。


Eclipse上だとインデントがズレるので、ちょっと見にくいですが、
テキストをコピーすると下記のようになります。
spockの場合、引数や期待値、実際の値を示してくれるので、わかりやすいですね。
(引数a=0、b=2、期待値は3だけど、実際の値は2で一致してないよ。といっています)

Condition not satisfied:

Math.max( a, b ) == c
     |    |  |   |  |
     2    0  2   |  3
                 false

	at sample.UnitTest.java.lang.Mathのテスト(応用)(UnitTest.groovy:59)

Groovyでデータベースに接続してみる⑤

Groovyでデータベースに接続してみます。

■Groovyでデータベースに接続

package sample

import groovy.sql.Sql

// GroovySQLで、データベース操作します。
// SQL文はダブルクォートで囲みます(シングルクォートだと動かなかった・・・)

// H2データベースを使用します。
// http://www.h2database.com/html/main.html


// H2データベースを起動
server = org.h2.tools.Server.createTcpServer().start()

// DB接続
def sql = Sql.newInstance( 'jdbc:h2:tcp://localhost/~/test', 'sa', '', 'org.h2.Driver' )

// テーブル作成(既にテーブルがある場合のエラーは無視)
try { sql.execute( "CREATE TABLE TEST ( NAME varchar(50), TEXT varchar(100) )" ) } catch( Throwable t ) {}

// INSERT
String name = 'test'
String text = 'text'
sql.execute( "INSERT INTO TEST( NAME, TEXT ) values ( ${name}, ${text} )" )

// UPDATE
text = 'text2'
sql.execute( "UPDATE TEST SET TEXT = ${text} WHERE NAME = ${name}" )

// SELECT
sql.eachRow( "select * from TEST" ) { row ->
  println row.NAME + " : " + row.TEXT
}

// DELETE
sql.execute( "DELETE FROM TEST WHERE NAME = ${name}" )

// 後処理
sql.close()

// H2データベースを停止
server.stop()


GroovySQLを使うと簡潔に書けます。
SQLのパラメータも、変数と自動バインドしてくれるので便利ですね。


また、今回は、H2データベースを使用しました。
Javaで作られているので、JARファイル1つでDB環境が作れます。
ちょっとした動作確認に最適です。

GroovyでExcelファイルの読み込み④

GroovyでExcelファイルの読み込みをしてみます。

■GroovyでExcelファイルの読み込み

package sample

// いろいろと方法がありますが、今回は、GExcelAPIを使用します。
// GExcelAPI:https://github.com/nobeans/gexcelapi

// Groovyの標準的なモジュール管理ツール Grapeも使ってみます。
// @Grab( 〜 )で、利用するライブラリを定義すると勝手にダウンロードしてくれます。
// @GrabResolver( 〜 )で、ダウンロードURLを定義します。

@GrabResolver( name='kobo-maven-repo', root='https://github.com/kobo/maven-repo/raw/master/release' )
@Grab("org.jggug.kobo:gexcelapi:0.2")
import org.jggug.kobo.gexcelapi.GExcel

// Excelファイルの読み込み
def book = GExcel.open( 'sample.xlsx' )
def sheet = book[ 'Sheet1' ]

// セル値の参照
println sheet.A1.value		// セル名指定
println sheet.getRow( 0 )[ 0 ]	// 行列番号指定

// 全行を参照
for( row in sheet.rows ) {
  println row[ 2 ]	// 3列目の値
}	


GExcelAPIを使うと簡潔に書けます。(Javaも利用できるので、ApachePOIやJExcelAPIも利用できます)
通常は、GExcelAPIのJARファイルをダウンロードして、クラスパスを通す必要がありますが、
Grapeのアノテーションを記載しておくと、その作業を自動でやってくれます。便利ですね。

プロジェクトマネージャ試験に合格しました!

平成27年度 春期 プロジェクトマネージャ試験に合格しました!
3回目の挑戦で、やっと合格です!



今回は、今までの受験で一番手応えがありました。
でも、合格するとは思っていなかったので、
「今年も勉強しなきゃ・・・」と半分諦めていたところに、
合格だったので、ちょっと嬉しいです。


一発合格じゃないので、参考にならないと思いますが、
自分のやった事を書いておきます。


■勉強時間
・平日は勉強しない。
・毎週土曜日の午前に2〜3時間勉強した。後半は、日曜の午前中も2〜3時間勉強した。
・午前Ⅰは免除なので、午前Ⅱ、午後Ⅰ、午後Ⅱを交互に勉強した。


■午後Ⅱ
・ひたすら過去問を解く(5〜10年分)。そのうち、問題見たただけで、解答がでてくるようになります。


■午後Ⅰ
・PMの基本知識を覚える事は当然として、問題文から解答を導く方法を覚える事が重要でした。
・下記のみよちゃん本が大変、参考になりました。

情報処理教科書 プロジェクトマネージャ 2012年版

情報処理教科書 プロジェクトマネージャ 2012年版


■午後Ⅱ
・設問で問われていることを理解し、問いに対して、(PMがすべき事で)打ち返す記述で論文を作る必要があります。
・設問から論文の章立てを作成するなど、論文試験特有のテクニック的なものがありました。
・下記のみよちゃん本が大変、参考になりました。

プロジェクトマネージャ 午後II 最速の論文対策 (TACの情報処理技術者試験対策シリーズ)

プロジェクトマネージャ 午後II 最速の論文対策 (TACの情報処理技術者試験対策シリーズ)

・自分のPM経験だけでは、論文は書けません。他人の論文から、PM経験をストックして活用する必要がありました。
・下記の論文集が大変、参考になりました。

プロジェクトマネージャ合格論文の書き方・事例集 (情報処理技術者試験対策書)

プロジェクトマネージャ合格論文の書き方・事例集 (情報処理技術者試験対策書)


■合格してみて思ったこと
・合格したからといって、何か特別なスキルが身についた気はしない・・・ただ、PMの基本知識は身についたので良かったと思う。
・日本語的なスキルは以前より向上した気がする。(設問(文章)から意図を読み取る、適切な文章が書けるなど)これって意外とPMに必要なスキルかもね。
・諦めずにコツコツ勉強続けて良かった・・・
・論文は、下手な字で書いても受かるんだな・・・