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

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

2016年03月

JavaScript で Cloudant や CouchDB を操作できるようになるライブラリの1つに PouchDB があります:
https://pouchdb.com/

2016031701


PouchDB は CouchDB および CouchDB と互換性のあるローカル NoSQL データベースです。JavaScript を使ってデータを読み書きし、またリモートの CouchDB サーバーにアクセスしたり同期したりすることもできるものです。広い意味ではデータベース本体および JavaScript ライブラリを合わせて PouchDB と呼ぶこともあります。

という特徴をもった、この PouchDB の JavaScript ライブラリを使うと、リモートの CouchDB データベースにアクセスすることができるようになります。JavaScript ライブラリなのでクロスサイトスクリプティング等のセキュリティ制約を意識しながら使う必要があります。

今回、紹介するのはこんな環境で JavaScript を使ってデータベースにアクセスする、というものです。HTML ファイルがローカルディスク内にあるので、普通にアクセスするとクロスサイトスクリプティング制約にかかって使えませんが、その制約を回避する方法と合わせて紹介します:
2016031705


まずは操作先の CouchDB サーバー環境を用意します。外部からアクセスするので Access-Control-Allow-Origin ヘッダのカスタマイズも必要になります。この辺りの手順は以下2つのブログエントリを参照ください:


この CouchDB サーバーの IP アドレスは XX.XX.XX.XX、ポート番号はデフォルトの 5984 であるとして以下を記述します。まずは CouchDB サーバーの管理コンソールにアクセスして、この後リモートから操作するためのデータベースを1つ作成しておきましょう。ウェブブラウザで http://XX.XX.XX.XX:5984/_utils/ にアクセスして管理コンソール画面にアクセスし、"Create Database" と書かれた箇所をクリックします:
2016031701


作成するデータベースの名前を問われるので適当な名称(この例では mydb)を入力して "Create" ボタンをクリックします:
2016031702


指定した名称のデータベースが作成され、その内容が表示されます。この時点では作成直後なのでドキュメントは存在していないはずです。とりあえず元の画面に戻るために "Overview" と書かれた箇所をクリックします:
2016031703


もとの管理コンソールのデフォルト画面に戻ります。先程まではなかった mydb というデータベースが追加されていることがわかります。このデータベースにリモートからアクセスすることが今回の目的です:
2016031704


次にローカル側の準備です。まずなにはともあれ PouchDB ライブラリが必要なので、PouchDB のトップページから最新版の PouchDB をダウンロードします。この記事を書いている時点での最新バージョンは 5.3.0 で、ダウンロードファイル名は pouchdb-5.3.0.min.js でした:
2016031701


次にダウンロードした PouchDB ライブラリを使って、リモートの CouchDB サーバーのデータベースにアクセスするプログラムをローカルに作成します。具体的には以下の様な HTML ファイル(index.html)をダウンロードした pouchdb-5.3.0.min.js と同じディレクトリに作成します:
<html>
<head>
<script src="./pouchdb-5.3.0.min.js"></script>
<script>
var db = new PouchDB('http://XX.XX.XX.XX:5984/mydb');
db.info().then( function( info ){
  console.log( info );
});
</script>
</head>
<body>
</body>
</html>

ソース内の XX.XX.XX.XX は CouchDB サーバーのホスト名または IP アドレスです。また mydb はアクセス先のデータベース名称です。この HTML では同じディレクトリにある pouchdb-5.3.0.min.js を読み込み、http://XX.XX.XX.XX:5984/mydb にアクセスして、成功したらその情報をウェブコンソールに表示する、というものです。繰り返しになりますが、このソースファイルはローカル環境にあり、このようなファイル構成になっています。そして HTML ファイルの読み込みと同時にリモートの CouchDB サーバーにアクセスして mydb データベースの情報を表示する、という内容の処理が記述されています:
2016031706


ではこの index.html をダブルクリックしてデフォルトブラウザで開きます。注意点としてウェブサーバー上の HTML ファイルを開いているのではなく、ローカルディスク内の HTML ファイルを開いている(アドレスのプロトコル部分が file:/// で始まっていることに注目)ことを確認してください。そして F12 を押してウェブコンソールを表示すると、上記 HTML 内の JavaScript コードが実行されて XX.XX.XX.XX:5984 の mydb データベースに関する情報が出力されていることを確認してください。ローカル環境から JavaScript でリモート環境の CouchDB サーバーのデータベースの情報を取得することができました!
2016031707


もしもここで以下のようなメッセージが表示されてしまう場合は、クロスサイトスクリプティングの制約にかかって、JavaScript が実行できなくなっている可能性が高いです。その場合はこのページの上部にある「CouchDB の Access-Control-Allow-Origin ヘッダを設定する」のリンク先に書かれている設定が足りない(または間違っている)ので、この内容を確認した上で再度試してみてください:
2016031708


以前のブログエントリで CouchDB サーバーの導入手順(というかビルド手順)を紹介しました:
CentOS に CouchDB をインストールする


上記の方法で自由に使うことのできる CouchDB サーバー1ノードが手元の環境に出来上がります。が、PouchDB などの JavaScript ライブラリを使ってこのサーバー上の DB を操作しようとすると、まだ手順が足りないこともあります。

具体的には、素のままの設定状態で JavaScript を使って CouchDB の REST API を実行しようとすると、クロスサイトスクリプティングのセキュリティ制約にかかってしまい、実行時にエラーを起こしてしまうのです。

クロスサイトスクリプティング制約を回避するには、(CouchDB の)HTTP サーバーに Access-Control-Allow-Origin ヘッダを付与して、明示的に制約を回避できるアクセス元を指定して回避する必要があります。その方法を紹介します。


まずは上記サイトを参照して CouchDB サーバー環境を用意します。以下の手順では上記方法で導入した CouchDB サーバー環境を利用するものとします。

次に /usr/local/etc/couchdb/local.ini をテキストエディタで開き、以下の内容を加えます(この例では Access-Control-Allow-Origin に * を設定して、事実上アクセス元の制約なしにアクセスできるような設定にしています):
  :
  :
[httpd]
port = 5984
bind_address = 0.0.0.0
enable_cors = true

[cors]
credentials = true
origins = *

  :
  :

この状態で CouchDB を再起動すると、CouchDB の REST API はどのサーバーからでもアクセスできるようになります。
# /etc/init.d/couchdb restart


実際に PouchDB を使って外部からのアクセスが可能であることを示すコードは別のエントリで用意する予定です。

CentOS に Apache CouchDB をインストールする手順を紹介します:
2016031602


Apache CouchDB はオープンソースのドキュメント指向 NoSQL データベースシステムです。元 IBM (元 Lotus!)のエンジニアである Damien Katz が Erlang 言語で開発したもので、IBM Bluemix から提供されている Cloudant のベースとなっているデータベースでもあります。

この Apache CouchDB をローカルの CentOS に導入する手順を紹介します。いつものように CentOS 6(64bit) を前提としますが、他のバージョンやアーキテクチャでもほぼ変わらないと思います。また導入する Apache CouchDB のバージョンは 2016/Mar/16 時点の最新版である 1.6.1 を対象とします。


今回は最新版を導入するということもあって、ソースコードからビルドして環境を構築します。というわけで、まずはビルドの前提となるライブラリ群や Erlang 言語関連のライブラリをまとめてインストールしておきます:
# yum install autoconf autoconf autoconf-archive automake ncurses-devel curl-devel erlang-asn1 erlang-erts erlang-eunit erlang-os_mon erlang-xmerl help2man js-devel libicu-devel libtool perl-Test-Harness


次に Erlang 言語本体をソースコードからビルド&インストールします:
# cd /usr/local/src
# wget http://www.erlang.org/download/otp_src_R14B01.tar.gz
# tar xzvf otp_src_R14B01.tar.gz
# cd otp_src_R14B01
# ./configure
# make
# make install


続けて JavaScript エンジンである Mozilla SpiderMonkey を、これもソースコードからビルド&インストールします:
# cd /usr/local/src
# wget http://ftp.mozilla.org/pub/mozilla.org/js/mozjs17.0.0.tar.gz
# tar xzvf mozjs17.0.0.tar.gz
# cd mozjs17.0.0/js/src/
# ./configure
# make
# make install


ここまでの準備ができたら Apache CouchDB を、やはりソースコードからビルド&インストールします:
# cd /usr/local/src
# wget http://mirror.tcpdiag.net/apache/couchdb/source/1.6.1/apache-couchdb-1.6.1.tar.gz
# tar xzvf apache-couchdb-1.6.1.tar.gz
# cd apache-couchdb-1.6.1
# ./configure
# make
# make install


これで Apache CouchDB 本体のインストールは完了です。実行前に CouchDB 実行用のユーザーを作成し、関連モジュールのオーナーをそのユーザーに変更します。またシステム起動時に CouchDB サーバーも起動するように設定しておきます:
# adduser --no-create-home couchdb
# chown -R couchdb:couchdb /usr/local/var/lib/couchdb /usr/local/var/log/couchdb /usr/local/var/run/couchdb
# ln -sf /usr/local/etc/rc.d/couchdb /etc/init.d/couchdb
# chkconfig --add couchdb
# chkconfig couchdb on

ここまでの作業でデータベースサーバーとして動くようになっていますが、HTTP プロトコルからも利用できるよう(REST API で読み書きできるよう)設定しておきます。/usr/local/etc/couchdb/local.ini を編集し、[httpd] セクション以下のコメントを解除して、以下のようにします(ポート番号 5984 で、自分自身のデータベースサーバーを読み書きできるように設定しています):
# vi /usr/local/etc/couchdb/local.ini

[httpd]
port = 5984
bind_address = 0.0.0.0


では CouchDB を実行します:
# /etc/init.d/couchdb start

この状態でウェブブラウザを使って(local.ini で指定した)5984 番ポートにアクセスすると、以下の様な JSON メッセージが表示され、バージョン 1.6.1 の CouchDB が稼働していることを確認できます:
2016031601


また同サーバーの /_utils/ パスにアクセスすると、ウェブコンソールの概要ページにアクセスできます。この画面からであればコマンドによる API を発行しなくても、ウェブの画面から新規にデータベースやドキュメントを追加したり、確認したりすることもできます:
2016031603







 

モデル定義だけで OpenAPI 対応の REST API を生成してくれる StrongLoop LoopBackIBM DB2 に対応していたので使ってみました。

基本的な考え方や手順は以前にこちらで紹介した MySQL 対応での手順と同様ですが、以下ではデータソースをDB2 とした場合の手順を紹介します:
StrongLoop アプリで MySQL を使う


まずは DB2 サーバーを用意します。自前で用意できる場合はその環境を使っていただいても構いませんが、IBM Bluemix ユーザーであれば SQL Database 等、DB2 サーバーのインスタンスを使っていただいても構いません。

では次のような DB2 サーバー環境が用意できているものとします:
ホスト名XX.XX.XX.XX
ポート番号50000
データベース名SQLDB
ユーザー名db2_username
パスワードdb2_password


この DB2 インスタンスに REST API で読み書きするモデルのテーブルを作成します。上記の MySQL での例と同様の item テーブルを用意します。ここで1点注意があります。DB2 の CREATE TABLE 文は普通に実行するとテーブル名や列名を全て大文字で作成します。普通に利用する際には大文字小文字を区別することなく利用できるのですが、LoopBack 環境では全て小文字で定義されている前提で API が発行されます。つまりデフォルトの大文字のままでテーブルを定義すると後で「テーブルが見つからない」といったエラーが発生してしまいます。それを避ける目的で create table 内のテーブル名や列名の部分は全てダブルクォーテーションで括り、明示的に小文字で作成する必要があります。この点に注意して作成してください:
> create table "item"("id" int primary key generated always as identity (start with 1 increment by 1),"name" varchar(50) not null,"code" varchar(50) not null,"price" int);

これで DB2 側の準備はできました。ではこの item テーブルのデータを読み書きする API を LoopBack で用意しましょう。以下 CentOS 環境を前提に紹介します。

まず、StrongLoop や LoopBack は npm を通じて提供され、Node.js 上で動きます。というわけで Node.js と npm を導入する必要があります:
# yum install epel-release
# yum install nodejs npm --enablerepo=epel

次に npm を使って LoopBack と StrongLoop を導入します:
# npm install -g loopback
# npm install -g strongloop

StrongLoop / LoopBack が導入できたら、これらを使って API を作成します。まずは作業用のディレクトリ(下の例では ~/tmp)を作って、そこに移動しておきます:
# cd
# mkdir tmp
# cd tmp

このディレクトリに LoopBack のアプリケーション環境を作成します。ここではアプリケーション名を db2app と指定しています:
# slc loopback db2app

アプリケーション名と、アプリケーションディレクトリを聞かれますが、いずれもデフォルトの db2app をそのまま指定します。またアプリケーションの種類を聞かれますが、これもデフォルトのまま api-server を選択します:
2016031401


すると db2app アプリケーションの基本部分のインストールが開始され、しばらく待つとこのような画面になり、導入が完了します(この時点で db2app ディレクトリが作られているはずです):
2016031402


上図の最後の部分にこの後の手順が記載されています。が、LoopBack の標準 DB ではなく、他の外部 DB を利用する場合の手順は少し異なります。まずはアプリケーションディレクトリに移動しておきます:
# cd db2app

次にこのプロジェクトのデータソースが DB2 になるようカスタマイズします。まずは DB2 コネクタをインストールします。このコマンドで DB2 ODBC CLI ドライバなどもダウンロード&インストールされます:
# npm install --save loopback-connector-db2

DB2 コネクタがインストールできたら、このコネクタを使ってデータソースを定義します。カスタムデータソースの名称は "mydb" としています:
# slc loopback:datasource mydb

そしてデータソース名はデフォルトのまま mydb を選択します。次のコネクターの選択肢において "IBM DB2" を選択します(ここが今回、新たに DB2 対応した機能です):
2016031403


続けて DB2 サーバーへの接続情報を指定します。上記表の内容通りにホスト名、ポート番号、ユーザー名、パスワード、そしてデータベース名を入力します:
2016031404


ちなみにここでの作業の内容は server/datasource.json ファイルに記載されます。直接編集する場合は同ファイルをテキストエディタで編集してください。


データソースの定義ができたら最後に item モデルを生成します:
# slc loopback:model item

モデル名はデフォルトのまま item を指定します。次にデータソースを聞かれるので上記で作成した mydb を指定します(これでデータソースは DB2 になります)。以下はこれまでと同様でベースクラスには PersistedModel、REST API 公開は Yes、カスタム plural form はなし(そのままリターン)、そして common モデルを指定します:
2016031405


そして各列の定義では上記表のように name 列は string 型で必須(Yes)、code 列も string 型で必須(Yes)、price 列は number 型で必須ではない(No)をそれぞれ指定します:
2016031406


最後に Property name を聞かれた所でそのまま Enter を入力して、列のカスタマイズを完了します。これでモデルの定義も完了しました。


モデルが出来たので、LoopBack で API が稼働し公開されるはずです。実際の動作を確かめてみましょう:
# node .

すると画面には API Explorer にアクセスするための URL (最後が /explorer になっている方)が表示されます:
2016031407


ウェブブラウザでこのページにアクセスすると、db2app アプリケーションと、その中に item モデルを読み書きする一連の API が生成されていることが確認できます:
2016031408


後はここで紹介したような方法で実際の API を実行して、この画面から動作確認することが可能です:
2016031409


ここでデータレコードを作成した場合、当然 DB2 サーバー内に格納されます。DB2 側のデータを参照して同じデータが保存されていることを確認できます:
2016031410


これまで LoopBack は Oracle や SQL Server には対応していましたが、ようやく "StrongLoop An IBM Company" っぽい連携ができるようになりました(笑)。
2016031411


特定の技術カテゴリの文書(特に日本語文書)をまとめて探したい場合、いくつかの方法が考えられます。ただ最近は Qiita が人気で、ここからタグを使って
  https://qiita.com/tags/(技術タグ名) 
にアクセスする、といった方法が考えられます。

例えば Qiita 内の "Bluemix" の日本語技術文書を探すのであれば、
  https://qiita.com/tags/bluemix
といった具合です:
2016030701


さて、これらの文書をまとめて(API 的に)取得したい、となった場合はどうしましょう? よくある方法としては RSS で取得する、という方法が考えられますが、では Qiita のタグ一覧ページを RSS で取得するにはどうすればいいのでしょうか? これが今日のお題です。

答は簡単で、URL の最後に /feed.atom を付けるだけです:
  https://qiita.com/tags/(技術タグ名)/feed.atom

"Bluemix" 記事を対象にするのであれば、こんな感じになります:
  http://qiita.com/tags/bluemix/feed.atom

2016030702


Qiita の記事をタグを指定して RSS リーダーで読む、といった場合でも使えるワザだと思いますが、記述文書を API 的に収集する、という用途でも便利な方法だと思いました。

 

このページのトップヘ