ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

CassandraのC#ドライバをThriftで生成する

Wednesday, 17 March 2010 22:19 by sabro

Thriftは、特殊な言語で書かれたテンプレートから、C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C# などの、コードを生成できるフレームワークです。FaceBookによって作られたらしいです。

FaceBookは、Cassandraというストレージを採用しているんですが、それにC#でアクセスするためのドライバは、Thriftを使って生成するようになってます。

Thriftをインストールには、いくつかライブラリをいれておく必要があります。Installing the required packages on CentOS 5にあるように、CentOSでは以下のコマンドでおっけーみたいですね。

sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel

※ C#のコードを生成する場合には、あとMono 1.2.4以上を入れとく必要があるみたいなんで注意です。

Thriftのソースはここからダウンロード出来ます。解凍して、お決まりのパターンでコンパイルします。./configureには色々オプションもあるみたいですが、とりあえずデフォルトでやりました。あ、今回もPaco使いました。

# ./configure
# make
# paco -D make install

インストールが終わったら、Cassandraのパッケージに入っている「cassandra.thrift」のあるディレクトリへ移動して、以下のコマンドを実行します。

# thrift --gen csharp cassandra.thrift

すると、「./gen-csharp/Apache/Cassandra」以下にコードが生成されます。あとは、これをビルドしてやるわけですが、ここにあるコードは、Thrift.dllを参照しているので、それをどっっかから持ってこないといけません。

実は、それはダウンロードしたソースの中にあります。「thrift/lib/csharp/src」の中に、コードとslnファイルがあるので、それをVisualStudioなどで開いてビルドしてやると、Thrift.dllが生成されます。

Thrift.dllを参照して、生成されたコードをビルドしてやれば、Cassandraドライバの出来上がりです( ̄∇  ̄ )

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (45) | Comment RSSRSS comment feed

CGIのURLエンコードと、JavascriptのURLエンコードは微妙に違う

Wednesday, 22 July 2009 07:48 by sabro

クリエモンでURLエンコード周りのバグを出してしまいました( ̄□  ̄ ||

原因はCGIとJavascriptでURLエンコードが微妙に違うことでした。WikipediaのURLエンコードのページをみると、Javascriptでは、スペースは「%20」にエンコードされるが、CGI側では普通は「+」に変換されると書いてあります。なんでそんなややこしいことになってんだろ。これって知らないの僕だけで他のWeb開発者の間では常識なのかな(_ _ ||

とりあえず、おかしくなっていた部分では、HttpUtilityクラスのUrlEncodeメソッドが使われていました。以下はPowerShellでちょっと確認してみたところ。HttpUtilityクラスは、そのままでは参照できないんでリフレクションで「System.Web.dll」を読み込んでいます。


PS C:> [System.Reflection.Assembly]::LoadWithPartialName("System.Web")

GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll

PS C:> [System.Web.HttpUtility]::UrlEncode("<hoge fuga>")
%3choge+fuga%3e


PowerShell覚えると、インタプリタで動作確認ができちゃって楽ちんだな~( ̄∇ ̄) で、結果を見ると確かに「+」にエンコードされていますね。

調べてみると、UriクラスのEscapeDataStringメソッドを使えばJavascript形式のエンコードが出来るらしいとのこと。どれどれ


PS C:> [Uri]::EscapeDataString("<hoge fuga>")
%3Choge%20fuga%3E


おお、たしかに「%20」にエンコードされました(^^) 結局、UrlEncodeメソッドを使用している箇所を、のきなみEscapeDataStringメソッドに置き換えて、問題は解決したのでした。

ちなみに、UriクラスにはEscapeUriStringというメソッドもあります。こちらがどんな動作をするのか気になったので、サクッと確認してみました。


PS C:> [Uri]::EscapeDataString("http://www.hogefuga.com/<hoge fuga>")
http%3A%2F%2Fwww.hogefuga.com%2F%3Choge%20fuga%3E

PS C:> [Uri]::EscapeUriString("http://www.hogefuga.com/<hoge fuga>")
http://www.hogefuga.com/%3Choge%20fuga%3E


EscapeDataStringメソッドは、URLのコロンやスラッシュもエンコードしてしまいますが、EscapeUriStringメソッドは、URLを構成するための記号はエンコードしていません。すでに、URLになっている文字列に対してエンコードしたい時はこちらを使えばいいわけですね( ̄∇  ̄ )

Tags:   , , ,
Categories:   .NET
Actions:   Permalink | Comments (48) | Comment RSSRSS comment feed

セカンドライフ連動Webサービス「クリエモン」の先行テスト版リリースしました

Thursday, 11 December 2008 15:50 by sabro

3月くらいからコツコツと、.NETで開発してきたセカンドライフ連動型Webサービス「クリエモン」の先行テスト版をリリースしました。

クリエモンは、セカンドライフで配布しているアバターの表情を、Webサイト上でCGMする、そこそこ画期的なサービスです。ユーザが日々アップロードする「目、鼻、口、その他装飾」のパーツを組み合わせて表情を作り、それをセカンドライフからロードして使います。

クリエモン
http://www.creamon.net/

[トップページ]

[マイページ]

アバターはちょっとしたハックで日本人向けのアニメ調に仕上げました。パッと見、セカンドライフに見えないのではないでしょうか。右上のパーツに表情がロードされてるのも確認できると思います。

[セカンドライフ]

アバター配布場所
nippori(155/166/23)

将来的に有料オプションはつけるかもですが、ずっと無料でも使えます。まずは、気軽に試してみてください。

Tags:   , ,
Categories:   Second Life
Actions:   Permalink | Comments (2) | Comment RSSRSS comment feed

memcachedをソースから入れ直した

Saturday, 17 May 2008 14:48 by sabro

Enyim Memcachedに、複数のキャッシュを一気に取得する関数があったので使ってみたら、サポートされてませんっていうエラーがでた。

よくよく調べてみると、「append、prepend、gets、cas」の4つのコマンドは、バージョン1.2.4から追加されたみたいで、CentOS5のyumでインストールされる1.2.2では、getsが使えないもよう。

仕方ないので、ソースからインストールすることに。本家サイトからソースをダウンロードして、解凍後、configureするとエラーが出た。

checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/

If it's already installed, specify its path using --with-libevent=/dir/
libeventっていうライブラリがないと怒られてる。--with-libeventっていう引数でディレクトリ指定しても効果なし。yumでインストールしてあるはずなんだけどなあ・・・。試しにlibeventも最新版をソースから入れてみる。
tar zxvf libevent-1.4.4-stable.tar.gz
cd libevent-1.4.4-stable
./configure
make
make install
/usr/local/libにインストールされたようです。つづいて、memcached再挑戦。
tar zxvf memcached-1.2.5.tar.gz
cd memcached-1.2.5
./configure
make
make install
今度は無事に入りました。さて、/usr/local/binにmemcached本体があるので、早速起動してみたところ、なぜかまた、libeventが見つからないというエラーが出てます( ̄□  ̄||
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
以下の環境変数が必要だったとか。
export LD_LIBRARY_PATH=/usr/local/lib/

これで無事、getsも使えるようになりました。

追記:
最後の環境変数は、/etc/ld.so.confに/usr/local/lib/を追加して、ldconfigで反映させるだけでよかったみたいです。

Tags:   ,
Categories:   Linux
Actions:   Permalink | Comments (48) | Comment RSSRSS comment feed