H2(1.4.187 Beta)をビルドしてEclipseで動かす

先日、H2をデバッグ実行する方法を書きました。今日は、H2をビルドしてEclipseに読み込み、テストを実行する方法についてまとめます。

次の環境で動作を確認しました。

準備

JavaEclipseMavenをインストールしておきます。

1. ソースコードのダウンロードと配置

Downloadsから、「Version 1.4.187 (2015-04-10), Beta」のPlatform-Independent Zipをダウンロードします。

Eclipseのworkspaceディレクトリに、h2-2015-04-10.zipを展開します。h2というディレクトリが生成されるので、他のバージョンを展開する時のためにh2-2015-04-10へ名前を変えておくと便利です。

展開したディレクトリに移動します。

% cd h2-2015-04-10

2. JAVA_HOME環境変数の設定

ローカルマシンで利用可能なJavaのバージョンを確認します。

% /usr/libexec/java_home -V
Matching Java Virtual Machines (6):
    1.8.0_40, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
[...]
    1.7.0_75, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home

JAVA_HOMEの環境変数を確認し、設定されていない場合は設定します。H2は、JDK 1.6以上であればビルドできます。ここでは1.8.0を利用します。

% echo $JAVA_HOME

% export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_40`
% echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

H2はJavaでビルドを行うため、この設定が必要です。プロジェクトのルートにあるbuildスクリプトを実行すると、src/tools/org/h2/build/Build.javaの内容が実行されます。

3. H2をビルドする

プロジェクトルートのbuild.shを実行します。入力待ちの状態になるので、ターゲット「jarClient」を入力し、Enterキーを押します。

% ./build.sh -
Shell mode. Type the target, then [Enter]. Just [Enter] repeats the last target.
build> jarClient

初回ビルド時には、Mavenで依存ライブラリがダウンロードされるので、少し時間がかかります。自分の環境では90秒くらいでした。

ビルドが完了したら、Ctrl-Cで終了します。

4. Eclipseでプロジェクトをインポートする

Eclipseを起動し、[File]→[New]→[Java Project]を選択します。[New Java Project]ウィンドウで、次のように設定します。

  • Project name: 下記の設定をすると自動補完されます
  • Use default location: チェックを外す
  • Location: 先ほどH2をビルドしたディレクト

設定後、[Next]ボタンを押します。

この時、「The output folder has changed. Do you want to remove all generated resources from the old location[...]」というダイアログが表示されるかもしれません。Eclipseがデフォルトで出力先にするbinディレクトリに、先ほどのビルドによる生成物が存在するので、.classファイルが存在するtempディレクトリをEclipseが出力先として選び直すそうです。その上で、binにあったものを消していいかどうかを尋ねています。どちらでもよいですが、ここでは「No」にしておきます。

Java PerspectiveのPackage Explorerペインに、作成したプロジェクトが表示されている様子を次に示します。


5. tools.jarへの参照を追加する

上の図を見ると、プロジェクトにエラーが出ています。Problemsペインで確認すると、com.sun.javadocパッケージのクラスを読み込めていません。そこで、tools.jarをビルドパスに追加します。

プロジェクトを右クリックし、コンテキストメニューから[Build Path]→[Configure Build Path]を選択します。[Add External JARs]ボタンを押します。JDKのルートのlibディレクトリにあるtools.jarを選択します。

プロジェクトにtools.jarが読み込まれると、エラーが消えます。

6. 動作確認

最後に、テストを動かせることを確認しておきます。

プロジェクト直下の「src/test」ソースフォルダを開きます。org.h2.samplesパッケージのHelloWorld.javaを右クリックし、[Run As]→[Java Application]で実行します。

Consoleペインに「Hello」と表示されれば成功です。ブレークポイントを設定すれば、デバッグ実行もできるようになりました。

以上です。

楽園の泉

面白かった。

楽園の泉

楽園の泉

finalfusionさんから『遥かなる地球の歌』とあわせて教えてもらって、読みました。

ハリウッド映画になってもおかしくなさそうな英雄譚(なってないのかな?)。心臓が止まりそうな終盤の展開も最高だった。人間離れというか、人類離れしたエピローグについては、なくてもいいのではと感じたけど、『幼年期の終わり』の作者らしいと思った。

前回の播種船に引き続き、よくある題材と聞いてはいたけど初めて読む「宇宙エレベーター」の話で、その面でも満足感があった。スリランカに似た舞台で、古代の王族の話(創作)を交えながら、混沌とした時間軸で話が進む。食い合わせの妙という感じ。

2015年2月に会社ブログに書いた記事と、振り返り

最近日記を書いてないので、思い出したように振り返り。

ブログ

1本だけ書きました。

仕事絡み

  • Deep Securityを初めて触った
  • Ansibleを実案件で使おうとして時間切れで挫折した
  • CentOSのセキュリティ設定の本を読んだ
  • AWSのWorkDocsのウェビナーを聞いた
    • ADSの中の人たちがウェビナーの資料レビューをWorkDocsでやっていると言っていて、おぉーさすがーと思った

趣味

  • 1月に引き続き、通勤中にKindleで読書が捗った
  • Quartermaster General(クオマスと呼んでる)が面白くて、かなり遊んだ
    • 複数人でも、1人でカードを眺めても楽しい

そんな感じでした。

遙かなる地球の歌

仕事でバタバタしていて感想を書いていなかった。読みました。面白かった。

遙かなる地球の歌

遙かなる地球の歌

幼年期の終り』を読んだ後に、finalfusionさんからコメントですすめてもらって手に取りました(Kindleで読むと「手に取る」が論理レイヤーの動詞になるのがちょっと面白いですね)。前回と同じ作者の作品です。

『遙かなる地球の歌』は、『幼年期の終り』にくらべて人間ドラマ感がさらに強いわりに、視点人物が最後までほぼ常に冷静なので、こちらのほうが読みやすいかも。

そういえば、滅亡に瀕した人類が宇宙に送り出す「播種船」という箱舟の現代用語に、この本で初めて出会いました。最近読んだ『シドニアの騎士』にも同じものが出てきたので、ロボットやタイムマシンと同じくらい、この手のジャンルではよくある題材なのかもしれない。過去にSFをほとんど読んできていないので、こういったメタ知識を得ることも新鮮で面白い。w

作中では、何世紀も前に死んだ人々に登場人物たちが思いを馳せる場面が、何度も出てくる。それがすごくよかった。自分より圧倒的に高い知性が、生きていくこと死んでいくことのはかなさを美しく料理してくれた作品を味わうと、自分が抱える寂しさを慰撫されたように感じる。サラッサでモーセ・カルドアが籠っていた<最初の着陸地点>の大聖堂も、彼にとってはそういう場所だったのかもしれない。本はすごい。

H2をデバッグ実行する方法

H2ソースコードを読むために、H2をEclipse上でデバッグ実行する方法を説明します。依存ライブラリにH2を持つ空プロジェクトを作成します。

次の環境で動作を確認しました。

準備

以降の手順では、ビルドツールのGradleを使います。ダウンロードしてインストールしておきます。「gradle --version」としてバージョンが表示されることを確認します。

また、H2のソースコードからサンプルをコピーアンドペーストするので、Version 1.3.176のPlatform-Independent Zipをダウンロードして展開します。1.3.176は、現時点のLast Stableです。

1. 空プロジェクトの作成(任意)

Gradleのカスタムinitタスクを作成するスクリプトを、USER_HOME/.gradle/init.d/以下に配置します。

% cd ~/.gradle/
% git clone https://github.com/taichi/init_scripts.git init.d

このタスクを実行することで、Maven構成のJavaプロジェクトが簡単に手に入ります。

2. H2のjarとソースコードのダウンロード

Eclipseのworkspace内に、プロジェクト用のディレクトリを任意の名前(h2-read)で作成して、移動します。

% mkdir ~/Documents/luna-workspace/h2-read
% cd ~/Documents/luna-workspace/h2-read
手順1.を実行した場合

Gradleのコマンドで、空のJavaプロジェクトを作成します。

% gradle init
% ls -la
total 72
drwxr-xr-x  13 USER_NAME  staff    442  3  8 23:05 .
drwxr-xr-x   9 USER_NAME  staff    306  3  8 22:59 ..
-rw-r--r--   1 USER_NAME  staff    126  3  8 23:05 .gitignore
drwxr-xr-x   3 USER_NAME  staff    102  3  8 22:59 .gradle
drwxr-xr-x   3 USER_NAME  staff    102  3  8 23:05 .settings
-rw-r--r--   1 USER_NAME  staff  11357  3  8 23:05 LICENSE
-rw-r--r--   1 USER_NAME  staff     76  3  8 23:05 README.md
-rw-r--r--   1 USER_NAME  staff    509  3  8 23:05 build.gradle
drwxr-xr-x   3 USER_NAME  staff    102  3  8 23:05 gradle
-rw-r--r--   1 USER_NAME  staff      0  3  8 23:05 gradle.properties
-rwxr-xr-x   1 USER_NAME  staff   5080  3  8 23:05 gradlew
-rw-r--r--   1 USER_NAME  staff   2404  3  8 23:05 gradlew.bat
drwxr-xr-x   4 USER_NAME  staff    136  3  8 23:05 src

自動生成されたbuild.gradleを編集して、H2をダウンロードするための設定を追加します。

% vi build.gradle

冒頭にプラグイン読み込みを追加します。

apply plugin: 'eclipse'

dependenciesに、次の行を追加します。

dependencies {
  compile 'com.h2database:h2:1.3.176'
(略)
}
手順1.を飛ばした場合

ディレクトリ(h2-read)のルートで、Gradleのビルドスクリプトを新規に作成します。

% vi build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'

repositories {
  mavenCentral()
}

dependencies {
  compile 'com.h2database:h2:1.3.176'
}
共通手順

Gradleのコマンドを実行して、Eclipseプロジェクトを作成します。

% gradle eclipse
:eclipseClasspath
Download https://repo1.maven.org/maven2/com/h2database/h2/1.3.176/h2-1.3.176.pom
Download https://repo1.maven.org/maven2/com/h2database/h2/1.3.176/h2-1.3.176.jar
Download https://repo1.maven.org/maven2/com/h2database/h2/1.3.176/h2-1.3.176-sources.jar
:eclipseJdt
:eclipseProject
:eclipse

BUILD SUCCESSFUL

Total time: 11.189 secs

プロジェクトルートに.projectファイルが作成されたことを確認します。

3. Eclipseへプロジェクトをインポートする

手順2.で作成したプロジェクトを、Eclipseにインポートします。

EclipseJavaパースペクティブで、[File]→[Import]→[General]→[Existing Projects into Workspace]→[Next]と進み、「Select root directory」を選択して、先ほどのプロジェクト(h2-read)を指定します。[Finish]ボタンを押します。

手順1.を飛ばした場合

プロジェクトにソースフォルダが生成されないため、作成する必要があります。

Package Explorerでプロジェクト(h2-read)を右クリックして、コンテキストメニューから[New]→[Folder]と進み、「Folder name:」に「src/main/java」と入力し、[Finish]ボタンを押します。

作成されたフォルダを右クリックして、コンテキストメニューから[Build Path]→[Use as Source Folder]を選択します。プロジェクトの下に「src/main/java」というソースフォルダが作成されます。

4. H2テストコードの作成と実行

「src/main/java」を右クリックして、コンテキストメニューから[New]→[Class]を選択します。「Package」に任意の名前(test)、Nameに「HelloWorld」と入力し、[Finish]ボタンを押します。

zipでダウンロードしたH2のソースコードから、./src/test/org/h2/samples/HelloWorld.javaを取り出して、作成したJavaファイルにコピーアンドペースとします。その際、パッケージ名を先ほど自分で作成したパッケージ名に書き換えます。

編集前。

package org.h2.samples;

編集後。

package test;

EclipseでHelloWorld.javaを右クリックして、コンテキストメニューから[Run As]→[Java Application]を選択します。Consoleウィンドウに「Hello」と出力されたら、テストの実行は成功です。

5. テストコードのデバッグ実行

Eclipse上でHelloWorld.javaの「Class.forName("org.h2.Driver");」行の左端でダブルクリックして、ブレークポイントを追加します。

今度は、HelloWorld.javaを右クリックして、コンテキストメニューから[Debug As]→[Java Application]を選択します。デバッグ画面が開き、1行ずつ実行できます。

以上です。

幼年期の終り

コロニーにおける実験音楽の多くは、完全に意識的に、いわば"時の小節"とでも呼ばれるべきものと結合していた。人間の心がとらえることができる最短の音は何か あるいは、退屈を感じない範囲で堪えることのできる最長の音は? そしてその結果は、各種の条件を設定したり、または適当な管弦楽法を用いたりすることで変えられるのだろうか?

読み終わったばかりの『幼年期の終り』の一節から。次の記事を読んで思い出した。

iOS 7でも使えるというので、ダウンロードして使ってみた。カメラとフラッシュに指を当てて待つと、心拍数が測れるらしい。ユーザの心拍数と時刻を元に、なんらかのロジックで音楽が生成される。へぇ、という感じです。

まあそれは余談で、『幼年期の終り』。ものすごく面白かった。

幼年期の終り

幼年期の終り

硬質なのに叙情的で、未来的なのに神話的。なんだこれはと思った。『百億の昼と千億の夜』のスケール感に近いかも(輪廻転生の話はない分、ドライだけど)

物語の中では百年くらい時間が経過する。その時その時の視点人物を取り巻く情景描写と意思の描写が生き生きとしていて、話に引き込まれる。翻訳が本当に素晴らしい。

特に、とある望みがついに叶わないまま晩年を迎え、枯れた木立の間をゆっくりと散歩する"リッキィ"の足元を吹いていただろう淋しい風のことを思うと、胸が詰まる。

最高でした。

人にタスクを手伝ってもらいたい時に提供すべき情報

タスクがあふれた時、同僚に助けてもらうには、どうすればよいか。逆に、どんな情報を提示してもらえば、同僚のタスクを引き受けやすいか。

切羽詰まっている時には、こういうことを考える余裕がありません。だから平時に考えておかなければならないと思います。

というわけで考えた。

情報の開示

  • すべての情報は皆に見える場所に記録する
    • 組織で使っているタスク管理ツールやwikiなどに書く
    • チャットは流れるからダメ
    • 以下の項目も、基本的に同じ場所に書く
  • 最新の状況の説明
    • 残っているタスクは何か
    • 着手中のタスクは何か
      • 着手中のタスクの完了目処はたっているか

アウトプットの定義

  • タスクのアウトプットを具体的に定義する
    • ゴール、終了条件といいかえてもよい
    • ダメな例は、"Aの構築"とか、"Bの提案"とか
    • こういうフォーマットでこういう目的の提案書を誰向けに作成する、とか
    • Xの構築とYのインストールをしてfoo様に連絡してメールで返信をもらう、とか
  • アウトプットの形式を定義する
    • ドキュメント作成の場合、成果物の体裁について、受け取る相手の合意を得ておく
    • 形式のサンプルを、皆に見える場所に貼り付けておく
    • そこまで到達していないタスクには「このタスクのアウトプットの形式は未定義。決めることもタスクのうちです」と明示する(重要)

納期

  • しめきり
    • 日程締め切りと状況締め切りがある
    • 何月何日まで、あるいは、fooさんの次のアポが取れるまでのどちらか近い方、とか
  • 人に頼まずに依頼者が自分でやればどれくらいかかると思っているか
    • すんなりいった場合の日数からハマった場合の日数まで、幅で出す
      • 引き受ける側が、他のタスクとのバランスを考えるための材料の提示
    • 能力を誇示する場ではないので、日数に見栄を張らないように
      • その期間を超えたら、手伝ってくれていた人からタスクを返してもらう、くらいの気持ちで設定するとよいかも

必要なスキル

  • タスク遂行に必須と思われる専門的なスキルがあれば書く
    • 特定のOS、ミドルウェアフレームワークなどの知識がないと話にならないならそう書く
      • "AとBとCというスキルが必要"とわかれば、AとBはわかるからCだけ調べながらできるな、とか判断してもらえる
    • 必須条件は少ない方がもちろんよい
  • そのスキルがない人に助けてもらうしかない場合は、ガイドを示す
    • 参照する本、詰まったら相談できる人(依頼者自身でもよい)
    • 依頼者が1h説明した後、残りをやってもらう、など

レビュー、仕上げ

  • 依頼者が干渉した方がよいポイントはあるかないか。ある場合、タイミングはいつか
    • レビューが必要なら前もって言うべし
    • レビュー前提、スピード優先で、まず仕上げて欲しいのか
    • 最初から最後までまかせられる内容なので、その人のスタイルで完遂を目指してもらうのがよいのか

こんなところかな。