2010年 9月 の投稿一覧

今日のひとこと

私は日本語しか使えませんが、プログラム言語では多少会話ができたのかもしれない。
f:id:hideack:20101001010248p:image

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"}

よさそうである。実際はプログラム側から呼び出さないといけないが、簡単な確認はこれでできた。

*1:wgetで取得内容を標準出力に出す方法を度忘れして調べたのは内緒だ

今日の一枚

いつきても絵葉書の様な海が見れる。
また見に来よう。
f:id:hideack:20100926100528j:image

今日の一枚

バスに乗って役所へ書類をもらいに行く。
最後尾に座って後ろの窓から外を覗くとすごい雨だった。

f:id:hideack:20100923125030j:image
f:id:hideack:20100923125044j:image

かなりどうでもいい話

単に「?」(はてな)記号が似ているなぁ。と思っただけ。
リクナビnextのバナー広告の中の「?」マークと、以前はてなのトップページにあったロゴの「?」マーク。ベースにしているフォントが同じなのかしら??

でも、何度も見ていると似ていない気がしてきた。うん、似てないな。
どうでもよい話でした。
f:id:hideack:20100922121314p:image

レインボー

なんか、Rainbow twitterでTLが大変なことになってますな...。
Googleのリアルタイム検索で見ても18時前から検索キーワード急増。
f:id:hideack:20100921222019p:image
とりあえず、Web経由ではTwitterを開かない様にしたいと思います。
真似して変なことした人がいたときにナニですので…。
あとは、案外こういうときこそガラケーモバツイ経由とかで開いているのが一番よいのではないかと思ってみたりします。いや、そこまでしてtwitterしなければいいじゃないといえばそれまでですが。。。

関係ありませんが、レインボーというキーワードを聞くとこのアルバムを思い出します。

RAINBOW RAINBOW

アリエッティ

借りぐらしのアリエッティを映画館に観に行く。
制作ドキュメントとか、雑誌の特集記事はたくさんみていたので予備知識は豊富にあったが、実際に観た感想としてはかなり満足。
個人的には、角砂糖重要。ということと、角砂糖が落ちてしまうシーンがとても素晴らしかったと思いました。

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はあまりしないほうが良いことが多い。

*1:全くC++を書いているという気がしない

*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ってあまり日本語の情報が無い様なのだけど、あえてこれを使う必要がないということなのだろうか??
他にも確かにいろいろ種類があるからなぁ。