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

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

2017年08月

久しぶりの LotusScript ネタです。LotusScript は IBM ノーツ/ドミノのカスタマイズに使えるマクロ言語です。内容そのものはノーツじゃなくても(VBA でエクセルなどにも)応用できると思いますが、Windows 前提です。

Windows OS に標準搭載されている ServerXMLHTTP オブジェクトをノーツの LotusScript から使って、LotusScript で WEB API っぽいことを実現してみました。

まず ServerXMLHTTP オブジェクトについて。MSDN によるとこんなものです:
https://msdn.microsoft.com/ja-jp/library/ms762278(v=vs.85).aspx

簡単に言えば「HTTP クライアントライブラリとして使える ActiveX オブジェクト」です。このオブジェクトをインスタンス化すれば、比較的簡単に HTTP クライアントプログラムが作れます。特にノーツのマクロ言語である LotusScript はソケット通信とかネットワークプログラミングに若干弱いところがあるので、このオブジェクトを外部利用して WEB API を使ってみよう、という試みです。

例えばこんな感じ。開発環境であるドミノデザイナーを使ってノーツデータベースのエージェントを LotusScript で作り、Initialize サブルーチンに以下のような内容を記載します(エージェント名は ServerXMLHTTP としました):
Sub Initialize
  Dim obj As Variant

  Set obj = CreateObject( "Msxml2.ServerXMLHTTP.6.0" )
  Call obj.open( "GET", "http://ibm.com/", False )
  Call obj.send()
  MsgBox obj.responseText
End Sub

内容がシンプルなのでなんとなく理解できると思いますが、簡単に解説すると CreateObject を使って ServerXMLHTTP オブジェクトインタンスを生成し、"http://ibm.com/" を HTTP GET して、その内容をメッセージボックスで表示する、というものです。要するに http://ibm.com/ の HTML ソースコードを画面に表示する、というものです。

またエージェントのプロパティとして、実行時のトリガーは「イベント」で「アクションメニューの選択」、対象は「データベースの全ての文書」に設定しておきます。もちろん実行内容によってはここを変更する必要がでてきますが、今回の例ではこの設定でメニューから選択して実行できるようにしました:
2017081001


改めてこのデータベースをノーツで開くと、メニューから作成したエージェント(図では "ServerXMLHTTP")が選択できるようになっているはずです。これを選択して実行すると・・・
2017081002


こんな感じのダイアログボックスが表示され、中に http://ibm.com/ の HTML ソースコードが表示されているはずです:
2017081003


いかがでしょう。上記例では HTTP GET の例を紹介しましたが、この ServerXMLHTTP オブジェクトを使うと、POST など他のメソッドを指定することもできるし、もちろん送信データを指定することもできます。その辺りの詳しい話は公式ドキュメントを参照ください:
https://msdn.microsoft.com/ja-jp/library/ms762278(v=vs.85).aspx


HTTP クライアントがここまで簡単に使えると、各種 Web API が使えるようになるので、IBM Bluemix のワトソン API をノーツクライアントから(それもフロントエンドから)直接実行する、なんてことも可能になると思っています(余談ですが以前に Java を使って、ノーツのバックエンドからワトソン API を使う、という内容を紹介したことがあります。その記事はこちら)。


ノーツデータを広く応用・活用する際に使えそうなライブラリです。

先日の Maker Fair Tokyo 2017 でラズパイ用の小型 TFT モニタを購入しました:


Raspberry Pi2 / Pi3用タッチスクリーンTFTモニタセット(3.5インチ)



ラズパイ用のモニタにはメーカーやサイズで色々な種類がありますが、僕が購入したのは Physical Computing Lab という会社から提供されている、3.5 インチモニタ(上図)でした。


ラズパイの用途にもよるとは思うのですが、自分の場合はある程度のセットアップをした後は「リモートからアクセスして開発環境として使う」ことが多いです。それができる環境が1万円弱で揃うってすごい時代になったものです。

なお、今までにラズパイで色々やってきた記録はこちらを参照ください:
http://dotnsf.blog.jp/tag/raspberrypi


さてラズパイに直付けモニタは必要か?というと、上でも触れましたが「ある程度のセットアップが済んでいれば」必要ないと思っています。ラズパイが起動して、ネットワークに繋がっていて、IP アドレスが分かっていればリモートから SSH や VNC などでログインして使えばいいわけです。

問題になるのは「ある程度のセットアップを済ます前」です。例えばラズパイが起動して、ネットワークに接続されていても、その IP アドレスがわからないと外部からは接続できません。(MAC アドレス等を使って)外部から IP アドレスを調べる方法がないわけではないのですが、手っ取り早いのは HDMI ケーブルとキーボード&マウスを繋げて、画面で確認する方法です。つまり「モニターが必要なくなる段階になるまでにはキーボードだけでなく、HDMI モニタとケーブルが必要」なのです。キーボードはともかく、モニターを持ち歩くのは厳しい。このジレンマをなんとかしたくて、ラズパイ一体型の小型モニタを購入してみました。

やりたいことは上記のようにセットアップの最終段階、つまり「起動後の IP アドレスの確認」です。この目的のためであれば Window システムを使った GUI である必要はなく(むしろ画面が小さくて使いにくいので GUI でないほうがよく)、CUI(キャラクター端末インターフェース)で起動できれば充分です。というわけで、あまり事例のないキャラクター端末としての小型モニタ利用の手順を、(あらかじめ用意された OS イメージではなく)自分の利用中の Raspbian 環境で使う前提でまとめました。


まず普通にラズパイをセットアップします。使っているイメージは Raspbian Jessie の最新版で、マイクロ SD カードも自分で用意したもので構いません。この時点で HDMI を使っていてもいなくても構いません(IP アドレスが固定なら SSH でも構いません)。また TFT モニタはこの時点でラズパイに取り付けておきます(まだ何も写りません)。

まずラズパイでも他のシステムでも構いませんが、以下のページにアクセスして画面下のほうにある「ドライバー一式」という所で、最新版ドライバーのファイル名を確認してください。2017/Aug/08 時点では LCD-show-160811.tar.gz が最新でした:
http://store.techshare.jp/html/page147.html

2017080801


このファイルをモニタをセットアップしたいラズパイにダウンロードします。あらためてラズパイにログインし、以下のコマンドを実行してドライバーをダウンロードします(ファイル名は上記で確認した最新版ファイルの名前を指定してください、GUI であればブラウザから直接ダウンロードも可能です):
$ wget http://techshare.co.jp/raspiosimage/LCD-show-160811.tar.gz

ダウンロードが完了したらファイルを展開します:
$ tar xzvf LCD-show-160811.tar.gz

LCD-show というフォルダが作られ、その中にドライバファイル一式が入ります。最終的な目標は「キャラクター端末としてモニタを利用する」ことなので、まずこの時点でラズパイを CUI モードに変更します(GUI でモニタを使いたい場合はこの時点でラズパイを GUI モードに変更します)。画面モードを切り替える場合は raspi-config コマンドで変更します:
$ sudo raspi-config

最初にメニュー3番目の "Boot Options" を選択します:
2017080801


次の画面で一番上の "Desktop / CLI" を選択します:
2017080802


次の画面で変更したいモードを選択します。今回は CUI モードで、ログインプロンプトを出した状態で起動したいので、一番上の "Console" を選択します(変更した場合はここでラズパイを再起動します):
2017080803



再起動後、改めてラズパイにログインし、ダウンロードしたドライバを読み込ませた状態で HDMI モードで再起動します(LCD-hdmi コマンド実行後に自動的に再起動します):
$ cd LCD-show
$ sudo ./LCD-hdmi

何度か再起動を繰り返してここまできました。最後にラズパイを TFT モニタモードに切り替えます。改めてラズパイにログイン後、モニタのサイズに合わせて LCDxx-show コマンドを実行します(以下の例は 3.5 インチモニタ用):
$ cd LCD-show
$ sudo ./LCD35-show

このコマンドが成功すると、ラズパイに接続された TFT モニタに CUI コンソールが表示されるようになります。キーボードが接続されていればコマンドを入力してその結果を確認することも可能になりました:
2017080800


TFT モニタ(の解像度)がもう少し大きいものであれば話は違ってくると思いますが、この 3.5 インチはラズパイとほぼ同じサイズで、一体感があります。一方で、このサイズのモニタだと GUI で使うこと自体に無理があると感じています。 そうなると今回紹介したように CUI で使うのが現実的かな、と考えています。

で、CUI で使うための手順紹介をあまり見かけなかったので、自分でやって紹介してみた、というのが今回のブログエントリを書いた経緯でした。 同じように考えている皆さんの参考になれば。


自分はラズパイ(Raspberry Pi 3B)をリモートの開発環境として使っています。自宅内ネットワークで常時起動させ、OpenVPN 経由で外からもアクセスできるようにしています。その辺りの設定についてはこちらを参照してください:
OpenVPN でローカル(自宅)ネットワークに VPN 接続する


そんなラズパイに各種開発環境やら docker やら TensorFlow やら、、を導入しています。これで外からも利用できる開発環境を構築しています:
http://dotnsf.blog.jp/tag/raspberrypi


さて、コーディングして動かすところまではこういったツールだけで問題ないのですが、1点だけ不便に感じる点がありました。それが「cf ツール」です。作ったアプリケーションを IBM Bluemix (Cloud Foundry) 環境上にデプロイする際に使うツールなのですが、公式にはラズパイ用のバイナリは提供されていません。なのでラズパイで開発して、動かして、テスト&デバッグして、、というところまではこの環境でできるのですが、作ったアプリを IBM Bluemix 上で動かす、という最後のステップの際に別の(cf ツールの導入された)環境に切り替えて行う、というちと面倒な手順をとる必要がありました:
Releases cloudfoundry/cli

2017080601


これをラズパイ環境のままで行えるようにする、というのが今回の目的です。実はこれまでにも IBM LinuxONE 環境などで同様の経験はしていて、その時は自分でソースからビルドして対応したりしていました:
IBM LinuxONE コミュニティクラウド上で cf コマンドを動かす

2017080602
(↑メインフレーム上で cf を動かしたのは、もしかすると世界中で自分だけかも・・)


で、同様の問題がラズパイで発生しているということです。というわけで、ラズパイ環境でも同様に cf ツールをビルドしてみました。以下はその手順紹介ですが、基本的には上記の LinuxONE 環境と同じことをしています。

まず cf ツールは go 言語で書かれているため、ビルドには go 言語が必要です。ラズパイ用の go 言語導入については以下を参照して、go 言語が動く環境を作っておいてください:
ラズパイに go 1.8 をインストールする

go 言語が動くようになったら次はソースコードの入手です。以下のコマンドを実行します:
$ go get code.cloudfoundry.org/cli

これで $GOPATH/src/code.cloudfoundry.org/cli 以下にソースコードが展開されます。これをビルドします:
$ cd $GOPATH/src/code.cloudfoundry.org/cli
$ bin/build

ビルドが成功すると $GOPATH/src/code.cloudfoundry.org/cli/out/ 以下に cf コマンドが生成されます。試しに動くかテストしてみます:
$ cd $GOPATH/src/code.cloudfoundry.org/cli/out
$ ./cf -v
cf version 6.29.0+35e54cd.2017-08-06

バージョン番号が表示され、ちゃんと動くことが確認できました。後はこのコマンドを PATH の通った所に移動すれば完成です。
$ sudo mv $GOPATH/src/code.cloudfoundry.org/cli/out/cf /usr/local/bin
$ sudo chown root.staff /usr/local/bin/cf


なお、このラズパイ版の cf コマンドについては困っていた方が他にもいたようで、たまに有志でビルドされたものが見つかります。僕が動作確認しているわけではないし、動作保証もできないのですが、こういった所から入手して使うという手段もありそうです:

https://github.com/mmb/cf-cli-pi
https://cf-cli-pi.s3.amazonaws.com/index.html


オープンソースのブロックチェーン環境である Hyperledger Fabric 用のフレームワークとして Hyperledger Composer が提供されています:
https://hyperledger.github.io/composer/

この Composer (と Hyperledger Fabric)を使うことでブロックチェーンアプリケーションおよびビジネスネットワークを比較的簡単に作れるようになる、というものです。Hyperledger Fabric v1.0 が導入されている環境にこの Composer フレームワークをインストールしてみましょう。

前提条件として、Hyperledger Fabric v1.0 の導入が完了している必要があります。その手順についてはこちらを参照してください:
Hyperledger Fabric V1.0 でブロックチェーン環境を作る


Hyperleger Composer の導入は非常に簡単です。Hyperleger Fabric が導入されているシステムの作業ディレクトリで、以下の1行コマンドを実行するだけです:
$ curl -sSL https://hyperledger.github.io/composer/install-hlfv1.sh | bash

このコマンドを実行すると Composer の実行に必要な docker イメージがダウンロードされて、Composer アプリケーションが 8080 番ポートで実行され、ウェブブラウザが自動的に起動してローカルホストの 8080 番ポートにアクセスし、Composer ツールが利用できるようになります:
20170804


このコマンドを実行した結果、作業ディレクトリ内に composer.sh ファイルが作成されます。Composer を止める場合は "stop" オプションを付けて実行します:
$ ./composer.sh stop

Composer 停止状態から起動する場合や、実行状態から再起動する場合は、このファイルをそのまま実行します:
$ ./composer.sh

Composer ツールの使い方は次回以降で。

オープンソースのブロックチェーン環境である Hyperledger Fabric に待望の V1.0 がリリースされ、同時に初の公式版リリースとなりました:
http://hyperledger-fabric.readthedocs.io/en/latest/releases.html


オープンソースなので、(前提環境さえあれば)誰でも同環境をダウンロードして構築することができます。というわけで、以下ではその導入手順を紹介します。

【前提環境】
まず前提として以下の環境が必要になります:
 Docker: 17.x for Linux or Mac OS X
 Docker-Compose
 Node.js V6.x(V8.x は未対応)

Docker は 17.x であればプラットフォームは問いません。自分は Ubuntu 14.04 および Mac OS X で確認しました。

今回紹介する方法では Fabric Composer のコマンドラインインターフェースを使って環境セットアップを行います。この Fabric Composer コマンドラインインターフェース(composer-cli)の導入前提として Node.js 環境が必要です。なお Node.js V6.x を用意してください、V8.x には未対応です。

【Hyperledger Fabric コマンドラインインターフェースを導入】
Node.js と同時に導入する npm を使って composer-cli をインストールします:
$ sudo npm install -g composer-cli
※Node.js V8.x だとここでコケます。Node.js V6 環境で行ってください。


【Hyperledger Fabric サポートツールを導入】
Hyperledger Fabric V1.0 環境を docker 内に構築するためのツールをダウンロード&展開します。以下の例では 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

【サポートツールを使って Hyperledger Fabric V1.0 環境を導入】

展開したサポートツールを使って Hyperledger Fabric V1.0 (の docker イメージ)をダウンロードして、実行します(docker サービスが稼働している必要があります):
$ ./downloadFabric.sh
$ ./startFabric.sh

ここまでの作業で Hyperledger Fabric V1.0 が起動しました! docker コマンドでこの時点での稼働サーバーの(プロセスの)様子を確認します(青字が出力内容):
$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
d2561aba32f0        hyperledger/fabric-peer:x86_64-1.0.0      "peer node start -..."   22 minutes ago      Up 22 minutes       0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
b189b5837328        hyperledger/fabric-couchdb:x86_64-1.0.0   "tini -- /docker-e..."   22 minutes ago      Up 22 minutes       4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp       couchdb
5dc8e344f9f3        hyperledger/fabric-ca:x86_64-1.0.0        "sh -c 'fabric-ca-..."   22 minutes ago      Up 22 minutes       0.0.0.0:7054->7054/tcp                           ca.org1.example.com
5552ed31eb7d        hyperledger/fabric-orderer:x86_64-1.0.0   "orderer"                22 minutes ago      Up 22 minutes       0.0.0.0:7050->7050/tcp                           orderer.example.com

1つのピア(peer0.org1.example.com)や、CA、CouchDB(Cloudant) などが docker 上で稼働していることが確認できました。


【デフォルトプロファイルの作成】
最後に Composer を使ってデフォルトのプロファイルを作成します。これもサポートツールを使って実行します:
$ ./createComposerProfile.sh

【Hyperledger Fabric V1.0 の停止】
サービスを停止する場合もサポートツールで用意されているコマンドを使います:
$ ./stopFabric.sh

このコマンドを実行した後に再度 docker プロセスを確認すると、先程まで動いていたサーバーが止まっていることが確認できます:
$ docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES


というわけで、Docker (+Docker Compose) 環境があれば簡単に Hyperledger Fabric V1.0 が動かせるようになりました!

ここまでの内容だと、単に Hyperledger Fabric v1.0 を使ったブロックチェーンのネットワークを動かすまでの説明であって、UIとかで動いている様子を見れるわけではないのでちとわかりにくい部分があるかもしれません。そのあたりやアプリケーション開発に関してはおいおいと。。


このページのトップヘ