最新のHyperLederFabricをProxy環境下でビルドする

2016/06にv0.5-developer-previewが出たfabricですが、現在も日々コードが書き換わりまくっています。
今日落とすと0.7.0がおちてきます。直近のマイルストンは以下のとおり
・2016/10 :アルファ版
・2017/01 :v0.1-ベータ版
・2017/03 :v1.0正式版

製品ソースも変わっていますし、開発環境の構築の中の仕組みも結構変わっているようです。
最新版(0.7.0)をProxy環境下でビルドしたら結構はまったので対処法を記載しておきます。
※Porxyが必要ない環境であれば以下手順でビルドするのは変わっていません。
garapon.hatenablog.com


各種準備

事前準備、fabricのソースのDLまでは以下手順に従い進めましょう。
Windows上にhyperledger/fabricを環境構築する。 - 自分の仕事を憎むには人生は余りにも短い

Vagrantファイルの書き換え

fabric\devenv\Vagrantfile
を修正してProxy設定を入れます。L33の下にこんな風書きます。

Vagrant.configure('2') do |config|
if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http = "http://proxyserver:8080/"
    config.proxy.https = "http://proxyserver:8080/"
    config.proxy.no_proxy = "localhost,127.0.0.1"
end

VM起動

cd %GOPATH%\src\github.com\hyperledger\fabric\devenv\
vagrant up

upが終わったらprovisionしていきましょう。

vagrant up --provision

DockerImageのビルド準備

DockerImageをこれからビルドしていくのですが、その中でProxy設定が通らないものがありますので
先にProxy設定をいれていきます。

fabric\images\javaenv\Dockerfile.in
L3とL9を書き換えます。WgetcurlにProxyを設定します

L3:RUN wget http://services.gradle.org/distributions/gradle-2.12-bin.zip -P /tmp --quiet
L9:  && curl -fsSL http://apache.osuosl.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN

L3:RUN wget -e HTTP_PROXY=http://proxyserver:8080/ http://services.gradle.org/distributions/gradle-2.12-bin.zip -P /tmp --quiet
L9:  && curl -fsSL -x proxyserver:8080 http://apache.osuosl.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN

とします。

fabric\core\chaincode\shim\java\javabuild.sh
を書き換えます。GradleにProxyをとおします。

gradle -q -b ${PARENTDIR}/core/chaincode/shim/java/build.gradle build

これが

gradle -Dhttp.proxyHost=proxyserver -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxyserver -Dhttps.proxyPort=8080 -q -b ${PARENTDIR}/core/chaincode/shim/java/build.gradle build

こうなる


これでOK。
おわったら立ち上がったLinuxにログインして作業を進めます。
garapon.hatenablog.com

DockerImageのビルド

さっそくビルドしましょう。

$ cd $GOPATH/src/github.com/hyperledger/fabric
$ make peer-image
$ make membersrvc-image

確認します。

$ docker images
REPOSITORY                      TAG                             IMAGE ID            CREATED             SIZE
hyperledger/fabric-membersrvc   latest                          6e0ad0ce5870        2 hours ago         1.44 GB
hyperledger/fabric-membersrvc   x86_64-0.7.0-snapshot-42ca84b   6e0ad0ce5870        2 hours ago         1.44 GB
hyperledger/fabric-peer         latest                          6323f96d118c        3 hours ago         1.446 GB
hyperledger/fabric-peer         x86_64-0.7.0-snapshot-42ca84b   6323f96d118c        3 hours ago         1.446 GB
hyperledger/fabric-javaenv      latest                          484a2c1d472e        3 hours ago         791 MB
hyperledger/fabric-javaenv      x86_64-0.7.0-snapshot-42ca84b   484a2c1d472e        3 hours ago         791 MB
hyperledger/fabric-ccenv        latest                          12e4b7c10976        3 hours ago         1.439 GB
hyperledger/fabric-ccenv        x86_64-0.7.0-snapshot-42ca84b   12e4b7c10976        3 hours ago         1.439 GB
hyperledger/fabric-src          latest                          8b4953ed2add        3 hours ago         1.418 GB
hyperledger/fabric-src          x86_64-0.7.0-snapshot-42ca84b   8b4953ed2add        3 hours ago         1.418 GB

いっぱい出来ましたね。

fabricネットワークの起動

さてきどうしましょう。起動する前に
fabric\bddtests\bdd-docker\docker-compose-4-consensus-batch.yml
を修正します。
L18を

    - 7050:7050

と書き直しましょう。これを7050にしておくことでVagrantを起動している外からアクセス可能になります。

書き直したら起動!

$ cd cd $GOPATH/src/github.com/hyperledger/fabric/bddtests/bdd-docker
$ docker-compose -f docker-compose-4-consensus-batch.yml up --force-recreate -d

確認してみると

$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                    NAMES
a8e67ef73d7c        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours                                   bdddocker_vp2_1
215ecca8e1a3        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours                                   bdddocker_vp1_1
83688e10e2a3        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours                                   bdddocker_vp3_1
2e4ba2618554        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours          0.0.0.0:7050->7050/tcp   bdddocker_vp0_1
d94ead61d86d        hyperledger/fabric-membersrvc   "membersrvc"             2 hours ago         Up 2 hours                                   bdddocker_membersrvc0_1

動いてますね。

やれやれ

Windowsのバッチファイルで日付取得するたった一つの冴えたやり方

みなさんCMDつかってますかー!
日本のエンタープライズで働いている限り使わざるを得ないCMDいやいや使うよりかっこよく使いこなしましょう。

CMDで日付(今日だったら20160926)のファイル名を作りたいときとき
Windows環境変数「DATE」の中には日付が入っていますが、スラッシュ含みの形式になっています。2016/09/26といった形式。(環境で異なることがあります)
しかしスラッシュはWindowsのファイルやフォルダ名に使用できないため、スラッシュを取り除く必要があります。

そんなときは

%DATE:/=%

をつかいましょう。

ログに吐くならこんな感じですね。

echo aa >> %DATE:/=%.log

これは日付文字列の「2016/09/26」に対して「/」を「」空文字に置換するという命令です。


ネットで検索すると以下のやり方が主流なようなのだけど、ぱっとみの可読性が低く僕はすきじゃない。

echo %date:~0,4%%date:~5,2%%date:~8,2%

これは「2016/09/26」から0-4文字と5-7文字目と必要な文字を抜き出して知れらを結合しています。
ぜひ上記の文字抜き出しで書いていて可読性を下げているバッチスクリプトがあったら「%DATE:/=%」で書き直してみてはいかがだろうか

ちなみにどちらもちゃんと同じ結果です。もちろん

C:\Users\garapon>echo %DATE:/=%
20160926

C:\Users\garapon>echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
20160926

TIME部分も必要な場合TIMEはミリ秒の区切り文字が異なる為、切り出しをしないといけないのでそれはわるくないとおもいますよ。

游ゴシックはフォントサイズや拡大縮小で見た目が変化し別の文字に見える

まず、この文字を見てください
f:id:GARAPON:20160921121356p:plain

何に見えます?
数字の8の下にアンダーバーがあるような文字にみえてなんじゃこりゃってなる。
そこから考えてみるとあ、「一旦」?ってなってそうおもってみればみえなくないですが、
感じなのに角が丸まって見えるのが非常に違和感があります。
漢数字の1も留めが着いてない単なる棒なので余計わかりにくい。

拡大してみると
f:id:GARAPON:20160921121407p:plain
こんな感じで角が薄く表示されている。

比較

游ゴシック、MeiryoUI、MSゴシックでフォントサイズで比較してみるとこんな感じ。
f:id:GARAPON:20160921121451p:plain
サイズ8、11、14で丸くなっていることがわかる。比べてみるとMeiryoも縦線が太くなったりしている。
MSゴシックはちゃんときれい。

フォントデザインの仕組みは良くわかりませんがこれは気持ち悪い。
Windowsの問題なのかもしらんけども、解像度が低くてもきれいに見えるようなフォントがいいなぁ、、、、、

Opencv3.1で顔検出

かおかおかおーかおかおかーおーかおかおかおー by たくみ

ということで顔検出してみる。

Opencvインストール

http://opencv.org/downloads.html
からDLした3.1を適当に解凍。以後の例では「C:\tool\opencv-3.1.0」に解凍したとしてすすめます。
3系と2系でAPIが結構変わっているので古いサンプルを動かしたい人は2系のほうがいいかもしれませんが、私は最新版で行きます。

Javaから使う準備

Javaから呼び出すには2つ作業が必要です
1、「C:\tool\opencv-3.1.0\build\java\opencv-310.jar」をクラスパスに通す
2、「C:\tool\opencv-3.1.0\build\java\x64\opencv_java310.dll」にパスを通す
2はめんどくさいので、手抜きするなら該当のDLLをプロジェクトフォルダ直下にコピーしましょう。

カスケード分類の用意

C:\tool\opencv-3.1.0\sources\data\haarcascades にあるhaarcascade_frontalface_default.xml を同じくプロジェクトフォルダ直下におきましょう。

動かしてみる

こんなソースを書きます。
http://opencv.blog.jp/java/face_detect
が2系のソースなので「org.opencv.highgui.Highgui」ではなく「org.opencv.imgcodecs.Imgcodecs」で読み書きをするように書き換えました。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;

public class 顔検出 {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 入力画像の取得	
        Mat im = Imgcodecs.imread("input.jpg");
        // カスケード分類器で顔探索
        CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_default.xml");
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(im, faceDetections);
        // 見つかった顔を矩形で囲む
        for (Rect rect : faceDetections.toArray()) {
            Imgproc.rectangle(im, new Point(rect.x, rect.y),
                    new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 0, 255), 5);
        }
        // 結果を保存
        Imgcodecs.imwrite("ouput.png", im);
    }
}

んで実行すると、、、

f:id:GARAPON:20160913175405p:plain
5名中4名は見えました。さすがに横顔は無理ですね。しかしすげー世界だなーいろいろらくだなー


顔写真はココから借用 http://www.photo-ac.com/

TensorFlowをセットアップしてみる

ほんとはGPUとかつかいたいのでそれっぽいマシンが必要ですが、
とりあえずてじかにあったUbuntu 16.04にセットアップ。
以下はCPUのみ版の手順なので、GPUをちゃんと積んでるマシン等の場合は以下サイトでちゃんと手順を確認しましょう。
https://www.tensorflow.org/versions/master/get_started/os_setup.html

pip インストール

$ sudo apt-get install python-pip python-dev
$ python --version
Python 2.7.10

ぱいそん2.7がはいったので、それにあわせたバイナリをおとす

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
# Python 2
$ sudo pip install --upgrade $TF_BINARY_URL

Porxy環境の人は pip のうしろに「--proxy=user@proxy.hoge.jp:port」を忘れずに。

Virtualenv インストール

# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev python-virtualenv
$ virtualenv --system-site-packages ~/tensorflow
$ source ~/tensorflow/bin/activate

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
# Python 2
(tensorflow)$ pip install --upgrade $TF_BINARY_URL
(tensorflow)$ deactivate
$  # Your prompt should change back

Anaconda インストール

Download Anaconda Now! | Continuum

から該当のインストーラをDLする。わざわざインストーラ落とさないといけないって珍しいね。
DLしたらDLディレクトリまで行って

$ bash Anaconda2-4.1.1-Linux-x86_64.sh 

フォルダ等を聞かれるので任意に答える。
インストール終わったら、新しいターミナルで

# Python 2.7
$ conda create -n tensorflow python=2.7

Proxy環境下の場合「~/.condarc」に

proxy_servers:
    http: http://your.proxy.server:8080
    https: http://your.proxy.server:8080

を書いておかないと「Fetching package metadata .」の文字がでてずーーととまっているので気をつけましょう。

tensorflow インストール

$ source activate tensorflow
(tensorflow)$  # Your prompt should change

# Linux/Mac OS X, Python 2.7/3.4/3.5, CPU only:
(tensorflow)$ conda install -c conda-forge tensorflow

こんにちわ世界

http://dev.classmethod.jp/machine-learning/tensorflow-hello-world/

ここのハローわーるどを実行してみます

import tensorflow as tf
import multiprocessing as mp
 
core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)
 
hello = tf.constant('hello, tensorflow!')
print sess.run(hello)
 
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)
$ python  test.py
hello, tensorflow!
42

うごいてますね!!
わーい。

hyperledger/fabricの最新版でDockerバージョンがあわずChainCodeのデプロイに失敗する

Fabricの最新版で環境を作っていたらChainCodeがデプロイしても動かない。
エラーを見てみたら「 Launch -> ERRO bf9 launchAndWaitForRegister failed Error starting container: API error (400): {"message":"starting container with HostConfig was drecated since v1.10 and removed in v1.12"}」てな感じでChainCode用のDockerを起動できていない

07:40:27.360 [rest] ProcessChaincode -> INFO a9d REST successfully deploy chaincode: {"jsonrpc":"2.0","result":{"status":"OK","message":"c8a656473ab6e760a6f65c6811f3883f76a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9ad4eff501b7cb73a271c3d00070e11c856a20e"},"id":1}
07:40:28.062 [chaincode] getArgsAndEnv -> DEBU aee Executable is /opt/gopath/bin/c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff94eff501b7cb73a271c3d00070e11c856a20e
07:40:28.062 [chaincode] Deploy -> DEBU aef deploying chaincode c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9ad4eff501b7cb73a2c3d00070e11c856a20e(networkid:dev,peerid:vp0)
07:41:06.666 [chaincode] getArgsAndEnv -> DEBU beb Executable is /opt/gopath/bin/c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff94eff501b7cb73a271c3d00070e11c856a20e
07:41:06.666 [chaincode] launchAndWaitForRegister -> DEBU bec start container: c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9adff501b7cb73a271c3d00070e11c856a20e(networkid:dev,peerid:vp0)
07:41:06.764 [chaincode] Launch -> ERRO bf9 launchAndWaitForRegister failed Error starting container: API error (400): {"message":"starting container with HostConfig was drecated since v1.10 and removed in v1.12"}

みてみるとイメージは出来ているが起動できない

$ docker images
REPOSITORY                                                                                                                                 TAG                 IMAGE ID          CREATED             SIZE
dev-vp0-c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9ad4eff501b7cb73a271c3d00070e11c856a20e   latest              559dd9b2d826      42 seconds ago      1.726 GB
dev-vp2-c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9ad4eff501b7cb73a271c3d00070e11c856a20e   latest              64c3aff795ac      42 seconds ago      1.726 GB
dev-vp3-c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9ad4eff501b7cb73a271c3d00070e11c856a20e   latest              505226730e4e      42 seconds ago      1.726 GB
dev-vp1-c8a656473ab6e760a6f65c6811f3883f76e7a648adedd2c1c5e4be37210abe2c7b3a73ec15c0bd6196c3f85ff9ad4eff501b7cb73a271c3d00070e11c856a20e   latest              20c182276ea1      43 seconds ago      1.726 GB

Docker1.12の変更に対応できていないようですね。
HostConfig will be deprecated since Docker 1.12 · Issue #2044 · hyperledger/fabric · GitHub
一部対応されているようなのだけどMasterにまだはいっていないもよう

1.11.2にダウングレードを試みる。

$ sudo apt-cache showpkg docker-engine
$ sudo apt-get install docker-engine=1.11.2-0~trusty

$ docker -v
Docker version 1.11.2, build b9f10c9

ダウングレードできたので、最初から上げなおし。とおもったら
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
となったので起動しない。色々やっても起動しない。
すでに色々イメージがある状態でダウングレードするとだめみたいね。まあそりゃそうか。

なんでしょうがないので、Vagrantでイメージ作るところからやり直す。
まっさらなVMを用意して、
github.com\hyperledger\fabric\devenv\setup.sh
を書き換える。

L69 の
# Install docker
apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine
⇒
# Install docker
apt-get install -y linux-image-extra-$(uname -r) apparmor
apt-get install -y  docker-engine=1.11.2-0~trusty

と書き換えてdockerをバージョン指定でインストールさせる。

これでOK。VMから作り直しましょう。

VirtualBoxから「hyperledger」イメージを削除してきれいな体にしてから

vagrant up
vagrant up --provision

でOK.その他の手順は以下と同じ。これでDockerを1.11.2固定の環境が出来た。

garapon.hatenablog.com

やれやれ