2011年10月24日月曜日

rexsterを使ってみよう!


rexsterを使うことで、OrientDBやNeo4jのデータをRESTで取得することができます。
今回はOrientDBのデータを取得してみることにしました。

導入方法は、下記参照。
http://code.google.com/p/orient/wiki/Rexster

モジュールのダウンロードと解凍
$ wget https://github.com/downloads/tinkerpop/rexster/rexster-0.6.zip
$ unzip rexster-0.6.zip

OrientDBのバージョンが1.0rc5でない場合は、これもダウンロードして解凍しておく
$ wget http://orient.googlecode.com/files/orientdb-graphed-1.0rc5.zip
$ $ unzip orientdb-graphed-1.0rc5.zip -d orientdb_rc5

OrientDBからRexsterへ下記2つのjarをコピ-する。

  • orientdb-client-1.0rc5.jar
  • orientdb-enterprise-1.0rc5.jar

これをやるのというのは、上記のOrientDBのWikiサイトにしか書かれていないので、
Rexsterのほうを見てるとおそらくハマります。(ハマりました…)
cp orientdb_rc5/lib/orientdb-client-1.0rc5.jar  ~/rexster-0.6/target/rexster-0.6-standalone/lib/
cp orientdb_rc5/lib/orientdb-enterprise-1.0rc5.jar  ~/rexster-0.6/target/rexster-0.6-standalone/lib/
なんでこんな事をするのかは下記をご覧ください。
http://groups.google.com/group/orient-database/browse_thread/thread/f0d4ed39366396b7/02afb7c9017d9ade?#02afb7c9017d9ade


定義ファイルの編集
$ vi /home/tiffany/rexster-0.6/target/rexster-0.6-standalone/bin/rexster.xml 
1) 接続するOrientDB部の編集
   localでは上手く行かず…。
<graph>
  <graph-enabled>true</graph-enabled>
  <graph-name>orientdbsample</graph-name>
  <graph-type>orientgraph</graph-type>
  <graph-file>remote:10.3.216.204/demo</graph-file>
  <properties>
    <username>admin</username>
    <password>admin</password>
  </properties>
</graph>
2) localhost以外でつなげるなら、適宜変更。
<base-uri>http://IP</base-uri>
起動スクリプトの修正
rc5とrc6ではスクリプトが違うみたいですね。

読み込ませるrexster.xmlを-configureで指定する必要があります。
$DIR/target/rexster-*-standalone/bin/rexster.sh $@ -webroot $DIR/target/rexster-*-standalone/bin/public -configuration /home/tiffany/rexster-0.6/target/rexster-0.6-standalone/bin/rexster.xml 
起動
$ ./rexster.sh -s
その他のコマンドは下記のとおりです。
usage: rexster
 -h,--help                  print this message
 -s,--start <parameters>    start rexster (learn more with start -h)
 -u,--status <parameters>   status of rexster (learn more with status -h)
 -v,--version               print the version of rexster server
 -x,--stop <parameters>     stop rexster (learn more with stop -h)

Rexster起動中は下記ページにあるAPIが実行可能です。
https://github.com/tinkerpop/rexster/wiki/Basic-REST-API

2011年10月20日木曜日

OrientDB: record

レコードを見るにはいくつかの方法があります。
1clusterに1classのみ紐付いてる場合は、下記4つとも同じ結果が返ります。
> browse class OUser
> select * from OUser
> browse cluster OUser
> select * from cluster:OUser
実際にレコードを作ってみましょう。


レコードの作成
classを作って、レコードを入れて、入れたレコードを見てみるには、こんな感じになります。
> create class Person
> insert into Person(id, name) values (1, 'Andy')
> browse class Person

カラムの追加
例えば、電話番号を追加したいときは下記のように電話番号のカラムphoneを入れてあげるだけです。
> insert into Person(id, name, phone) values (2, 'Betty', '03-2222-2222')
> insert into Person(id, name, phone) values (3, 'Charlie', '03-3333-3333')   
この時点で、カラム名が表示されないのはバグ??

レコードの削除
> delete from Person where id = 1  
レコードを削除してみたら、カラム名が表示されました。
なお、RIDを条件にして削除する場合は、ridではなく、@ridになります。
> delete from Person where @rid = #11:0


さらに追加する場合は、空いたRIDに順に追加されますね。
> insert into Person(id, name, phone) values (4, 'Denny', '03-5555-5555')  


OrientDB: class と cluster

classとclusterはお互い関係しあってます。

class一覧の表示
>classes
classの作成
> create class [クラス名]
Class created successfully with id=3

class名の変更
> alter class [変更前] NAME [変更後]

NAMEだけでなく、[NAME, SHORTNAME, SUPERCLASS, OVERSIZE]の変更もできるらしいですが、他3つが何なのか分からないので、いつか分かった頃に…。
classの名前を変えると、clusterの名前も変更されます(再接続時に確認可能)。

cluster一覧の表示
>clusters
clusterの作成
> create cluster [クラスター名] physical append
physical の他にも、logicalで生成もできます。

以下、なんとなく分かったこと。
  • classは必ず何かのclusterに所属しています。
  • 1cluster に、複数のclassを所属させることができます。
  • classを作ると自動的に同じ名前のclusterが作成され、紐付けられますが、clusterを作成してもclassはできません。
    • class作成後に、一旦disconnectして、再度接続するとclusterにもできていることが確認できます。(原因は分かりませんが…)
    • clusterは複数のclassが所属できるので、classができないのだと思います。
  • clusterを作り、その後に同名のclassesを作ると、自動的に紐付けてくれます。

classを他のclusterに所属させるにはどうすれば良いのだろう、というのが分かりません…。


classとclusterの一覧を表示させるとこんな感じです。


2011年10月19日水曜日

OrientDB: remoteのDB作成と接続

demoという名のdatabaseを作ってみましょう。
前回はlocal版でしたが、remoteからもアクセスできるようにします。

ここで必要な設定と情報は2つ。
configでIPの設定 config/orientdb-server-config.xml にあります。

1) rootのパスワード確認
orientdbを初回起動した際に生成されます。毎回異なります。
 <user name="root" password="AED2DBECFF6C499D7E5CE8EA729E3C7A02F171EEA31A67C245F941FB925B2D86" resources="*"/>

2) IPの設定
 <listener ip-address="10.20.30.40" port-range="2480-2490" protocol="http">

作業するには、./console.shを起動します。
作成
> create database remote:10.20.30.40/demo root AED2DBECFF6C499D7E5CE8EA729E3C7A02F171EEA31A67C245F941FB925B2D86 local
Creating database [remote:10.20.30.40/demo] using the storage type [local]...
Connecting to database [remote:10.20.30.40/demo] with user 'admin'...OK
Database created successfully.
Current database is: remote:10.20.30.40/demo
接続
> connect remote:10.20.30.40/demo admin admin
Disconnecting from the database [demo]...OK
Connecting to database [remote:10.20.30.40/demo] with user 'admin'...OK
情報確認
> info
Current database: demo (url=remote:10.20.30.40/demo)
Total size: 9.76Kb

remoteで接続できることが確認できました。
作成されたデータベースは、databaseディレクトリ以下にdemoのフォルダがあります。

Rubyでカレントディレクトリのモジュールのrequire

Ruby1.9.2より、current directoryにあるモジュールを
requireするには、絶対パスにしないとならないようです。
LOAD_PATHから「.」が削除されたそうです。

絶対パス以外の方法では、require ではなく require_relative を使用することも可能ですが、
逆に1.8系では、require_relative がないので、両バージョンで使うとエラーになるので
注意が必要です。

1.8と1.9系なら、こんな書き方になるでしょうか。
require File.expand_path(File.join(File.dirname(__FILE__), 'moduletest'))

1.9系なら、これだけでもありですね。
require_relative 'moduletest'

1.9系では使えません。
require 'moduletest'

1.9系でrequireが絶対パスになっていない場合はこんな感じのエラー。
$ ruby test.rb
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- moduletest (LoadError)

1.8系でrequire_relativeを使うとこんな感じのエラー。
$ ruby test.rb
test.rb:5: undefined method `require_relative' for main:Object (NoMethodError)

参考サイト:
http://stackoverflow.com/questions/2900370/why-does-ruby-1-9-2-remove-from-load-path-and-whats-the-alternative

Flag drop charge?

タクシーの"flag drop charge"って何のこと?
タクシー乗った時に、"空車"の札が落とされるじゃないですか。
あれがflag drop。
その時にチャージされることは、というと"初乗り料金"ってことですね!

2011年10月18日火曜日

RubyでHTTP通信

OrientDBのサンプルを用いて、RubyでHTTP通信(GET)をしてみました。
こんな感じで OGraphVertex のデータが取得できます。
require 'net/http'
req = Net::HTTP::Get.new('/class/tinkerpop/OGraphVertex')
req.basic_auth 'admin', 'admin'
Net::HTTP.start(@IP,@PORT) {|http|
  response = http.request(req)
  return response.body
}

2011年10月17日月曜日

OrientDB: コンソール(full ver)

基本はシンプルバージョンと同じですが、ここではremoteについて触れてみます。

remoteを使う場合は、OrientDBのserverを起動しておく必要があります。
localの場合は、直接databases以下を見に行くので、起動しなくても大丈夫です。
$ ./console.sh 

tempに接続&切断
> connect remote:127.0.0.1/temp admin admin
Connecting to database [remote:127.0.0.1/temp] with user 'admin'...OK
> disconnect

tinkerpopに接続&切断
> connect remote:127.0.0.1/tinkerpop admin admin
Connecting to database [remote:127.0.0.1/tinkerpop] with user 'admin'...OK
> disconnect



OrientDB: Studio

いまだ使いかたがよくわかっていないStudioですが…
localhost以外からつなげる場合は、下記の変更が必要です。
OrientDBのサーバーはシャットダウンし、変更後に再起動してください。
起動中に変更するとサーバーのシャットダウンがうまくいかないことがあります。

$ vi ~/orientdb/config/orientdb-server-config.xml
<listener ip-address="127.0.0.1" port-range="2480-2490" protocol="http">

ここのlocalhostのIPを変えないで、マシンのIPに接続すると
「503 Service Unavailable」のエラーが出ます。

下記にアクセスすると、
http://マシンIP:2480/studio/

こんな画面が開きます。

2011年10月14日金曜日

OrientDB: コンソール(simple ver)

シンプルバージョンを用いています。
demoが入っていなかったので、いろいろ苦戦しました。。

コンソールを触って見ました。 bin以下にあります。
$ ./console.sh 
  • 「help」や「?」を入力すると、コマンドリストが表示されます。
  • 「exit」でコンソールを終了させます。

DBの作成と削除、起動と切断について動かしてみます。(ひとまずlocal版)

DBの作成
Syntax: create database <database-url> <user> <password> <storage-type>
> create database local:../databases/demo/demo admin admin local
Creating database [local:/home/tiffany/orientdb/databases/demo/demo] using the storage type [local]...
Database created successfully.
Current database is: local:/home/tiffany/orientdb/databases/demo/demo
DBの削除
Syntax: create database <database-url> <user> <password>
> drop database  local:../databases/demo/demo admin admin

接続
Syntax: connect <database-url> <user-name> <user-password>
> connect local:../databases/demo/demo admin admin
Connecting to database [local:../databases/demo/demo] with user 'admin'...OK

切断
Syntax: disconnect
> disconnect

Disconnecting from the database [demo]...OK

DB情報の参照
Syntax: info
> info

OrientDB: インストールから起動まで


Neo4jの次は、OrientDBを試してみることにしました!
試行錯誤で試すので、やや間違えてるところもあるかもしれませんのでご了承くださいませ…。

Javaが入ってることを確認
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)


ダウンロード~インストール
http://code.google.com/p/orient/wiki/Download
二種類のモジュールがあるようです。

  • orientdb-1.0rc6-distribution.tar.gz
    • 必要最低限のみのシンプルバージョン
  • orientdb-graphed-1.0rc6.zip (現時点ではzipしかありませんでした)
    • gremlinやサンプル(demo)が含まれているフルバージョン
    • gremlinを使うならこっちが良い気がしています。最初は知らずにシンプルバージョンの方を使ってました…。

$ wget http://www.orientechnologies.com/listing/m2/com/orientechnologies/orientdb/1.0rc6/orientdb-1.0rc6-distribution.tar.gz
$ tar -xvzf orientdb-1.0rc6-distribution.tar.gz
$ mv orientdb-1.0rc6 ~/orientdb
パーミッション確認
bin以下のファイルに実行可能のパーミッションが付与されているか確認してみてください。
付与されていない場合は、下記のように.sh全部に(UNIX環境の場合)付与してください。
$ cd ~/orientdb/bin
$ chmod +x *.sh 
起動
$ cd ~/orientdb/bin
$ ./server.sh
orientdb/log/以下には、下記のようにログファイルがいくつかできあがるのが確認できます。
orientdb/log$ ls
orient-server.log.0  orient-server.log.0.lck
終了
$ cd ~/orientdb/bin
$  ./shutdown.sh
Sending shutdown command to remote OrientDB Server instance...
Shutdown executed correctly


エラー?!
もし、起動時にこんなエラーが出た場合は、server.shを実行する場所をbin内に変更しましょう。
Can't load log handler "java.util.logging.FileHandler"
java.io.IOException: Couldn't get lock for ../log/orient-server.log
java.io.IOException: Couldn't get lock for ../log/orient-server.log

あるいは、下記のパスを変更するか、ですね。
"../log/orient-server.log"これは、実行先から見たファイルです。
$ less orientdb/config/orientdb-server-log.properties*
java.util.logging.FileHandler.pattern=../log/orient-server.log


ひとまず、ここでは、インストールからOrientDBの起動と終了までにします。
次回は、console.shについて見てみます。

2011年10月8日土曜日

第1回GraphDB勉強会レポ


第1回のGraphDB勉強会に参加してきました。
少しばかり、スタッフとしてのお手伝いも。

neo4jは最近使い始めてるので、GraphDBの概要やneo4j説明に関しては飲み込めてる感じです。
@doryokujinさんが頑張って発表した3セッション!
資料作りが大変だっただろうなぁ、と思いました。
http://www.slideshare.net/doryokujin/the-definition-of-graphdb
http://www.slideshare.net/doryokujin/an-ingtroduction-to-neo4j
http://www.slideshare.net/doryokujin/an-introduction-to-tinkerpop

neo4jとLuceneの関係について、結構「ん?」となってる方もいらっしゃったようですが、
私も昔はその中の一人でした。
初めてneo4jを使った時にどうすれば作成したノードを後から見つけるんだろう?と思い、こんな時にLuceneを使うんだ、と分かった時にへ~、となった記憶があります。


TinkerPopの説明では、Gremlinの存在は知っていたけど、
まぁ、なくてもneo4jは使えるしと思ってるくらいで利用に関しての知識はなかったですが、
APIが便利そうな気がしました。
http://www.odbms.org/blog/2011/06/applying-graph-analysis-and-manipulation-to-data-stores/
http://japan.internet.com/webtech/20110709/1.html

TinkerPopの説明では、ロゴのキャラクターのかわいさについて、
かわいいとかかわいくないとか(笑)

最後にデモをしてくださった、@bibrostさんの資料です。
http://www.slideshare.net/fungoing/enjoy-graphdb-graphdb-jp-1japanese


今回の参加者は、100人オーバーだったと思うのですが、女性が4-5名?(^^;
どこもそんな感じなんですね。。。

Togetterはこちら↓
http://togetter.com/li/197970

2011年10月5日水曜日

ActiveRecordで取得した日本語の文字化け


Rails2系ではあまり気にしたことがなかったのですが、
(今まで日本語文字を出力させたことがないから?)、
現在使っているRails3でActiveRecordから取得した日本語を
出力させようとすると文字化けしました。

ちょっと前の投稿で書いた
ファイルの頭に # encoding: utf-8 を記載するのとは別に
ActiveRecordではもうワンステップ必要のようです。

必要なのはこれ。
force_encoding('UTF-8')
@user.firstname.force_encoding('UTF-8')
というふうに記載しなければなりません。

2011年10月4日火曜日

MySQLに他のサーバーから接続したい

MySQLにlocalhost以外の他のサーバーからアクセスするには設定が必要です。
ユーザ(tester/pass)だけ作って、アクセスしようとすると、こんなエラーになります。

$  mysql -u tester -ppass -h 10.20.30.40
ERROR 1045 (28000): Access denied for user 'tester'@'10.20.30.40' (using password: YES)

接続したいサーバーにて、権限を付与します。
いろいろごそごそやってるとおかしなことになるので、一旦クリーンな形にします。
% DELETE FROM mysql.user Where user = 'tester';
% REVOKE ALL PRIVILEGES ON xxx_db.* FROM tester@'%';
% FLUSH PRIVILEGES;

改めて下記を設定。
% GRANT USAGE ON *.* TO tester@'%' IDENTIFIED BY 'pass';
% GRANT ALL PRIVILEGES ON xxx_db.* to 'tester'@'%';
% SELECT USER,HOST FROM mysql.user;
権限の確認
% SHOW GRANTS for tester;
GRANT USAGE ON *.* TO 'tester'@'%' IDENTIFIED BY PASSWORD '*945E2AF30B5AA2DC36C9B6363D9B1D52A3E5CD1B'
GRANT ALL PRIVILEGES ON `xxx_db`.* TO 'tester'@'%'

上記まで行ったら、つながりました!
$ mysql -u tester -ppass -h 10.20.30.40
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 53
Server version: 5.1.37-1ubuntu5 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

これでも繋がらない?!という場合は、iptableやufwを疑ってみるのもありかもしれません。
私はufwで引っかかってました…。