2010年 9月 の投稿一覧
RESTfulなKVS Terrastoreを使ってみる(2) – PHPからデータストア
前回インストールを行うところまで行ったので、今回は実際にデータをストアしてみる。
Terrastoreはすべてデータの格納・取得はRESTfulに行うことができるので、まずは手軽(?)にPHPからデータをストアしてみることにする。
HTTPのPUT命令でデータをTerrastoreに置くことができるので、データをストアするには以下の様な形で実現できる。
<?php require_once 'HTTP/Request2.php'; $req = new HTTP_Request2("http://localhost:8080/foo/bar2"); $req->setMethod("PUT"); $req->setHeader(array("Content-Type" => "application/json")); $req->setBody('{"test": "test2"}'); $response = $req->send(); print $response->getStatus(); ?>
これで、ローカルホストに立てられているTerrastoreサーバへ、JSON表現で与えられる {"test":"test2"} という連想配列を格納する。
HTTPのレスポンスコード204が返却されれば、データの格納成功である。
実際にTerrastoreに格納したデータを取得するには、HTTPのGET命令で良いのでwget*1でも結果を取得できる。
% wget -q http://localhost:8080/foo/bar2 -O -
{"test": "test2"}
よさそうである。実際はプログラム側から呼び出さないといけないが、簡単な確認はこれでできた。
今日の一枚
今日の一枚
バスに乗って役所へ書類をもらいに行く。
最後尾に座って後ろの窓から外を覗くとすごい雨だった。
かなりどうでもいい話
単に「?」(はてな)記号が似ているなぁ。と思っただけ。
リクナビnextのバナー広告の中の「?」マークと、以前はてなのトップページにあったロゴの「?」マーク。ベースにしているフォントが同じなのかしら??
レインボー
なんか、Rainbow twitterでTLが大変なことになってますな...。
Googleのリアルタイム検索で見ても18時前から検索キーワード急増。
とりあえず、Web経由ではTwitterを開かない様にしたいと思います。
真似して変なことした人がいたときにナニですので…。
あとは、案外こういうときこそガラケーでモバツイ経由とかで開いているのが一番よいのではないかと思ってみたりします。いや、そこまでしてtwitterしなければいいじゃないといえばそれまでですが。。。
関係ありませんが、レインボーというキーワードを聞くとこのアルバムを思い出します。
- アーティスト: TM NETWORK
- 出版社/メーカー: エピックレコードジャパン
- 発売日: 2000/03/23
- メディア: CD
- クリック: 6回
- この商品を含むブログ (16件) を見る
今日の一枚
素晴らしい。というか、実際にコラボレーションしてもらいたい…。
アリエッティ
借りぐらしのアリエッティを映画館に観に行く。
制作ドキュメントとか、雑誌の特集記事はたくさんみていたので予備知識は豊富にあったが、実際に観た感想としてはかなり満足。
個人的には、角砂糖重要。ということと、角砂糖が落ちてしまうシーンがとても素晴らしかったと思いました。
MFCのCString::Formatで"Bufer to small"エラー
以下の様なVC++のMFC依存*1なコードがあったとき...
strFile =_T("c:\\data\\hoge\\test.dat"); CString strtmp = strFile.Mid(strFile.ReverseFind('\\') + 1); strtmp.Format(_T("%s (%f)"), strtmp, foo);
で実行すると, デバッグ用の 〜\vsprintf.c で、
Microsoft Visual C++ Debug Library
"Debug Assertion Failed!
Expression: ("Buffer to small", 0)
というエラーが表示されてしまう。スタックを見ると.Formatを呼び出しているところでAssertが起きている。
エラー内容について検索をかけると結構引っかかるのだが、解決策が特に見当たらない。
Microsoft Connectにも登録はされているが、再現不可能として却下されている。…数年前だが。
恐らくこういうときは、95%以上の確率で自分が変なことをしているというのが、ささやかな自分の経験則なので見直す。
で、ふと気づくと非常に気持ち悪いことをしていたので、以下の様に修正する
CString strtmp, strfilename; strfilename = strFile.Mid(strFile.ReverseFind('\\') + 1); strtmp.Format(_T("%s (%f)"), strfilename, foo);
assertは表示されなくなった。ひとまず問題解決。
.Formatで文字列を作ろうとしているものと、そこに流し込もうとしているものが同じインスタンスを指すというのは良く考えると気持ち悪い。
直感的に気持ち悪いこと*2はあまりしないほうが良いことが多い。
RESTfulなKVS Terrastoreを使ってみる(1) – インストール
以前、ここで紹介されていたKVSのTerrastoreが気になっていたので試しに使ってみた。
"Terrastore"
Terrastore is a modern document store which provides advanced scalability and elasticity features without sacrificing consistency.
Terrastoreの特徴は以下の様なところ。
- プログラムはJava上で動く(インストール時にはantが必要)
- 不揮発性(オンメモリなKVSではなくて、ファイルシステムにストアされる)
- プロトコルにはHTTPを利用, RESTful
- サーバはクラスタ化可能
- クラスタ化したときの各ノードへのコピーやバランシングは自動的に行うことができる
- ストアする際のデータ形式はJSON
- Java向けのクライアントライブラリが用意してある
といったところか。
で、実際に簡単に動かしてみた際のメモ。ほとんど、プロジェクトのホームページのドキュメントと同じですが、自分のメモとして使うために残しておく。
先程のTerrastoreプロジェクトのダウンロードページにある terrastore-0.6.0-dist.zip (本日現在) をダウンロード。
zipファイルを展開して、antを使ってインストールする。
今回はマスターサーバが単独の方法でインストール。
ここでは、マスターサーバを/Users/hideack/terrastore/masterに、サーバ(slave)を/Users/hideack/terrastore/serverにインストールする。
% cd cd terrastore-0.6.0-dist/ % ant -f terrastore-install.xml single-master -Dinstall.dir=/Users/hideack/terrastore/master Buildfile: terrastore-install.xml single-master: version: [echo] Terrastore Install Tool - Version 0.6.0 common-master: [delete] Deleting directory /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install [unzip] Expanding: /Users/hideack/pj/terrastore/terrastore-0.6.0-dist/terrastore-master/terrastore-master.zip into /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install [copy] Copying 1 file to /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install/terrastore-master [copy] Copying 1 file to /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install/terrastore-master [copy] Copying 148 files to /Users/hideack/terrastore/master [copy] Copied 44 empty directories to 3 empty directories under /Users/hideack/terrastore/master BUILD SUCCESSFUL Total time: 6 seconds
つづけて、サーバ(slave)をインストールする。
% ant -f terrastore-install.xml server -Dinstall.dir=/Users/hideack/terrastore/server install.dir=/Users/hideack/terrastore/server Buildfile: terrastore-install.xml server: version: [echo] Terrastore Install Tool - Version 0.6.0 common-server: [delete] Deleting directory /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install [unzip] Expanding: /Users/hideack/pj/terrastore/terrastore-0.6.0-dist/terrastore-master/terrastore-master.zip into /var/folders/1d/1dGjSJWcEkCa7X+xoB+EvE+++TI/-Tmp-/terrastore-install [copy] Copying 71 files to /Users/hideack/terrastore/server [copy] Copying 77 files to /Users/hideack/terrastore/server/terrastore-master-libs [copy] Copying 1 file to /Users/hideack/terrastore/server/terrastore-master-libs BUILD SUCCESSFUL Total time: 6 seconds
これでインストールされたので、早速起動してみる。
まず、マスターサーバを立ち上げる。
% cd /Users/hideack/terrastore/master % ./start.sh ./start.sh: the JAVA_HOME environment variable is not defined correctly
むぅ、環境変数JAVA_HOMEを設定していなかったので怒られた。
MacOSでJavaを使っていてそこで動かそうとしているので、
% export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
と書いて設定する。
改めて起動させてみる。
% cd /Users/hideack/terrastore/master % ./start.sh Terrastore Master 0.6.0 - 16:13:17.931 - Terracotta 3.3.0, as of 20100716-150712 (Revision 15922 by cruise@su10mo5 from 3.3) Terrastore Master 0.6.0 - 16:13:18.627 - Successfully loaded base configuration from file at '/Users/hideack/terrastore/master/bin/./../terracotta-config.xml'. Terrastore Master 0.6.0 - 16:13:19.026 - Log file: '/Users/hideack/terrastore/master/bin/./../tc-data/server-logs/terracotta-server.log'. Terrastore Master 0.6.0 - 16:13:19.533 - Available Max Runtime Memory: 469MB Terrastore Master 0.6.0 - 16:13:20.124 - JMX Server started. Available at URL[service:jmx:jmxmp://0.0.0.0:9520] Terrastore Master 0.6.0 - 16:13:26.373 - Becoming State[ ACTIVE-COORDINATOR ] Terrastore Master 0.6.0 - 16:13:26.410 - Terracotta Server instance has started up as ACTIVE node on 0.0.0.0:9510 successfully, and is now ready for work.
無事、起動。
続けてサーバ(Slave)を立ち上げる。
% ./start.sh --httpPort 8080 --nodePort 6000 --master localhost:9510 Starting Terrastore Server ... Terrastore Server 0.6.0 - 16:26:28.997 - Welcome to Terrastore. Terrastore Server 0.6.0 - 16:26:29.012 - Powered by Terracotta (http://www.terracotta.org). Terrastore Server 0.6.0 - 16:26:29.012 - Listening for HTTP requests on 127.0.0.1:8080 Terrastore Server 0.6.0 - 16:26:29.038 - Listening for node requests on 127.0.0.1:6000 Terrastore Server 0.6.0 - 16:26:29.038 - Reconnection timeout (in milliseconds) set to 10000 Terrastore Server 0.6.0 - 16:26:29.039 - Node communication timeout (in milliseconds) set to 10000 Terrastore Server 0.6.0 - 16:26:29.039 - Number of http threads: 100 Terrastore Server 0.6.0 - 16:26:29.039 - Number of worker threads: 20 Terrastore Server 0.6.0 - 16:26:53.015 - Configuring event bus: class terrastore.event.impl.MemoryEventBus Terrastore Server 0.6.0 - 16:26:53.578 - Set up this cluster terrastore-cluster Terrastore Server 0.6.0 - 16:26:53.626 - Joining this node terrastore-cluster:ServerID[0] Terrastore Server 0.6.0 - 16:26:53.638 - Set up this node terrastore-cluster:ServerID[0]
これも立ち上がった。
KVSから値を取得したり、値を格納する際のREST APIで与えられる命令はこのサーバ(Slave)側のHTTPポートへ投げればよいことになる。
(ここでは、8080番ポートをHTTPの口として設定している。)
では、実際に簡単にKey/ValueをStoreしようと思ったところで電池切れ。明日以降へ続く。
ところで、このKVSってあまり日本語の情報が無い様なのだけど、あえてこれを使う必要がないということなのだろうか??
他にも確かにいろいろ種類があるからなぁ。
最近のコメント