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

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

2016/01

これまで MariaDB などの MySQL 系のリレーショナルデータベースばかり使っていたのですが、PostgreSQL を使う機会が増えそうなので、改めて勉強することにしました。

というわけで PostgreSQL を(いつもの CentOS に)インストール・・・しようとしたのですが、1つ問題が生じました。CentOS や RedHat の yum の標準リポジトリに PostgreSQL が含まれているので、yum で簡単にインストールできます。ただ標準リポジトリからインストールできるのは PostgreSQL 8.4 です。より新しいバージョン(9.x)をインストールしたい場合の、その手順を紹介します。

CentOS に yum で PostgreSQL 9.x をインストールするには、まず標準のリポジトリで PostgreSQL がインストールされないように設定を変更しておきます。/etc/yum.repos.d/CentOS-Base.repo をテキストエディタで開き、[base] セクションと [updates] セクション両方に以下の1行を追加します:
  :
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
exclude=postgresql*

[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
exclude=postgresql*
  :

次に PostgreSQL 9.x 用の yum リポジトリを追加します。以下は 64bit 版での例です:
# yum -y localinstall http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm

これで PostgreSQL 9.x をインストールする準備が出来ました。次のコマンドで PostgreSQL 9.4 Server をインストールします:
# yum -y install postgresql94-server

インストール後に、データベース初期化のコマンドを実行する必要があります:
# service postgresql-9.4 initdb

そして PosgreSQL サーバーを起動して、自動起動設定も加えておきます:
# service postgresql-9.4 start
# chkconfig postgresql-9.4 on


ここまでの手順で PostgreSQL サーバーが導入され、サービスとして起動し、利用できる状態になりました。では実際に使ってみましょう。

このインストールの手順の中で postgres という名前のユーザーがシステムに追加されているはずです。まずはこのユーザーのパスワードを設定します:
# passwd postgresql
ユーザー postgres のパスワードを変更。
新しいパスワード: (設定するパスワードを入力、表示されません)
新しいパスワードを再入力してください:(パスワードを再入力)
passwd: 全ての認証トークンが正しく更新できました。

その後、postgres ユーザーに切り替えて、psql コマンドを実行するとコマンドライン環境でローカルの PostgreSQL サーバーに接続します:
# su - postgres
$ psql
psql (9.4.5)
"help" でヘルプを表示します.

postgres=#

この状態から SQL を発行してデータベースやユーザーを作ったり、テーブルを定義したり、問い合わせをしたり、・・・といった一連の作業を行うことができます。

このコマンドライン PostgreSQL 環境から抜ける場合は \q を実行します:
postgres=# \q
$



Bluemix 上のデータストレージサービスである Cloudant と dashDB はデータを連携することができます。以前には Cloudant から dashDB へのレプリケーションによって実現できる、という記事を紹介しました:
Cloudant => dashDB の単方向レプリケーション

簡単に紹介すると dashDB 側から Cloudant のデータをプルする形で複製を作ることで実現する、という内容だったのですが、2016/Jan/28 時点ではこの方法は使えなくなっています。代わりに Cloudant 側から dashDB 上にデータウェアハウス用DBを作る、という(逆の)データエクスポート機能によって実現できるようになりました。 というわけで、その手順を紹介します。


まずは Cloudant 側にエクスポートするデータが格納されている必要があります。既に Cloudant でデータが溜まっているのであればそのデータを使ってください。これからデータを集める場合は Bluemix の Node-RED スターターで集めるのが簡単だと思います:
2016012801


"Node-RED Starter" ボイラープレートを使って、アプリケーション環境を作成します:
2016012802


Bluemix 上に Node.js アプリケーションサーバーと Cloudant データベースサーバーが作られ、Node-RED アプリケーションが稼働している状態が作れました。ここから Node-RED 画面に移動します:
2016012803


ここで Node-RED を使ってセンサーのデータを集めます。この辺りの詳しい手順はこちらを参照してください:
Bluemix の Node-RED サービスで IoT アプリを作る(1/2)
Bluemix の Node-RED サービスで IoT アプリを作る(2/2)
2016012805


この例では Cloudant 上の "iotdata" データベースにデータを集めました。このデータベースを dashDB にエクスポートしてみます:
2016012804


左メニューの "Warehousing" を選び、サブメニューの "Warehouses" を選択すると、現在作成されたウェアハウスの一覧が表示されます。初回は一覧に何もないので "Create a warehouse" ボタンがあるだけだと思います。今からウェアハウスを作るのでこのボタンをクリックします(またはメニューから "Warehousing" - "Create  a Warehouse" を選択します):
2016012807


「ウェアハウス」の実体が Bluemix 上の dashDB になります。というわけで、ここで Bluemix の ID とパスワードを入力してログインします:
2016012801


ログイン後、作成するウェアハウスの情報を入力します。ウェアハウスの名前を指定し、そして(今回は)ウェアハウスの dashDB を新規に作成するので "Create new dashDB instance" を選択します:
2016012802


そしてウェアハウス化する Cloudant のデータベースを指定します。今回は "iotdata" というデータベースを対象にします。途中まで入力すると候補が出てくるのでそこから選びます:
2016012803


対象データベースに "iotdata" が追加されました。必要に応じてここで複数のデータベースを追加指定することも可能です。最後に "Create Warehouse" をクリックします:
2016012804


しばらく待ちます・・・・
2016012805


Cloudant 上の "iotdata" データベースが指定した名前でウェアハウス化されました。"Open in dashDB" をクリックすると dashDB 上のデータとして開くことができます:
2016012806


dashDB で開いた時の画面です:
2016012807


メニューから Tables を選び、データベース名(IOTDATA)を選択すると、Cloudant から複製されたデータベースが確認できます。下図は Table Definition タブが選択された状態で、テーブル定義を確認できます:
2016012808


隣の Browse Data タブを選ぶと、実際のデータレコードが確認できます。Cloudant のデータが RDB である dashDB 内に格納されていることが確認できました:
2016012809


ちなみに、この時 Bluemix のダッシュボードを確認すると、未バインドの dashDB インスタンスが米国南部データセンター内に作られていました(元の Cloudant が米国南部以外で作られていても、dashDB は米国南部に作られるようです):
2016012808


また、ウェアハウスを作成した段階では Cloudant にも "_warehouser" というデータベースが作成されていました。2ドキュメントなので、おそらく管理用データベースかな:
2016012801


 

超っ速!と噂の PHP 7.0 がリリースされました。

というわけで、早速自分の CentOS 6 環境に導入してみました。手順はこんな感じで EPEL -> REMI とレポジトリを追加して yum で導入:
# cd /tmp
# yum -y install epel-release
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6.rpm
# yum -y install --enablerepo=remi --enablerepo=remi-php70 php

できたかな?
# php -v
PHP 7.0.2 (cli) (built: Jan  6 2016 15:33:31) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

簡単でした。

MQTT をプログラミングで実装することを試みる場合、真っ先に思いつくのは Paho のライブラリを使うことです。Paho はオープンソースの MQTT ライブラリであり、多くの言語向けにクライアントライブラリが提供されています。この Paho を使うことができれば、比較的簡単に MQTT パブリッシャー/サブスクライバー機能を実装することが可能です:
http://www.eclipse.org/paho/
2016012501


ところが、Paho では PHP のライブラリは提供されていません。比較的利用者が多いと思われる PHP で MQTT を実装する場合、Paho 以外のライブラリを探す必要があるのですが、その候補の1つになりそうなのがオープンソースの phpMQTT です:
https://github.com/bluerhinos/phpMQTT


利用のための準備は非常に簡単で、上記サイトから phpMQTT.php ファイルをダウンロードするだけです。後はこのライブラリを読み込んで実装するだけ、です。

例えば MQTT パブリッシャーを実装する場合は、以下の様なコードを記述します(ファイル名は publish.php として、phpMQTT.php と同じディレクトリに作成します)。ダウンロードした phpMQTT.php を require で呼び出した上で、ホスト名、ポート番号、クライアント ID、トピック、そしてメッセージ本文といったパーツを単純に指定して、connect() して publish() メソッドを実行しているだけです:
<?php
require( "./phpMQTT.php" );

$mqtt_host = "quickstart.messaging.internetofthings.ibmcloud.com"; # MQTT ブローカー
$mqtt_port = 1883; # MQTT ポート番号
$mqtt_clientid = "d:quickstart:MyDevice:me.juge.mqtt.test"; # クライアントID
$mqtt_topic = "iot-2/evt/status/fmt/json"; # トピック文字列
$mqtt_message = '{"val1":123,"val2":"ABC"}'; # パブリッシュするメッセージ

$mqtt = new phpMQTT( $mqtt_host, $mqtt_port, $mqtt_clientid );
if( $mqtt->connect() ){
  $mqtt->publish( $mqtt_topic, $mqtt_message, 0 );
  $mqtt->close();
}
?>

↑上記のコードは IBM の IoT Foundation Quickstart 環境を想定してブローカーやクライアントID、トピックを指定しています。デバイス ID として "me.juge.mqtt.test" を指定してメッセージをパブリッシュしています。なので、IBM Bluemix の Node-RED 環境で IBM IoT インプットノードのデバイス ID に同じ文字列 "me.juge.mqtt.test" を設定すれば Node-RED にメッセージを送付することができます:
2016012501


(注 皆さんが試す場合は別のユニークな文字列を指定してください。要は PHP 内で指定するデバイス ID と、Node-RED で指定するデバイス ID が同じものを指定する必要がある、という意味です)


この状態で IBMIoT インプットノードに debug アウトプットノードを繋げて Node-RED アプリケーションをデプロイし、上記の PHP ファイルを実行します:
# php -f publish.php

するとコード内で記述された処理が実行され、IBM IoT Foundation Quickstart の MQTT ブローカー(quickstart.messaging.internetofthings.ibmcloud.com:1883)にメッセージが送信され、Node-RED 内の IBMIoT ノードが受け取り、このように画面内の debug タブに表示されれば成功です:
2016012502


PHP でも MQTT プログラミングができること、そして IBM の無料 MQTT ブローカーである QuickStart 環境にメッセージがパブリッシュできることが確認できました。



 

Linux で(無料で)使える仮想環境といえば、個人的な利用頻度だと
 KVM > VirtualBox > VMWare (Player)
となるかなあ・・・ KVM は標準機能の一部で実際自宅の仮想環境を構築してます。
各端末にインストールして使う、という意味では VirtualBox と VMWare がありますが、僕自身は対応フォーマットの多い VirtualBox を使うことが多いです。PC では Microsoft VirtualPC も使っているのですが、この VirtualPC 用のディスクも VirtualBox だとそのまま読み込めるというのがデカいです。

で、その VirtualBox を CentOS に導入する手順を紹介します。前回↓VMWare Player の導入手順紹介の際にも触れましたが、VirtualBox 「に」 CentOS を導入する手順の紹介記事は多いのに、VirtualBox 「を」 CentOS に導入する記事はあまり多くなさそうなので、あまり需要がないのかもしれません(苦笑):
CentOS で VMWare Player を使う


前提条件としては前回同様に CentOS に X Windows システムを導入しておく必要があります。

手順としては、VirutalBox の Linux 用ダウンロードサイトから該当ディストリビューションの環境にあったものをダウンロードしてインストールするだけです。CentOS 6 を使う場合であれば互換性のある "Oracle Linux 6" と書かれた所から(CPU のビット数にあうものを)ダウンロードします:
Linux_Downloads

2016012401


この記事を書いている 2016/Jan/24 の時点では 64bit 版としては 5.0.14(ファイル名では VirtualBox-5.0-5.0.14_105127_el6-1.x86_64.rpm)がダウンロードできました。これを rpm や yum でインストールします:
# yum install VirtualBox-5.0-5.0.14_105127_el6-1.x86_64.rpm
  または
# rpm -ivh VirtualBox-5.0-5.0.14_105127_el6-1.x86_64.rpm

インストールが成功すると VirtualBox はメニューの「システムツール」から選択できるようになります。選択して、起動してみましょう:
2016012402


PC 版と同様の VirtualBox の画面が表示されます。新規に仮想マシンを作成したり、既存の仮想マシンのディスクをインポートするには「新規」を選択します:
2016012403


仮想マシンの情報を入力します。ここで新規に作成するのではなく、既存の仮想マシンのディスクを使って作成する場合は「すでにある仮想ハードディスクファイルを使用する」を選びます。また仮想ハードディスクファイルを指定するためにフォルダアイコンをクリックします:
2016012404


ここで仮想ハードディスクファイルを選択します。図のように VirtualBox では VirtualPC の .vhd フォーマットの仮想ディスクファイルがサポートされており、ここから直接指定して開くことが可能です:
2016012405


ためしに VirtualPC で作成した PC-DOS 環境の仮想ディスクファイルを指定して仮想マシンを作成してみました。「起動」ボタンで起動します:
2016012406


ちゃんと PC-DOS として起動し、PC-DOS として動作できるようです(VirtualPC とは違い、EMS は未対応のようです):
2016012407


少なくとも僕の利用スタイルでは CentOS 環境で仮想マシンを使う時は KVM か VirtualBox が便利そうだなあ、という印象です。

このページのトップヘ