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

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

2016/08

Java で Git のリポジトリを操作するライブラリに JGit があります:
http://www.eclipse.org/jgit/
2016082801


現在は Eclipse 参加のサブプロジェクトとして提供されています。すごく便利な反面、ちょっとクセがあります。以下、基本的な使い方を説明しますが、まずは前提をいくつか:

【前提】
(1) 対象とする Git のリモートリポジトリ URI は http://xxxgit.com/name/project.git とします。
(2) 上記リポジトリにアクセス(特にプッシュ)する際の認証は ID: username, Password: password であるとします。
(3) ローカルリポジトリ(上記リポジトリをローカルにクローンする先)のディレクトリは ./project (つまりカレントディレクトリ上に project というサブディレクトリを作る)とします。


【準備】
JGit のダウンロードページから最新版の JGit をダウンロードし、展開して JAR を取り出し、自分のプロジェクト内に(Classpath を通すなどして)用意します。

ここまで用意できれば JGit を使うことができます。以下、一通りの git 操作(clone, pull, add, commit, push)を行う様子を順に紹介します。


【git clone】
目的のリモートリポジトリ(今回の例では http://xxxgit.com/name/project.git)からコードをクローンします:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git clone
    git.cloneRepository().setURI( "http://xxxgit.com/name/project.git" ).setDirectory( new File( "./project" ) ).call();
  }
}catch( Exception e ){
  e.printStackTrace();
}

以下全ての例に言えることですが、ローカルリポジトリのインスタンス変数を作る際に指定するのは、ローカルリポジトリのフォルダに "/.git" をつけたものです。

一方、クローン実行時に指定するローカルフォルダはローカルリポジトリのフォルダそのものです。この辺りがクセのある所で、知らないと混乱します。


【git pull】
クローンしたローカルリポジトリに対し、リモートリポジトリに加えられている最新の変更を反映させます:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git pull
    PullCommand pc = git.pull();
    pc.call();
  }
}catch( Exception e ){
  e.printStackTrace();
}

JGit では各コマンドを実行する際には ****Command クラスの(上記例では PullCommand クラス)インスタンスを作って、必要であれば設定を加えて、call() する、という処理を実行します。

そして次の add コマンドを実行する前に、このローカルリポジトリ内のファイルに何らかの変更が加わっていることを想定してください。


【git add】
ローカルリポジトリ内のファイルシステムに対して行った変更作業をリポジトリに加えます:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git add
    AddCommand ac = git.add();
    ac.addFilepattern( "." );  //. 全ての変更を git add する
    try{
      ac.call();
    }catch( NoFilepatternException e ){
      e.printStackTrace();
    }
  }
}catch( Exception e ){
  e.printStackTrace();
}

AddCommand インスタンスにファイルパターンを指定して call() する、という手順です。


【git commit】
ローカルリポジトリの変更内容をコミットします:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git commit
    CommitCommand cc = git.commit();
//. コミッターの名前とメールアドレス、コミットメッセージを指定 cc.setCommitter( "commiter_name", "committer_email" ).setMessage( "Some message." ); try{ cc.call(); }catch( NoHeadException e ){ e.printStackTrace(); }catch( NoMessageException e ){ e.printStackTrace(); }catch( ConcurrentRefUpdateException e ){ e.printStackTrace(); }catch( WrongRepositoryStateException e ){ e.printStackTrace(); } } }catch( Exception e ){ e.printStackTrace(); }

コミッターの名前とメールアドレス、そしてコミットメッセージを追加した上で call() します。


【git push】

ローカルリポジトリの変更内容をリモートリポジトリに対してプッシュします:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
//. git push CredentialsProvider cp = new UsernamePasswordCredentialsProvider( username, password ); PushCommand pc = git.push(); pc.setCredentialsProvider( cp ).setForce( true ).setPushAll(); } }catch( Exception e ){ e.printStackTrace(); }

認証用の usernamepassword を指定してプッシュする、という流れです。


以上、JGit を使った基本的な git コマンドの実行方法を紹介しました。クセがある、と紹介しましたが、ある程度慣れてしまえばそんなに苦ではないと思います。何よりもプログラムから git が使えると複製機能をこれで実装できたりするのですごく便利です。

自分はエンジニアのキャリアの中でエクセルではない某表計算ソフトの開発に携わる機会がありました。そんなわけで、どちらかというとアンチ・エクセル派だったりします:
2016082100


また一部の人には公にしていますが、その後ノーツ/ドミノのエンジニアも担当させていただく機会もありました。ノーツは大好きです、.NSF 万歳!


だからというわけではないのですが、そんなバックグラウンドを持つ自分がエクセルデータファイル(*.xls や *.xlsx)をノーツデータベース(*.nsf)化するツールを作ってみました。これで幸せになれる人がいたら使ってほしいです(笑)。

ちなみに OpenNTF.org を探してみると、この逆(ノーツをエクセル化)を実現するようなものは(自分が動かしてみたわけではありませんが)見つかります。が「エクセルをノーツ化」という変態的のはさすがになさそうだったので、技術的挑戦も兼ねて作ってみました。正直かなり手間取りましたが、当初考えていた最低限の挙動はできるようになったので、一旦公開して、紹介します。実体はノーツの NTF および NSF ですが、ACL は誰でも開いてみれるようになっているはずなので、興味ある人は中身を確認したり、もう少し便利に作りなおしたりしてみてください。

まず仕様のおさらいの意味で、どんなインプットに対して、どんなアウトプットができるようになるのか、という点を紹介します。用意する必要があるのはエクセルシートファイルです:
2016081901


このエクセルファイルには複数のシートが存在していることを想定します。そして各シート毎になんらかのデータが格納されているものとします。この例ではシートは3つあり、1枚目(Sheet1)にはこんな感じで、7行5列のデータが入ってます(ちなみに E 列の値は同じ行の C 列の値を2倍したものになるような計算結果として定義されています):
2016082001


一方、2枚目のシート(Sheet2)には10行3列のこんなデータが入っているものとします。シートごとに列数や行数が全く異なるデータが入っていることを想定しています:
2016082002


3枚目のシート(Sheet3)には変換対象範囲を理解する上で役立つシートにしました。シート内のセルが虫食い状態のようにところどころに空白のセルがあるものです。ちなみにこの例では5行3列(A1 セルから C5 セルまでの矩形部分)を変換対象にするような仕様にしています(E2 セルにデータは存在していますが、D 列に全くデータがないので対象外と判定する仕様です):
2016082003


このデータをノーツ化するにあたり、以下の様なルールで変換(というかインポート)します:
  • 1つのエクセルシートの内容を1つのビューとして変換する
  • なので、3つのシートを持つエクセルファイルは3つのビューをもつノーツデータベースに変換される
  • ノーツを使いつつ、見栄えはなるべく表計算っぽくする

実際の作業は以下のようになります。まず今回用意したノーツデータベース "XLS2NSF" (リンクは後述)をノーツクライアントから開きます:
2016081902


いわゆる「ポリシー文書」が開き、使い方などが確認できます。内容は確認いただくとして、すぐに試すには「エクセルファイル指定」と書かれたボタンをクリックします:
2016082101


ファイルダイアログが開くので、エクセルファイル(*.xls / *.xlsx)を指定します。ここでは上記で紹介した MyBook1.xls という3つのシートを持つファイルを指定しています:
2016081904


後は全自動でノーツDB化が実行されます。事実上エクセルファイルを指定するだけ、です。

全ての変換処理が完了すると、指定したファイル名と同じタイトルのノーツDB(ファイルパスはノーツデータディレクトリ直下、ファイル名はタイトルの最後に ".nsf" を加えたもの)がワークスペース上に追加されているはずです。これをクリックすると変換結果が参照できます:
2016081903


この作成されたデータベースをノーツで開いた様子がこちらです。元ファイルには3つのシートが存在していましたが、それぞれのシートがノーツのビューとしてナビゲータから切り替えて見ることができます。こちらは Sheet1 のもの。7行5列の表が中身も含めて再現されています。なお元ファイルでは E 列の中身は同じ行の C 列の2倍になるような計算式でしたが、変換後は固定値になっています:
2016082004


2つ目の Sheet2 に切り替えるとこのようになります。元のシート通り、10行3列の表ができているはずです:
2016082005


3つ目の Sheet3 はこちら。セルの虫食い状態も再現されています。また上記で紹介したように元のシートの A1 セルから C5 セルの部分が変換されているはずです:
2016082006



この変換後のノーツデータベース(のビュー)は ViewEdit モードを実装しているので、特定のセルをクリックすると、そのセルの値を書き換えることができます。以下の例では Sheet2 の C6 列(もともと "4" と入力されていた箇所)を編集して "123" にしている所です:
2016082007


Enter を押すと変更が確定して、元のビューに戻ります:
2016082008


と、まあこんな需要があるのかないのか分からないものを作ってみました。折角なので GitHub で公開しています:
https://github.com/dotnsf/xls2nsf

(注 .nsf や .ntf のノーツデータベースを Git で管理すべきではありません。良い子はマネしちゃだめ)


実際に試してみたい! という奇特な方は、上記 GitHub から "Clone or Download" - "Download ZIP" を選択してダウンロードし、展開して使ってください:
2016081902


また、このブログの中で紹介に使っているエクセルのサンプルファイル(MyBook1.xls)も併せて公開します。ぜひ手持ちのファイルで試していただきたいのですが、良さ気なのがない場合は使ってください:
http://dotnsf.blog.jp/MyBook1.xls


以下、2016/Aug/21 時点での制約です:
  • LotusScript で実装しています。エクセル読み取りは OLE を使っています。そのためノーツクライアントとエクセルがインストールされた Windows 環境でないと動かないと思います。
  • 変換の対象となる部分の計算方法が特殊です。現時点では各シートの A1 セルには必ず値が入っている必要があります。
  • また列は行、列ともに空セルしかない最初の行や列を探して、その内側を対象とみなしています。下の霊であれば、D列と 6 行目には空セルしかないので、その内側の A1 セルから C5 セルまでが対象です(E2 セルにデータがありますが、現在の仕様ではデータ変換の対象にはしません)。
2016082001


ノーツ化することで式による計算機能を失ってしまうわけですが(汗)、代わりに強力な ACL によるアクセス管理ができるようになります。この辺りは改善できればしたいなあ、と思っていますが、ノーツのビュー内の各エントリーの中身を式の結果にするというのは現時点では困難と思ってます。あと1行追加とか、1列追加とか、できそうで実装してない機能もありますが、その辺りは興味ある人に追加実装していただきたいです(手抜きともいう)。

ま、自分で作っておいてなんですが、「そこそこ動く MAD なツール」だと思いますw こういうのは我ながら嫌いじゃない。

Python から R 言語を呼び出して実行する手順をまとめました。システムは CentOS 6.x を想定しています。


具体的には Python の PypeR ライブラリを使います。なので Python と R 言語と PypeR ライブラリをインストールすることになります。ただそれだけではまだ色々不便なので、numpy や pylab などの PypeR と一緒によく使うライブラリとまとめて環境を用意して使うことにします。

まず以下の手順を実行する上で前提となるライブラリ類と Python3 をまとめて導入しておきます。
# rpm -ivh http://mirror.yandex.ru/fedora/russianfedora/russianfedora/free/el/releases/6/Everything/x86_64/os/puias-release-6-2.R.noarch.rpm
# yum install -y python3.x86_64 python3-devel.x86_64 python3-tools.x86_64 freetype* libpng-devel libjpeg-devel lapack-devel

次に pip をインストールします:
# curl -kL https://bootstrap.pypa.io/get-pip.py | python

導入した pip を使って PypeR などのライブラリをインストールします(numpy や scipy などは結構時間がかかります):
# pip install numpy
# pip install pyper
# pip install pandas
# pip install scipy
# pip install pylab

最後に R 言語環境をインストールします:
# yum install R

これで全ての環境が整いました。では R 言語と導入したライブラリを使って動かす、以下の様な Python スクリプトを用意して実行してみます(なお、この Python スクリプトはここで紹介されているものです):
# -*- coding:utf-8 -*-

import numpy
import pandas
import pylab
import pyper

n = 200
# データの生成
score_x = numpy.random.normal(171.77, 5.54, n)
score_y = numpy.random.normal(62.49, 7.89, n)

score_x.sort()
score_x = numpy.around(score_x + numpy.random.normal(scale=3.0, size=n), 2)
score_y.sort()
score_y = numpy.around(score_y + numpy.random.normal(size=n), 2)

# 散布図を描く
pylab.scatter(score_x, score_y, marker='.', linewidths=0)
pylab.grid(True)
pylab.xlabel('X')
pylab.ylabel('Y')

# Rで回帰分析
df = {'X': score_x, 'Y': score_y}
df = pandas.DataFrame(df)

r = pyper.R(use_pandas='True')

# Rへデータ渡す
r.assign('df', df)

# Rのコマンド実行
print(r("summary(df)"))
r("result <- lm(Y~X, data=df)")
print(r("summary(result)"))

#予測区間と信頼区間を算出するため
new_x = numpy.arange(155, 190, 0.1)
new_df = pandas.DataFrame({'X': new_x})
r.assign('new', new_df)

# 予測区間(R)
r("prediction <- predict(result, new, interval='prediction')")
# 信頼区間(R)
r("confidence <- predict(result, new, interval='confidence')")

# Python側にとってくる
lm_result = r.get('result$fitted.values')
prediction = pandas.DataFrame(r.get('prediction'))
confidence = pandas.DataFrame(r.get('confidence'))

# 回帰直線, 予測区間, 信頼区間を描く
pylab.plot(score_x, lm_result, 'r', linewidth=2)

pylab.plot(new_x, prediction[1], 'g', linewidth=1)
pylab.plot(new_x, prediction[2], 'g', linewidth=1)

pylab.plot(new_x, confidence[1], 'c', linewidth=1)
pylab.plot(new_x, confidence[2], 'c', linewidth=1)

pylab.show()

この内容を例えば python01.py という名前で保存し、python で実行すると以下の青字部分のような出力が確認できます:
# python3 python01.py

try({summary(df)})
       X               Y
 Min.   :153.2   Min.   :41.81
 1st Qu.:167.1   1st Qu.:57.49
 Median :171.3   Median :63.45
 Mean   :171.4   Mean   :63.28
 3rd Qu.:176.3   3rd Qu.:68.39
 Max.   :186.8   Max.   :80.02

try({summary(result)})

Call:
lm(formula = Y ~ X, data = df)

Residuals:
   Min     1Q Median     3Q    Max
-8.389 -2.431 -0.233  2.405 10.974

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -106.42882    6.72661  -15.82   <2e-16 ***
X              0.99004    0.03921   25.25   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.67 on 198 degrees of freedom
Multiple R-squared:  0.763,     Adjusted R-squared:  0.7618
F-statistic: 637.5 on 1 and 198 DF,  p-value: < 2.2e-16

Python スクリプト内で指定されている PypeR や Pylab などのライブラリが正しく読み込まれて実行することができました。

(参考)
https://gist.github.com/mia-0032/6378324

以前に「ノーツデータベースをまるごと IBM Watson に学習させて、問い合わせを行うサンプルアプリ」を作って紹介しました。なかなかに反響があり、タダで配布しなければよかった、と・・・調子に乗って同様のワードプレス環境向けサンプルを作ってみました。

ワードプレスは世界中で使われているオープンソースの CMS(コンテンツ管理システム)です。ちょっとデータが古いのですが、2014 年時点での 1000万サイトを対象にした調査によると CMS としてのシェアは約60%で、何よりも驚くのは全ウェブページ中の 26.6% がワードプレスを使って作られている、ということです(もう少し新しい情報持ってる人がいたら教えてください):
https://w3techs.com/technologies/overview/content_management/all

2016081201


と、それだけ利用者の多いワードプレスのデータをコグニティブエンジンである IBM Watson に学習させて、かつその学習データを使った問い合わせまでを実現できるようなプラグインを開発しました。 ぶっちゃけ、まだ「動作確認レベル」の段階ですが、このタイミングで一度公開して、多くの人に使ってみていただこうと思っています。


このプラグインを使うには、大きく2つの前提条件が必要です:
1. IBM Bluemix 環境
2. データの入ったワードプレス環境


まず 1. IBM Bluemix 環境です。IBM Bluemix にサインアップし、有効なアカウントを所有している必要があります。IBM Bluemix はアカウント作成から 30 日間は無料で利用することが出来、また有償以降後にもサービスに無料枠が設けられていて、無料または安価に利用することが可能です。

この IBM BLuemix にログインして、Watson の Natural Language Classifier (以下 NLC)サービスを作成します。このサービスを使ってデータの学習および問い合わせを行います:
2016081202


ちなみに NLC サービスの 2016/Aug/12 時点での料金は以下の様になっています。サービスインスタンスを1つだけ作成し、一ヶ月の中で学習機能を4回、問い合わせ機能を 1000 回以内使うぶんには(有償契約移行後であっても)無料枠に収まるので料金はかかりません。これらを越えて利用した場合の料金の目安にしてください:
2016081204


作成したサービスの「サービス資格情報」を確認し、このサービスを利用するためのユーザー名(username)とパスワード(password)を確認します。これらの情報は後で利用するので、このページを残しておくかメモするなりして入力できる状態にしておいてください:
2016081203


次に 2. データの入ったワードプレス環境ですが、ワードプレスの中にある文書とカテゴリを使って学習させるため、それなりの学習データを用意しようとすると、それなりの文書量が必要になります。またそのワードプレス環境にプラグインをインストールする等、管理者アカウントでログインできる権限も必要になります。


実際にプラグインを導入する手順を紹介します。プラグインは GitHub 上に用意しました:
https://github.com/dotnsf/wordpress_watson_nlc

2016081301


上記ページの "clone or download" と書かれた緑のボタンをクリックし、メニューから "Download ZIP" を選択してプラグインの ZIP ファイル(wordpress_watson_nlc-master.zip)をダウンロードします:
2016081302


ダウンロードした ZIP ファイル(wordpress_watson_nlc-master.zip)は、ワードプレスの管理画面の プラグイン - 新規追加 から「プラグインのアップロード」をクリックしてインストールできます:
2016081303


追加するプラグインファイルを指定する画面が表示されたら、ダウンロードした ZIP ファイル(wordpress_watson_nlc-master.zip)を指定して「今すぐインストール」ボタンをクリックします:
2016081304


インストールが成功したら「プラグインを有効化」をクリックして、このプラグインを有効な状態にします:
2016081305


プラグインが有効になると管理メニューの中に「NLC 設定」という項目が追加されます。このページをクリックして表示し、Username と Password に上記の NLC サービス設定時のサービス資格情報ページで取得したユーザー ID とパスワードを入力し、「変更を保存」ボタンをクリックします:
2016081306


Username と Password が設定されました。これで NLC プラグインのインストールと設定が完了です:
2016081307


では実際にこのプラグインを使ってみましょう。このプラグインで出来ることは2つあります:
(1) この(プラグインを導入した)ワードプレス環境内に格納されたデータを IBM Watson に学習させる
(2) (1) で用意した学習データを使って、問い合わせを行い、その返答内容を確認する


それぞれ順に説明します。(1) の学習機能ですが、ワードプレスに格納された投稿データの本文及びタイトルとカテゴリーの情報をもとに学習します。例えば以下の様な内容の投稿データがあったと仮定します:
 
タイトルBLUEMIX 上の SPARK を利用して、ブラウザー内で気象データを分析する
本文Apache Spark は、まったく新しい機能の数々をデータ・サイエンティスト、ビジネス・アナリスト、アプリケーション開発者に初めて利用できるようにする、次世代の分散データ処理エンジンです。Analytics for Apache Spark は IBM Bluemix に用意されている一般的なツールと連動することから、この Analytics for Apache Spark を使用することで、瞬く間にこの Apache Spark の能力をフル活用できるようになります。このチュートリアルでは、Spark API を使用する IPython Notebook を利用して、実際の気象に関するロー・データを分析する方法を紹介します。この例をベースとして使用すれば、Bluemix 上の他のアナリティクスも簡単に利用することができます。
カテゴリーcloud


Watson は初期状態では何も学習していません。そこにこの投稿データのカテゴリーである cloud について学習させたいとします。初期状態では cloud が何なのかを理解していませんが、cloud の例としてこのデータのタイトルと本文の内容を与えて「これが cloud の例だ」という形で学習させます。

これだけですとまだ1データだけですが、実際には cloud カテゴリーに属している投稿データ(のタイトルと本文の内容)を全て「cloud の例」として与えます。すると Watson は与えられた全データから cloud というものによく出てくる単語や言い回しの傾向などを自分で見つけて、「cloud にはどういった特徴があるか」を学習します。

対象のワードプレスデータには他にも色々なカテゴリーのデータが存在していることを想定しています。そして全てのカテゴリーと、そのカテゴリーに属している全レコードを使って、それぞれのカテゴリー内容を学習させます。例えばデータベース内に6つのカテゴリーが設定されている場合は6つのカテゴリーを学習させることになります。

その学習を実行するにはプラグインページの「学習」ボタンをクリックします:
2016081301


このデータベース内の情報を使って学習データを更新する、という確認メッセージが表示されます。更新するとこれまでの学習データが存在している場合も一旦削除されて、新たに現在の全投稿データを使った学習が行われます。「OK」をクリックすると続行します:
2016081302


学習処理が成功すると「データは学習中です」というメッセージが表示されます。これでデータは学習状態になりました。この直後はまだ学習中で問い合わせができない状態になりますが、しばらくすると (2) の問い合わせが可能になります:
2016081303


この学習によって、ワードプレス内に用意された各カテゴリーのキーワードを、そのカテゴリーに紐付けられた投稿データ(のタイトルと本文の内容)を基に学習します。そして学習後の問い合わせでは、与えたテキストの内容が各カテゴリーのどの内容にどの程度近いのか、という分類結果を返してくれるようになります。


では (2) の学習データに対する問い合わせ処理を紹介します。管理画面の NLC 設定ページから Query と書かれたテキストフィールドに何かテキストを入力します。ここで入力する内容は上記で学習させたカテゴリーのいずれかに関する内容となるようにしてみてください。以下の例では「Bluemix は IBM の PaaS プラットフォームです」と入力しました。この内容を Watson に問い合わせてみます。「問い合わせ」ボタンをクリックしてください:
2016081301


先ほど実行した学習処理がまだ完了していない場合、"Training" と表示されます。この場合はもうしばらく(15分~1時間程度)お待ちいただいた上で再度実行してみてください:
2016081302


Watson の学習が完了していれば問い合わせに対する回答とその confidence (自信度)が表形式で以下のように表示されます(この例文に対しては "cloud" と返してほしかったけど、このワードプレス内のデータによると "web" なのだそうだ。まあ間違いではないけど・・・):
2016081401


問い合わせに使った「Bluemix は IBM の PaaS プラットフォームです」という文章には "Web" や "Cloud" という直接的なキーワードは含まれていません。にも関わらず、(学習させたデータを元に)この内容が "Web" や "Cloud" に関係している可能性が高い、と判断できたことになります。


以上がこのプラグインが実装している機能の紹介です。注意事項が2点あります:

このプラグイン内の実装では複数のワードプレスデータには対応していません。同じ Username と Password の組では1つの(最新の)学習データしか持てません。複数のデータを同時に学習させる場合は複数の NLC サービスインスタンスを作成し、それぞれ Username と Password を取得して学習させる必要があります(無料枠内ではなくなります)。

もう1点。この NLC プラグインが不要になった場合は管理画面の「インストール済みプラグイン」の一覧から "Watson NLC" プラグインを探して、停止してください(今後も不要であればプラグインを削除してください)。
2016081403


と、こんなことができるサンプルプラグインです。ワードプレス環境をお持ちで、投稿データにある程度のカテゴリー分類ができている方は是非その環境で試してみていただきたいです。


なお、このプラグインの中で実装している機能は全てここで紹介されている NLC API を使って実装しています。この API を使うと学習させたデータを使った別のカスタマイズを行ったり、(ワードプレス以外の)別のアプリケーションから呼び出したりすることも可能です。興味あるデベロッパーの方は参照して、併せてチャレンジしてみてください:
Natural Language Classifier - API


マルチスレッド&マルチコア&オンメモリで超ハイパフォーマンス NoSQL 型データベース、と言われている Aerospike をインストールしてみました:
2016081000


Aerospike は Docker や Vagrant のイメージが配布されていたり、AWS や GCE の仮想イメージが配布されていたりするので、これらを使うと「インストール」という作業を行わなくてもそのまま使えちゃいます(現にそのイメージを使う解説サイトも目立ちます)。が、今回はオンプレミスや普通の(?)仮想マシンでも使えるように、サーバーソフトの導入手順を紹介します。例によって CentOS 6.x が対象です。

まず Aerospike の動作には Python (2.6+)、Python ライブラリ、そして gcc が必要になります。これらの前提ライブラリをまとめてインストールしておきます:
# yum install gcc python python-devel

改めて、ここから Aerospike の環境を揃えていきます。今回は無料版であるコミュニティエディションのサーバーノード1つと、AMC(Aerospike Management Console 管理コンソール)1つを1台のマシンに導入する手順を紹介します。

まずサーバーノードを導入します。以下のサイトから対象の環境(今回は CentOS 6 なので、互換性のある RedHat 6)を選んで最新版をダウンロードします:
http://www.aerospike.com/download/server/

2016081003


2016/Aug/10 時点では最新バージョンは 3.9.0.3 でした。ダウンロードできるのは tgz ファイルなので、このアーカイブを展開し、インストーラー(asinstall)を実行してインストールします:
# cd /tmp
# tar xzvf ~/aerospike-server-community-3.9.0.3-el6.tgz
# cd aerospike-server-community-3.9.0.3-el6
# ./asinstall

インストールが成功したら以下のコマンドでサーバーとして起動し、またシステム再起動時に自動起動するよう設定しておきます:
# /etc/init.d/aerospike start
# chkconfig aerospike on

これでサーバーノードがこの環境にインストールできました。次にこのサーバーノードを管理するコンソール機能を導入します。

同様にして、以下のサイトから対象の環境を選んで AMC の最新版をダウンロードします。ちなみに AMC は RedHat 6(CentOS 6) 用のものしか用意されておらず、7.x のものは配布されていませんでした:

http://www.aerospike.com/download/amc/

2016081001


こちらの場合は rpm パッケージファイルがダウンロードできるので、RPM コマンドでそのまま導入します:
# rpm -ivh aerospike-amc-community-3.6.10.1-el6.x86_64.rpm

やはり同様に AMC を起動して、次回再起動時に自動起動するよう設定しておきます:
# /etc/init.d/amc start
# chkconfig amc on

これで導入作業は完了です。試しに一度管理コンソールを見てみましょう。ウェブブラウザを起動して、
 http://(導入先のマシン名):8081/
にアクセスしてみましょう:

2016081002


すると最初の1回は上記のような画面になり、AMC で管理するサーバーノードを指定するよう指示されます。今回は AMC と同じマシンにサーバーノードを導入しているので、同じアドレスか localhost を指定します。ポート番号は特に変更していない限り 3000 のままで大丈夫です:

成功すると AMC の管理画面が現れます:
2016081004


とりあえず1ノード環境ですがこれで動いちゃいました。Aerospike はノードを追加すればリニアにスケールするよう設計されているので、足りなくなったらサーバーノードを追加準備して、この AMC に追加すれば使えちゃいます。データの増減が大きいシステムに非常に向いていると言えます。




このページのトップヘ