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

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

2014/06

CentOS に Java アプリケーションサーバーである Apache Tomcat を導入します。
2014062601



手順としては、まず Java(JDK) をインストールし、その後で Tomcat を導入します。


Java(JDK) のインストール

Oracle Java でも Open Java でもいいのですが、ここでは簡単な後者の手順を紹介します。Java 7 であればこのコマンドで JDK が導入できます:
# yum install java-1.7.0-openjdk-devel

あるいは Java 実行環境だけでもよければこちら:
# yum install java-1.7.0-openjdk

これだけ。


Apache Tomcat のインストール

Apache Tomcat も yum で導入できます。インストールと、起動と、自動起動設定までを行っています:
# yum install tomcat6 tomcat6-webapps tomcat6-admin-webapps
# /etc/init.d/tomcat6 start
# chkconfig tomcat6 on

ちなみにこの方法で導入すると Apache Tomcat 6 が /var/lib/tomcat6/ 以下にインストールされます。

起動後(/etc/init.d/tomcat6 start 実行後)にブラウザで http://(サーバーアドレス):8080/ にアクセスすると Tomcat のデフォルトトップ画面が表示され、正しく導入・動作できていることが確認できます:
2014062701



Apache Tomcat の設定

設定ファイルを書き換えて管理用画面にもアクセスできるようにします:
# vi /etc/tomcat6/tomcat-users.xml

(以下を </tomcat-users> の直前に追加)
  <role rolename="manager"/>
  <user name="admin" password="(管理者用パスワード)" roles="manager"/> 

そして Tomcat サーバーを再起動します:
# /etc/init.d/tomcat6 restart

これで管理用画面のURL である http://(サーバーアドレス):8080/manager/html にもアクセスできるようになりました。ログイン時の ID とパスワードは上記 tomcat-users.xml で指定したものです:
2014062702




(おまけ)Apache Tomcat を 80 番ポートで起動する

まず設定ファイルを書き換えます。server.xml に proxyPort の部分を追加します:
# vi /etc/tomcat6/server.xml

    :
  <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443"
        proxyPort="80" />
:

そして iptable で 80 番ポートへのリクエストを 8080 番に転送し、この設定ルールを iptables に保存します:
# iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# /sbin/service iptables save



これで Tomcat を再起動すると、Tomcat に 8080 番ポートではなく、 80 番ポートでアクセスできるようになります。
 

リアルタイム価格比較サイト「ねっぴ」の使い方を紹介します:
http://neppi.co/


「ねっぴ」とは?

ネットで購入できる様々な商品の価格をリアムタイムに比較するサービスです。PCのブラウザでも見れますが、画面はスマートフォン向けに最適化されています。
2014062501


こう書くと「カカクコムみたいな感じ?」と思われる人もいると思います。理解として間違ってはいませんが、「ねっぴ」ではカカクコムも比較対象です(カカクコムよりも安く買える所はけっこう見つかります)。

現在、「ねっぴ」は以下の9サイトを対象に検索・比較します。楽天やアマゾンのようにサイト内の複数ショップで同じ商品を扱っている場合は、その中の最安値を対象に比較します:
楽天
アマゾン
Yahoo!ショッピング
カカクコム
ケンコーコム
ヤマダウェブコム(ヤマダ電気)
セブンネットショッピング
ブックオフオンライン
グーグルショッピング


「ねっぴ」の使い方

グーグルで『(商品名、あるいは検索ワード) neppi』と、検索ワードの後にスペースに続けて "neppi" と付けて検索するか、
2014062502


或いは「ねっぴ」のトップページから右上の虫眼鏡アイコンをクリックして検索フィールドに検索文字を入れて検索します。
2014062503


「ねっぴ」の検索結果は一覧として表示されます:
2014062504


または「ねっぴ」のトップページから商品カテゴリを辿って絞り込みながら商品を選ぶこともできます。
2014062505


画面上部には選択カテゴリ内(カテゴリ選択前は全カテゴリ内)での人気商品をスライドさせながら確認することも可能です。
2014062506


1つの商品を選択すると、上記9サイトでその商品を扱っているかどうかを調べ、扱いがあった場合はその値段情報も含めて取り出し、画面に表示します。この商品の場合はヤフーで購入した場合が一番安く買えそうです(リアルタイム検索なので、常に同じ結果になるとは限りません):
2014062507


この画面のサービス名(「ヤフー」や「楽天」)部分をクリックすると、実際にそのサイトで購入するページにジャンプします。現実問題としては送料の差があったり、プレミアム会員の有無、付与ポイントの差などがあるため、必ずしも「一番安い=一番得」とは限りませんが、参考にはなると思います。

この画面の価格の右にある ">>" 部分をクリックすると、本当にそのサイトでその価格で売られているのか、を確認できる画面がポップアップで表示されます。ポップアップ後に ESC キーを押すか、画面内のポップアップ外の部分をタップするとポップアップが消えます:
2014062508


なお、「ねっぴ」内の検索で見つからない(「ねっぴ」内データベースにない)商品でも、その商品の JAN コードと呼ばれるバーコード番号が分かれば、その番号を使って、
 http://neppi.co/item.jsp?code=(JANコード)
のように直接URLにアクセスすれば「ねっぴ」内データベースにない商品のリアルタイム価格比較情報をその場で表示することもできます。


欲しいものの評判などはネットの情報などを使って調べていただいた上で、最後に「ねっぴ」を使って、一番お得に買えるサイトを調べて購入するとお得です!


プライバシーポリシー(個人情報保護方針)

個人情報の管理
当サービスは、お客さまの個人情報を正確かつ最新の状態に保ち、個人情報への不正アクセス・紛失・破損・改ざん・漏洩などを防止するため、セキュリティシステムの維持・管理体制の整備・社員教育の徹底等の必要な措置を講じ、安全対策を実施し個人情報の厳重な管理を行ないます。
 
個人情報の利用目的
お客さまからお預かりした個人情報は、当サービスからのご連絡や業務のご案内やご質問に対する回答として、電子メールや資料のご送付に利用いたします。
 
個人情報の第三者への開示・提供の禁止
当サービスは、お客さまよりお預かりした個人情報を適切に管理し、次のいずれかに該当する場合を除き、個人情報を第三者に開示いたしません。
 
お客さまの同意がある場合
お客さまが希望されるサービスを行なうために当サービスが業務を委託する業者に対して開示する場合
法令に基づき開示することが必要である場合
 
個人情報の安全対策
当サービスは、個人情報の正確性及び安全性確保のために、セキュリティに万全の対策を講じています。
 
法令、規範の遵守と見直し
当サービスは、保有する個人情報に関して適用される日本の法令、その他規範を遵守するとともに、本ポリシーの内容を適宜見直し、その改善に努めます。


git を使っていて、ローカルで作業していたら何やらおかしくなった、、、あるあるですよね。


こんな時は以下のコマンドで、リモートサーバーの最新ファイル内容に上書きする(戻す)ことができます:
# git fetch origin
# git reset --hard origin/master

あと、これは自分がたまに使うのでおまけ。リモートリポジトリの確認方法と変更方法:
(リモートリポジトリの確認方法)
# cat .git/config
  :
  :
[remote "origin"]
  url = https://xxx.xxx.xxx/git/abc.git
  :
  :

(リモートリポジトリの変更方法)
# git remote set-url origin https://yyy.yyy.yyy/git/xyz.git

 

CouchBase サーバーは高速なドキュメント指向(JSON)データベースです。高速・大容量のデータを得意とする一方、SQL 型と異なり、SQL select による(like 節による)全文検索は苦手です。

ただ CouchBase は Apache Lucene をベースとするオープンソースでスケーラブルな全文検索&解析エンジン ElasticSearch と連携することで、この苦手部分を補っています。単なる SQL select よりも強力な検索エンジンと組み合わせることで CouchBase サーバーは更に強力なデータベースとなります。


この CouchBase サーバー環境に ElasticSearch を導入して連携させるところまでの手順を紹介します。なお CouchBase サーバー自体の導入はこちらを参照してください。CouchBase サーバーの導入まではできているという前提で、また今回は CouchBase サーバーと同じサーバー内に ElasticSearch サーバーを導入して環境構築するという前提で以下を記述します。また以下の内容についてはこの記事を記載している 2014/06/11 時点の最新環境である CouchBase 2.5.1 / ElasticSearch 1.2.1 / Couchbase Plug-in for Elasticsearch 1.3.0 の各バージョンにて確認しています。


まず ElasticSearch の動作に必要な Java 環境(Java 6以上)を用意します。Oracle Java を導入しても構いませんが、Open Java であれば以下のコマンドで導入可能です(Java 7 の場合):
# yum install java-1.7.0-openjdk

次に検索エンジンである ElasticSearch 本体を導入します。公式サイトから最新版(2014/06/11時点では 1.2.1)のインストールモジュールをダウンロードします。インストールモジュールにはいくつかの種類はありますが、今回は rpm パッケージ版(elasticsearch-1.2.1.noarch.rpm)をダウンロードします。

ダウンロードできたら rpm コマンドでインストールして起動、および自動起動設定までを行います。ちなみにこの rpm 版をインストールした場合、ElasticSearch 本体は /usr/share/elasticsearch/ 以下に導入されます :
# rpm -ivh elasticsearch-1.2.1.noarch.rpm
# /etc/init.d/elasticsearch start
# chkconfig elasticsearch on 

これで検索エンジンの ElasticSearch 本体がインストールされました。が、実際の利用時には CouchBase サーバーのデータを ElasticSearch に複製した上で検索インデックスを作成して、CouchBase サーバーの中に入っているデータに対する検索エンジンとして使いたいのです。 というわけで、これら2つを接続するためのプラグイン(と、ElasticSearch の設定をウェブから行うためのインターフェースアプリケーション)を最後に導入します。
# cd /usr/share/elasticsearch
# bin/plugin -install transport-couchbase -url http://packages.couchbase.com.s3.amazonaws.com/releases/elastic-search-adapter/1.3.0/elasticsearch-transport-couchbase-1.3.0.zip
# echo "couchbase.password: password" >> /etc/elasticsearch/elasticsearch.yml
# echo "couchbase.username: Administrator" >> /etc/elasticsearch/elasticsearch.yml

(以下引き続き ElasticSearch Head(ウェブインターフェース)の導入) # /etc/init.d/elasticsearch stop # bin/plugin -install mobz/elasticsearch-head # /etc/init.d/elasticsearch start

Elastic Head の導入と、ElasticSearch の再起動までができたらウェブブラウザで
 http://(サーバーのIPアドレス):9200/_plugin/head/
にアクセスして、ウェブインターフェースが表示されることを確認してください:
2014061101


接続用プラグインが導入できたので、次はインデックステンプレートを導入します。今回はデフォルトのインデックステンプレートを使って、インストール時に追加した beer-sample サンプルバケットを対象に設定してみます。また ElasticSearch の導入されたホストから実行する前提で記載しているので localhost を使っていますが、ElasticSearch がリモート環境にある場合は localhost 部分を該当ホストの IP アドレスに変えて実行してください:
# cd /usr/share/elasticsearch
# curl -XPUT http://localhost:9200/_template/couchbase -d @plugins/transport-couchbase/couchbase_template.json
 →{ "acknowledged":true } が返ってくることを確認
# curl -XPUT http://localhost:9200/beer-sample
 →{ "ok":true, "acknowledged":true } が返ってくることを確認
# echo "couchbase.maxConcurrentRequests: 1024" >> /etc/elasticsearch/elasticsearch.yml
# /etc/init.d/elasticsearch restart
# curl -X POST -u Administrator:password http://localhost:8091/internalSettings -d xdcrMaxConcurrentReps=8

最後に XDCR の設定をしてデータの複製処理を定義します。
Couchbase ウェブコンソール(http://***:8091) にログインしてします:
2014061102


XDCR タブを開いて、 "Create Cluster Reference" をクリックします:
2014061103


以下を入力して "Save" します:
 Cluster Name: "ElasticSearch"
 IP: (IPアドレス):9091
 Username: Administrator
 Password: (パスワード)
2014061301



Cluster Reference が作成されたことを確認します:
2014061105


続いて "Create Replication" をクリックし、以下を入力して "Replicate" をクリックします:
 From -> Bucket: beer-sample
 To -> Cluster: ElasticSearch
 To -> Bucket: beer-sample
 Advanced -> XCDR Protocol: Version 1
2014061106

 
これで Replication が定義できました:
2014061107
 
 
この状態で改めて Elastic Search のウェブインターフェースにアクセスするとデータの複製が確認できます:
2014061108



では最後にこの環境で CouchBase サーバーに格納したデータが全文検索できることを確認してみましょう。

まずは CouchBase にいくつかのデータを格納してみます。CouchBase ウェブコンソールにログインし、Data Buckets タブを開き、上記で複製の設定を行った beer-sample バケットの右にある Documents ボタンをクリックします:
2014061302


beer-sample バケット内のデータ一覧が表示されます。が、最初の段階ではデータが入ってないので何も表示されません。ここに Document(レコード)を追加してみましょう。Create Document ボタンをクリックします:
2014061303


作成する Document の ID (ハッシュキー)を適当に指定します。ここでは doc001 と入力しています。Create ボタンで作成します:
2014061304


デフォルトの内容で Document が1つ作成されました。Document が JSON フォーマットになっていることが分かります。この画面はエディタなので、ここから Document の中身を変更することも可能です:
2014061305


こんな感じの日本語のデータに書き換えてみました:
{
 "title": "ワールドカップ",
 "body": "がんばれ、日本代表!"
}


Save で保存できます:
2014061306


Documents の一覧に戻ると作成したデータが登録されていることが確認できます。以降この手順を繰り返して Document をいくつか作成しておきます:
2014061307


検索用にいくつかのデータを適当に登録してみます。JSONフォーマットなので "title" や "body" といったフィールド名も自由に追加・変更して格納できます:
2014061308


先程複製の設定を済ませているので、ここで CouchBase サーバーに登録したデータは ElasticSearch に複製されており、全文検索ができるようになっているはずです。ではその様子を確認してみます。

今度は Elastic Head にアクセスしてみて、Browser タブを選択します。この時点では何の絞り込みもしていないので、管理用データも含めて全てのレコードが右側のペインに表示されています:
2014061309


試しに、上記の2番目に登録した、id = doc002 のデータを検索してみます。左側のペインで title と書かれた箇所をクリックして展開し、そのテキストフィールドに "タイトル" と入力すると、右側のペインに id 列が doc002 のデータが見つかるはずです。CouchBase サーバー内のデータが日本語で全文検索できるようになったことが確認できました
2014061310


検索されたレコードをダブルクリックするとこんな画面が表示されます。直接 CouchBase の中身が表示されるわけではなく、ElasticSearch 側に格納されたレコードの情報が表示されるので、実際に検索した文字列が表示されるわけではありません。その代わり「title フィールドに "タイトル" という文字が含まれているレコードの id は doc002」ということが分かりました。実際のアプリケーションではこの結果を元に再度 CouchBase サーバーに id 指定で問い合わせをして、このデータレコードの情報を取得・更新・削除する、という処理フローになります:
2014061311



高速・大規模利用を想定した CouchBase で、ネックだった全文検索(それも日本語の)もこの方法でカバーできるようになりそうです。自分もまだ詳しく理解できているわけではなくて、これから調べることも多そうだけど、これはなかなかヒットの予感。。



 

CouchBase は大規模データ処理を得意とする No-SQL なデータベースです。ベースとなった CouchDB と memcached の機能を合わせ持っていることで高速トランザクションに耐え、またウェブアプリケーションサーバーを内蔵していることで管理機能だけでなく、ウェブアプリケーションの開発もすぐに開始できる、という特徴があります。加えて REST ベースのデータ読み書き API が標準で用意されている(というか、データの読み書きには REST を使う)ので、特定言語やプラットフォームに依存しない多くの環境から利用することができる、という特徴もあります。


この CouchBase を CentOS 環境にインストールします。なお CentOS は 64bit 版の 6.5 を、CouchBase のバージョンはこのエントリ執筆現在の最新版 2.5.1 を使う前提で以下を紹介します。今回は Enterprise Edition を利用しますが、この Enterprise Edition は無償でダウンロードでき、非商用利用であればノード数無制限に、商用利用でも2ノードまでは無償で利用できます。


まずは導入用のモジュールを入手します。公式サイトから環境にあったモジュールを選択してダウンロードします。今回のケースでは 64bit Red Hat 6 の Enterprise Edition を選択します。
2014060601


処理を進めていくと、最終的にダウンロードURLの書かれたメールを受け取ることになります。記載された URL からインストールモジュールをダウンロード&インストールします:
# cd /tmp
# wget http://packages.couchbase.com/releases/2.5.1/couchbase-server-enterprise_2.5.1_x86_64.rpm
# rpm -ivh couchbase-server-enterprise_2.5.1_x86_64.rpm

これだけでインストールは完了です。ついでに CouchBase サーバーの起動も完了しています。秒殺。


では Web ベースの管理コンソールにアクセスして、初期設定まで行ってしまいましょう。ブラウザで
 http://(サーバーのIPアドレス):8091/
にアクセスします(クラウドなどでファイアウォールの設定が必要な場合は 8091 番ポートを開放しておきます)。

以下の様なセットアップ用の初期画面が表示されます。"SETUP" ボタンをクリックしてセットアップを開始します:
2014060602

最初の画面ではデータの保存ディレクトリとクラスタリングの設定を行います。保存ディレクトリは特に希望がなければデフォルトのままでも大丈夫です。次にこのサーバーのホスト目(またはIPアドレス)を入力します。クラスタ設定ではまずは1台目のサーバーになるので "Start a new cluster" を選択します。この画面の最後にこのクラスタで使用するメモリ量の指定を行いますが、とりあえずは変更せずにそのまま進めても構いません。
2014060603


次の画面ではサンプルバケットを利用するかどうかの設定を行います。CouchBase では実際のデータの入れ先のことを(データ)バケットと呼びます。そのバケットのサンプルを一緒に導入するかどうかの設定です。これがあるとすぐに動くものを確認できるようになりますが、実運用上では不要なものです。必要であればチェックを付けて次の画面に向かいます:
2014060604


次にデフォルトバケットの設定を行います。まず Backet Settings ではバケットの種類を選択します。ここではディスク永続性はないものの RAM メモリ上だけで高速に動作する memcached を選択することも可能です。一方 CouchBase は memcached の特徴に加えて、非同期/同期にディスクへの永続化を行うことも可能なデータベースになっています。 ここでは CouchBase を選ぶことにします。
Memory Size は前の画面で設定した割り当てメモリのうちの、このデフォルトバケットに割り振るメモリ量を指定します。バケットが1つだけであれば全てのメモリを割り振って構いませんし、よく分からなければ初期状態を変更せずにそのまま進めても構いません。
最後の Replication はデータの冗長性を指定する項目です。1 は「冗長数が1」、つまり2台のサーバーでデータを保持することを意味します。1台のサーバーが障害で止まっても、フェールオーバーによってデータは保たれることになります。この数が多いほど信頼性も上がりますが、それだけ多くのサーバーやリソースが必要になります。ここでは 1 を指定することにして次の項目に進みます:
2014060605


次は製品のアップデートと登録の画面です。Update Notifications にチェックを入れておくと製品がアップデートされた時に通知を受け取ることができます。また Register をしておくと最新情報が届くことに加え、緑の少ない地域に苗木を一本寄付することになるようです(お金を支払うわけではありません)。是非 Register しましょう:
2014060606


設定の最終画面です。管理者の ID(初期状態は Administrator)とパスワードを入力します。これで初期設定は完了です:
2014060607


このような管理画面が出てくれば初期設定も完了です。初期設定まで含めて考えると、CouchBase の導入手順はものすごく簡単な印象です:
2014060608



最後に、この稼働中の CouchBase サーバーに API からアクセスしてみます。今回は curl コマンドを使って、こんな感じでサーバープール情報を取得します(実際には改行なしのデータが返ってきます):
# curl 'http://(CouchBase サーバーのIPアドレス):8091/pools'
{ "pools":[ {"name":"default","uri":"/pools/default?uuid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","streamingUri":"/poolsStreaming/default?uuid="} ], "isAdminCreds":false, "isROAdminCreds":false, "isEnterprise":true, "settings":{ "maxParallelIndexers":"/settings/maxParallelIndexers?uuid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "viewUpdateDaemon":"/settings/viewUpdateDaemon?uuid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }, "uuid":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "implementationVersion":"2.5.1-1083-rel-enterprise", "componentsVersion":{ "public_key":"0.13", "asn1":"1.6.18", "lhttpc":"1.3.0", "ale":"8ca6d2a", "os_mon":"2.2.7", "couch_set_view":"1.2.0a-a425d97-git", "compiler":"4.7.5", "inets":"5.7.1", "couch":"1.2.0a-a425d97-git", "mapreduce":"1.0.0", "couch_index_merger":"1.2.0a-a425d97-git", "kernel":"2.14.5", "crypto":"2.0.4", "ssl":"4.1.6", "sasl":"2.1.10", "couch_view_parser":"1.0.0", "ns_server":"2.5.1-1083-rel-enterprise", "mochiweb":"2.4.2", "syntax_tools":"1.6.7.1", "xmerl":"1.2.10", "oauth":"7d85d3ef", "stdlib":"1.17.5" } }

これも簡単ですよね。

なお、couchBase 2.5.x の REST API 詳細についてはドキュメントを参照してください。



このページのトップヘ