Pages

ラベル sakura の投稿を表示しています。 すべての投稿を表示
ラベル sakura の投稿を表示しています。 すべての投稿を表示

2012年6月3日日曜日

Webな統計分析環境 RStudio とMongodb

さくらVPS に、NoSQLデータベース Mongodbをデータの取得・保存先に使い、統計分析を行う為の環境を用意した。
  • 統計解析ツール R
  • データベース Mongodb
  • Rとmongodbを連携させるためのRライブラリ rmongodb
  • R利用のためのユーザインターフェース R Studio
最終的に目指しているのは、データを自動で定期的にmongodbにため込み、RStudioで適宜分析する環境だ。
インターネットのデータ -- (Spidering Tool) -- mongodb -- rmongodb -- R -- R Studio

R & R Studioのインストール

既に拡張パッケージ EPEL(Extra Packages for Enterprise Linux)を利用して入れば、Rのインストールはyumを使うだめの簡単作業だ。
http://fedoraproject.org/wiki/EPEL
依存しているパッケージが20ぐらいあったような。
R Studioは、統計解析ソフトRのためのIDE(統合開発環境)だ。Rの為のEclipseやVisualStudioと言ったところか。サーバ版をインストールした。
http://rstudio.org/
# Rをインストールする
# EPELを使っていることが前提  
  $ sudo yum install R
# RStudioのrpmパッケージを取得し、インストール
  $ wget http://download2.rstudio.org/rstudio-server-0.96.228-x86_64.rpm
  $ sudo rpm -Uvh rstudio-server-0.96.228-x86_64.rpm 
インストールすると、サーバが起動し、起動スクリプトもセットされる。RStudioは、初期設定ポートが8787なので、8787ポートは開けてあげること。 http://yoursite.com:8787/ にアクセスするとログイン画面が表示されるはず。ユーザ情報は、Linuxユーザ情報をそのまま利用している。




rmongodb

Mongodbのインストールは、随分前にインストールしていたので、省略。yumでインストール出来たはず。コンパイルとか、随分とインストールに時間が掛かったような記憶がある。
rmongodbは、Rのライブラリで、Rに、mongodbへの接続機能を追加するものだ。R本体はデータの取得先に対する機能は充実しておらず、その当たりはライブラリで頑張ってくださいと言う姿勢らしい。
githubで公開しているrmongodbは、上手くコンパイル出来なかった。CRAN(the Comprehensive R Archive Network)から取得すると上手くらしい。
# mongodbとRを接続するためのライブラリ rmongodbをインストールする
# githubに配布されているものは、なぜかインストールに失敗するので、CRANから取得しインストール
 $ wget http://cran.r-project.org/src/contrib/rmongodb_1.0.3.tar.gz 
 $ sudo R CMD INSTALL rmongodb_1.0.3.tar.gz 

R Studioを実行してみる

まず、コマンドラインからrmongodbが動作するか確認してみた。
> R                 # コマンドラインからRを起動
(途中省略)
> library(rmongodb) # rmongodbをロードする
rmongodb package (mongo-r-driver) loaded
Use 'help("mongo")' to get started.

R Studioから、同じ事をやってみる。
  1. http://yoursite.com:8787/ にアクセス
  2. linuxユーザでログイン
  3. 右下のペインのPackages タブを選択
  4. rmongodb にチェックを入れる
すると、右のコンソールに上記のコマンドラインと同じメッセージが表示される。(当たり前だけど)
なかなか、使い勝手がよさそう。




Mongodbへのデータ登録と取得

サンプルソースをみて、Rからmongodbを利用する方法など確認してみた。
# insert
mongo <- mongo.create()                            # 接続
if (mongo.is.connected(mongo)) {                   # 接続確認
    buf <- mongo.bson.buffer.create()              # bson用の1レコードバッファをR内に用意
    mongo.bson.buffer.append(buf, "name", "baker") # レコードバッファに属性と値をセット
    mongo.bson.buffer.append(buf, "age", 50L)
    b <- mongo.bson.from.buffer(buf)               # レコードバッファをbson形式に変更
    mongo.insert(mongo, "test.people", b)          # db:test, collection:peopleに追加
}

# select
mongo <- mongo.create()
if (mongo.is.connected(mongo)) {
    buf <- mongo.bson.buffer.create()
    mongo.bson.buffer.append(buf, "age", 18L)
    query <- mongo.bson.from.buffer(buf)

    # Find the first 100 records
    #    in collection people of database test where age == 18
    # queryの内容は、{age:18L}
    # レコードコレクションに対するカーソルが提供される
    cursor <- mongo.find(mongo, "test.people", query, limit=100L)
    # Step though the matching records and display them
    # nextメソッドで、カーソルを順に動かしていく
    while (mongo.cursor.next(cursor))
        print(mongo.cursor.value(cursor))
    mongo.cursor.destroy(cursor)                  # カーソルの開放
    # 現在、100件も入っていないので表示されませんが :-p
}
実際にMongodbにデータが格納されていることを、mongodbのクライアントソフトmongoで確認してみる。
# mongo (クライアントソフトから実行結果を確認してみる)
> show dbs     # データベース一覧をみる
admin
error_logger
local
test
> use test     # データベース test に移動
switched to db test
> show collections   # 現在のデータベース内のコレクションをみる
foo
people
system.indexes
users
> db.people.find()   # test.people を全件検索してみる
{ "_id" : ObjectId("4fcb042f3eee4d39039e1b87"), "name" : "baker", "age" : 50 }
> 

2011年10月10日月曜日

Ruby1.8.7とRuby1.9.2のWebApplicationをApacheで動かす

私のサクラVPSでは、いくつかのRailsアプリケーションが動いているが、それはRuby1.8.7ベースだ。
WebサーバにはApache(+ passenger module)を使い、VirtualHostで複数のWebアプリケーションを切り分けている。
さて、以前 開発用ユーザで Ruby1.9.2を試すためにrvmを導入した。
http://tech-baker.blogspot.com/2011/09/rvm-ruby-192-rails3.html
Apacheの実行環境では、デフォルトのruby1.8.7が動作してしまう。かといって、rvmをapache環境に導入したら、ruby1.8.7ベースのアプリケーションが動かない。ruby1.8.7もruby1.9.2もapache環境で動かしたい。以下のPassengerサイトを参考にチャレンジした。
http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/

目指した環境は以下の図の通り。Apacheは、リバースプロキシとして利用され、ruby1.9.2のアプリケーションは、Passengerスタンドアローンで動かす。

図:Reverse Proxyを利用した複数Versionのruby Web app
Apache + passenger ----- app1.sample.com (ruby 1.8.7 + rails2.8.x)
Apache + passenger ----- app2.sample.com (ruby 1.8.7 + rails2.8.x)
Apache + mod_proxy ----- passenger ----- app3.sample.com ( ruby 1.9.2 + rails3 by rvm)


rails3アプリケーションは、開発ユーザdevmanのディレクトリ /home/devman/public_html/app3 に作成した。
rvm環境が出来ていることを前提で、作業は以下の手順
  1. passenger(スタンドアローン)のインストール
  2. apacheのプロキシー設定
  3. 起動スクリプト作成
  4. (必要であれば)iptablesをいじる

passengerのインストールはgemから行う。開発ユーザ環境も示しておいた。
devman$ rvm info
ruby-1.9.2-p290:

  system:
    uname:       "Linux www.miyabiit.com 2.6.18-274.3.1.el5 #1 SMP Tue Sep 6 20:13:52 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux"
    bash:        "/bin/bash => GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)"
    zsh:         " => not installed"

  rvm:
    version:      "rvm 1.8.3 by Wayne E. Seguin (wayneeseguin@gmail.com) [https://rvm.beginrescueend.com/]"

  ruby:
    interpreter:  "ruby"
    version:      "1.9.2p290"
    date:         "2011-07-09"
    platform:     "x86_64-linux"
    patchlevel:   "2011-07-09 revision 32553"
    full_version: "ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]"

  homes:
    gem:          "/home/devman/.rvm/gems/ruby-1.9.2-p290"
    ruby:         "/home/devman/.rvm/rubies/ruby-1.9.2-p290"

  binaries:
    ruby:         "/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin/ruby"
    irb:          "/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin/irb"
    gem:          "/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin/gem"
    rake:         "/home/devman/.rvm/gems/ruby-1.9.2-p290/bin/rake"

  environment:
    PATH:         "/home/devman/.rvm/gems/ruby-1.9.2-p290/bin:/home/devman/.rvm/gems/ruby-1.9.2-p290@global/bin:/home/devman/.rvm/rubies/ruby-1.9.2-p290/bin:/home/devman/.rvm/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/lib/jvm/java/bin:/usr/local/ant/bin:/home/devman/bin"
    GEM_HOME:     "/home/devman/.rvm/gems/ruby-1.9.2-p290"
    GEM_PATH:     "/home/devman/.rvm/gems/ruby-1.9.2-p290:/home/devman/.rvm/gems/ruby-1.9.2-p290@global"
    MY_RUBY_HOME: "/home/devman/.rvm/rubies/ruby-1.9.2-p290"
    IRBRC:        "/home/devman/.rvm/rubies/ruby-1.9.2-p290/.irbrc"
    RUBYOPT:      ""
    gemset:       ""

devman$ gem install passenger --pre  # rvm 環境下なので userディレクトリにインストール

あれ、nginxもインストールされるのか。nginx(エンジンエックス、高速軽量で人気のWebサーバ)がスタンドアローンのwebサーバの役割を果たし、結局passenger本体はあくまでモジュールなのね。

ApacheにVirtualhostの設定を、reverse proxy仕様で追加する。
<VirtualHost *:80>
  ServerName app3.sample.com
  DocumentRoot /home/devman/public_html/words/public
  PassengerEnabled off
  ProxyPass / http://127.0.0.1:3000/
  ProxyPassReverse / http://127.0.0.1:3000/

</p>

起動スクリプトは、私は /etc/rc.d/app3をつくり、/etc/rc.localに追加した。これで良かったのかな。停止とかはKillしよう。chmod +x /etc/rc.d/app3を忘れないこと。

起動スクリプト:/etc/rc.d/app3
#!/bin/sh
su - devman -c 'cd public_html/app3;passenger start -a 127.0.0.1 -e development -p 3000 -d'
開発環境で実行している。
これで、Apacheを再起動し、rails3のアプリケーションを起動すればよい。
devman$ sudo /etc/init.d/httpd restart
devman$ cd public_html/app3
devman$ passenger start -a 127.0.0.1 -e development -p 3000 -d

リバースプロキシーは、高速化、キャッシュ・サーバ、負荷分散など応用が広いが、こういった使い方も出来るのですね。

2011年5月11日水曜日

さくらVPSにscalaをいれた

scalaをさくらインターネット VPSにインストールしてみた。

$ su -
$ cd /usr/local/src/
$ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.8.1.final.tgz
$ tar xzf scala-2.8.1.final.tgz
$ mv scala-2.8.1.final ../scala
$ exit
$ vim .bashrc

.bashrcにパスを書き込んでおくことにした。

export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin

手動でscala用のパスを通して、動作を確認。

[baker@www ~]$ scala
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_23).
Type in expressions to have them evaluated.
Type :help for more information.

scala> printf("hello world!");
hello world!

全ユーザで利用できるようにしたほうがよいかな。

2011年5月8日日曜日

さくら(VPS)大戦 Redmine 編

さくらインターネットVPSのサーバに、ruby on rails製プロジェクト管理ソフトウエア Redmine をインストールした。過去サーバを設定した時の資料を見なかったこともあり、結構苦戦。

以下、失敗したところを記載しておく。実際の手順や詳細などは、以下のサイトを参考。
Mysql 5.5の評価など
version 5.5へのアップグレード
mysql_upgradeコマンド
さくらサーバへのインストールもろもろ
全般の工程(この方のサイト・デザインは美しい)
全般の工程 (たぶん、一番詳しい)

redmine用のデータベースを作成後
  $ wget http://rubyforge.org/frs/download.php/74722/redmine-1.1.3.tar.gz
  $ tar xzvf redmine-1.1.3.tar.gz 
  $ mv redmine-1.1.3 /var/www/html/redmine
  $ cd /var/www/html/config/
  $ cp database.yml.example database.yml
  $ vim database.yml
  $ rake generate_session_store
  $ rake db:migrate RAILS_ENV=production # 失敗
redmineの1.1.3は、rails 2.3.5で動作している。
  $ vim environment.rb 
  $ gem install rails -v=2.3.5
  $ rake db:migrate RAILS_ENV=production # 失敗
railsのmysqlドライバーは、2.2以降標準ではインストールされない。mysqlの接続に失敗。
  $ yum install mysql-devel
失敗。remi リポジトリからインストールしていた特別なVersionのMysqlだった。
  $ mysql --version
  $ yum install mysql-devel --enablerepo=remi
失敗。i386用のmysqlやmysql-develもアップグレードしようとしている。
さくらのVPSのCentOSは64bit。i386ではなくx86_64のみを指定。
  $ yum install mysql-devel.x86_64 --enablerepo=remi
結果、mysql 5.1 -> 5.5 に変更された。
mysqlドライバーをインストール。
  $ gem install mysql
  $ cd /var/www/html/redmine
  $ rake db:migrate RAILS_ENV=production
失敗。mysqldが起動していない。
  $ /etc/init.d/mysqld start
失敗する。ログをみると、
[ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'
とりあえず、/etc/my.cnfの[mysqld]の default-character-set=utf8 をコメントアウト
  $ /etc/init.d/mysqld start
  $ vim /var/log/mysqld.log
起動に成功したが、エラーが一杯でている。mysql_upgradeをやる。
  $ mysql_upgrade -p
  $ /etc/init.d/mysqld restart
logでは問題ないようだ。
mysql5.5では、文字列指定のオプションが変更されている。
サーバー側 --character-set-server
クライアント側 --default-character-set (今まで通り)
よって、/etc/my.cnf [mysqld] 内の指定を charset-set-server=utf8 と書き換える。
Redmineのスキーマ作成、初期データ作成(途中で、jaと指定)
  $ vim /etc/my.cnf
  $ /etc/init.d/mysqld restart
  $ rake db:migrate RAILS_ENV=production
  $ rake redmine:load_default_data RAILS_ENV=production
メールも設定
  $ cp config/email.yml.example config/email.yml
  $ vim config/email.yml
さくらのドメインサービスにて、redmine.xxxxをバーチャルホストとして指定
passenger用にヴァーチャルホスト設定を追加
  $ vim /etc/httpd/conf.d/vhost.conf 
  $ /etc/init.d/httpd restart

結局、過去の更新、設定記録を見なかった事が敗因。PHP5.3 をインストールするために、CentOSのデフォルトmysqlのVersino 5.0.x ではなく、5.1.x を入れた時の記録。これがあれば、随分と工数削減できたかも。