Hatena::ブログ(Diary)

Tambourineの日記

2017-10-05

Hyperledgerで遊ぶ(1) - nvmのインストールで挫折

14:31

何やらインストールばかりしているようで何も身についていない気がしなくもないが、今度はHyperledgerで遊んでみることになった。

https://hyperledger.github.io/composer/installing/installing-index.html

を見ながら進めてみることにする。

"Installing the pre-requisites for Hyperledger Composer on Mac OS X"という節には、まずnvmを入れろと書いてあるので、homebrewインストールした。

インストールは成功し、インストール時のメッセージで、.bashrcで/usr/local/opt/nvm/nvm.shを実行するようにと言われた。私は今はfishを使っているので、.config/fish/config.fishで実行するようにしたところ

Unsupported use of '||'. In fish, please use 'COMMAND; or COMMAND'.
/usr/local/opt/nvm/nvm.sh (line 16):   command printf %s\\n "$*" 2>/dev/null || {

と怒られた。/usr/local/opt/nvm/README.mdによると

**Note:** `nvm` does not support [Fish] either (see [#303](https://github.com/creationix/nvm/issues/303)). 

だそうだ。

うーむ・・・と唸っていると、周りのメンバーは誰もちゃんとnvmを入れずに進んでいることがわかったので、とりあえずこのまま進める(笑)。ダメだったら、bashでやり直そう。

Hyperledgerで遊ぶ(2) - いろいろとインストール

14:54

引き続き、pre-reqをインストールしていく。nodeはインストール済みなので、brew upgrade nodeで最新化。Dockerbrew cask install dockerする。

VSCodeMicrosoftからダウンロードして普通にインストールした。Hyperledger Composer Extension for VSCodeは、起動したVSCode拡張機能からインストールする。ついでに、Vimキーバインドエミュレーションも入れておかないと仕事にならないので、いれる。

Hyperledgerで遊ぶ(3) - node.jsはv6じゃないとだめだって!

20:40

で、いよいよHyperledgerを入れようとすると、node.jsのバージョンはv6までじゃないとだめだという

https://hyperledger.github.io/composer/installing/development-tools.html

The following are prerequisites for installing the required development tools:

    Node: 6.x (note versions 7 and higher are not supported)

マジカヨ。それでnvmなのね。

みんなどうしてんの?とチームメンバーに聞いたら、nodebrewを使っているというので、それを使ってみる。インストール方法は、

https://qiita.com/akakuro43/items/600e7e4695588ab2958d

に書いてあるけど、nodebrew install-binary lastestする前に、~/.nodebrew/srcを手で作っておかないと失敗する罠があった。

とりあえず、これでいいのかな?

Hyperledgerで遊ぶ(4) - いよいよインストール

21:11

npmでインストールするらしい。

> npm install -g composer-cli
npm WARN deprecated fs-promise@1.0.0: Use mz or fs-extra^3.0 with Promise Support
npm WARN deprecated crypto@0.0.3: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.
npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated transformers@2.1.0: Deprecated, use jstransformer
npm WARN deprecated nodemailer@2.7.2: All versions below 4.0.1 of Nodemailer are deprecated. See https://nodemailer.com/status/
/Users/tambara/.nodebrew/node/v6.11.4/bin/composer -> /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/cli.js

> fsevents@1.1.2 install /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/node_modules/fsevents
> node install

[fsevents] Success: "/Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node" already installed
Pass --update-binary to reinstall or --build-from-source to recompile

> pkcs11js@1.0.9 install /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/node_modules/pkcs11js
> npm run build


> pkcs11js@1.0.9 build /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/node_modules/pkcs11js
> node-gyp configure build

gyp ERR! configure error 
gyp ERR! stack Error: Python executable "/Users/tambara/.pyenv/shims/python" is v3.6.0, which is not supported by gyp.
gyp ERR! stack You can pass the --python switch to point to Python >= v2.5.0 & < 3.0.0.
gyp ERR! stack     at failPythonVersion (/Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:454:14)
gyp ERR! stack     at /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:443:9
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:189:7)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at maybeClose (internal/child_process.js:920:16)
gyp ERR! stack     at Socket.<anonymous> (internal/child_process.js:351:11)
gyp ERR! stack     at emitOne (events.js:96:13)
gyp ERR! stack     at Socket.emit (events.js:188:7)
gyp ERR! stack     at Pipe._handle.close [as _onclose] (net.js:497:12)
gyp ERR! System Darwin 16.7.0
gyp ERR! command "/Users/tambara/.nodebrew/node/v6.11.4/bin/node" "/Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "build"
gyp ERR! cwd /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/node_modules/pkcs11js
gyp ERR! node -v v6.11.4
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok 

npm ERR! Darwin 16.7.0
npm ERR! argv "/Users/tambara/.nodebrew/node/v6.11.4/bin/node" "/Users/tambara/.nodebrew/node/v6.11.4/bin/npm" "run" "build"
npm ERR! node v6.11.4
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! pkcs11js@1.0.9 build: `node-gyp configure build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the pkcs11js@1.0.9 build script 'node-gyp configure build'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the pkcs11js package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp configure build
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs pkcs11js
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls pkcs11js
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/tambara/.nodebrew/node/v6.11.4/lib/node_modules/composer-cli/node_modules/pkcs11js/npm-debug.log
/Users/tambara/.nodebrew/node/v6.11.4/lib
└── (empty)

npm ERR! Darwin 16.7.0
npm ERR! argv "/Users/tambara/.nodebrew/node/v6.11.4/bin/node" "/Users/tambara/.nodebrew/current/bin/npm" "install" "-g" "composer-cli"
npm ERR! node v6.11.4
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE

npm ERR! pkcs11js@1.0.9 install: `npm run build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the pkcs11js@1.0.9 install script 'npm run build'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the pkcs11js package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     npm run build
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs pkcs11js
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls pkcs11js
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/tambara/npm-debug.log
npm ERR! code 1

あ゛あ゛あ゛、手元の蛇がPython3になっていた・・・

2017-10-03

Gradleでjarをつくる(4)

11:05

CommonとCommonDAOの間の依存関係はちゃんと作れた。

後は、2つのプロジェクトのbuild.gradleの共通部分を、architect直下のbuild.gradleに移しておく。

  • architect/
    • setting.gradle
    • build.gradle
    • Common/
      • build.gradle
    • CommonDAO/
      • build.gradle

共通のbuild.gradleには

subprojects {
  apply plugin: 'java'

  sourceSets {
    main {
      java {
        srcDir 'src'
      }
    }
  }
}

を記述し、各プロジェクト下のbuild.gradleはdependenciesだけになった

2017-09-25

Gradleでjarをつくる(3)

19:19

こんどは(2)でビルドしたプロジェクトに依存しているプロジェクトをビルドする。ちなみに今回ビルドしようとしているのは、Commonプロジェクト。前回ビルドしたのはCommonDAOプロジェクトである。

もちろん、順番にビルドすることにして、依存先のbuildディレクトリ以下のjarファイルにdependenciesを記述してもできると思うが、それではmake以下である。

プロジェクトに依存する場合には、このように書くらしい。

apply plugin: 'java'

sourceSets {
  main {
    java {
      srcDir 'src'
    }
  }
}

dependencies {
  compile project(':CommonDAO')
}

もちろんうまくいかない。

> gradle assemble

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/tambara/hoge/architect/Common/build.gradle' line: 12

* What went wrong:
A problem occurred evaluating root project 'Common'.
> Project with path ':CommonDAO' could not be found in root project 'Common'.

CommonDAOなんて見つからないよと言っている。Gradleはパスの上下関係でプロジェクトの上下関係を認識するようなので、CommonとCommonDAOが横に並んでいるからダメなのだ。

プロジェクト構成は、settings.gradleというファイルで指定する。プロジェクト構成を知るために、Gradleはパスを遡ってsettings.gradleを探す。なので、今回の場合は、CommonとCommonDAOと同じレベルに置いてやれば良い

  • architect/
    • settings.gradle
    • Common/
    • CommonDAO/

こんな感じ。中身は

include 'Common'
include 'CommonDAO'

だけが書いてある。これで、Commonの下でgradle assembleすると、まずCommonDAOのビルドがスタートする。ばっちりである。

2017-09-20

Gradleでjarをつくる(2)

17:08

マルチプロジェクトのJavaのWebアプリケーションをGradleでビルドする試み。前回は、依存するClassがないぞーと怒られる。そりゃそうだなと思う。

まずは、他のプロジェクトに依存しないプロジェクトからやってみるべきである。

というわけで、別なプロジェクトにターゲットを変更。ビルドに必要なライブラリは、Libraryというプロジェクトにjarをかき集めてあるので、そこを依存先に指定する。

apply plugin: 'java'

sourceSets {
  main {
    java {
      srcDir 'src'
    }
  }
}

dependencies {
  compile fileTree(dir: '../Library/Spring', include: '*.jar')
  compile fileTree(dir: '../Library/WACs', include: '*.jar')
}

こんな感じ。ディレクトリにあるjarをまとめて指定できるので楽ちんである。

> gradle assemble

> Task :compileJava
注意:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。


BUILD SUCCESSFUL in 11s
2 actionable tasks: 2 executed

何かwarningが出ているけど、よくわからない。これで、build/libsにjarが出来ている。

2017-09-11

Gradleでjarを作る

18:22

ひとつずつやってみよう。まずは、サブプロジェクトの位置に直接build.gradleを置いて、jarを作ってみることである。プロジェクトにはsrcディレクトリだけがあり、その下には長い長いパッケージ名の彼方に20ぐらいのjavaコードがある。src/jp/co/hoge/fuga/...といった次第である。

とりあえず、中身はこれだけで始めてみよう

> cat build.gradle 
apply plugin: 'java'

タスクのリストを表示してみる

> gradle tasks

> Task :tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'BBusiness'.
components - Displays the components produced by root project 'BBusiness'. [incubating]
dependencies - Displays all dependencies declared in root project 'BBusiness'.
dependencyInsight - Displays the insight into a specific dependency in root project 'BBusiness'.
dependentComponents - Displays the dependent components of components in root project 'BBusiness'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'BBusiness'. [incubating]
projects - Displays the sub-projects of root project 'BBusiness'.
properties - Displays the properties of root project 'BBusiness'.
tasks - Displays the tasks runnable from root project 'BBusiness'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>


BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed          
> 

ちなみにBBusinessは、今試しているディレクトリの名前だ。なぜこんな名前なのかは気にしないで欲しい。

一番上にあるタスクを実行してみようと思う。

> gradle assemble

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

ものすごく一瞬で終わった。怪しい。buildディレクトリが出来ているので、lsしてみる

> ls -lR
total 0
drwxr-xr-x  3 tambara  staff  102  9 11 18:28 libs
drwxr-xr-x  3 tambara  staff  102  9 11 18:28 tmp

./libs:
total 8
-rw-r--r--  1 tambara  staff  261  9 11 18:28 BBusiness.jar

./tmp:
total 0
drwxr-xr-x  3 tambara  staff  102  9 11 18:28 jar

./tmp/jar:
total 8
-rw-r--r--  1 tambara  staff  25  9 11 18:28 MANIFEST.MF

261バイト。いくらなんでも私のプロジェクトはそんなショボくない。

私は、まずやってみてから取説を読むタイプである。

http://gradle.monochromeroad.com/docs/userguide/tutorial_java_projects.html

Gradleは、製品のソースコードsrc/main/javaに、テストのソースコードsrc/test/javaにあることを想定しています。

ソースコードの位置を指定してやる必要があるようだ。

その方法は

http://gradle.monochromeroad.com/docs/userguide/java_plugin.html

に書いてある。参考にして、build.gradleを書き換えよう

apply plugin: 'java'

sourceSets {
  main {
    java {
      srcDir 'src'
    }
  }
}

やってみよう

> gradle assemble

> Task :compileJava
/BBusiness/src/jp/co/hoge/b/bp/BCommonBP.java:5: エラー: パッケージjp.co.hoge.z.common.exceptionは存在しません
import jp.co.hoge.z.common.exception.ZCAApplException;
(以下、たくさんのコンパイルエラー)

おなじみ、CLASSPATHの問題である。

Connection: close