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

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

IBM LinuxONE(メインフレーム版 Linux)挑戦シリーズ。今回は IBM Bluemix でも使う cf コマンドラインツールの導入に挑戦します:
2017012000


cf ツールは IBM のクラウド環境である IBM Bluemix や、同製品がベースとしているオープンソース PaaS 環境である CloudFoundry をコマンドラインから操作するためのツールです。手元で作成したソースコードやアプリケーションファイル一式を Bluemix/CloudFoundry のランタイムにデプロイする時などに使うコマンドラインアプリケーションで、これがあれば Bluemix や CloudFoundry の管理操作が可能になるものです。主なプラットフォーム(Windows, Linux, MacOS)向けのツールはこちらから最新版の実行バイナリがダウンロードできるようになっています:
https://github.com/cloudfoundry/cli/releases

2017012001


ここでバイナリが提供されている Linux は x86(_64) アーキテクチャの Linux です。他の Linux に関しては公式からは提供されていませんが、パッケージマネージャーから簡単に導入できるようになっているものもあったりします(例:ラズベリーパイの RaspbianOS)。

残念ながら s390x(IBM LinuxONE)プラットフォーム向けのバイナリは提供されていない模様です。ただ cf ツール自体もオープンソース製品なので、ソースを入手して自分でビルドできる可能性もあります。というわけで挑戦してみた様子を以下に紹介します。 前提として IBM LinuxONE は IBM LinuxONE コミュニティクラウド上に RHEL 6.x で用意しているものとします(1インスタンスが最大 120 日間無料で利用できます):
IBM LinuxONE コミュニティクラウドを使う(2017年1月版)


またオープンソースツールである cf コマンドは、Go 言語で記述されています。というわけでビルドには Go 言語の環境が必要になります。IBM LinuxONE で Go 言語を使えるようにするための手順は以下を参照ください(最後の環境変数 GOPATH と PATH の設定までを行う必要があります):
IBM LinuxONE コミュニティクラウド上で Go 言語を動かす


早速ソースコードを入手してビルドを、、、の前に1つ準備が必要です。ドキュメントにかかれている手順を IBM LinuxONE 環境でそのまま実行しても途中でエラーになってしまいました。試行錯誤の結果、これを回避するために事前にパスの通ったディレクトリに "s390x-linux-gnu-gcc" という名前で gcc が使えるようにしておく必要がありそうでした。というわけで(この例では /usr/local/bin/ 以下に)シンボリックシンクを作っておきます:
# ln -s /usr/bin/gcc /usr/local/bin/s390x-linux-gnu-gcc

改めて、まずはソースコードを入手しましょう。go コマンドを使って以下のコマンドを実行します:
# go get code.cloudfoundry.org/cli

コマンドが成功すると、$GOPATH/src/code.cloudfoundry.org/cli 以下に cf ツールのソースコードが展開されます。このディレクトリに移動して bin/build コマンドを実行してビルドします:
# cd $GOPATH/src/code.cloudfoundry.org/cli
# bin/build

ビルドが成功すると、cf コマンドが $GOPATH/src/code.cloudfoundry.org/cli/out/ 以下に作成されます。このコマンドにパスを通すか、パスの通ったディレクトリ(以下の例では /usr/local/bin)以下にシンボリックリンクを張って実行できるようにすれば準備完了です:
# ln -s /usr/local/go/src/code.cloudfoundry.org/cli/out/cf /usr/local/bin/cf

これで cf ツールがコマンドラインから実行できるようになりました(青字は出力結果):
# cf -v
cf version 6.23.1+d752ec1.2017-01-19


LinuxONE については、自分も最初は「メインフレーム上の Linux で、普段使っているプログラミング言語やツール、サーバー類がどこまで使えるんだろう?」と半信半疑だったのですが、いざ使ってみると x86_64 アーキテクチャと比べてもほとんど変わらずに使えるということが分かってきました。事実 cf ツールが動くと分かった今、IBM Bluemix の、オープンソース系のアプリケーション開発やテストをこれ単体で行えるだけの環境はほぼ揃っているように感じます。


なお、今回紹介した手順は(基本的には)以下のドキュメントを参考にしています:
https://github.com/cloudfoundry/cli/blob/master/.github/CONTRIBUTING.md

 

IBM LinuxONE(メインフレーム上の Linux)ネタシリーズ、今回は Go 言語を動かしてみます。
http://golang-jp.org/


前提として、IBM LinuxONE の環境が必要になります。今回は 120 日間無料で使える IBM LinuxONE コミュニティクラウド上の RHEL 6.x 環境を使うことにします。この IBM LinuxONE コミュニティクラウドの導入方法についてはこちらを参照してください:

さて、s390x 向けの Go 言語をどうやってインストールするかというと・・・ なんとグーグルから同環境を含めた各種プラットフォーム向けのバイナリが主要バージョン毎に提供されているのでした:
https://storage.googleapis.com/golang/

Windows や Linux, OS X 向けはもちろん、ARM デバイス向けのバイナリも提供されています。そしてメインフレーム Linux である s390x アーキテクチャのバイナリも提供されていることが分かります:
2017012001


2017/Jan/20 現在、正式リリースされている中では 1.7.4 が Go 言語の最新バージョンだったので、これをダウンロードして利用することにします:
# cd /tmp
# wget https://storage.googleapis.com/golang/go1.7.4.linux-s390x.tar.gz
# tar -C /usr/local -xzf go1.7.4.linux-s390x.tar.gz

上記のコマンドで /usr/local/go 以下に Go を展開しました。環境変数 GOPATH と合わせて PATH を設定しておきます:
# vi /etc/bashrc

    :
(最後に以下の2行を追加して保存) : export GOPATH=/usr/local/go/ export PATH=$PATH:/usr/local/go/bin

改めてログインし直し(或いは source /etc/bashrc を実行し)、Go 言語のバージョンを確認してみます(青字が出力結果):
# go version
go version go1.7.4 linux/s390x

正しくインストールできたと同時に、s390x 環境で Go 言語を導入できたことが確認できました。

IBM Bluemix からも提供しているビジュアルフローエディタ Node-RED の最新バージョン v0.16 がリリースされました(2017/Jan/17 時点での最新版は v0.16.1):
https://libraries.io/npm/node-red/


新機能などの情報についてはこちらの公式ブログエントリや、
http://nodered.org/blog/2017/01/11/version-0-16-released

こちらのリリースノートを参照ください:
https://github.com/node-red/node-red/releases/tag/0.16.0


さて、上記ブログエントリにも書かれているのですが、この v0.16 より Node.js の v0.10 および v0.12 がサポート外になりました。Node.js も v4 以上のものを用意する必要があります。

これで問題になるのが CentOS/RHEL 6.x を使っている場合です。現在、CentOS/RHEL 6.x で(epel リポジトリなどを使って)普通に Node.js を導入すると v0.10.48 が導入されます:
# node -v
v0.10.48

IBM からも IBM SDK for Node.js として IBM 版の Node.js がリリースされていますが、こちらも CentOS/RHEL 6.x は v0.12 までしか用意されておらず、Node.js v4 以上を使おうとすると CentOS/RHEL であれば 7.x を使う必要があります:
https://developer.ibm.com/node/sdk/

2017011702


ちなみに Node.js v0.10.x が導入された状況下で深く考えずに npm を使って Node-RED を導入すると、最新バージョン(今であれば v0.16.1)が導入されてしまいます。その結果起動時にエラーが発生し、ユーザー画面にもエラーメッセージが表示されてしまいます:
# npm install node-red -g  (このコマンドは成功する)

# node-red
  :
  :
Welcome to Node-RED
===================

17 Jan 10:10:33 - [info] Node-RED version: v0.16.1
17 Jan 10:10:33 - [info] Node.js  version: v0.10.48
17 Jan 10:10:33 - [error] *****************************************************************
17 Jan 10:10:33 - [error] * Unsupported version of Node.js. Requires: >=4 Found: v0.10.48 *
17 Jan 10:10:33 - [error] *****************************************************************
17 Jan 10:10:33 - [info] Linux 2.6.32-642.11.1.el6.x86_64 x64 LE
17 Jan 10:10:33 - [info] Loading palette nodes

/usr/lib/node_modules/node-red/node_modules/mqtt/lib/connect/index.js:100
    const isSecure = ['mqtts', 'wss'].indexOf(opts.protocol) !== -1
    ^^^^^
17 Jan 10:10:35 - [warn] ------------------------------------------------------
17 Jan 10:10:35 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
17 Jan 10:10:35 - [warn] [mqtt] SyntaxError: Use of const in strict mode.
17 Jan 10:10:35 - [warn] ------------------------------------------------------
17 Jan 10:10:35 - [info] Settings file  : /root/.node-red/settings.js
17 Jan 10:10:35 - [info] User directory : /root/.node-red
17 Jan 10:10:35 - [info] Flows file     : /root/.node-red/flows_xxxxxxxx.xxxxx.xxx.json
17 Jan 10:10:35 - [info] Creating new flow file
17 Jan 10:10:35 - [info] Server now running at http://127.0.0.1:1880/
17 Jan 10:10:35 - [info] Starting flows
17 Jan 10:10:35 - [info] Started flows

↑起動が成功したように見えるが、バージョン非互換のエラーが発生している

2017011701


では改めて CentOS/RHEL 6.x のバージョンアップをせずにどうやって Node-RED を導入すればよいでしょうか? Node-RED の最新版を動かすために工夫する、というのも1つの方法ですが、Node-RED が最新版でなくてもよい場合であれば Node-RED v0.14.x を使う、という方法もあります。このバージョンであれば CentOS/RHEL 6.x でも動作します。

その場合の手順を紹介します。まず上記のコマンドを実行してしまって Node-RED v0.16.x を導入してしまった場合はアンインストールします:
# npm uninstall node-red -g

リリースサイトを見ると、v0.14.x の最新バージョンは v0.14.6 のようです(2017/Jan/17 時点)。というわけで、改めてこのバージョンを指定して npm でインストールします:
# npm install node-red@0.14.6 -g

こうしてインストールした Node-RED を起動すればエラーは発生しません:
# node-red
  :
  :
Welcome to Node-RED
===================

17 Jan 10:15:55 - [info] Node-RED version: v0.14.6
17 Jan 10:15:55 - [info] Node.js  version: v0.10.48
17 Jan 10:15:55 - [info] Linux 2.6.32-642.11.1.el6.x86_64 x64 LE
17 Jan 10:15:55 - [info] Loading palette nodes
17 Jan 10:15:58 - [warn] ------------------------------------------------------
17 Jan 10:15:58 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node
17 Jan 10:15:58 - [warn] ------------------------------------------------------
17 Jan 10:15:58 - [warn] Missing node modules:
17 Jan 10:15:58 - [warn]  - node-red: yaml
17 Jan 10:15:58 - [info] Removing modules from config
17 Jan 10:15:58 - [info] Settings file  : /root/.node-red/settings.js
17 Jan 10:15:58 - [info] User directory : /root/.node-red
17 Jan 10:15:58 - [info] Flows file     : /root/.node-red/flows_xxxxxxxx.xxxxx.xxx.json
17 Jan 10:15:58 - [info] Creating new flow file
17 Jan 10:15:58 - [info] Starting flows
17 Jan 10:15:58 - [info] Started flows
17 Jan 10:15:58 - [info] Server now running at http://127.0.0.1:1880/

↑起動成功

というわけで、現時点で比較的簡単に CentOS/RHEL 6.x で Node-RED を動かす場合はこの方法になるのかな、と思ってます:
2017011703


なお、CentOS/RHEL 6.x に Node.js v4.x を導入してから Node-RED v0.16.x を入れる、という方法もあります。CentOS/RHEL 6.x に Node.js v4.x を入れる方法についてはこちらに詳しく書かれていました:
CentOS 6.xにLTS(4.3.0)のnode.jsをインストールする

このページのトップヘ