まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:pi

Windows 3.x 時代の標準ファイラー(もう「ファイラー」という用語すら耳にしなくなったけど・・)だった File Manager が Windows 10 向けに Microsoft Store からダウンロード可能になった、というニュースがありました:
2019021101


まあエクスプローラーを使っている人にその前身とも言える File Manager が使いやすいかどうかは??? ですが、マルチウィンドウ間でファイルをコピーしたり、それなりに便利だった記憶はあります。

が、自分にとって「ファイラー」と言えばやはり「FD」です:
2019021102


Microsoft Windows がまだ広まる前、MS-DOS/PC-DOS 全盛だった平成初期において、ファイルのコピーや閲覧/編集、圧縮/解凍、ディレクトリ操作、そしてコマンド実行といった基本操作を(GUI と呼ぶのは違う気がするけど)視覚的にわかりやすく操作できるフリーソフトのツールで、やはり当時全盛だったパソコン通信や雑誌の付録を中心に広まり、「ほぼ OS の一部」と思えるくらいみんなが使っていたツールとなりました。ちなみに DOS 版はバージョン 3.13 まで開発が続けられ、作者の A.Idei(出射厚)氏は 2004 年に逝去されました。

この FD は DOS 以外の環境でも動作するよう多くの移植が行われています。例えば 32bit Windows アプリケーションとして動く WinFD や、Java 環境下で動作する jFD2 などがあります。そして Linux/UNIX 環境向けに移植されたのが今回紹介する fdclone です:
2019021103


この fdclone はラズベリーパイ向けにも移植されており、以下のコマンドでインストールできます:
$ sudo apt-get install fdclone

fdclone を実行するにはコマンドラインから "fd" で実行できます:
$ fd

オリジナル FD のショートカットキーはほぼ全て移植されているようで指が覚えている人はそのまま使えます。例えば終了は "q" です。


FD を使っていたおじさんと、コマンドラインからのファイル操作に慣れていない人は入れておくのがいいと思います。


ラズベリーパイ(以下「ラズパイ」)で遊べるゲームも珍しくなくなってきていますが、ラズパイのテキストコンソールでも遊べるゲームを探してみました。


(1) BSD Games

まずは BSD Games です。FreeBSD など BSD ベースの UNIX に搭載されたテキストベースのゲームが元で、今では多くの UNIX ベースの OS に移植され、遊べるようになっています。個人的にもおそらく人生で最初に遊んだ UNIX のゲームがこの中に含まれている worm でした。

ラズパイにインストールする場合は以下のコマンドで導入できます:
$ sudo apt-get install bsdgames

導入が成功すると /usr/games/ 以下に多くのゲームが確認できるようになります:
2019020201


この中のファイルを指定してゲームを遊ぶことができます。例えば上記の worm も含まれていますが、コンソールから worm と入力することで worm を起動して遊ぶことができます:
2019020202
↑ vi のキーを覚える目的で使ってました・・


(2) CGames

CGames は Linux テキストコンソール向けに比較的メジャーな3つのゲーム(倉庫番、マインスイーパー、スライディングブロック)を提供するパッケージです。ラズパイの場合、apt-get install では導入できないのですが、ソースコードからビルドすることで導入できます。

ソースコードを入手して、ビルド、インストールするまでの操作コマンドは以下になります:
$ sudo apt-get install libgmp-dev libncurses5-dev

$ wget http://www.muppetlabs.com/~breadbox/pub/software/cgames-2.2a.tar.gz

$ tar xf cgames-2.2a.tar.gz

$ cd cgames-2.2a

$ ./configure --disable-mouse --with-ncurses

$ make

$ sudo make install

最後まで完了すると、/usr/local/games 以下に3つのゲームが導入されます。なお、このフォルダにはパスが通っていないので、必要に応じて環境変数を書き換えてください:
2019020203


csokoban(倉庫番)を起動するとこんな感じ。矢印キーで操作できます。これは持論なのですが、パズルゲームは1人で時間制限なしに遊べるのがいいと思っています。そして倉庫番やマインスイーパーはその条件を満たしていて、そんなゲームがラズパイのコンソールでも遊べる、というのはいいですよね:
2019020204


ラズパイ操作中の気分転換にいい感じです。


ラズベリーパイ(Raspbian OS)に NoSQL 型のデータベースである Apache CouchDB を導入する手順を紹介します:
2019011402


Apache CouchDB (以下、"CouchDB")はオープンソースで提供されている NoSQL データベースです。IBM Cloud の IBM Cloudant はこの CouchDB をベースに提供されているマネージド DBaaS です:
2019011401


なお、IBM Cloudant は分散データベース環境がはじめから提供されていますが、以下で紹介する例では CouchDB を1インスタンスで運用する前提での導入方法とさせていただきます。また導入する CouchDB のバージョンは 2019/01/14 時点での最新版である 2.3.0 を対象としています。

まずは準備作業としてリポジトリをアップデートしておきます:
$ sudo apt-get update -y

$ sudo apt-get dist-upgrade -y

続いて Erlang Solutions のリポジトリを追加し、再度アップデートします:
$ wget http://packages.erlang-solutions.com/debian/erlang_solutions.asc

$ sudo apt-key add erlang_solutions.asc

$ sudo apt-get update

追加したリポジトリを使って、ビルドに必要なライブラリ等を導入します:
$ sudo apt-get --no-install-recommends -y install build-essential pkg-config erlang libicu-dev libmozjs185-dev libcurl4-openssl-dev

またビルドしたバイナリを実行するユーザー(couchdb)と、そのホームディレクトリ(/home/couchdb/)をこの段階で作成しておきます:
$ sudo useradd -d /home/couchdb couchdb

$ sudo mkdir /home/couchdb

$ sudo chown couchdb:couchdb /home/couchdb

ではいよいよ CouchDB のビルドを行います。2.3.0 のソースコードをダウンロード&展開して、ビルドします:
$ cd

$ wget http://mirror.ibcp.fr/pub/apache/couchdb/source/2.3.0/apache-couchdb-2.3.0.tar.gz

$ tar -zxvf apache-couchdb-2.3.0.tar.gz

$ cd apache-couchdb-2.3.0/

$ ./configure

$ make release

ビルドが成功すると、完成したバイナリが ./rel/couchdb/ 以下に作成されています。このフォルダ以下を /home/couchdb/ 以下にコピーし、couchdb ユーザー向けに実行権限を変更します:
$ cd ./rel/couchdb/

$ sudo cp -Rp * /home/couchdb

$ sudo chown -R couchdb:couchdb /home/couchdb

これでビルドは完了です。不要であればソースコードやリポジトリのファイルは削除しても構いません(残しておいても構いません):
$ cd

$ rm -R apache-couchdb-2.3.0/

$ rm apache-couchdb-2.3.0.tar.gz

$ rm erlang_solutoins.asc

この段階で CouchDB を起動することは可能ですが、デフォルト設定のままだと CouchDB はローカルホストからのリクエストのみ受け付ける設定になっています。CouchDB を外部ホストから利用する場合や、管理者向けコンソールに外部ホストからアクセスする場合は外部アクセスを許可するよう、起動前に設定を変更しておく必要があります。

外部ホストからのアクセスを許可するには、/home/couchdb/etc/local.ini ファイルをテキストエディタで開き、
#bind_address = 127.0.0.1

となっている箇所を、以下のように書き換えて保存します:
bind_address = 0.0.0.0

そして couchdb ユーザーの権限で CouchDB を起動します:
$ sudo -i -u couchdb /home/couchdb/bin/couchdb

起動後、別のターミナルから以下の curl コマンドを実行して動作を確認します:
$ curl http://localhost:5984/

{"couchdb":"Welcome","version":"2.3.0","git_sha":"07ea0c7","uuid":"48b039b37b2b29236f33806d9a96c248","features":["pluggable-storage-engines","scheduler"],"vendor":{"name":"The Apache Software Foundation"}}


私自身はラズパイ3とラズパイゼロで動作を確認しましたが、ラズパイゼロでも CouchDB 程度であれば大した負荷にはならずに実行できました。




(参考)
https://www.hackster.io/mehealth-ch/installing-couchdb-on-raspbian-stretch-ccb2a7



ラズベリーパイをデスクトップ用途で使う場合のテキストエディタとしては現時点でこれが最適かなあ、と思うのが Visual Studio Code です。ラズベリーパイ環境にもインストールできるようになっていました。


導入にあたり、まずは GPG Key をインストールしておく必要があります:
$ wget -qO - https://packagecloud.io/headmelted/codebuilds/gpgkey | sudo apt-key add -

その後、root で Visual Studio Code の Community Build をインストールします:
$ sudo su
# . <( wget -O - https://code.headmelted.com/installers/apt.sh )
# exit

導入後はメニューから code-oss を選択するか、コマンドラインから以下を実行して起動します:
$ code-oss

2019-01-13-093932_1184x624_scrot
 

普段が vi 使いなので比較の対象としてアレですが、複数ファイルを開いて切り替える使いやすさとか、補完機能とか、いわゆる「モダンな」機能が満載で、それでいてそんなに重いわけでもなく、いい感じ。


ラズベリーパイネタシリーズです。

今回はオープンソースのブロックチェーン基盤である Hyperledger Fabric を一通り Raspbian OS に導入して実行する手順を紹介します。まあラズパイの 1GB 物理メモリでどこまで実用的に動くか、というのはあまり期待できないし、また現時点では Hyperledger Fabric はともかく、Hyperledger Composer を使った動作は 32bit OS である Raspbian OS ではどうやら難しいのかもしれない・・・と感じていることを最初に申し上げておきます。 なお以下で紹介する手順はこの環境で確認しています:

モデル: Raspberry Pi 3B+
OS: Raspbian 2018-11-13 (Stretch Full) ※最新版はこちら
SD カード: 128GB

※ページ最下の【参考】でも参照しているリンク先では Docker Swarm 環境で3台のラズパイを使った Hyperledger Fabric 環境構築を紹介しています。実用面ではこちらのほうが現実的かもしれません。



【導入手順】
基本方針として、このブログエントリ最下段の【参考】で記した2つのページの情報をあわせた方法で導入しています。

おおまかには以下の順序で Hyperledger Fabric 環境を構築します:
0. 事前準備
1. Docker 導入
2. Docker Compose 導入
3. Docker Image ダウンロード
4. 起動


今回は1台のラズパイの中に Docker 環境を構築し、その Docker の中で各種 Hyperledger Fabric のイメージを1インスタンスずつ動かして環境構築します。そのため上記のような順序でインストールする必要があります。


【0. 事前準備】
今回 Hyperledger Fabric を Docker 上で動かします。そのためラズパイに Docker 等を導入することになるのですが、そのための前提ライブラリ等を用意しておきます。ラズパイのターミナル等を開いて、以下のコマンドを順次実行します:
リポジトリ更新
$ sudo apt-get update && sudo apt-get upgrade -y

依存ライブラリを導入
$ sudo apt-get install git curl gcc libc6-dev libltdl3-dev python-setuptools -y

python pip インストーラーを更新
$ sudo -H pip install pip --upgrade

ここまでの操作が完了すると、ラズパイ用の Docker がインストールできるようになります。


【1. Docker 導入】

上記に続いて以下のコマンドを実行します:
Docker 導入
$ curl -sSL get.docker.com | sh

Docker の実行権限設定
$ sudo usermod -aG docker pi

ここまで完了したら一度ログアウトし、再度ログインします(最後の実行権限設定が有効になります)。ここまで正しく実行できていると、sudo なしで docker コマンドを実行することができるようになっているはずです:
Docker バージョン確認
$ docker -v
↑ Docker のバージョンが表示されれば、ここまでの手順は完了です。


【2. Docker Compose 導入】

引き続き Docker Compose を導入します。こちらは pip を使って導入し、導入後はすぐにコマンドを実行することが可能です:
Docker Compose 導入
$ sudo pip install docker-compose

Docker Compose バージョン確認
$ docker-compose -v
↑ Docker Compose のバージョンが表示されれば、ここまでの手順は完了です。


【3. Docker イメージダウンロード】

こちらのサイトで提供されている、ラズパイ用にビルド済みの Hyperledger Fabric (v1.0.7) の Docker イメージ群を docker pull コマンドでダウンロードします:
$ docker pull jmotacek/fabric-baseos:armv7l-0.3.2

$ docker pull jmotacek/fabric-basejvm:armv7l-0.3.2

$ docker pull jmotacek/fabric-baseimage:armv7l-0.3.2

$ docker pull jmotacek/fabric-ccenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-javaenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-peer:armv7l-1.0.7

$ docker pull jmotacek/fabric-orderer:armv7l-1.0.7

$ docker pull jmotacek/fabric-buildenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-testenv:armv7l-1.0.7

$ docker pull jmotacek/fabric-zookeeper:armv7l-1.0.7

$ docker pull jmotacek/fabric-kafka:armv7l-1.0.7

$ docker pull jmotacek/fabric-couchdb:armv7l-1.0.7

$ docker pull jmotacek/fabric-tools:armv7l-1.0.7

自分でビルドする方法もあるようなのですが、あまりに面倒そうなので出来合いのものを使わせていただきました。 jmotacek 様、ありがとうございます。


これで Hyperledger Fabric 環境を動かすために必要な準備が完了しました。


【4. 起動】
Hyperledger Fabric の準備が整ったので起動します。ラズパイ1台で(物理メモリ 1GB で)この環境を起動するのは、できるか/できないかで言えばできそうですが、実用には厳しいかもしれません。環境に応じてスワップメモリを増やしておきましょう。方法はこちらを参照ください(私自身はスワップを 2GB に設定して以下を実行しました)。

Hyperledger Fabric の起動スクリプトの元となるキット(通称「サポートツール」)をダウンロード&展開します。以下の例ではホームディレクトリ以下に fabric/ というフォルダを作り、その中に展開しています:
$ mkdir ~/fabric

$ cd ~/fabric

$ curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip

$ unzip fabric-dev-servers.zip

この中の docker-compose.yml ファイルを上記で用意したラズパイ向け Docker イメージ用に書き換えます。具体的には ~/fabric/fabric-scripts/hlfv12/composer/docker-compose.yml を以下のように編集しました(変更部分をにしています):
version: '2'

services:
#  ca.org1.example.com:
#    image: jmotacek/fabric-ca:armv7l-1.0.7
#    environment:
#      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
#      - FABRIC_CA_SERVER_CA_NAME=ca.org1.example.com
#
#    ports:
#      - "7054:7054"
#    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/19ab65abbb04807dad12e4c0a9aaa6649e70868e3abd0217a322d89e47e1a6ae_sk -b admin:adminpw -d'
#    volumes:
#      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
#    container_name: ca.org1.example.com
#
  orderer.example.com:
    container_name: orderer.example.com
    image: jmotacek/fabric-orderer:armv7l-1.0.7
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/composer-genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    ports:
      - 7050:7050
    volumes:
        - ./:/etc/hyperledger/configtx
        - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/etc/hyperledger/msp/orderer/msp

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    image: jmotacek/fabric-peer:armv7l-1.0.7
    environment:
      - CORE_LOGGING_LEVEL=debug
      - CORE_CHAINCODE_LOGGING_LEVEL=DEBUG
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=composer_default
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/msp
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: peer node start
    ports:
      - 7051:7051
      - 7053:7053
    volumes:
        - /var/run/:/host/var/run/
        - ./:/etc/hyperledger/configtx
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/peer/msp
        - ./crypto-config/peerOrganizations/org1.example.com/users:/etc/hyperledger/msp/users
    depends_on:
      - orderer.example.com
      - couchdb

  couchdb:
    container_name: couchdb
    image: jmotacek/fabric-couchdb:armv7l-1.0.7
    ports:
      - 5984:5984
    environment:
      DB_URL: http://localhost:5984/member_db

そして起動コマンドを実行します:
$ cd ~/fabric

$ ./startFabric.sh

↓こんな感じで Docker 内でイメージがコンテナ化され、実行されていきます:
2019011003


少し時間がかかりますが(1分くらい?)コマンドが完了すると、こんな画面になってプロンプトが戻ります:
2019011004


以下のコマンドで起動中のコンテナの状態を確認し、Hyperledger Fabric の各種コンテナが実行されていることを確認します:
$ docker ps

↓docker-compose.yml で指定されたイメージが起動していることが確認できます。Hyperledger Fabric の起動に成功しました!:
2019011002


ちなみに、この「Hyperledger Fabric が起動しただけ」の段階で使用メモリを確認してみました。起動しただけであれば意外と余裕あるようにも見えますね・・・
2019011006



【(途中まで)使ってみる】
Hyperledger Fabric の導入と起動までであれば上記までで完了していますが、せっかくなのでこの環境を使ってみることにします(といっても、以下で紹介しているのはカードファイルのインポートまでですが・・)。

具体的には「サポートツールで提供されているスクリプトを使って管理者用のカードファイルを作成する」ところまでを紹介します。といってもここから先はラズパイ特有の部分はなく、通常の方法と一緒というか、通常と同じ方法でできる所までを紹介する、というスタンスです。

そのために composer コマンドと呼ばれる、Hyperledger Composer のコマンドラインツールを導入するのですが、その前提として Node.js v8.x 環境(node と npm)が必要になります。ここがちとややこしいのですが、今回の導入に使った Raspbian OS 2018-11-13 (Stretch Full) でははじめから V8 の node コマンドは使えるようになっていますが、npm が導入されていません。というわけで今後のことも考えて node のバージョン管理ツール(n package)と合わせて Node.js v8.x を導入しておくことにします:
一旦 npm を導入
$ sudo apt-get install npm

キャッシュを更新
$ sudo npm cache clean

n package をインストール
$ sudo npm install n -g

n package で導入できる Node.js のバージョン(8.xx.xx の最新バージョン)を確認
$ sudo n list

(8.xx.xx の中では 8.15.0 が最新であったと仮定)
Node.js V8.15.0 を指定してインストール $ sudo n 8.15.0

一度ログアウト&ログインし直して、改めて node コマンドと npm コマンドのバージョンを確認します:
$ node -v
v8.15.0

$ npm -v
6.4.1
↑ Node.js V8.x と対応する npm が導入できたことを確認


Node.js 環境が整ったので、改めて composer コマンドをインストールします。今回用意した Hyperledger Fabric のバージョンが v1.0.7 のイメージなので、このバージョンに合う composer-cli v0.16 を指定してインストールします(※):
$ sudo npm install --unsafe-perm -g composer-cli@0.16

※ラズパイ環境だからかもしれませんが、上記の --unsafe-perm オプションを付けないと実行結果がエラーになってしまうようでした。こちらを参照。


そしてサポートツール内の createPeerAdminCard.sh を実行して、PeerAdmin@hlfv1 のカードを作成します:
$ cd ~/fabric/fabric-scripts/hlfv1

$ ./createPeerAdminCard.sh

composer のコマンドで、PeerAdmin@hlfv1 カードが作成されていることを確認します:
$ composer card list
2019011101


とりあえず動作確認できたのはここまでです。2019/01/11 時点でこの先に進もうとして BNA ファイルを用意して composer runtime install し(ここまでは成功)、composer network start させようとすると、以下のようなエラーになりました:
Error: Error trying to instantiate composer runtime. Error: No valid responses from any peers.
Response from attempted peer comms was an error: Error: Error starting container: API error (400): {"message":"Minimum memory limit allowed is 4MB"}
2019011102


このエラーの原因がまだわかっていないのですが、調べた範囲ではもしかすると 32bit OS である Raspbian OS に原因があるような気もしていて、そうだとすると現時点で Hyperledger Composer のこの先を動かすのは厳しいのかなあ・・・ とも思っています。

この辺りは引き続き調査もしますが、情報求む(苦笑)。


【Hyperledger Fabric を終了する】
起動した Hyperledger Fabric を終了するには startFabric.sh と同じフォルダにある stopFabric.sh を実行します:
$ ./stopFabric.sh

↓終了できました:
2019011005



実メモリ 1GB の制約はどうにもならないので実用的な使い方は難しいかもしれませんが、とりあえず1台のラズパイで Hyperledger Fabric が起動できることは確認できました。CouchDB などを使わずに、既存のビジネスネットワークに Peer だけ動かして接続するような使い方であればもう少し余裕を持って使えるかもしれません。


秋葉原の最安値で済ませることができれば、
 本体 5000 円 + ケース 1000 円 + Micro SDカード 2000 円
8000 円程度で Hyperledger Fabric のブロックチェーン環境が一台確保できる、ということになりますね。安っ!


【参考】
https://stackoverflow.com/questions/45800167/hyperledger-fabric-on-raspberry-pi-3
https://www.joemotacek.com/hyperledger-fabric-v1-0-on-a-raspberry-pi-docker-swarm-part-2/

このページのトップヘ