トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-R備忘録/25

R備忘録 /状態空間モデリング/donlp2/その他のメモ

R備忘録 - 記事一覧

【Rserve】C++のクライアントを使ってみる

  • 投稿者: みゅ
  • カテゴリ: なし
  • 優先度: 普通
  • 状態: 完了
  • 日時: 2009年02月20日 09時17分32秒

内容

RserveのC++のクライアントを使ってみる

インストール?

tar xvf Rserve_0.6-0.tar.gz
  • 「Rserve」というフォルダが出来るので、入る
cd Rserve
  • RserveのインストールではなくC++クライアントのインストールなので、クライアントのソースがある、フォルダまで移動する
$ cd clients/cxx
$ ls
COPYING         Rconnection.h  config.h.in    demo1         do_RMeCab.o
Makefile        Rconnection.o  config.log     demo1.cc      rcmd.cc
Makefile.in     ReadMe.txt     config.status  demo1.o       rcons.cc
Makefile.win    Rsrv.h         configure      do_RMeCab     rsdown.cc
Rconnection.cc  config.h       configure.ac   do_RMeCab.cc  sisocks.h
  • (do_RMeCabは、みゅが作成したファイル)
  • コンフィギュア.普通に「./configure」とやったような気がする.
./configure
  • makeする.でもみゅの環境ではコンフィグで作成された「Makefile」がうまく動かない.
  • 最新の?gnu makeでは暗黙のルールというのがあって、
%: %.cc$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

と定義されているらしい.暗黙の定義を見る場合、以下のコマンドで確認できるらしい

make --print-data-base -n  (-n はmakeを実行せずにどういうコマンドが実行されるかを見るだけ)
  • 今回は「demo1」を作りたいので、以下を実行したい.でも暗黙のルールのせいで???、うまくいかない.
make demo1
(どういうコマンドが実行されるかを見るだけなら「make -n demo1」)
  • ちなみに「make -n demo1」を実行すると
$ make -n demo1
g++  -DHAVE_CONFIG_H   demo1.cc   -o demo1
  • 暗黙のルールが余計なことをしているらしい.でこの「%: %.cc」という暗黙のルールを無効にしたい.Makefileに以下を追加するだけ.
%: %.cc
  • これで以下のようになる
$ make -n demo1
g++  -DHAVE_CONFIG_H  -c -o Rconnection.o Rconnection.cc
g++  -DHAVE_CONFIG_H  -c -o demo1.o demo1.cc
g++ Rconnection.o demo1.o -o demo1 -ldl -lcrypt
  • 実際にmake.「-n」を取るだけ.
$ make demo1
  • みゅの環境では、demo1が作成された.

実行

  • demo1は何も編集しなければ、ローカルのRserveに接続にいくので35行目当たりにある、
Rconnection *rc = new Rconnection();
  • を編集する.
Rconnection *rc = new Rconnection("192.168.100.zzz");
  • 等、Rserveが動いているサーバーのIPアドレスを書く.それでmake.
make demo1
  • 実行
$ ./demo1
Rdouble[4]
2 by 2 matrix
33.97 -2.1 -2.1 10.09
3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3 3 4 4.4 3.9 3.5 3.8 3.8 3.4 3.7
3.6 3.3 3.4 3 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2 3.5 3.6 3 3.4 3.5 2.3 3.2
3.5 3.8 3 3.8 3.2 3.7 3.3 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2 3 2.2 2.9 2.
9 3.1 3 2.7 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3 2.8 3 2.9 2.6 2.4 2.4 2.7 2.7 3 3.4 3.
1 2.3 3 2.5 2.6 3 2.6 2.3 2.7 3 2.9 2.9 2.5 2.8 3.3 2.7 3 2.9 3 3 2.5 2.9 2.5 3.
6 3.2 2.7 3 2.5 2.8 3.2 3 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3 2.8 3 2.8 3.
8 2.8 2.8 2.6 3 3.4 3.1 3 3.1 3.1 3.1 2.7 3.2 3.3 3 2.5 3 3.4 3
  • ちなみに今のクライアントではサーバーをIPアドレスでしか、指定できない.なんという不便さ!!
  • サーバーの名前で指定できるように「Rconnection.cc」を修正してみる.
  • 65行目
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
(この下あたりに以下をインクルード)
#include <netdb.h>
  • 590行目あたり、connect関数に以下を追加
int Rconnection::connect() {
//Add >>>
  struct hostent *hostent1;
  struct in_addr ina1;
  char *host1;
  hostent1 = gethostbyname(host);
  ina1.s_addr = **(unsigned int **)(hostent1->h_addr_list);
  host1 = strdup(inet_ntoa(ina1));
//<<<Add
  • 以下「host」という名前の変数が出てきているところを「host1」に変更する.2箇所.
        build_sin(&sai,host1,port);
        strcpy(sau.sun_path,host1); // FIXME: possible overflow!
  • 「host1」変数はこのあともう使わないので、deleteする.適当なところで
    free(host1);
  • これで以下のように書いて、動いた.みゅの環境では成功.
Rconnection *rc = new Rconnection("サーバーの名前");

コメント